@things-factory/board-ui 4.0.10 → 4.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/client/index.js +0 -2
  2. package/client/pages/board-modeller-page.js +6 -75
  3. package/client/pages/board-player-page.js +1 -1
  4. package/client/pages/board-viewer-page.js +1 -1
  5. package/package.json +9 -10
  6. package/assets/images/icon-properties-ipattern.png +0 -0
  7. package/client/board-modeller/board-modeller.js +0 -237
  8. package/client/board-modeller/component-toolbar/component-menu.js +0 -153
  9. package/client/board-modeller/component-toolbar/component-toolbar.js +0 -193
  10. package/client/board-modeller/edit-toolbar-style.js +0 -228
  11. package/client/board-modeller/edit-toolbar.js +0 -637
  12. package/client/board-modeller/property-sidebar/abstract-property.js +0 -73
  13. package/client/board-modeller/property-sidebar/data-binding/data-binding-mapper.js +0 -366
  14. package/client/board-modeller/property-sidebar/data-binding/data-binding.js +0 -476
  15. package/client/board-modeller/property-sidebar/effects/effects-shared-style.js +0 -58
  16. package/client/board-modeller/property-sidebar/effects/effects.js +0 -64
  17. package/client/board-modeller/property-sidebar/effects/property-animation.js +0 -141
  18. package/client/board-modeller/property-sidebar/effects/property-animations.js +0 -92
  19. package/client/board-modeller/property-sidebar/effects/property-event-hover.js +0 -144
  20. package/client/board-modeller/property-sidebar/effects/property-event-tap.js +0 -146
  21. package/client/board-modeller/property-sidebar/effects/property-event.js +0 -72
  22. package/client/board-modeller/property-sidebar/effects/property-shadow.js +0 -122
  23. package/client/board-modeller/property-sidebar/effects/value-converter.js +0 -26
  24. package/client/board-modeller/property-sidebar/inspector/inspector.js +0 -338
  25. package/client/board-modeller/property-sidebar/property-shared-style.js +0 -132
  26. package/client/board-modeller/property-sidebar/property-sidebar.js +0 -324
  27. package/client/board-modeller/property-sidebar/shapes/box-padding-editor-styles.js +0 -94
  28. package/client/board-modeller/property-sidebar/shapes/shapes.js +0 -421
  29. package/client/board-modeller/property-sidebar/specifics/specific-properties-builder.js +0 -149
  30. package/client/board-modeller/property-sidebar/specifics/specifics.js +0 -248
  31. package/client/board-modeller/property-sidebar/styles/styles.js +0 -591
  32. package/client/board-modeller/scene-viewer/confidential-overlay.js +0 -18
  33. package/client/board-modeller/scene-viewer/things-scene-handler.js +0 -50
  34. package/client/board-modeller/scene-viewer/things-scene-layer.js +0 -52
  35. package/client/board-modeller/scene-viewer/things-scene-player.js +0 -115
  36. package/client/board-modeller/scene-viewer/things-scene-property.js +0 -25
  37. package/client/board-modeller/scene-viewer/things-scene-viewer.js +0 -312
