@operato/board 7.1.30 → 7.1.32

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 (87) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +14 -14
  4. package/.storybook/main.js +0 -3
  5. package/.storybook/server.mjs +0 -8
  6. package/demo/index-modeller.html +0 -112
  7. package/demo/index-player.html +0 -112
  8. package/demo/index-viewer.html +0 -112
  9. package/demo/index.html +0 -112
  10. package/src/component/3d.ts +0 -29
  11. package/src/component/chart-and-gauge.ts +0 -28
  12. package/src/component/container.ts +0 -63
  13. package/src/component/data-source.ts +0 -30
  14. package/src/component/etc.ts +0 -88
  15. package/src/component/form.ts +0 -42
  16. package/src/component/index.ts +0 -12
  17. package/src/component/iot.ts +0 -52
  18. package/src/component/line.ts +0 -156
  19. package/src/component/register-default-groups.ts +0 -28
  20. package/src/component/shape.ts +0 -156
  21. package/src/component/table.ts +0 -28
  22. package/src/component/text-and-media.ts +0 -125
  23. package/src/component/warehouse.ts +0 -26
  24. package/src/data-storage/data-storage.ts +0 -76
  25. package/src/graphql/board.ts +0 -144
  26. package/src/graphql/data-subscription.ts +0 -30
  27. package/src/graphql/favorite-board.ts +0 -25
  28. package/src/graphql/group.ts +0 -138
  29. package/src/graphql/index.ts +0 -4
  30. package/src/graphql/play-group.ts +0 -225
  31. package/src/graphql/scenario.ts +0 -79
  32. package/src/index.ts +0 -10
  33. package/src/modeller/component-toolbar/component-detail.ts +0 -52
  34. package/src/modeller/component-toolbar/component-menu.ts +0 -196
  35. package/src/modeller/component-toolbar/component-toolbar.ts +0 -196
  36. package/src/modeller/component-toolbar/mode-icons.ts +0 -88
  37. package/src/modeller/edit-toolbar-style.ts +0 -232
  38. package/src/modeller/edit-toolbar.ts +0 -587
  39. package/src/modeller/property-sidebar/abstract-property.ts +0 -69
  40. package/src/modeller/property-sidebar/data-binding/data-binding-mapper.ts +0 -475
  41. package/src/modeller/property-sidebar/data-binding/data-binding-value-map.ts +0 -19
  42. package/src/modeller/property-sidebar/data-binding/data-binding-value-range.ts +0 -19
  43. package/src/modeller/property-sidebar/data-binding/data-binding.ts +0 -480
  44. package/src/modeller/property-sidebar/effects/effects-shared-style.ts +0 -62
  45. package/src/modeller/property-sidebar/effects/effects.ts +0 -69
  46. package/src/modeller/property-sidebar/effects/property-animation.ts +0 -146
  47. package/src/modeller/property-sidebar/effects/property-animations.ts +0 -93
  48. package/src/modeller/property-sidebar/effects/property-event-hover.ts +0 -200
  49. package/src/modeller/property-sidebar/effects/property-event-tap.ts +0 -251
  50. package/src/modeller/property-sidebar/effects/property-event.ts +0 -73
  51. package/src/modeller/property-sidebar/effects/property-shadow.ts +0 -114
  52. package/src/modeller/property-sidebar/effects/value-converter.ts +0 -23
  53. package/src/modeller/property-sidebar/inspector/inspector.ts +0 -404
  54. package/src/modeller/property-sidebar/property-shared-style.ts +0 -136
  55. package/src/modeller/property-sidebar/property-sidebar.ts +0 -326
  56. package/src/modeller/property-sidebar/shapes/box-padding-editor-styles.ts +0 -94
  57. package/src/modeller/property-sidebar/shapes/shapes.ts +0 -432
  58. package/src/modeller/property-sidebar/specifics/specific-properties-builder.ts +0 -152
  59. package/src/modeller/property-sidebar/specifics/specifics.ts +0 -81
  60. package/src/modeller/property-sidebar/styles/styles.ts +0 -577
  61. package/src/modeller/scene-viewer/confidential-overlay.ts +0 -18
  62. package/src/modeller/scene-viewer/ox-scene-handler.ts +0 -40
  63. package/src/modeller/scene-viewer/ox-scene-layer.ts +0 -42
  64. package/src/modeller/scene-viewer/ox-scene-property.ts +0 -10
  65. package/src/modeller/scene-viewer/ox-scene-viewer.ts +0 -263
  66. package/src/ox-board-component-info.ts +0 -236
  67. package/src/ox-board-list.ts +0 -401
  68. package/src/ox-board-modeller.ts +0 -408
  69. package/src/ox-board-player-style.ts +0 -200
  70. package/src/ox-board-player.ts +0 -333
  71. package/src/ox-board-template-list.ts +0 -267
  72. package/src/ox-board-template-viewer.ts +0 -198
  73. package/src/ox-board-viewer.ts +0 -727
  74. package/src/ox-editor-board-selector.ts +0 -91
  75. package/src/ox-property-editor-board-selector.ts +0 -23
  76. package/src/player/ox-board-player-carousel.ts +0 -197
  77. package/src/player/ox-board-player-grid.ts +0 -78
  78. package/src/player/ox-board-wrapper.ts +0 -152
  79. package/src/selector/board-creation-popup.ts +0 -151
  80. package/src/selector/board-thumbnail-card.ts +0 -175
  81. package/src/selector/ox-board-creation-card.ts +0 -98
  82. package/src/selector/ox-board-selector.ts +0 -382
  83. package/src/types.ts +0 -63
  84. package/stories/property-data-binding.stories.ts +0 -34
  85. package/tsconfig.json +0 -24
  86. package/web-dev-server.config.mjs +0 -30
  87. package/web-test-runner.config.mjs +0 -29
