@kokoa/clotho-editor 0.1.0

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.
@@ -0,0 +1,1921 @@
1
+ html.editor-active,
2
+ body.editor-active {
3
+ height: 100%;
4
+ overflow: hidden;
5
+ }
6
+
7
+ @layer components {
8
+ .studio-shell {
9
+ height: calc(100vh - 80px);
10
+ min-height: 600px;
11
+ display: flex;
12
+ flex-direction: column;
13
+ }
14
+ .studio-app {
15
+ --studio-timeline-h: 320px;
16
+ display: grid;
17
+ grid-template-rows: auto minmax(220px, 1fr) auto var(--studio-timeline-h);
18
+ height: 100%;
19
+ flex: 1;
20
+ min-height: 0;
21
+ border: 1px solid var(--color-border);
22
+ border-radius: 0.5rem;
23
+ background-color: var(--color-surface);
24
+ overflow: hidden;
25
+ }
26
+ .studio-timeline-resizer {
27
+ height: 6px;
28
+ cursor: ns-resize;
29
+ background-color: var(--color-border);
30
+ position: relative;
31
+ flex-shrink: 0;
32
+ touch-action: none;
33
+ transition: background-color 100ms ease-out;
34
+ }
35
+ .studio-timeline-resizer::before {
36
+ content: "";
37
+ position: absolute;
38
+ left: 50%;
39
+ top: 50%;
40
+ width: 28px;
41
+ height: 2px;
42
+ transform: translate(-50%, -50%);
43
+ background-color: var(--color-fg-muted);
44
+ border-radius: 1px;
45
+ opacity: 0.5;
46
+ }
47
+ .studio-timeline-resizer:hover,
48
+ .studio-timeline-resizer.is-dragging {
49
+ background-color: var(--color-accent);
50
+ }
51
+ .studio-timeline-resizer:hover::before,
52
+ .studio-timeline-resizer.is-dragging::before {
53
+ background-color: white;
54
+ opacity: 1;
55
+ }
56
+ .studio-header {
57
+ display: flex;
58
+ justify-content: space-between;
59
+ align-items: center;
60
+ gap: 1rem;
61
+ padding: 0.6rem 0.85rem;
62
+ border-bottom: 1px solid var(--color-border);
63
+ background-color: var(--color-surface-elevated);
64
+ }
65
+ .studio-header-title {
66
+ margin: 0;
67
+ font-size: 1rem;
68
+ font-weight: 600;
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.5rem;
72
+ }
73
+ .studio-tag {
74
+ font-size: 0.65rem;
75
+ padding: 0.05rem 0.35rem;
76
+ background-color: var(--color-accent);
77
+ color: white;
78
+ border-radius: 4px;
79
+ font-weight: 700;
80
+ }
81
+ .studio-header-actions {
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 0.5rem;
85
+ flex-wrap: wrap;
86
+ }
87
+ .studio-title-input {
88
+ padding: 0.3rem 0.5rem;
89
+ border: 1px solid var(--color-border);
90
+ border-radius: 0.25rem;
91
+ background-color: var(--color-surface);
92
+ color: var(--color-fg);
93
+ font-size: 0.85rem;
94
+ width: 200px;
95
+ }
96
+ .studio-id-display {
97
+ font-family: var(--font-mono);
98
+ font-size: 0.7rem;
99
+ color: var(--color-fg-muted);
100
+ }
101
+ .studio-id-display.is-draft {
102
+ color: var(--color-accent);
103
+ background-color: color-mix(in srgb, var(--color-accent) 12%, transparent);
104
+ padding: 0.1rem 0.4rem;
105
+ border-radius: 0.25rem;
106
+ font-weight: 600;
107
+ }
108
+ .studio-status {
109
+ font-size: 0.75rem;
110
+ color: var(--color-fg-muted);
111
+ }
112
+ .studio-btn {
113
+ display: inline-flex;
114
+ align-items: center;
115
+ gap: 0.25rem;
116
+ padding: 0.35rem 0.7rem;
117
+ border: 1px solid var(--color-border);
118
+ border-radius: 0.375rem;
119
+ background-color: var(--color-surface);
120
+ color: var(--color-fg);
121
+ cursor: pointer;
122
+ font-size: 0.78rem;
123
+ }
124
+ .studio-btn:hover:not(:disabled) {
125
+ border-color: var(--color-accent);
126
+ color: var(--color-accent);
127
+ }
128
+ .studio-btn:disabled {
129
+ opacity: 0.5;
130
+ cursor: not-allowed;
131
+ }
132
+ .studio-btn-icon {
133
+ min-width: 2.2rem;
134
+ padding: 0.3rem 0.55rem;
135
+ font-size: 1rem;
136
+ line-height: 1;
137
+ justify-content: center;
138
+ }
139
+ .studio-btn.is-active {
140
+ background-color: var(--color-accent);
141
+ color: #fff;
142
+ border-color: var(--color-accent);
143
+ }
144
+ .studio-btn-grid {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ gap: 0.3rem;
148
+ padding: 0.3rem 0.55rem;
149
+ font-size: 0.78rem;
150
+ line-height: 1;
151
+ transition:
152
+ background-color 0.15s,
153
+ color 0.15s,
154
+ border-color 0.15s,
155
+ box-shadow 0.15s;
156
+ }
157
+ .studio-btn-grid-icon {
158
+ font-size: 1rem;
159
+ }
160
+ .studio-btn-grid.is-active {
161
+ background-color: var(--color-accent);
162
+ color: #fff;
163
+ border-color: var(--color-accent);
164
+ box-shadow: 0 0 0 2px
165
+ color-mix(in srgb, var(--color-accent) 32%, transparent);
166
+ }
167
+ .studio-btn-grid.is-active .studio-btn-grid-label {
168
+ font-weight: 700;
169
+ }
170
+ .studio-floating-help {
171
+ position: absolute;
172
+ right: 1rem;
173
+ bottom: 1rem;
174
+ width: 2.5rem;
175
+ height: 2.5rem;
176
+ border-radius: 50%;
177
+ border: 1px solid var(--color-border);
178
+ background-color: var(--color-surface-elevated);
179
+ color: var(--color-accent);
180
+ font-size: 1.2rem;
181
+ font-weight: 700;
182
+ cursor: pointer;
183
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
184
+ z-index: 10;
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ }
189
+ .studio-floating-help:hover {
190
+ background-color: var(--color-accent);
191
+ color: #fff;
192
+ border-color: var(--color-accent);
193
+ }
194
+ .studio-help-hint {
195
+ position: absolute;
196
+ right: 4.5rem;
197
+ bottom: 1.1rem;
198
+ padding: 0.5rem 0.75rem;
199
+ background-color: var(--color-fg);
200
+ color: var(--color-bg);
201
+ border-radius: 0.5rem;
202
+ font-size: 0.78rem;
203
+ display: inline-flex;
204
+ align-items: center;
205
+ gap: 0.5rem;
206
+ opacity: 0;
207
+ transform: translateX(8px);
208
+ transition:
209
+ opacity 0.3s ease,
210
+ transform 0.3s ease;
211
+ z-index: 10;
212
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
213
+ pointer-events: none;
214
+ }
215
+ .studio-help-hint.is-visible {
216
+ opacity: 1;
217
+ transform: translateX(0);
218
+ pointer-events: auto;
219
+ }
220
+ .studio-help-hint kbd {
221
+ padding: 0.05rem 0.35rem;
222
+ background-color: color-mix(in srgb, var(--color-bg) 25%, transparent);
223
+ border-radius: 0.25rem;
224
+ font-family: var(--font-mono);
225
+ }
226
+ .studio-help-hint button {
227
+ background: transparent;
228
+ border: none;
229
+ color: var(--color-bg);
230
+ cursor: pointer;
231
+ opacity: 0.7;
232
+ font-size: 0.85rem;
233
+ }
234
+ .studio-help-hint button:hover {
235
+ opacity: 1;
236
+ }
237
+ .studio-btn-primary {
238
+ background-color: var(--color-accent);
239
+ border-color: var(--color-accent);
240
+ color: white;
241
+ }
242
+ .studio-btn-primary:hover:not(:disabled) {
243
+ color: white;
244
+ opacity: 0.9;
245
+ }
246
+ .studio-btn-danger {
247
+ color: #ef4444;
248
+ border-color: #ef4444;
249
+ }
250
+ .studio-btn-danger:hover:not(:disabled) {
251
+ background-color: #ef4444;
252
+ color: white;
253
+ }
254
+
255
+ .studio-body {
256
+ display: grid;
257
+ grid-template-columns: 200px 1fr 280px;
258
+ min-height: 0;
259
+ overflow: hidden;
260
+ }
261
+
262
+ .studio-tools {
263
+ border-right: 1px solid var(--color-border);
264
+ background-color: var(--color-surface-elevated);
265
+ overflow-y: auto;
266
+ padding: 0.5rem;
267
+ }
268
+ .studio-tools-section {
269
+ margin-bottom: 1rem;
270
+ }
271
+ .studio-tools-title {
272
+ font-size: 0.7rem;
273
+ font-weight: 600;
274
+ color: var(--color-fg-muted);
275
+ margin-bottom: 0.35rem;
276
+ text-transform: uppercase;
277
+ letter-spacing: 0.05em;
278
+ }
279
+ .studio-tool-btn {
280
+ display: block;
281
+ width: 100%;
282
+ text-align: left;
283
+ padding: 0.35rem 0.5rem;
284
+ margin-bottom: 0.15rem;
285
+ border: 1px solid var(--color-border);
286
+ border-radius: 0.25rem;
287
+ background-color: var(--color-surface);
288
+ color: var(--color-fg);
289
+ cursor: pointer;
290
+ font-size: 0.78rem;
291
+ }
292
+ .studio-tool-btn:hover {
293
+ border-color: var(--color-accent);
294
+ color: var(--color-accent);
295
+ }
296
+ .studio-element-search {
297
+ width: 100%;
298
+ box-sizing: border-box;
299
+ padding: 0.3rem 0.5rem;
300
+ margin-bottom: 0.4rem;
301
+ border: 1px solid var(--color-border);
302
+ border-radius: 0.3rem;
303
+ background-color: var(--color-surface);
304
+ color: var(--color-fg);
305
+ font-size: 0.78rem;
306
+ font-family: inherit;
307
+ }
308
+ .studio-element-search:focus {
309
+ outline: none;
310
+ border-color: var(--color-accent);
311
+ box-shadow: 0 0 0 2px
312
+ color-mix(in srgb, var(--color-accent) 24%, transparent);
313
+ }
314
+ .studio-element-list {
315
+ list-style: none;
316
+ padding: 0;
317
+ margin: 0;
318
+ font-size: 0.75rem;
319
+ }
320
+ .studio-element-list-item-label {
321
+ overflow: hidden;
322
+ text-overflow: ellipsis;
323
+ white-space: nowrap;
324
+ min-width: 0;
325
+ flex: 1;
326
+ }
327
+ .studio-element-list-item-sub {
328
+ margin-left: 0.4rem;
329
+ font-family: var(--font-mono);
330
+ font-size: 0.6rem;
331
+ color: var(--color-fg-muted);
332
+ opacity: 0.7;
333
+ }
334
+ .studio-element-list-item {
335
+ padding: 0.3rem 0.45rem;
336
+ border-radius: 0.25rem;
337
+ cursor: pointer;
338
+ display: flex;
339
+ justify-content: space-between;
340
+ align-items: center;
341
+ gap: 0.25rem;
342
+ }
343
+ .studio-element-list-item:hover {
344
+ background-color: var(--color-surface);
345
+ }
346
+ .studio-element-list-item.is-selected {
347
+ background-color: var(--color-surface);
348
+ border: 1px solid var(--color-accent);
349
+ }
350
+ .studio-element-list-item-type {
351
+ font-family: var(--font-mono);
352
+ font-size: 0.65rem;
353
+ color: var(--color-fg-muted);
354
+ }
355
+ .studio-element-list-delete {
356
+ background: transparent;
357
+ border: none;
358
+ color: var(--color-fg-muted);
359
+ cursor: pointer;
360
+ font-size: 0.85rem;
361
+ }
362
+ .studio-element-list-delete:hover {
363
+ color: #ef4444;
364
+ }
365
+
366
+ .studio-canvas-wrap {
367
+ position: relative;
368
+ background-color: #fafafa;
369
+ overflow: auto;
370
+ padding: 1rem;
371
+ }
372
+ body.studio-pan-mode .studio-canvas-wrap {
373
+ cursor: grab;
374
+ }
375
+ body.studio-pan-mode .studio-canvas-wrap * {
376
+ pointer-events: none !important;
377
+ cursor: inherit !important;
378
+ }
379
+ body.studio-panning .studio-canvas-wrap,
380
+ body.studio-panning .studio-canvas-wrap * {
381
+ cursor: grabbing !important;
382
+ }
383
+ :root.dark .studio-canvas-wrap {
384
+ background-color: #18181b;
385
+ }
386
+ .studio-canvas-frame {
387
+ background-color: white;
388
+ box-shadow: 0 4px 12px -4px rgba(0, 0, 0, 0.15);
389
+ margin: 0 auto;
390
+ overflow: hidden;
391
+ display: inline-block;
392
+ }
393
+ :root.dark .studio-canvas-frame {
394
+ background-color: #0b0b0f;
395
+ }
396
+ body.studio-grid-on .studio-canvas {
397
+ background-image:
398
+ linear-gradient(to right, rgba(99, 102, 241, 0.18) 1px, transparent 1px),
399
+ linear-gradient(to bottom, rgba(99, 102, 241, 0.18) 1px, transparent 1px);
400
+ background-size: var(--studio-grid-size, 10px) var(--studio-grid-size, 10px);
401
+ }
402
+ .studio-canvas {
403
+ display: block;
404
+ cursor: default;
405
+ }
406
+ .studio-canvas .element-handle {
407
+ cursor: move;
408
+ }
409
+ .studio-canvas .element-selected-outline {
410
+ fill: none;
411
+ stroke: var(--color-accent);
412
+ stroke-width: 2;
413
+ stroke-dasharray: 4 3;
414
+ pointer-events: none;
415
+ }
416
+
417
+ .studio-props {
418
+ border-left: 1px solid var(--color-border);
419
+ background-color: var(--color-surface-elevated);
420
+ overflow-y: auto;
421
+ padding: 0.75rem;
422
+ }
423
+ .studio-props-content {
424
+ font-size: 0.82rem;
425
+ }
426
+ .studio-props-empty {
427
+ color: var(--color-fg-muted);
428
+ font-size: 0.8rem;
429
+ text-align: center;
430
+ padding: 2rem 0;
431
+ }
432
+ .studio-props-header {
433
+ display: flex;
434
+ justify-content: space-between;
435
+ align-items: center;
436
+ margin-bottom: 0.5rem;
437
+ padding-bottom: 0.4rem;
438
+ border-bottom: 1px solid var(--color-border);
439
+ }
440
+ .studio-props-section {
441
+ margin-bottom: 0.4rem;
442
+ }
443
+ .studio-props-section + .studio-props-section {
444
+ margin-top: 0.8rem;
445
+ }
446
+ .studio-props-summary {
447
+ cursor: pointer;
448
+ user-select: none;
449
+ list-style: none;
450
+ position: relative;
451
+ padding-left: 1.1rem;
452
+ }
453
+ .studio-props-summary::-webkit-details-marker {
454
+ display: none;
455
+ }
456
+ .studio-props-summary::before {
457
+ content: "▸";
458
+ position: absolute;
459
+ left: 0.1rem;
460
+ font-size: 0.7rem;
461
+ color: var(--color-fg-muted);
462
+ transition: transform 0.15s ease;
463
+ display: inline-block;
464
+ }
465
+ .studio-props-section[open] > .studio-props-summary::before {
466
+ transform: rotate(90deg);
467
+ }
468
+ .studio-props-summary:hover::before {
469
+ color: var(--color-accent);
470
+ }
471
+ .studio-props-section-body {
472
+ padding-top: 0.3rem;
473
+ }
474
+ .studio-align-section {
475
+ margin: 0.5rem 0;
476
+ padding: 0.5rem;
477
+ border: 1px solid var(--color-border);
478
+ border-radius: 0.4rem;
479
+ background-color: color-mix(in srgb, var(--color-accent) 4%, transparent);
480
+ }
481
+ .studio-align-title {
482
+ font-size: 0.72rem;
483
+ color: var(--color-fg-muted);
484
+ margin-bottom: 0.3rem;
485
+ font-weight: 600;
486
+ }
487
+ .studio-align-row {
488
+ display: flex;
489
+ gap: 0.25rem;
490
+ margin-bottom: 0.25rem;
491
+ }
492
+ .studio-align-btn {
493
+ flex: 1;
494
+ padding: 0.35rem 0;
495
+ font-size: 1rem;
496
+ line-height: 1;
497
+ text-align: center;
498
+ }
499
+ .studio-align-btn:disabled {
500
+ opacity: 0.4;
501
+ cursor: not-allowed;
502
+ }
503
+ .studio-palette-dialog {
504
+ width: min(520px, 90vw);
505
+ max-height: 60vh;
506
+ padding: 0;
507
+ border: 1px solid var(--color-border);
508
+ border-radius: 0.6rem;
509
+ background-color: var(--color-surface);
510
+ color: var(--color-fg);
511
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.3);
512
+ overflow: hidden;
513
+ }
514
+ .studio-palette-dialog[open] {
515
+ display: flex;
516
+ flex-direction: column;
517
+ }
518
+ .studio-palette-dialog:not([open]) {
519
+ display: none !important;
520
+ }
521
+ .studio-palette-dialog::backdrop {
522
+ background-color: rgba(0, 0, 0, 0.3);
523
+ }
524
+ .studio-palette-input {
525
+ border: none;
526
+ border-bottom: 1px solid var(--color-border);
527
+ background: transparent;
528
+ color: inherit;
529
+ padding: 0.7rem 1rem;
530
+ font-size: 0.95rem;
531
+ outline: none;
532
+ }
533
+ .studio-palette-list {
534
+ list-style: none;
535
+ padding: 0.3rem 0;
536
+ margin: 0;
537
+ overflow-y: auto;
538
+ flex: 1;
539
+ }
540
+ .studio-palette-empty {
541
+ padding: 1rem;
542
+ text-align: center;
543
+ color: var(--color-fg-muted);
544
+ font-size: 0.85rem;
545
+ }
546
+ .studio-palette-item {
547
+ display: grid;
548
+ grid-template-columns: auto 1fr auto;
549
+ gap: 0.6rem;
550
+ align-items: center;
551
+ padding: 0.45rem 1rem;
552
+ cursor: pointer;
553
+ font-size: 0.85rem;
554
+ }
555
+ .studio-palette-item.is-active {
556
+ background-color: color-mix(in srgb, var(--color-accent) 14%, transparent);
557
+ color: var(--color-accent);
558
+ }
559
+ .studio-palette-item:hover {
560
+ background-color: var(--color-surface-elevated);
561
+ }
562
+ .studio-palette-icon {
563
+ font-size: 1rem;
564
+ }
565
+ .studio-palette-label {
566
+ font-weight: 500;
567
+ }
568
+ .studio-palette-hint {
569
+ font-size: 0.7rem;
570
+ color: var(--color-fg-muted);
571
+ font-family: var(--font-mono);
572
+ }
573
+ .studio-palette-footer {
574
+ padding: 0.45rem 1rem;
575
+ border-top: 1px solid var(--color-border);
576
+ background-color: var(--color-surface-elevated);
577
+ font-size: 0.7rem;
578
+ color: var(--color-fg-muted);
579
+ font-family: var(--font-mono);
580
+ }
581
+ .studio-history-dialog {
582
+ width: min(480px, 90vw);
583
+ max-height: 70vh;
584
+ padding: 0;
585
+ border: 1px solid var(--color-border);
586
+ border-radius: 0.6rem;
587
+ background-color: var(--color-surface);
588
+ color: var(--color-fg);
589
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.3);
590
+ overflow: hidden;
591
+ }
592
+ .studio-history-dialog[open] {
593
+ display: flex;
594
+ flex-direction: column;
595
+ }
596
+ .studio-history-dialog:not([open]) {
597
+ display: none !important;
598
+ }
599
+ .studio-history-dialog::backdrop {
600
+ background-color: rgba(0, 0, 0, 0.3);
601
+ }
602
+ .studio-history-header {
603
+ display: flex;
604
+ align-items: center;
605
+ justify-content: space-between;
606
+ padding: 0.7rem 1rem;
607
+ border-bottom: 1px solid var(--color-border);
608
+ }
609
+ .studio-history-header h2 {
610
+ margin: 0;
611
+ font-size: 0.95rem;
612
+ font-weight: 700;
613
+ }
614
+ .studio-history-list {
615
+ list-style: none;
616
+ margin: 0;
617
+ padding: 0.3rem 0;
618
+ overflow-y: auto;
619
+ flex: 1;
620
+ }
621
+ .studio-history-item {
622
+ display: grid;
623
+ grid-template-columns: 1.5rem 1fr auto;
624
+ gap: 0.4rem;
625
+ align-items: center;
626
+ padding: 0.35rem 1rem;
627
+ cursor: pointer;
628
+ font-size: 0.82rem;
629
+ }
630
+ .studio-history-item:hover {
631
+ background-color: var(--color-surface-elevated);
632
+ }
633
+ .studio-history-item-future {
634
+ opacity: 0.55;
635
+ }
636
+ .studio-history-current {
637
+ padding: 0.3rem 1rem;
638
+ font-size: 0.7rem;
639
+ text-align: center;
640
+ color: var(--color-accent);
641
+ font-weight: 700;
642
+ background-color: color-mix(in srgb, var(--color-accent) 10%, transparent);
643
+ border-top: 1px solid
644
+ color-mix(in srgb, var(--color-accent) 20%, transparent);
645
+ border-bottom: 1px solid
646
+ color-mix(in srgb, var(--color-accent) 20%, transparent);
647
+ margin: 0.2rem 0;
648
+ }
649
+ .studio-history-empty {
650
+ padding: 1rem;
651
+ text-align: center;
652
+ color: var(--color-fg-muted);
653
+ font-size: 0.85rem;
654
+ }
655
+ .studio-history-icon {
656
+ font-size: 0.9rem;
657
+ color: var(--color-fg-muted);
658
+ text-align: center;
659
+ }
660
+ .studio-history-label {
661
+ overflow: hidden;
662
+ text-overflow: ellipsis;
663
+ white-space: nowrap;
664
+ }
665
+ .studio-history-time {
666
+ font-size: 0.65rem;
667
+ color: var(--color-fg-muted);
668
+ font-family: var(--font-mono);
669
+ }
670
+ .studio-history-footer {
671
+ padding: 0.45rem 1rem;
672
+ border-top: 1px solid var(--color-border);
673
+ background-color: var(--color-surface-elevated);
674
+ font-size: 0.7rem;
675
+ color: var(--color-fg-muted);
676
+ font-family: var(--font-mono);
677
+ }
678
+ .studio-props-header-title {
679
+ font-weight: 600;
680
+ font-size: 0.9rem;
681
+ }
682
+ .studio-props-header-type {
683
+ font-family: var(--font-mono);
684
+ font-size: 0.7rem;
685
+ color: var(--color-fg-muted);
686
+ }
687
+ .studio-field {
688
+ display: block;
689
+ margin-bottom: 0.55rem;
690
+ }
691
+ .studio-field > span {
692
+ display: block;
693
+ font-size: 0.7rem;
694
+ color: var(--color-fg-muted);
695
+ margin-bottom: 0.15rem;
696
+ }
697
+ .studio-field input,
698
+ .studio-field select,
699
+ .studio-field textarea {
700
+ width: 100%;
701
+ padding: 0.3rem 0.45rem;
702
+ border: 1px solid var(--color-border);
703
+ border-radius: 0.25rem;
704
+ background-color: var(--color-surface);
705
+ color: var(--color-fg);
706
+ font-size: 0.8rem;
707
+ font-family: inherit;
708
+ }
709
+ .studio-field textarea {
710
+ min-height: 60px;
711
+ font-family: var(--font-mono);
712
+ }
713
+ .studio-field-row {
714
+ display: grid;
715
+ grid-template-columns: 1fr 1fr;
716
+ gap: 0.4rem;
717
+ margin-bottom: 0.55rem;
718
+ }
719
+
720
+ .studio-timeline-wrap {
721
+ background-color: var(--color-surface-elevated);
722
+ padding: 0.5rem;
723
+ overflow: hidden;
724
+ display: grid;
725
+ grid-template-rows: auto auto minmax(0, 1fr);
726
+ gap: 0.4rem;
727
+ min-height: 0;
728
+ }
729
+ .studio-timeline-tracks-wrap {
730
+ overflow-x: auto;
731
+ overflow-y: hidden;
732
+ min-height: 0;
733
+ }
734
+ .studio-element-tracks-wrap {
735
+ overflow: auto;
736
+ min-height: 0;
737
+ border-top: 1px dashed var(--color-border);
738
+ padding-top: 0.4rem;
739
+ }
740
+ .studio-timeline-header {
741
+ display: flex;
742
+ align-items: center;
743
+ gap: 0.5rem;
744
+ }
745
+ .studio-timeline-spacer {
746
+ flex: 1;
747
+ }
748
+ .studio-speed {
749
+ display: inline-flex;
750
+ align-items: center;
751
+ gap: 0.35rem;
752
+ font-size: 0.75rem;
753
+ color: var(--color-fg-muted);
754
+ }
755
+ .studio-speed input[type="range"] {
756
+ width: 100px;
757
+ }
758
+ .studio-timeline-tracks {
759
+ display: block;
760
+ padding-bottom: 0.25rem;
761
+ min-height: 80px;
762
+ }
763
+ .studio-tl-chart {
764
+ position: relative;
765
+ min-width: max-content;
766
+ }
767
+ .studio-tl-row {
768
+ display: grid;
769
+ grid-template-columns: 140px max-content;
770
+ align-items: stretch;
771
+ }
772
+ .studio-tl-gutter {
773
+ position: sticky;
774
+ left: 0;
775
+ z-index: 2;
776
+ background-color: var(--color-surface-elevated);
777
+ border-right: 1px solid var(--color-border);
778
+ padding: 0.3rem 0.7rem;
779
+ display: flex;
780
+ align-items: center;
781
+ font-size: 0.72rem;
782
+ font-family: var(--font-mono);
783
+ color: var(--color-fg-muted);
784
+ overflow: hidden;
785
+ text-overflow: ellipsis;
786
+ white-space: nowrap;
787
+ }
788
+ .studio-tl-gutter-header {
789
+ font-weight: 700;
790
+ color: var(--color-accent);
791
+ background-color: color-mix(
792
+ in srgb,
793
+ var(--color-accent) 6%,
794
+ var(--color-surface-elevated)
795
+ );
796
+ }
797
+ .studio-tl-body {
798
+ position: relative;
799
+ }
800
+ .studio-tl-playhead-col {
801
+ position: absolute;
802
+ top: 0;
803
+ bottom: 0;
804
+ pointer-events: none;
805
+ z-index: 1;
806
+ }
807
+ .studio-tl-drag-tooltip {
808
+ position: fixed;
809
+ z-index: 9999;
810
+ padding: 0.2rem 0.55rem;
811
+ background-color: var(--color-fg);
812
+ color: var(--color-bg);
813
+ border-radius: 0.3rem;
814
+ font-family: var(--font-mono);
815
+ font-size: 0.72rem;
816
+ font-weight: 600;
817
+ pointer-events: none;
818
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
819
+ display: none;
820
+ }
821
+ .studio-tl-bars {
822
+ display: flex;
823
+ align-items: stretch;
824
+ gap: 2px;
825
+ min-height: 72px;
826
+ }
827
+ .studio-tl-base {
828
+ flex: 0 0 auto;
829
+ width: 56px;
830
+ display: flex;
831
+ align-items: center;
832
+ justify-content: center;
833
+ padding: 0.4rem 0.3rem;
834
+ border: 1px dashed var(--color-border);
835
+ border-radius: 0.375rem;
836
+ background-color: var(--color-surface);
837
+ color: var(--color-fg-muted);
838
+ cursor: pointer;
839
+ font-size: 0.65rem;
840
+ white-space: nowrap;
841
+ }
842
+ .studio-tl-base:hover {
843
+ border-color: var(--color-accent);
844
+ color: var(--color-accent);
845
+ }
846
+ .studio-tl-base.is-selected {
847
+ border-color: var(--color-accent);
848
+ background-color: var(--color-surface-elevated);
849
+ color: var(--color-accent);
850
+ }
851
+ .studio-tl-bar {
852
+ position: relative;
853
+ flex: 0 0 auto;
854
+ padding: 0.4rem 0.5rem;
855
+ padding-right: 16px;
856
+ border: 1px solid var(--color-border);
857
+ border-radius: 0.375rem;
858
+ background: linear-gradient(
859
+ 180deg,
860
+ var(--color-surface),
861
+ var(--color-surface-elevated)
862
+ );
863
+ cursor: pointer;
864
+ overflow: hidden;
865
+ transition:
866
+ border-color 80ms ease-out,
867
+ box-shadow 80ms ease-out;
868
+ }
869
+ .studio-tl-bar:hover {
870
+ border-color: var(--color-accent);
871
+ }
872
+ .studio-tl-bar.is-selected {
873
+ border-color: var(--color-accent);
874
+ }
875
+ .studio-tl-bar.is-active {
876
+ box-shadow: inset 0 0 0 2px var(--color-accent);
877
+ background: linear-gradient(
878
+ 180deg,
879
+ var(--color-surface-elevated),
880
+ var(--color-surface)
881
+ );
882
+ }
883
+ .studio-tl-bar-main {
884
+ display: flex;
885
+ flex-direction: column;
886
+ gap: 0.15rem;
887
+ overflow: hidden;
888
+ pointer-events: none;
889
+ }
890
+ .studio-tl-bar-label {
891
+ font-size: 0.75rem;
892
+ font-weight: 600;
893
+ overflow: hidden;
894
+ text-overflow: ellipsis;
895
+ white-space: nowrap;
896
+ }
897
+ .studio-tl-bar-meta {
898
+ display: flex;
899
+ gap: 0.3rem;
900
+ font-family: var(--font-mono);
901
+ font-size: 0.6rem;
902
+ color: var(--color-fg-muted);
903
+ }
904
+ .studio-tl-bar-duration {
905
+ color: var(--color-accent);
906
+ font-weight: 600;
907
+ }
908
+ .studio-tl-bar-marks {
909
+ font-size: 0.65rem;
910
+ display: flex;
911
+ gap: 0.3rem;
912
+ color: var(--color-fg-muted);
913
+ }
914
+ .studio-tl-bar-actions {
915
+ position: absolute;
916
+ top: 2px;
917
+ right: 16px;
918
+ display: none;
919
+ gap: 0.1rem;
920
+ }
921
+ .studio-tl-bar:hover .studio-tl-bar-actions {
922
+ display: flex;
923
+ }
924
+ .studio-tl-bar-actions button {
925
+ background: rgba(255, 255, 255, 0.85);
926
+ border: 1px solid var(--color-border);
927
+ color: var(--color-fg-muted);
928
+ border-radius: 3px;
929
+ cursor: pointer;
930
+ font-size: 0.65rem;
931
+ padding: 0 0.25rem;
932
+ line-height: 1.4;
933
+ }
934
+ :root.dark .studio-tl-bar-actions button {
935
+ background: rgba(0, 0, 0, 0.5);
936
+ }
937
+ .studio-tl-bar-actions button:hover {
938
+ border-color: var(--color-accent);
939
+ color: var(--color-accent);
940
+ }
941
+ .studio-tl-bar-actions button[data-delete]:hover {
942
+ border-color: #ef4444;
943
+ color: #ef4444;
944
+ }
945
+ .studio-tl-bar-handle {
946
+ position: absolute;
947
+ top: 0;
948
+ right: 0;
949
+ bottom: 0;
950
+ width: 12px;
951
+ display: flex;
952
+ align-items: center;
953
+ justify-content: center;
954
+ cursor: col-resize;
955
+ color: var(--color-fg-muted);
956
+ font-size: 0.6rem;
957
+ background: linear-gradient(
958
+ 90deg,
959
+ transparent,
960
+ var(--color-surface-elevated)
961
+ );
962
+ user-select: none;
963
+ }
964
+ .studio-tl-bar-handle:hover {
965
+ color: var(--color-accent);
966
+ background: linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.15));
967
+ }
968
+ .studio-tl-total {
969
+ margin-top: 0.3rem;
970
+ padding: 0.2rem 0.4rem;
971
+ font-family: var(--font-mono);
972
+ font-size: 0.7rem;
973
+ color: var(--color-fg-muted);
974
+ }
975
+ .studio-tl-empty {
976
+ padding: 0.5rem;
977
+ color: var(--color-fg-muted);
978
+ font-size: 0.75rem;
979
+ }
980
+ .studio-color-note {
981
+ color: var(--color-fg-muted);
982
+ font-family: var(--font-mono);
983
+ font-size: 0.6rem;
984
+ margin-left: 0.3rem;
985
+ }
986
+ .studio-color-field .studio-color-row {
987
+ display: grid;
988
+ grid-template-columns: 1.5rem 2.25rem 1fr auto;
989
+ gap: 0.4rem;
990
+ align-items: center;
991
+ }
992
+ .studio-color-preview {
993
+ display: inline-block;
994
+ width: 1.5rem;
995
+ height: 1.5rem;
996
+ border-radius: 4px;
997
+ border: 1px solid var(--color-border);
998
+ }
999
+ .studio-color-field input[type="color"] {
1000
+ width: 2.25rem;
1001
+ height: 1.6rem;
1002
+ padding: 0;
1003
+ border: 1px solid var(--color-border);
1004
+ border-radius: 4px;
1005
+ background: var(--color-surface);
1006
+ cursor: pointer;
1007
+ }
1008
+ .studio-color-field input[type="color"]::-webkit-color-swatch-wrapper {
1009
+ padding: 2px;
1010
+ }
1011
+ .studio-color-field input[type="color"]::-webkit-color-swatch {
1012
+ border-radius: 3px;
1013
+ border: none;
1014
+ }
1015
+ .studio-color-field input[type="range"] {
1016
+ width: 100%;
1017
+ margin: 0;
1018
+ accent-color: var(--color-accent);
1019
+ }
1020
+ .studio-color-alpha-label {
1021
+ font-family: var(--font-mono);
1022
+ font-size: 0.7rem;
1023
+ color: var(--color-fg-muted);
1024
+ min-width: 2.5rem;
1025
+ text-align: right;
1026
+ }
1027
+ .studio-canvas-size-row {
1028
+ display: flex;
1029
+ align-items: center;
1030
+ gap: 0.25rem;
1031
+ margin-bottom: 0.4rem;
1032
+ }
1033
+ .studio-canvas-size-input {
1034
+ flex: 1;
1035
+ min-width: 0;
1036
+ padding: 0.2rem 0.35rem;
1037
+ border: 1px solid var(--color-border);
1038
+ border-radius: 0.25rem;
1039
+ background-color: var(--color-surface);
1040
+ color: var(--color-fg);
1041
+ font-size: 0.7rem;
1042
+ font-family: var(--font-mono);
1043
+ }
1044
+ .studio-canvas-size-input:disabled {
1045
+ opacity: 0.5;
1046
+ }
1047
+ .studio-canvas-size-x {
1048
+ color: var(--color-fg-muted);
1049
+ font-size: 0.7rem;
1050
+ flex-shrink: 0;
1051
+ }
1052
+ .studio-tools-hint {
1053
+ font-size: 0.65rem;
1054
+ color: var(--color-fg-muted);
1055
+ margin-top: 0.2rem;
1056
+ line-height: 1.4;
1057
+ }
1058
+ .studio-canvas-wrap.is-drop-target {
1059
+ outline: 2px dashed var(--color-accent);
1060
+ outline-offset: -8px;
1061
+ background-color: rgba(99, 102, 241, 0.08);
1062
+ }
1063
+ .studio-help-table {
1064
+ width: 100%;
1065
+ border-collapse: collapse;
1066
+ font-size: 0.8rem;
1067
+ }
1068
+ .studio-help-table th,
1069
+ .studio-help-table td {
1070
+ padding: 0.35rem 0.5rem;
1071
+ border-bottom: 1px solid var(--color-border);
1072
+ text-align: left;
1073
+ vertical-align: top;
1074
+ }
1075
+ .studio-help-table th {
1076
+ font-family: var(--font-mono);
1077
+ font-weight: 600;
1078
+ color: var(--color-accent);
1079
+ white-space: nowrap;
1080
+ width: 35%;
1081
+ }
1082
+ .studio-props-section-title {
1083
+ font-size: 0.7rem;
1084
+ font-weight: 700;
1085
+ color: var(--color-fg-muted);
1086
+ text-transform: uppercase;
1087
+ letter-spacing: 0.05em;
1088
+ margin: 0.8rem 0 0.4rem;
1089
+ padding-top: 0.5rem;
1090
+ border-top: 1px dashed var(--color-border);
1091
+ }
1092
+
1093
+ .studio-dialog {
1094
+ width: min(640px, 92vw);
1095
+ max-height: 80vh;
1096
+ padding: 0;
1097
+ border: 1px solid var(--color-border);
1098
+ border-radius: 0.5rem;
1099
+ background-color: var(--color-surface);
1100
+ color: var(--color-fg);
1101
+ overflow: hidden;
1102
+ }
1103
+ .studio-dialog[open] {
1104
+ display: flex;
1105
+ flex-direction: column;
1106
+ }
1107
+ .studio-dialog:not([open]) {
1108
+ display: none !important;
1109
+ }
1110
+ .studio-dialog-small {
1111
+ width: min(420px, 92vw);
1112
+ }
1113
+ .studio-dialog::backdrop {
1114
+ background-color: rgba(0, 0, 0, 0.6);
1115
+ backdrop-filter: blur(4px);
1116
+ }
1117
+ .studio-dialog-header {
1118
+ display: flex;
1119
+ justify-content: space-between;
1120
+ align-items: center;
1121
+ padding: 0.6rem 0.85rem;
1122
+ border-bottom: 1px solid var(--color-border);
1123
+ background-color: var(--color-surface-elevated);
1124
+ }
1125
+ .studio-dialog-header h2 {
1126
+ margin: 0;
1127
+ font-size: 1rem;
1128
+ }
1129
+ .studio-dialog-close {
1130
+ background: transparent;
1131
+ border: 1px solid var(--color-border);
1132
+ border-radius: 0.25rem;
1133
+ width: 2rem;
1134
+ height: 2rem;
1135
+ cursor: pointer;
1136
+ color: var(--color-fg);
1137
+ }
1138
+ .studio-dialog-body {
1139
+ flex: 1;
1140
+ padding: 0.85rem;
1141
+ overflow-y: auto;
1142
+ }
1143
+ .studio-dialog-footer {
1144
+ display: flex;
1145
+ justify-content: flex-end;
1146
+ gap: 0.4rem;
1147
+ padding: 0.6rem 0.85rem;
1148
+ border-top: 1px solid var(--color-border);
1149
+ background-color: var(--color-surface-elevated);
1150
+ }
1151
+ .studio-library-list {
1152
+ list-style: none;
1153
+ padding: 0;
1154
+ margin: 0;
1155
+ }
1156
+ .studio-library-item {
1157
+ display: flex;
1158
+ justify-content: space-between;
1159
+ align-items: center;
1160
+ padding: 0.5rem 0.75rem;
1161
+ margin-bottom: 0.3rem;
1162
+ border: 1px solid var(--color-border);
1163
+ border-radius: 0.375rem;
1164
+ cursor: pointer;
1165
+ }
1166
+ .studio-library-item:hover {
1167
+ border-color: var(--color-accent);
1168
+ }
1169
+ .studio-library-empty {
1170
+ text-align: center;
1171
+ color: var(--color-fg-muted);
1172
+ padding: 1.5rem 0;
1173
+ }
1174
+ .studio-asset-search {
1175
+ width: 100%;
1176
+ padding: 0.45rem 0.7rem;
1177
+ border: 1px solid var(--color-border);
1178
+ border-radius: 0.4rem;
1179
+ background-color: var(--color-surface);
1180
+ color: var(--color-fg);
1181
+ font-size: 0.85rem;
1182
+ margin-bottom: 0.4rem;
1183
+ }
1184
+ .studio-asset-search:focus {
1185
+ outline: 2px solid var(--color-accent);
1186
+ outline-offset: -1px;
1187
+ }
1188
+ .studio-asset-hint {
1189
+ margin: 0 0 0.6rem;
1190
+ padding: 0.5rem 0.7rem;
1191
+ background-color: color-mix(in srgb, var(--color-accent) 6%, transparent);
1192
+ border-radius: 0.4rem;
1193
+ font-size: 0.75rem;
1194
+ color: var(--color-fg-muted);
1195
+ }
1196
+ .studio-asset-list {
1197
+ list-style: none;
1198
+ padding: 0;
1199
+ margin: 0;
1200
+ display: flex;
1201
+ flex-direction: column;
1202
+ gap: 0.4rem;
1203
+ }
1204
+ .studio-asset-item {
1205
+ display: flex;
1206
+ justify-content: space-between;
1207
+ align-items: center;
1208
+ padding: 0.55rem 0.8rem;
1209
+ border: 1px solid var(--color-border);
1210
+ border-radius: 0.45rem;
1211
+ background-color: var(--color-surface);
1212
+ transition: border-color 120ms ease;
1213
+ cursor: pointer;
1214
+ }
1215
+ .studio-asset-item:hover {
1216
+ border-color: var(--color-accent);
1217
+ background-color: color-mix(
1218
+ in srgb,
1219
+ var(--color-accent) 5%,
1220
+ var(--color-surface)
1221
+ );
1222
+ }
1223
+ .studio-asset-item-main {
1224
+ flex: 1;
1225
+ min-width: 0;
1226
+ }
1227
+ .studio-asset-item-name {
1228
+ font-weight: 600;
1229
+ font-size: 0.92rem;
1230
+ color: var(--color-fg);
1231
+ }
1232
+ .studio-asset-item-meta {
1233
+ font-size: 0.72rem;
1234
+ color: var(--color-fg-muted);
1235
+ font-family: var(--font-mono);
1236
+ margin-top: 0.15rem;
1237
+ }
1238
+ .studio-asset-item-desc {
1239
+ font-size: 0.78rem;
1240
+ color: var(--color-fg-muted);
1241
+ margin-top: 0.2rem;
1242
+ }
1243
+ .studio-asset-item-actions {
1244
+ display: flex;
1245
+ gap: 0.3rem;
1246
+ flex-shrink: 0;
1247
+ }
1248
+ .studio-asset-empty {
1249
+ text-align: center;
1250
+ color: var(--color-fg-muted);
1251
+ padding: 1.5rem 0;
1252
+ font-size: 0.85rem;
1253
+ }
1254
+ .studio-new-error {
1255
+ margin-top: 0.5rem;
1256
+ color: #ef4444;
1257
+ font-size: 0.75rem;
1258
+ }
1259
+ .studio-step-action-row {
1260
+ display: grid;
1261
+ grid-template-columns: 1fr auto;
1262
+ gap: 0.35rem;
1263
+ padding: 0.4rem;
1264
+ border: 1px solid var(--color-border);
1265
+ border-radius: 0.3rem;
1266
+ margin-bottom: 0.4rem;
1267
+ background-color: var(--color-surface);
1268
+ }
1269
+ .studio-step-action-summary {
1270
+ font-family: var(--font-mono);
1271
+ font-size: 0.7rem;
1272
+ }
1273
+ .studio-add-action-bar {
1274
+ display: flex;
1275
+ gap: 0.3rem;
1276
+ align-items: center;
1277
+ padding-top: 0.4rem;
1278
+ border-top: 1px solid var(--color-border);
1279
+ margin-top: 0.5rem;
1280
+ }
1281
+ .studio-step-hint {
1282
+ display: inline-block;
1283
+ padding: 0.2rem 0.5rem;
1284
+ background-color: var(--color-accent);
1285
+ color: white;
1286
+ font-size: 0.7rem;
1287
+ font-weight: 600;
1288
+ border-radius: 0.25rem;
1289
+ }
1290
+ .studio-step-hint-row {
1291
+ margin-bottom: 0.5rem;
1292
+ }
1293
+ .studio-prop-badge {
1294
+ margin-left: 0.3rem;
1295
+ padding: 0.05rem 0.3rem;
1296
+ background-color: var(--color-accent);
1297
+ color: white;
1298
+ font-size: 0.6rem;
1299
+ border-radius: 3px;
1300
+ display: inline-flex;
1301
+ align-items: center;
1302
+ gap: 0.2rem;
1303
+ }
1304
+ .studio-prop-badge button {
1305
+ background: transparent;
1306
+ border: none;
1307
+ color: white;
1308
+ cursor: pointer;
1309
+ padding: 0;
1310
+ font-size: 0.7rem;
1311
+ }
1312
+ .studio-keyframe-summary {
1313
+ padding: 0.3rem 0.4rem;
1314
+ border: 1px solid var(--color-border);
1315
+ border-radius: 0.25rem;
1316
+ margin-bottom: 0.25rem;
1317
+ font-size: 0.75rem;
1318
+ }
1319
+ .studio-keyframe-summary code {
1320
+ display: inline-block;
1321
+ padding: 0.05rem 0.3rem;
1322
+ background-color: var(--color-surface-elevated);
1323
+ border-radius: 3px;
1324
+ font-size: 0.65rem;
1325
+ margin-right: 0.2rem;
1326
+ }
1327
+ .studio-add-effect-bar {
1328
+ display: grid;
1329
+ grid-template-columns: 1fr 1fr auto;
1330
+ gap: 0.3rem;
1331
+ padding-top: 0.4rem;
1332
+ border-top: 1px solid var(--color-border);
1333
+ margin-top: 0.5rem;
1334
+ }
1335
+ .studio-add-effect-bar select {
1336
+ padding: 0.25rem;
1337
+ border: 1px solid var(--color-border);
1338
+ border-radius: 0.25rem;
1339
+ background-color: var(--color-surface);
1340
+ color: var(--color-fg);
1341
+ font-size: 0.75rem;
1342
+ }
1343
+ .studio-timeline-step-duration {
1344
+ font-family: var(--font-mono);
1345
+ font-size: 0.65rem;
1346
+ color: var(--color-fg-muted);
1347
+ margin-bottom: 0.25rem;
1348
+ }
1349
+ .studio-timeline-total {
1350
+ padding: 0.3rem 0.5rem;
1351
+ font-family: var(--font-mono);
1352
+ font-size: 0.7rem;
1353
+ color: var(--color-fg-muted);
1354
+ align-self: center;
1355
+ border-left: 1px dashed var(--color-border);
1356
+ margin-left: 0.3rem;
1357
+ }
1358
+ .studio-element-tracks {
1359
+ min-height: 0;
1360
+ }
1361
+ .studio-el-tracks-table {
1362
+ border-collapse: collapse;
1363
+ font-size: 0.7rem;
1364
+ width: 100%;
1365
+ }
1366
+ .studio-el-tracks-table th,
1367
+ .studio-el-tracks-table td {
1368
+ border: 1px solid var(--color-border);
1369
+ padding: 0.2rem 0.3rem;
1370
+ text-align: center;
1371
+ background-color: var(--color-surface);
1372
+ }
1373
+ .studio-el-tracks-table thead th {
1374
+ background-color: var(--color-surface-elevated);
1375
+ font-weight: 600;
1376
+ cursor: pointer;
1377
+ min-width: 36px;
1378
+ }
1379
+ .studio-el-tracks-table thead th.is-current {
1380
+ background-color: var(--color-accent);
1381
+ color: white;
1382
+ }
1383
+ .studio-el-track-rowhead {
1384
+ text-align: left !important;
1385
+ font-family: var(--font-mono);
1386
+ font-size: 0.7rem;
1387
+ background-color: var(--color-surface-elevated) !important;
1388
+ cursor: pointer;
1389
+ min-width: 100px;
1390
+ max-width: 180px;
1391
+ }
1392
+ .studio-el-track-type {
1393
+ color: var(--color-fg-muted);
1394
+ font-size: 0.6rem;
1395
+ margin-left: 0.2rem;
1396
+ }
1397
+ .studio-el-track-cell {
1398
+ cursor: pointer;
1399
+ min-width: 36px;
1400
+ height: 24px;
1401
+ }
1402
+ .studio-el-track-cell:hover {
1403
+ background-color: var(--color-surface-elevated) !important;
1404
+ }
1405
+ .studio-el-track-cell.is-current-step {
1406
+ background-color: rgba(99, 102, 241, 0.08) !important;
1407
+ }
1408
+ tr.is-selected-element .studio-el-track-rowhead {
1409
+ background-color: var(--color-accent) !important;
1410
+ color: white;
1411
+ }
1412
+ .studio-el-track-marker {
1413
+ font-size: 0.75rem;
1414
+ margin: 0 1px;
1415
+ }
1416
+ .studio-effect-row {
1417
+ padding: 0.4rem;
1418
+ border: 1px solid var(--color-border);
1419
+ border-radius: 0.3rem;
1420
+ margin-bottom: 0.4rem;
1421
+ background-color: var(--color-surface);
1422
+ }
1423
+ .studio-effect-header {
1424
+ display: flex;
1425
+ justify-content: space-between;
1426
+ align-items: center;
1427
+ margin-bottom: 0.3rem;
1428
+ font-size: 0.78rem;
1429
+ }
1430
+ .studio-canvas-presets {
1431
+ display: grid;
1432
+ grid-template-columns: 1fr 1fr 1fr;
1433
+ gap: 0.3rem;
1434
+ }
1435
+ .studio-preset-btn {
1436
+ display: flex;
1437
+ flex-direction: column;
1438
+ align-items: center;
1439
+ justify-content: center;
1440
+ gap: 0.1rem;
1441
+ padding: 0.4rem 0.3rem;
1442
+ border: 1px solid var(--color-border);
1443
+ border-radius: 0.35rem;
1444
+ background-color: var(--color-surface);
1445
+ color: var(--color-fg-muted);
1446
+ font-size: 0.65rem;
1447
+ cursor: pointer;
1448
+ line-height: 1.1;
1449
+ min-height: 60px;
1450
+ }
1451
+ .studio-preset-btn:hover {
1452
+ border-color: var(--color-accent);
1453
+ color: var(--color-accent);
1454
+ }
1455
+ .studio-preset-thumb {
1456
+ display: block;
1457
+ }
1458
+ .studio-preset-thumb rect {
1459
+ fill: none;
1460
+ stroke: currentColor;
1461
+ stroke-width: 1.5;
1462
+ opacity: 0.55;
1463
+ }
1464
+ .studio-preset-btn:hover .studio-preset-thumb rect {
1465
+ opacity: 1;
1466
+ }
1467
+ .studio-preset-label {
1468
+ font-family: var(--font-mono);
1469
+ font-size: 0.68rem;
1470
+ font-weight: 700;
1471
+ }
1472
+ .studio-preset-sub {
1473
+ font-size: 0.6rem;
1474
+ opacity: 0.7;
1475
+ }
1476
+ .studio-icon-search-input {
1477
+ width: 100%;
1478
+ padding: 0.4rem 0.6rem;
1479
+ border: 1px solid var(--color-border);
1480
+ border-radius: 0.3rem;
1481
+ background-color: var(--color-surface);
1482
+ color: var(--color-fg);
1483
+ margin-bottom: 0.5rem;
1484
+ font-size: 0.85rem;
1485
+ }
1486
+ .studio-icon-cat-bar {
1487
+ display: flex;
1488
+ gap: 0.2rem;
1489
+ margin-bottom: 0.5rem;
1490
+ flex-wrap: wrap;
1491
+ }
1492
+ .studio-icon-cat-btn {
1493
+ padding: 0.25rem 0.55rem;
1494
+ border: 1px solid var(--color-border);
1495
+ border-radius: 0.25rem;
1496
+ background-color: var(--color-surface);
1497
+ color: var(--color-fg-muted);
1498
+ font-size: 0.72rem;
1499
+ cursor: pointer;
1500
+ }
1501
+ .studio-icon-cat-btn.is-active {
1502
+ border-color: var(--color-accent);
1503
+ color: var(--color-accent);
1504
+ background-color: var(--color-surface-elevated);
1505
+ }
1506
+ .studio-icon-grid {
1507
+ display: grid;
1508
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
1509
+ gap: 0.4rem;
1510
+ }
1511
+ .studio-icon-item {
1512
+ display: flex;
1513
+ flex-direction: column;
1514
+ align-items: center;
1515
+ gap: 0.3rem;
1516
+ padding: 0.5rem 0.3rem;
1517
+ border: 1px solid var(--color-border);
1518
+ border-radius: 0.4rem;
1519
+ background-color: var(--color-surface);
1520
+ cursor: pointer;
1521
+ color: var(--color-fg);
1522
+ }
1523
+ .studio-icon-item:hover {
1524
+ border-color: var(--color-accent);
1525
+ background-color: var(--color-surface-elevated);
1526
+ }
1527
+ .studio-icon-item img {
1528
+ width: 36px;
1529
+ height: 36px;
1530
+ object-fit: contain;
1531
+ }
1532
+ .studio-icon-item span {
1533
+ font-size: 0.7rem;
1534
+ text-align: center;
1535
+ }
1536
+ .studio-icon-empty {
1537
+ grid-column: 1 / -1;
1538
+ text-align: center;
1539
+ color: var(--color-fg-muted);
1540
+ padding: 1rem;
1541
+ }
1542
+ .studio-icon-cat-count {
1543
+ margin-left: 0.2rem;
1544
+ padding: 0 0.25rem;
1545
+ background-color: var(--color-surface-elevated);
1546
+ border-radius: 8px;
1547
+ font-size: 0.6rem;
1548
+ font-family: var(--font-mono);
1549
+ color: var(--color-fg-muted);
1550
+ }
1551
+ .studio-icon-cat-btn.is-active .studio-icon-cat-count {
1552
+ background-color: white;
1553
+ color: var(--color-accent);
1554
+ }
1555
+ .studio-icon-result-info {
1556
+ margin-bottom: 0.4rem;
1557
+ font-size: 0.7rem;
1558
+ color: var(--color-fg-muted);
1559
+ }
1560
+ .studio-icon-result-info code {
1561
+ background-color: var(--color-surface-elevated);
1562
+ padding: 0 0.3rem;
1563
+ border-radius: 3px;
1564
+ font-family: var(--font-mono);
1565
+ }
1566
+ .studio-icon-sentinel {
1567
+ text-align: center;
1568
+ padding: 0.6rem;
1569
+ color: var(--color-fg-muted);
1570
+ font-size: 0.7rem;
1571
+ margin-top: 0.4rem;
1572
+ border-top: 1px dashed var(--color-border);
1573
+ }
1574
+ .studio-icon-item img.is-error {
1575
+ opacity: 0.2;
1576
+ filter: grayscale(1);
1577
+ }
1578
+ .studio-icon-item img.is-error::after {
1579
+ content: "?";
1580
+ }
1581
+ .studio-element-list-hint {
1582
+ padding: 0.2rem 0.4rem;
1583
+ font-size: 0.65rem;
1584
+ color: var(--color-fg-muted);
1585
+ font-style: italic;
1586
+ }
1587
+ .studio-element-grip {
1588
+ cursor: grab;
1589
+ color: var(--color-fg-muted);
1590
+ font-size: 0.7rem;
1591
+ padding: 0 0.2rem;
1592
+ user-select: none;
1593
+ }
1594
+ .studio-element-list-item {
1595
+ transition: border-color 80ms ease-out;
1596
+ }
1597
+ .studio-element-list-item.is-dragging {
1598
+ opacity: 0.4;
1599
+ }
1600
+ .studio-element-list-item.is-drop-above {
1601
+ border-top: 2px solid var(--color-accent) !important;
1602
+ }
1603
+ .studio-element-list-item.is-drop-below {
1604
+ border-bottom: 2px solid var(--color-accent) !important;
1605
+ }
1606
+ .studio-element-list-item-label {
1607
+ flex: 1;
1608
+ overflow: hidden;
1609
+ text-overflow: ellipsis;
1610
+ white-space: nowrap;
1611
+ }
1612
+ .studio-asset-split {
1613
+ display: grid;
1614
+ grid-template-columns: 1.2fr 1fr;
1615
+ gap: 0.75rem;
1616
+ align-items: start;
1617
+ }
1618
+ .studio-asset-params {
1619
+ padding: 0.7rem;
1620
+ border: 1px solid var(--color-border);
1621
+ border-radius: 0.45rem;
1622
+ background-color: var(--color-surface);
1623
+ min-height: 200px;
1624
+ }
1625
+ .studio-asset-params-title {
1626
+ margin: 0 0 0.3rem;
1627
+ font-size: 0.95rem;
1628
+ font-weight: 700;
1629
+ }
1630
+ .studio-asset-params-form {
1631
+ display: flex;
1632
+ flex-direction: column;
1633
+ gap: 0.4rem;
1634
+ margin: 0.5rem 0;
1635
+ }
1636
+ .studio-asset-params-form .studio-field-color {
1637
+ display: grid;
1638
+ grid-template-columns: 1fr auto 7em;
1639
+ gap: 0.35rem;
1640
+ align-items: center;
1641
+ }
1642
+ .studio-asset-params-form .studio-field-checkbox {
1643
+ display: flex;
1644
+ align-items: center;
1645
+ gap: 0.35rem;
1646
+ }
1647
+ .studio-field-point {
1648
+ display: grid;
1649
+ grid-template-columns: 1fr auto;
1650
+ align-items: center;
1651
+ gap: 0.4rem;
1652
+ margin-bottom: 0.55rem;
1653
+ }
1654
+ .studio-field-point-inputs {
1655
+ display: inline-flex;
1656
+ gap: 0.3rem;
1657
+ }
1658
+ .studio-field-point-inputs input {
1659
+ width: 5em;
1660
+ }
1661
+ .studio-asset-param-help {
1662
+ display: block;
1663
+ margin-top: 0.15rem;
1664
+ font-size: 0.7rem;
1665
+ color: var(--color-fg-muted);
1666
+ font-weight: 400;
1667
+ }
1668
+ .studio-asset-param-group {
1669
+ border: 1px solid var(--color-border);
1670
+ border-radius: 0.4rem;
1671
+ padding: 0.4rem 0.6rem;
1672
+ }
1673
+ .studio-asset-param-group > summary {
1674
+ cursor: pointer;
1675
+ font-weight: 600;
1676
+ font-size: 0.82rem;
1677
+ color: var(--color-fg);
1678
+ }
1679
+ .studio-asset-param-group-body {
1680
+ padding-top: 0.4rem;
1681
+ display: flex;
1682
+ flex-direction: column;
1683
+ gap: 0.4rem;
1684
+ }
1685
+ .studio-asset-item.is-active {
1686
+ border-color: var(--color-accent);
1687
+ background-color: color-mix(
1688
+ in srgb,
1689
+ var(--color-accent) 8%,
1690
+ var(--color-surface)
1691
+ );
1692
+ }
1693
+ .studio-tl-ruler {
1694
+ position: relative;
1695
+ width: 100%;
1696
+ height: 24px;
1697
+ border-bottom: 1px solid var(--color-border);
1698
+ background-color: color-mix(in srgb, var(--color-fg) 3%, transparent);
1699
+ font-family: var(--font-mono);
1700
+ font-size: 0.65rem;
1701
+ color: var(--color-fg-muted);
1702
+ }
1703
+ .studio-tl-ruler-mark {
1704
+ position: absolute;
1705
+ top: 0;
1706
+ bottom: 0;
1707
+ border-left: 1px solid color-mix(in srgb, var(--color-fg) 12%, transparent);
1708
+ padding-left: 3px;
1709
+ padding-top: 2px;
1710
+ white-space: nowrap;
1711
+ }
1712
+ .studio-tl-chapter-row {
1713
+ position: relative;
1714
+ width: 100%;
1715
+ height: 44px;
1716
+ border-bottom: 1px solid var(--color-border);
1717
+ background-color: color-mix(in srgb, var(--color-accent) 4%, transparent);
1718
+ user-select: none;
1719
+ cursor: crosshair;
1720
+ }
1721
+ .studio-tl-chapter-marker {
1722
+ position: absolute;
1723
+ top: 0;
1724
+ bottom: 0;
1725
+ width: 2px;
1726
+ cursor: ew-resize;
1727
+ }
1728
+ .studio-tl-chapter-line {
1729
+ width: 2px;
1730
+ height: 100%;
1731
+ background-color: var(--color-accent);
1732
+ }
1733
+ .studio-tl-chapter-label {
1734
+ position: absolute;
1735
+ top: 4px;
1736
+ left: 6px;
1737
+ font-size: 0.72rem;
1738
+ font-weight: 700;
1739
+ color: var(--color-accent);
1740
+ background-color: var(--color-surface-elevated);
1741
+ padding: 0.05rem 0.35rem;
1742
+ border-radius: 0.25rem;
1743
+ border: 1px solid var(--color-border);
1744
+ white-space: nowrap;
1745
+ pointer-events: none;
1746
+ }
1747
+ .studio-tl-chapter-marker.is-selected .studio-tl-chapter-line {
1748
+ background-color: #ef4444;
1749
+ width: 3px;
1750
+ }
1751
+ .studio-tl-chapter-marker.is-selected .studio-tl-chapter-label {
1752
+ background-color: #ef4444;
1753
+ color: #fff;
1754
+ border-color: #b91c1c;
1755
+ }
1756
+ .studio-tl-playhead {
1757
+ position: absolute;
1758
+ top: 0;
1759
+ bottom: 0;
1760
+ width: 2px;
1761
+ background-color: #ef4444;
1762
+ pointer-events: none;
1763
+ z-index: 5;
1764
+ }
1765
+ .studio-tl-playhead::before {
1766
+ content: "";
1767
+ position: absolute;
1768
+ top: -2px;
1769
+ left: -5px;
1770
+ border-left: 6px solid transparent;
1771
+ border-right: 6px solid transparent;
1772
+ border-top: 8px solid #ef4444;
1773
+ }
1774
+ .studio-tl-total {
1775
+ padding: 0.4rem 0.7rem;
1776
+ font-size: 0.7rem;
1777
+ color: var(--color-fg-muted);
1778
+ font-family: var(--font-mono);
1779
+ border-bottom: 1px solid var(--color-border);
1780
+ }
1781
+ .studio-tl-empty {
1782
+ padding: 1rem;
1783
+ color: var(--color-fg-muted);
1784
+ font-size: 0.85rem;
1785
+ text-align: center;
1786
+ }
1787
+ .studio-tl-element-row {
1788
+ border-bottom: 1px solid var(--color-border);
1789
+ min-height: 36px;
1790
+ cursor: pointer;
1791
+ }
1792
+ .studio-tl-element-row.is-selected .studio-tl-gutter,
1793
+ .studio-tl-element-row.is-selected .studio-tl-body {
1794
+ background-color: color-mix(
1795
+ in srgb,
1796
+ var(--color-accent) 8%,
1797
+ var(--color-surface-elevated)
1798
+ );
1799
+ }
1800
+ .studio-tl-element-label {
1801
+ font-size: 0.78rem;
1802
+ color: var(--color-fg);
1803
+ }
1804
+ .studio-tl-element-track {
1805
+ position: relative;
1806
+ width: 100%;
1807
+ height: 32px;
1808
+ user-select: none;
1809
+ }
1810
+ .studio-tl-appearance {
1811
+ position: absolute;
1812
+ top: 4px;
1813
+ height: 24px;
1814
+ background-color: color-mix(
1815
+ in srgb,
1816
+ var(--color-accent) 25%,
1817
+ var(--color-surface)
1818
+ );
1819
+ border: 1px solid var(--color-accent);
1820
+ border-radius: 4px;
1821
+ cursor: move;
1822
+ font-family: var(--font-mono);
1823
+ font-size: 0.65rem;
1824
+ color: var(--color-fg);
1825
+ display: flex;
1826
+ align-items: center;
1827
+ overflow: hidden;
1828
+ }
1829
+ .studio-tl-ap-edge {
1830
+ position: absolute;
1831
+ top: 0;
1832
+ bottom: 0;
1833
+ width: 6px;
1834
+ cursor: ew-resize;
1835
+ background-color: var(--color-accent);
1836
+ opacity: 0;
1837
+ transition: opacity 100ms;
1838
+ }
1839
+ .studio-tl-appearance:hover .studio-tl-ap-edge {
1840
+ opacity: 0.5;
1841
+ }
1842
+ .studio-tl-ap-edge-left {
1843
+ left: 0;
1844
+ }
1845
+ .studio-tl-ap-edge-right {
1846
+ right: 0;
1847
+ }
1848
+ .studio-tl-ap-label {
1849
+ padding: 0 8px;
1850
+ pointer-events: none;
1851
+ white-space: nowrap;
1852
+ }
1853
+ .studio-tl-keyframe {
1854
+ position: absolute;
1855
+ top: 50%;
1856
+ transform: translate(-50%, -50%);
1857
+ color: #d97706;
1858
+ font-size: 0.85rem;
1859
+ cursor: ew-resize;
1860
+ user-select: none;
1861
+ padding: 0 2px;
1862
+ border-radius: 2px;
1863
+ }
1864
+ .studio-tl-keyframe:hover {
1865
+ color: #b45309;
1866
+ background-color: color-mix(in srgb, #d97706 18%, transparent);
1867
+ }
1868
+ .studio-appearance-row,
1869
+ .studio-track-row {
1870
+ border: 1px solid var(--color-border);
1871
+ border-radius: 0.4rem;
1872
+ padding: 0.4rem;
1873
+ margin-bottom: 0.4rem;
1874
+ background-color: var(--color-surface);
1875
+ }
1876
+ .studio-appearance-row-head,
1877
+ .studio-track-row-head {
1878
+ display: flex;
1879
+ align-items: center;
1880
+ gap: 0.4rem;
1881
+ margin-bottom: 0.3rem;
1882
+ font-size: 0.78rem;
1883
+ }
1884
+ .studio-appearance-row-title,
1885
+ .studio-track-row-prop {
1886
+ font-family: var(--font-mono);
1887
+ font-weight: 700;
1888
+ color: var(--color-fg);
1889
+ flex: 1;
1890
+ }
1891
+ .studio-track-row-count {
1892
+ font-size: 0.7rem;
1893
+ color: var(--color-fg-muted);
1894
+ font-family: var(--font-mono);
1895
+ }
1896
+ .studio-track-list {
1897
+ list-style: none;
1898
+ margin: 0;
1899
+ padding: 0;
1900
+ display: flex;
1901
+ flex-direction: column;
1902
+ gap: 0.15rem;
1903
+ font-size: 0.72rem;
1904
+ font-family: var(--font-mono);
1905
+ color: var(--color-fg-muted);
1906
+ }
1907
+ .studio-track-list li {
1908
+ padding: 0.15rem 0.3rem;
1909
+ background-color: color-mix(in srgb, var(--color-fg) 4%, transparent);
1910
+ border-radius: 0.25rem;
1911
+ }
1912
+ .studio-btn-small {
1913
+ padding: 0.2rem 0.45rem;
1914
+ font-size: 0.72rem;
1915
+ }
1916
+ .studio-add-effect-bar {
1917
+ display: flex;
1918
+ gap: 0.35rem;
1919
+ margin-top: 0.4rem;
1920
+ }
1921
+ }