@@ -1,122 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import { LitElement, html, css } from 'lit-element'
6
-
7
- import '@things-factory/i18n-base'
8
- import '@things-factory/modeller-ui/client/editors/things-editor-color'
9
- import { convert } from './value-converter'
10
-
11
- /**
12
- * 컴포넌트의 그림자 속성을 편집하는 element
13
- *
14
- * Example:
15
- * <property-shadow
16
- * @change="${e => { this.shadow = e.target.value }}"
17
- * value="${this.shadow}"
18
- * ></property-shadow>
19
- */
20
-
21
- export default class PropertyShadow extends LitElement {
22
- static get properties() {
23
- return {
24
- value: Object
25
- }
26
- }
27
-
28
- static get styles() {
29
- return [
30
- css`
31
- :host {
32
- display: grid;
33
- grid-template-columns: repeat(10, 1fr);
34
- grid-gap: 5px;
35
- grid-auto-rows: minmax(24px, auto);
36
-
37
- align-items: center;
38
- }
39
-
40
- * {
41
- align-self: stretch;
42
- }
43
-
44
- label {
45
- grid-column: span 3;
46
- text-align: right;
47
- text-transform: capitalize;
48
-
49
- align-self: center;
50
- }
51
-
52
- input[type='number'],
53
- things-editor-color {
54
- grid-column: span 7;
55
- }
56
- input[type='number'] {
57
- border: var(--property-sidebar-fieldset-border);
58
- }
59
-
60
- .icon-only-label {
61
- grid-column: span 3;
62
- background: url(/assets/images/icon-properties-label.png) no-repeat;
63
- float: left;
64
- margin: 0;
65
- align-self: stretch;
66
- }
67
-
68
- .icon-only-label.color {
69
- background-position: 100% -500px;
70
- }
71
- `
72
- ]
73
- }
74
-
75
- constructor() {
76
- super()
77
-
78
- this.value = {}
79
- }
80
-
81
- firstUpdated() {
82
- this.shadowRoot.addEventListener('change', this._onValueChange.bind(this))
83
- }
84
-
85
- render() {
86
- return html`
87
- <label> <i18n-msg msgid="label.shadowOffsetX">offset-X</i18n-msg> </label>
88
-
89
- <input type="number" value-key="left" .value=${this.value.left} />
90
-
91
- <label> <i18n-msg msgid="label.shadowOffsetY">offset-Y</i18n-msg> </label>
92
-
93
- <input type="number" value-key="top" .value=${this.value.top} />
94
-
95
- <label> <i18n-msg msgid="label.shadowSize">Size</i18n-msg> </label>
96
-
97
- <input type="number" value-key="blurSize" .value=${this.value.blurSize} />
98
-
99
- <label class="icon-only-label color"></label>
100
-
101
- <things-editor-color value-key="color" .value=${this.value.color}> </things-editor-color>
102
- `
103
- }
104
-
105
- _onValueChange(e) {
106
- var element = e.target
107
- var key = element.getAttribute('value-key')
108
-
109
- if (!key) {
110
- return
111
- }
112
-
113
- this.value = {
114
- ...this.value,
115
- [key]: convert(element)
116
- }
117
-
118
- this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
119
- }
120
- }
121
-
122
- customElements.define('property-shadow', PropertyShadow)
@@ -1,26 +0,0 @@
1
- export function convert(element) {
2
- switch (element.tagName) {
3
- case 'THINGS-EDITOR-ANGLE-INPUT':
4
- return Number(element.radian) || 0
5
-
6
- case 'INPUT':
7
- switch (element.type) {
8
- case 'checkbox':
9
- return element.checked
10
- case 'number':
11
- return Number(element.value) || 0
12
- case 'text':
13
- return String(element.value)
14
- }
15
- break
16
-
17
- case 'PAPER-BUTTON':
18
- return element.active
19
-
20
- case 'PAPER-LISTBOX':
21
- return element.selected
22
-
23
- default:
24
- return element.value
25
- }
26
- }
@@ -1,338 +0,0 @@
1
- import { LitElement, html, css } from 'lit-element'
2
- import Sortable from 'sortablejs'
3
-
4
- export default class SceneInspector extends LitElement {
5
- constructor() {
6
- super()
7
- }
8
-
9
- static get properties() {
10
- return {
11
- scene: Object
12
- }
13
- }
14
-
15
- static get styles() {
16
- return [
17
- css`
18
- :host {
19
- color: var(--scene-inspector-color);
20
- }
21
-
22
- .component {
23
- display: block;
24
- overflow: hidden;
25
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
26
- font-size: 14px;
27
- }
28
-
29
- .component[selected] {
30
- background-color: var(--scene-inspector-selected-background-color);
31
- border-top: var(--scene-inspector-selected-border);
32
- border-bottom: var(--scene-inspector-selected-border);
33
- }
34
- [selected] .type {
35
- font-weight: bold;
36
- }
37
-
38
- span,
39
- i {
40
- display: inline-block;
41
- }
42
-
43
- span.type {
44
- text-overflow: ellipses;
45
- }
46
-
47
- span.name {
48
- background-color: var(--scene-inspector-name-background-color);
49
- border-radius: var(--border-radius);
50
- padding: 0 4px;
51
- color: #fff;
52
- font-size: 0.8em;
53
- }
54
-
55
- .eye {
56
- margin: 0 0 0 5px;
57
- vertical-align: middle;
58
- opacity: 0.7;
59
- font-size: 1.1em;
60
- color: var(--scene-inspector-eye-icon-color);
61
- }
62
-
63
- .collapsed::before,
64
- .extended::before,
65
- .collapsespace::before {
66
- background: url(/assets/images/icon-shell-inspector.png) no-repeat;
67
- width: 16px;
68
- height: 18px;
69
- display: inline-block;
70
- content: '';
71
- opacity: 0.6;
72
- }
73
-
74
- .collapsed::before {
75
- background-position: 100% -195px;
76
- }
77
-
78
- .extended::before {
79
- background-position: 100% -295px;
80
- }
81
-
82
- .collapsespace::before {
83
- background-position: 100% -395px;
84
- opacity: 0.9;
85
- width: 16px;
86
- }
87
- .collapsed,
88
- .extended,
89
- .collapsespace {
90
- border-left: 1px dotted rgba(0, 0, 0, 0.1);
91
- }
92
-
93
- pre {
94
- display: inline;
95
- }
96
- `
97
- ]
98
- }
99
-
100
- render() {
101
- return html`
102
- ${!this.scene ? html`` : this.renderComponent(this.scene.root, 0)}
103
- `
104
- }
105
-
106
- firstUpdated() {
107
- dispatchEvent(new Event('resize'))
108
- this.shadowRoot.addEventListener('click', this.onclick.bind(this))
109
- this.shadowRoot.addEventListener('dblclick', this.ondblclick.bind(this))
110
- }
111
-
112
- updated(change) {
113
- if (change.has('scene')) {
114
- let oldScene = change.get('scene')
115
-
116
- if (oldScene) {
117
- oldScene.off('selected')
118
- oldScene.off('execute')
119
- oldScene.off('undo')
120
- oldScene.off('redo')
121
-
122
- delete this.extendedMap
123
- }
124
-
125
- if (this.scene && this.scene.root) {
126
- // root 는 기본상태가 extended 되도록 하기위해서임.
127
- this.extendedMap.set(this.scene.root, true)
128
-
129
- this.scene.on('selected', (after, before) => {
130
- let selected = after
131
-
132
- selected.forEach(component => {
133
- let parent = component.parent
134
- while (parent && !this.extendedMap.get(parent)) {
135
- this.extendedMap.set(parent, true)
136
- parent = parent.parent
137
- }
138
- })
139
-
140
- this.requestUpdate()
141
- })
142
-
143
- this.scene.on('execute', (after, before) => {
144
- this.requestUpdate()
145
- })
146
-
147
- this.scene.on('undo', (after, before) => {
148
- this.extendedMap.set(this.scene.root, true)
149
- this.requestUpdate()
150
- })
151
-
152
- this.scene.on('redo', (after, before) => {
153
- this.extendedMap.set(this.scene.root, true)
154
- this.requestUpdate()
155
- })
156
- }
157
- }
158
-
159
- this.updateComplete.then(() => {
160
- this.shadowRoot.querySelectorAll('[sortable]').forEach(sortable => {
161
- new Sortable(sortable, this.sortableConfig)
162
- })
163
- })
164
- }
165
-
166
- sortableConfig = {
167
- group: 'inspector',
168
- animation: 150,
169
- draggable: '.component',
170
- swapThreshold: 1,
171
- onSort: this.onSort.bind(this)
172
- }
173
-
174
- onSort(e) {
175
- if (!this.scene) return
176
-
177
- var component = e.item.component
178
- var to_container = e.to.component
179
- var to_index = e.newIndex - 1
180
-
181
- this.scene.move(component, to_container, to_index)
182
-
183
- this.show = false
184
- this.updateComplete.then(() => {
185
- this.show = true
186
- })
187
- }
188
-
189
- disconnectedCallback() {
190
- super.disconnectedCallback()
191
-
192
- delete this.scene
193
- delete this._extendedMap
194
- }
195
-
196
- onclick(e) {
197
- e.stopPropagation()
198
-
199
- var targetElement = e.target
200
- var classList = targetElement.classList
201
- var component
202
-
203
- while (!component && targetElement) {
204
- component = targetElement.component
205
-
206
- if (component) break
207
-
208
- targetElement = targetElement.parentNode
209
-
210
- if (!targetElement || targetElement === this.shadowRoot) break
211
- }
212
-
213
- if (component) {
214
- if (classList.contains('eye')) {
215
- this.toggleHidden(component)
216
- } else if (classList.contains('extended') || classList.contains('collapsed')) {
217
- this.toggleExtended(component)
218
- }
219
-
220
- this.selectComponent(component)
221
- } else {
222
- if (classList.contains('inspector')) {
223
- this.show = !this.show
224
- this.style.height = this.show ? '100%' : ''
225
- }
226
- }
227
-
228
- this.requestUpdate()
229
- }
230
-
231
- ondblclick(e) {
232
- e.stopPropagation()
233
-
234
- var targetElement = e.target
235
- var component
236
-
237
- while (!component && targetElement) {
238
- component = targetElement.component
239
-
240
- if (component) break
241
-
242
- targetElement = targetElement.parentNode
243
-
244
- if (!targetElement || targetElement === this.shadowRoot) break
245
- }
246
-
247
- if (component && component.isContainer()) {
248
- this.toggleExtended(component)
249
- }
250
-
251
- this.requestUpdate()
252
- }
253
-
254
- get extendedMap() {
255
- if (!this._extendedMap) {
256
- this._extendedMap = new WeakMap()
257
- }
258
-
259
- return this._extendedMap
260
- }
261
-
262
- getNodeHandleClass(component) {
263
- if (component.isContainer() && component.components.length > 0) {
264
- return !!this.extendedMap.get(component) ? 'extended' : 'collapsed'
265
- } else {
266
- return 'collapsespace'
267
- }
268
- }
269
-
270
- isExtended(component) {
271
- return !!this.extendedMap.get(component)
272
- }
273
-
274
- toggleExtended(component) {
275
- var extended = this.isExtended(component)
276
-
277
- if (extended) {
278
- this.extendedMap.delete(component)
279
- } else {
280
- this.extendedMap.set(component, !extended)
281
- }
282
-
283
- this.requestUpdate()
284
- }
285
-
286
- toggleHidden(component) {
287
- component.set('hidden', !component.hidden)
288
-
289
- this.requestUpdate()
290
- }
291
-
292
- selectComponent(component) {
293
- this.scene.selected = [component]
294
-
295
- this.requestUpdate()
296
- }
297
-
298
- renderComponent(component, depth) {
299
- if (!component) {
300
- return html``
301
- }
302
-
303
- var children = component.components || []
304
- var extended = this.isExtended(component) ? children : []
305
-
306
- return html`
307
- <div
308
- class="component"
309
- ?selected=${(this.scene.selected || []).indexOf(component) > -1}
310
- .component=${component}
311
- ?sortable=${component.isContainer()}
312
- >
313
- <span>
314
- ${depth > 0
315
- ? html`
316
- <mwc-icon class="eye">${component.get('hidden') ? 'visibility_off' : 'visibility'}</mwc-icon>
317
- <pre>${' '.repeat(depth)}</pre>
318
- `
319
- : html`
320
- <pre>${' '.repeat(depth + 2)}</pre>
321
- `}
322
-
323
- <span class=${this.getNodeHandleClass(component)}> </span>
324
-
325
- <span class="type">${depth == 0 ? 'ROOT' : component.get('type')}</span> ${component.get('id')
326
- ? html`
327
- <span class="name">#${component.get('id')}</span>
328
- `
329
- : html``}
330
- </span>
331
-
332
- ${extended.map(child => this.renderComponent(child, depth + 1))}
333
- </div>
334
- `
335
- }
336
- }
337
-
338
- customElements.define('scene-inspector', SceneInspector)
@@ -1,132 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import { css } from 'lit-element'
6
-
7
- export const PropertySharedStyle = css`
8
- fieldset {
9
- border: none;
10
- margin: 4px;
11
- padding: 9px 4px 9px 4px;
12
- border-bottom: var(--property-sidebar-fieldset-border);
13
- color: var(--property-sidebar-fieldset-legend-color);
14
- font: var(--property-sidebar-fieldset-label);
15
- }
16
-
17
- fieldset legend {
18
- padding: 5px 0 0 5px;
19
- color: var(--property-sidebar-fieldset-legend-color);
20
- font: var(--property-sidebar-fieldset-legend);
21
- text-transform: capitalize;
22
- }
23
-
24
- select,
25
- input {
26
- border: var(--property-sidebar-fieldset-border);
27
- }
28
-
29
- /* property grid */
30
- .property-grid {
31
- display: grid;
32
- grid-template-columns: repeat(10, 1fr);
33
- grid-gap: 5px;
34
- grid-auto-rows: minmax(24px, auto);
35
- align-items: center;
36
- }
37
-
38
- .property-grid > * {
39
- width: 100%;
40
- box-sizing: border-box;
41
- }
42
-
43
- .property-grid > label {
44
- grid-column: span 3;
45
- text-align: right;
46
- text-transform: capitalize;
47
- line-height: 2;
48
- }
49
-
50
- .property-grid > input,
51
- .property-grid > table,
52
- .property-grid > select,
53
- .property-grid > things-editor-angle-input,
54
- .property-grid > things-editor-buttons-radio,
55
- .property-grid > things-editor-color,
56
- [custom-editor] {
57
- grid-column: span 7;
58
- align-self: stretch;
59
- }
60
-
61
- .property-grid > .checkbox-row {
62
- grid-column: span 10;
63
- }
64
-
65
- .property-grid > .property-full-label {
66
- grid-column: span 3;
67
- text-align: right;
68
- text-transform: capitalize;
69
- }
70
-
71
- .property-grid > .property-half-label {
72
- grid-column: span 1;
73
- }
74
-
75
- .property-grid > .property-full-input {
76
- grid-column: span 7;
77
- }
78
-
79
- .property-grid > .property-half-input {
80
- grid-column: span 4;
81
- }
82
-
83
- /* checkbox-row */
84
- .checkbox-row {
85
- display: grid;
86
- grid-template-columns: repeat(10, 1fr);
87
- grid-gap: 5px;
88
- grid-auto-rows: minmax(24px, auto);
89
- align-items: center;
90
- }
91
-
92
- .checkbox-row > input {
93
- grid-column: 4 / 5;
94
- }
95
-
96
- .checkbox-row > label {
97
- grid-column: span 6;
98
- text-align: left;
99
- }
100
-
101
- /* image resources */
102
- .icon-only-label {
103
- grid-column: span 1;
104
-
105
- background: url(/assets/images/icon-properties-label.png) no-repeat;
106
- float: left;
107
- margin: 0;
108
- align-self: stretch;
109
- }
110
-
111
- .icon-only-label.color {
112
- background-position: 100% -500px;
113
- }
114
- .icon-only-label.font-size {
115
- background-position: 100% -594px;
116
- }
117
- .icon-only-label.leading {
118
- background-position: 100% -696px;
119
- }
120
- .icon-only-label.hscale {
121
- background-position: 100% -296px;
122
- }
123
- .icon-only-label.vscale {
124
- background-position: 100% -396px;
125
- }
126
- .icon-only-label.linewidth {
127
- background-position: 100% -894px;
128
- }
129
- .icon-only-label.lineHeight {
130
- background-position: 100% -995px;
131
- }
132
- `