@operato/board 8.0.0-alpha.9 → 8.0.0-beta.1

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 (93) hide show
  1. package/CHANGELOG.md +256 -0
  2. package/demo/index-viewer.html +1 -1
  3. package/demo/index.html +1 -1
  4. package/dist/src/ox-board-player.js +2 -1
  5. package/dist/src/ox-board-player.js.map +1 -1
  6. package/dist/src/ox-board-template-viewer.d.ts +1 -1
  7. package/dist/src/ox-board-viewer.d.ts +3 -2
  8. package/dist/src/ox-board-viewer.js +16 -6
  9. package/dist/src/ox-board-viewer.js.map +1 -1
  10. package/dist/src/player/ox-board-wrapper.js +3 -1
  11. package/dist/src/player/ox-board-wrapper.js.map +1 -1
  12. package/dist/tsconfig.tsbuildinfo +1 -1
  13. package/package.json +25 -25
  14. package/.storybook/main.js +0 -3
  15. package/.storybook/server.mjs +0 -8
  16. package/src/component/3d.ts +0 -29
  17. package/src/component/chart-and-gauge.ts +0 -28
  18. package/src/component/container.ts +0 -63
  19. package/src/component/data-source.ts +0 -30
  20. package/src/component/etc.ts +0 -88
  21. package/src/component/form.ts +0 -42
  22. package/src/component/index.ts +0 -12
  23. package/src/component/iot.ts +0 -52
  24. package/src/component/line.ts +0 -156
  25. package/src/component/register-default-groups.ts +0 -28
  26. package/src/component/shape.ts +0 -156
  27. package/src/component/table.ts +0 -28
  28. package/src/component/text-and-media.ts +0 -125
  29. package/src/component/warehouse.ts +0 -26
  30. package/src/data-storage/data-storage.ts +0 -76
  31. package/src/graphql/board.ts +0 -144
  32. package/src/graphql/data-subscription.ts +0 -30
  33. package/src/graphql/favorite-board.ts +0 -25
  34. package/src/graphql/group.ts +0 -138
  35. package/src/graphql/index.ts +0 -4
  36. package/src/graphql/play-group.ts +0 -225
  37. package/src/graphql/scenario.ts +0 -79
  38. package/src/index.ts +0 -10
  39. package/src/modeller/component-toolbar/component-detail.ts +0 -52
  40. package/src/modeller/component-toolbar/component-menu.ts +0 -196
  41. package/src/modeller/component-toolbar/component-toolbar.ts +0 -196
  42. package/src/modeller/component-toolbar/mode-icons.ts +0 -88
  43. package/src/modeller/edit-toolbar-style.ts +0 -232
  44. package/src/modeller/edit-toolbar.ts +0 -587
  45. package/src/modeller/property-sidebar/abstract-property.ts +0 -69
  46. package/src/modeller/property-sidebar/data-binding/data-binding-mapper.ts +0 -475
  47. package/src/modeller/property-sidebar/data-binding/data-binding-value-map.ts +0 -19
  48. package/src/modeller/property-sidebar/data-binding/data-binding-value-range.ts +0 -19
  49. package/src/modeller/property-sidebar/data-binding/data-binding.ts +0 -480
  50. package/src/modeller/property-sidebar/effects/effects-shared-style.ts +0 -62
  51. package/src/modeller/property-sidebar/effects/effects.ts +0 -69
  52. package/src/modeller/property-sidebar/effects/property-animation.ts +0 -146
  53. package/src/modeller/property-sidebar/effects/property-animations.ts +0 -93
  54. package/src/modeller/property-sidebar/effects/property-event-hover.ts +0 -200
  55. package/src/modeller/property-sidebar/effects/property-event-tap.ts +0 -251
  56. package/src/modeller/property-sidebar/effects/property-event.ts +0 -73
  57. package/src/modeller/property-sidebar/effects/property-shadow.ts +0 -114
  58. package/src/modeller/property-sidebar/effects/value-converter.ts +0 -23
  59. package/src/modeller/property-sidebar/inspector/inspector.ts +0 -404
  60. package/src/modeller/property-sidebar/property-shared-style.ts +0 -136
  61. package/src/modeller/property-sidebar/property-sidebar.ts +0 -326
  62. package/src/modeller/property-sidebar/shapes/box-padding-editor-styles.ts +0 -94
  63. package/src/modeller/property-sidebar/shapes/shapes.ts +0 -432
  64. package/src/modeller/property-sidebar/specifics/specific-properties-builder.ts +0 -152
  65. package/src/modeller/property-sidebar/specifics/specifics.ts +0 -81
  66. package/src/modeller/property-sidebar/styles/styles.ts +0 -577
  67. package/src/modeller/scene-viewer/confidential-overlay.ts +0 -18
  68. package/src/modeller/scene-viewer/ox-scene-handler.ts +0 -40
  69. package/src/modeller/scene-viewer/ox-scene-layer.ts +0 -42
  70. package/src/modeller/scene-viewer/ox-scene-property.ts +0 -10
  71. package/src/modeller/scene-viewer/ox-scene-viewer.ts +0 -263
  72. package/src/ox-board-component-info.ts +0 -236
  73. package/src/ox-board-list.ts +0 -401
  74. package/src/ox-board-modeller.ts +0 -408
  75. package/src/ox-board-player-style.ts +0 -200
  76. package/src/ox-board-player.ts +0 -331
  77. package/src/ox-board-template-list.ts +0 -267
  78. package/src/ox-board-template-viewer.ts +0 -198
  79. package/src/ox-board-viewer.ts +0 -718
  80. package/src/ox-editor-board-selector.ts +0 -91
  81. package/src/ox-property-editor-board-selector.ts +0 -23
  82. package/src/player/ox-board-player-carousel.ts +0 -197
  83. package/src/player/ox-board-player-grid.ts +0 -78
  84. package/src/player/ox-board-wrapper.ts +0 -150
  85. package/src/selector/board-creation-popup.ts +0 -151
  86. package/src/selector/board-thumbnail-card.ts +0 -175
  87. package/src/selector/ox-board-creation-card.ts +0 -98
  88. package/src/selector/ox-board-selector.ts +0 -382
  89. package/src/types.ts +0 -63
  90. package/stories/property-data-binding.stories.ts +0 -34
  91. package/tsconfig.json +0 -24
  92. package/web-dev-server.config.mjs +0 -30
  93. package/web-test-runner.config.mjs +0 -29
