@livepeer-frameworks/player-wc 0.1.9 → 0.2.2

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 (141) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
  2. package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
  3. package/dist/esm/components/controls/fw-live-badge.js +109 -0
  4. package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
  5. package/dist/esm/components/controls/fw-play-button.js +76 -0
  6. package/dist/esm/components/controls/fw-play-button.js.map +1 -0
  7. package/dist/esm/components/controls/fw-skip-button.js +62 -0
  8. package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
  9. package/dist/esm/components/controls/fw-time-display.js +77 -0
  10. package/dist/esm/components/controls/fw-time-display.js.map +1 -0
  11. package/dist/esm/components/controls/fw-volume-control.js +76 -0
  12. package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
  13. package/dist/esm/components/fw-dev-mode-panel.js +11 -15
  14. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  15. package/dist/esm/components/fw-error-overlay.js +13 -5
  16. package/dist/esm/components/fw-error-overlay.js.map +1 -1
  17. package/dist/esm/components/fw-idle-screen.js +10 -2
  18. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  19. package/dist/esm/components/fw-loading-screen.js +89 -42
  20. package/dist/esm/components/fw-loading-screen.js.map +1 -1
  21. package/dist/esm/components/fw-loading-spinner.js +20 -9
  22. package/dist/esm/components/fw-loading-spinner.js.map +1 -1
  23. package/dist/esm/components/fw-player-controls.js +18 -13
  24. package/dist/esm/components/fw-player-controls.js.map +1 -1
  25. package/dist/esm/components/fw-player.js +165 -59
  26. package/dist/esm/components/fw-player.js.map +1 -1
  27. package/dist/esm/components/fw-settings-menu.js +44 -9
  28. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  29. package/dist/esm/components/fw-stream-state-overlay.js +13 -5
  30. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
  31. package/dist/esm/components/fw-toast.js +11 -1
  32. package/dist/esm/components/fw-toast.js.map +1 -1
  33. package/dist/esm/components/fw-volume-control.js +13 -3
  34. package/dist/esm/components/fw-volume-control.js.map +1 -1
  35. package/dist/esm/controllers/player-controller-host.js +14 -1
  36. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  37. package/dist/esm/index.js +6 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/styles/shared-styles.js +401 -304
  40. package/dist/esm/styles/shared-styles.js.map +1 -1
  41. package/dist/fw-player.iife.js +707 -488
  42. package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
  43. package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
  44. package/dist/types/components/controls/fw-play-button.d.ts +18 -0
  45. package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
  46. package/dist/types/components/controls/fw-time-display.d.ts +17 -0
  47. package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
  48. package/dist/types/components/controls/index.d.ts +6 -0
  49. package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
  50. package/dist/types/components/fw-error-overlay.d.ts +4 -0
  51. package/dist/types/components/fw-idle-screen.d.ts +4 -0
  52. package/dist/types/components/fw-loading-screen.d.ts +5 -1
  53. package/dist/types/components/fw-loading-spinner.d.ts +4 -0
  54. package/dist/types/components/fw-player-controls.d.ts +2 -1
  55. package/dist/types/components/fw-player.d.ts +10 -1
  56. package/dist/types/components/fw-settings-menu.d.ts +3 -1
  57. package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
  58. package/dist/types/components/fw-toast.d.ts +4 -0
  59. package/dist/types/controllers/player-controller-host.d.ts +7 -1
  60. package/dist/types/index.d.ts +1 -0
  61. package/package.json +22 -25
  62. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  63. package/src/components/controls/fw-live-badge.ts +109 -0
  64. package/src/components/controls/fw-play-button.ts +75 -0
  65. package/src/components/controls/fw-skip-button.ts +59 -0
  66. package/src/components/controls/fw-time-display.ts +74 -0
  67. package/src/components/controls/fw-volume-control.ts +75 -0
  68. package/src/components/controls/index.ts +6 -0
  69. package/src/components/fw-dev-mode-panel.ts +10 -17
  70. package/src/components/fw-error-overlay.ts +13 -5
  71. package/src/components/fw-idle-screen.ts +10 -2
  72. package/src/components/fw-loading-screen.ts +90 -46
  73. package/src/components/fw-loading-spinner.ts +18 -9
  74. package/src/components/fw-player-controls.ts +17 -13
  75. package/src/components/fw-player.ts +166 -64
  76. package/src/components/fw-settings-menu.ts +49 -9
  77. package/src/components/fw-stream-state-overlay.ts +13 -5
  78. package/src/components/fw-toast.ts +11 -1
  79. package/src/components/fw-volume-control.ts +14 -3
  80. package/src/controllers/player-controller-host.ts +18 -0
  81. package/src/index.ts +10 -0
  82. package/src/styles/shared-styles.ts +401 -304
  83. package/LICENSE.md +0 -24
  84. package/dist/cjs/components/fw-context-menu.js +0 -17
  85. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  86. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  87. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  88. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  89. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  90. package/dist/cjs/components/fw-error-overlay.js +0 -101
  91. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  92. package/dist/cjs/components/fw-idle-screen.js +0 -726
  93. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  94. package/dist/cjs/components/fw-loading-screen.js +0 -513
  95. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  96. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  97. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  98. package/dist/cjs/components/fw-player-controls.js +0 -451
  99. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  100. package/dist/cjs/components/fw-player.js +0 -832
  101. package/dist/cjs/components/fw-player.js.map +0 -1
  102. package/dist/cjs/components/fw-seek-bar.js +0 -383
  103. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  104. package/dist/cjs/components/fw-settings-menu.js +0 -253
  105. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  106. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  107. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  108. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  109. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  110. package/dist/cjs/components/fw-stats-panel.js +0 -205
  111. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  112. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  113. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  114. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  115. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  116. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  117. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  118. package/dist/cjs/components/fw-title-overlay.js +0 -72
  119. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  120. package/dist/cjs/components/fw-toast.js +0 -74
  121. package/dist/cjs/components/fw-toast.js.map +0 -1
  122. package/dist/cjs/components/fw-volume-control.js +0 -276
  123. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  124. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  125. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  126. package/dist/cjs/constants/media-assets.js +0 -11
  127. package/dist/cjs/constants/media-assets.js.map +0 -1
  128. package/dist/cjs/controllers/player-controller-host.js +0 -364
  129. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  130. package/dist/cjs/define.js +0 -53
  131. package/dist/cjs/define.js.map +0 -1
  132. package/dist/cjs/icons/index.js +0 -180
  133. package/dist/cjs/icons/index.js.map +0 -1
  134. package/dist/cjs/index.js +0 -108
  135. package/dist/cjs/index.js.map +0 -1
  136. 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 +0 -33
  137. 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 +0 -1
  138. package/dist/cjs/styles/shared-styles.js +0 -1985
  139. package/dist/cjs/styles/shared-styles.js.map +0 -1
  140. package/dist/cjs/styles/utility-styles.js +0 -725
  141. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -20,53 +20,63 @@ export const sharedStyles = css`
20
20
  * These are OUTSIDE the layer so they're always available regardless of cascade.
21
21
  */
22
22
  .fw-player-surface {
23
- /* Tokyo Night color palette */
24
- --tn-bg-dark: 235 21% 11%; /* #1a1b26 - Darkest (slab backgrounds) */
25
- --tn-bg: 233 23% 17%; /* #24283b - Main background */
26
- --tn-bg-highlight: 233 23% 21%; /* #292e42 - Elevated surfaces */
27
- --tn-bg-visual: 232 27% 25%; /* #33395e - Selection/active states */
28
-
29
- /* Text hierarchy */
30
- --tn-fg: 223 27% 76%; /* #a9b1d6 - Primary text */
31
- --tn-fg-bright: 220 13% 91%; /* #e2e4ea - Bright/highlighted text */
32
- --tn-fg-dark: 224 16% 53%; /* #787c99 - Secondary text (muted) */
33
- --tn-fg-gutter: 228 15% 45%; /* #5a607f - Borders, seams */
34
-
35
- /* Accent colors (semantic) */
36
- --tn-blue: 218 79% 73%; /* #7aa2f7 - Primary actions */
37
- --tn-green: 95 53% 55%; /* #9ece6a - Success */
38
- --tn-red: 348 74% 64%; /* #f7768e - Destructive, live */
39
- --tn-yellow: 35 79% 64%; /* #e0af68 - Warnings */
40
- --tn-purple: 267 82% 77%; /* #bb9af7 - Secondary accent */
41
- --tn-cyan: 178 64% 63%; /* #7dcfff - Info */
42
- --tn-teal: 162 66% 62%; /* #73daca - Terminal green */
43
-
44
- /* Player-internal variables (not shared with host) */
45
- --fw-background: var(--tn-bg);
46
- --fw-foreground: var(--tn-fg);
47
- --fw-card: var(--tn-bg-highlight);
48
- --fw-card-foreground: var(--tn-fg);
49
- --fw-popover: var(--tn-bg-highlight);
50
- --fw-popover-foreground: var(--tn-fg);
51
- --fw-primary: var(--tn-blue);
52
- --fw-primary-foreground: var(--tn-bg-dark);
53
- --fw-secondary: var(--tn-bg-visual);
54
- --fw-secondary-foreground: var(--tn-fg);
55
- --fw-muted: var(--tn-bg-highlight);
56
- --fw-muted-foreground: var(--tn-fg-dark);
57
- --fw-accent: var(--tn-bg-visual);
58
- --fw-accent-foreground: var(--tn-fg);
59
- --fw-destructive: var(--tn-red);
60
- --fw-destructive-foreground: var(--tn-bg-dark);
61
- --fw-border: var(--tn-fg-gutter);
62
- --fw-input: var(--tn-bg-highlight);
63
- --fw-ring: var(--tn-blue);
23
+ /*
24
+ * INTERNAL: Tokyo Night palette (default theme).
25
+ * Do NOT reference --tn-* in component styles use --fw-* tokens below.
26
+ */
27
+ --tn-bg-dark: 235 21% 11%;
28
+ --tn-bg: 233 23% 17%;
29
+ --tn-bg-highlight: 233 23% 21%;
30
+ --tn-bg-visual: 232 27% 25%;
31
+ --tn-fg: 223 27% 76%;
32
+ --tn-fg-bright: 220 13% 91%;
33
+ --tn-fg-dark: 224 16% 53%;
34
+ --tn-fg-gutter: 228 15% 45%;
35
+ --tn-blue: 218 79% 73%;
36
+ --tn-green: 95 53% 55%;
37
+ --tn-red: 348 74% 64%;
38
+ --tn-yellow: 35 79% 64%;
39
+ --tn-purple: 267 82% 77%;
40
+ --tn-cyan: 178 64% 63%;
41
+ --tn-teal: 162 66% 62%;
42
+
43
+ /*
44
+ * PUBLIC: Semantic design tokens (default = Tokyo Night).
45
+ * Override these to theme the player. Values are HSL triplets (e.g. "210 100% 50%").
46
+ * Use with hsl(): background: hsl(var(--fw-accent) / 0.5);
47
+ */
48
+
49
+ /* Surfaces */
50
+ --fw-surface-deep: var(--tn-bg-dark);
51
+ --fw-surface: var(--tn-bg);
52
+ --fw-surface-raised: var(--tn-bg-highlight);
53
+ --fw-surface-active: var(--tn-bg-visual);
54
+
55
+ /* Text */
56
+ --fw-text: var(--tn-fg);
57
+ --fw-text-bright: var(--tn-fg-bright);
58
+ --fw-text-muted: var(--tn-fg-dark);
59
+ --fw-text-faint: var(--tn-fg-gutter);
60
+
61
+ /* Accents */
62
+ --fw-accent: var(--tn-blue);
63
+ --fw-accent-secondary: var(--tn-cyan);
64
+ --fw-success: var(--tn-green);
65
+ --fw-danger: var(--tn-red);
66
+ --fw-warning: var(--tn-yellow);
67
+ --fw-info: var(--tn-cyan);
68
+ --fw-live: 348 80% 48%;
69
+
70
+ /* Special */
71
+ --fw-shadow-color: 0 0% 0%;
72
+ --fw-on-accent: var(--tn-bg-dark);
73
+ --fw-on-live: 0 0% 100%;
64
74
  --fw-radius: 0;
65
75
 
66
- /* Controls-specific variables */
67
- --fw-controls-bg: hsl(var(--tn-bg-dark) / 0.85);
68
- --fw-controls-fg: hsl(var(--tn-fg));
69
- --fw-seam: hsl(var(--tn-fg-gutter) / 0.3);
76
+ /* Composite (derived from tokens — override for fine control) */
77
+ --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);
78
+ --fw-controls-fg: hsl(var(--fw-text));
79
+ --fw-seam: hsl(var(--fw-text-faint) / 0.3);
70
80
  color: var(--fw-controls-fg);
71
81
  }
72
82
 
@@ -136,7 +146,7 @@ export const sharedStyles = css`
136
146
  font-weight: 600;
