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