eb-player 2.0.15 → 2.0.18

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 (44) hide show
  1. package/dist/build/eb-player.css +516 -58
  2. package/dist/build/ebplayer.bundle.js +309 -112
  3. package/dist/build/ebplayer.bundle.js.map +1 -1
  4. package/dist/build/theme-forja.css +409 -4
  5. package/dist/build/theme-lequipe.css +7 -14
  6. package/dist/build/theme-modern.css +6 -9
  7. package/dist/build/theme-radio.css +4 -1
  8. package/dist/build/theme-snrt.css +4 -1
  9. package/dist/build/theme-v2.css +50 -22
  10. package/dist/build/types/core/command-handler.d.ts +1 -0
  11. package/dist/build/types/core/command-handler.d.ts.map +1 -1
  12. package/dist/build/types/core/config.d.ts +2 -1
  13. package/dist/build/types/core/config.d.ts.map +1 -1
  14. package/dist/build/types/core/event-bus.d.ts +1 -0
  15. package/dist/build/types/core/event-bus.d.ts.map +1 -1
  16. package/dist/build/types/core/fsm.d.ts +4 -1
  17. package/dist/build/types/core/fsm.d.ts.map +1 -1
  18. package/dist/build/types/core/i18n.d.ts.map +1 -1
  19. package/dist/build/types/core/lifecycle.d.ts.map +1 -1
  20. package/dist/build/types/core/player-state.d.ts.map +1 -1
  21. package/dist/build/types/eb-player.d.ts +23 -10
  22. package/dist/build/types/eb-player.d.ts.map +1 -1
  23. package/dist/build/types/engines/base-engine.d.ts.map +1 -1
  24. package/dist/build/types/engines/hls.d.ts.map +1 -1
  25. package/dist/build/types/integrations/p2p-manager.d.ts +9 -0
  26. package/dist/build/types/integrations/p2p-manager.d.ts.map +1 -1
  27. package/dist/build/types/skin/brand/forja-playlist-bar.d.ts.map +1 -1
  28. package/dist/build/types/skin/component-registry.d.ts.map +1 -1
  29. package/dist/build/types/skin/controls/channel-name.d.ts +16 -0
  30. package/dist/build/types/skin/controls/channel-name.d.ts.map +1 -0
  31. package/dist/build/types/skin/controls/play-pause-button.d.ts.map +1 -1
  32. package/dist/build/types/skin/controls/settings-panel.d.ts.map +1 -1
  33. package/dist/build/types/skin/controls/time-display.d.ts.map +1 -1
  34. package/dist/build/types/skin/overlays/loading-spinner.d.ts +1 -1
  35. package/dist/build/types/skin/overlays/loading-spinner.d.ts.map +1 -1
  36. package/dist/build/types/skin/skin-root.d.ts.map +1 -1
  37. package/dist/eb-player.css +516 -58
  38. package/dist/theme-forja.css +409 -4
  39. package/dist/theme-lequipe.css +7 -14
  40. package/dist/theme-modern.css +6 -9
  41. package/dist/theme-radio.css +4 -1
  42. package/dist/theme-snrt.css +4 -1
  43. package/dist/theme-v2.css +50 -22
  44. package/package.json +4 -2
@@ -46,14 +46,419 @@
46
46
  }
47
47
 
48
48
  /**
49
- * Forja theme overrides
49
+ * Forja theme
50
50
  *
51
- * Applied when the container has [data-theme="forja"].
52
- * Uses higher specificity than base.css .eb-player selector.
51
+ * Applied when [data-theme="forja"].
52
+ * Black background, red accent, flat transport buttons,
53
+ * two-row bottom bar: seekbar + live label on row 1,
54
+ * play-pause + volume on the left / settings + pip + fullscreen on the right on row 2.
53
55
  */
54
56
 