137
147
  text-transform: uppercase;
138
148
  letter-spacing: 0.05em;
139
- color: hsl(var(--tn-fg-dark));
149
+ color: hsl(var(--fw-text-muted));
140
150
  }
141
151
 
142
152
  /* Slab body - padded content area */
@@ -189,7 +199,7 @@ export const sharedStyles = css`
189
199
  padding: 0.5rem 0.75rem;
190
200
  border-radius: 0;
191
201
  background: transparent;
192
- color: hsl(var(--tn-fg));
202
+ color: hsl(var(--fw-text));
193
203
  transition:
194
204
  background-color 0.15s,
195
205
  color 0.15s;
@@ -198,29 +208,29 @@ export const sharedStyles = css`
198
208
  }
199
209
 
200
210
  .fw-btn-flush:hover {
201
- background: hsl(var(--tn-bg-visual) / 0.5);
211
+ background: hsl(var(--fw-surface-active) / 0.5);
202
212
  }
203
213
 
204
214
  .fw-btn-flush:active {
205
- background: hsl(var(--tn-bg-visual));
215
+ background: hsl(var(--fw-surface-active));
206
216
  }
207
217
 
208
218
  .fw-btn-flush--active {
209
- color: hsl(var(--tn-blue));
219
+ color: hsl(var(--fw-accent));
210
220
  }
211
221
 
212
222
  /* Status indicators */
213
223
  .fw-status-online {
214
- color: hsl(var(--tn-green));
224
+ color: hsl(var(--fw-success));
215
225
  }
216
226
  .fw-status-offline {
217
- color: hsl(var(--tn-red));
227
+ color: hsl(var(--fw-danger));
218
228
  }
219
229
  .fw-status-warning {
220
- color: hsl(var(--tn-yellow));
230
+ color: hsl(var(--fw-warning));
221
231
  }
222
232
  .fw-status-info {
223
- color: hsl(var(--tn-cyan));
233
+ color: hsl(var(--fw-accent-secondary));
224
234
  }
225
235
 
226
236
  /* =====================================================
@@ -232,9 +242,10 @@ export const sharedStyles = css`
232
242
  height: 100%;
233
243
  width: 100%;
234
244
  overflow: hidden;
245
+ container-type: size;
235
246
  border-radius: 0; /* Slabs don't have rounded corners */
236
- background-color: hsl(var(--tn-bg-dark));
237
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
247
+ background-color: hsl(var(--fw-surface-deep));
248
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
238
249
  }
239
250
 
240
251
  .fw-player-container {
@@ -242,7 +253,7 @@ export const sharedStyles = css`
242
253
  width: 100%;
243
254
  overflow: hidden;
244
255
  border-radius: 0;
245
- background-color: hsl(var(--tn-bg-dark));
256
+ background-color: hsl(var(--fw-surface-deep));
246
257
  }
247
258
 
248
259
  .fw-player-video {
@@ -250,7 +261,7 @@ export const sharedStyles = css`
250
261
  width: 100%;
251
262
  border-radius: 0;
252
263
  object-fit: contain;
253
- background-color: hsl(var(--tn-bg-dark));
264
+ background-color: hsl(var(--fw-surface-deep));
254
265
  }
255
266
 
256
267
  .fw-player-embed {
@@ -259,7 +270,7 @@ export const sharedStyles = css`
259
270
  min-height: 300px;
260
271
  border-radius: 0;
261
272
  border-width: 0;
262
- background-color: hsl(var(--tn-bg-dark));
273
+ background-color: hsl(var(--fw-surface-deep));
263
274
  }
264
275
 
265
276
  .fw-player-dvd {
@@ -282,7 +293,7 @@ export const sharedStyles = css`
282
293
  min-width: 0 !important;
283
294
  min-height: 0 !important;
284
295
  padding: 0 !important;
285
- background: black;
296
+ background: hsl(var(--fw-surface-deep));
286
297
  }
287
298
 
288
299
  /* Ensure video tech fills the wrapper with letterboxing */
@@ -330,20 +341,20 @@ export const sharedStyles = css`
330
341
  bottom: 3rem;
331
342
  right: 0;
332
343
  width: 12rem;
333
- max-height: 70vh;
344
+ max-height: min(70vh, calc(100cqb - 4rem));
334
345
  overflow-y: auto;
335
- background: hsl(var(--tn-bg-dark));
336
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
346
+ background: hsl(var(--fw-surface-deep));
347
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
337
348
  box-shadow:
338
- 0 10px 15px -3px rgb(0 0 0 / 0.1),
339
- 0 4px 6px -4px rgb(0 0 0 / 0.1);
349
+ 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),
350
+ 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);
340
351
  border-radius: 0.25rem;
341
352
  z-index: 50;
342
353
  }
343
354
 
344
355
  .fw-settings-section {
345
356
  padding: 0.5rem;
346
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
357
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
347
358
  }
348
359
 
349
360
  .fw-settings-section:last-child {
@@ -352,7 +363,7 @@ export const sharedStyles = css`
352
363
 
353
364
  .fw-settings-label {
354
365
  font-size: 10px;
355
- color: hsl(var(--tn-fg-dark));
366
+ color: hsl(var(--fw-text-muted));
356
367
  text-transform: uppercase;
357
368
  font-weight: 600;
358
369
  margin-bottom: 0.25rem;
@@ -373,8 +384,8 @@ export const sharedStyles = css`
373
384
  padding: 0.375rem 0.25rem;
374
385
  font-size: 10px;
375
386
  border-radius: 0.25rem;
376
- background: hsl(var(--tn-bg));
377
- color: hsl(var(--tn-fg));
387
+ background: hsl(var(--fw-surface));
388
+ color: hsl(var(--fw-text));
378
389
  border: none;
379
390
  cursor: pointer;
380
391
  transition:
@@ -383,16 +394,16 @@ export const sharedStyles = css`
383
394
  }
384
395
 
385
396
  .fw-settings-btn:hover {
386
- background: hsl(var(--tn-bg-highlight));
397
+ background: hsl(var(--fw-surface-raised));
387
398
  }
388
399
 
389
400
  .fw-settings-btn--active {
390
- background: hsl(var(--tn-blue));
391
- color: hsl(var(--tn-bg-dark));
401
+ background: hsl(var(--fw-accent));
402
+ color: hsl(var(--fw-surface-deep));
392
403
  }
393
404
 
394
405
  .fw-settings-btn--active:hover {
395
- background: hsl(var(--tn-blue));
406
+ background: hsl(var(--fw-accent));
396
407
  }
397
408
 
