├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── image │ └── screencCapture.png └── index.html └── src ├── App.vue ├── assets └── logo.png ├── components ├── custom-color.vue ├── custom-properties-panel.vue ├── custom-properties-panel │ ├── PropertiesView.vue │ └── index.js ├── custom │ ├── CustomRenderer.js │ └── index.js ├── properties-panel-extension.vue └── properties-panel-extension │ ├── descriptors │ └── authority.json │ └── provider │ └── authority │ ├── AuthorityPropertiesProvider.js │ ├── index.js │ └── parts │ └── TitleProps.js ├── main.js ├── mock ├── xmlStr.bpmn └── xmlStr.js ├── router └── index.js └── styles ├── bpmn-custom-color.css ├── bpmn-properties-theme-black.css ├── bpmn-properties-theme-blue.css └── bpmn-properties-theme-red.css /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bpmn-vue-properties-panel 2 | 3 | ## 项目描述 4 | 5 | 此项目为以下教材中的教材案例. 6 | 7 | - [《properties篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-properties篇.md)🔥🔥🔥 8 | 9 | - [《properties-panel篇(上)》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-properties-panel篇(上).md)🔥🔥🔥 10 | 11 | - [《properties-panel篇(下)》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-properties-panel篇(下).md)🔥🔥🔥 12 | 13 | - [《Color篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-Color篇.md)🔥🔥🔥 14 | 15 | 16 | ## 项目截图: 17 | 18 | ![screencCapture](./public/image/screencCapture.png) 19 | 20 | 21 | 22 | ## 如何使用 23 | 24 | 将项目克隆至本地: 25 | 26 | ``` 27 | git clone git@github.com:LinDaiDai/bpmn-vue-properties-panel.git 28 | ``` 29 | 30 | 安装依赖: 31 | 32 | ``` 33 | npm install 34 | ``` 35 | 36 | 本地启动项目: 37 | 38 | ``` 39 | npm run serve 40 | ``` 41 | 42 | 打包发布至生成环境: 43 | 44 | ``` 45 | npm run build 46 | ``` 47 | 48 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bpmn-vue-basic", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.19.0", 12 | "bpmn-js-in-color": "bpmn-io/bpmn-js-in-color", 13 | "bpmn-js-properties-panel": "^0.33.0", 14 | "camunda-bpmn-moddle": "^4.3.0", 15 | "core-js": "^3.4.3", 16 | "vue": "^2.6.10" 17 | }, 18 | "devDependencies": { 19 | "@vue/cli-plugin-babel": "^4.1.0", 20 | "@vue/cli-plugin-eslint": "^4.1.0", 21 | "@vue/cli-service": "^4.1.0", 22 | "babel-eslint": "^10.0.3", 23 | "bpmn-js": "^6.0.4", 24 | "eslint": "^5.16.0", 25 | "eslint-plugin-vue": "^5.0.0", 26 | "vue-router": "^3.1.3", 27 | "vue-template-compiler": "^2.6.10" 28 | }, 29 | "eslintConfig": { 30 | "root": true, 31 | "env": { 32 | "node": true 33 | }, 34 | "extends": [ 35 | "plugin:vue/essential", 36 | "eslint:recommended" 37 | ], 38 | "rules": { 39 | "no-console": "off", 40 | "no-unused-vars": "off" 41 | }, 42 | "parserOptions": { 43 | "parser": "babel-eslint" 44 | } 45 | }, 46 | "browserslist": [ 47 | "> 1%", 48 | "last 2 versions" 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinDaiDai/bpmn-vue-properties-panel/1679d1546c18c661369f19c6a7c462abd890ea8b/public/favicon.ico -------------------------------------------------------------------------------- /public/image/screencCapture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinDaiDai/bpmn-vue-properties-panel/1679d1546c18c661369f19c6a7c462abd890ea8b/public/image/screencCapture.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | bpmn-vue-basic 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 33 | 34 | 67 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinDaiDai/bpmn-vue-properties-panel/1679d1546c18c661369f19c6a7c462abd890ea8b/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/custom-color.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 82 | 83 | -------------------------------------------------------------------------------- /src/components/custom-properties-panel.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 79 | 80 | -------------------------------------------------------------------------------- /src/components/custom-properties-panel/PropertiesView.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 187 | 188 | 245 | -------------------------------------------------------------------------------- /src/components/custom-properties-panel/index.js: -------------------------------------------------------------------------------- 1 | import PropertiesView from './PropertiesView'; 2 | 3 | export { PropertiesView } -------------------------------------------------------------------------------- /src/components/custom/CustomRenderer.js: -------------------------------------------------------------------------------- 1 | import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer'; 2 | 3 | const HIGH_PRIORITY = 1500 4 | 5 | const propertiesConfig = { 6 | 'bpmn:StartEvent': { 7 | fill: '#12c2e9' 8 | }, 9 | 'bpmn:Task': { 10 | stroke: '#c471ed', 11 | strokeWidth: 2, 12 | }, 13 | 'bpmn:EndEvent': { 14 | stroke: '#f64f59', 15 | fill: '#f64f59' 16 | } 17 | } 18 | 19 | export default class CustomRenderer extends BaseRenderer { 20 | constructor(eventBus, bpmnRenderer) { 21 | super(eventBus, HIGH_PRIORITY); 22 | 23 | this.bpmnRenderer = bpmnRenderer; 24 | } 25 | 26 | canRender(element) { 27 | // ignore labels 28 | return !element.labelTarget; 29 | } 30 | drawShape(parentNode, element) { 31 | let shape = this.bpmnRenderer.drawShape(parentNode, element) 32 | setShapeProperties(shape, element) // 在此修改shape 33 | return shape 34 | } 35 | 36 | getShapePath(shape) { 37 | return this.bpmnRenderer.getShapePath(shape); 38 | } 39 | } 40 | 41 | function setShapeProperties (shape, element) { 42 | const type = element.type // 获取到的类型 43 | if (propertiesConfig[type]) { 44 | const properties = propertiesConfig[type] 45 | Object.keys(properties).forEach(prop => { 46 | shape.style.setProperty(prop, properties[prop]) 47 | }) 48 | } 49 | } 50 | 51 | CustomRenderer.$inject = ['eventBus', 'bpmnRenderer']; -------------------------------------------------------------------------------- /src/components/custom/index.js: -------------------------------------------------------------------------------- 1 | import CustomRenderer from './CustomRenderer.js' 2 | 3 | export default { 4 | __init__: ['customRenderer'], 5 | customRenderer: ['type', CustomRenderer] 6 | } -------------------------------------------------------------------------------- /src/components/properties-panel-extension.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 96 | 97 | -------------------------------------------------------------------------------- /src/components/properties-panel-extension/descriptors/authority.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Authority", 3 | "prefix": "authority", 4 | "uri": "http://authority", 5 | "xml": { 6 | "tagAlias": "lowerCase" 7 | }, 8 | "associations": [], 9 | "types": [ 10 | { 11 | "name": "LinDaiDaiStartEvent", 12 | "extends": [ 13 | "bpmn:StartEvent" 14 | ], 15 | "properties": [ 16 | { 17 | "name": "title", 18 | "isAttr": true, 19 | "type": "String" 20 | } 21 | ] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /src/components/properties-panel-extension/provider/authority/AuthorityPropertiesProvider.js: -------------------------------------------------------------------------------- 1 | import inherits from 'inherits'; 2 | 3 | import PropertiesActivator from 'bpmn-js-properties-panel/lib/PropertiesActivator'; 4 | 5 | 6 | import idProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/IdProps'; 7 | import nameProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/NameProps'; 8 | import processProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/ProcessProps'; 9 | import linkProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/LinkProps'; 10 | import eventProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/EventProps'; 11 | import documentationProps from 'bpmn-js-properties-panel/lib/provider/bpmn/parts/DocumentationProps'; 12 | 13 | import TitleProps from './parts/TitleProps'; 14 | 15 | function createGeneralTabGroups(element, bpmnFactory, canvas, elementRegistry, translate) { 16 | 17 | var generalGroup = { 18 | id: 'general', 19 | label: 'General', 20 | entries: [] 21 | }; 22 | idProps(generalGroup, element, translate); 23 | nameProps(generalGroup, element, bpmnFactory, canvas, translate); 24 | processProps(generalGroup, element, translate); 25 | 26 | var detailsGroup = { 27 | id: 'details', 28 | label: 'Details', 29 | entries: [] 30 | }; 31 | linkProps(detailsGroup, element, translate); 32 | eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate); 33 | 34 | var documentationGroup = { 35 | id: 'documentation', 36 | label: 'Documentation', 37 | entries: [] 38 | }; 39 | 40 | documentationProps(documentationGroup, element, bpmnFactory, translate); 41 | 42 | return [ 43 | generalGroup, 44 | detailsGroup, 45 | documentationGroup 46 | ]; 47 | } 48 | 49 | function createAuthorityTabGroups(element) { 50 | var editAuthorityGroup = { 51 | id: 'edit-authority', 52 | label: '编辑权限', 53 | entries: [] 54 | } 55 | 56 | // 每个属性都有自己的props方法 57 | TitleProps(editAuthorityGroup, element); 58 | // OtherProps1(editAuthorityGroup, element); 59 | // OtherProps2(editAuthorityGroup, element); 60 | 61 | return [ 62 | editAuthorityGroup 63 | ]; 64 | } 65 | // 这里是要用到什么就引入什么 66 | export default function AuthorityPropertiesProvider( 67 | eventBus, bpmnFactory, canvas, 68 | elementRegistry, translate 69 | ) { 70 | PropertiesActivator.call(this, eventBus); 71 | 72 | this.getTabs = function(element) { 73 | var generalTab = { 74 | id: 'general', 75 | label: 'General', 76 | groups: createGeneralTabGroups(element, bpmnFactory, canvas, elementRegistry, translate) 77 | }; 78 | 79 | var authorityTab = { 80 | id: 'authority', 81 | label: '权限', 82 | groups: createAuthorityTabGroups(element) 83 | }; 84 | return [ 85 | generalTab, 86 | authorityTab 87 | ]; 88 | } 89 | } 90 | 91 | inherits(AuthorityPropertiesProvider, PropertiesActivator); -------------------------------------------------------------------------------- /src/components/properties-panel-extension/provider/authority/index.js: -------------------------------------------------------------------------------- 1 | import AuthorityPropertiesProvider from './AuthorityPropertiesProvider'; 2 | 3 | export default { 4 | __init__: [ 'propertiesProvider' ], 5 | propertiesProvider: [ 'type', AuthorityPropertiesProvider ] 6 | }; -------------------------------------------------------------------------------- /src/components/properties-panel-extension/provider/authority/parts/TitleProps.js: -------------------------------------------------------------------------------- 1 | import entryFactory from 'bpmn-js-properties-panel/lib/factory/EntryFactory'; 2 | 3 | import { 4 | is 5 | } from 'bpmn-js/lib/util/ModelUtil'; 6 | 7 | 8 | export default function(group, element) { 9 | if (is(element, 'bpmn:StartEvent')) { // 可以在这里做类型判断 10 | group.entries.push(entryFactory.textField({ 11 | id: 'title', 12 | description: '权限的标题', 13 | label: '标题', 14 | modelProperty: 'title' 15 | })); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import router from './router' 4 | Vue.config.productionTip = false 5 | // 以下为bpmn工作流绘图工具的样式 6 | import 'bpmn-js/dist/assets/diagram-js.css' // 左边工具栏以及编辑节点的样式 7 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css' 8 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css' 9 | import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css' 10 | import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右边工具栏样式 11 | // import 'bpmn-js-in-color/colors/color-picker.css' 12 | import './styles/bpmn-properties-theme-red.css' 13 | // import './styles/bpmn-properties-theme-blue.css' 14 | // import './styles/bpmn-properties-theme-black.css' 15 | import './styles/bpmn-custom-color.css' 16 | 17 | 18 | new Vue({ 19 | router, 20 | render: h => h(App), 21 | }).$mount('#app') -------------------------------------------------------------------------------- /src/mock/xmlStr.bpmn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SequenceFlow_0h21x7r 6 | 7 | 8 | SequenceFlow_0h21x7r 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/mock/xmlStr.js: -------------------------------------------------------------------------------- 1 | export var xmlStr = ` 2 | 3 | 4 | 5 | SequenceFlow_0h21x7r 6 | 7 | 8 | SequenceFlow_0h21x7r 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ` -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | Vue.use(Router) 4 | 5 | const routes = [{ 6 | path: '/', 7 | redirect: '/properties-panel-extension' 8 | }, 9 | { 10 | path: '/properties-panel-extension', 11 | component: () => 12 | import ('./../components/properties-panel-extension') 13 | }, 14 | { 15 | path: '/custom-properties-panel', 16 | component: () => 17 | import ('./../components/custom-properties-panel') 18 | }, 19 | { 20 | path: '/custom-color', 21 | component: () => 22 | import ('./../components/custom-color') 23 | } 24 | ] 25 | 26 | export default new Router({ 27 | mode: 'history', 28 | routes 29 | }) -------------------------------------------------------------------------------- /src/styles/bpmn-custom-color.css: -------------------------------------------------------------------------------- 1 | .bpmn-color .bpmn-icon-start-event-none:before { 2 | color: #12c2e9; 3 | } 4 | .bpmn-color .bpmn-icon-task:before { 5 | color: #c471ed; 6 | } 7 | .bpmn-color .bpmn-icon-end-event-none:before { 8 | color: #f64f59; 9 | } 10 | -------------------------------------------------------------------------------- /src/styles/bpmn-properties-theme-black.css: -------------------------------------------------------------------------------- 1 | .bpp-properties-panel { 2 | background-color: #fff; 3 | border-color: rgba(0, 0, 0, 0.09); 4 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); 5 | } 6 | 7 | .bpp-properties-panel label { 8 | color: #000; 9 | } 10 | 11 | .bpp-properties-header { 12 | color: #000; 13 | } 14 | 15 | .bpp-properties-header>.label { 16 | color: #000; 17 | font-size: 16px; 18 | } 19 | 20 | .bpp-field-description { 21 | font-size: 12px; 22 | } 23 | 24 | ul.bpp-properties-tabs-links>li.bpp-active a { 25 | border-top: 2px solid #000; 26 | color: #000; 27 | } 28 | 29 | ul.bpp-properties-tabs-links>li>a { 30 | border: 1px solid #000; 31 | border-radius: 2px 2px 0 0; 32 | } 33 | 34 | .bpp-properties-group:hover>.group-toggle { 35 | background-color: #000; 36 | } 37 | 38 | .bpp-properties-group>.group-label { 39 | font-size: 16px; 40 | color: #000; 41 | border-bottom: 2px solid #000; 42 | font-style: normal; 43 | } 44 | 45 | .bpp-properties-panel [type=text], 46 | .bpp-properties-panel [contenteditable], 47 | .bpp-properties-panel textarea, 48 | .bpp-properties-panel select { 49 | width: 85%; 50 | padding: 4px 11px; 51 | color: rgba(0, 0, 0, 0.65); 52 | font-size: 14px; 53 | background-color: #fff; 54 | background-image: none; 55 | border: 1px solid #d9d9d9; 56 | border-radius: 4px; 57 | transition: all 0.3s; 58 | } 59 | 60 | .bpp-properties-panel input:focus, 61 | .bpp-properties-panel button:focus, 62 | .bpp-properties-panel textarea:focus, 63 | .bpp-properties-panel [contenteditable]:focus { 64 | border-color: #000; 65 | box-shadow: 0 0 1px 2px #f8f8f8; 66 | } 67 | 68 | .bpp-properties-panel [contenteditable] { 69 | margin: 0 auto; 70 | } 71 | 72 | .bpp-properties-panel button { 73 | height: 15px; 74 | width: 14px; 75 | text-align: center; 76 | border-radius: 50%; 77 | padding: 0; 78 | color: #000; 79 | } 80 | 81 | .bpp-textfield .clear { 82 | top: 50%; 83 | right: 11px; 84 | transform: translateY(-50%); 85 | background-color: #ccc; 86 | } 87 | 88 | .bpp-properties-panel button:hover { 89 | background: #000; 90 | color: #fff; 91 | } 92 | 93 | .bpp-properties-tab-bar { 94 | border-color: #000; 95 | } 96 | 97 | .bpp-properties-group+.bpp-properties-group { 98 | border-top: 1px dotted #000; 99 | } -------------------------------------------------------------------------------- /src/styles/bpmn-properties-theme-blue.css: -------------------------------------------------------------------------------- 1 | .bpp-properties-panel { 2 | background-color: rgba(27, 31, 35, .05); 3 | border-color: rgba(0, 0, 0, 0.09); 4 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); 5 | } 6 | 7 | .bpp-properties-panel label { 8 | color: #0e88eb; 9 | } 10 | 11 | .bpp-properties-header { 12 | color: #fff; 13 | } 14 | 15 | .bpp-properties-header>.label { 16 | color: #0e88eb; 17 | font-size: 16px; 18 | } 19 | 20 | .bpp-field-description { 21 | font-size: 12px; 22 | } 23 | 24 | ul.bpp-properties-tabs-links>li.bpp-active a { 25 | border-top: 2px solid #0e88eb; 26 | color: #0e88eb; 27 | } 28 | 29 | ul.bpp-properties-tabs-links>li>a { 30 | border: 1px solid #0e88eb; 31 | border-radius: 2px 2px 0 0; 32 | } 33 | 34 | .bpp-properties-group:hover>.group-toggle { 35 | background-color: #0e88eb; 36 | } 37 | 38 | .bpp-properties-group>.group-label { 39 | font-size: 16px; 40 | color: #0e88eb; 41 | border-bottom: 2px solid #0e88eb; 42 | font-style: normal; 43 | } 44 | 45 | .bpp-properties-panel [type=text], 46 | .bpp-properties-panel [contenteditable], 47 | .bpp-properties-panel textarea, 48 | .bpp-properties-panel select { 49 | width: 85%; 50 | padding: 4px 11px; 51 | color: rgba(0, 0, 0, 0.65); 52 | font-size: 14px; 53 | background-color: #fff; 54 | background-image: none; 55 | border: 1px solid #d9d9d9; 56 | border-radius: 4px; 57 | transition: all 0.3s; 58 | } 59 | 60 | .bpp-properties-panel input:focus, 61 | .bpp-properties-panel button:focus, 62 | .bpp-properties-panel textarea:focus, 63 | .bpp-properties-panel [contenteditable]:focus { 64 | border-color: #0e88eb; 65 | box-shadow: 0 0 1px 2px #4d90fe45; 66 | } 67 | 68 | .bpp-properties-panel [contenteditable] { 69 | margin: 0 auto; 70 | } 71 | 72 | .bpp-properties-panel button { 73 | height: 15px; 74 | width: 14px; 75 | text-align: center; 76 | border-radius: 50%; 77 | padding: 0; 78 | color: #fff; 79 | } 80 | 81 | .bpp-textfield .clear { 82 | top: 50%; 83 | right: 11px; 84 | transform: translateY(-50%); 85 | background-color: #ccc; 86 | } 87 | 88 | .bpp-properties-panel button:hover { 89 | background: #0e88eb; 90 | color: #fff; 91 | } 92 | 93 | .bpp-properties-tab-bar { 94 | border-color: #0e88eb; 95 | } 96 | 97 | .bpp-properties-group+.bpp-properties-group { 98 | border-top: 1px dotted #0e88eb; 99 | } -------------------------------------------------------------------------------- /src/styles/bpmn-properties-theme-red.css: -------------------------------------------------------------------------------- 1 | .bpp-properties-panel { 2 | background-color: #fff9f9; 3 | border-color: rgba(0, 0, 0, 0.09); 4 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); 5 | } 6 | 7 | .bpp-properties-panel label { 8 | color: rgb(239, 112, 96); 9 | } 10 | 11 | .bpp-properties-header { 12 | color: #fff; 13 | } 14 | 15 | .bpp-properties-header>.label { 16 | color: rgb(239, 112, 96); 17 | font-size: 16px; 18 | } 19 | 20 | .bpp-field-description { 21 | font-size: 12px; 22 | } 23 | 24 | ul.bpp-properties-tabs-links>li.bpp-active a { 25 | border-top: 2px solid rgb(239, 112, 96); 26 | color: rgb(239, 112, 96); 27 | } 28 | 29 | ul.bpp-properties-tabs-links>li>a { 30 | border: 1px solid rgb(239, 112, 96); 31 | border-radius: 2px 2px 0 0; 32 | } 33 | 34 | .bpp-properties-group:hover>.group-toggle { 35 | background-color: rgb(239, 112, 96); 36 | } 37 | 38 | .bpp-properties-group>.group-label { 39 | font-size: 16px; 40 | color: rgb(239, 112, 96); 41 | border-bottom: 2px solid rgb(239, 112, 96); 42 | font-style: normal; 43 | } 44 | 45 | .bpp-properties-panel [type=text], 46 | .bpp-properties-panel [contenteditable], 47 | .bpp-properties-panel textarea, 48 | .bpp-properties-panel select { 49 | width: 85%; 50 | padding: 4px 11px; 51 | color: rgba(0, 0, 0, 0.65); 52 | font-size: 14px; 53 | background-color: #fff; 54 | background-image: none; 55 | border: 1px solid #d9d9d9; 56 | border-radius: 4px; 57 | transition: all 0.3s; 58 | } 59 | 60 | .bpp-properties-panel input:focus, 61 | .bpp-properties-panel button:focus, 62 | .bpp-properties-panel textarea:focus, 63 | .bpp-properties-panel [contenteditable]:focus { 64 | border-color: rgb(239, 112, 96); 65 | box-shadow: 0 0 1px 2px rgb(239, 112, 96, 0.2); 66 | } 67 | 68 | .bpp-properties-panel [contenteditable] { 69 | margin: 0 auto; 70 | } 71 | 72 | .bpp-properties-panel button { 73 | height: 15px; 74 | width: 14px; 75 | text-align: center; 76 | border-radius: 50%; 77 | padding: 0; 78 | color: #fff; 79 | } 80 | 81 | .bpp-textfield .clear { 82 | top: 50%; 83 | right: 11px; 84 | transform: translateY(-50%); 85 | background-color: #ccc; 86 | } 87 | 88 | .bpp-properties-panel button:hover { 89 | background: rgb(239, 112, 96); 90 | color: #fff; 91 | } 92 | 93 | .bpp-properties-tab-bar { 94 | border-color: rgb(239, 112, 96); 95 | } 96 | 97 | .bpp-properties-group+.bpp-properties-group { 98 | border-top: 1px dotted rgb(239, 112, 96); 99 | } --------------------------------------------------------------------------------