├── .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 | 
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 |
2 |
3 |
4 |
5 | {{ link.title }}
12 |
13 |
14 |
15 |
16 |
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 |
2 |
5 |
6 |
7 |
82 |
83 |
--------------------------------------------------------------------------------
/src/components/custom-properties-panel.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
79 |
80 |
--------------------------------------------------------------------------------
/src/components/custom-properties-panel/PropertiesView.vue:
--------------------------------------------------------------------------------
1 |
2 |
36 |
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 |
2 |
6 |
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 | }
--------------------------------------------------------------------------------