398
409
  .fw-settings-list {
@@ -409,19 +420,19 @@ export const sharedStyles = css`
409
420
  text-align: left;
410
421
  border-radius: 0.25rem;
411
422
  background: transparent;
412
- color: hsl(var(--tn-fg));
423
+ color: hsl(var(--fw-text));
413
424
  border: none;
414
425
  cursor: pointer;
415
426
  transition: background-color 0.15s;
416
427
  }
417
428
 
418
429
  .fw-settings-list-item:hover {
419
- background: hsl(var(--tn-bg-highlight));
430
+ background: hsl(var(--fw-surface-raised));
420
431
  }
421
432
 
422
433
  .fw-settings-list-item--active {
423
- background: hsl(var(--tn-blue) / 0.2);
424
- color: hsl(var(--tn-blue));
434
+ background: hsl(var(--fw-accent) / 0.2);
435
+ color: hsl(var(--fw-accent));
425
436
  }
426
437
 
427
438
  /* --- Context Menu (bits-ui wrapper) --- */
@@ -430,13 +441,13 @@ export const sharedStyles = css`
430
441
  min-width: 8rem;
431
442
  overflow: hidden;
432
443
  border-radius: 0.25rem;
433
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
434
- background: hsl(var(--tn-bg-dark));
444
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
445
+ background: hsl(var(--fw-surface-deep));
435
446
  padding: 0;
436
- color: hsl(var(--tn-fg));
447
+ color: hsl(var(--fw-text));
437
448
  box-shadow:
438
- 0 10px 15px -3px rgb(0 0 0 / 0.1),
439
- 0 4px 6px -4px rgb(0 0 0 / 0.1);
449
+ 0 10px 15px -3px hsl(var(--fw-shadow-color) / 0.1),
450
+ 0 4px 6px -4px hsl(var(--fw-shadow-color) / 0.1);
440
451
  }
441
452
 
442
453
  .fw-context-menu-item {
@@ -457,7 +468,7 @@ export const sharedStyles = css`
457
468
  appearance: none;
458
469
  -webkit-appearance: none;
459
470
  outline: none;
460
- color: hsl(var(--tn-fg));
471
+ color: hsl(var(--fw-text));
461
472
  transition:
462
473
  background-color 0.15s,
463
474
  color 0.15s;
@@ -465,8 +476,8 @@ export const sharedStyles = css`
465
476
 
466
477
  .fw-context-menu-item:hover,
467
478
  .fw-context-menu-item:focus {
468
- background: hsl(var(--tn-bg-visual));
469
- color: white;
479
+ background: hsl(var(--fw-surface-active));
480
+ color: hsl(var(--fw-text-bright));
470
481
  }
471
482
 
472
483
  .fw-context-menu-item[data-disabled] {
@@ -481,14 +492,14 @@ export const sharedStyles = css`
481
492
  .fw-context-menu-separator {
482
493
  margin: 0.25rem -0.25rem;
483
494
  height: 1px;
484
- background: hsl(var(--tn-fg-gutter) / 0.3);
495
+ background: hsl(var(--fw-text-faint) / 0.3);
485
496
  }
486
497
 
487
498
  .fw-context-menu-label {
488
499
  padding: 0.375rem 0.5rem;
489
500
  font-size: 0.75rem;
490
501
  font-weight: 600;
491
- color: hsl(var(--tn-fg-dark));
502
+ color: hsl(var(--fw-text-muted));
492
503
  }
493
504
 
494
505
  .fw-context-menu-checkbox {
@@ -509,7 +520,7 @@ export const sharedStyles = css`
509
520
  appearance: none;
510
521
  -webkit-appearance: none;
511
522
  outline: none;
512
- color: hsl(var(--tn-fg));
523
+ color: hsl(var(--fw-text));
513
524
  transition:
514
525
  background-color 0.15s,
515
526
  color 0.15s;
@@ -517,8 +528,8 @@ export const sharedStyles = css`
517
528
 
518
529
  .fw-context-menu-checkbox:hover,
519
530
  .fw-context-menu-checkbox:focus {
520
- background: hsl(var(--tn-bg-visual));
521
- color: white;
531
+ background: hsl(var(--fw-surface-active));
532
+ color: hsl(var(--fw-text-bright));
522
533
  }
523
534
 
524
535
  .fw-context-menu-indicator {
@@ -549,19 +560,19 @@ export const sharedStyles = css`
549
560
  }
550
561
 
551
562
  .fw-live-badge--active {
552
- background: rgb(220 38 38);
553
- color: white;
563
+ background: hsl(var(--fw-live));
564
+ color: hsl(var(--fw-on-live));
554
565
  cursor: default;
555
566
  }
556
567
 
557
568
  .fw-live-badge--behind {
558
- background: #414868;
559
- color: #a9b1d6;
569
+ background: hsl(var(--fw-surface-active));
570
+ color: hsl(var(--fw-text));
560
571
  }
561
572
 
562
573
  .fw-live-badge--behind:hover {
563
- background: rgb(220 38 38);
564
- color: white;
574
+ background: hsl(var(--fw-live));
575
+ color: hsl(var(--fw-on-live));
565
576
  }
566
577
 
567
578
  /* --- Volume Control --- */
@@ -576,15 +587,15 @@ export const sharedStyles = css`
576
587
  }
577
588
 
578
589
  .fw-volume-group--expanded {
579
- background: hsl(var(--tn-bg-visual) / 0.5);
590
+ background: hsl(var(--fw-surface-active) / 0.5);
580
591
  }
581
592
 
582
593
  .fw-volume-group:hover {
583
- background: hsl(var(--tn-bg-visual) / 0.5);
594
+ background: hsl(var(--fw-surface-active) / 0.5);
584
595
  }
585
596
 
586
597
  .fw-volume-group--expanded:hover {
587
- background: hsl(var(--tn-bg-visual) / 0.5);
598
+ background: hsl(var(--fw-surface-active) / 0.5);
588
599
  }
589
600
 
590
601
  .fw-volume-group--disabled {
@@ -598,7 +609,7 @@ export const sharedStyles = css`
598
609
  justify-content: center;
599
610
  width: 2rem;
600
611
  height: 2rem;
601
- color: rgb(255 255 255 / 0.8);
612
+ color: hsl(var(--fw-text) / 0.8);
602
613
  background: transparent;
603
614
  border: none;
604
615
  cursor: pointer;
@@ -606,7 +617,7 @@ export const sharedStyles = css`
606
617
  }
607
618
 
608
619
  .fw-volume-btn:hover {
609
- color: white;
620
+ color: hsl(var(--fw-text-bright));
610
621
  }
611
622
 
612
623
  .fw-volume-slider-wrapper {
@@ -653,7 +664,7 @@ export const sharedStyles = css`
653
664
  right: 0;
654
665
  height: 4px;
655
666
  border-radius: 9999px;
656
- background: hsl(var(--tn-fg-gutter) / 0.4);
667
+ background: hsl(var(--fw-text-faint) / 0.4);
657
668
  overflow: hidden;
658
669
  transition: height 0.15s ease;
659
670
  }
@@ -681,11 +692,11 @@ export const sharedStyles = css`
681
692
  position: absolute;
682
693
  height: 100%;
683
694
  border-radius: 9999px;
684
- background: hsl(var(--tn-fg));
695
+ background: hsl(var(--fw-text));
685
696
  }
686
697
 
687
698
  .fw-slider-range--accent {
688
- background: hsl(var(--tn-cyan));
699
+ background: hsl(var(--fw-accent-secondary));
689
700
  }
690
701
 
691
702
  .fw-slider--vertical .fw-slider-range {
@@ -699,9 +710,9 @@ export const sharedStyles = css`
699
710
  width: 10px;
700
711
  height: 10px;
701
712
  border-radius: 50%;
702
- background: hsl(var(--tn-fg));
713
+ background: hsl(var(--fw-text));
703
714
  border: none;
704
- box-shadow: 0 2px 4px rgb(0 0 0 / 0.3);
715
+ box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);
705
716
  cursor: pointer;
706
717
  transition:
707
718
  width 0.15s ease,
@@ -719,11 +730,11 @@ export const sharedStyles = css`
719
730
  }
720
731
 
721
732
  .fw-slider-thumb:focus-visible {
722
- box-shadow: 0 0 0 2px hsl(var(--tn-fg) / 0.5);
733
+ box-shadow: 0 0 0 2px hsl(var(--fw-text) / 0.5);
723
734
  }
724
735
 
725
736
  .fw-slider-thumb--accent {
726
- background: hsl(var(--tn-cyan));
737
+ background: hsl(var(--fw-accent-secondary));
727
738
  }
728
739
 
729
740
  .fw-slider-thumb[data-disabled] {
@@ -736,7 +747,7 @@ export const sharedStyles = css`
736
747
  font-family: ui-monospace, monospace;
737
748
  font-size: 11px;
738
749
  line-height: 1;
739
- color: hsl(var(--tn-fg-dark));
750
+ color: hsl(var(--fw-text-muted));
740
751
  white-space: nowrap;
741
752
  padding: 0 0.5rem;
742
753
  }
@@ -794,7 +805,7 @@ export const sharedStyles = css`
794
805
  right: 0;
795
806
  height: 4px;
796
807
  border-radius: 9999px;
797
- background: hsl(var(--tn-fg-gutter) / 0.4);
808
+ background: hsl(var(--fw-text-faint) / 0.4);
798
809
  transition: height 0.15s ease;
799
810
  }
800
811
 
@@ -807,7 +818,7 @@ export const sharedStyles = css`
807
818
  position: absolute;
808
819
  height: 100%;
809
820
  border-radius: 9999px;
810
- background: hsl(var(--tn-fg) / 0.3);
821
+ background: hsl(var(--fw-text) / 0.3);
811
822
  transition: all 0.2s ease;
812
823
  }
813
824
 
@@ -815,7 +826,7 @@ export const sharedStyles = css`
815
826
  position: absolute;
816
827
  height: 100%;
817
828
  border-radius: 9999px;
818
- background: hsl(var(--tn-blue));
829
+ background: hsl(var(--fw-accent));
819
830
  transition: width 0.1s linear;
820
831
  }
821
832
 
@@ -825,8 +836,8 @@ export const sharedStyles = css`
825
836
  width: 16px;
826
837
  height: 16px;
827
838
  border-radius: 50%;