@@ -1,408 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import '@material/web/fab/fab.js'
3
- import '@hatiolab/things-scene'
4
- import './modeller/scene-viewer/ox-scene-handler.js'
5
- import './modeller/scene-viewer/ox-scene-layer.js'
6
- import './modeller/scene-viewer/ox-scene-property.js'
7
- import './modeller/scene-viewer/ox-scene-viewer.js'
8
- import './ox-board-viewer'
9
-
10
- import { saveAs } from 'file-saver'
11
- import { css, html, LitElement, PropertyValues } from 'lit'
12
- import { customElement, property, query } from 'lit/decorators.js'
13
-
14
- import { MODE_EDIT, Scene, SCENE_MODE } from '@hatiolab/things-scene'
15
- import { ScopedElementsMixin } from '@open-wc/scoped-elements'
16
- import { OxPopup } from '@operato/popup'
17
- import { isMacOS, togglefullscreen } from '@operato/utils'
18
-
19
- import { ComponentToolbar } from './modeller/component-toolbar/component-toolbar'
20
- import { EditToolbar } from './modeller/edit-toolbar'
21
- import { PropertySidebar } from './modeller/property-sidebar/property-sidebar'
22
- import { ComponentGroup, ComponentTemplate } from './types'
23
- import OxSceneViewer from './modeller/scene-viewer/ox-scene-viewer.js'
24
-
25
- const MACOS = isMacOS()
26
-
27
- const ICON_PROPERTIES = new URL('../../icons/icon-properties.png', import.meta.url).href
28
- const ICON_PROPERTIES_LINE_TYPE = new URL('../../icons/icon-properties-line-type.png', import.meta.url).href
29
- const ICON_PROPERTIES_ARROW_TYPE = new URL('../../icons/icon-properties-arrow-type.png', import.meta.url).href
30
- const ICON_PROPERTIES_LABEL = new URL('../../icons/icon-properties-label.png', import.meta.url).href
31
- const ICON_PROPERTIES_PADDING = new URL('../../icons/icon-properties-padding.png', import.meta.url).href
32
-
33
- const ICON_HTOOLBAR = new URL('../../icons/icon-htoolbar.png', import.meta.url).href
34
- const ICON_FULLSCREEN = new URL('../../icons/icon-fullscreen.png', import.meta.url).href
35
- const ICON_COLLAPSE = new URL('../../icons/icon-collapse.png', import.meta.url).href
36
- const ICON_COLLAPSE_ACTIVE = new URL('../../icons/icon-collapse-active.png', import.meta.url).href
37
-
38
- const ICON_SHELL_INSPECTOR = new URL('../../icons/icon-shell-inspector.png', import.meta.url).href
39
-
40
- var Registry: ComponentGroup[] = []
41
-
42
- @customElement('ox-board-modeller')
43
- export class BoardModeller extends ScopedElementsMixin(LitElement) {
44
- static styles = [
45
- css`
46
- :host {
47
- display: flex;
48
- flex-direction: column;
49
-
50
- height: 100%;
51
- overflow: hidden;
52
- }
53
-
54
- edit-toolbar {
55
- flex: 45px;
56
- max-height: 45px;
57
- }
58
-
59
- div[content] {
60
- flex: 1;
61
- max-height: calc(100% - 45px);
62
-
63
- display: flex;
64
- flex-direction: row;
65
- }
66
-
67
- component-toolbar {
68
- max-height: 100%;
69
- }
70
-
71
- property-sidebar {
72
- overflow: hidden;
73
- }
74
-
75
- #scene-wrap {
76
- position: relative;
77
-
78
- flex: 1;
79
- display: flex;
80
- flex-direction: row;
81
- }
82
-
83
- ox-scene-viewer {
84
- flex: 1;
85
- width: 100%;
86
- height: 100%;
87
- }
88
-
89
- md-fab {
90
- position: absolute;
91
- right: 15px;
92
- bottom: 15px;
93
- }
94
-
95
- ox-popup {
96
- width: 90%;
97
- height: 90%;
98
- left: 50%;
99
- top: 50%;
100
- transform: translateX(-50%) translateY(-50%);
101
- background: var(--md-sys-color-on-secondary-container, black);
102
-
103
- display: flex;
104
- justify-content: center;
105
- flex-direction: column;
106
- }
107
-
108
- ox-board-viewer {
109
- width: 98%;
110
- height: 98%;
111
- margin: auto;
112
- padding: 0;
113
- }
114
- `
115
- ]
116
-
117
- static registerGroup(group: ComponentGroup) {
118
- var found = Registry.find(inRegisterGroup => inRegisterGroup.name == group.name)
119
-
120
- if (found) {
121
- found = {
122
- ...found,
123
- ...group
124
- }
125
- } else {
126
- Registry.push(group)
127
- }
128
- }
129
-
130
- static registerTemplate(templates: ComponentTemplate[]): void {
131
- templates &&
132
- templates.forEach(template => {
133
- var groups: string[] = typeof template.group == 'string' ? [template.group] : template.group
134
-
135
- Registry.filter(group => groups.includes(group.name)).forEach(group => {
136
- if (!group.templates.find(inGroupTemplate => inGroupTemplate.type == template.type)) {
137
- group.templates.push(template)
138
- }
139
- })
140
- })
141
- }
142
-
143
- static get groups(): ComponentGroup[] {
144
- return Registry
145
- }
146
-
147
- static getGroup(name: string) {
148
- return Registry.find(group => group.name === name)
149
- }
150
-
151
- @property({ type: String }) boardName: string = ''
152
- @property({ type: Object }) model: any = null
153
- @property({ type: String }) baseUrl: string = ''
154
- @property({ type: Array }) selected: any[] = []
155
- @property({ type: Number }) mode: SCENE_MODE = SCENE_MODE.EDIT
156
- @property({ type: Object }) provider: any = null
157
- @property({ type: Boolean }) hideProperty: boolean = false
158
- @property({ type: String }) overlay: string = ''
159
- @property({ type: Object }) scene?: Scene
160
- @property({ type: Array }) componentGroupList: any[] = []
161
- @property({ type: Array }) fonts: any[] = []
162
- @property({ type: Array }) propertyEditor: any[] = []
163
-
164
- @query('edit-toolbar') private editToolbar!: EditToolbar
165
- @query('ox-scene-viewer') private viewer!: OxSceneViewer
166
-
167
- private group: string = ''
168
- private shortcutHandler?: (e: KeyboardEvent) => void
169
-
170
- constructor() {
171
- super()
172
-
173
- document.addEventListener('get-all-scene-component-ids', (e: Event) => {
174
- var { component, callback } = (e as CustomEvent).detail
175
-
176
- if (!this.scene) return
177
-
178
- var ids
179
- if (component) {
180
- ids = this.scene.findAll(component).map(c => c.model.id)
181
- } else {
182
- // @ts-ignore
183
- ids = this.scene.ids.map(({ key }) => key)
184
- }
185
-
186
- ids = ids.filter(Boolean).sort()
187
- callback(ids)
188
- })
189
-
190
- this.style.setProperty('--url-icon-properties', `url(${ICON_PROPERTIES})`)
191
- this.style.setProperty('--url-icon-properties-label', `url(${ICON_PROPERTIES_LABEL})`)
192
- this.style.setProperty('--url-icon-properties-padding', `url(${ICON_PROPERTIES_PADDING})`)
193
- this.style.setProperty('--url-icon-properties-line-type', `url(${ICON_PROPERTIES_LINE_TYPE})`)
194
- this.style.setProperty('--url-icon-properties-arrow-type', `url(${ICON_PROPERTIES_ARROW_TYPE})`)
195
-
196
- this.style.setProperty('--url-icon-htoolbar', `url(${ICON_HTOOLBAR})`)
197
- this.style.setProperty('--url-icon-fullscreen', `url(${ICON_FULLSCREEN})`)
198
- this.style.setProperty('--url-icon-collapse', `url(${ICON_COLLAPSE})`)
199
- this.style.setProperty('--url-icon-collapse-active', `url(${ICON_COLLAPSE_ACTIVE})`)
200
-
201
- this.style.setProperty('--url-icon-shell-inspector', `url(${ICON_SHELL_INSPECTOR})`)
202
- }
203
-
204
- static get scopedElements() {
205
- return {
206
- 'edit-toolbar': EditToolbar,
207
- 'property-sidebar': PropertySidebar,
208
- 'component-toolbar': ComponentToolbar
209
- }
210
- }
211
-
212
- render() {
213
- return html`
214
- <edit-toolbar
215
- .scene=${this.scene}
216
- .selected=${this.selected}
217
- @hide-property-changed=${(e: CustomEvent) => (this.hideProperty = e.detail.value)}
218
- @open-preview=${() => this.preview()}
219
- @download-model=${() => this.downloadModel()}
220
- @modeller-fullscreen=${() => togglefullscreen(this)}
221
- >
222
- ${this.renderBrandingZone()}
223
- </edit-toolbar>
224
-
225
- <div content>
226
- <component-toolbar
227
- .scene=${this.scene}
228
- .mode=${this.mode}
229
- @mode-changed=${(e: CustomEvent) => {
230
- this.mode = e.detail.value
231
- }}
232
- .componentGroupList=${this.componentGroupList}
233
- .group=${this.group}
234
- >
235
- </component-toolbar>
236
-
237
- <div id="scene-wrap">
238
- <ox-scene-viewer
239
- id="scene"
240
- .scene=${this.scene}
241
- @scene-changed=${(e: CustomEvent) => {
242
- this.scene = e.detail.value
243
- }}
244
- .model=${this.model}
245
- .selected=${this.selected}
246
- @selected-changed=${(e: CustomEvent) => {
247
- this.selected = e.detail.value
248
- }}
249
- .mode=${this.mode}
250
- @mode-changed=${(e: CustomEvent) => {
251
- this.mode = e.detail.value
252
- }}
253
- fit="ratio"
254
- .baseUrl=${this.baseUrl}
255
- @contextmenu=${() => this.onContextMenu()}
256
- .provider=${this.provider}
257
- name="modeller"
258
- >
259
- <ox-scene-layer type="selection-layer"></ox-scene-layer>
260
- <ox-scene-layer type="modeling-layer"></ox-scene-layer>
261
- <ox-scene-layer type="add-layer"> </ox-scene-layer>
262
- <ox-scene-layer type="guide-layer">
263
- <ox-scene-property name="ruler" value="disabled"></ox-scene-property>
264
- </ox-scene-layer>
265
- <ox-scene-layer type="shift-layer">
266
- <ox-scene-property name="text" value="${this.overlay}"></ox-scene-property>
267
- <ox-scene-property name="alpha" value="0.3"></ox-scene-property>
268
- <ox-scene-property name="fontFamily" value="arial"></ox-scene-property>
269
- <ox-scene-property name="fontSize" value="30" type="number"></ox-scene-property>
270
- <ox-scene-property name="fontColor" value="navy"></ox-scene-property>
271
- <ox-scene-property name="textBaseline" value="top"></ox-scene-property>
272
- <ox-scene-property name="textAlign" value="left"></ox-scene-property>
273
- <ox-scene-property name="paddingTop" value="50" type="number"></ox-scene-property>
274
- <ox-scene-property name="paddingLeft" value="50" type="number"></ox-scene-property>
275
- </ox-scene-layer>
276
- <ox-scene-layer type="decotag-layer"></ox-scene-layer>
277
- <ox-scene-handler type="text-editor"></ox-scene-handler>
278
- <ox-scene-handler type="move-handler"></ox-scene-handler>
279
- <ox-scene-handler type="paste-handler"></ox-scene-handler>
280
- </ox-scene-viewer>
281
-
282
- <md-fab @click=${() => this.onTapSave()} title="save">
283
- <md-icon slot="icon">save</md-icon>
284
- </md-fab>
285
- </div>
286
-
287
- <property-sidebar
288
- .scene=${this.scene}
289
- .selected=${this.selected}
290
- .collapsed=${this.hideProperty}
291
- .fonts=${this.fonts}
292
- .propertyEditor=${this.propertyEditor}
293
- >
294
- </property-sidebar>
295
- </div>
296
- `
297
- }
298
-
299
- connectedCallback(): void {
300
- super.connectedCallback()
301
- this.bindShortcutEvent()
302
- }
303
-
304
- disconnectedCallback(): void {
305
- super.disconnectedCallback()
306
- this.unbindShortcutEvent()
307
- }
308
-
309
- updated(changes: PropertyValues<this>) {
310
- if (changes.has('scene') && this.scene) {
311
- this.scene.mode = MODE_EDIT
312
- }
313
- }
314
-
315
- close() {
316
- this.model = null
317
- this.requestUpdate()
318
- }
319
-
320
- onShortcut(e: KeyboardEvent) {
321
- if (MACOS) var ctrlKey = e.metaKey
322
- else var ctrlKey = e.ctrlKey
323
-
324
- switch (e.code) {
325
- case 'KeyS':
326
- if (ctrlKey) {
327
- this.onTapSave()
328
- e.preventDefault()
329
- }
330
- break
331
- }
332
- }
333
-
334
- preview() {
335
- const board = {
336
- id: 'preview',
337
- model: this.scene?.model ? JSON.parse(JSON.stringify(this.scene.model)) : null
338
- }
339
-
340
- OxPopup.open({
341
- template: html` <ox-board-viewer style="flex: 1;" .provider=${this.provider} .board=${board}></ox-board-viewer> `,
342
- style: 'width: 80vw; height: 80vh;',
343
- backdrop: true
344
- })
345
-
346
- requestAnimationFrame(() => {
347
- dispatchEvent(new Event('resize'))
348
- })
349
- }
350
-
351
- downloadModel() {
352
- if (!this.scene) return
353
-
354
- var model = JSON.stringify(this.model, null, 2)
355
- var filename = (this.boardName || 'NONAME') + '-' + Date.now() + '.json'
356
- saveAs(new Blob([model], { type: 'application/octet-stream' }), filename)
357
- }
358
-
359
- renderBrandingZone() {
360
- return html``
361
- }
362
-
363
- onTapSave() {
364
- this.dispatchEvent(new CustomEvent('save-model', { bubbles: true, composed: true, detail: { model: this.model } }))
365
- }
366
-
367
- bindShortcutEvent() {
368
- // TODO: Global Hotkey에 대한 정의를 edit-toolbar에서 가져올 수 있도록 수정해야 함.
369
- const GLOBAL_HOTKEYS = ['Digit1', 'Digit2', 'F11', 'KeyD', 'KeyP', 'KeyS']
370
-
371
- this.shortcutHandler = (e: KeyboardEvent) => {
372
- const target = e.composedPath()[0] as HTMLElement
373
- var tagName = target.tagName
374
- var isInput = target.isContentEditable || tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'
375
- var isGlobalHotkey = GLOBAL_HOTKEYS.includes(e.code)
376
-
377
- if (!isGlobalHotkey && isInput) return
378
- if (!this.editToolbar.onShortcut(e)) this.onShortcut(e)
379
- }
380
-
381
- document.addEventListener('keydown', this.shortcutHandler)
382
- }
383
-
384
- unbindShortcutEvent() {
385
- if (this.shortcutHandler) {
386
- document.removeEventListener('keydown', this.shortcutHandler)
387
- delete this.shortcutHandler
388
- }
389
- }
390
-
391
- undoable(): boolean {
392
- return !!this.scene?.undoable()
393
- }
394
-
395
- redoable(): boolean {
396
- return !!this.scene?.redoable()
397
- }
398
-
399
- preserve(): void {
400
- this.scene?.preserve()
401
- }
402
-
403
- hasUnpreservedChanges(): boolean {
404
- return !!this.scene?.hasUnpreservedChanges()
405
- }
406
-
407
- onContextMenu() {}
408
- }
@@ -1,200 +0,0 @@
1
- import { css } from 'lit'
2
-
3
- export const style = css`
4
- :host {
5
- display: flex;
6
- position: relative;
7
- flex-direction: column;
8
- width: 100%;
9
- height: 100%;
10
- overflow: hidden;
11
- justify-content: center;
12
- align-items: center;
13
- }
14
-
15
- ::slotted(*) {
16
- border: none;
17
- }
18
-
19
- ::slotted > * {
20
- flex: 1;
21
- }
22
-
23
- board-wrapper {
24
- width: 100%;
25
- height: 100%;
26
- position: relative;
27
- }
28
-
29
- board-wrapper[front] {
30
- background: black;
31
- }
32
-
33
- board-wrapper[back] {
34
- background: black;
35
- }
36
-
37
- #control {
38
- position: absolute;
39
- bottom: 1vh;
40
- width: 100vw;
41
- max-width: 435px;
42
- display: grid;
43
- grid-template-columns: 42px 42px 1fr;
44
- color: white;
45
- justify-content: center;
46
- align-items: center;
47
- grid-auto-flow: dense;
48
- padding: 5px;
49
- box-sizing: border-box;
50
- grid-template-rows: 12px 60px 12px;
51
- }
52
-
53
- #control[hidden] {
54
- display: none;
55
- }
56
-
57
- #control > div > * {
58
- cursor: pointer;
59
- user-select: none;
60
- }
61
-
62
- #joystick {
63
- position: relative;
64
- box-sizing: border-box;
65
- border: 2px solid tomato;
66
- background-color: #c34827;
67
- box-shadow: 0 0 5px #000;
68
- width: 100%;
69
- height: 100%;
70
- grid-column: 1 / span 2;
71
- border-radius: 50%;
72
- z-index: 2;
73
- grid-row: 1 / span 3;
74
- }
75
-
76
- #joystick md-icon {
77
- position: absolute;
78
- display: block;
79
- width: 20px;
80
- height: 20px;
81
- font-size: 25px;
82
- line-height: 0.7;
83
- }
84
-
85
- md-icon#up {
86
- left: 29px;
87
- }
88
-
89
- md-icon#left {
90
- top: 32px;
91
- left: -2px;
92
- }
93
-
94
- md-icon#play,
95
- md-icon#pause {
96
- left: 20px;
97
- top: 20px;
98
- width: 40px;
99
- height: 40px;
100
- border: 1px solid rgba(0, 0, 0, 0.15);
101
- border-radius: 50%;
102
- background-color: rgba(0, 0, 0, 0.15);
103
- font-size: 45px;
104
- line-height: 0.9;
105
- }
106
-
107
- md-icon#right {
108
- top: 31px;
109
- left: 60px;
110
- }
111
-
112
- md-icon#down {
113
- left: 29px;
114
- top: 63px;
115
- }
116
-
117
- md-icon#pause {
118
- text-indent: -2px;
119
- }
120
-
121
- #setting-container {
122
- grid-column: 2 / span 2;
123
- grid-row: 2;
124
- gap: 0 10px;
125
- border-radius: 12px;
126
- background: rgba(0, 0, 0, 0.7);
127
- height: 100%;
128
- box-shadow: rgb(0, 0, 0) 0px 0px 5px;
129
- display: grid;
130
- grid-template-columns: 1fr 60px;
131
- align-items: center;
132
- padding-left: 60px;
133
- padding-right: 5px;
134
- }
135
-
136
- #setting {
137
- display: grid;
138
- grid-template-columns: 1fr 1fr;
139
- grid-gap: 0 10px;
140
- }
141
-
142
- #setting md-icon {
143
- font-size: 22px;
144
- color: rgba(255, 174, 53, 0.8);
145
- }
146
-
147
- #setting input {
148
- width: 50px;
149
- margin-right: 5px;
150
- font-size: 14px;
151
- background-color: transparent;
152
- border: none;
153
- border-bottom: 1px solid #fff;
154
- color: #fff;
155
- text-align: right;
156
- }
157
-
158
- #setting select {
159
- border: none;
160
- font-size: 14px;
161
- }
162
-
163
- #setting input:focus {
164
- outline: none;
165
- }
166
-
167
- #schedule-container {
168
- display: flex;
169
- align-items: center;
170
- justify-content: space-between;
171
- }
172
-
173
- #grid-setting-container {
174
- display: flex;
175
- align-items: center;
176
- justify-content: space-between;
177
- }
178
-
179
- #etc {
180
- display: grid;
181
- grid-template-columns: 1fr 1fr;
182
- align-items: center;
183
- justify-items: center;
184
- }
185
-
186
- #etc md-icon {
187
- font-size: 30px;
188
- }
189
-
190
- #control [hidden] {
191
- display: none;
192
- }
193
-
194
- @media screen and (max-width: 460px) {
195
- #setting {
196
- grid-template-columns: 1fr;
197
- grid-template-rows: 1fr 1fr;
198
- }
199
- }
200
- `