@livepeer-frameworks/streamcrafter-wc 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.
Files changed (81) hide show
  1. package/dist/cjs/components/fw-sc-advanced.js +198 -0
  2. package/dist/cjs/components/fw-sc-advanced.js.map +1 -0
  3. package/dist/cjs/components/fw-sc-compositor.js +116 -0
  4. package/dist/cjs/components/fw-sc-compositor.js.map +1 -0
  5. package/dist/cjs/components/fw-sc-layer-list.js +253 -0
  6. package/dist/cjs/components/fw-sc-layer-list.js.map +1 -0
  7. package/dist/cjs/components/fw-sc-scene-switcher.js +164 -0
  8. package/dist/cjs/components/fw-sc-scene-switcher.js.map +1 -0
  9. package/dist/cjs/components/fw-sc-volume.js +183 -0
  10. package/dist/cjs/components/fw-sc-volume.js.map +1 -0
  11. package/dist/cjs/components/fw-streamcrafter.js +508 -0
  12. package/dist/cjs/components/fw-streamcrafter.js.map +1 -0
  13. package/dist/cjs/controllers/ingest-controller-host.js +236 -0
  14. package/dist/cjs/controllers/ingest-controller-host.js.map +1 -0
  15. package/dist/cjs/define.js +25 -0
  16. package/dist/cjs/define.js.map +1 -0
  17. package/dist/cjs/icons/index.js +283 -0
  18. package/dist/cjs/icons/index.js.map +1 -0
  19. package/dist/cjs/index.js +38 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +33 -0
  22. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +1 -0
  23. package/dist/cjs/styles/shared-styles.js +2019 -0
  24. package/dist/cjs/styles/shared-styles.js.map +1 -0
  25. package/dist/cjs/styles/utility-styles.js +182 -0
  26. package/dist/cjs/styles/utility-styles.js.map +1 -0
  27. package/dist/esm/components/fw-sc-advanced.js +198 -0
  28. package/dist/esm/components/fw-sc-advanced.js.map +1 -0
  29. package/dist/esm/components/fw-sc-compositor.js +116 -0
  30. package/dist/esm/components/fw-sc-compositor.js.map +1 -0
  31. package/dist/esm/components/fw-sc-layer-list.js +253 -0
  32. package/dist/esm/components/fw-sc-layer-list.js.map +1 -0
  33. package/dist/esm/components/fw-sc-scene-switcher.js +164 -0
  34. package/dist/esm/components/fw-sc-scene-switcher.js.map +1 -0
  35. package/dist/esm/components/fw-sc-volume.js +183 -0
  36. package/dist/esm/components/fw-sc-volume.js.map +1 -0
  37. package/dist/esm/components/fw-streamcrafter.js +508 -0
  38. package/dist/esm/components/fw-streamcrafter.js.map +1 -0
  39. package/dist/esm/controllers/ingest-controller-host.js +234 -0
  40. package/dist/esm/controllers/ingest-controller-host.js.map +1 -0
  41. package/dist/esm/define.js +23 -0
  42. package/dist/esm/define.js.map +1 -0
  43. package/dist/esm/icons/index.js +253 -0
  44. package/dist/esm/icons/index.js.map +1 -0
  45. package/dist/esm/index.js +8 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +31 -0
  48. package/dist/esm/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +1 -0
  49. package/dist/esm/styles/shared-styles.js +2017 -0
  50. package/dist/esm/styles/shared-styles.js.map +1 -0
  51. package/dist/esm/styles/utility-styles.js +180 -0
  52. package/dist/esm/styles/utility-styles.js.map +1 -0
  53. package/dist/fw-streamcrafter.iife.js +3121 -0
  54. package/dist/fw-streamcrafter.iife.js.map +1 -0
  55. package/dist/types/components/fw-sc-advanced.d.ts +20 -0
  56. package/dist/types/components/fw-sc-compositor.d.ts +19 -0
  57. package/dist/types/components/fw-sc-layer-list.d.ts +30 -0
  58. package/dist/types/components/fw-sc-scene-switcher.d.ts +23 -0
  59. package/dist/types/components/fw-sc-volume.d.ts +30 -0
  60. package/dist/types/components/fw-streamcrafter.d.ts +49 -0
  61. package/dist/types/controllers/ingest-controller-host.d.ts +77 -0
  62. package/dist/types/define.d.ts +1 -0
  63. package/dist/types/icons/index.d.ts +29 -0
  64. package/dist/types/iife-entry.d.ts +11 -0
  65. package/dist/types/index.d.ts +12 -0
  66. package/dist/types/styles/shared-styles.d.ts +1 -0
  67. package/dist/types/styles/utility-styles.d.ts +1 -0
  68. package/package.json +55 -0
  69. package/src/components/fw-sc-advanced.ts +221 -0
  70. package/src/components/fw-sc-compositor.ts +162 -0
  71. package/src/components/fw-sc-layer-list.ts +251 -0
  72. package/src/components/fw-sc-scene-switcher.ts +163 -0
  73. package/src/components/fw-sc-volume.ts +171 -0
  74. package/src/components/fw-streamcrafter.ts +515 -0
  75. package/src/controllers/ingest-controller-host.ts +358 -0
  76. package/src/define.ts +23 -0
  77. package/src/icons/index.ts +291 -0
  78. package/src/iife-entry.ts +11 -0
  79. package/src/index.ts +15 -0
  80. package/src/styles/shared-styles.ts +2014 -0
  81. package/src/styles/utility-styles.ts +177 -0