828
- background: hsl(var(--tn-blue));
829
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
839
+ background: hsl(var(--fw-accent));
840
+ box-shadow: 0 2px 4px hsl(var(--fw-shadow-color) / 0.3);
830
841
  transform: translate(-50%, -50%);
831
842
  transition:
832
843
  opacity 0.15s ease,
@@ -853,8 +864,8 @@ export const sharedStyles = css`
853
864
  padding: 4px 8px;
854
865
  font-family: ui-monospace, monospace;
855
866
  font-size: 12px;
856
- background: hsl(var(--tn-bg-dark) / 0.95);
857
- color: hsl(var(--tn-fg));
867
+ background: hsl(var(--fw-surface-deep) / 0.95);
868
+ color: hsl(var(--fw-text));
858
869
  border-radius: 4px;
859
870
  white-space: nowrap;
860
871
  pointer-events: none;
@@ -869,9 +880,9 @@ export const sharedStyles = css`
869
880
  width: 18rem;
870
881
  max-height: 80%;
871
882
  overflow-y: auto;
872
- background: hsl(var(--tn-bg-dark) / 0.85);
883
+ background: hsl(var(--fw-surface-deep) / 0.85);
873
884
  backdrop-filter: blur(4px);
874
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
885
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
875
886
  font-family: ui-monospace, monospace;
876
887
  font-size: 0.75rem;
877
888
  z-index: 30;
@@ -882,17 +893,17 @@ export const sharedStyles = css`
882
893
  align-items: center;
883
894
  justify-content: space-between;
884
895
  padding: 0.5rem;
885
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
896
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
886
897
  font-size: 10px;
887
898
  font-weight: 600;
888
899
  text-transform: uppercase;
889
900
  letter-spacing: 0.05em;
890
- color: hsl(var(--tn-fg-dark));
901
+ color: hsl(var(--fw-text-muted));
891
902
  }
892
903
 
893
904
  .fw-stats-section {
894
905
  padding: 0.5rem;
895
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
906
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
896
907
  }
897
908
 
898
909
  .fw-stats-section:last-child {
@@ -903,11 +914,44 @@ export const sharedStyles = css`
903
914
  display: flex;
904
915
  justify-content: space-between;
905
916
  padding: 0.125rem 0;
906
- color: hsl(var(--tn-fg-dark));
917
+ color: hsl(var(--fw-text-muted));
907
918
  }
908
919
 
909
920
  .fw-stats-value {
910
- color: hsl(var(--tn-fg));
921
+ color: hsl(var(--fw-text));
922
+ }
923
+
924
+ /* --- Buffering Overlay --- */
925
+ .fw-buffering-overlay {
926
+ position: absolute;
927
+ inset: 0;
928
+ display: flex;
929
+ align-items: center;
930
+ justify-content: center;
931
+ background: hsl(var(--fw-shadow-color) / 0.4);
932
+ backdrop-filter: blur(4px);
933
+ z-index: 20;
934
+ }
935
+
936
+ .fw-buffering-pill {
937
+ display: flex;
938
+ align-items: center;
939
+ gap: 0.75rem;
940
+ padding: 0.75rem 1rem;
941
+ font-size: 0.875rem;
942
+ color: hsl(var(--fw-text-bright));
943
+ background: hsl(var(--fw-surface-deep) / 0.85);
944
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
945
+ box-shadow: 0 4px 12px hsl(var(--fw-shadow-color) / 0.2);
946
+ }
947
+
948
+ .fw-buffering-spinner {
949
+ width: 1rem;
950
+ height: 1rem;
951
+ border: 2px solid hsl(var(--fw-text-faint) / 0.3);
952
+ border-top-color: hsl(var(--fw-accent));
953
+ border-radius: 50%;
954
+ animation: spin 1s linear infinite;
911
955
  }
912
956
 
913
957
  /* --- Loading Screen --- */
@@ -918,15 +962,15 @@ export const sharedStyles = css`
918
962
  flex-direction: column;
919
963
  align-items: center;
920
964
  justify-content: center;
921
- background: hsl(var(--tn-bg-dark));
965
+ background: hsl(var(--fw-surface-deep));
922
966
  z-index: 20;
923
967
  }
924
968
 
925
969
  .fw-loading-spinner {
926
970
  width: 2rem;
927
971
  height: 2rem;
928
- border: 3px solid hsl(var(--tn-fg-gutter) / 0.3);
929
- border-top-color: hsl(var(--tn-blue));
972
+ border: 3px solid hsl(var(--fw-text-faint) / 0.3);
973
+ border-top-color: hsl(var(--fw-accent));
930
974
  border-radius: 50%;
931
975
  animation: spin 1s linear infinite;
932
976
  }
@@ -934,7 +978,7 @@ export const sharedStyles = css`
934
978
  .fw-loading-text {
935
979
  margin-top: 1rem;
936
980
  font-size: 0.875rem;
937
- color: hsl(var(--tn-fg-dark));
981
+ color: hsl(var(--fw-text-muted));
938
982
  }
939
983
 
940
984
  /* --- Idle Screen --- */
@@ -945,13 +989,13 @@ export const sharedStyles = css`
945
989
  flex-direction: column;
946
990
  align-items: center;
947
991
  justify-content: center;
948
- background: hsl(var(--tn-bg-dark));
992
+ background: hsl(var(--fw-surface-deep));
949
993
  z-index: 20;
950
994
  }
951
995
 
952
996
  .fw-idle-message {
953
997
  font-size: 0.875rem;
954
- color: hsl(var(--tn-fg-dark));
998
+ color: hsl(var(--fw-text-muted));
955
999
  }
956
1000
 
957
1001
  /* --- Stream State Overlay --- */
@@ -962,24 +1006,24 @@ export const sharedStyles = css`
962
1006
  flex-direction: column;
963
1007
  align-items: center;
964
1008
  justify-content: center;
965
- background: hsl(var(--tn-bg-dark) / 0.9);
1009
+ background: hsl(var(--fw-surface-deep) / 0.9);
966
1010
  gap: 1rem;
967
1011
  z-index: 20;
968
1012
  }
969
1013
 
970
1014
  .fw-stream-state-icon {
971
- color: hsl(var(--tn-fg-dark));
1015
+ color: hsl(var(--fw-text-muted));
972
1016
  }
973
1017
 
974
1018
  .fw-stream-state-text {
975
1019
  font-size: 0.875rem;
976
- color: hsl(var(--tn-fg-dark));
1020
+ color: hsl(var(--fw-text-muted));
977
1021
  }
978
1022
 
979
1023
  /* --- Title Overlay --- */
980
1024
  .fw-title-overlay {
981
1025
  padding: 1rem;
982
- background: linear-gradient(to bottom, hsl(var(--tn-bg-dark) / 0.8), transparent);
1026
+ background: linear-gradient(to bottom, hsl(var(--fw-surface-deep) / 0.8), transparent);
983
1027
  }
984
1028
 
985
1029
  /* --- Thumbnail Overlay --- */
@@ -993,7 +1037,7 @@ export const sharedStyles = css`
993
1037
  align-items: center;
994
1038
  justify-content: center;
995
1039
  overflow: hidden;
996
- background: hsl(var(--tn-bg-dark));
1040
+ background: hsl(var(--fw-surface-deep));
997
1041
  }
998
1042
 
999
1043
  /* --- Speed Indicator --- */
@@ -1019,8 +1063,8 @@ export const sharedStyles = css`
1019
1063
  gap: 1rem;
1020
1064
  padding: 1.5rem;
1021
1065
  min-height: 280px;
1022
- background: hsl(var(--tn-bg-dark));
1023
- color: hsl(var(--tn-fg));
1066
+ background: hsl(var(--fw-surface-deep));
1067
+ color: hsl(var(--fw-text));
1024
1068
  text-align: center;
1025
1069
  }
1026
1070
 
@@ -1035,7 +1079,7 @@ export const sharedStyles = css`
1035
1079
  display: flex;
1036
1080
  align-items: center;
1037
1081
  justify-content: center;
1038
- background: hsl(0 0% 0% / 0.6);
1082
+ background: hsl(var(--fw-shadow-color) / 0.6);
1039
1083
  backdrop-filter: blur(4px);
1040
1084
  }
1041
1085
 
@@ -1046,9 +1090,9 @@ export const sharedStyles = css`
1046
1090
  }
1047
1091
 
1048
1092
  .fw-error-popup {
1049
- background: hsl(var(--tn-bg-dark));
1050
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1051
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3);
1093
+ background: hsl(var(--fw-surface-deep));
1094
+ border: 1px solid hsl(var(--fw-text-faint) / 0.3);
1095
+ box-shadow: 0 10px 25px -5px hsl(var(--fw-shadow-color) / 0.3);
1052
1096
  overflow: hidden;
1053
1097
  }
1054
1098
 
@@ -1066,15 +1110,15 @@ export const sharedStyles = css`
1066
1110
  align-items: center;
1067
1111
  justify-content: space-between;
1068
1112
  padding: 0.5rem 0.75rem;
1069
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1113
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1070
1114
  }
1071
1115
 
1072
1116
  .fw-error-header--error {
1073
- background: hsl(0 70% 50% / 0.1);
1117
+ background: hsl(var(--fw-danger) / 0.1);
1074
1118
  }
1075
1119
 
1076
1120
  .fw-error-header--warning {
1077
- background: hsl(45 100% 50% / 0.1);
1121
+ background: hsl(var(--fw-warning) / 0.1);
1078
1122
  }
1079
1123
 
1080
1124
  .fw-error-title {
@@ -1085,11 +1129,11 @@ export const sharedStyles = css`
1085
1129
  }
1086
1130
 
1087
1131
  .fw-error-title--error {
1088
- color: hsl(0 70% 60%);
1132
+ color: hsl(var(--fw-danger));
1089
1133
  }
1090
1134
 
1091
1135
  .fw-error-title--warning {
1092
- color: hsl(45 100% 50%);
1136
+ color: hsl(var(--fw-warning));
1093
1137
  }
