@xviewer.js/debug 1.0.4-alpha.0 → 1.0.4-alpha.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.
package/README.md CHANGED
@@ -1 +1,101 @@
1
- A subpackage of `@xviewer/all`.
1
+ # @xviewer.js/debug
2
+
3
+ Debug package for xviewer.js with GUI components and debugging tools.
4
+
5
+ ## Features
6
+
7
+ - GUI components for debugging and inspection
8
+ - **Scene Tree Controller** - Interactive Three.js scene hierarchy viewer
9
+ - Curve editor for animation curves
10
+ - Various controller types (number, string, boolean, color, etc.)
11
+ - Touch-friendly interface with responsive design
12
+ - Modern CSS styling (converted from SCSS for better maintainability)
13
+
14
+ ## Usage
15
+
16
+ ```typescript
17
+ import { GUI } from '@xviewer.js/debug';
18
+
19
+ const gui = new GUI();
20
+ gui.add(controller, 'property', min, max);
21
+
22
+ // Add a scene tree controller
23
+ const sceneTree = gui.addSceneTree(threeScene);
24
+ sceneTree.onObjectSelect((object) => {
25
+ console.log('Selected:', object);
26
+ });
27
+ ```
28
+
29
+ ## Styling
30
+
31
+ The package uses modern CSS with CSS custom properties (variables) for theming. Styles are organized in a modular structure for better maintainability:
32
+
33
+ - `base.css` - CSS variables and base layout
34
+ - `controllers.css` - Controller-specific styles
35
+ - `hierarchy.css` - Folder and title styles
36
+ - `inputs.css` - Form input styles
37
+ - `curve-editor.css` - Curve editor styles
38
+ - `scene-tree.css` - Scene tree controller styles
39
+
40
+ All styles are imported through `index.css` and automatically bundled by Rollup.
41
+
42
+ ## Scene Tree Controller
43
+
44
+ The Scene Tree Controller provides an interactive view of your Three.js scene hierarchy, allowing you to:
45
+
46
+ - **Navigate** through the scene graph with expandable/collapsible nodes
47
+ - **Select** objects by clicking on them in the tree
48
+ - **Toggle visibility** of objects using the eye icon
49
+ - **Refresh** the tree when the scene changes
50
+ - **Expand/Collapse** all nodes at once
51
+
52
+ ### Features
53
+
54
+ - **Hierarchical Display**: Shows the complete scene structure with proper indentation
55
+ - **Object Selection**: Click any node to select the corresponding Three.js object
56
+ - **Visibility Control**: Toggle object visibility directly from the tree
57
+ - **Real-time Updates**: Automatically reflects changes in the scene
58
+ - **Dynamic Object Detection**: Automatically detects newly added/removed objects
59
+ - **Performance Optimized**: Lightweight change detection with configurable update intervals
60
+ - **Responsive Design**: Adapts to different screen sizes and touch devices
61
+
62
+ ### Example Integration
63
+
64
+ ```typescript
65
+ import { GUI } from '@xviewer.js/debug';
66
+
67
+ // Create GUI and add scene tree
68
+ const gui = new GUI({ title: "Scene Inspector" });
69
+ const sceneTree = gui.addSceneTree(threeScene);
70
+
71
+ // Handle object selection
72
+ sceneTree.onObjectSelect((object) => {
73
+ console.log('Selected:', object.name, object.type);
74
+ // Add your selection logic here
75
+ });
76
+
77
+ // Utility methods
78
+ sceneTree.expandAll(); // Expand all nodes
79
+ sceneTree.collapseAll(); // Collapse all nodes
80
+ sceneTree.refresh(); // Rebuild the tree
81
+ sceneTree.update(); // Update visibility states and check for changes
82
+ sceneTree.setAutoUpdate(true); // Enable automatic structure change detection
83
+ sceneTree.setUpdateInterval(2000); // Check for changes every 2 seconds (default: 1 second)
84
+ sceneTree.forceUpdate(); // Force immediate tree rebuild
85
+ ```
86
+
87
+ **Note**: The scene tree controller automatically takes the full width of its container, doesn't display a name label, and automatically detects scene changes when update() is called each frame. Performance is optimized by using lightweight change detection and configurable update intervals to avoid rebuilding the entire tree unnecessarily.
88
+
89
+ ### CSS Variables
90
+
91
+ - `--background-color`: Main background color
92
+ - `--text-color`: Primary text color
93
+ - `--widget-color`: Widget background color
94
+ - `--hover-color`: Hover state color
95
+ - `--focus-color`: Focus state color
96
+ - `--number-color`: Number input color
97
+ - `--string-color`: String input color
98
+
99
+ ## Build
100
+
101
+ The package is built using Rollup with CSS processing support. CSS files are automatically bundled and optimized during the build process.
@@ -0,0 +1,545 @@
1
+ @charset "UTF-8";
2
+ .lil-gui {
3
+ font-family: var(--font-family);
4
+ font-size: var(--font-size);
5
+ line-height: 1;
6
+ font-weight: normal;
7
+ font-style: normal;
8
+ text-align: left;
9
+ background-color: var(--background-color);
10
+ color: var(--text-color);
11
+ user-select: none;
12
+ -webkit-user-select: none;
13
+ touch-action: manipulation;
14
+ --background-color: #1f1f1f;
15
+ --text-color: #ebebeb;
16
+ --title-background-color: #111111;
17
+ --title-text-color: #ebebeb;
18
+ --widget-color: #424242;
19
+ --hover-color: #4f4f4f;
20
+ --focus-color: #595959;
21
+ --number-color: #2cc9ff;
22
+ --string-color: #a2db3c;
23
+ --font-size: 11px;
24
+ --input-font-size: 11px;
25
+ --font-family: -apple-system,
26
+ BlinkMacSystemFont,
27
+ "Segoe UI",
28
+ Roboto,
29
+ Arial,
30
+ sans-serif;
31
+ --font-family-mono: Menlo,
32
+ Monaco,
33
+ Consolas,
34
+ "Droid Sans Mono",
35
+ monospace;
36
+ --padding: 4px;
37
+ --spacing: 4px;
38
+ --widget-height: 20px;
39
+ --title-height: calc(var(--widget-height) + var(--spacing) * 1.25);
40
+ --name-width: 40%;
41
+ --slider-knob-width: 2px;
42
+ --slider-input-width: 27%;
43
+ --color-input-width: 27%;
44
+ --slider-input-min-width: 45px;
45
+ --color-input-min-width: 45px;
46
+ --folder-indent: 7px;
47
+ --widget-padding: 0 0 0 3px;
48
+ --widget-border-radius: 2px;
49
+ --checkbox-size: calc(0.75 * var(--widget-height));
50
+ --scrollbar-width: 5px;
51
+ }
52
+ .lil-gui, .lil-gui * {
53
+ box-sizing: border-box;
54
+ margin: 0;
55
+ padding: 0;
56
+ }
57
+ .lil-gui.root {
58
+ width: var(--width, 245px);
59
+ display: flex;
60
+ flex-direction: column;
61
+ }
62
+ .lil-gui.root > .title {
63
+ background: var(--title-background-color);
64
+ color: var(--title-text-color);
65
+ }
66
+ .lil-gui.root > .children {
67
+ overflow-x: hidden;
68
+ overflow-y: auto;
69
+ }
70
+ .lil-gui.root > .children::-webkit-scrollbar {
71
+ width: var(--scrollbar-width);
72
+ height: var(--scrollbar-width);
73
+ background: var(--background-color);
74
+ }
75
+ .lil-gui.root > .children::-webkit-scrollbar-thumb {
76
+ border-radius: var(--scrollbar-width);
77
+ background: var(--focus-color);
78
+ }
79
+ @media (pointer: coarse) {
80
+ .lil-gui.allow-touch-styles, .lil-gui.allow-touch-styles .lil-gui {
81
+ --widget-height: 28px;
82
+ --padding: 6px;
83
+ --spacing: 6px;
84
+ --font-size: 13px;
85
+ --input-font-size: 16px;
86
+ --folder-indent: 10px;
87
+ --scrollbar-width: 7px;
88
+ --slider-input-min-width: 50px;
89
+ --color-input-min-width: 65px;
90
+ }
91
+ }
92
+ .lil-gui.force-touch-styles, .lil-gui.force-touch-styles .lil-gui {
93
+ --widget-height: 28px;
94
+ --padding: 6px;
95
+ --spacing: 6px;
96
+ --font-size: 13px;
97
+ --input-font-size: 16px;
98
+ --folder-indent: 10px;
99
+ --scrollbar-width: 7px;
100
+ --slider-input-min-width: 50px;
101
+ --color-input-min-width: 65px;
102
+ }
103
+ .lil-gui.autoPlace {
104
+ max-height: 100%;
105
+ position: fixed;
106
+ top: 0;
107
+ right: 15px;
108
+ z-index: 1001;
109
+ }
110
+
111
+ .lil-gui .controller {
112
+ display: flex;
113
+ align-items: center;
114
+ padding: 0 var(--padding);
115
+ margin: var(--spacing) 0;
116
+ }
117
+ .lil-gui .controller.disabled {
118
+ opacity: 0.5;
119
+ }
120
+ .lil-gui .controller.disabled, .lil-gui .controller.disabled * {
121
+ pointer-events: none !important;
122
+ }
123
+ .lil-gui .controller > .name {
124
+ min-width: var(--name-width);
125
+ flex-shrink: 0;
126
+ white-space: pre;
127
+ padding-right: var(--spacing);
128
+ line-height: var(--widget-height);
129
+ }
130
+ .lil-gui .controller .widget {
131
+ position: relative;
132
+ display: flex;
133
+ align-items: center;
134
+ width: 100%;
135
+ min-height: var(--widget-height);
136
+ }
137
+ .lil-gui .controller.string input {
138
+ color: var(--string-color);
139
+ }
140
+ .lil-gui .controller.boolean .widget {
141
+ cursor: pointer;
142
+ }
143
+ .lil-gui .controller.color .display {
144
+ width: 100%;
145
+ height: var(--widget-height);
146
+ border-radius: var(--widget-border-radius);
147
+ position: relative;
148
+ }
149
+ @media (hover: hover) {
150
+ .lil-gui .controller.color .display:hover:before {
151
+ content: " ";
152
+ display: block;
153
+ position: absolute;
154
+ border-radius: var(--widget-border-radius);
155
+ border: 1px solid rgba(255, 255, 255, 0.6);
156
+ top: 0;
157
+ right: 0;
158
+ bottom: 0;
159
+ left: 0;
160
+ }
161
+ }
162
+ .lil-gui .controller.color input[type=color] {
163
+ opacity: 0;
164
+ width: 100%;
165
+ height: 100%;
166
+ cursor: pointer;
167
+ }
168
+ .lil-gui .controller.color input[type=text] {
169
+ margin-left: var(--spacing);
170
+ font-family: var(--font-family-mono);
171
+ min-width: var(--color-input-min-width);
172
+ width: var(--color-input-width);
173
+ flex-shrink: 0;
174
+ }
175
+ .lil-gui .controller.option select {
176
+ opacity: 0;
177
+ position: absolute;
178
+ width: 100%;
179
+ max-width: 100%;
180
+ }
181
+ .lil-gui .controller.option .display {
182
+ position: relative;
183
+ pointer-events: none;
184
+ border-radius: var(--widget-border-radius);
185
+ height: var(--widget-height);
186
+ line-height: var(--widget-height);
187
+ max-width: 100%;
188
+ overflow: hidden;
189
+ word-break: break-all;
190
+ padding-left: 0.55em;
191
+ padding-right: 1.75em;
192
+ background: var(--widget-color);
193
+ }
194
+ @media (hover: hover) {
195
+ .lil-gui .controller.option .display.focus {
196
+ background: var(--focus-color);
197
+ }
198
+ }
199
+ .lil-gui .controller.option .display.active {
200
+ background: var(--focus-color);
201
+ }
202
+ .lil-gui .controller.option .display:after {
203
+ font-family: "lil-gui";
204
+ content: "↕";
205
+ position: absolute;
206
+ top: 0;
207
+ right: 0;
208
+ bottom: 0;
209
+ padding-right: 0.375em;
210
+ }
211
+ .lil-gui .controller.option .widget,
212
+ .lil-gui .controller.option select {
213
+ cursor: pointer;
214
+ }
215
+ @media (hover: hover) {
216
+ .lil-gui .controller.option .widget:hover .display {
217
+ background: var(--hover-color);
218
+ }
219
+ }
220
+ .lil-gui .controller.number input {
221
+ color: var(--number-color);
222
+ }
223
+ .lil-gui .controller.number.hasSlider input {
224
+ margin-left: var(--spacing);
225
+ width: var(--slider-input-width);
226
+ min-width: var(--slider-input-min-width);
227
+ flex-shrink: 0;
228
+ }
229
+ .lil-gui .controller.number .slider {
230
+ width: 100%;
231
+ height: var(--widget-height);
232
+ background-color: var(--widget-color);
233
+ border-radius: var(--widget-border-radius);
234
+ padding-right: var(--slider-knob-width);
235
+ overflow: hidden;
236
+ cursor: ew-resize;
237
+ touch-action: pan-y;
238
+ }
239
+ @media (hover: hover) {
240
+ .lil-gui .controller.number .slider:hover {
241
+ background-color: var(--hover-color);
242
+ }
243
+ }
244
+ .lil-gui .controller.number .slider.active {
245
+ background-color: var(--focus-color);
246
+ }
247
+ .lil-gui .controller.number .slider.active .fill {
248
+ opacity: 0.95;
249
+ }
250
+ .lil-gui .controller.number .fill {
251
+ height: 100%;
252
+ border-right: var(--slider-knob-width) solid var(--number-color);
253
+ box-sizing: content-box;
254
+ }
255
+ .lil-gui .controller.texture canvas {
256
+ width: 100%;
257
+ border-radius: var(--widget-border-radius);
258
+ }
259
+ .lil-gui .controller.texture .group {
260
+ display: flex;
261
+ position: relative;
262
+ width: 100%;
263
+ }
264
+ .lil-gui .controller.texture .info {
265
+ position: absolute;
266
+ display: flex;
267
+ gap: 11px;
268
+ }
269
+ .lil-gui .controller.texture .label {
270
+ position: absolute;
271
+ background-color: rgba(0, 0, 0, 0.6745098039);
272
+ display: "flex";
273
+ padding: 2px;
274
+ border-radius: var(--widget-border-radius);
275
+ }
276
+ .lil-gui .controller.texture .block {
277
+ position: absolute;
278
+ left: 50%;
279
+ transform: translateX(-50%);
280
+ margin-top: 2px;
281
+ width: var(--font-size);
282
+ height: var(--font-size);
283
+ border-radius: var(--font-size);
284
+ background-color: white;
285
+ cursor: pointer;
286
+ }
287
+ .lil-gui .controller.texture .block.select {
288
+ background-color: var(--string-color);
289
+ }
290
+ .lil-gui .controller.image img {
291
+ width: 100%;
292
+ }
293
+ .lil-gui .controller.image canvas {
294
+ width: 100%;
295
+ }
296
+ .lil-gui .controller.vector input {
297
+ color: var(--number-color);
298
+ }
299
+ .lil-gui .controller.vector .fill {
300
+ height: 100%;
301
+ margin-left: var(--spacing);
302
+ box-sizing: content-box;
303
+ }
304
+
305
+ .lil-gui-dragging .lil-gui {
306
+ --hover-color: var(--widget-color);
307
+ }
308
+ .lil-gui-dragging * {
309
+ cursor: ew-resize !important;
310
+ }
311
+
312
+ .lil-gui-dragging.lil-gui-vertical * {
313
+ cursor: ns-resize !important;
314
+ }
315
+
316
+ .lil-gui .title {
317
+ height: var(--title-height);
318
+ line-height: calc(var(--title-height) - 4px);
319
+ font-weight: 600;
320
+ padding: 0 var(--padding);
321
+ -webkit-tap-highlight-color: transparent;
322
+ cursor: pointer;
323
+ outline: none;
324
+ text-decoration-skip: objects;
325
+ }
326
+ .lil-gui .title:before {
327
+ font-family: "lil-gui";
328
+ content: "▾";
329
+ padding-right: 2px;
330
+ display: inline-block;
331
+ }
332
+ .lil-gui .title:active {
333
+ background: var(--title-background-color);
334
+ opacity: 0.75;
335
+ }
336
+ @media (hover: hover) {
337
+ body:not(.lil-gui-dragging) .lil-gui .title:hover {
338
+ background: var(--title-background-color);
339
+ opacity: 0.85;
340
+ }
341
+ .lil-gui .title:focus {
342
+ text-decoration: underline var(--focus-color);
343
+ }
344
+ }
345
+ .lil-gui.root > .title:focus {
346
+ text-decoration: none !important;
347
+ }
348
+ .lil-gui.closed > .title:before {
349
+ content: "▸";
350
+ }
351
+ .lil-gui.closed > .children {
352
+ transform: translateY(-7px);
353
+ opacity: 0;
354
+ }
355
+ .lil-gui.closed:not(.transition) > .children {
356
+ display: none;
357
+ }
358
+ .lil-gui.transition > .children {
359
+ transition-duration: 300ms;
360
+ transition-property: height, opacity, transform;
361
+ transition-timing-function: cubic-bezier(0.2, 0.6, 0.35, 1);
362
+ overflow: hidden;
363
+ pointer-events: none;
364
+ }
365
+ .lil-gui .children:empty:before {
366
+ content: "Empty";
367
+ padding: 0 var(--padding);
368
+ margin: var(--spacing) 0;
369
+ display: block;
370
+ height: var(--widget-height);
371
+ font-style: italic;
372
+ line-height: var(--widget-height);
373
+ opacity: 0.5;
374
+ }
375
+ .lil-gui.root > .children > .lil-gui > .title {
376
+ border: 0 solid var(--widget-color);
377
+ border-width: 1px 0;
378
+ transition: border-color 300ms;
379
+ }
380
+ .lil-gui.root > .children > .lil-gui.closed > .title {
381
+ border-bottom-color: transparent;
382
+ }
383
+ .lil-gui + .controller {
384
+ border-top: 1px solid var(--widget-color);
385
+ margin-top: 0;
386
+ padding-top: var(--spacing);
387
+ }
388
+ .lil-gui .lil-gui .lil-gui > .title {
389
+ border: none;
390
+ }
391
+ .lil-gui .lil-gui .lil-gui > .children {
392
+ border: none;
393
+ margin-left: var(--folder-indent);
394
+ border-left: 2px solid var(--widget-color);
395
+ }
396
+ .lil-gui .lil-gui .controller {
397
+ border: none;
398
+ }
399
+
400
+ .lil-gui input {
401
+ -webkit-tap-highlight-color: transparent;
402
+ border: 0;
403
+ outline: none;
404
+ font-family: var(--font-family);
405
+ font-size: var(--input-font-size);
406
+ border-radius: var(--widget-border-radius);
407
+ height: var(--widget-height);
408
+ background: var(--widget-color);
409
+ color: var(--text-color);
410
+ width: 100%;
411
+ }
412
+ @media (hover: hover) {
413
+ .lil-gui input:hover {
414
+ background: var(--hover-color);
415
+ }
416
+ .lil-gui input:active {
417
+ background: var(--focus-color);
418
+ }
419
+ }
420
+ .lil-gui input:disabled {
421
+ opacity: 1;
422
+ }
423
+ .lil-gui input[type=text],
424
+ .lil-gui input[type=number] {
425
+ padding: var(--widget-padding);
426
+ }
427
+ .lil-gui input[type=text]:focus,
428
+ .lil-gui input[type=number]:focus {
429
+ background: var(--focus-color);
430
+ }
431
+ .lil-gui input::-webkit-outer-spin-button,
432
+ .lil-gui input::-webkit-inner-spin-button {
433
+ -webkit-appearance: none;
434
+ margin: 0;
435
+ }
436
+ .lil-gui input[type=number] {
437
+ -moz-appearance: textfield;
438
+ }
439
+ .lil-gui input[type=checkbox] {
440
+ appearance: none;
441
+ -webkit-appearance: none;
442
+ height: var(--checkbox-size);
443
+ width: var(--checkbox-size);
444
+ border-radius: var(--widget-border-radius);
445
+ text-align: center;
446
+ cursor: pointer;
447
+ }
448
+ .lil-gui input[type=checkbox]:checked:before {
449
+ font-family: "lil-gui";
450
+ content: "✓";
451
+ font-size: var(--checkbox-size);
452
+ line-height: var(--checkbox-size);
453
+ }
454
+ @media (hover: hover) {
455
+ .lil-gui input[type=checkbox]:focus {
456
+ box-shadow: inset 0 0 0 1px var(--focus-color);
457
+ }
458
+ }
459
+ .lil-gui button {
460
+ -webkit-tap-highlight-color: transparent;
461
+ outline: none;
462
+ cursor: pointer;
463
+ font-family: var(--font-family);
464
+ font-size: var(--font-size);
465
+ color: var(--text-color);
466
+ width: 100%;
467
+ height: var(--widget-height);
468
+ text-transform: none;
469
+ background: var(--widget-color);
470
+ border-radius: var(--widget-border-radius);
471
+ border: 1px solid var(--widget-color);
472
+ text-align: center;
473
+ line-height: calc(var(--widget-height) - 4px);
474
+ }
475
+ @media (hover: hover) {
476
+ .lil-gui button:hover {
477
+ background: var(--hover-color);
478
+ border-color: var(--hover-color);
479
+ }
480
+ .lil-gui button:focus {
481
+ border-color: var(--focus-color);
482
+ }
483
+ }
484
+ .lil-gui button:active {
485
+ background: var(--focus-color);
486
+ }
487
+
488
+ @font-face {
489
+ font-family: "lil-gui";
490
+ src: url("data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==") format("woff");
491
+ }
492
+ .curve-editor {
493
+ display: flex;
494
+ flex-direction: column;
495
+ gap: 5px;
496
+ background-color: #303030;
497
+ outline: 1px solid #000000;
498
+ padding: 5px;
499
+ width: 100%;
500
+ }
501
+ .curve-editor .button-medium {
502
+ background-color: #545454;
503
+ min-width: var(--widget-height);
504
+ min-height: var(--widget-height);
505
+ height: 100%;
506
+ outline: 1px solid #3c3c3c;
507
+ display: flex;
508
+ justify-content: center;
509
+ align-items: center;
510
+ color: #fff;
511
+ font-size: var(--input-font-size, 11px);
512
+ }
513
+ .curve-editor .button-medium.selected {
514
+ background-color: #4772b3;
515
+ pointer-events: none;
516
+ }
517
+ .curve-editor .button-medium:hover {
518
+ background-color: #656565;
519
+ cursor: default;
520
+ }
521
+ .curve-editor .curve-top {
522
+ display: flex;
523
+ width: 100%;
524
+ }
525
+ .curve-editor .curve-panel {
526
+ width: 100%;
527
+ height: 90px;
528
+ outline: 1px solid #646464;
529
+ }
530
+ .curve-editor .curve-point-panel {
531
+ display: flex;
532
+ align-items: center;
533
+ width: 100%;
534
+ height: var(--widget-height);
535
+ }
536
+ .curve-editor .curve-point-panel input {
537
+ background-color: #545454;
538
+ height: 100%;
539
+ width: 100%;
540
+ color: #fff;
541
+ border: 0;
542
+ outline: 1px solid #3c3c3c;
543
+ text-align: center;
544
+ font-size: var(--input-font-size, 11px);
545
+ }