@@ -0,0 +1,2014 @@
1
+ // AUTO-GENERATED — do not edit. Run `pnpm run build:css` to regenerate.
2
+ // Source: packages/core/src/styles/streamcrafter.css
3
+ import { css } from "lit";
4
+
5
+ export const sharedStyles = css`
6
+ /**
7
+ * StreamCrafter CSS
8
+ * Wrapped in @layer fw-streamcrafter for cascade isolation.
9
+ * Host app unlayered styles will always take precedence.
10
+ *
11
+ * Import this file in your application:
12
+ * import '@livepeer-frameworks/streamcrafter-core/styles/streamcrafter.css';
13
+ */
14
+
15
+ /* Declare layer upfront for lowest priority */
16
+ @layer fw-streamcrafter;
17
+
18
+ @layer fw-streamcrafter {
19
+ /* =============================================
20
+ Root Container (with scoped CSS variables)
21
+ ============================================= */
22
+ .fw-sc-root {
23
+ /* Tokyo Night color tokens - scoped to component */
24
+ --tn-bg-dark: 240 15% 10%; /* #16161e - Darkest surface */
25
+ --tn-bg: 235 19% 13%; /* #1a1b26 - Main background */
26
+ --tn-bg-highlight: 229 24% 19%; /* #24283b - Elevated surfaces */
27
+
28
+ --tn-fg: 229 73% 86%; /* #c0caf5 - Primary text */
29
+ --tn-fg-dark: 229 35% 75%; /* #a9b1d6 - Secondary text */
30
+ --tn-fg-gutter: 229 24% 31%; /* #3b4261 - Borders, seams */
31
+ --tn-comment: 229 23% 44%; /* #565f89 - Comments, muted */
32
+
33
+ --tn-blue: 225 86% 70%; /* #7aa2f7 - Primary actions */
34
+ --tn-green: 89 51% 61%; /* #9ece6a - Success, live */
35
+ --tn-red: 349 89% 72%; /* #f7768e - Destructive, errors */
36
+ --tn-yellow: 36 66% 64%; /* #e0af68 - Warnings */
37
+ --tn-purple: 264 85% 74%; /* #bb9af7 - Special */
38
+ --tn-cyan: 197 95% 74%; /* #7dcfff - Info */
39
+
40
+ /* Component styles */
41
+ background: hsl(var(--tn-bg-dark));
42
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
43
+ font-family:
44
+ system-ui,
45
+ -apple-system,
46
+ BlinkMacSystemFont,
47
+ "Segoe UI",
48
+ Roboto,
49
+ sans-serif;
50
+ font-size: 14px;
51
+ line-height: 1.5;
52
+ color: hsl(var(--tn-fg));
53
+ /* Allow root to take full height of parent and manage its children */
54
+ height: 100%;
55
+ min-height: 500px;
56
+ display: flex;
57
+ flex-direction: column;
58
+
59
+ overflow: hidden; /* Prevent content from overflowing the root container */
60
+
61
+ /* Container query support for responsive layout */
62
+ container-type: inline-size;
63
+ container-name: streamcrafter;
64
+ }
65
+
66
+ /* Dev mode - flex layout for side panel */
67
+ .fw-sc-root--devmode {
68
+ display: flex;
69
+ flex-direction: row;
70
+ }
71
+
72
+ /* Main content wrapper */
73
+ .fw-sc-main {
74
+ display: flex;
75
+ flex-direction: column;
76
+ min-width: 0;
77
+ /* Occupy remaining vertical space in root */
78
+ flex: 1;
79
+ overflow: hidden; /* Manage internal overflow */
80
+ }
81
+
82
+ /* Content area (preview + mixer) - responsive layout */
83
+ .fw-sc-content {
84
+ display: flex;
85
+ flex-direction: column;
86
+ flex: 1; /* Occupy remaining vertical space in fw-sc-main */
87
+ min-height: 0; /* Allow flex item to shrink below content size */
88
+ }
89
+
90
+ /* Preview wrapper for flex sizing */
91
+ .fw-sc-preview-wrapper {
92
+ display: flex;
93
+ flex-direction: column;
94
+ }
95
+
96
+ /* Mixer panel class for responsive targeting */
97
+ .fw-sc-mixer {
98
+ /* Default: takes full width below preview */
99
+ }
100
+
101
+ /* =============================================
102
+ Responsive Layout: Mixer on Right (Wide Screens)
103
+ Uses container queries for container-aware layout
104
+ ============================================= */
105
+ @container streamcrafter (min-width: 600px) {
106
+ .fw-sc-content {
107
+ flex-direction: row;
108
+ align-items: stretch; /* Ensure full height */
109
+ }
110
+
111
+ .fw-sc-preview-wrapper {
112
+ flex: 1;
113
+ min-width: 0;
114
+ /* Center preview vertically if needed */
115
+ display: flex;
116
+ flex-direction: column;
117
+ justify-content: center;
118
+ background: black;
119
+ }
120
+
121
+ .fw-sc-mixer {
122
+ width: 320px; /* Slightly wider for better ergonomics */
123
+ flex-shrink: 0;
124
+ border-left: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
125
+ border-bottom: none;
126
+ background: hsl(var(--tn-bg));
127
+ display: flex;
128
+ flex-direction: column;
129
+ max-height: none;
130
+ overflow-y: auto;
131
+ transition: width 0.2s ease-out; /* Smooth collapse transition */
132
+ }
133
+
134
+ /* Collapsed state for sidebar mixer */
135
+ .fw-sc-mixer.fw-sc-section--collapsed {
136
+ width: 48px; /* Collapsed width */
137
+ overflow-x: hidden; /* Hide overflowing content */
138
+ }
139
+
140
+ .fw-sc-mixer.fw-sc-section--collapsed .fw-sc-section-header {
141
+ justify-content: center; /* Center icon */
142
+ }
143
+
144
+ .fw-sc-mixer.fw-sc-section--collapsed .fw-sc-section-header span {
145
+ display: none; /* Hide text */
146
+ }
147
+
148
+ .fw-sc-mixer.fw-sc-section--collapsed .fw-sc-section-header svg {
149
+ transform: rotate(0deg) !important; /* Reset chevron rotation */
150
+ }
151
+
152
+ .fw-sc-mixer.fw-sc-section--collapsed .fw-sc-sources {
153
+ display: none; /* Hide source list content */
154
+ }
155
+
156
+ /* Redesign Source Items for Sidebar Context */
157
+ .fw-sc-mixer .fw-sc-source {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 0.5rem;
161
+ padding: 0.375rem 0.5rem;
162
+ background: hsl(var(--tn-bg-highlight) / 0.1);
163
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
164
+ transition: background 0.2s;
165
+ height: 48px;
166
+ }
167
+
168
+ .fw-sc-mixer .fw-sc-source:hover {
169
+ background: hsl(var(--tn-bg-highlight) / 0.3);
170
+ }
171
+
172
+ /* Icon */
173
+ .fw-sc-mixer .fw-sc-source-icon {
174
+ flex: 0 0 auto;
175
+ }
176
+
177
+ /* Name + Type */
178
+ .fw-sc-mixer .fw-sc-source-info {
179
+ flex: 1;
180
+ min-width: 0; /* Enable truncation */
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 0;
184
+ }
185
+
186
+ .fw-sc-mixer .fw-sc-source-label {
187
+ font-size: 0.8rem;
188
+ font-weight: 600;
189
+ }
190
+
191
+ /* Hide the source type in sidebar to save space */
192
+ .fw-sc-mixer .fw-sc-source-type {
193
+ display: none;
194
+ }
195
+
196
+ /* Controls */
197
+ .fw-sc-mixer .fw-sc-source-controls {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 0.25rem;
201
+ margin: 0;
202
+ width: auto;
203
+ }
204
+
205
+ /* Volume Slider fixed width in compact mode */
206
+ .fw-sc-mixer .fw-sc-volume-slider {
207
+ width: 60px;
208
+ flex: 0 0 auto;
209
+ height: 6px;
210
+ }
211
+
212
+ /* Hide the percentage text in this compact view */
213
+ .fw-sc-mixer .fw-sc-volume-label {
214
+ display: none;
215
+ }
216
+ }
217
+
218
+ /* Advanced Panel styling - matches Player DevModePanel */
219
+ .fw-sc-advanced-panel {
220
+ background: hsl(var(--tn-bg));
221
+ border-left: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
222
+ width: 280px;
223
+ flex-shrink: 0;
224
+ display: flex;
225
+ flex-direction: column;
226
+ height: 100%;
227
+ overflow: hidden;
228
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
229
+ font-size: 12px;
230
+ z-index: 40;
231
+ }
232
+
233
+ /* =============================================
234
+ Header Zone
235
+ ============================================= */
236
+ .fw-sc-header {
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: space-between;
240
+ padding: 0.5rem 1rem;
241
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
242
+ background: hsl(var(--tn-bg-highlight) / 0.5);
243
+ }
244
+
245
+ .fw-sc-header-title {
246
+ font-weight: 600;
247
+ text-transform: uppercase;
248
+ letter-spacing: 0.05em;
249
+ font-size: 0.75rem;
250
+ color: hsl(var(--tn-fg-dark));
251
+ }
252
+
253
+ .fw-sc-header-status {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 0.5rem;
257
+ }
258
+
259
+ .fw-sc-header-actions {
260
+ display: flex;
261
+ align-items: center;
262
+ gap: 0.25rem;
263
+ }
264
+
265
+ /* Header Button - visible gear/wrench like Player */
266
+ .fw-sc-header-btn {
267
+ display: flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ width: 28px;
271
+ height: 28px;
272
+ padding: 0;
273
+ border: none;
274
+ border-radius: 4px;
275
+ background: transparent;
276
+ color: hsl(var(--tn-comment));
277
+ cursor: pointer;
278
+ transition: all 0.15s ease;
279
+ }
280
+
281
+ .fw-sc-header-btn:hover {
282
+ background: hsl(var(--tn-bg-highlight));
283
+ color: hsl(var(--tn-fg));
284
+ }
285
+
286
+ .fw-sc-header-btn--active {
287
+ background: hsl(var(--tn-blue) / 0.2);
288
+ color: hsl(var(--tn-blue));
289
+ }
290
+
291
+ .fw-sc-header-btn--active:hover {
292
+ background: hsl(var(--tn-blue) / 0.3);
293
+ color: hsl(var(--tn-blue));
294
+ }
295
+
296
+ /* =============================================
297
+ Video Preview (Flush - No Padding)
298
+ ============================================= */
299
+ .fw-sc-preview {
300
+ position: relative;
301
+ /* Use flex-grow instead of aspect-ratio to fill available height */
302
+ flex: 1;
303
+ background: black;
304
+ overflow: hidden;
305
+ display: flex; /* Make it a flex container for the video */
306
+ align-items: center;
307
+ justify-content: center;
308
+ }
309
+
310
+ .fw-sc-preview video {
311
+ width: 100%;
312
+ height: 100%;
313
+ object-fit: contain; /* Ensure video fits within the preview area */
314
+ }
315
+
316
+ .fw-sc-preview-placeholder {
317
+ position: absolute;
318
+ inset: 0;
319
+ display: flex;
320
+ flex-direction: column;
321
+ align-items: center;
322
+ justify-content: center;
323
+ color: hsl(var(--tn-comment));
324
+ gap: 0.5rem;
325
+ }
326
+
327
+ .fw-sc-preview-placeholder svg {
328
+ width: 48px;
329
+ height: 48px;
330
+ opacity: 0.5;
331
+ }
332
+
333
+ /* =============================================
334
+ Live Badge Overlay
335
+ ============================================= */
336
+ .fw-sc-live-badge {
337
+ position: absolute;
338
+ top: 1rem;
339
+ right: 1rem;
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 0.375rem;
343
+ padding: 0.25rem 0.5rem;
344
+ background: hsl(var(--tn-red));
345
+ color: white;
346
+ font-size: 0.7rem;
347
+ font-weight: 700;
348
+ text-transform: uppercase;
349
+ letter-spacing: 0.05em;
350
+ }
351
+
352
+ .fw-sc-live-badge::before {
353
+ content: "";
354
+ width: 0.5rem;
355
+ height: 0.5rem;
356
+ background: white;
357
+ border-radius: 50%;
358
+ animation: fw-sc-pulse 1.5s infinite;
359
+ }
360
+
361
+ @keyframes fw-sc-pulse {
362
+ 0%,
363
+ 100% {
364
+ opacity: 1;
365
+ }
366
+ 50% {
367
+ opacity: 0.5;
368
+ }
369
+ }
370
+
371
+ /* =============================================
372
+ Status Overlay
373
+ ============================================= */
374
+ .fw-sc-status-overlay {
375
+ position: absolute;
376
+ inset: 0;
377
+ display: flex;
378
+ flex-direction: column;
379
+ align-items: center;
380
+ justify-content: center;
381
+ background: hsl(var(--tn-bg-dark) / 0.9);
382
+ gap: 1rem;
383
+ }
384
+
385
+ .fw-sc-status-spinner {
386
+ width: 32px;
387
+ height: 32px;
388
+ border: 3px solid hsl(var(--tn-fg-gutter) / 0.3);
389
+ border-top-color: hsl(var(--tn-blue));
390
+ border-radius: 50%;
391
+ animation: fw-sc-spin 1s linear infinite;
392
+ }
393
+
394
+ @keyframes fw-sc-spin {
395
+ to {
396
+ transform: rotate(360deg);
397
+ }
398
+ }
399
+
400
+ .fw-sc-status-text {
401
+ font-size: 0.875rem;
402
+ color: hsl(var(--tn-fg-dark));
403
+ }
404
+
405
+ /* =============================================
406
+ VU Meter
407
+ ============================================= */
408
+ .fw-sc-vu-meter {
409
+ height: 8px;
410
+ background: hsl(var(--tn-bg-highlight));
411
+ position: relative;
412
+ overflow: hidden;
413
+ }
414
+
415
+ .fw-sc-vu-meter-fill {
416
+ height: 100%;
417
+ background: linear-gradient(
418
+ to right,
419
+ hsl(var(--tn-green)) 0%,
420
+ hsl(var(--tn-green)) 60%,
421
+ hsl(var(--tn-yellow)) 80%,
422
+ hsl(var(--tn-red)) 100%
423
+ );
424
+ transition: width 50ms ease-out;
425
+ }
426
+
427
+ .fw-sc-vu-meter-peak {
428
+ position: absolute;
429
+ top: 0;
430
+ height: 100%;
431
+ width: 2px;
432
+ background: hsl(var(--tn-fg));
433
+ transition: left 50ms ease-out;
434
+ }
435
+
436
+ /* Vertical VU Meter variant */
437
+ .fw-sc-vu-meter--vertical {
438
+ width: 4px;
439
+ height: 100%;
440
+ background: hsl(var(--tn-bg-highlight));
441
+ }
442
+
443
+ .fw-sc-vu-meter--vertical .fw-sc-vu-meter-fill {
444
+ width: 100%;
445
+ background: linear-gradient(
446
+ to top,
447
+ hsl(var(--tn-green)) 0%,
448
+ hsl(var(--tn-green)) 60%,
449
+ hsl(var(--tn-yellow)) 80%,
450
+ hsl(var(--tn-red)) 100%
451
+ );
452
+ transition: height 50ms ease-out;
453
+ }
454
+
455
+ /* =============================================
456
+ Section (Collapsible Areas)
457
+ ============================================= */
458
+ .fw-sc-section {
459
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
460
+ }
461
+
462
+ .fw-sc-section:last-child {
463
+ border-bottom: none;
464
+ }
465
+
466
+ .fw-sc-section-header {
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: space-between;
470
+ padding: 0.5rem 1rem;
471
+ font-size: 0.7rem;
472
+ font-weight: 600;
473
+ text-transform: uppercase;
474
+ letter-spacing: 0.05em;
475
+ color: hsl(var(--tn-comment));
476
+ cursor: pointer;
477
+ user-select: none;
478
+ background: hsl(var(--tn-bg-highlight) / 0.3);
479
+ }
480
+
481
+ .fw-sc-section-header:hover {
482
+ background: hsl(var(--tn-bg-highlight) / 0.5);
483
+ }
484
+
485
+ .fw-sc-section-header svg {
486
+ width: 14px;
487
+ height: 14px;
488
+ transition: transform 0.2s;
489
+ }
490
+
491
+ .fw-sc-section--collapsed .fw-sc-section-header svg {
492
+ transform: rotate(-90deg);
493
+ }
494
+
495
+ .fw-sc-section-body {
496
+ padding: 0.75rem 1rem;
497
+ }
498
+
499
+ .fw-sc-section-body--flush {
500
+ padding: 0;
501
+ }
502
+
503
+ /* =============================================
504
+ Source List
505
+ ============================================= */
506
+ .fw-sc-sources {
507
+ display: flex;
508
+ flex-direction: column;
509
+ }
510
+
511
+ .fw-sc-source {
512
+ display: flex;
513
+ align-items: center;
514
+ padding: 0.5rem 1rem;
515
+ gap: 0.5rem;
516
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
517
+ }
518
+
519
+ .fw-sc-source:last-child {
520
+ border-bottom: none;
521
+ }
522
+
523
+ .fw-sc-source--hidden {
524
+ opacity: 0.5;
525
+ background: hsl(var(--tn-bg-dark) / 0.3);
526
+ }
527
+
528
+ .fw-sc-source-icon {
529
+ width: 24px;
530
+ height: 24px;
531
+ display: flex;
532
+ align-items: center;
533
+ justify-content: center;
534
+ color: hsl(var(--tn-comment));
535
+ }
536
+
537
+ .fw-sc-source-info {
538
+ flex: 1;
539
+ min-width: 0;
540
+ }
541
+
542
+ .fw-sc-source-label {
543
+ font-size: 0.875rem;
544
+ font-weight: 500;
545
+ overflow: hidden;
546
+ text-overflow: ellipsis;
547
+ white-space: nowrap;
548
+ display: flex;
549
+ align-items: center;
550
+ gap: 0.5rem;
551
+ }
552
+
553
+ .fw-sc-primary-badge {
554
+ font-size: 0.55rem;
555
+ font-weight: 700;
556
+ text-transform: uppercase;
557
+ letter-spacing: 0.05em;
558
+ padding: 0.125rem 0.375rem;
559
+ background: hsl(var(--tn-green) / 0.2);
560
+ color: hsl(var(--tn-green));
561
+ border-radius: 2px;
562
+ }
563
+
564
+ .fw-sc-source-type {
565
+ font-size: 0.7rem;
566
+ color: hsl(var(--tn-comment));
567
+ text-transform: uppercase;
568
+ }
569
+
570
+ .fw-sc-source-controls {
571
+ display: flex;
572
+ align-items: center;
573
+ gap: 0.25rem;
574
+ flex-wrap: wrap; /* Allow items to wrap */
575
+ justify-content: flex-end; /* Align to the right when wrapped */
576
+ }
577
+
578
+ /* =============================================
579
+ Icon Buttons (Small Controls)
580
+ ============================================= */
581
+ .fw-sc-icon-btn {
582
+ width: 28px;
583
+ height: 28px;
584
+ display: flex;
585
+ align-items: center;
586
+ justify-content: center;
587
+ padding: 0;
588
+ border: none;
589
+ border-radius: 4px;
590
+ background: transparent;
591
+ color: hsl(var(--tn-comment));
592
+ cursor: pointer;
593
+ transition:
594
+ background 0.15s,
595
+ color 0.15s;
596
+ }
597
+
598
+ .fw-sc-icon-btn:hover {
599
+ background: hsl(var(--tn-bg-highlight) / 0.5);
600
+ color: hsl(var(--tn-fg));
601
+ }
602
+
603
+ .fw-sc-icon-btn:disabled {
604
+ opacity: 0.5;
605
+ cursor: not-allowed;
606
+ }
607
+
608
+ .fw-sc-icon-btn--active {
609
+ color: hsl(var(--tn-blue));
610
+ }
611
+
612
+ .fw-sc-icon-btn--inactive {
613
+ opacity: 0.45;
614
+ color: hsl(var(--tn-comment));
615
+ }
616
+
617
+ .fw-sc-icon-btn--primary {
618
+ color: hsl(var(--tn-green));
619
+ }
620
+
621
+ .fw-sc-icon-btn--primary:disabled {
622
+ color: hsl(var(--tn-green));
623
+ opacity: 1;
624
+ }
625
+
626
+ .fw-sc-icon-btn--destructive:hover {
627
+ color: hsl(var(--tn-red));
628
+ }
629
+
630
+ .fw-sc-icon-btn--muted {
631
+ color: hsl(var(--tn-comment) / 0.5);
632
+ }
633
+
634
+ .fw-sc-icon-btn svg {
635
+ width: 16px;
636
+ height: 16px;
637
+ }
638
+
639
+ /* =============================================
640
+ Settings Panel
641
+ ============================================= */
642
+ .fw-sc-settings {
643
+ display: flex;
644
+ flex-direction: column;
645
+ gap: 0.5rem;
646
+ }
647
+
648
+ .fw-sc-setting-row {
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: space-between;
652
+ gap: 1rem;
653
+ }
654
+
655
+ .fw-sc-setting-label {
656
+ font-size: 0.875rem;
657
+ color: hsl(var(--tn-fg-dark));
658
+ }
659
+
660
+ .fw-sc-select {
661
+ padding: 0.25rem 0.5rem;
662
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
663
+ border-radius: 4px;
664
+ background: hsl(var(--tn-bg-highlight));
665
+ color: hsl(var(--tn-fg));
666
+ font-size: 0.875rem;
667
+ cursor: pointer;
668
+ }
669
+
670
+ .fw-sc-select:focus {
671
+ outline: none;
672
+ border-color: hsl(var(--tn-blue));
673
+ }
674
+
675
+ /* =============================================
676
+ Action Bar (Bottom Controls)
677
+ ============================================= */
678
+ .fw-sc-actions {
679
+ display: flex;
680
+ border-top: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
681
+ }
682
+
683
+ .fw-sc-actions button {
684
+ padding: 1rem;
685
+ border: none;
686
+ border-radius: 0;
687
+ background: transparent;
688
+ color: hsl(var(--tn-fg));
689
+ font-size: 0.875rem;
690
+ font-weight: 500;
691
+ cursor: pointer;
692
+ transition: background 0.15s;
693
+ border-right: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
694
+ display: flex;
695
+ align-items: center;
696
+ justify-content: center;
697
+ gap: 0.25rem;
698
+ }
699
+
700
+ .fw-sc-actions button:last-child {
701
+ border-right: none;
702
+ }
703
+
704
+ .fw-sc-actions button:hover:not(:disabled) {
705
+ background: hsl(var(--tn-bg-highlight) / 0.5);
706
+ }
707
+
708
+ .fw-sc-actions button:disabled {
709
+ color: hsl(var(--tn-comment));
710
+ cursor: not-allowed;
711
+ }
712
+
713
+ .fw-sc-actions button svg {
714
+ width: 18px;
715
+ height: 18px;
716
+ }
717
+
718
+ /* Secondary actions (Camera, Screen, Settings) - smaller */
719
+ .fw-sc-action-secondary {
720
+ flex: 0 0 auto;
721
+ }
722
+
723
+ .fw-sc-action-secondary--active {
724
+ background: hsl(var(--tn-blue) / 0.2) !important;
725
+ color: hsl(var(--tn-blue)) !important;
726
+ }
727
+
728
+ /* Settings icon rotation on hover */
729
+ .fw-sc-action-secondary .settings-icon-wrapper {
730
+ display: inline-flex;
731
+ transition: transform 0.2s ease;
732
+ }
733
+
734
+ .fw-sc-action-secondary:hover .settings-icon-wrapper {
735
+ transform: rotate(90deg);
736
+ }
737
+
738
+ /* Primary action (Go Live) - takes remaining space */
739
+ .fw-sc-action-primary {
740
+ flex: 1;
741
+ font-weight: 600 !important;
742
+ background: hsl(var(--tn-red)) !important;
743
+ color: white !important;
744
+ }
745
+
746
+ .fw-sc-action-primary:hover:not(:disabled) {
747
+ background: hsl(var(--tn-red) / 0.8) !important;
748
+ }
749
+
750
+ .fw-sc-action-primary:disabled {
751
+ background: hsl(var(--tn-bg-highlight)) !important;
752
+ color: hsl(var(--tn-comment)) !important;
753
+ }
754
+
755
+ /* Stop action (when streaming) */
756
+ .fw-sc-action-stop {
757
+ background: hsl(var(--tn-bg-highlight)) !important;
758
+ }
759
+
760
+ .fw-sc-action-stop:hover:not(:disabled) {
761
+ background: hsl(var(--tn-red) / 0.3) !important;
762
+ }
763
+
764
+ /* =============================================
765
+ Status Badge
766
+ ============================================= */
767
+ .fw-sc-badge {
768
+ display: inline-flex;
769
+ align-items: center;
770
+ gap: 0.25rem;
771
+ padding: 0.125rem 0.5rem;
772
+ font-size: 0.7rem;
773
+ font-weight: 600;
774
+ text-transform: uppercase;
775
+ letter-spacing: 0.025em;
776
+ border-radius: 2px;
777
+ }
778
+
779
+ .fw-sc-badge--idle {
780
+ background: hsl(var(--tn-bg-highlight));
781
+ color: hsl(var(--tn-comment));
782
+ }
783
+
784
+ .fw-sc-badge--ready {
785
+ background: hsl(var(--tn-blue) / 0.2);
786
+ color: hsl(var(--tn-blue));
787
+ }
788
+
789
+ .fw-sc-badge--live {
790
+ background: hsl(var(--tn-red));
791
+ color: white;
792
+ }
793
+
794
+ .fw-sc-badge--connecting {
795
+ background: hsl(var(--tn-yellow) / 0.2);
796
+ color: hsl(var(--tn-yellow));
797
+ }
798
+
799
+ .fw-sc-badge--error {
800
+ background: hsl(var(--tn-red) / 0.2);
801
+ color: hsl(var(--tn-red));
802
+ }
803
+
804
+ /* =============================================
805
+ Volume Slider
806
+ ============================================= */
807
+ .fw-sc-volume-label {
808
+ font-size: 0.65rem;
809
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
810
+ color: hsl(var(--tn-fg-dark));
811
+ min-width: 32px;
812
+ text-align: right;
813
+ font-variant-numeric: tabular-nums;
814
+ }
815
+
816
+ .fw-sc-volume-slider {
817
+ width: 80px; /* Slightly wider by default */
818
+ height: 6px;
819
+ -webkit-appearance: none;
820
+ appearance: none;
821
+ background: hsl(var(--tn-bg-highlight));
822
+ border-radius: 3px;
823
+ cursor: pointer;
824
+ position: relative;
825
+ transition: opacity 0.2s;
826
+ }
827
+
828
+ .fw-sc-volume-slider:hover {
829
+ opacity: 0.9;
830
+ }
831
+
832
+ /* Track fill simulation (Note: WebKit requires JS to update background-size for true fill before thumb,
833
+ but we can use a gradient trick if value is known, or just keep the clean track look) */
834
+
835
+ .fw-sc-volume-slider::-webkit-slider-thumb {
836
+ -webkit-appearance: none;
837
+ width: 14px;
838
+ height: 14px;
839
+ border-radius: 50%;
840
+ background: hsl(var(--tn-fg));
841
+ border: 2px solid hsl(var(--tn-bg)); /* Ring effect */
842
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
843
+ cursor: pointer;
844
+ margin-top: -4px; /* Center thumb on 6px track */
845
+ transition: transform 0.1s;
846
+ }
847
+
848
+ .fw-sc-volume-slider:hover::-webkit-slider-thumb {
849
+ transform: scale(1.1);
850
+ background: white;
851
+ }
852
+
853
+ .fw-sc-volume-slider::-moz-range-thumb {
854
+ width: 14px;
855
+ height: 14px;
856
+ border-radius: 50%;
857
+ background: hsl(var(--tn-fg));
858
+ border: 2px solid hsl(var(--tn-bg));
859
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
860
+ cursor: pointer;
861
+ transition: transform 0.1s;
862
+ }
863
+
864
+ .fw-sc-volume-slider:hover::-moz-range-thumb {
865
+ transform: scale(1.1);
866
+ background: white;
867
+ }
868
+
869
+ /* Boosted state (>100%) - Add a glow */
870
+ .fw-sc-volume-slider--boosted::-webkit-slider-thumb {
871
+ background: hsl(var(--tn-yellow));
872
+ box-shadow: 0 0 5px hsl(var(--tn-yellow) / 0.5);
873
+ }
874
+
875
+ .fw-sc-volume-slider--boosted::-moz-range-thumb {
876
+ background: hsl(var(--tn-yellow));
877
+ box-shadow: 0 0 5px hsl(var(--tn-yellow) / 0.5);
878
+ }
879
+
880
+ /* =============================================
881
+ Error State
882
+ ============================================= */
883
+ .fw-sc-error {
884
+ padding: 1rem;
885
+ background: hsl(var(--tn-red) / 0.1);
886
+ border-left: 3px solid hsl(var(--tn-red));
887
+ }
888
+
889
+ .fw-sc-error-title {
890
+ font-weight: 600;
891
+ color: hsl(var(--tn-red));
892
+ margin-bottom: 0.25rem;
893
+ }
894
+
895
+ .fw-sc-error-message {
896
+ font-size: 0.875rem;
897
+ color: hsl(var(--tn-fg-dark));
898
+ }
899
+
900
+ /* =============================================
901
+ Utility Classes
902
+ ============================================= */
903
+ .fw-sc-hidden {
904
+ display: none !important;
905
+ }
906
+
907
+ .fw-sc-sr-only {
908
+ position: absolute;
909
+ width: 1px;
910
+ height: 1px;
911
+ padding: 0;
912
+ margin: -1px;
913
+ overflow: hidden;
914
+ clip: rect(0, 0, 0, 0);
915
+ white-space: nowrap;
916
+ border: 0;
917
+ }
918
+
919
+ /* =============================================
920
+ Settings Dropdown
921
+ ============================================= */
922
+ .fw-sc-settings-dropdown {
923
+ position: absolute;
924
+ top: calc(100% + 4px);
925
+ right: 0;
926
+ min-width: 200px;
927
+ background: hsl(var(--tn-bg-dark));
928
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
929
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
930
+ z-index: 50;
931
+ overflow: hidden;
932
+ }
933
+
934
+ .fw-sc-dropdown-section {
935
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
936
+ }
937
+
938
+ .fw-sc-dropdown-section:last-child {
939
+ border-bottom: none;
940
+ }
941
+
942
+ .fw-sc-dropdown-label {
943
+ padding: 0.5rem 0.75rem 0.25rem;
944
+ font-size: 0.65rem;
945
+ font-weight: 600;
946
+ text-transform: uppercase;
947
+ letter-spacing: 0.05em;
948
+ color: hsl(var(--tn-comment));
949
+ }
950
+
951
+ .fw-sc-dropdown-options {
952
+ display: flex;
953
+ flex-direction: column;
954
+ padding: 0 0.25rem 0.5rem;
955
+ }
956
+
957
+ .fw-sc-dropdown-option {
958
+ display: flex;
959
+ flex-direction: column;
960
+ align-items: flex-start;
961
+ gap: 0;
962
+ padding: 0.375rem 0.5rem;
963
+ margin: 0;
964
+ border: none;
965
+ border-radius: 4px;
966
+ background: transparent;
967
+ color: hsl(var(--tn-fg));
968
+ cursor: pointer;
969
+ text-align: left;
970
+ width: 100%;
971
+ transition: background 0.15s;
972
+ }
973
+
974
+ .fw-sc-dropdown-option:hover:not(:disabled) {
975
+ background: hsl(var(--tn-bg-highlight) / 0.5);
976
+ }
977
+
978
+ .fw-sc-dropdown-option:disabled {
979
+ opacity: 0.5;
980
+ cursor: not-allowed;
981
+ }
982
+
983
+ .fw-sc-dropdown-option--active {
984
+ background: hsl(var(--tn-blue) / 0.2);
985
+ }
986
+
987
+ .fw-sc-dropdown-option--active:hover:not(:disabled) {
988
+ background: hsl(var(--tn-blue) / 0.3);
989
+ }
990
+
991
+ .fw-sc-dropdown-option-label {
992
+ font-size: 0.875rem;
993
+ font-weight: 500;
994
+ }
995
+
996
+ .fw-sc-dropdown-option-desc {
997
+ font-size: 0.7rem;
998
+ color: hsl(var(--tn-comment));
999
+ }
1000
+
1001
+ .fw-sc-dropdown-info {
1002
+ padding: 0.25rem 0.75rem 0.5rem;
1003
+ }
1004
+
1005
+ .fw-sc-dropdown-info-row {
1006
+ display: flex;
1007
+ justify-content: space-between;
1008
+ align-items: center;
1009
+ padding: 0.25rem 0;
1010
+ font-size: 0.75rem;
1011
+ color: hsl(var(--tn-fg-dark));
1012
+ }
1013
+
1014
+ .fw-sc-dropdown-info-value {
1015
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1016
+ color: hsl(var(--tn-fg));
1017
+ }
1018
+
1019
+ /* =============================================
1020
+ Context Menu
1021
+ ============================================= */
1022
+ .fw-sc-context-menu {
1023
+ position: fixed;
1024
+ min-width: 160px;
1025
+ background: hsl(var(--tn-bg-dark));
1026
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1027
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
1028
+ z-index: 100;
1029
+ overflow: hidden;
1030
+ }
1031
+
1032
+ .fw-sc-context-menu-item {
1033
+ display: flex;
1034
+ align-items: center;
1035
+ gap: 0.5rem;
1036
+ padding: 0.5rem 0.75rem;
1037
+ font-size: 0.875rem;
1038
+ color: hsl(var(--tn-fg));
1039
+ cursor: pointer;
1040
+ background: transparent;
1041
+ border: none;
1042
+ width: 100%;
1043
+ text-align: left;
1044
+ transition:
1045
+ background 0.15s,
1046
+ color 0.15s;
1047
+ }
1048
+
1049
+ .fw-sc-context-menu-item:hover {
1050
+ background: hsl(var(--tn-bg-highlight) / 0.7);
1051
+ color: hsl(var(--tn-fg));
1052
+ }
1053
+
1054
+ .fw-sc-context-menu-item--destructive {
1055
+ color: hsl(var(--tn-red));
1056
+ }
1057
+
1058
+ .fw-sc-context-menu-item--destructive:hover {
1059
+ background: hsl(var(--tn-red) / 0.15);
1060
+ color: hsl(var(--tn-red));
1061
+ }
1062
+
1063
+ .fw-sc-context-menu-separator {
1064
+ height: 1px;
1065
+ background: hsl(var(--tn-fg-gutter) / 0.3);
1066
+ margin: 0.25rem 0;
1067
+ }
1068
+
1069
+ .fw-sc-context-menu-label {
1070
+ padding: 0.375rem 0.75rem;
1071
+ font-size: 0.65rem;
1072
+ font-weight: 600;
1073
+ text-transform: uppercase;
1074
+ letter-spacing: 0.05em;
1075
+ color: hsl(var(--tn-comment));
1076
+ }
1077
+
1078
+ /* =============================================
1079
+ Compositor Controls (Phase 3)
1080
+ ============================================= */
1081
+ .fw-sc-compositor-controls {
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1085
+ }
1086
+
1087
+ .fw-sc-compositor-controls--disabled,
1088
+ .fw-sc-compositor-controls--loading {
1089
+ padding: 1rem;
1090
+ }
1091
+
1092
+ .fw-sc-compositor-enable {
1093
+ text-align: center;
1094
+ }
1095
+
1096
+ .fw-sc-compositor-enable p {
1097
+ font-size: 0.875rem;
1098
+ color: hsl(var(--tn-fg-dark));
1099
+ margin-bottom: 0.75rem;
1100
+ }
1101
+
1102
+ .fw-sc-compositor-enable-btn {
1103
+ padding: 0.5rem 1rem;
1104
+ border: 1px solid hsl(var(--tn-blue));
1105
+ border-radius: 4px;
1106
+ background: hsl(var(--tn-blue) / 0.1);
1107
+ color: hsl(var(--tn-blue));
1108
+ font-size: 0.875rem;
1109
+ font-weight: 500;
1110
+ cursor: pointer;
1111
+ transition: background 0.15s;
1112
+ }
1113
+
1114
+ .fw-sc-compositor-enable-btn:hover {
1115
+ background: hsl(var(--tn-blue) / 0.2);
1116
+ }
1117
+
1118
+ .fw-sc-compositor-loading {
1119
+ text-align: center;
1120
+ color: hsl(var(--tn-comment));
1121
+ font-size: 0.875rem;
1122
+ }
1123
+
1124
+ .fw-sc-compositor-header {
1125
+ display: flex;
1126
+ align-items: center;
1127
+ justify-content: space-between;
1128
+ padding: 0.5rem 1rem;
1129
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1130
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1131
+ }
1132
+
1133
+ .fw-sc-compositor-info {
1134
+ display: flex;
1135
+ align-items: center;
1136
+ gap: 0.75rem;
1137
+ }
1138
+
1139
+ .fw-sc-compositor-title {
1140
+ font-size: 0.7rem;
1141
+ font-weight: 600;
1142
+ text-transform: uppercase;
1143
+ letter-spacing: 0.05em;
1144
+ color: hsl(var(--tn-comment));
1145
+ }
1146
+
1147
+ .fw-sc-compositor-renderer {
1148
+ font-size: 0.7rem;
1149
+ color: hsl(var(--tn-fg-dark));
1150
+ }
1151
+
1152
+ .fw-sc-compositor-stats-inline {
1153
+ font-size: 0.65rem;
1154
+ color: hsl(var(--tn-fg-gutter));
1155
+ font-family:
1156
+ ui-monospace,
1157
+ SFMono-Regular,
1158
+ SF Mono,
1159
+ Menlo,
1160
+ Consolas,
1161
+ monospace;
1162
+ margin-left: 0.5rem;
1163
+ }
1164
+
1165
+ .fw-sc-compositor-disable-btn {
1166
+ width: 24px;
1167
+ height: 24px;
1168
+ display: flex;
1169
+ align-items: center;
1170
+ justify-content: center;
1171
+ padding: 0;
1172
+ border: none;
1173
+ border-radius: 4px;
1174
+ background: transparent;
1175
+ color: hsl(var(--tn-comment));
1176
+ cursor: pointer;
1177
+ transition: all 0.15s;
1178
+ }
1179
+
1180
+ .fw-sc-compositor-disable-btn:hover {
1181
+ background: hsl(var(--tn-red) / 0.2);
1182
+ color: hsl(var(--tn-red));
1183
+ }
1184
+
1185
+ .fw-sc-compositor-stats {
1186
+ display: flex;
1187
+ align-items: center;
1188
+ gap: 1rem;
1189
+ padding: 0.25rem 1rem;
1190
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1191
+ font-size: 0.7rem;
1192
+ color: hsl(var(--tn-fg-dark));
1193
+ background: hsl(var(--tn-bg-dark) / 0.5);
1194
+ }
1195
+
1196
+ .fw-sc-stat {
1197
+ color: hsl(var(--tn-cyan));
1198
+ }
1199
+
1200
+ /* =============================================
1201
+ Compositor Actions (Header Right Side)
1202
+ ============================================= */
1203
+ .fw-sc-compositor-actions {
1204
+ display: flex;
1205
+ align-items: center;
1206
+ gap: 0.5rem;
1207
+ }
1208
+
1209
+ .fw-sc-scaling-mode-select {
1210
+ padding: 0.25rem 0.5rem;
1211
+ font-size: 0.7rem;
1212
+ background: hsl(var(--tn-bg-dark));
1213
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1214
+ border-radius: 4px;
1215
+ color: hsl(var(--tn-fg));
1216
+ cursor: pointer;
1217
+ }
1218
+
1219
+ .fw-sc-scaling-mode-select:hover {
1220
+ border-color: hsl(var(--tn-fg-gutter) / 0.5);
1221
+ }
1222
+
1223
+ /* =============================================
1224
+ Compositor Sources (Simplified)
1225
+ ============================================= */
1226
+ .fw-sc-compositor-sources {
1227
+ padding: 0.5rem;
1228
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1229
+ }
1230
+
1231
+ .fw-sc-section-label {
1232
+ font-size: 0.65rem;
1233
+ font-weight: 600;
1234
+ text-transform: uppercase;
1235
+ letter-spacing: 0.05em;
1236
+ color: hsl(var(--tn-comment));
1237
+ margin-bottom: 0.5rem;
1238
+ padding-left: 0.5rem;
1239
+ }
1240
+
1241
+ .fw-sc-source-list {
1242
+ display: flex;
1243
+ flex-direction: column;
1244
+ gap: 0.25rem;
1245
+ }
1246
+
1247
+ .fw-sc-source-row {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ gap: 0.5rem;
1251
+ padding: 0.375rem 0.5rem;
1252
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1253
+ border-radius: 4px;
1254
+ transition: opacity 0.15s;
1255
+ }
1256
+
1257
+ .fw-sc-source-row--hidden {
1258
+ opacity: 0.4;
1259
+ }
1260
+
1261
+ .fw-sc-visibility-btn {
1262
+ width: 24px;
1263
+ height: 24px;
1264
+ display: flex;
1265
+ align-items: center;
1266
+ justify-content: center;
1267
+ padding: 0;
1268
+ border: none;
1269
+ border-radius: 4px;
1270
+ background: transparent;
1271
+ color: hsl(var(--tn-fg-dark));
1272
+ cursor: pointer;
1273
+ transition: all 0.15s;
1274
+ }
1275
+
1276
+ .fw-sc-visibility-btn:hover {
1277
+ background: hsl(var(--tn-bg-highlight));
1278
+ color: hsl(var(--tn-fg));
1279
+ }
1280
+
1281
+ .fw-sc-source-icon {
1282
+ display: flex;
1283
+ align-items: center;
1284
+ color: hsl(var(--tn-comment));
1285
+ }
1286
+
1287
+ .fw-sc-source-label {
1288
+ flex: 1;
1289
+ font-size: 0.8rem;
1290
+ color: hsl(var(--tn-fg));
1291
+ overflow: hidden;
1292
+ text-overflow: ellipsis;
1293
+ white-space: nowrap;
1294
+ }
1295
+
1296
+ /* =============================================
1297
+ Layout Presets (Grid)
1298
+ ============================================= */
1299
+ .fw-sc-layout-presets {
1300
+ padding: 0.5rem;
1301
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1302
+ }
1303
+
1304
+ .fw-sc-layout-grid {
1305
+ display: grid;
1306
+ grid-template-columns: repeat(6, 1fr);
1307
+ gap: 0.25rem;
1308
+ }
1309
+
1310
+ .fw-sc-layout-btn {
1311
+ aspect-ratio: 1;
1312
+ display: flex;
1313
+ align-items: center;
1314
+ justify-content: center;
1315
+ padding: 0;
1316
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1317
+ border-radius: 4px;
1318
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1319
+ color: hsl(var(--tn-fg-dark));
1320
+ cursor: pointer;
1321
+ transition: all 0.15s;
1322
+ }
1323
+
1324
+ .fw-sc-layout-btn:hover {
1325
+ background: hsl(var(--tn-bg-highlight));
1326
+ border-color: hsl(var(--tn-fg-gutter) / 0.5);
1327
+ }
1328
+
1329
+ .fw-sc-layout-btn--active {
1330
+ background: hsl(var(--tn-blue) / 0.2);
1331
+ border-color: hsl(var(--tn-blue) / 0.5);
1332
+ color: hsl(var(--tn-blue));
1333
+ }
1334
+
1335
+ .fw-sc-layout-btn--disabled,
1336
+ .fw-sc-layout-btn:disabled {
1337
+ opacity: 0.3;
1338
+ cursor: not-allowed;
1339
+ }
1340
+
1341
+ .fw-sc-layout-btn--disabled:hover,
1342
+ .fw-sc-layout-btn:disabled:hover {
1343
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1344
+ border-color: hsl(var(--tn-fg-gutter) / 0.3);
1345
+ }
1346
+
1347
+ /* Legacy layout preset buttons (for backwards compat) */
1348
+ .fw-sc-layout-presets-label {
1349
+ font-size: 0.7rem;
1350
+ font-weight: 600;
1351
+ text-transform: uppercase;
1352
+ letter-spacing: 0.05em;
1353
+ color: hsl(var(--tn-comment));
1354
+ }
1355
+
1356
+ .fw-sc-layout-preset-buttons {
1357
+ display: flex;
1358
+ gap: 0.25rem;
1359
+ }
1360
+
1361
+ .fw-sc-layout-preset-btn {
1362
+ width: 32px;
1363
+ height: 28px;
1364
+ display: flex;
1365
+ align-items: center;
1366
+ justify-content: center;
1367
+ padding: 0;
1368
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1369
+ border-radius: 4px;
1370
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1371
+ color: hsl(var(--tn-fg-dark));
1372
+ font-size: 0.75rem;
1373
+ cursor: pointer;
1374
+ transition: all 0.15s;
1375
+ }
1376
+
1377
+ .fw-sc-layout-preset-btn:hover {
1378
+ background: hsl(var(--tn-bg-highlight));
1379
+ border-color: hsl(var(--tn-fg-gutter) / 0.5);
1380
+ }
1381
+
1382
+ .fw-sc-layout-preset-btn--active {
1383
+ background: hsl(var(--tn-blue) / 0.2);
1384
+ border-color: hsl(var(--tn-blue) / 0.5);
1385
+ color: hsl(var(--tn-blue));
1386
+ }
1387
+
1388
+ .fw-sc-layout-preset-btn--disabled,
1389
+ .fw-sc-layout-preset-btn:disabled {
1390
+ opacity: 0.3;
1391
+ cursor: not-allowed;
1392
+ }
1393
+
1394
+ .fw-sc-layout-preset-btn--disabled:hover,
1395
+ .fw-sc-layout-preset-btn:disabled:hover {
1396
+ background: transparent;
1397
+ border-color: hsl(var(--tn-fg-gutter) / 0.3);
1398
+ }
1399
+
1400
+ /* =============================================
1401
+ Scene Switcher
1402
+ ============================================= */
1403
+ .fw-sc-scene-switcher {
1404
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1405
+ }
1406
+
1407
+ .fw-sc-scene-switcher-header {
1408
+ display: flex;
1409
+ align-items: center;
1410
+ justify-content: space-between;
1411
+ padding: 0.5rem 1rem;
1412
+ }
1413
+
1414
+ .fw-sc-scene-switcher-title {
1415
+ font-size: 0.7rem;
1416
+ font-weight: 600;
1417
+ text-transform: uppercase;
1418
+ letter-spacing: 0.05em;
1419
+ color: hsl(var(--tn-comment));
1420
+ }
1421
+
1422
+ .fw-sc-transition-controls {
1423
+ display: flex;
1424
+ align-items: center;
1425
+ gap: 0.5rem;
1426
+ }
1427
+
1428
+ .fw-sc-transition-select {
1429
+ padding: 0.25rem 0.5rem;
1430
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1431
+ border-radius: 4px;
1432
+ background: hsl(var(--tn-bg-highlight));
1433
+ color: hsl(var(--tn-fg));
1434
+ font-size: 0.75rem;
1435
+ cursor: pointer;
1436
+ }
1437
+
1438
+ .fw-sc-transition-select:focus {
1439
+ outline: none;
1440
+ border-color: hsl(var(--tn-blue));
1441
+ }
1442
+
1443
+ .fw-sc-transition-duration {
1444
+ width: 60px;
1445
+ padding: 0.25rem 0.5rem;
1446
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1447
+ border-radius: 4px;
1448
+ background: hsl(var(--tn-bg-highlight));
1449
+ color: hsl(var(--tn-fg));
1450
+ font-size: 0.75rem;
1451
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1452
+ }
1453
+
1454
+ .fw-sc-transition-duration:focus {
1455
+ outline: none;
1456
+ border-color: hsl(var(--tn-blue));
1457
+ }
1458
+
1459
+ .fw-sc-transition-unit {
1460
+ font-size: 0.7rem;
1461
+ color: hsl(var(--tn-comment));
1462
+ }
1463
+
1464
+ .fw-sc-scene-list {
1465
+ display: flex;
1466
+ gap: 0.5rem;
1467
+ padding: 0 1rem 0.75rem;
1468
+ overflow-x: auto;
1469
+ }
1470
+
1471
+ .fw-sc-scene-item {
1472
+ position: relative;
1473
+ display: flex;
1474
+ flex-direction: column;
1475
+ align-items: flex-start;
1476
+ padding: 0.5rem 0.75rem;
1477
+ min-width: 100px;
1478
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1479
+ border-radius: 4px;
1480
+ background: hsl(var(--tn-bg-highlight));
1481
+ color: hsl(var(--tn-fg));
1482
+ cursor: pointer;
1483
+ transition: all 0.15s;
1484
+ }
1485
+
1486
+ .fw-sc-scene-item:hover {
1487
+ border-color: hsl(var(--tn-fg-gutter) / 0.5);
1488
+ }
1489
+
1490
+ .fw-sc-scene-item--active {
1491
+ border-color: hsl(var(--tn-green));
1492
+ box-shadow: 0 0 0 1px hsl(var(--tn-green) / 0.3);
1493
+ }
1494
+
1495
+ .fw-sc-scene-item--transitioning {
1496
+ opacity: 0.7;
1497
+ pointer-events: none;
1498
+ }
1499
+
1500
+ .fw-sc-scene-name {
1501
+ font-size: 0.875rem;
1502
+ font-weight: 500;
1503
+ }
1504
+
1505
+ .fw-sc-scene-layer-count {
1506
+ font-size: 0.7rem;
1507
+ color: hsl(var(--tn-comment));
1508
+ }
1509
+
1510
+ .fw-sc-scene-delete {
1511
+ position: absolute;
1512
+ top: 2px;
1513
+ right: 2px;
1514
+ width: 18px;
1515
+ height: 18px;
1516
+ display: flex;
1517
+ align-items: center;
1518
+ justify-content: center;
1519
+ padding: 0;
1520
+ border: none;
1521
+ border-radius: 2px;
1522
+ background: transparent;
1523
+ color: hsl(var(--tn-comment));
1524
+ font-size: 14px;
1525
+ cursor: pointer;
1526
+ opacity: 0;
1527
+ transition: all 0.15s;
1528
+ }
1529
+
1530
+ .fw-sc-scene-item:hover .fw-sc-scene-delete {
1531
+ opacity: 1;
1532
+ }
1533
+
1534
+ .fw-sc-scene-delete:hover {
1535
+ background: hsl(var(--tn-red) / 0.2);
1536
+ color: hsl(var(--tn-red));
1537
+ }
1538
+
1539
+ .fw-sc-scene-add {
1540
+ display: flex;
1541
+ align-items: center;
1542
+ justify-content: center;
1543
+ min-width: 40px;
1544
+ padding: 0.5rem;
1545
+ border: 1px dashed hsl(var(--tn-fg-gutter) / 0.5);
1546
+ border-radius: 4px;
1547
+ background: transparent;
1548
+ color: hsl(var(--tn-comment));
1549
+ font-size: 1.25rem;
1550
+ cursor: pointer;
1551
+ transition: all 0.15s;
1552
+ }
1553
+
1554
+ .fw-sc-scene-add:hover {
1555
+ border-color: hsl(var(--tn-blue));
1556
+ color: hsl(var(--tn-blue));
1557
+ background: hsl(var(--tn-blue) / 0.1);
1558
+ }
1559
+
1560
+ /* New Scene Input */
1561
+ .fw-sc-new-scene-input {
1562
+ display: flex;
1563
+ gap: 0.5rem;
1564
+ padding: 0.5rem 1rem;
1565
+ background: hsl(var(--tn-bg-dark) / 0.5);
1566
+ }
1567
+
1568
+ .fw-sc-new-scene-input input {
1569
+ flex: 1;
1570
+ padding: 0.375rem 0.5rem;
1571
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1572
+ border-radius: 4px;
1573
+ background: hsl(var(--tn-bg-highlight));
1574
+ color: hsl(var(--tn-fg));
1575
+ font-size: 0.875rem;
1576
+ }
1577
+
1578
+ .fw-sc-new-scene-input input:focus {
1579
+ outline: none;
1580
+ border-color: hsl(var(--tn-blue));
1581
+ }
1582
+
1583
+ .fw-sc-new-scene-input button {
1584
+ padding: 0.375rem 0.75rem;
1585
+ border: none;
1586
+ border-radius: 4px;
1587
+ background: hsl(var(--tn-blue));
1588
+ color: white;
1589
+ font-size: 0.75rem;
1590
+ font-weight: 500;
1591
+ cursor: pointer;
1592
+ transition: background 0.15s;
1593
+ }
1594
+
1595
+ .fw-sc-new-scene-input button:hover {
1596
+ background: hsl(var(--tn-blue) / 0.8);
1597
+ }
1598
+
1599
+ .fw-sc-new-scene-input button:last-child {
1600
+ background: hsl(var(--tn-bg-highlight));
1601
+ color: hsl(var(--tn-fg-dark));
1602
+ }
1603
+
1604
+ .fw-sc-new-scene-input button:last-child:hover {
1605
+ background: hsl(var(--tn-bg-highlight) / 0.8);
1606
+ }
1607
+
1608
+ /* =============================================
1609
+ Layer List
1610
+ ============================================= */
1611
+ .fw-sc-layer-list {
1612
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1613
+ }
1614
+
1615
+ .fw-sc-layer-list-header {
1616
+ display: flex;
1617
+ align-items: center;
1618
+ justify-content: space-between;
1619
+ padding: 0.5rem 1rem;
1620
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1621
+ }
1622
+
1623
+ .fw-sc-layer-list-title {
1624
+ font-size: 0.7rem;
1625
+ font-weight: 600;
1626
+ text-transform: uppercase;
1627
+ letter-spacing: 0.05em;
1628
+ color: hsl(var(--tn-comment));
1629
+ }
1630
+
1631
+ .fw-sc-layer-count {
1632
+ font-size: 0.7rem;
1633
+ color: hsl(var(--tn-fg-dark));
1634
+ background: hsl(var(--tn-bg-highlight));
1635
+ padding: 0.125rem 0.375rem;
1636
+ border-radius: 8px;
1637
+ }
1638
+
1639
+ .fw-sc-layer-items {
1640
+ display: flex;
1641
+ flex-direction: column;
1642
+ }
1643
+
1644
+ .fw-sc-layer-empty {
1645
+ padding: 1rem;
1646
+ text-align: center;
1647
+ color: hsl(var(--tn-comment));
1648
+ font-size: 0.875rem;
1649
+ }
1650
+
1651
+ .fw-sc-layer-item {
1652
+ display: flex;
1653
+ align-items: center;
1654
+ gap: 0.5rem;
1655
+ padding: 0.5rem 1rem;
1656
+ border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.15);
1657
+ cursor: pointer;
1658
+ transition: background 0.15s;
1659
+ }
1660
+
1661
+ .fw-sc-layer-item:last-child {
1662
+ border-bottom: none;
1663
+ }
1664
+
1665
+ .fw-sc-layer-item:hover {
1666
+ background: hsl(var(--tn-bg-highlight) / 0.3);
1667
+ }
1668
+
1669
+ .fw-sc-layer-item--selected {
1670
+ background: hsl(var(--tn-blue) / 0.1);
1671
+ }
1672
+
1673
+ .fw-sc-layer-item--selected:hover {
1674
+ background: hsl(var(--tn-blue) / 0.15);
1675
+ }
1676
+
1677
+ .fw-sc-layer-item--dragging {
1678
+ opacity: 0.5;
1679
+ }
1680
+
1681
+ .fw-sc-layer-item--drag-over {
1682
+ border-top: 2px solid hsl(var(--tn-blue));
1683
+ }
1684
+
1685
+ .fw-sc-layer-item--hidden {
1686
+ opacity: 0.5;
1687
+ }
1688
+
1689
+ .fw-sc-layer-visibility {
1690
+ width: 24px;
1691
+ height: 24px;
1692
+ display: flex;
1693
+ align-items: center;
1694
+ justify-content: center;
1695
+ padding: 0;
1696
+ border: none;
1697
+ border-radius: 4px;
1698
+ background: transparent;
1699
+ color: hsl(var(--tn-comment));
1700
+ cursor: pointer;
1701
+ transition: all 0.15s;
1702
+ }
1703
+
1704
+ .fw-sc-layer-visibility:hover {
1705
+ background: hsl(var(--tn-bg-highlight));
1706
+ }
1707
+
1708
+ .fw-sc-layer-visibility--visible {
1709
+ color: hsl(var(--tn-fg));
1710
+ }
1711
+
1712
+ .fw-sc-layer-icon {
1713
+ font-size: 1rem;
1714
+ }
1715
+
1716
+ .fw-sc-layer-name {
1717
+ flex: 1;
1718
+ font-size: 0.875rem;
1719
+ overflow: hidden;
1720
+ text-overflow: ellipsis;
1721
+ white-space: nowrap;
1722
+ }
1723
+
1724
+ .fw-sc-layer-opacity {
1725
+ display: flex;
1726
+ align-items: center;
1727
+ gap: 0.5rem;
1728
+ margin-right: 0.5rem;
1729
+ }
1730
+
1731
+ .fw-sc-layer-opacity input[type="range"] {
1732
+ width: 60px;
1733
+ height: 4px;
1734
+ -webkit-appearance: none;
1735
+ appearance: none;
1736
+ background: hsl(var(--tn-bg-highlight));
1737
+ border-radius: 2px;
1738
+ cursor: pointer;
1739
+ }
1740
+
1741
+ .fw-sc-layer-opacity input[type="range"]::-webkit-slider-thumb {
1742
+ -webkit-appearance: none;
1743
+ width: 12px;
1744
+ height: 12px;
1745
+ border-radius: 50%;
1746
+ background: hsl(var(--tn-fg));
1747
+ cursor: pointer;
1748
+ }
1749
+
1750
+ .fw-sc-layer-opacity input[type="range"]::-moz-range-thumb {
1751
+ width: 12px;
1752
+ height: 12px;
1753
+ border-radius: 50%;
1754
+ background: hsl(var(--tn-fg));
1755
+ border: none;
1756
+ cursor: pointer;
1757
+ }
1758
+
1759
+ .fw-sc-layer-opacity span {
1760
+ font-size: 0.7rem;
1761
+ color: hsl(var(--tn-fg-dark));
1762
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1763
+ min-width: 32px;
1764
+ }
1765
+
1766
+ .fw-sc-layer-controls {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ gap: 0.125rem;
1770
+ }
1771
+
1772
+ .fw-sc-layer-btn {
1773
+ width: 24px;
1774
+ height: 24px;
1775
+ display: flex;
1776
+ align-items: center;
1777
+ justify-content: center;
1778
+ padding: 0;
1779
+ border: none;
1780
+ border-radius: 4px;
1781
+ background: transparent;
1782
+ color: hsl(var(--tn-comment));
1783
+ font-size: 0.875rem;
1784
+ cursor: pointer;
1785
+ transition: all 0.15s;
1786
+ }
1787
+
1788
+ .fw-sc-layer-btn:hover:not(:disabled) {
1789
+ background: hsl(var(--tn-bg-highlight));
1790
+ color: hsl(var(--tn-fg));
1791
+ }
1792
+
1793
+ .fw-sc-layer-btn:disabled {
1794
+ opacity: 0.3;
1795
+ cursor: not-allowed;
1796
+ }
1797
+
1798
+ .fw-sc-layer-btn--active {
1799
+ background: hsl(var(--tn-blue) / 0.2);
1800
+ color: hsl(var(--tn-blue));
1801
+ }
1802
+
1803
+ .fw-sc-layer-btn--danger:hover:not(:disabled) {
1804
+ background: hsl(var(--tn-red) / 0.2);
1805
+ color: hsl(var(--tn-red));
1806
+ }
1807
+
1808
+ /* ============================================================================
1809
+ * Compact Layout Overlay
1810
+ * ============================================================================ */
1811
+
1812
+ .fw-sc-layout-overlay {
1813
+ position: absolute;
1814
+ bottom: 8px;
1815
+ left: 50%;
1816
+ transform: translateX(-50%);
1817
+ z-index: 20;
1818
+ display: flex;
1819
+ flex-direction: column;
1820
+ align-items: center;
1821
+ gap: 4px;
1822
+ opacity: 0.7;
1823
+ transition: opacity 0.2s ease;
1824
+ }
1825
+
1826
+ .fw-sc-layout-overlay:hover,
1827
+ .fw-sc-layout-overlay--expanded {
1828
+ opacity: 1;
1829
+ }
1830
+
1831
+ .fw-sc-layout-bar {
1832
+ display: flex;
1833
+ align-items: center;
1834
+ gap: 2px;
1835
+ padding: 4px 6px;
1836
+ background: hsl(var(--tn-bg-dark) / 0.9);
1837
+ backdrop-filter: blur(8px);
1838
+ border-radius: 6px;
1839
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1840
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1841
+ }
1842
+
1843
+ .fw-sc-layout-icons,
1844
+ .fw-sc-scaling-icons {
1845
+ display: flex;
1846
+ align-items: center;
1847
+ gap: 1px;
1848
+ }
1849
+
1850
+ .fw-sc-layout-icon {
1851
+ width: 22px;
1852
+ height: 22px;
1853
+ display: flex;
1854
+ align-items: center;
1855
+ justify-content: center;
1856
+ padding: 0;
1857
+ border: none;
1858
+ border-radius: 4px;
1859
+ background: transparent;
1860
+ color: hsl(var(--tn-fg-dark));
1861
+ cursor: pointer;
1862
+ transition: all 0.15s ease;
1863
+ }
1864
+
1865
+ .fw-sc-layout-icon:hover {
1866
+ background: hsl(var(--tn-bg-highlight));
1867
+ color: hsl(var(--tn-fg));
1868
+ }
1869
+
1870
+ .fw-sc-layout-icon--active {
1871
+ background: hsl(var(--tn-blue) / 0.2);
1872
+ color: hsl(var(--tn-blue));
1873
+ }
1874
+
1875
+ .fw-sc-layout-icon--active:hover {
1876
+ background: hsl(var(--tn-blue) / 0.3);
1877
+ }
1878
+
1879
+ .fw-sc-layout-separator {
1880
+ width: 1px;
1881
+ height: 14px;
1882
+ background: hsl(var(--tn-fg-gutter) / 0.5);
1883
+ margin: 0 4px;
1884
+ }
1885
+
1886
+ .fw-sc-layout-stats {
1887
+ font-size: 0.65rem;
1888
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1889
+ color: hsl(var(--tn-fg-dark));
1890
+ white-space: nowrap;
1891
+ padding: 0 2px;
1892
+ }
1893
+
1894
+ /* Source chips (expanded on hover) */
1895
+ .fw-sc-layout-sources {
1896
+ display: flex;
1897
+ align-items: center;
1898
+ gap: 4px;
1899
+ padding: 4px 6px;
1900
+ background: hsl(var(--tn-bg-dark) / 0.9);
1901
+ backdrop-filter: blur(8px);
1902
+ border-radius: 6px;
1903
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1904
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1905
+ }
1906
+
1907
+ .fw-sc-source-chip {
1908
+ display: flex;
1909
+ align-items: center;
1910
+ gap: 4px;
1911
+ padding: 3px 8px;
1912
+ border: none;
1913
+ border-radius: 4px;
1914
+ background: hsl(var(--tn-bg-highlight));
1915
+ color: hsl(var(--tn-fg));
1916
+ font-size: 0.7rem;
1917
+ cursor: pointer;
1918
+ transition: all 0.15s ease;
1919
+ }
1920
+
1921
+ .fw-sc-source-chip:hover {
1922
+ background: hsl(var(--tn-bg-highlight) / 1.5);
1923
+ }
1924
+
1925
+ .fw-sc-source-chip--hidden {
1926
+ background: hsl(var(--tn-bg-dark));
1927
+ color: hsl(var(--tn-comment));
1928
+ opacity: 0.6;
1929
+ }
1930
+
1931
+ .fw-sc-source-chip--hidden:hover {
1932
+ opacity: 0.9;
1933
+ }
1934
+
1935
+ .fw-sc-source-chip-icon {
1936
+ font-size: 0.75rem;
1937
+ }
1938
+
1939
+ .fw-sc-source-chip-label {
1940
+ max-width: 80px;
1941
+ overflow: hidden;
1942
+ text-overflow: ellipsis;
1943
+ white-space: nowrap;
1944
+ }
1945
+
1946
+ /* ============================================================================
1947
+ * Layout Bar Sections & Labels
1948
+ * ============================================================================ */
1949
+
1950
+ .fw-sc-layout-section {
1951
+ display: flex;
1952
+ align-items: center;
1953
+ gap: 4px;
1954
+ }
1955
+
1956
+ .fw-sc-layout-label {
1957
+ font-size: 0.6rem;
1958
+ font-weight: 500;
1959
+ text-transform: uppercase;
1960
+ letter-spacing: 0.05em;
1961
+ color: hsl(var(--tn-comment));
1962
+ padding: 0 4px;
1963
+ }
1964
+
1965
+ /* ============================================================================
1966
+ * Custom Instant Tooltips
1967
+ * ============================================================================ */
1968
+
1969
+ .fw-sc-tooltip-wrapper {
1970
+ position: relative;
1971
+ display: inline-flex;
1972
+ }
1973
+
1974
+ .fw-sc-tooltip {
1975
+ position: absolute;
1976
+ bottom: calc(100% + 8px);
1977
+ left: 50%;
1978
+ transform: translateX(-50%);
1979
+ padding: 4px 8px;
1980
+ background: hsl(var(--tn-bg-dark));
1981
+ border: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
1982
+ border-radius: 4px;
1983
+ font-size: 0.7rem;
1984
+ font-weight: 500;
1985
+ color: hsl(var(--tn-fg));
1986
+ white-space: nowrap;
1987
+ z-index: 100;
1988
+ pointer-events: none;
1989
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1990
+ }
1991
+
1992
+ .fw-sc-tooltip::after {
1993
+ content: "";
1994
+ position: absolute;
1995
+ top: 100%;
1996
+ left: 50%;
1997
+ transform: translateX(-50%);
1998
+ border: 5px solid transparent;
1999
+ border-top-color: hsl(var(--tn-fg-gutter) / 0.5);
2000
+ }
2001
+
2002
+ .fw-sc-tooltip::before {
2003
+ content: "";
2004
+ position: absolute;
2005
+ top: 100%;
2006
+ left: 50%;
2007
+ transform: translateX(-50%);
2008
+ border: 4px solid transparent;
2009
+ border-top-color: hsl(var(--tn-bg-dark));
2010
+ margin-top: -1px;
2011
+ }
2012
+ } /* End @layer fw-streamcrafter */
2013
+
2014
+ `;