1094
1138
 
1095
1139
  .fw-error-close {
@@ -1101,7 +1145,7 @@ export const sharedStyles = css`
1101
1145
  border-radius: 4px;
1102
1146
  background: transparent;
1103
1147
  border: none;
1104
- color: hsl(var(--tn-fg-dark));
1148
+ color: hsl(var(--fw-text-muted));
1105
1149
  cursor: pointer;
1106
1150
  transition:
1107
1151
  background-color 0.15s ease,
@@ -1109,8 +1153,8 @@ export const sharedStyles = css`
1109
1153
  }
1110
1154
 
1111
1155
  .fw-error-close:hover {
1112
- background: hsl(var(--tn-fg) / 0.1);
1113
- color: hsl(var(--tn-fg));
1156
+ background: hsl(var(--fw-text) / 0.1);
1157
+ color: hsl(var(--fw-text));
1114
1158
  }
1115
1159
 
1116
1160
  .fw-error-body {
@@ -1119,12 +1163,12 @@ export const sharedStyles = css`
1119
1163
 
1120
1164
  .fw-error-message {
1121
1165
  font-size: 14px;
1122
- color: hsl(var(--tn-fg));
1166
+ color: hsl(var(--fw-text));
1123
1167
  }
1124
1168
 
1125
1169
  .fw-error-actions {
1126
1170
  display: flex;
1127
- border-top: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1171
+ border-top: 1px solid hsl(var(--fw-text-faint) / 0.3);
1128
1172
  }
1129
1173
 
1130
1174
  .fw-error-btn {
@@ -1132,7 +1176,7 @@ export const sharedStyles = css`
1132
1176
  padding: 0.5rem 1rem;
1133
1177
  font-size: 12px;
1134
1178
  font-weight: 500;
1135
- color: hsl(var(--tn-fg));
1179
+ color: hsl(var(--fw-text));
1136
1180
  background: transparent;
1137
1181
  border: none;
1138
1182
  cursor: pointer;
@@ -1142,8 +1186,8 @@ export const sharedStyles = css`
1142
1186
  }
1143
1187
 
1144
1188
  .fw-error-btn:hover {
1145
- background: hsl(var(--tn-fg) / 0.05);
1146
- color: hsl(var(--tn-fg-bright));
1189
+ background: hsl(var(--fw-text) / 0.05);
1190
+ color: hsl(var(--fw-text-bright));
1147
1191
  }
1148
1192
 
1149
1193
  /* --- Context Menu Animations (for bits-ui) --- */
@@ -1202,15 +1246,16 @@ export const sharedStyles = css`
1202
1246
  .fw-dev-panel {
1203
1247
  z-index: 40;
1204
1248
  pointer-events: auto;
1205
- background: hsl(var(--tn-bg-dark));
1206
- border-left: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
1207
- color: hsl(var(--tn-fg));
1249
+ background: hsl(var(--fw-surface-deep));
1250
+ border-left: 1px solid hsl(var(--fw-text-faint) / 0.5);
1251
+ color: hsl(var(--fw-text));
1208
1252
  font-family: ui-monospace, monospace;
1209
1253
  font-size: 0.75rem;
1210
1254
  width: 280px;
1211
1255
  display: flex;
1212
1256
  flex-direction: column;
1213
1257
  height: 100%;
1258
+ min-height: 0;
1214
1259
  flex-shrink: 0;
1215
1260
  }
1216
1261
 
@@ -1218,8 +1263,8 @@ export const sharedStyles = css`
1218
1263
  .fw-dev-header {
1219
1264
  display: flex;
1220
1265
  align-items: center;
1221
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1222
- background: hsl(var(--tn-bg) / 0.5);
1266
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1267
+ background: hsl(var(--fw-surface) / 0.5);
1223
1268
  }
1224
1269
 
1225
1270
  /* Tab buttons */
@@ -1231,8 +1276,8 @@ export const sharedStyles = css`
1231
1276
  font-weight: 600;
1232
1277
  background: transparent;
1233
1278
  border: none;
1234
- border-right: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1235
- color: hsl(var(--tn-fg-dark));
1279
+ border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);
1280
+ color: hsl(var(--fw-text-muted));
1236
1281
  cursor: pointer;
1237
1282
  transition:
1238
1283
  background-color 0.15s,
@@ -1240,13 +1285,13 @@ export const sharedStyles = css`
1240
1285
  }
1241
1286
 
1242
1287
  .fw-dev-tab:hover {
1243
- background: hsl(var(--tn-bg-dark) / 0.5);
1244
- color: hsl(var(--tn-fg));
1288
+ background: hsl(var(--fw-surface-deep) / 0.5);
1289
+ color: hsl(var(--fw-text));
1245
1290
  }
1246
1291
 
1247
1292
  .fw-dev-tab--active {
1248
- background: hsl(var(--tn-bg-dark));
1249
- color: hsl(var(--tn-fg-bright));
1293
+ background: hsl(var(--fw-surface-deep));
1294
+ color: hsl(var(--fw-text-bright));
1250
1295
  }
1251
1296
 
1252
1297
  .fw-dev-close {
@@ -1258,14 +1303,14 @@ export const sharedStyles = css`
1258
1303
  justify-content: center;
1259
1304
  background: transparent;
1260
1305
  border: none;
1261
- color: hsl(var(--tn-fg-dark));
1306
+ color: hsl(var(--fw-text-muted));
1262
1307
  cursor: pointer;
1263
1308
  transition: color 0.15s;
1264
1309
  margin-left: auto;
1265
1310
  }
1266
1311
 
1267
1312
  .fw-dev-close:hover {
1268
- color: hsl(var(--tn-fg));
1313
+ color: hsl(var(--fw-text));
1269
1314
  }
1270
1315
 
1271
1316
  /* Spacer - pushes close button to right */
@@ -1283,7 +1328,7 @@ export const sharedStyles = css`
1283
1328
  /* Section with label */
1284
1329
  .fw-dev-section {
1285
1330
  padding: 0.75rem;
1286
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1331
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1287
1332
  }
1288
1333
 
1289
1334
  .fw-dev-section-label,
@@ -1292,29 +1337,29 @@ export const sharedStyles = css`
1292
1337
  text-transform: uppercase;
1293
1338
  letter-spacing: 0.05em;
1294
1339
  font-weight: 600;
1295
- color: hsl(var(--tn-fg-dark));
1340
+ color: hsl(var(--fw-text-muted));
1296
1341
  margin-bottom: 0.25rem;
1297
1342
  }
1298
1343
 
1299
1344
  .fw-dev-section-value,
1300
1345
  .fw-dev-value {
1301
1346
  font-size: 0.875rem;
1302
- color: hsl(var(--tn-fg-bright));
1347
+ color: hsl(var(--fw-text-bright));
1303
1348
  }
1304
1349
 
1305
1350
  .fw-dev-value-arrow {
1306
- color: hsl(var(--tn-fg-dark));
1351
+ color: hsl(var(--fw-text-muted));
1307
1352
  }
1308
1353
 
1309
1354
  .fw-dev-value-muted {
1310
1355
  font-size: 10px;
1311
- color: hsl(var(--tn-fg-dark));
1356
+ color: hsl(var(--fw-text-muted));
1312
1357
  margin-top: 0.25rem;
1313
1358
  }
1314
1359
 
1315
1360
  .fw-dev-section-sub {
1316
1361
  font-size: 10px;
1317
- color: hsl(var(--tn-fg-dark));
1362
+ color: hsl(var(--fw-text-muted));
1318
1363
  margin-top: 0.25rem;
1319
1364
  }
1320
1365
 
@@ -1328,7 +1373,7 @@ export const sharedStyles = css`
1328
1373
 
1329
1374
  .fw-dev-mode-desc {
1330
1375
  font-size: 10px;
1331
- color: hsl(var(--tn-fg-dark));
1376
+ color: hsl(var(--fw-text-muted));
1332
1377
  margin-top: 0.5rem;
1333
1378
  font-style: italic;
1334
1379
  }
@@ -1339,9 +1384,9 @@ export const sharedStyles = css`
1339
1384
  font-size: 10px;
1340
1385
  font-weight: 500;
1341
1386
  border-radius: 0.25rem;
1342
- background: hsl(var(--tn-bg-highlight));
1387
+ background: hsl(var(--fw-surface-raised));
1343
1388
  border: none;
1344
- color: hsl(var(--tn-fg-dark));
1389
+ color: hsl(var(--fw-text-muted));
1345
1390
  cursor: pointer;
1346
1391
  transition:
1347
1392
  background-color 0.15s,
@@ -1349,28 +1394,28 @@ export const sharedStyles = css`
1349
1394
  }
1350
1395
 
1351
1396
  .fw-dev-mode-btn:hover {
1352
- color: hsl(var(--tn-fg));
1353
- background: hsl(var(--tn-bg-visual));
1397
+ color: hsl(var(--fw-text));
1398
+ background: hsl(var(--fw-surface-active));
1354
1399
  }
1355
1400
 
1356
1401
  .fw-dev-mode-btn--active {
1357
- background: hsl(var(--tn-blue));
1358
- color: hsl(var(--tn-bg-dark));
1402
+ background: hsl(var(--fw-accent));
1403
+ color: hsl(var(--fw-surface-deep));
1359
1404
  }
1360
1405
 
1361
1406
  /* Action buttons row */
1362
1407
  .fw-dev-actions {
1363
1408
  display: flex;
1364
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1409
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1365
1410
  }
1366
1411
 
1367
1412
  .fw-dev-action-btn {
1368
1413
  flex: 1;
1369
1414
  padding: 0.5rem 0.75rem;
1370
- background: hsl(var(--tn-bg-highlight));
1415
+ background: hsl(var(--fw-surface-raised));
1371
1416
  border: none;
1372
- border-right: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1373
- color: hsl(var(--tn-fg));
1417
+ border-right: 1px solid hsl(var(--fw-text-faint) / 0.3);
1418
+ color: hsl(var(--fw-text));
1374
1419
  font-size: 0.75rem;
1375
1420
  cursor: pointer;
1376
1421
  transition:
@@ -1383,8 +1428,8 @@ export const sharedStyles = css`
1383
1428
  }