55
- [data-theme="forja"] .eb-player {
57
+ /* ============================================================
58
+ Root vars & container
59
+ ============================================================ */
60
+ [data-theme="forja"] {
56
61
  --eb-color-primary: #FC013B;
62
+ --eb-color-progress: #FC013B;
63
+ --eb-accent: #FC013B;
64
+ }
65
+
66
+ [data-theme="forja"] .eb-player {
67
+ --eb-color-background: #000;
68
+ --eb-color-text: #fff;
69
+ --eb-font-size-base: 14px;
70
+ font-family: Arial, sans-serif;
71
+ color: #fff;
72
+ }
73
+
74
+ /* ============================================================
75
+ Top bar: hidden (no top-bar items in forja layout)
76
+ ============================================================ */
77
+ [data-theme="forja"] .eb-player .eb-top-bar {
78
+ display: none;
79
+ }
80
+
81
+ /* ============================================================
82
+ Bottom bar gradient
83
+ ============================================================ */
84
+ [data-theme="forja"] .eb-player .eb-bottom-bar__gradient {
85
+ height: 100px;
86
+ background: linear-gradient(to top, rgba(0,0,0,.85), transparent);
87
+ }
88
+
89
+ /* ============================================================
90
+ Bottom bar: two-row layout
91
+ Row 1: seekbar (flex:1) | live-sync label (right)
92
+ Row 2: play-pause + volume (left) | settings + pip + fullscreen (right)
93
+ ============================================================ */
94
+ [data-theme="forja"] .eb-player .eb-bottom-bar__controls-row {
95
+ flex-wrap: wrap;
96
+ align-items: center;
97
+ padding: 0 12px 10px;
98
+ gap: 6px;
99
+ row-gap: 4px;
100
+ }
101
+
102
+ /* Row 1: seekbar spans full width */
103
+ [data-theme="forja"] .eb-player .eb-bottom-bar__seekbar-zone {
104
+ order: -1;
105
+ flex: 1;
106
+ min-width: 0;
107
+ }
108
+
109
+ /* Invisible flex break between row 1 and row 2 */
110
+ [data-theme="forja"] .eb-player .eb-bottom-bar__controls-row::after {
111
+ content: '';
112
+ width: 100%;
113
+ height: 0;
114
+ order: 0;
115
+ flex-shrink: 0;
116
+ }
117
+
118
+ /* Row 2: play-pause + volume on the left */
119
+ [data-theme="forja"] .eb-player .eb-slot-play-pause,
120
+ [data-theme="forja"] .eb-player .eb-slot-volume {
121
+ order: 1;
122
+ }
123
+
124
+ /* Row 2: live-sync pushed to the right */
125
+ [data-theme="forja"] .eb-player .eb-slot-live-sync {
126
+ order: 1;
127
+ margin-left: auto;
128
+ }
129
+
130
+ [data-theme="forja"] .eb-player .eb-slot-settings,
131
+ [data-theme="forja"] .eb-player .eb-slot-pip,
132
+ [data-theme="forja"] .eb-player .eb-slot-fullscreen {
133
+ order: 1;
134
+ }
135
+
136
+ /* ============================================================
137
+ Controls visibility transitions
138
+ ============================================================ */
139
+ [data-theme="forja"] .eb-player.eb-controls-visible .eb-bottom-bar,
140
+ [data-theme="forja"] .eb-player.eb-controls-visible .eb-middle-bar {
141
+ opacity: 1;
142
+ transition: opacity .25s;
143
+ }
144
+
145
+ [data-theme="forja"] .eb-player.eb-controls-hidden .eb-bottom-bar,
146
+ [data-theme="forja"] .eb-player.eb-controls-hidden .eb-middle-bar {
147
+ opacity: 0;
148
+ transition: opacity .25s;
149
+ }
150
+
151
+ /* ============================================================
152
+ Middle bar: flat grey transport (no circles)
153
+ ============================================================ */
154
+ [data-theme="forja"] .eb-player .eb-middle-bar {
155
+ gap: 24px;
156
+ }
157
+
158
+ [data-theme="forja"] .eb-player .eb-middle-bar__play-btn {
159
+ width: 72px;
160
+ height: 72px;
161
+ border-radius: 0;
162
+ background: transparent;
163
+ border: none;
164
+ color: rgba(255,255,255,.7);
165
+ padding: 0;
166
+ transition: color .15s, transform .15s;
167
+ }
168
+
169
+ [data-theme="forja"] .eb-player .eb-middle-bar__play-btn:hover {
170
+ color: rgba(255,255,255,.95);
171
+ }
172
+
173
+ [data-theme="forja"] .eb-player .eb-middle-bar__play-btn:active {
174
+ transform: scale(.9);
175
+ }
176
+
177
+ [data-theme="forja"] .eb-player .eb-middle-bar__play-btn .eb-icon {
178
+ width: 52px;
179
+ height: 52px;
180
+ fill: currentColor;
181
+ stroke: none;
182
+ }
183
+
184
+ [data-theme="forja"] .eb-player .eb-middle-bar__seek-btn {
185
+ width: 52px;
186
+ height: 52px;
187
+ border-radius: 0;
188
+ background: transparent;
189
+ border: none;
190
+ color: rgba(255,255,255,.65);
191
+ display: flex;
192
+ flex-direction: column;
193
+ align-items: center;
194
+ justify-content: center;
195
+ gap: 1px;
196
+ padding: 0;
197
+ transition: color .15s, transform .15s;
198
+ }
199
+
200
+ [data-theme="forja"] .eb-player .eb-middle-bar__seek-btn:hover {
201
+ color: rgba(255,255,255,.9);
202
+ }
203
+
204
+ [data-theme="forja"] .eb-player .eb-middle-bar__seek-btn:active {
205
+ transform: scale(.9);
206
+ }
207
+
208
+ [data-theme="forja"] .eb-player .eb-seek-circle {
209
+ width: 28px;
210
+ height: 28px;
211
+ fill: currentColor;
212
+ stroke: none;
213
+ }
214
+
215
+ [data-theme="forja"] .eb-player .eb-seek-label {
216
+ font-size: .7em;
217
+ font-weight: 700;
218
+ line-height: 1;
219
+ }
220
+
221
+ /* ============================================================
222
+ Bottom-bar control buttons: flat icon style
223
+ ============================================================ */
224
+ [data-theme="forja"] .eb-player .eb-play-pause,
225
+ [data-theme="forja"] .eb-player .eb-fullscreen,
226
+ [data-theme="forja"] .eb-player .eb-pip,
227
+ [data-theme="forja"] .eb-player .eb-settings-btn,
228
+ [data-theme="forja"] .eb-player .eb-volume-mute {
229
+ color: rgba(255,255,255,.88);
230
+ background: transparent;
231
+ border: none;
232
+ border-radius: 2px;
233
+ width: 36px;
234
+ height: 36px;
235
+ transition: color .15s;
236
+ flex-shrink: 0;
237
+ }
238
+
239
+ [data-theme="forja"] .eb-player .eb-play-pause:hover,
240
+ [data-theme="forja"] .eb-player .eb-fullscreen:hover,
241
+ [data-theme="forja"] .eb-player .eb-pip:hover,
242
+ [data-theme="forja"] .eb-player .eb-settings-btn:hover,
243
+ [data-theme="forja"] .eb-player .eb-volume-mute:hover {
244
+ color: #fff;
245
+ }
246
+
247
+ [data-theme="forja"] .eb-player .eb-play-pause .eb-icon,
248
+ [data-theme="forja"] .eb-player .eb-fullscreen .eb-icon,
249
+ [data-theme="forja"] .eb-player .eb-pip .eb-icon,
250
+ [data-theme="forja"] .eb-player .eb-settings-btn .eb-icon,
251
+ [data-theme="forja"] .eb-player .eb-volume-mute .eb-icon {
252
+ width: 22px;
253
+ height: 22px;
254
+ }
255
+
256
+ [data-theme="forja"] .eb-player .eb-play-pause .eb-icon {
257
+ fill: currentColor;
258
+ stroke: none;
259
+ }
260
+
261
+ /* ============================================================
262
+ Seekbar: thin red track
263
+ ============================================================ */
264
+ [data-theme="forja"] .eb-player .eb-seekbar-track {
265
+ height: 3px;
266
+ background: rgba(255,255,255,.25);
267
+ border-radius: 0;
268
+ transition: height .15s;
269
+ }
270
+
271
+ [data-theme="forja"] .eb-player .eb-seekbar:hover .eb-seekbar-track {
272
+ height: 5px;
273
+ }
274
+
275
+ [data-theme="forja"] .eb-player .eb-seekbar-buffered {
276
+ background: rgba(255,255,255,.3);
277
+ border-radius: 0;
278
+ }
279
+
280
+ [data-theme="forja"] .eb-player .eb-seekbar-progress {
281
+ background: var(--eb-color-progress, var(--eb-color-primary, #FC013B));
282
+ border-radius: 0;
283
+ }
284
+
285
+ [data-theme="forja"] .eb-player .eb-seekbar-thumb {
286
+ width: 12px;
287
+ height: 12px;
288
+ right: -6px;
289
+ background: #FC013B;
290
+ box-shadow: none;
291
+ border-radius: 50%;
292
+ }
293
+
294
+ /* ============================================================
295
+ Volume: always-visible inline slider
296
+ ============================================================ */
297
+ [data-theme="forja"] .eb-player .eb-volume-control {
298
+ flex-direction: row;
299
+ gap: 0;
300
+ }
301
+
302
+ [data-theme="forja"] .eb-player .eb-volume-track {
303
+ width: 72px;
304
+ height: 3px;
305
+ background: rgba(255,255,255,.25);
306
+ border-radius: 0;
307
+ overflow: visible;
308
+ margin: 0 4px 0 2px;
309
+ transition: height .15s;
310
+ }
311
+
312
+ [data-theme="forja"] .eb-player .eb-volume-control:hover .eb-volume-track {
313
+ height: 4px;
314
+ }
315
+
316
+ [data-theme="forja"] .eb-player .eb-volume-fill {
317
+ background: #FC013B;
318
+ border-radius: 0;
319
+ }
320
+
321
+ [data-theme="forja"] .eb-player .eb-volume-thumb {
322
+ width: 11px;
323
+ height: 11px;
324
+ background: #fff;
325
+ box-shadow: none;
326
+ transform: translate(-50%, -50%) scale(0);
327
+ transition: transform .15s;
328
+ }
329
+
330
+ [data-theme="forja"] .eb-player .eb-volume-control:hover .eb-volume-thumb {
331
+ transform: translate(-50%, -50%) scale(1);
332
+ }
333
+
334
+ /* ============================================================
335
+ Live-sync: red LIVE badge
336
+ ============================================================ */
337
+ [data-theme="forja"] .eb-player .eb-live-sync {
338
+ background: #FC013B;
339
+ color: #fff;
340
+ width: auto;
341
+ height: auto;
342
+ padding: 4px 8px;
343
+ font-size: 12px;
344
+ font-weight: 700;
345
+ letter-spacing: 0.04em;
346
+ text-transform: uppercase;
347
+ border-radius: 3px;
348
+ gap: 0;
349
+ transition: background .15s;
350
+ }
351
+
352
+ [data-theme="forja"] .eb-player .eb-live-sync__icon {
353
+ display: none;
354
+ }
355
+
356
+ [data-theme="forja"] .eb-player .eb-live-sync__dot {
357
+ display: none;
358
+ }
359
+
360
+ [data-theme="forja"] .eb-player .eb-live-sync__label {
361
+ display: block;
362
+ font-size: 12px;
363
+ font-weight: 700;
364
+ letter-spacing: 0.5px;
365
+ line-height: 1;
366
+ }
367
+
368
+ [data-theme="forja"] .eb-player .eb-live-sync:not(.eb-live-synced) {
369
+ background: rgba(120,120,120,.6);
370
+ }
371
+
372
+ [data-theme="forja"] .eb-player .eb-live-sync:hover,
373
+ [data-theme="forja"] .eb-player .eb-live-sync:active {
374
+ background: #c9012f;
375
+ }
376
+
377
+ [data-theme="forja"] .eb-player .eb-live-sync:not(.eb-live-synced):hover {
378
+ background: rgba(150,150,150,.7);
379
+ }
380
+
381
+ /* ============================================================
382
+ Settings panel
383
+ ============================================================ */
384
+ [data-theme="forja"] .eb-player .eb-settings-panel {
385
+ background: rgba(20, 20, 20, .95);
386
+ border-radius: 4px;
387
+ min-width: 240px;
388
+ box-shadow: 0 4px 24px rgba(0,0,0,.7);
389
+ }
390
+
391
+ [data-theme="forja"] .eb-player .eb-settings-category,
392
+ [data-theme="forja"] .eb-player .eb-settings-item,
393
+ [data-theme="forja"] .eb-player .eb-settings-back {
394
+ padding: 13px 16px;
395
+ font-size: 13px;
396
+ color: rgba(255,255,255,.85);
397
+ border-bottom: 1px solid rgba(255,255,255,.07);
398
+ transition: background .12s;
399
+ }
400
+
401
+ [data-theme="forja"] .eb-player .eb-settings-category:last-child,
402
+ [data-theme="forja"] .eb-player .eb-settings-item:last-child {
403
+ border-bottom: none;
404
+ }
405
+
406
+ [data-theme="forja"] .eb-player .eb-settings-category:hover,
407
+ [data-theme="forja"] .eb-player .eb-settings-item:hover,
408
+ [data-theme="forja"] .eb-player .eb-settings-back:hover {
409
+ background: rgba(255,255,255,.06);
410
+ }
411
+
412
+ [data-theme="forja"] .eb-player .eb-settings-item--selected {
413
+ color: #fff;
414
+ font-weight: 500;
415
+ }
416
+
417
+ [data-theme="forja"] .eb-player .eb-settings-item--selected::after {
418
+ content: '';
419
+ width: 10px;
420
+ height: 10px;
421
+ border-radius: 50%;
422
+ background: #FC013B;
423
+ flex-shrink: 0;
424
+ }
425
+
426
+ [data-theme="forja"] .eb-player .eb-settings-item:not(.eb-settings-item--selected)::after {
427
+ content: '';
428
+ width: 10px;
429
+ height: 10px;
430
+ border-radius: 50%;
431
+ border: 2px solid rgba(255,255,255,.25);
432
+ flex-shrink: 0;
433
+ }
434
+
435
+
436
+ /* ============================================================
437
+ Error overlay
438
+ ============================================================ */
439
+ [data-theme="forja"] .eb-player .eb-error {
440
+ background: rgba(0,0,0,.88);
441
+ }
442
+
443
+ [data-theme="forja"] .eb-player .eb-error-retry {
444
+ border-radius: 3px;
445
+ background: rgba(255,255,255,.1);
446
+ border-color: rgba(255,255,255,.15);
447
+ transition: background .2s;
448
+ }
449
+
450
+ [data-theme="forja"] .eb-player .eb-error-retry:hover {
451
+ background: rgba(255,255,255,.18);
452
+ }
453
+
454
+ /* ============================================================
455
+ Toast
456
+ ============================================================ */
457
+ [data-theme="forja"] .eb-player .eb-toast {
458
+ background: rgba(20,20,20,.9);
459
+ border-radius: 3px;
460
+ font-size: 13px;
461
+ padding: 7px 14px;
57
462
  }
58
463
 
59
464
  /**
@@ -74,11 +479,14 @@
74
479
  /* ============================================================
75
480
  Root vars & container
76
481
  ============================================================ */
77
- [data-theme="lequipe"] .eb-player {
482
+ [data-theme="lequipe"] {
78
483
  --eb-color-primary: #d61e00;
79
484
  --eb-color-progress: #d61e00;
80
- --eb-color-background: rgba(10, 10, 20, 0.85);
81
485
  --eb-accent: #d61e00;
486
+ }
487
+
488
+ [data-theme="lequipe"] .eb-player {
489
+ --eb-color-background: rgba(10, 10, 20, 0.85);
82
490
  --eb-color-text: #fff;
83
491
  --eb-font-family: 'Inter', -apple-system, sans-serif;
84
492
  --eb-font-size-base: 14px;
@@ -349,9 +757,9 @@
349
757
  transition: height .15s;
350
758
  }
351
759
 
352
- /* Solid red fill */
760
+ /* Solid color fill */
353
761
  [data-theme="lequipe"] .eb-player .eb-seekbar-progress {
354
- background: #d61e00;
762
+ background: var(--eb-color-progress, var(--eb-color-primary, #d61e00));
355
763
  border-radius: 3px;
356
764
  transition: height .15s;
357
765
  }
@@ -703,16 +1111,6 @@
703
1111
  flex-shrink: 0;
704
1112
  }
705
1113
 
706
- /* ============================================================
707
- Loading spinner
708
- ============================================================ */
709
- [data-theme="lequipe"] .eb-player .eb-loading .eb-icon {
710
- width: 52px;
711
- height: 52px;
712
- color: rgba(255,255,255,.7);
713
- filter: drop-shadow(0 1px 6px rgba(0,0,0,.5));
714
- animation: eb-spin .75s linear infinite;
715
- }
716
1114
 
717
1115
  /* ============================================================
718
1116
  Error overlay
@@ -851,11 +1249,14 @@
851
1249
  /* ============================================================
852
1250
  Root vars & container
853
1251
  ============================================================ */
854
- [data-theme="modern"] .eb-player {
1252
+ [data-theme="modern"] {
855
1253
  --eb-color-primary: #7c3aed;
856
1254
  --eb-color-progress: #7c3aed;
857
- --eb-color-background: rgba(10, 10, 20, 0.85);
858
1255
  --eb-accent: #1a73e8;
1256
+ }
1257
+
1258
+ [data-theme="modern"] .eb-player {
1259
+ --eb-color-background: rgba(10, 10, 20, 0.85);
859
1260
  --eb-font-family: 'Inter', sans-serif;
860
1261
  font-family: 'Inter', sans-serif;
861
1262
  border-radius: 14px;
@@ -1048,7 +1449,7 @@
1048
1449
  }
1049
1450
 
1050
1451
  [data-theme="modern"] .eb-player .eb-seekbar-progress {
1051
- background: linear-gradient(90deg, #a78bfa, #7c3aed);
1452
+ background: var(--eb-color-progress, var(--eb-color-primary, #7c3aed));
1052
1453
  border-radius: 3px;
1053
1454
  transition: height .15s;
1054
1455
  }
@@ -1232,12 +1633,6 @@
1232
1633
  font-weight: 600;
1233
1634
  }
1234
1635
 
1235
- /* ============================================================
1236
- Loading spinner
1237
- ============================================================ */
1238
- [data-theme="modern"] .eb-player .eb-loading .eb-icon {
1239
- color: rgba(255,255,255,.7);
1240
- }
1241
1636
 
1242
1637
  /* ============================================================
1243
1638
  Error overlay
@@ -1352,8 +1747,11 @@
1352
1747
  * Uses higher specificity than base.css .eb-player selector.
1353
1748
  */
1354
1749
 
1355
- [data-theme="radio"] .eb-player {
1750
+ [data-theme="radio"] {
1356
1751
  --eb-color-primary: #F4A261;
1752
+ }
1753
+
1754
+ [data-theme="radio"] .eb-player {
1357
1755
  --eb-color-background: rgba(20, 20, 30, 0.95);
1358
1756
  }
1359
1757
 
@@ -1364,8 +1762,11 @@
1364
1762
  * Uses higher specificity than base.css .eb-player selector.
1365
1763
  */
1366
1764
 
1367
- [data-theme="snrt"] .eb-player {
1765
+ [data-theme="snrt"] {
1368
1766
  --eb-color-primary: #006633;
1767
+ }
1768
+
1769
+ [data-theme="snrt"] .eb-player {
1369
1770
  --eb-color-background: rgba(0, 0, 0, 0.9);
1370
1771
  }
1371
1772
 
@@ -1373,7 +1774,7 @@
1373
1774
  * V2 theme — based on snrtlive.ma (Aloula) player styling
1374
1775
  *
1375
1776
  * Applied when the container has [data-theme="v2"].
1376
- * Dark UI with orange accent (#ff841f), Inter font, rounded container,
1777
+ * Dark UI with indigo accent (#3d4097), Inter font, rounded container,
1377
1778
  * backdrop-blur panels, expandable volume, two-row bottom bar
1378
1779
  * (seekbar on top, buttons below), gradient overlays, centered
1379
1780
  * frosted-glass transport circles, and refined slide/fade animations.
@@ -1387,11 +1788,14 @@
1387
1788
  /* ============================================================
1388
1789
  Root vars & container
1389
1790
  ============================================================ */
1791
+ [data-theme="v2"] {
1792
+ --eb-color-primary: #3d4097;
1793
+ --eb-color-progress: #3d4097;
1794
+ --eb-accent: #3d4097;
1795
+ }
1796
+
1390
1797
  [data-theme="v2"] .eb-player {
1391
- --eb-color-primary: #ff841f;
1392
- --eb-color-progress: #ff841f;
1393
1798
  --eb-color-background: rgba(10, 10, 20, 0.85);
1394
- --eb-accent: #ff841f;
1395
1799
  --eb-color-text: #fff;
1396
1800
  --eb-font-family: 'Inter', -apple-system, sans-serif;
1397
1801
  --eb-font-size-base: 14px;
@@ -1479,11 +1883,46 @@
1479
1883
  }
1480
1884
 
1481
1885
  /* ============================================================
1482
- Bottom bar: single-row layout
1483
- play | live | time | ——seekbar—— | settings | volume | fullscreen
1886
+ Bottom bar: two-row layout
1887
+ Row 1: LIVE + time
1888
+ Row 2: play-pause | ——seekbar—— | volume | fullscreen
1484
1889
  PiP / Cast are in the top bar (via THEME_LAYOUTS.v2 in config.ts)
1485
1890
  ============================================================ */
1486
1891
 
1892
+ [data-theme="v2"] .eb-player .eb-bottom-bar__controls-row {
1893
+ flex-wrap: wrap;
1894
+ align-items: center;
1895
+ row-gap: 2px;
1896
+ }
1897
+
1898
+ /* Row 1: live-sync and time float above, offset to align with seekbar start */
1899
+ [data-theme="v2"] .eb-player .eb-slot-live-sync,
1900
+ [data-theme="v2"] .eb-player .eb-slot-time {
1901
+ order: -1;
1902
+ }
1903
+
1904
+ /* Align row 1 with the seekbar: offset by play-pause width (38px) + gap (8px) */
1905
+ [data-theme="v2"] .eb-player .eb-slot-live-sync {
1906
+ margin-left: calc(38px + 8px);
1907
+ }
1908
+
1909
+ /* Invisible full-width flex break between row 1 and row 2 */
1910
+ [data-theme="v2"] .eb-player .eb-bottom-bar__controls-row::after {
1911
+ content: '';
1912
+ width: 100%;
1913
+ height: 0;
1914
+ order: 0;
1915
+ flex-shrink: 0;
1916
+ }
1917
+
1918
+ /* Row 2: play-pause, seekbar, volume, fullscreen */
1919
+ [data-theme="v2"] .eb-player .eb-slot-play-pause,
1920
+ [data-theme="v2"] .eb-player .eb-bottom-bar__seekbar-zone,
1921
+ [data-theme="v2"] .eb-player .eb-slot-volume,
1922
+ [data-theme="v2"] .eb-player .eb-slot-fullscreen {
1923
+ order: 1;
1924
+ }
1925
+
1487
1926
  /* ============================================================
1488
1927
  Middle bar: glassmorphism transport circles
1489
1928
  ============================================================ */
@@ -1668,9 +2107,9 @@
1668
2107
  transition: height .15s;
1669
2108
  }
1670
2109
 
1671
- /* Orange gradient fill */
2110
+ /* Gradient fill — brightens toward the right */
1672
2111
  [data-theme="v2"] .eb-player .eb-seekbar-progress {
1673
- background: linear-gradient(90deg, #ff841f, color-mix(in srgb, #ff841f 70%, #fff));
2112
+ background: linear-gradient(90deg, var(--eb-color-progress, var(--eb-color-primary, #3d4097)), color-mix(in srgb, var(--eb-color-progress, var(--eb-color-primary, #3d4097)) 70%, #fff));
1674
2113
  border-radius: 3px;
1675
2114
  transition: height .15s;
1676
2115
  }
@@ -1680,7 +2119,7 @@
1680
2119
  height: 14px;
1681
2120
  right: -7px;
1682
2121
  background: #fff;
1683
- box-shadow: 0 0 0 3px rgba(255,132,31,.45);
2122
+ box-shadow: 0 0 0 3px rgba(61,64,151,.45);
1684
2123
  }
1685
2124
 
1686
2125
  /* ============================================================
@@ -1748,7 +2187,7 @@
1748
2187
  }
1749
2188
 
1750
2189
  [data-theme="v2"] .eb-player .eb-volume-fill {
1751
- background: var(--eb-color-primary, #ff841f);
2190
+ background: var(--eb-color-primary, #3d4097);
1752
2191
  }
1753
2192
 
1754
2193
  [data-theme="v2"] .eb-player .eb-volume-thumb {
@@ -1889,8 +2328,8 @@
1889
2328
  width: 10px;
1890
2329
  height: 10px;
1891
2330
  border-radius: 50%;
1892
- background: var(--eb-accent, #ff841f);
1893
- box-shadow: 0 0 0 3px rgba(255,132,31,.25);
2331
+ background: var(--eb-accent, #3d4097);
2332
+ box-shadow: 0 0 0 3px rgba(61,64,151,.25);
1894
2333
  flex-shrink: 0;
1895
2334
  }
1896
2335
 
@@ -1910,16 +2349,6 @@
1910
2349
  font-weight: 600;
1911
2350
  }
1912
2351
 
1913
- /* ============================================================
1914
- Loading spinner
1915
- ============================================================ */
1916
- [data-theme="v2"] .eb-player .eb-loading .eb-icon {
1917
- width: 52px;
1918
- height: 52px;
1919
- color: rgba(255,255,255,.7);
1920
- filter: drop-shadow(0 1px 6px rgba(0,0,0,.5));
1921
- animation: eb-spin .75s linear infinite;
1922
- }
1923
2352
 
1924
2353
  /* ============================================================
1925
2354
  Error overlay
@@ -2080,16 +2509,25 @@
2080
2509
  z-index: 10;
2081
2510
  }
2082
2511
 
2512
+ .eb-loading-slot {
2513
+ position: absolute;
2514
+ inset: 0;
2515
+ display: flex;
2516
+ align-items: center;
2517
+ justify-content: center;
2518
+ pointer-events: none;
2519
+ z-index: 26;
2520
+ }
2521
+
2083
2522
  /* Poster image */
2084
2523
  .eb-poster {
2085
2524
  position: absolute;
2086
2525
  inset: 0;
2087
2526
  width: 100%;
2088
2527
  height: 100%;
2089
- object-fit: contain;
2528
+ object-fit: cover;
2090
2529
  pointer-events: none;
2091
2530
  background: #000;
2092
- padding: 15%;
2093
2531
  box-sizing: border-box;
2094
2532
  }
2095
2533
 
@@ -2175,6 +2613,10 @@
2175
2613
  min-width: 0;
2176
2614
  }
2177
2615
 
2616
+ .eb-bottom-bar__seekbar-zone:has(.eb-seekbar[hidden]) {
2617
+ display: none;
2618
+ }
2619
+
2178
2620
  /* ============================================================
2179
2621
  Middle bar
2180
2622
  ============================================================ */
@@ -2286,6 +2728,19 @@
2286
2728
  font-variant-numeric: tabular-nums;
2287
2729
  }
2288
2730
 
2731
+ .eb-time-display__offset {
2732
+ color: rgba(255, 255, 255, 0.5);
2733
+ }
2734
+
2735
+ .eb-channel-name {
2736
+ font-size: 13px;
2737
+ line-height: 1;
2738
+ white-space: nowrap;
2739
+ padding: 0 4px;
2740
+ color: #fff;
2741
+ opacity: 0.75;
2742
+ }
2743
+
2289
2744
  /* ============================================================
2290
2745
  Volume control
2291
2746
  ============================================================ */
@@ -2800,7 +3255,7 @@
2800
3255
  }
2801
3256
 
2802
3257
  /* ============================================================
2803
- Loading spinner
3258
+ Loading spinner — CSS arc ring
2804
3259
  ============================================================ */
2805
3260
  .eb-loading {
2806
3261
  display: flex;
@@ -2816,10 +3271,13 @@
2816
3271
  display: none;
2817
3272
  }
2818
3273
 
2819
- .eb-loading .eb-icon {
2820
- width: 40px;
2821
- height: 40px;
2822
- animation: eb-spin 1s linear infinite;
3274
+ .eb-loading-arc {
3275
+ width: 80px;
3276
+ height: 80px;
3277
+ border-radius: 50%;
3278
+ border: 3px solid rgba(255, 255, 255, 0.15);
3279
+ border-top-color: rgba(255, 255, 255, 0.9);
3280
+ animation: eb-spin 1.8s linear infinite;
2823
3281
  }
2824
3282
 
2825
3283
  .eb-loading-text {