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