1384
1429
 
1385
1430
  .fw-dev-action-btn:hover {
1386
- background: hsl(var(--tn-bg-visual));
1387
- color: hsl(var(--tn-fg-bright));
1431
+ background: hsl(var(--fw-surface-active));
1432
+ color: hsl(var(--fw-text-bright));
1388
1433
  }
1389
1434
 
1390
1435
  /* Combo list header */
@@ -1393,7 +1438,7 @@ export const sharedStyles = css`
1393
1438
  align-items: center;
1394
1439
  justify-content: space-between;
1395
1440
  padding: 0.5rem 0.75rem;
1396
- background: hsl(var(--tn-bg) / 0.5);
1441
+ background: hsl(var(--fw-surface) / 0.5);
1397
1442
  }
1398
1443
 
1399
1444
  .fw-dev-list-title {
@@ -1401,12 +1446,12 @@ export const sharedStyles = css`
1401
1446
  text-transform: uppercase;
1402
1447
  letter-spacing: 0.05em;
1403
1448
  font-weight: 600;
1404
- color: hsl(var(--tn-fg-dark));
1449
+ color: hsl(var(--fw-text-muted));
1405
1450
  }
1406
1451
 
1407
1452
  .fw-dev-list-toggle {
1408
1453
  font-size: 10px;
1409
- color: hsl(var(--tn-fg-dark));
1454
+ color: hsl(var(--fw-text-muted));
1410
1455
  background: transparent;
1411
1456
  border: none;
1412
1457
  cursor: pointer;
@@ -1418,12 +1463,12 @@ export const sharedStyles = css`
1418
1463
  }
1419
1464
 
1420
1465
  .fw-dev-list-toggle:hover {
1421
- color: hsl(var(--tn-fg));
1466
+ color: hsl(var(--fw-text));
1422
1467
  }
1423
1468
 
1424
1469
  /* Combo list items */
1425
1470
  .fw-dev-combo-list {
1426
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1471
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1427
1472
  }
1428
1473
 
1429
1474
  .fw-dev-combo-item {
@@ -1435,8 +1480,8 @@ export const sharedStyles = css`
1435
1480
  text-align: left;
1436
1481
  background: transparent;
1437
1482
  border: none;
1438
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1439
- color: hsl(var(--tn-fg));
1483
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);
1484
+ color: hsl(var(--fw-text));
1440
1485
  cursor: pointer;
1441
1486
  transition: background-color 0.15s;
1442
1487
  }
@@ -1446,13 +1491,13 @@ export const sharedStyles = css`
1446
1491
  }
1447
1492
 
1448
1493
  .fw-dev-combo-item:hover {
1449
- background: hsl(var(--tn-bg) / 0.5);
1494
+ background: hsl(var(--fw-surface) / 0.5);
1450
1495
  }
1451
1496
 
1452
1497
  .fw-dev-combo-item--active {
1453
- background: hsl(var(--tn-bg-visual));
1454
- color: hsl(var(--tn-fg-bright));
1455
- box-shadow: inset 0 0 0 1px hsl(var(--tn-blue));
1498
+ background: hsl(var(--fw-surface-active));
1499
+ color: hsl(var(--fw-text-bright));
1500
+ box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));
1456
1501
  }
1457
1502
 
1458
1503
  .fw-dev-combo-item--disabled {
@@ -1460,11 +1505,11 @@ export const sharedStyles = css`
1460
1505
  }
1461
1506
 
1462
1507
  .fw-dev-combo-item--warning {
1463
- background: hsl(var(--tn-yellow) / 0.05);
1508
+ background: hsl(var(--fw-warning) / 0.05);
1464
1509
  }
1465
1510
 
1466
1511
  .fw-dev-combo-item--warning:hover {
1467
- background: hsl(var(--tn-yellow) / 0.1);
1512
+ background: hsl(var(--fw-warning) / 0.1);
1468
1513
  }
1469
1514
 
1470
1515
  .fw-dev-combo-rank {
@@ -1476,19 +1521,19 @@ export const sharedStyles = css`
1476
1521
  font-size: 10px;
1477
1522
  font-weight: 700;
1478
1523
  border-radius: 0.125rem;
1479
- background: hsl(var(--tn-fg-gutter) / 0.5);
1480
- color: hsl(var(--tn-fg-dark));
1524
+ background: hsl(var(--fw-text-faint) / 0.5);
1525
+ color: hsl(var(--fw-text-muted));
1481
1526
  flex-shrink: 0;
1482
1527
  }
1483
1528
 
1484
1529
  .fw-dev-combo-rank--active {
1485
- background: hsl(var(--tn-blue));
1486
- color: hsl(var(--tn-bg-dark));
1530
+ background: hsl(var(--fw-accent));
1531
+ color: hsl(var(--fw-surface-deep));
1487
1532
  }
1488
1533
 
1489
1534
  .fw-dev-combo-rank--warning {
1490
- background: hsl(var(--tn-yellow) / 0.3);
1491
- color: hsl(var(--tn-yellow));
1535
+ background: hsl(var(--fw-warning) / 0.3);
1536
+ color: hsl(var(--fw-warning));
1492
1537
  }
1493
1538
 
1494
1539
  .fw-dev-combo-name {
@@ -1500,15 +1545,15 @@ export const sharedStyles = css`
1500
1545
  }
1501
1546
 
1502
1547
  .fw-dev-combo-arrow {
1503
- color: hsl(var(--tn-fg-dark));
1548
+ color: hsl(var(--fw-text-muted));
1504
1549
  }
1505
1550
 
1506
1551
  .fw-dev-combo-type {
1507
- color: hsl(var(--tn-cyan));
1552
+ color: hsl(var(--fw-accent-secondary));
1508
1553
  }
1509
1554
 
1510
1555
  .fw-dev-combo-type--warning {
1511
- color: hsl(var(--tn-yellow));
1556
+ color: hsl(var(--fw-warning));
1512
1557
  }
1513
1558
 
1514
1559
  .fw-dev-combo-score {
@@ -1521,93 +1566,83 @@ export const sharedStyles = css`
1521
1566
  }
1522
1567
 
1523
1568
  .fw-dev-combo-score--high {
1524
- background: hsl(var(--tn-green) / 0.2);
1525
- color: hsl(var(--tn-green));
1569
+ background: hsl(var(--fw-success) / 0.2);
1570
+ color: hsl(var(--fw-success));
1526
1571
  }
1527
1572
 
1528
1573
  .fw-dev-combo-score--medium {
1529
- background: hsl(var(--tn-blue) / 0.2);
1530
- color: hsl(var(--tn-blue));
1574
+ background: hsl(var(--fw-accent) / 0.2);
1575
+ color: hsl(var(--fw-accent));
1531
1576
  }
1532
1577
 
1533
1578
  .fw-dev-combo-score--low {
1534
- background: hsl(var(--tn-yellow) / 0.2);
1535
- color: hsl(var(--tn-yellow));
1579
+ background: hsl(var(--fw-warning) / 0.2);
1580
+ color: hsl(var(--fw-warning));
1536
1581
  }
1537
1582
 
1538
- /* Tooltip for combo details */
1583
+ /* Tooltip for combo details — position: fixed escapes overflow containers */
1539
1584
  .fw-dev-tooltip {
1540
- position: absolute;
1541
- left: 0;
1542
- z-index: 50;
1543
- background: hsl(var(--tn-bg-dark));
1544
- border: 1px solid hsl(var(--tn-fg-gutter));
1585
+ position: fixed;
1586
+ z-index: 9999;
1587
+ background: hsl(var(--fw-surface-deep));
1588
+ border: 1px solid hsl(var(--fw-text-faint));
1545
1589
  box-shadow:
1546
- 0 4px 6px -1px rgb(0 0 0 / 0.1),
1547
- 0 2px 4px -2px rgb(0 0 0 / 0.1);
1590
+ 0 4px 6px -1px hsl(var(--fw-shadow-color) / 0.1),
1591
+ 0 2px 4px -2px hsl(var(--fw-shadow-color) / 0.1);
1548
1592
  padding: 0.5rem;
1549
1593
  font-size: 10px;
1550
1594
  white-space: nowrap;
1551
1595
  pointer-events: none;
1552
1596
  min-width: 220px;
1553
- }
1554
-
1555
- .fw-dev-tooltip--above {
1556
- bottom: 100%;
1557
- margin-bottom: 0.25rem;
1558
- }
1559
-
1560
- .fw-dev-tooltip--below {
1561
- top: 100%;
1562
- margin-top: 0.25rem;
1597
+ max-width: 320px;
1563
1598
  }
1564
1599
 
1565
1600
  .fw-dev-tooltip-header {
1566
1601
  margin-bottom: 0.5rem;
1567
1602
  padding-bottom: 0.5rem;
1568
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
1603
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.5);
1569
1604
  }
1570
1605
 
1571
1606
  .fw-dev-tooltip-title {
1572
1607
  font-weight: 700;
1573
- color: hsl(var(--tn-fg-bright));
1608
+ color: hsl(var(--fw-text-bright));
1574
1609
  }
1575
1610
 
1576
1611
  .fw-dev-tooltip-subtitle {
1577
- color: hsl(var(--tn-cyan));
1612
+ color: hsl(var(--fw-accent-secondary));
1578
1613
  }
1579
1614
 
1580
1615
  .fw-dev-tooltip-info {
1581
- color: hsl(var(--tn-fg-dark));
1616
+ color: hsl(var(--fw-text-muted));
1582
1617
  margin-top: 0.25rem;
1583
1618
  }
1584
1619
 
1585
1620
  .fw-dev-tooltip-score {
1586
1621
  font-weight: 700;
1587
- color: hsl(var(--tn-fg-bright));
1622
+ color: hsl(var(--fw-text-bright));
1588
1623
  margin-bottom: 0.25rem;
1589
1624
  }
1590
1625
 
1591
1626
  .fw-dev-tooltip-breakdown {
1592
- color: hsl(var(--tn-fg-dark));
1627
+ color: hsl(var(--fw-text-muted));
1593
1628
  }
1594
1629
 
1595
1630
  .fw-dev-tooltip-breakdown-value {
1596
- color: hsl(var(--tn-fg));
1631
+ color: hsl(var(--fw-text));
1597
1632
  }
1598
1633
 
1599
1634
  .fw-dev-tooltip-breakdown-weight {
1600
- color: hsl(var(--tn-fg-gutter));
1635
+ color: hsl(var(--fw-text-faint));
1601
1636
  }
1602
1637
 
1603
1638
  .fw-dev-tooltip-error {
1604
- color: hsl(var(--tn-red));
1639
+ color: hsl(var(--fw-danger));
1605
1640
  }
1606
1641
 
1607
1642
  /* Stats panel content */
1608
1643
  .fw-dev-stats-hero {
1609
1644
  padding: 0.75rem;
1610
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1645
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1611
1646
  }
1612
1647
 
1613
1648
  .fw-dev-stats-rate {
@@ -1617,24 +1652,24 @@ export const sharedStyles = css`
1617
1652
  }
