@livepeer-frameworks/player-wc 0.1.9 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
  2. package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
  3. package/dist/esm/components/controls/fw-live-badge.js +109 -0
  4. package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
  5. package/dist/esm/components/controls/fw-play-button.js +76 -0
  6. package/dist/esm/components/controls/fw-play-button.js.map +1 -0
  7. package/dist/esm/components/controls/fw-skip-button.js +62 -0
  8. package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
  9. package/dist/esm/components/controls/fw-time-display.js +77 -0
  10. package/dist/esm/components/controls/fw-time-display.js.map +1 -0
  11. package/dist/esm/components/controls/fw-volume-control.js +76 -0
  12. package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
  13. package/dist/esm/components/fw-dev-mode-panel.js +11 -15
  14. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  15. package/dist/esm/components/fw-error-overlay.js +13 -5
  16. package/dist/esm/components/fw-error-overlay.js.map +1 -1
  17. package/dist/esm/components/fw-idle-screen.js +10 -2
  18. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  19. package/dist/esm/components/fw-loading-screen.js +89 -42
  20. package/dist/esm/components/fw-loading-screen.js.map +1 -1
  21. package/dist/esm/components/fw-loading-spinner.js +20 -9
  22. package/dist/esm/components/fw-loading-spinner.js.map +1 -1
  23. package/dist/esm/components/fw-player-controls.js +18 -13
  24. package/dist/esm/components/fw-player-controls.js.map +1 -1
  25. package/dist/esm/components/fw-player.js +165 -59
  26. package/dist/esm/components/fw-player.js.map +1 -1
  27. package/dist/esm/components/fw-settings-menu.js +44 -9
  28. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  29. package/dist/esm/components/fw-stream-state-overlay.js +13 -5
  30. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
  31. package/dist/esm/components/fw-toast.js +11 -1
  32. package/dist/esm/components/fw-toast.js.map +1 -1
  33. package/dist/esm/components/fw-volume-control.js +13 -3
  34. package/dist/esm/components/fw-volume-control.js.map +1 -1
  35. package/dist/esm/controllers/player-controller-host.js +14 -1
  36. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  37. package/dist/esm/index.js +6 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/styles/shared-styles.js +401 -304
  40. package/dist/esm/styles/shared-styles.js.map +1 -1
  41. package/dist/fw-player.iife.js +707 -488
  42. package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
  43. package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
  44. package/dist/types/components/controls/fw-play-button.d.ts +18 -0
  45. package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
  46. package/dist/types/components/controls/fw-time-display.d.ts +17 -0
  47. package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
  48. package/dist/types/components/controls/index.d.ts +6 -0
  49. package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
  50. package/dist/types/components/fw-error-overlay.d.ts +4 -0
  51. package/dist/types/components/fw-idle-screen.d.ts +4 -0
  52. package/dist/types/components/fw-loading-screen.d.ts +5 -1
  53. package/dist/types/components/fw-loading-spinner.d.ts +4 -0
  54. package/dist/types/components/fw-player-controls.d.ts +2 -1
  55. package/dist/types/components/fw-player.d.ts +10 -1
  56. package/dist/types/components/fw-settings-menu.d.ts +3 -1
  57. package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
  58. package/dist/types/components/fw-toast.d.ts +4 -0
  59. package/dist/types/controllers/player-controller-host.d.ts +7 -1
  60. package/dist/types/index.d.ts +1 -0
  61. package/package.json +22 -25
  62. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  63. package/src/components/controls/fw-live-badge.ts +109 -0
  64. package/src/components/controls/fw-play-button.ts +75 -0
  65. package/src/components/controls/fw-skip-button.ts +59 -0
  66. package/src/components/controls/fw-time-display.ts +74 -0
  67. package/src/components/controls/fw-volume-control.ts +75 -0
  68. package/src/components/controls/index.ts +6 -0
  69. package/src/components/fw-dev-mode-panel.ts +10 -17
  70. package/src/components/fw-error-overlay.ts +13 -5
  71. package/src/components/fw-idle-screen.ts +10 -2
  72. package/src/components/fw-loading-screen.ts +90 -46
  73. package/src/components/fw-loading-spinner.ts +18 -9
  74. package/src/components/fw-player-controls.ts +17 -13
  75. package/src/components/fw-player.ts +166 -64
  76. package/src/components/fw-settings-menu.ts +49 -9
  77. package/src/components/fw-stream-state-overlay.ts +13 -5
  78. package/src/components/fw-toast.ts +11 -1
  79. package/src/components/fw-volume-control.ts +14 -3
  80. package/src/controllers/player-controller-host.ts +18 -0
  81. package/src/index.ts +10 -0
  82. package/src/styles/shared-styles.ts +401 -304
  83. package/LICENSE.md +0 -24
  84. package/dist/cjs/components/fw-context-menu.js +0 -17
  85. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  86. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  87. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  88. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  89. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  90. package/dist/cjs/components/fw-error-overlay.js +0 -101
  91. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  92. package/dist/cjs/components/fw-idle-screen.js +0 -726
  93. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  94. package/dist/cjs/components/fw-loading-screen.js +0 -513
  95. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  96. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  97. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  98. package/dist/cjs/components/fw-player-controls.js +0 -451
  99. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  100. package/dist/cjs/components/fw-player.js +0 -832
  101. package/dist/cjs/components/fw-player.js.map +0 -1
  102. package/dist/cjs/components/fw-seek-bar.js +0 -383
  103. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  104. package/dist/cjs/components/fw-settings-menu.js +0 -253
  105. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  106. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  107. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  108. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  109. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  110. package/dist/cjs/components/fw-stats-panel.js +0 -205
  111. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  112. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  113. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  114. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  115. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  116. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  117. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  118. package/dist/cjs/components/fw-title-overlay.js +0 -72
  119. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  120. package/dist/cjs/components/fw-toast.js +0 -74
  121. package/dist/cjs/components/fw-toast.js.map +0 -1
  122. package/dist/cjs/components/fw-volume-control.js +0 -276
  123. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  124. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  125. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  126. package/dist/cjs/constants/media-assets.js +0 -11
  127. package/dist/cjs/constants/media-assets.js.map +0 -1
  128. package/dist/cjs/controllers/player-controller-host.js +0 -364
  129. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  130. package/dist/cjs/define.js +0 -53
  131. package/dist/cjs/define.js.map +0 -1
  132. package/dist/cjs/icons/index.js +0 -180
  133. package/dist/cjs/icons/index.js.map +0 -1
  134. package/dist/cjs/index.js +0 -108
  135. package/dist/cjs/index.js.map +0 -1
  136. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
  137. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
  138. package/dist/cjs/styles/shared-styles.js +0 -1985
  139. package/dist/cjs/styles/shared-styles.js.map +0 -1
  140. package/dist/cjs/styles/utility-styles.js +0 -725
  141. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -1,1985 +0,0 @@
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
- width: 100%;
448
- justify-content: flex-start;
449
- gap: 0.5rem;
450
- cursor: pointer;
451
- user-select: none;
452
- align-items: center;
453
- padding: 0.5rem 0.75rem;
454
- font-size: 0.875rem;
455
- text-align: left;
456
- font: inherit;
457
- border: none;
458
- background: transparent;
459
- appearance: none;
460
- -webkit-appearance: none;
461
- outline: none;
462
- color: hsl(var(--tn-fg));
463
- transition:
464
- background-color 0.15s,
465
- color 0.15s;
466
- }
467
-
468
- .fw-context-menu-item:hover,
469
- .fw-context-menu-item:focus {
470
- background: hsl(var(--tn-bg-visual));
471
- color: white;
472
- }
473
-
474
- .fw-context-menu-item[data-disabled] {
475
- pointer-events: none;
476
- opacity: 0.5;
477
- }
478
-
479
- .fw-context-menu-item--inset {
480
- padding-left: 2rem;
481
- }
482
-
483
- .fw-context-menu-separator {
484
- margin: 0.25rem -0.25rem;
485
- height: 1px;
486
- background: hsl(var(--tn-fg-gutter) / 0.3);
487
- }
488
-
489
- .fw-context-menu-label {
490
- padding: 0.375rem 0.5rem;
491
- font-size: 0.75rem;
492
- font-weight: 600;
493
- color: hsl(var(--tn-fg-dark));
494
- }
495
-
496
- .fw-context-menu-checkbox {
497
- position: relative;
498
- display: flex;
499
- width: 100%;
500
- justify-content: flex-start;
501
- gap: 0.5rem;
502
- cursor: pointer;
503
- user-select: none;
504
- align-items: center;
505
- padding: 0.5rem 0.5rem 0.5rem 2rem;
506
- font-size: 0.875rem;
507
- text-align: left;
508
- font: inherit;
509
- border: none;
510
- background: transparent;
511
- appearance: none;
512
- -webkit-appearance: none;
513
- outline: none;
514
- color: hsl(var(--tn-fg));
515
- transition:
516
- background-color 0.15s,
517
- color 0.15s;
518
- }
519
-
520
- .fw-context-menu-checkbox:hover,
521
- .fw-context-menu-checkbox:focus {
522
- background: hsl(var(--tn-bg-visual));
523
- color: white;
524
- }
525
-
526
- .fw-context-menu-indicator {
527
- position: absolute;
528
- left: 0.5rem;
529
- display: flex;
530
- height: 0.875rem;
531
- width: 0.875rem;
532
- align-items: center;
533
- justify-content: center;
534
- }
535
-
536
- /* --- Live Badge --- */
537
- .fw-live-badge {
538
- display: flex;
539
- align-items: center;
540
- gap: 0.25rem;
541
- padding: 0.125rem 0.5rem;
542
- font-size: 10px;
543
- font-weight: 700;
544
- text-transform: uppercase;
545
- letter-spacing: 0.05em;
546
- transition:
547
- background-color 0.15s,
548
- color 0.15s;
549
- border: none;
550
- cursor: pointer;
551
- }
552
-
553
- .fw-live-badge--active {
554
- background: rgb(220 38 38);
555
- color: white;
556
- cursor: default;
557
- }
558
-
559
- .fw-live-badge--behind {
560
- background: #414868;
561
- color: #a9b1d6;
562
- }
563
-
564
- .fw-live-badge--behind:hover {
565
- background: rgb(220 38 38);
566
- color: white;
567
- }
568
-
569
- /* --- Volume Control --- */
570
- .fw-volume-group {
571
- display: flex;
572
- align-items: center;
573
- border-radius: 0;
574
- transition:
575
- background-color 0.2s,
576
- width 0.2s;
577
- cursor: pointer;
578
- }
579
-
580
- .fw-volume-group--expanded {
581
- background: hsl(var(--tn-bg-visual) / 0.5);
582
- }
583
-
584
- .fw-volume-group:hover {
585
- background: hsl(var(--tn-bg-visual) / 0.5);
586
- }
587
-
588
- .fw-volume-group--expanded:hover {
589
- background: hsl(var(--tn-bg-visual) / 0.5);
590
- }
591
-
592
- .fw-volume-group--disabled {
593
- opacity: 0.4;
594
- cursor: not-allowed;
595
- }
596
-
597
- .fw-volume-btn {
598
- display: flex;
599
- align-items: center;
600
- justify-content: center;
601
- width: 2rem;
602
- height: 2rem;
603
- color: rgb(255 255 255 / 0.8);
604
- background: transparent;
605
- border: none;
606
- cursor: pointer;
607
- transition: color 0.15s;
608
- }
609
-
610
- .fw-volume-btn:hover {
611
- color: white;
612
- }
613
-
614
- .fw-volume-slider-wrapper {
615
- display: flex;
616
- align-items: center;
617
- overflow: hidden;
618
- transition:
619
- width 0.2s ease-out,
620
- opacity 0.2s ease-out;
621
- }
622
-
623
- .fw-volume-slider-wrapper--collapsed {
624
- width: 0;
625
- opacity: 0;
626
- }
627
-
628
- .fw-volume-slider-wrapper--expanded {
629
- width: 7rem;
630
- padding-right: 0.5rem;
631
- opacity: 1;
632
- }
633
-
634
- /* --- Slider Component (shared by React/Svelte) --- */
635
- .fw-slider {
636
- position: relative;
637
- display: flex;
638
- width: 100%;
639
- height: 1.25rem;
640
- touch-action: none;
641
- user-select: none;
642
- align-items: center;
643
- cursor: pointer;
644
- }
645
-
646
- .fw-slider--vertical {
647
- flex-direction: column;
648
- width: 1.25rem;
649
- height: 100%;
650
- }
651
-
652
- .fw-slider-track {
653
- position: absolute;
654
- left: 0;
655
- right: 0;
656
- height: 4px;
657
- border-radius: 9999px;
658
- background: hsl(var(--tn-fg-gutter) / 0.4);
659
- overflow: hidden;
660
- transition: height 0.15s ease;
661
- }
662
-
663
- .fw-slider:hover .fw-slider-track {
664
- height: 6px;
665
- }
666
-
667
- .fw-slider--vertical .fw-slider-track {
668
- top: 0;
669
- bottom: 0;
670
- left: 50%;
671
- right: auto;
672
- width: 4px;
673
- height: auto;
674
- transform: translateX(-50%);
675
- }
676
-
677
- .fw-slider--vertical:hover .fw-slider-track {
678
- width: 6px;
679
- height: auto;
680
- }
681
-
682
- .fw-slider-range {
683
- position: absolute;
684
- height: 100%;
685
- border-radius: 9999px;
686
- background: hsl(var(--tn-fg));
687
- }
688
-
689
- .fw-slider-range--accent {
690
- background: hsl(var(--tn-cyan));
691
- }
692
-
693
- .fw-slider--vertical .fw-slider-range {
694
- width: 100%;
695
- height: auto;
696
- bottom: 0;
697
- }
698
-
699
- .fw-slider-thumb {
700
- display: block;
701
- width: 10px;
702
- height: 10px;
703
- border-radius: 50%;
704
- background: hsl(var(--tn-fg));
705
- border: none;
706
- box-shadow: 0 2px 4px rgb(0 0 0 / 0.3);
707
- cursor: pointer;
708
- transition:
709
- width 0.15s ease,
710
- height 0.15s ease,
711
- box-shadow 0.15s ease;
712
- }
713
-
714
- .fw-slider:hover .fw-slider-thumb {
715
- width: 14px;
716
- height: 14px;
717
- }
718
-
719
- .fw-slider-thumb:focus {
720
- outline: none;
721
- }
722
-
723
- .fw-slider-thumb:focus-visible {
724
- box-shadow: 0 0 0 2px hsl(var(--tn-fg) / 0.5);
725
- }
726
-
727
- .fw-slider-thumb--accent {
728
- background: hsl(var(--tn-cyan));
729
- }
730
-
731
- .fw-slider-thumb[data-disabled] {
732
- pointer-events: none;
733
- opacity: 0.5;
734
- }
735
-
736
- /* --- Time Display --- */
737
- .fw-time-display {
738
- font-family: ui-monospace, monospace;
739
- font-size: 11px;
740
- line-height: 1;
741
- color: hsl(var(--tn-fg-dark));
742
- white-space: nowrap;
743
- padding: 0 0.5rem;
744
- }
745
-
746
- /* --- Controls Wrapper --- */
747
- .fw-controls-wrapper {
748
- position: absolute;
749
- left: 0;
750
- right: 0;
751
- bottom: 0;
752
- display: flex;
753
- flex-direction: column;
754
- justify-content: flex-end;
755
- transition: opacity 0.2s;
756
- pointer-events: none;
757
- }
758
-
759
- .fw-controls-wrapper--visible {
760
- opacity: 1;
761
- }
762
-
763
- .fw-controls-wrapper--hidden {
764
- opacity: 0;
765
- }
766
-
767
- .fw-controls-row {
768
- width: 100%;
769
- display: flex;
770
- align-items: center;
771
- justify-content: space-between;
772
- }
773
-
774
- .fw-controls-left {
775
- display: flex;
776
- align-items: center;
777
- min-width: 0;
778
- flex-shrink: 1;
779
- }
780
-
781
- .fw-controls-right {
782
- display: flex;
783
- align-items: center;
784
- }
785
-
786
- .fw-seek-wrapper {
787
- width: 100%;
788
- padding: 0 0.5rem;
789
- margin-bottom: -0.25rem;
790
- }
791
-
792
- /* --- SeekBar Component --- */
793
- .fw-seek-track {
794
- position: absolute;
795
- left: 0;
796
- right: 0;
797
- height: 4px;
798
- border-radius: 9999px;
799
- background: hsl(var(--tn-fg-gutter) / 0.4);
800
- transition: height 0.15s ease;
801
- }
802
-
803
- .fw-seek-wrapper:hover .fw-seek-track,
804
- .fw-seek-track--active {
805
- height: 6px;
806
- }
807
-
808
- .fw-seek-buffered {
809
- position: absolute;
810
- height: 100%;
811
- border-radius: 9999px;
812
- background: hsl(var(--tn-fg) / 0.3);
813
- transition: all 0.2s ease;
814
- }
815
-
816
- .fw-seek-progress {
817
- position: absolute;
818
- height: 100%;
819
- border-radius: 9999px;
820
- background: hsl(var(--tn-blue));
821
- transition: width 0.1s linear;
822
- }
823
-
824
- .fw-seek-thumb {
825
- position: absolute;
826
- top: 50%;
827
- width: 16px;
828
- height: 16px;
829
- border-radius: 50%;
830
- background: hsl(var(--tn-blue));
831
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
832
- transform: translate(-50%, -50%);
833
- transition:
834
- opacity 0.15s ease,
835
- transform 0.15s ease;
836
- opacity: 0;
837
- pointer-events: none;
838
- }
839
-
840
- .fw-seek-wrapper:hover .fw-seek-thumb,
841
- .fw-seek-thumb--active {
842
- opacity: 1;
843
- transform: translate(-50%, -50%) scale(1);
844
- }
845
-
846
- .fw-seek-thumb--hidden {
847
- opacity: 0;
848
- transform: translate(-50%, -50%) scale(0.75);
849
- }
850
-
851
- .fw-seek-tooltip {
852
- position: absolute;
853
- bottom: 100%;
854
- margin-bottom: 8px;
855
- padding: 4px 8px;
856
- font-family: ui-monospace, monospace;
857
- font-size: 12px;
858
- background: hsl(var(--tn-bg-dark) / 0.95);
859
- color: hsl(var(--tn-fg));
860
- border-radius: 4px;
861
- white-space: nowrap;
862
- pointer-events: none;
863
- transform: translateX(-50%);
864
- }
865
-
866
- /* --- Stats Panel --- */
867
- .fw-stats-panel {
868
- position: absolute;
869
- top: 0.5rem;
870
- right: 0.5rem;
871
- width: 18rem;
872
- max-height: 80%;
873
- overflow-y: auto;
874
- background: hsl(var(--tn-bg-dark) / 0.85);
875
- backdrop-filter: blur(4px);
876
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
877
- font-family: ui-monospace, monospace;
878
- font-size: 0.75rem;
879
- z-index: 30;
880
- }
881
-
882
- .fw-stats-header {
883
- display: flex;
884
- align-items: center;
885
- justify-content: space-between;
886
- padding: 0.5rem;
887
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
888
- font-size: 10px;
889
- font-weight: 600;
890
- text-transform: uppercase;
891
- letter-spacing: 0.05em;
892
- color: hsl(var(--tn-fg-dark));
893
- }
894
-
895
- .fw-stats-section {
896
- padding: 0.5rem;
897
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
898
- }
899
-
900
- .fw-stats-section:last-child {
901
- border-bottom: none;
902
- }
903
-
904
- .fw-stats-row {
905
- display: flex;
906
- justify-content: space-between;
907
- padding: 0.125rem 0;
908
- color: hsl(var(--tn-fg-dark));
909
- }
910
-
911
- .fw-stats-value {
912
- color: hsl(var(--tn-fg));
913
- }
914
-
915
- /* --- Loading Screen --- */
916
- .fw-loading-screen {
917
- position: absolute;
918
- inset: 0;
919
- display: flex;
920
- flex-direction: column;
921
- align-items: center;
922
- justify-content: center;
923
- background: hsl(var(--tn-bg-dark));
924
- z-index: 20;
925
- }
926
-
927
- .fw-loading-spinner {
928
- width: 2rem;
929
- height: 2rem;
930
- border: 3px solid hsl(var(--tn-fg-gutter) / 0.3);
931
- border-top-color: hsl(var(--tn-blue));
932
- border-radius: 50%;
933
- animation: spin 1s linear infinite;
934
- }
935
-
936
- .fw-loading-text {
937
- margin-top: 1rem;
938
- font-size: 0.875rem;
939
- color: hsl(var(--tn-fg-dark));
940
- }
941
-
942
- /* --- Idle Screen --- */
943
- .fw-idle-screen {
944
- position: absolute;
945
- inset: 0;
946
- display: flex;
947
- flex-direction: column;
948
- align-items: center;
949
- justify-content: center;
950
- background: hsl(var(--tn-bg-dark));
951
- z-index: 20;
952
- }
953
-
954
- .fw-idle-message {
955
- font-size: 0.875rem;
956
- color: hsl(var(--tn-fg-dark));
957
- }
958
-
959
- /* --- Stream State Overlay --- */
960
- .fw-stream-state-overlay {
961
- position: absolute;
962
- inset: 0;
963
- display: flex;
964
- flex-direction: column;
965
- align-items: center;
966
- justify-content: center;
967
- background: hsl(var(--tn-bg-dark) / 0.9);
968
- gap: 1rem;
969
- z-index: 20;
970
- }
971
-
972
- .fw-stream-state-icon {
973
- color: hsl(var(--tn-fg-dark));
974
- }
975
-
976
- .fw-stream-state-text {
977
- font-size: 0.875rem;
978
- color: hsl(var(--tn-fg-dark));
979
- }
980
-
981
- /* --- Title Overlay --- */
982
- .fw-title-overlay {
983
- padding: 1rem;
984
- background: linear-gradient(to bottom, hsl(var(--tn-bg-dark) / 0.8), transparent);
985
- }
986
-
987
- /* --- Thumbnail Overlay --- */
988
- .fw-player-thumbnail {
989
- position: relative;
990
- display: flex;
991
- height: 100%;
992
- min-height: 280px;
993
- width: 100%;
994
- cursor: pointer;
995
- align-items: center;
996
- justify-content: center;
997
- overflow: hidden;
998
- background: hsl(var(--tn-bg-dark));
999
- }
1000
-
1001
- /* --- Speed Indicator --- */
1002
- .fw-speed-indicator {
1003
- pointer-events: none;
1004
- background: none;
1005
- backdrop-filter: none;
1006
- }
1007
-
1008
- /* --- Skip Indicator --- */
1009
- .fw-skip-indicator {
1010
- display: flex;
1011
- align-items: center;
1012
- justify-content: center;
1013
- }
1014
-
1015
- /* --- Error Display --- */
1016
- .fw-player-error {
1017
- display: flex;
1018
- flex-direction: column;
1019
- align-items: center;
1020
- justify-content: center;
1021
- gap: 1rem;
1022
- padding: 1.5rem;
1023
- min-height: 280px;
1024
- background: hsl(var(--tn-bg-dark));
1025
- color: hsl(var(--tn-fg));
1026
- text-align: center;
1027
- }
1028
-
1029
- /* --- Error Popup Overlay --- */
1030
- .fw-error-overlay {
1031
- position: absolute;
1032
- z-index: 20;
1033
- }
1034
-
1035
- .fw-error-overlay--fullscreen {
1036
- inset: 0;
1037
- display: flex;
1038
- align-items: center;
1039
- justify-content: center;
1040
- background: hsl(0 0% 0% / 0.6);
1041
- backdrop-filter: blur(4px);
1042
- }
1043
-
1044
- .fw-error-overlay--passive {
1045
- top: 0.75rem;
1046
- left: 0.75rem;
1047
- right: 0.75rem;
1048
- }
1049
-
1050
- .fw-error-popup {
1051
- background: hsl(var(--tn-bg-dark));
1052
- border: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1053
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3);
1054
- overflow: hidden;
1055
- }
1056
-
1057
- .fw-error-popup--fullscreen {
1058
- min-width: 280px;
1059
- max-width: 320px;
1060
- }
1061
-
1062
- .fw-error-popup--passive {
1063
- max-width: 28rem;
1064
- }
1065
-
1066
- .fw-error-header {
1067
- display: flex;
1068
- align-items: center;
1069
- justify-content: space-between;
1070
- padding: 0.5rem 0.75rem;
1071
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1072
- }
1073
-
1074
- .fw-error-header--error {
1075
- background: hsl(0 70% 50% / 0.1);
1076
- }
1077
-
1078
- .fw-error-header--warning {
1079
- background: hsl(45 100% 50% / 0.1);
1080
- }
1081
-
1082
- .fw-error-title {
1083
- font-size: 11px;
1084
- font-weight: 600;
1085
- text-transform: uppercase;
1086
- letter-spacing: 0.05em;
1087
- }
1088
-
1089
- .fw-error-title--error {
1090
- color: hsl(0 70% 60%);
1091
- }
1092
-
1093
- .fw-error-title--warning {
1094
- color: hsl(45 100% 50%);
1095
- }
1096
-
1097
- .fw-error-close {
1098
- width: 24px;
1099
- height: 24px;
1100
- display: flex;
1101
- align-items: center;
1102
- justify-content: center;
1103
- border-radius: 4px;
1104
- background: transparent;
1105
- border: none;
1106
- color: hsl(var(--tn-fg-dark));
1107
- cursor: pointer;
1108
- transition:
1109
- background-color 0.15s ease,
1110
- color 0.15s ease;
1111
- }
1112
-
1113
- .fw-error-close:hover {
1114
- background: hsl(var(--tn-fg) / 0.1);
1115
- color: hsl(var(--tn-fg));
1116
- }
1117
-
1118
- .fw-error-body {
1119
- padding: 0.75rem;
1120
- }
1121
-
1122
- .fw-error-message {
1123
- font-size: 14px;
1124
- color: hsl(var(--tn-fg));
1125
- }
1126
-
1127
- .fw-error-actions {
1128
- display: flex;
1129
- border-top: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1130
- }
1131
-
1132
- .fw-error-btn {
1133
- flex: 1;
1134
- padding: 0.5rem 1rem;
1135
- font-size: 12px;
1136
- font-weight: 500;
1137
- color: hsl(var(--tn-fg));
1138
- background: transparent;
1139
- border: none;
1140
- cursor: pointer;
1141
- transition:
1142
- background-color 0.15s ease,
1143
- color 0.15s ease;
1144
- }
1145
-
1146
- .fw-error-btn:hover {
1147
- background: hsl(var(--tn-fg) / 0.05);
1148
- color: hsl(var(--tn-fg-bright));
1149
- }
1150
-
1151
- /* --- Context Menu Animations (for bits-ui) --- */
1152
- @keyframes fw-context-menu-in {
1153
- from {
1154
- opacity: 0;
1155
- transform: scale(0.95);
1156
- }
1157
- to {
1158
- opacity: 1;
1159
- transform: scale(1);
1160
- }
1161
- }
1162
-
1163
- @keyframes fw-context-menu-out {
1164
- from {
1165
- opacity: 1;
1166
- transform: scale(1);
1167
- }
1168
- to {
1169
- opacity: 0;
1170
- transform: scale(0.95);
1171
- }
1172
- }
1173
-
1174
- .fw-context-menu[data-state="open"] {
1175
- animation: fw-context-menu-in 150ms cubic-bezier(0.4, 0, 0.2, 1);
1176
- }
1177
-
1178
- .fw-context-menu[data-state="closed"] {
1179
- animation: fw-context-menu-out 150ms cubic-bezier(0.4, 0, 0.2, 1);
1180
- }
1181
-
1182
- /* Slide animations for different sides */
1183
- .fw-context-menu[data-side="top"] {
1184
- transform-origin: bottom center;
1185
- }
1186
-
1187
- .fw-context-menu[data-side="bottom"] {
1188
- transform-origin: top center;
1189
- }
1190
-
1191
- .fw-context-menu[data-side="left"] {
1192
- transform-origin: right center;
1193
- }
1194
-
1195
- .fw-context-menu[data-side="right"] {
1196
- transform-origin: left center;
1197
- }
1198
-
1199
- /* =====================================================
1200
- DEV MODE PANEL (Advanced settings sidebar)
1201
- ===================================================== */
1202
-
1203
- /* Main panel - side panel container */
1204
- .fw-dev-panel {
1205
- z-index: 40;
1206
- pointer-events: auto;
1207
- background: hsl(var(--tn-bg-dark));
1208
- border-left: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
1209
- color: hsl(var(--tn-fg));
1210
- font-family: ui-monospace, monospace;
1211
- font-size: 0.75rem;
1212
- width: 280px;
1213
- display: flex;
1214
- flex-direction: column;
1215
- height: 100%;
1216
- flex-shrink: 0;
1217
- }
1218
-
1219
- /* Header with tabs */
1220
- .fw-dev-header {
1221
- display: flex;
1222
- align-items: center;
1223
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1224
- background: hsl(var(--tn-bg) / 0.5);
1225
- }
1226
-
1227
- /* Tab buttons */
1228
- .fw-dev-tab {
1229
- padding: 0.5rem 0.75rem;
1230
- font-size: 10px;
1231
- text-transform: uppercase;
1232
- letter-spacing: 0.05em;
1233
- font-weight: 600;
1234
- background: transparent;
1235
- border: none;
1236
- border-right: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1237
- color: hsl(var(--tn-fg-dark));
1238
- cursor: pointer;
1239
- transition:
1240
- background-color 0.15s,
1241
- color 0.15s;
1242
- }
1243
-
1244
- .fw-dev-tab:hover {
1245
- background: hsl(var(--tn-bg-dark) / 0.5);
1246
- color: hsl(var(--tn-fg));
1247
- }
1248
-
1249
- .fw-dev-tab--active {
1250
- background: hsl(var(--tn-bg-dark));
1251
- color: hsl(var(--tn-fg-bright));
1252
- }
1253
-
1254
- .fw-dev-close {
1255
- padding: 0.5rem;
1256
- width: 2rem;
1257
- height: 2rem;
1258
- display: flex;
1259
- align-items: center;
1260
- justify-content: center;
1261
- background: transparent;
1262
- border: none;
1263
- color: hsl(var(--tn-fg-dark));
1264
- cursor: pointer;
1265
- transition: color 0.15s;
1266
- margin-left: auto;
1267
- }
1268
-
1269
- .fw-dev-close:hover {
1270
- color: hsl(var(--tn-fg));
1271
- }
1272
-
1273
- /* Spacer - pushes close button to right */
1274
- .fw-dev-spacer {
1275
- flex: 1;
1276
- }
1277
-
1278
- /* Content area (body) */
1279
- .fw-dev-content,
1280
- .fw-dev-body {
1281
- flex: 1;
1282
- overflow-y: auto;
1283
- }
1284
-
1285
- /* Section with label */
1286
- .fw-dev-section {
1287
- padding: 0.75rem;
1288
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1289
- }
1290
-
1291
- .fw-dev-section-label,
1292
- .fw-dev-label {
1293
- font-size: 10px;
1294
- text-transform: uppercase;
1295
- letter-spacing: 0.05em;
1296
- font-weight: 600;
1297
- color: hsl(var(--tn-fg-dark));
1298
- margin-bottom: 0.25rem;
1299
- }
1300
-
1301
- .fw-dev-section-value,
1302
- .fw-dev-value {
1303
- font-size: 0.875rem;
1304
- color: hsl(var(--tn-fg-bright));
1305
- }
1306
-
1307
- .fw-dev-value-arrow {
1308
- color: hsl(var(--tn-fg-dark));
1309
- }
1310
-
1311
- .fw-dev-value-muted {
1312
- font-size: 10px;
1313
- color: hsl(var(--tn-fg-dark));
1314
- margin-top: 0.25rem;
1315
- }
1316
-
1317
- .fw-dev-section-sub {
1318
- font-size: 10px;
1319
- color: hsl(var(--tn-fg-dark));
1320
- margin-top: 0.25rem;
1321
- }
1322
-
1323
- /* Mode selector buttons */
1324
- .fw-dev-mode-options,
1325
- .fw-dev-mode-group {
1326
- display: flex;
1327
- gap: 0.25rem;
1328
- margin-top: 0.5rem;
1329
- }
1330
-
1331
- .fw-dev-mode-desc {
1332
- font-size: 10px;
1333
- color: hsl(var(--tn-fg-dark));
1334
- margin-top: 0.5rem;
1335
- font-style: italic;
1336
- }
1337
-
1338
- .fw-dev-mode-btn {
1339
- flex: 1;
1340
- padding: 0.375rem 0.5rem;
1341
- font-size: 10px;
1342
- font-weight: 500;
1343
- border-radius: 0.25rem;
1344
- background: hsl(var(--tn-bg-highlight));
1345
- border: none;
1346
- color: hsl(var(--tn-fg-dark));
1347
- cursor: pointer;
1348
- transition:
1349
- background-color 0.15s,
1350
- color 0.15s;
1351
- }
1352
-
1353
- .fw-dev-mode-btn:hover {
1354
- color: hsl(var(--tn-fg));
1355
- background: hsl(var(--tn-bg-visual));
1356
- }
1357
-
1358
- .fw-dev-mode-btn--active {
1359
- background: hsl(var(--tn-blue));
1360
- color: hsl(var(--tn-bg-dark));
1361
- }
1362
-
1363
- /* Action buttons row */
1364
- .fw-dev-actions {
1365
- display: flex;
1366
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1367
- }
1368
-
1369
- .fw-dev-action-btn {
1370
- flex: 1;
1371
- padding: 0.5rem 0.75rem;
1372
- background: hsl(var(--tn-bg-highlight));
1373
- border: none;
1374
- border-right: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1375
- color: hsl(var(--tn-fg));
1376
- font-size: 0.75rem;
1377
- cursor: pointer;
1378
- transition:
1379
- background-color 0.15s,
1380
- color 0.15s;
1381
- }
1382
-
1383
- .fw-dev-action-btn:last-child {
1384
- border-right: none;
1385
- }
1386
-
1387
- .fw-dev-action-btn:hover {
1388
- background: hsl(var(--tn-bg-visual));
1389
- color: hsl(var(--tn-fg-bright));
1390
- }
1391
-
1392
- /* Combo list header */
1393
- .fw-dev-list-header {
1394
- display: flex;
1395
- align-items: center;
1396
- justify-content: space-between;
1397
- padding: 0.5rem 0.75rem;
1398
- background: hsl(var(--tn-bg) / 0.5);
1399
- }
1400
-
1401
- .fw-dev-list-title {
1402
- font-size: 10px;
1403
- text-transform: uppercase;
1404
- letter-spacing: 0.05em;
1405
- font-weight: 600;
1406
- color: hsl(var(--tn-fg-dark));
1407
- }
1408
-
1409
- .fw-dev-list-toggle {
1410
- font-size: 10px;
1411
- color: hsl(var(--tn-fg-dark));
1412
- background: transparent;
1413
- border: none;
1414
- cursor: pointer;
1415
- display: flex;
1416
- align-items: center;
1417
- gap: 0.25rem;
1418
- padding: 0.25rem;
1419
- transition: color 0.15s;
1420
- }
1421
-
1422
- .fw-dev-list-toggle:hover {
1423
- color: hsl(var(--tn-fg));
1424
- }
1425
-
1426
- /* Combo list items */
1427
- .fw-dev-combo-list {
1428
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1429
- }
1430
-
1431
- .fw-dev-combo-item {
1432
- width: 100%;
1433
- display: flex;
1434
- align-items: center;
1435
- gap: 0.5rem;
1436
- padding: 0.5rem 0.75rem;
1437
- text-align: left;
1438
- background: transparent;
1439
- border: none;
1440
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1441
- color: hsl(var(--tn-fg));
1442
- cursor: pointer;
1443
- transition: background-color 0.15s;
1444
- }
1445
-
1446
- .fw-dev-combo-item:last-child {
1447
- border-bottom: none;
1448
- }
1449
-
1450
- .fw-dev-combo-item:hover {
1451
- background: hsl(var(--tn-bg) / 0.5);
1452
- }
1453
-
1454
- .fw-dev-combo-item--active {
1455
- background: hsl(var(--tn-bg-visual));
1456
- color: hsl(var(--tn-fg-bright));
1457
- box-shadow: inset 0 0 0 1px hsl(var(--tn-blue));
1458
- }
1459
-
1460
- .fw-dev-combo-item--disabled {
1461
- opacity: 0.4;
1462
- }
1463
-
1464
- .fw-dev-combo-item--warning {
1465
- background: hsl(var(--tn-yellow) / 0.05);
1466
- }
1467
-
1468
- .fw-dev-combo-item--warning:hover {
1469
- background: hsl(var(--tn-yellow) / 0.1);
1470
- }
1471
-
1472
- .fw-dev-combo-rank {
1473
- width: 1.25rem;
1474
- height: 1.25rem;
1475
- display: flex;
1476
- align-items: center;
1477
- justify-content: center;
1478
- font-size: 10px;
1479
- font-weight: 700;
1480
- border-radius: 0.125rem;
1481
- background: hsl(var(--tn-fg-gutter) / 0.5);
1482
- color: hsl(var(--tn-fg-dark));
1483
- flex-shrink: 0;
1484
- }
1485
-
1486
- .fw-dev-combo-rank--active {
1487
- background: hsl(var(--tn-blue));
1488
- color: hsl(var(--tn-bg-dark));
1489
- }
1490
-
1491
- .fw-dev-combo-rank--warning {
1492
- background: hsl(var(--tn-yellow) / 0.3);
1493
- color: hsl(var(--tn-yellow));
1494
- }
1495
-
1496
- .fw-dev-combo-name {
1497
- flex: 1;
1498
- font-size: 0.75rem;
1499
- overflow: hidden;
1500
- text-overflow: ellipsis;
1501
- white-space: nowrap;
1502
- }
1503
-
1504
- .fw-dev-combo-arrow {
1505
- color: hsl(var(--tn-fg-dark));
1506
- }
1507
-
1508
- .fw-dev-combo-type {
1509
- color: hsl(var(--tn-cyan));
1510
- }
1511
-
1512
- .fw-dev-combo-type--warning {
1513
- color: hsl(var(--tn-yellow));
1514
- }
1515
-
1516
- .fw-dev-combo-score {
1517
- font-size: 10px;
1518
- font-family: ui-monospace, monospace;
1519
- font-variant-numeric: tabular-nums;
1520
- padding: 0.125rem 0.375rem;
1521
- border-radius: 0.125rem;
1522
- flex-shrink: 0;
1523
- }
1524
-
1525
- .fw-dev-combo-score--high {
1526
- background: hsl(var(--tn-green) / 0.2);
1527
- color: hsl(var(--tn-green));
1528
- }
1529
-
1530
- .fw-dev-combo-score--medium {
1531
- background: hsl(var(--tn-blue) / 0.2);
1532
- color: hsl(var(--tn-blue));
1533
- }
1534
-
1535
- .fw-dev-combo-score--low {
1536
- background: hsl(var(--tn-yellow) / 0.2);
1537
- color: hsl(var(--tn-yellow));
1538
- }
1539
-
1540
- /* Tooltip for combo details */
1541
- .fw-dev-tooltip {
1542
- position: absolute;
1543
- left: 0;
1544
- z-index: 50;
1545
- background: hsl(var(--tn-bg-dark));
1546
- border: 1px solid hsl(var(--tn-fg-gutter));
1547
- box-shadow:
1548
- 0 4px 6px -1px rgb(0 0 0 / 0.1),
1549
- 0 2px 4px -2px rgb(0 0 0 / 0.1);
1550
- padding: 0.5rem;
1551
- font-size: 10px;
1552
- white-space: nowrap;
1553
- pointer-events: none;
1554
- min-width: 220px;
1555
- }
1556
-
1557
- .fw-dev-tooltip--above {
1558
- bottom: 100%;
1559
- margin-bottom: 0.25rem;
1560
- }
1561
-
1562
- .fw-dev-tooltip--below {
1563
- top: 100%;
1564
- margin-top: 0.25rem;
1565
- }
1566
-
1567
- .fw-dev-tooltip-header {
1568
- margin-bottom: 0.5rem;
1569
- padding-bottom: 0.5rem;
1570
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.5);
1571
- }
1572
-
1573
- .fw-dev-tooltip-title {
1574
- font-weight: 700;
1575
- color: hsl(var(--tn-fg-bright));
1576
- }
1577
-
1578
- .fw-dev-tooltip-subtitle {
1579
- color: hsl(var(--tn-cyan));
1580
- }
1581
-
1582
- .fw-dev-tooltip-info {
1583
- color: hsl(var(--tn-fg-dark));
1584
- margin-top: 0.25rem;
1585
- }
1586
-
1587
- .fw-dev-tooltip-score {
1588
- font-weight: 700;
1589
- color: hsl(var(--tn-fg-bright));
1590
- margin-bottom: 0.25rem;
1591
- }
1592
-
1593
- .fw-dev-tooltip-breakdown {
1594
- color: hsl(var(--tn-fg-dark));
1595
- }
1596
-
1597
- .fw-dev-tooltip-breakdown-value {
1598
- color: hsl(var(--tn-fg));
1599
- }
1600
-
1601
- .fw-dev-tooltip-breakdown-weight {
1602
- color: hsl(var(--tn-fg-gutter));
1603
- }
1604
-
1605
- .fw-dev-tooltip-error {
1606
- color: hsl(var(--tn-red));
1607
- }
1608
-
1609
- /* Stats panel content */
1610
- .fw-dev-stats-hero {
1611
- padding: 0.75rem;
1612
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1613
- }
1614
-
1615
- .fw-dev-stats-rate {
1616
- font-size: 1.5rem;
1617
- font-weight: 700;
1618
- font-variant-numeric: tabular-nums;
1619
- }
1620
-
1621
- .fw-dev-stats-rate--good {
1622
- color: hsl(var(--tn-green));
1623
- }
1624
-
1625
- .fw-dev-stats-rate--catching {
1626
- color: hsl(var(--tn-blue));
1627
- }
1628
-
1629
- .fw-dev-stats-rate--slow {
1630
- color: hsl(var(--tn-yellow));
1631
- }
1632
-
1633
- .fw-dev-stats-rate--stalling {
1634
- color: hsl(var(--tn-red));
1635
- }
1636
-
1637
- .fw-dev-stats-label {
1638
- font-size: 10px;
1639
- color: hsl(var(--tn-fg-dark));
1640
- }
1641
-
1642
- .fw-dev-stats-metrics {
1643
- display: flex;
1644
- gap: 1rem;
1645
- margin-top: 0.5rem;
1646
- font-size: 10px;
1647
- }
1648
-
1649
- .fw-dev-stats-metric--good {
1650
- color: hsl(var(--tn-green));
1651
- }
1652
-
1653
- .fw-dev-stats-metric--warning {
1654
- color: hsl(var(--tn-yellow));
1655
- }
1656
-
1657
- .fw-dev-stats-metric--bad {
1658
- color: hsl(var(--tn-red));
1659
- }
1660
-
1661
- /* Stats rows */
1662
- .fw-dev-stats-rows {
1663
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.3);
1664
- }
1665
-
1666
- .fw-dev-stats-row {
1667
- display: flex;
1668
- justify-content: space-between;
1669
- padding: 0.5rem 0.75rem;
1670
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1671
- }
1672
-
1673
- .fw-dev-stats-row:last-child {
1674
- border-bottom: none;
1675
- }
1676
-
1677
- .fw-dev-stats-key {
1678
- color: hsl(var(--tn-fg-dark));
1679
- }
1680
-
1681
- .fw-dev-stats-value {
1682
- color: hsl(var(--tn-fg-bright));
1683
- }
1684
-
1685
- .fw-dev-stats-value--cyan {
1686
- color: hsl(var(--tn-cyan));
1687
- }
1688
-
1689
- .fw-dev-stats-value--warning {
1690
- color: hsl(var(--tn-yellow));
1691
- }
1692
-
1693
- .fw-dev-stats-value--bad {
1694
- color: hsl(var(--tn-red));
1695
- }
1696
-
1697
- .fw-dev-stats-value--good {
1698
- color: hsl(var(--tn-green));
1699
- }
1700
-
1701
- /* Track badges */
1702
- .fw-dev-track-badge {
1703
- font-size: 10px;
1704
- font-family: ui-monospace, monospace;
1705
- text-transform: uppercase;
1706
- padding: 0.125rem 0.375rem;
1707
- }
1708
-
1709
- .fw-dev-track-badge--video {
1710
- background: hsl(var(--tn-blue) / 0.2);
1711
- color: hsl(var(--tn-blue));
1712
- }
1713
-
1714
- .fw-dev-track-badge--audio {
1715
- background: hsl(var(--tn-green) / 0.2);
1716
- color: hsl(var(--tn-green));
1717
- }
1718
-
1719
- .fw-dev-track-badge--other {
1720
- background: hsl(var(--tn-yellow) / 0.2);
1721
- color: hsl(var(--tn-yellow));
1722
- }
1723
-
1724
- .fw-dev-track-info {
1725
- display: flex;
1726
- flex-wrap: wrap;
1727
- gap: 0.5rem;
1728
- font-size: 10px;
1729
- color: hsl(var(--tn-fg-dark));
1730
- }
1731
-
1732
- /* Empty state */
1733
- .fw-dev-empty,
1734
- .fw-dev-list-empty {
1735
- padding: 1rem 0.75rem;
1736
- text-align: center;
1737
- color: hsl(var(--tn-fg-dark));
1738
- }
1739
-
1740
- /* Chevron icon (expand/collapse toggle) */
1741
- .fw-dev-chevron {
1742
- transition: transform 0.15s;
1743
- }
1744
-
1745
- .fw-dev-chevron--open {
1746
- transform: rotate(180deg);
1747
- }
1748
-
1749
- /* Combo wrapper (relative for tooltip positioning) */
1750
- .fw-dev-combo {
1751
- position: relative;
1752
- }
1753
-
1754
- /* Combo button (alias for fw-dev-combo-item) */
1755
- .fw-dev-combo-btn {
1756
- width: 100%;
1757
- display: flex;
1758
- align-items: center;
1759
- gap: 0.5rem;
1760
- padding: 0.5rem 0.75rem;
1761
- text-align: left;
1762
- background: transparent;
1763
- border: none;
1764
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1765
- color: hsl(var(--tn-fg));
1766
- cursor: pointer;
1767
- transition: background-color 0.15s;
1768
- }
1769
-
1770
- .fw-dev-combo-btn:last-child {
1771
- border-bottom: none;
1772
- }
1773
-
1774
- .fw-dev-combo-btn:hover {
1775
- background: hsl(var(--tn-bg) / 0.5);
1776
- }
1777
-
1778
- .fw-dev-combo-btn--active {
1779
- background: hsl(var(--tn-bg-visual));
1780
- color: hsl(var(--tn-fg-bright));
1781
- box-shadow: inset 0 0 0 1px hsl(var(--tn-blue));
1782
- }
1783
-
1784
- .fw-dev-combo-btn--disabled {
1785
- opacity: 0.4;
1786
- }
1787
-
1788
- .fw-dev-combo-btn--codec-warn {
1789
- background: hsl(var(--tn-yellow) / 0.05);
1790
- }
1791
-
1792
- .fw-dev-combo-btn--codec-warn:hover {
1793
- background: hsl(var(--tn-yellow) / 0.1);
1794
- }
1795
-
1796
- /* Combo rank modifiers */
1797
- .fw-dev-combo-rank--disabled {
1798
- background: hsl(var(--tn-fg-gutter) / 0.3);
1799
- color: hsl(var(--tn-fg-gutter));
1800
- }
1801
-
1802
- .fw-dev-combo-rank--warn {
1803
- background: hsl(var(--tn-yellow) / 0.3);
1804
- color: hsl(var(--tn-yellow));
1805
- }
1806
-
1807
- /* Combo type modifiers */
1808
- .fw-dev-combo-type--disabled {
1809
- color: hsl(var(--tn-fg-gutter));
1810
- }
1811
-
1812
- .fw-dev-combo-type--warn {
1813
- color: hsl(var(--tn-yellow));
1814
- }
1815
-
1816
- /* Combo score modifiers (additional) */
1817
- .fw-dev-combo-score--disabled {
1818
- background: hsl(var(--tn-fg-gutter) / 0.2);
1819
- color: hsl(var(--tn-fg-gutter));
1820
- }
1821
-
1822
- .fw-dev-combo-score--mid {
1823
- background: hsl(var(--tn-blue) / 0.2);
1824
- color: hsl(var(--tn-blue));
1825
- }
1826
-
1827
- /* Tooltip additional classes */
1828
- .fw-dev-tooltip-tracks {
1829
- color: hsl(var(--tn-fg-dark));
1830
- margin-top: 0.25rem;
1831
- }
1832
-
1833
- .fw-dev-tooltip-value {
1834
- color: hsl(var(--tn-fg));
1835
- }
1836
-
1837
- .fw-dev-tooltip-row {
1838
- color: hsl(var(--tn-fg-dark));
1839
- margin-bottom: 0.125rem;
1840
- }
1841
-
1842
- .fw-dev-tooltip-bonus {
1843
- color: hsl(var(--tn-green));
1844
- }
1845
-
1846
- .fw-dev-tooltip-penalty {
1847
- color: hsl(var(--tn-red));
1848
- }
1849
-
1850
- .fw-dev-tooltip-weight {
1851
- color: hsl(var(--tn-fg-gutter));
1852
- font-size: 9px;
1853
- }
1854
-
1855
- /* =====================================================
1856
- DEV MODE STATS TAB
1857
- ===================================================== */
1858
-
1859
- /* Section header modifier */
1860
- .fw-dev-section-header {
1861
- margin-top: 0.5rem;
1862
- }
1863
-
1864
- /* Playback rate hero section */
1865
- .fw-dev-rate {
1866
- display: flex;
1867
- align-items: baseline;
1868
- gap: 0.5rem;
1869
- margin-bottom: 0.5rem;
1870
- }
1871
-
1872
- .fw-dev-rate-value {
1873
- font-size: 1.5rem;
1874
- font-weight: 700;
1875
- font-variant-numeric: tabular-nums;
1876
- }
1877
-
1878
- .fw-dev-rate-status {
1879
- font-size: 10px;
1880
- color: hsl(var(--tn-fg-dark));
1881
- text-transform: uppercase;
1882
- }
1883
-
1884
- .fw-dev-rate-stats {
1885
- display: flex;
1886
- gap: 1rem;
1887
- font-size: 10px;
1888
- color: hsl(var(--tn-fg-dark));
1889
- }
1890
-
1891
- /* Stat value modifiers */
1892
- .fw-dev-stat-value--good {
1893
- color: hsl(var(--tn-green));
1894
- }
1895
-
1896
- .fw-dev-stat-value--accent {
1897
- color: hsl(var(--tn-blue));
1898
- }
1899
-
1900
- .fw-dev-stat-value--warn {
1901
- color: hsl(var(--tn-yellow));
1902
- }
1903
-
1904
- .fw-dev-stat-value--bad {
1905
- color: hsl(var(--tn-red));
1906
- }
1907
-
1908
- /* Stats row (key-value pair) */
1909
- .fw-dev-stat {
1910
- display: flex;
1911
- justify-content: space-between;
1912
- padding: 0.5rem 0.75rem;
1913
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1914
- }
1915
-
1916
- .fw-dev-stat:last-child {
1917
- border-bottom: none;
1918
- }
1919
-
1920
- .fw-dev-stat-label {
1921
- color: hsl(var(--tn-fg-dark));
1922
- }
1923
-
1924
- .fw-dev-stat-value {
1925
- color: hsl(var(--tn-fg-bright));
1926
- }
1927
-
1928
- /* Track display */
1929
- .fw-dev-track {
1930
- padding: 0.5rem 0.75rem;
1931
- border-bottom: 1px solid hsl(var(--tn-fg-gutter) / 0.2);
1932
- }
1933
-
1934
- .fw-dev-track:last-child {
1935
- border-bottom: none;
1936
- }
1937
-
1938
- .fw-dev-track-header {
1939
- display: flex;
1940
- align-items: center;
1941
- gap: 0.5rem;
1942
- margin-bottom: 0.25rem;
1943
- }
1944
-
1945
- .fw-dev-track-codec {
1946
- font-size: 10px;
1947
- color: hsl(var(--tn-fg));
1948
- font-weight: 500;
1949
- }
1950
-
1951
- .fw-dev-track-id {
1952
- font-size: 10px;
1953
- color: hsl(var(--tn-fg-gutter));
1954
- margin-left: auto;
1955
- }
1956
-
1957
- .fw-dev-track-meta {
1958
- display: flex;
1959
- flex-wrap: wrap;
1960
- gap: 0.5rem;
1961
- font-size: 10px;
1962
- color: hsl(var(--tn-fg-dark));
1963
- }
1964
-
1965
- /* No tracks state */
1966
- .fw-dev-no-tracks {
1967
- padding: 0.75rem;
1968
- text-align: center;
1969
- }
1970
-
1971
- .fw-dev-no-tracks-text {
1972
- color: hsl(var(--tn-fg-dark));
1973
- font-size: 10px;
1974
- }
1975
-
1976
- .fw-dev-no-tracks-type {
1977
- color: hsl(var(--tn-fg-gutter));
1978
- margin-left: 0.25rem;
1979
- }
1980
- }
1981
-
1982
- `;
1983
-
1984
- exports.sharedStyles = sharedStyles;
1985
- //# sourceMappingURL=shared-styles.js.map