@@ -1,480 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import '@material/web/icon/icon.js'
6
- import '@operato/help/ox-title-with-help.js'
7
- import '@operato/input/ox-buttons-radio.js'
8
- import '@operato/input/ox-input-data.js'
9
- import '@operato/i18n/ox-i18n.js'
10
-
11
- import { css, html, PropertyValues } from 'lit'
12
- import { property, query, state } from 'lit/decorators.js'
13
-
14
- import { Properties, Scene } from '@hatiolab/things-scene'
15
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
16
-
17
- import { AbstractProperty } from '../abstract-property.js'
18
- import { PropertySharedStyle } from '../property-shared-style.js'
19
- import { DataBindingMapper } from './data-binding-mapper.js'
20
-
21
- var clipboard = '{}'
22
-
23
- const PROPS = [
24
- '',
25
- 'text',
26
- ['fillStyle', 'fill style'],
27
- ['strokeStyle', 'stroke style'],
28
- ['fontColor', 'font color'],
29
- 'value',
30
- 'data',
31
- 'source',
32
- 'hidden',
33
- 'started',
34
- 'play',
35
- ['ref', 'reference'],
36
- 'action',
37
- 'options',
38
- 'rotate',
39
- 'dimension',
40
- 'location',
41
- 'accessor',
42
- ['tap', '(tap)'],
43
- '(action)'
44
- ].map(prop => {
45
- return typeof prop == 'string' ? { name: prop, label: prop } : { name: prop[0], label: prop[1] }
46
- })
47
-
48
- export class PropertyDataBinding extends ScopedElementsMixin(AbstractProperty) {
49
- static styles = [
50
- PropertySharedStyle,
51
- css`
52
- #tab-header {
53
- display: flex;
54
- align-items: center;
55
- justify-content: space-between;
56
- }
57
-
58
- #tab-header > md-icon {
59
- padding: 0;
60
- margin: 0;
61
- width: 25px;
62
- height: 25px;
63
- font-size: x-large;
64
- border-bottom: 1px solid rgba(0, 0, 0, 0.2);
65
- }
66
-
67
- fieldset[collapsable] legend {
68
- box-sizing: border-box;
69
- width: 100%;
70
- }
71
-
72
- fieldset[collapsable] legend md-icon {
73
- float: right;
74
- font-size: medium;
75
- margin: 0;
76
- }
77
-
78
- fieldset[collapsable][collapsed] > :not(legend) {
79
- display: none;
80
- }
81
-
82
- ox-buttons-radio {
83
- flex: 1;
84
- height: 25px;
85
- border: 1px solid rgba(0, 0, 0, 0.2);
86
- border-width: 1px 1px 0 1px;
87
- text-align: center;
88
-
89
- display: flex;
90
- padding: 0;
91
- box-sizing: border-box;
92
-
93
- width: 0; /* limit width */
94
- overflow-x: hidden;
95
- }
96
-
97
- ox-buttons-radio > div {
98
- background-color: rgba(0, 0, 0, 0.2);
99
- border: 1px solid rgba(0, 0, 0, 0.07);
100
- border-width: 0 0 2px 0;
101
- padding: 0;
102
- color: #fff;
103
- font-size: 13px;
104
- max-width: 25px;
105
- min-width: 25px;
106
- }
107
-
108
- ox-buttons-radio > div[disabled] {
109
- background-color: rgba(0, 0, 0, 0.1);
110
- }
111
-
112
- ox-buttons-radio > div[active] {
113
- border-color: rgb(242, 71, 28);
114
- }
115
-
116
- ox-buttons-radio > div.iron-selected {
117
- background-color: var(--md-sys-color-surface);
118
- color: var(--md-sys-color-on-surface);
119
- }
120
-
121
- div[binding] {
122
- display: flex;
123
- flex-direction: row-reverse;
124
- background-color: var(--md-sys-color-surface);
125
- color: var(--md-sys-color-on-surface);
126
- overflow: hidden;
127
- border-style: solid;
128
- border-color: rgba(0, 0, 0, 0.2);
129
- border-image: initial;
130
- border-width: 0px 1px;
131
- padding: 7px 5px 2px 5px;
132
- }
133
-
134
- md-icon {
135
- margin-left: 5px;
136
- color: var(--md-sys-color-on-secondary-container);
137
- opacity: 0.8;
138
- cursor: pointer;
139
- --md-icon-size: 18px;
140
- }
141
-
142
- md-icon:hover {
143
- color: var(--md-sys-color-on-primary-container);
144
- opacity: 1;
145
- }
146
-
147
- md-icon[disabled] {
148
- color: rgba(0, 0, 0, 0.1);
149
- }
150
-
151
- data-binding-mapper {
152
- --things-select: {
153
- min-width: 50%;
154
- margin-bottom: 10px;
155
- padding: 3px 20px 2px 5px;
156
- -webkit-border-radius: 4px;
157
- -moz-border-radius: 4px;
158
- border-radius: 4px;
159
- border: 1px solid rgba(0, 0, 0, 0.15);
160
- font-size: 15px;
161
- font-weight: 300;
162
- -webkit-appearance: none;
163
- };
164
- }
165
- `
166
- ]
167
-
168
- @property({ type: Object }) value?: Properties
169
- @property({ type: Object }) scene?: Scene
170
-
171
- @state() mappingIndex: number = 0
172
- @state() _afterRender?: Function | null
173
- @state() _dataExpanded: boolean = false
174
-
175
- @query('#tabs') tabs!: HTMLElement
176
- @query('#tab-nav-left-button') tabNavLeftButton!: HTMLElement
177
- @query('#tab-nav-right-button') tabNavRightButton!: HTMLElement
178
-
179
- private mapping: Properties = {}
180
-
181
- get mappings() {
182
- return this.value?.mappings || []
183
- }
184
-
185
- firstUpdated() {
186
- this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
187
-
188
- this.tabContainer.addEventListener('scroll', () => {
189
- this._onTabScroll()
190
- })
191
- }
192
-
193
- updated(changes: PropertyValues<this>) {
194
- if (changes.has('value')) {
195
- this._onValueChanged()
196
- }
197
- }
198
-
199
- static get scopedElements() {
200
- return {
201
- 'data-binding-mapper': DataBindingMapper
202
- }
203
- }
204
-
205
- render() {
206
- const value = this.value || {
207
- mappings: []
208
- }
209
-
210
- return html`
211
- <fieldset>
212
- <legend>
213
- <ox-title-with-help topic="board-modeller/data-binding" msgid="label.identifier"
214
- >identifier</ox-title-with-help
215
- >
216
- </legend>
217
- <div class="property-grid">
218
- <label> <ox-i18n msgid="label.id">ID</ox-i18n> </label>
219
- <input value-key="id" .value=${value.id || ''} />
220
-
221
- <label> <ox-i18n msgid="label.class">Class</ox-i18n> </label>
222
- <input value-key="class" .value=${value.class || ''} />
223
-
224
- <label> <ox-i18n msgid="label.tag">Tag</ox-i18n> </label>
225
- <input value-key="tag" .value=${value.tag || ''} />
226
-
227
- <label> <ox-i18n msgid="label.template-prefix">Template Prefix</ox-i18n> </label>
228
- <input value-key="templatePrefix" .value=${value.templatePrefix || ''} />
229
-
230
- <div class="checkbox-row">
231
- <input id="checkbox-ndns" type="checkbox" value-key="ndns" .checked=${value.ndns} />
232
- <label for="checkbox-ndns"> <ox-i18n msgid="label.ndns">No Data No Show</ox-i18n> </label>
233
- </div>
234
-
235
- <div class="checkbox-row">
236
- <input id="checkbox-sensitive" type="checkbox" value-key="sensitive" .checked=${value.sensitive} />
237
- <label for="checkbox-sensitive">
238
- <ox-i18n msgid="label.intent-sensitive">Intent Sensitive</ox-i18n>
239
- </label>
240
- </div>
241
-
242
- <div class="checkbox-row">
243
- <input id="checkbox-persistent" type="checkbox" value-key="persistent" .checked=${value.persistent} />
244
- <label for="checkbox-persistent">
245
- <ox-i18n msgid="label.persistent-data">Persistent Data</ox-i18n>
246
- </label>
247
- </div>
248
- </div>
249
- </fieldset>
250
-
251
- <fieldset collapsable ?collapsed=${!this._dataExpanded}>
252
- <legend>
253
- <ox-title-with-help topic="board-modeller/initial-data" msgid="label.initial-data"
254
- >initial value</ox-title-with-help
255
- >
256
- <md-icon
257
- @click=${() => {
258
- this._dataExpanded = !this._dataExpanded
259
- }}
260
- >${this._dataExpanded ? 'expand_less' : 'expand_more'}</md-icon
261
- >
262
- </legend>
263
- <ox-input-data value-key="data" .value=${value.data}> </ox-input-data>
264
- </fieldset>
265
-
266
- <fieldset>
267
- <legend>
268
- <ox-title-with-help topic="board-modeller/data-spread" msgid="label.data-spread"
269
- >Data Spread</ox-title-with-help
270
- >
271
- </legend>
272
-
273
- <div id="tab-header">
274
- <md-icon
275
- id="tab-nav-left-button"
276
- @click=${() => {
277
- this._onTabScrollNavLeft()
278
- }}
279
- disabled
280
- >chevron_left</md-icon
281
- >
282
-
283
- <ox-buttons-radio
284
- id="tabs"
285
- .value=${String(this.mappingIndex)}
286
- @change=${(e: Event) => {
287
- e.stopPropagation()
288
- this._setMappingIndex((e.target as any).value)
289
- }}
290
- >
291
- ${this.mappings.map((m: string, i: number) => html` <div data-value=${i} data-mapping>${i + 1}</div> `)}
292
- <div data-value=${this.mappings.length} data-mapping disabled>${this.mappings.length + 1}</div>
293
- </ox-buttons-radio>
294
-
295
- <md-icon
296
- id="tab-nav-right-button"
297
- @click=${(e: Event) => {
298
- this._onTabScrollNavRight()
299
- }}
300
- disabled
301
- >chevron_right</md-icon
302
- >
303
- </div>
304
-
305
- <div binding>
306
- <md-icon style="font-size:19px" @click=${() => this._clearDataBindingMapper()} title="delete current tab"
307
- >delete_forever</md-icon
308
- >
309
- <md-icon @click=${() => this._pasteDataBindingMapper()} title="replace current tab">content_paste</md-icon>
310
- <md-icon style="font-size:17px" @click=${() => this._copyDataBindingMapper()} title="copy current tab"
311
- >content_copy</md-icon
312
- >
313
- </div>
314
-
315
- <data-binding-mapper
316
- @value-change=${(e: CustomEvent) => this._onMappingChanged(e)}
317
- .scene=${this.scene}
318
- .mapping=${(value.mappings && value.mappings[this.mappingIndex]) || {}}
319
- .properties=${PROPS}
320
- >
321
- </data-binding-mapper>
322
- </fieldset>
323
- `
324
- }
325
-
326
- _setMappingIndex(idx: number) {
327
- this.mappingIndex = isNaN(Number(idx)) ? 0 : Number(idx)
328
-
329
- this._onTabScroll()
330
- }
331
-
332
- _clearDataBindingMapper() {
333
- var mappings = [...(this.value?.mappings || [])]
334
- mappings.splice(this.mappingIndex, 1)
335
- this._onAfterValueChange(
336
- 'mappings',
337
- mappings.filter(m => !!m)
338
- )
339
- }
340
-
341
- _copyDataBindingMapper() {
342
- clipboard = JSON.stringify(this.mappings[this.mappingIndex])
343
- }
344
-
345
- async _pasteDataBindingMapper() {
346
- var index = this.mappingIndex
347
- var mappings = [...(this.value?.mappings || [])]
348
- mappings[this.mappingIndex] = JSON.parse(clipboard)
349
-
350
- this._onAfterValueChange('mappings', mappings)
351
-
352
- setTimeout(() => {
353
- this._setMappingIndex(index)
354
- }, 100)
355
- }
356
-
357
- async _onValueChanged() {
358
- await this.updateComplete
359
-
360
- if (this._afterRender) {
361
- this._afterRender()
362
- } else {
363
- this._setMappingIndex(0)
364
- }
365
-
366
- this._afterRender = null
367
- }
368
-
369
- _onValueChange(e: Event) {
370
- var element = e.target as HTMLElement
371
- var key = element.getAttribute('value-key')
372
-
373
- var value = this._getValueFromEventTarget(element)
374
-
375
- if (!key) {
376
- return
377
- }
378
-
379
- this.value = {
380
- ...this.value,
381
- [key]: value
382
- }
383
-
384
- this._onAfterValueChange(key, value)
385
- }
386
-
387
- get tabContainer() {
388
- return this.tabs
389
- }
390
-
391
- async _onMappingChanged(e: CustomEvent) {
392
- var mapping = (e.target as any).mapping
393
-
394
- /* data spread target의 변경이 있는 경우, target 컴포넌트들의 태그를 블링크 시킨다 */
395
- if (mapping && mapping.target) {
396
- this.scene &&
397
- this.scene.findAll(mapping.target, this.scene.selected && this.scene.selected[0]).forEach((c, i) => {
398
- if (i == 0) c.trigger('decotagreset')
399
- c.trigger('decotag', {})
400
- })
401
- }
402
-
403
- /* mapping의 모든 속성이 편집되면, 모델에 반영한다. */
404
- var mappings = [...(this.value?.mappings || [])]
405
-
406
- if (mapping.target && mapping.property && mapping.rule) {
407
- mappings[this.mappingIndex] = mapping
408
-
409
- var mappingIdx = this.mappingIndex
410
- this._afterRender = () => {
411
- this._setMappingIndex(mappingIdx)
412
- this.tabContainer.scrollLeft = this.tabContainer.scrollWidth
413
- }
414
-
415
- this.dispatchEvent(
416
- new CustomEvent('property-change', {
417
- bubbles: true,
418
- composed: true,
419
- detail: {
420
- mappings: mappings.filter(m => !!m)
421
- }
422
- })
423
- )
424
-
425
- await this.requestUpdate()
426
- } else if (!mapping.target && !mapping.property) {
427
- const { accessor, source } = e.detail?.changed || {}
428
-
429
- // accessor나 source를 입력중인 경우 tabIndex Change 방지
430
- if (!accessor && !source) {
431
- mappings[this.mappingIndex] = null
432
- var nextMappingIdx = Math.max(this.mappingIndex - 1, 0)
433
- this._afterRender = () => {
434
- this._setMappingIndex(nextMappingIdx)
435
- }
436
- this.dispatchEvent(
437
- new CustomEvent('property-change', {
438
- bubbles: true,
439
- composed: true,
440
- detail: {
441
- mappings: mappings.filter(m => !!m)
442
- }
443
- })
444
- )
445
- }
446
- }
447
- }
448
-
449
- _onTabScroll() {
450
- if (this.tabContainer.clientWidth == this.tabContainer.scrollWidth) {
451
- this.tabNavLeftButton.setAttribute('disabled', '')
452
- this.tabNavRightButton.setAttribute('disabled', '')
453
- }
454
- // left-end
455
- else if (this.tabContainer.scrollLeft == 0) {
456
- this.tabNavLeftButton.setAttribute('disabled', '')
457
- this.tabNavRightButton.removeAttribute('disabled')
458
- }
459
- // right-end
460
- else if (this.tabContainer.scrollLeft + this.tabContainer.clientWidth >= this.tabContainer.scrollWidth) {
461
- this.tabNavLeftButton.removeAttribute('disabled')
462
- this.tabNavRightButton.setAttribute('disabled', '')
463
- } else {
464
- this.tabNavLeftButton.removeAttribute('disabled')
465
- this.tabNavRightButton.removeAttribute('disabled')
466
- }
467
- }
468
-
469
- _onTabScrollNavLeft() {
470
- this.tabContainer.style.scrollBehavior = 'smooth'
471
- this.tabContainer.scrollLeft -= this.tabContainer.clientWidth
472
- this.tabContainer.style.scrollBehavior = 'auto'
473
- }
474
-
475
- _onTabScrollNavRight() {
476
- this.tabContainer.style.scrollBehavior = 'smooth'
477
- this.tabContainer.scrollLeft += this.tabContainer.clientWidth
478
- this.tabContainer.style.scrollBehavior = 'auto'
479
- }
480
- }
@@ -1,62 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import { css } from 'lit'
6
-
7
- export const EffectsSharedStyle = css`
8
- :host {
9
- display: grid;
10
- grid-template-columns: repeat(10, 1fr);
11
- grid-gap: 5px;
12
- grid-auto-rows: minmax(24px, auto);
13
-
14
- align-items: center;
15
- }
16
-
17
- * {
18
- align-self: stretch;
19
- }
20
-
21
- label {
22
- grid-column: span 3;
23
- text-align: right;
24
- text-transform: capitalize;
25
-
26
- align-self: center;
27
- }
28
-
29
- input,
30
- select,
31
- ox-input-angle,
32
- ox-input-color,
33
- [custom-editor] {
34
- grid-column: span 7;
35
- }
36
-
37
- input,
38
- select,
39
- ox-input-angle input,
40
- ox-input-color input,
41
- [custom-editor] input {
42
- border: var(--property-sidebar-fieldset-border);
43
- }
44
-
45
- ox-input-data {
46
- height: 300px;
47
- }
48
-
49
- input[type='checkbox'] {
50
- grid-column: 4 / 5;
51
- align-self: center;
52
- }
53
-
54
- label.checkbox-label {
55
- grid-column: span 6;
56
- text-align: left;
57
- }
58
-
59
- [fullwidth] {
60
- grid-column: 1 / -1;
61
- }
62
- `
@@ -1,69 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import '@operato/i18n/ox-i18n.js'
6
- import '@operato/help/ox-title-with-help.js'
7
-
8
- import { html } from 'lit'
9
- import { property } from 'lit/decorators.js'
10
-
11
- import { Properties, Scene } from '@hatiolab/things-scene'
12
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
13
-
14
- import { AbstractProperty } from '../abstract-property.js'
15
- import { PropertySharedStyle } from '../property-shared-style.js'
16
- import { PropertyAnimations } from './property-animations.js'
17
- import { PropertyEvent } from './property-event.js'
18
- import { PropertyShadow } from './property-shadow.js'
19
-
20
- export class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {
21
- static styles = [PropertySharedStyle]
22
-
23
- @property({ type: Object }) value?: Properties
24
- @property({ type: Object }) scene?: Scene
25
-
26
- firstUpdated() {
27
- this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
28
- }
29
-
30
- static get scopedElements() {
31
- return {
32
- 'property-shadow': PropertyShadow,
33
- 'property-animations': PropertyAnimations,
34
- 'property-event': PropertyEvent
35
- }
36
- }
37
-
38
- render() {
39
- const value = this.value || {}
40
-
41
- return html`
42
- <fieldset>
43
- <legend>
44
- <ox-title-with-help topic="board-modeller/effects/shadow" msgid="label.shadow">shadow</ox-title-with-help>
45
- </legend>
46
-
47
- <property-shadow value-key="shadow" .value=${value.shadow || {}}> </property-shadow>
48
- </fieldset>
49
-
50
- <fieldset>
51
- <legend>
52
- <ox-title-with-help topic="board-modeller/effects/retention" msgid="label.retention"
53
- >retention</ox-title-with-help
54
- >
55
- </legend>
56
-
57
- <div class="property-grid">
58
- <label> <ox-i18n msgid="label.retention">retention</ox-i18n> </label>
59
- <input type="number" value-key="retention" .value=${value.retention} placeholder="ms" />
60
- </div>
61
- </fieldset>
62
-
63
- <property-animations value-key="animation" .scene=${this.scene} .value=${value.animation || {}}>
64
- </property-animations>
65
-
66
- <property-event value-key="event" .scene=${this.scene} .value=${value.event || {}}> </property-event>
67
- `
68
- }
69
- }