1618
1653
 
1619
1654
  .fw-dev-stats-rate--good {
1620
- color: hsl(var(--tn-green));
1655
+ color: hsl(var(--fw-success));
1621
1656
  }
1622
1657
 
1623
1658
  .fw-dev-stats-rate--catching {
1624
- color: hsl(var(--tn-blue));
1659
+ color: hsl(var(--fw-accent));
1625
1660
  }
1626
1661
 
1627
1662
  .fw-dev-stats-rate--slow {
1628
- color: hsl(var(--tn-yellow));
1663
+ color: hsl(var(--fw-warning));
1629
1664
  }
1630
1665
 
1631
1666
  .fw-dev-stats-rate--stalling {
1632
- color: hsl(var(--tn-red));
1667
+ color: hsl(var(--fw-danger));
1633
1668
  }
1634
1669
 
1635
1670
  .fw-dev-stats-label {
1636
1671
  font-size: 10px;
1637
- color: hsl(var(--tn-fg-dark));
1672
+ color: hsl(var(--fw-text-muted));
1638
1673
  }
1639
1674
 
1640
1675
  .fw-dev-stats-metrics {
@@ -1645,27 +1680,27 @@ export const sharedStyles = css`
1645
1680
  }
1646
1681
 
1647
1682
  .fw-dev-stats-metric--good {
1648
- color: hsl(var(--tn-green));
1683
+ color: hsl(var(--fw-success));
1649
1684
  }
1650
1685
 
1651
1686
  .fw-dev-stats-metric--warning {
1652
- color: hsl(var(--tn-yellow));
1687
+ color: hsl(var(--fw-warning));
1653
1688
  }
1654
1689
 
1655
1690
  .fw-dev-stats-metric--bad {
1656
- color: hsl(var(--tn-red));
1691
+ color: hsl(var(--fw-danger));
1657
1692
  }
1658
1693
 
1659
1694
  /* Stats rows */
1660
1695
  .fw-dev-stats-rows {
1661
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1696
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.3);
1662
1697
  }
1663
1698
 
1664
1699
  .fw-dev-stats-row {
1665
1700
  display: flex;
1666
1701
  justify-content: space-between;
1667
1702
  padding: 0.5rem 0.75rem;
1668
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1703
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);
1669
1704
  }
1670
1705
 
1671
1706
  .fw-dev-stats-row:last-child {
@@ -1673,27 +1708,27 @@ export const sharedStyles = css`
1673
1708
  }
1674
1709
 
1675
1710
  .fw-dev-stats-key {
1676
- color: hsl(var(--tn-fg-dark));
1711
+ color: hsl(var(--fw-text-muted));
1677
1712
  }
1678
1713
 
1679
1714
  .fw-dev-stats-value {
1680
- color: hsl(var(--tn-fg-bright));
1715
+ color: hsl(var(--fw-text-bright));
1681
1716
  }
1682
1717
 
1683
1718
  .fw-dev-stats-value--cyan {
1684
- color: hsl(var(--tn-cyan));
1719
+ color: hsl(var(--fw-accent-secondary));
1685
1720
  }
1686
1721
 
1687
1722
  .fw-dev-stats-value--warning {
1688
- color: hsl(var(--tn-yellow));
1723
+ color: hsl(var(--fw-warning));
1689
1724
  }
1690
1725
 
1691
1726
  .fw-dev-stats-value--bad {
1692
- color: hsl(var(--tn-red));
1727
+ color: hsl(var(--fw-danger));
1693
1728
  }
1694
1729
 
1695
1730
  .fw-dev-stats-value--good {
1696
- color: hsl(var(--tn-green));
1731
+ color: hsl(var(--fw-success));
1697
1732
  }
1698
1733
 
1699
1734
  /* Track badges */
@@ -1705,18 +1740,18 @@ export const sharedStyles = css`
1705
1740
  }
1706
1741
 
1707
1742
  .fw-dev-track-badge--video {
1708
- background: hsl(var(--tn-blue) / 0.2);
1709
- color: hsl(var(--tn-blue));
1743
+ background: hsl(var(--fw-accent) / 0.2);
1744
+ color: hsl(var(--fw-accent));
1710
1745
  }
1711
1746
 
1712
1747
  .fw-dev-track-badge--audio {
1713
- background: hsl(var(--tn-green) / 0.2);
1714
- color: hsl(var(--tn-green));
1748
+ background: hsl(var(--fw-success) / 0.2);
1749
+ color: hsl(var(--fw-success));
1715
1750
  }
1716
1751
 
1717
1752
  .fw-dev-track-badge--other {
1718
- background: hsl(var(--tn-yellow) / 0.2);
1719
- color: hsl(var(--tn-yellow));
1753
+ background: hsl(var(--fw-warning) / 0.2);
1754
+ color: hsl(var(--fw-warning));
1720
1755
  }
1721
1756
 
1722
1757
  .fw-dev-track-info {
@@ -1724,7 +1759,7 @@ export const sharedStyles = css`
1724
1759
  flex-wrap: wrap;
1725
1760
  gap: 0.5rem;
1726
1761
  font-size: 10px;
1727
- color: hsl(var(--tn-fg-dark));
1762
+ color: hsl(var(--fw-text-muted));
1728
1763
  }
1729
1764
 
1730
1765
  /* Empty state */
@@ -1732,7 +1767,7 @@ export const sharedStyles = css`
1732
1767
  .fw-dev-list-empty {
1733
1768
  padding: 1rem 0.75rem;
1734
1769
  text-align: center;
1735
- color: hsl(var(--tn-fg-dark));
1770
+ color: hsl(var(--fw-text-muted));
1736
1771
  }
1737
1772
 
1738
1773
  /* Chevron icon (expand/collapse toggle) */
@@ -1759,8 +1794,8 @@ export const sharedStyles = css`
1759
1794
  text-align: left;
1760
1795
  background: transparent;
1761
1796
  border: none;
1762
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1763
- color: hsl(var(--tn-fg));
1797
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);
1798
+ color: hsl(var(--fw-text));
1764
1799
  cursor: pointer;
1765
1800
  transition: background-color 0.15s;
1766
1801
  }
@@ -1770,13 +1805,13 @@ export const sharedStyles = css`
1770
1805
  }
1771
1806
 
1772
1807
  .fw-dev-combo-btn:hover {
1773
- background: hsl(var(--tn-bg) / 0.5);
1808
+ background: hsl(var(--fw-surface) / 0.5);
1774
1809
  }
1775
1810
 
1776
1811
  .fw-dev-combo-btn--active {
1777
- background: hsl(var(--tn-bg-visual));
1778
- color: hsl(var(--tn-fg-bright));
1779
- box-shadow: inset 0 0 0 1px hsl(var(--tn-blue));
1812
+ background: hsl(var(--fw-surface-active));
1813
+ color: hsl(var(--fw-text-bright));
1814
+ box-shadow: inset 0 0 0 1px hsl(var(--fw-accent));
1780
1815
  }
1781
1816
 
1782
1817
  .fw-dev-combo-btn--disabled {
@@ -1784,69 +1819,69 @@ export const sharedStyles = css`
1784
1819
  }
1785
1820
 
1786
1821
  .fw-dev-combo-btn--codec-warn {
1787
- background: hsl(var(--tn-yellow) / 0.05);
1822
+ background: hsl(var(--fw-warning) / 0.05);
1788
1823
  }
1789
1824
 
1790
1825
  .fw-dev-combo-btn--codec-warn:hover {
1791
- background: hsl(var(--tn-yellow) / 0.1);
1826
+ background: hsl(var(--fw-warning) / 0.1);
1792
1827
  }
1793
1828
 
1794
1829
  /* Combo rank modifiers */
1795
1830
  .fw-dev-combo-rank--disabled {
1796
- background: hsl(var(--tn-fg-gutter) / 0.3);
1797
- color: hsl(var(--tn-fg-gutter));
1831
+ background: hsl(var(--fw-text-faint) / 0.3);
1832
+ color: hsl(var(--fw-text-faint));
1798
1833
  }
1799
1834
 
1800
1835
  .fw-dev-combo-rank--warn {
1801
- background: hsl(var(--tn-yellow) / 0.3);
1802
- color: hsl(var(--tn-yellow));
1836
+ background: hsl(var(--fw-warning) / 0.3);
1837
+ color: hsl(var(--fw-warning));
1803
1838
  }
1804
1839
 
1805
1840
  /* Combo type modifiers */
1806
1841
  .fw-dev-combo-type--disabled {
1807
- color: hsl(var(--tn-fg-gutter));
1842
+ color: hsl(var(--fw-text-faint));
1808
1843
  }
1809
1844
 
1810
1845
  .fw-dev-combo-type--warn {
1811
- color: hsl(var(--tn-yellow));
1846
+ color: hsl(var(--fw-warning));
1812
1847
  }
1813
1848
 
1814
1849
  /* Combo score modifiers (additional) */
1815
1850
  .fw-dev-combo-score--disabled {
1816
- background: hsl(var(--tn-fg-gutter) / 0.2);
1817
- color: hsl(var(--tn-fg-gutter));
1851
+ background: hsl(var(--fw-text-faint) / 0.2);
1852
+ color: hsl(var(--fw-text-faint));
1818
1853
  }
1819
1854
 
1820
1855
  .fw-dev-combo-score--mid {
1821
- background: hsl(var(--tn-blue) / 0.2);
1822
- color: hsl(var(--tn-blue));
1856
+ background: hsl(var(--fw-accent) / 0.2);
1857
+ color: hsl(var(--fw-accent));
1823
1858
  }
1824
1859
 
1825
1860
  /* Tooltip additional classes */
1826
1861
  .fw-dev-tooltip-tracks {
1827
- color: hsl(var(--tn-fg-dark));
1862
+ color: hsl(var(--fw-text-muted));
1828
1863
  margin-top: 0.25rem;
1829
1864
  }
1830
1865
 
1831
1866
  .fw-dev-tooltip-value {
1832
- color: hsl(var(--tn-fg));
1867
+ color: hsl(var(--fw-text));
1833
1868
  }
1834
1869
 
1835
1870
  .fw-dev-tooltip-row {
1836
- color: hsl(var(--tn-fg-dark));
1871
+ color: hsl(var(--fw-text-muted));
1837
1872
  margin-bottom: 0.125rem;
1838
1873
  }
1839
1874
 
1840
1875
  .fw-dev-tooltip-bonus {
1841
- color: hsl(var(--tn-green));
1876
+ color: hsl(var(--fw-success));
1842
1877
  }
1843
1878
 
1844
1879
  .fw-dev-tooltip-penalty {
1845
- color: hsl(var(--tn-red));
1880
+ color: hsl(var(--fw-danger));
1846
1881
  }
1847
1882
 
1848
1883
  .fw-dev-tooltip-weight {
1849
- color: hsl(var(--tn-fg-gutter));
1884
+ color: hsl(var(--fw-text-faint));
1850
1885
  font-size: 9px;
1851
1886
  }
1852
1887
 
@@ -1875,7 +1910,7 @@ export const sharedStyles = css`
1875
1910
 
1876
1911
  .fw-dev-rate-status {
1877
1912
  font-size: 10px;
1878
- color: hsl(var(--tn-fg-dark));
1913
+ color: hsl(var(--fw-text-muted));
1879
1914
  text-transform: uppercase;
1880
1915
  }
1881
1916
 
@@ -1883,24 +1918,24 @@ export const sharedStyles = css`
1883
1918
  display: flex;
1884
1919
  gap: 1rem;
1885
1920
  font-size: 10px;
1886
- color: hsl(var(--tn-fg-dark));
1921
+ color: hsl(var(--fw-text-muted));
1887
1922
  }
1888
1923
 
1889
1924
  /* Stat value modifiers */
1890
1925
  .fw-dev-stat-value--good {
1891
- color: hsl(var(--tn-green));
1926
+ color: hsl(var(--fw-success));
1892
1927
  }
1893
1928
 
1894
1929
  .fw-dev-stat-value--accent {
1895
- color: hsl(var(--tn-blue));
1930
+ color: hsl(var(--fw-accent));
1896
1931
  }
1897
1932
 
1898
1933
  .fw-dev-stat-value--warn {
1899
- color: hsl(var(--tn-yellow));
1934
+ color: hsl(var(--fw-warning));
1900
1935
  }
1901
1936
 
1902
1937
  .fw-dev-stat-value--bad {
1903
- color: hsl(var(--tn-red));
1938
+ color: hsl(var(--fw-danger));
1904
1939
  }
1905
1940
 
1906
1941
  /* Stats row (key-value pair) */
@@ -1908,7 +1943,7 @@ export const sharedStyles = css`
1908
1943
  display: flex;
1909
1944
  justify-content: space-between;
1910
1945
  padding: 0.5rem 0.75rem;
1911
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1946
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);
1912
1947
  }
1913
1948
 
1914
1949
  .fw-dev-stat:last-child {
@@ -1916,17 +1951,17 @@ export const sharedStyles = css`
1916
1951
  }
1917
1952
 
1918
1953
  .fw-dev-stat-label {
1919
- color: hsl(var(--tn-fg-dark));
1954
+ color: hsl(var(--fw-text-muted));
1920
1955
  }
1921
1956
 
1922
1957
  .fw-dev-stat-value {
1923
- color: hsl(var(--tn-fg-bright));
1958
+ color: hsl(var(--fw-text-bright));
1924
1959
  }
1925
1960
 
1926
1961
  /* Track display */
1927
1962
  .fw-dev-track {
1928
1963
  padding: 0.5rem 0.75rem;
1929
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1964
+ border-bottom: 1px solid hsl(var(--fw-text-faint) / 0.2);
1930
1965
  }
1931
1966
 
1932
1967
  .fw-dev-track:last-child {
@@ -1942,13 +1977,13 @@ export const sharedStyles = css`
1942
1977
 
1943
1978
  .fw-dev-track-codec {
1944
1979
  font-size: 10px;
1945
- color: hsl(var(--tn-fg));
1980
+ color: hsl(var(--fw-text));
1946
1981
  font-weight: 500;
1947
1982
  }
1948
1983
 
1949
1984
  .fw-dev-track-id {
1950
1985
  font-size: 10px;
1951
- color: hsl(var(--tn-fg-gutter));
1986
+ color: hsl(var(--fw-text-faint));
1952
1987
  margin-left: auto;
1953
1988
  }
1954
1989
 
@@ -1957,7 +1992,7 @@ export const sharedStyles = css`
1957
1992
  flex-wrap: wrap;
1958
1993
  gap: 0.5rem;
1959
1994
  font-size: 10px;
1960
- color: hsl(var(--tn-fg-dark));
1995
+ color: hsl(var(--fw-text-muted));
1961
1996
  }
1962
1997
 
1963
1998
  /* No tracks state */
@@ -1967,14 +2002,76 @@ export const sharedStyles = css`
1967
2002
  }
1968
2003
 
1969
2004
  .fw-dev-no-tracks-text {
1970
- color: hsl(var(--tn-fg-dark));
2005
+ color: hsl(var(--fw-text-muted));
1971
2006
  font-size: 10px;
1972
2007
  }
1973
2008
 
1974
2009
  .fw-dev-no-tracks-type {
1975
- color: hsl(var(--tn-fg-gutter));
2010
+ color: hsl(var(--fw-text-faint));
1976
2011
  margin-left: 0.25rem;
1977
2012
  }
1978
2013
  }
1979
2014
 
2015
+ /*
2016
+ * FrameWorks Player — Light Theme
2017
+ * Import alongside player.css, or set data-theme="light" on the player root.
2018
+ */
2019
+ .fw-player-surface[data-theme="light"] {
2020
+ --fw-surface-deep: 0 0% 97%;
2021
+ --fw-surface: 220 10% 94%;
2022
+ --fw-surface-raised: 220 10% 90%;
2023
+ --fw-surface-active: 220 10% 85%;
2024
+
2025
+ --fw-text: 220 20% 15%;
2026
+ --fw-text-bright: 220 20% 5%;
2027
+ --fw-text-muted: 220 10% 45%;
2028
+ --fw-text-faint: 220 10% 70%;
2029
+
2030
+ --fw-accent: 218 80% 50%;
2031
+ --fw-accent-secondary: 195 80% 42%;
2032
+ --fw-success: 140 60% 35%;
2033
+ --fw-danger: 0 70% 50%;
2034
+ --fw-warning: 35 80% 45%;
2035
+ --fw-live: 0 80% 48%;
2036
+
2037
+ --fw-shadow-color: 220 10% 50%;
2038
+ --fw-on-accent: 0 0% 100%;
2039
+ --fw-on-live: 0 0% 100%;
2040
+
2041
+ --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.92);
2042
+ --fw-controls-fg: hsl(var(--fw-text));
2043
+ --fw-seam: hsl(var(--fw-text-faint) / 0.25);
2044
+ }
2045
+
2046
+ /*
2047
+ * FrameWorks Player — Neutral Dark Theme
2048
+ * A brand-neutral dark theme without Tokyo Night's purple-blue tint.
2049
+ */
2050
+ .fw-player-surface[data-theme="neutral-dark"] {
2051
+ --fw-surface-deep: 0 0% 8%;
2052
+ --fw-surface: 0 0% 12%;
2053
+ --fw-surface-raised: 0 0% 16%;
2054
+ --fw-surface-active: 0 0% 22%;
2055
+
2056
+ --fw-text: 0 0% 82%;
2057
+ --fw-text-bright: 0 0% 95%;
2058
+ --fw-text-muted: 0 0% 55%;
2059
+ --fw-text-faint: 0 0% 38%;
2060
+
2061
+ --fw-accent: 210 100% 55%;
2062
+ --fw-accent-secondary: 195 80% 55%;
2063
+ --fw-success: 140 60% 50%;
2064
+ --fw-danger: 0 70% 55%;
2065
+ --fw-warning: 35 80% 55%;
2066
+ --fw-live: 0 80% 48%;
2067
+
2068
+ --fw-shadow-color: 0 0% 0%;
2069
+ --fw-on-accent: 0 0% 100%;
2070
+ --fw-on-live: 0 0% 100%;
2071
+
2072
+ --fw-controls-bg: hsl(var(--fw-surface-deep) / 0.85);
2073
+ --fw-controls-fg: hsl(var(--fw-text));
2074
+ --fw-seam: hsl(var(--fw-text-faint) / 0.3);
2075
+ }
2076
+
1980
2077
  `;