eb-player 1.54.55 → 2.0.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 (202) hide show
  1. package/README.md +2 -6
  2. package/dist/build/default.js +1 -1
  3. package/dist/build/eb-player.css +2066 -0
  4. package/dist/build/ebplayer-engines.bundle.js +2393 -0
  5. package/dist/build/ebplayer-engines.bundle.js.map +1 -0
  6. package/dist/build/ebplayer.bundle.js +6580 -0
  7. package/dist/build/ebplayer.bundle.js.map +1 -0
  8. package/dist/build/theme-forja.css +10 -0
  9. package/dist/build/theme-forja.js +1 -0
  10. package/dist/build/theme-modern.css +520 -0
  11. package/dist/build/theme-radio.css +11 -0
  12. package/dist/build/theme-radio.js +1 -0
  13. package/dist/build/theme-snrt.css +11 -0
  14. package/dist/build/theme-snrt.js +1 -0
  15. package/dist/build/theme-v2.css +661 -0
  16. package/dist/build/types/config.d.ts +139 -0
  17. package/dist/build/types/config.d.ts.map +1 -0
  18. package/dist/build/types/core/command-handler.d.ts +49 -0
  19. package/dist/build/types/core/command-handler.d.ts.map +1 -0
  20. package/dist/build/types/core/config.d.ts +174 -0
  21. package/dist/build/types/core/config.d.ts.map +1 -0
  22. package/dist/build/types/core/css/theme-forja.entry.d.ts +2 -0
  23. package/dist/build/types/core/css/theme-forja.entry.d.ts.map +1 -0
  24. package/dist/build/types/core/css/theme-radio.entry.d.ts +2 -0
  25. package/dist/build/types/core/css/theme-radio.entry.d.ts.map +1 -0
  26. package/dist/build/types/core/css/theme-snrt.entry.d.ts +2 -0
  27. package/dist/build/types/core/css/theme-snrt.entry.d.ts.map +1 -0
  28. package/dist/build/types/core/engine-state-sync.d.ts +38 -0
  29. package/dist/build/types/core/engine-state-sync.d.ts.map +1 -0
  30. package/dist/build/types/core/event-bus.d.ts +87 -0
  31. package/dist/build/types/core/event-bus.d.ts.map +1 -0
  32. package/dist/build/types/core/fsm.d.ts +27 -0
  33. package/dist/build/types/core/fsm.d.ts.map +1 -0
  34. package/dist/build/types/core/i18n.d.ts +51 -0
  35. package/dist/build/types/core/i18n.d.ts.map +1 -0
  36. package/dist/build/types/core/index.d.ts +23 -0
  37. package/dist/build/types/core/index.d.ts.map +1 -0
  38. package/dist/build/types/core/lifecycle.d.ts +96 -0
  39. package/dist/build/types/core/lifecycle.d.ts.map +1 -0
  40. package/dist/build/types/core/player-state.d.ts +15 -0
  41. package/dist/build/types/core/player-state.d.ts.map +1 -0
  42. package/dist/build/types/core/types.d.ts +84 -0
  43. package/dist/build/types/core/types.d.ts.map +1 -0
  44. package/dist/build/types/eb-player-standalone.d.ts +12 -0
  45. package/dist/build/types/eb-player-standalone.d.ts.map +1 -0
  46. package/dist/build/types/eb-player.d.ts +43 -0
  47. package/dist/build/types/eb-player.d.ts.map +1 -0
  48. package/dist/build/types/engine-state-sync.d.ts +38 -0
  49. package/dist/build/types/engine-state-sync.d.ts.map +1 -0
  50. package/dist/build/types/engines/abr/dash.d.ts +56 -0
  51. package/dist/build/types/engines/abr/dash.d.ts.map +1 -0
  52. package/dist/build/types/engines/abr/hls.d.ts +105 -0
  53. package/dist/build/types/engines/abr/hls.d.ts.map +1 -0
  54. package/dist/build/types/engines/base-engine.d.ts +56 -0
  55. package/dist/build/types/engines/base-engine.d.ts.map +1 -0
  56. package/dist/build/types/engines/cdn-loader.d.ts +20 -0
  57. package/dist/build/types/engines/cdn-loader.d.ts.map +1 -0
  58. package/dist/build/types/engines/cdn-token-manager.d.ts +136 -0
  59. package/dist/build/types/engines/cdn-token-manager.d.ts.map +1 -0
  60. package/dist/build/types/engines/dash.d.ts +79 -0
  61. package/dist/build/types/engines/dash.d.ts.map +1 -0
  62. package/dist/build/types/engines/drm.d.ts +54 -0
  63. package/dist/build/types/engines/drm.d.ts.map +1 -0
  64. package/dist/build/types/engines/hls-discontinuity-patch.d.ts +43 -0
  65. package/dist/build/types/engines/hls-discontinuity-patch.d.ts.map +1 -0
  66. package/dist/build/types/engines/hls.d.ts +45 -0
  67. package/dist/build/types/engines/hls.d.ts.map +1 -0
  68. package/dist/build/types/engines/index.d.ts +26 -0
  69. package/dist/build/types/engines/index.d.ts.map +1 -0
  70. package/dist/build/types/engines/ios/hls.d.ts +20 -0
  71. package/dist/build/types/engines/ios/hls.d.ts.map +1 -0
  72. package/dist/build/types/engines/poster/hls.d.ts +35 -0
  73. package/dist/build/types/engines/poster/hls.d.ts.map +1 -0
  74. package/dist/build/types/engines/retry/dash.d.ts +39 -0
  75. package/dist/build/types/engines/retry/dash.d.ts.map +1 -0
  76. package/dist/build/types/engines/retry/hls.d.ts +35 -0
  77. package/dist/build/types/engines/retry/hls.d.ts.map +1 -0
  78. package/dist/build/types/engines/snapshot/dash.d.ts +55 -0
  79. package/dist/build/types/engines/snapshot/dash.d.ts.map +1 -0
  80. package/dist/build/types/engines/snapshot/hls.d.ts +104 -0
  81. package/dist/build/types/engines/snapshot/hls.d.ts.map +1 -0
  82. package/dist/build/types/engines/stall-watchdog.d.ts +41 -0
  83. package/dist/build/types/engines/stall-watchdog.d.ts.map +1 -0
  84. package/dist/build/types/event-bus.d.ts +54 -0
  85. package/dist/build/types/event-bus.d.ts.map +1 -0
  86. package/dist/build/types/fsm.d.ts +27 -0
  87. package/dist/build/types/fsm.d.ts.map +1 -0
  88. package/dist/build/types/i18n.d.ts +51 -0
  89. package/dist/build/types/i18n.d.ts.map +1 -0
  90. package/dist/build/types/index.d.ts +21 -0
  91. package/dist/build/types/index.d.ts.map +1 -0
  92. package/dist/build/types/integrations/ads-manager.d.ts +32 -0
  93. package/dist/build/types/integrations/ads-manager.d.ts.map +1 -0
  94. package/dist/build/types/integrations/chromecast-manager.d.ts +50 -0
  95. package/dist/build/types/integrations/chromecast-manager.d.ts.map +1 -0
  96. package/dist/build/types/integrations/epg-manager.d.ts +22 -0
  97. package/dist/build/types/integrations/epg-manager.d.ts.map +1 -0
  98. package/dist/build/types/integrations/index.d.ts +6 -0
  99. package/dist/build/types/integrations/index.d.ts.map +1 -0
  100. package/dist/build/types/integrations/p2p-manager.d.ts +33 -0
  101. package/dist/build/types/integrations/p2p-manager.d.ts.map +1 -0
  102. package/dist/build/types/integrations/playlist-manager.d.ts +21 -0
  103. package/dist/build/types/integrations/playlist-manager.d.ts.map +1 -0
  104. package/dist/build/types/lifecycle.d.ts +64 -0
  105. package/dist/build/types/lifecycle.d.ts.map +1 -0
  106. package/dist/build/types/player-state.d.ts +15 -0
  107. package/dist/build/types/player-state.d.ts.map +1 -0
  108. package/dist/build/types/skin/bars/bottom-bar.d.ts +16 -0
  109. package/dist/build/types/skin/bars/bottom-bar.d.ts.map +1 -0
  110. package/dist/build/types/skin/bars/middle-bar.d.ts +16 -0
  111. package/dist/build/types/skin/bars/middle-bar.d.ts.map +1 -0
  112. package/dist/build/types/skin/bars/top-bar.d.ts +15 -0
  113. package/dist/build/types/skin/bars/top-bar.d.ts.map +1 -0
  114. package/dist/build/types/skin/base-component.d.ts +69 -0
  115. package/dist/build/types/skin/base-component.d.ts.map +1 -0
  116. package/dist/build/types/skin/brand/forja-playlist-bar.d.ts +15 -0
  117. package/dist/build/types/skin/brand/forja-playlist-bar.d.ts.map +1 -0
  118. package/dist/build/types/skin/brand/snrt-radio-carousel.d.ts +16 -0
  119. package/dist/build/types/skin/brand/snrt-radio-carousel.d.ts.map +1 -0
  120. package/dist/build/types/skin/component-registry.d.ts +16 -0
  121. package/dist/build/types/skin/component-registry.d.ts.map +1 -0
  122. package/dist/build/types/skin/controllers/auto-hide.d.ts +27 -0
  123. package/dist/build/types/skin/controllers/auto-hide.d.ts.map +1 -0
  124. package/dist/build/types/skin/controllers/keyboard.d.ts +29 -0
  125. package/dist/build/types/skin/controllers/keyboard.d.ts.map +1 -0
  126. package/dist/build/types/skin/controls/cast-button.d.ts +15 -0
  127. package/dist/build/types/skin/controls/cast-button.d.ts.map +1 -0
  128. package/dist/build/types/skin/controls/forward-button.d.ts +15 -0
  129. package/dist/build/types/skin/controls/forward-button.d.ts.map +1 -0
  130. package/dist/build/types/skin/controls/fullscreen-button.d.ts +17 -0
  131. package/dist/build/types/skin/controls/fullscreen-button.d.ts.map +1 -0
  132. package/dist/build/types/skin/controls/info-button.d.ts +10 -0
  133. package/dist/build/types/skin/controls/info-button.d.ts.map +1 -0
  134. package/dist/build/types/skin/controls/live-sync-button.d.ts +20 -0
  135. package/dist/build/types/skin/controls/live-sync-button.d.ts.map +1 -0
  136. package/dist/build/types/skin/controls/pip-button.d.ts +21 -0
  137. package/dist/build/types/skin/controls/pip-button.d.ts.map +1 -0
  138. package/dist/build/types/skin/controls/play-pause-button.d.ts +14 -0
  139. package/dist/build/types/skin/controls/play-pause-button.d.ts.map +1 -0
  140. package/dist/build/types/skin/controls/rewind-button.d.ts +15 -0
  141. package/dist/build/types/skin/controls/rewind-button.d.ts.map +1 -0
  142. package/dist/build/types/skin/controls/seekbar.d.ts +43 -0
  143. package/dist/build/types/skin/controls/seekbar.d.ts.map +1 -0
  144. package/dist/build/types/skin/controls/settings-panel.d.ts +45 -0
  145. package/dist/build/types/skin/controls/settings-panel.d.ts.map +1 -0
  146. package/dist/build/types/skin/controls/share-button.d.ts +11 -0
  147. package/dist/build/types/skin/controls/share-button.d.ts.map +1 -0
  148. package/dist/build/types/skin/controls/time-display.d.ts +19 -0
  149. package/dist/build/types/skin/controls/time-display.d.ts.map +1 -0
  150. package/dist/build/types/skin/controls/volume-control.d.ts +21 -0
  151. package/dist/build/types/skin/controls/volume-control.d.ts.map +1 -0
  152. package/dist/build/types/skin/icons/icons-modern.d.ts +10 -0
  153. package/dist/build/types/skin/icons/icons-modern.d.ts.map +1 -0
  154. package/dist/build/types/skin/icons/icons.d.ts +10 -0
  155. package/dist/build/types/skin/icons/icons.d.ts.map +1 -0
  156. package/dist/build/types/skin/icons/sprite.d.ts +39 -0
  157. package/dist/build/types/skin/icons/sprite.d.ts.map +1 -0
  158. package/dist/build/types/skin/index.d.ts +24 -0
  159. package/dist/build/types/skin/index.d.ts.map +1 -0
  160. package/dist/build/types/skin/overlays/error-message.d.ts +14 -0
  161. package/dist/build/types/skin/overlays/error-message.d.ts.map +1 -0
  162. package/dist/build/types/skin/overlays/info-overlay.d.ts +15 -0
  163. package/dist/build/types/skin/overlays/info-overlay.d.ts.map +1 -0
  164. package/dist/build/types/skin/overlays/loading-spinner.d.ts +17 -0
  165. package/dist/build/types/skin/overlays/loading-spinner.d.ts.map +1 -0
  166. package/dist/build/types/skin/overlays/socials-overlay.d.ts +17 -0
  167. package/dist/build/types/skin/overlays/socials-overlay.d.ts.map +1 -0
  168. package/dist/build/types/skin/overlays/toast-notification.d.ts +18 -0
  169. package/dist/build/types/skin/overlays/toast-notification.d.ts.map +1 -0
  170. package/dist/build/types/skin/skin-root.d.ts +80 -0
  171. package/dist/build/types/skin/skin-root.d.ts.map +1 -0
  172. package/dist/build/types/types.d.ts +41 -0
  173. package/dist/build/types/types.d.ts.map +1 -0
  174. package/dist/build/types/utils/chapters.d.ts +16 -0
  175. package/dist/build/types/utils/chapters.d.ts.map +1 -0
  176. package/dist/build/types/utils/format-duration.d.ts +9 -0
  177. package/dist/build/types/utils/format-duration.d.ts.map +1 -0
  178. package/dist/build/types/utils/format-wall-clock.d.ts +6 -0
  179. package/dist/build/types/utils/format-wall-clock.d.ts.map +1 -0
  180. package/dist/build/types/utils/settings-helpers.d.ts +41 -0
  181. package/dist/build/types/utils/settings-helpers.d.ts.map +1 -0
  182. package/dist/dev/default.js +6451 -0
  183. package/dist/dev/default.js.map +1 -0
  184. package/dist/dev/easybroadcast.js +6654 -0
  185. package/dist/dev/easybroadcast.js.map +1 -0
  186. package/dist/dev/index.html +24 -0
  187. package/dist/eb-player.css +2066 -0
  188. package/dist/players/default/default.js +400 -1
  189. package/dist/players/default/index.html +1 -5
  190. package/dist/players/forja/forja.js +310 -0
  191. package/dist/players/forja/index.html +1 -0
  192. package/dist/players/videos/equipe/EB_lequipe-preprod.js +1 -0
  193. package/dist/players/videos/equipe/EB_lequipe.js +1 -1
  194. package/dist/players/videos/equipe/equipe.js +1 -1
  195. package/dist/theme-forja.css +10 -0
  196. package/dist/theme-modern.css +520 -0
  197. package/dist/theme-radio.css +11 -0
  198. package/dist/theme-snrt.css +11 -0
  199. package/dist/theme-v2.css +661 -0
  200. package/package.json +34 -3
  201. package/dist/build/forja.js +0 -1
  202. package/dist/players/videos/equipe/EB_lequipe-preprod copy.js +0 -1
@@ -0,0 +1,2066 @@
1
+ /**
2
+ * eb-player base CSS
3
+ *
4
+ * CSS custom property defaults are provided as fallbacks in var() calls
5
+ * rather than declared on .eb-player. This allows lifecycle.ts to set
6
+ * overrides on the parent container element and have them inherit into
7
+ * .eb-player without being blocked by a competing declaration.
8
+ *
9
+ * Theme overrides use the .eb-player[data-theme="..."] selector pattern (see theme-*.css).
10
+ * Runtime overrides use style.setProperty() via PlayerController.mount() for backward
11
+ * compatibility with the primaryColor / skinColors consumer API.
12
+ *
13
+ * CSS scoping: The .eb-player prefix ensures no style bleed between two co-hosted instances.
14
+ */
15
+
16
+ .eb-player {
17
+ /* Base styles — all var() calls include hardcoded fallbacks */
18
+ position: relative;
19
+ overflow: hidden;
20
+ font-family: var(--eb-font-family, Arial, sans-serif);
21
+ font-size: var(--eb-font-size-base, 14px);
22
+ color: var(--eb-color-text, #ffffff);
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ /* Ensure all descendants use border-box sizing */
27
+ .eb-player *,
28
+ .eb-player *::before,
29
+ .eb-player *::after {
30
+ box-sizing: inherit;
31
+ }
32
+
33
+ /* BEM block scaffold */
34
+ .eb-player__container {
35
+ position: relative;
36
+ width: 100%;
37
+ height: 100%;
38
+ background-color: var(--eb-color-background, rgba(0, 0, 0, 0.8));
39
+ }
40
+
41
+ .eb-player__video {
42
+ display: block;
43
+ width: 100%;
44
+ height: 100%;
45
+ object-fit: contain;
46
+ }
47
+
48
+ /**
49
+ * Forja theme overrides
50
+ *
51
+ * Applied when the container has [data-theme="forja"].
52
+ * Uses higher specificity than base.css .eb-player selector.
53
+ */
54
+
55
+ [data-theme="forja"] .eb-player {
56
+ --eb-color-primary: #E63946;
57
+ }
58
+
59
+ /**
60
+ * Modern theme overrides
61
+ *
62
+ * Applied when the container has [data-theme="modern"].
63
+ * Glassmorphism-inspired design with purple accent, Inter font,
64
+ * rounded corners, backdrop blur, and smooth transitions.
65
+ *
66
+ * Reference: player-reference.html
67
+ */
68
+
69
+ /* ============================================================
70
+ Google Fonts (Inter 300-600)
71
+ ============================================================ */
72
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');
73
+
74
+ /* ============================================================
75
+ Icons: override stroke-based defaults for filled Material icons
76
+ ============================================================ */
77
+ [data-theme="modern"] .eb-player .eb-icon {
78
+ fill: currentColor;
79
+ stroke: none;
80
+ stroke-width: 0;
81
+ }
82
+
83
+ /* ============================================================
84
+ Root vars & container
85
+ ============================================================ */
86
+ [data-theme="modern"] .eb-player {
87
+ --eb-color-primary: #7c3aed;
88
+ --eb-color-progress: #7c3aed;
89
+ --eb-color-background: rgba(10, 10, 20, 0.85);
90
+ --eb-accent: #1a73e8;
91
+ --eb-font-family: 'Inter', sans-serif;
92
+ font-family: 'Inter', sans-serif;
93
+ border-radius: 14px;
94
+ box-shadow: 0 40px 80px rgba(0,0,0,.8), 0 0 0 1px rgba(255,255,255,.06);
95
+ }
96
+
97
+ /* ============================================================
98
+ Gradients
99
+ ============================================================ */
100
+ [data-theme="modern"] .eb-player .eb-top-bar {
101
+ background: linear-gradient(to bottom, rgba(0,0,0,.72), transparent);
102
+ height: 110px;
103
+ padding: 14px 16px;
104
+ gap: 6px;
105
+ }
106
+
107
+ [data-theme="modern"] .eb-player .eb-bottom-bar__gradient {
108
+ height: 150px;
109
+ background: linear-gradient(to top, rgba(0,0,0,.9), transparent);
110
+ }
111
+
112
+ /* ============================================================
113
+ Top bar: slide-in animation
114
+ ============================================================ */
115
+ [data-theme="modern"] .eb-player.eb-controls-visible .eb-top-bar {
116
+ opacity: 1;
117
+ transform: translateY(0);
118
+ transition: opacity .3s, transform .3s;
119
+ }
120
+
121
+ [data-theme="modern"] .eb-player.eb-controls-hidden .eb-top-bar {
122
+ opacity: 0;
123
+ transform: translateY(-6px);
124
+ transition: opacity .3s, transform .3s;
125
+ }
126
+
127
+ [data-theme="modern"] .eb-player .eb-top-bar__actions {
128
+ gap: 6px;
129
+ }
130
+
131
+ /* ============================================================
132
+ Bottom bar: slide-up animation + spacing
133
+ ============================================================ */
134
+ [data-theme="modern"] .eb-player .eb-bottom-bar__controls-row {
135
+ padding: 0 14px 12px;
136
+ gap: 8px;
137
+ }
138
+
139
+ [data-theme="modern"] .eb-player.eb-controls-visible .eb-bottom-bar {
140
+ opacity: 1;
141
+ transform: translateY(0);
142
+ transition: opacity .3s, transform .3s;
143
+ }
144
+
145
+ [data-theme="modern"] .eb-player.eb-controls-hidden .eb-bottom-bar {
146
+ opacity: 0;
147
+ transform: translateY(8px);
148
+ transition: opacity .3s, transform .3s;
149
+ }
150
+
151
+ /* ============================================================
152
+ Middle bar: glassmorphism circles + wider gap
153
+ ============================================================ */
154
+ [data-theme="modern"] .eb-player .eb-middle-bar {
155
+ gap: 28px;
156
+ }
157
+
158
+ /* Controls slide with bottom bar */
159
+ [data-theme="modern"] .eb-player.eb-controls-visible .eb-middle-bar {
160
+ opacity: 1;
161
+ transition: opacity .3s;
162
+ }
163
+
164
+ [data-theme="modern"] .eb-player.eb-controls-hidden .eb-middle-bar {
165
+ opacity: 0;
166
+ transition: opacity .3s;
167
+ }
168
+
169
+ [data-theme="modern"] .eb-player .eb-middle-bar__play-btn {
170
+ width: 72px;
171
+ height: 72px;
172
+ background: rgba(255,255,255,.18);
173
+ backdrop-filter: blur(6px);
174
+ -webkit-backdrop-filter: blur(6px);
175
+ border: 2px solid rgba(255,255,255,.28);
176
+ transition: background .15s;
177
+ }
178
+
179
+ [data-theme="modern"] .eb-player .eb-middle-bar__play-btn:hover {
180
+ background: rgba(255,255,255,.28);
181
+ }
182
+
183
+ [data-theme="modern"] .eb-player .eb-middle-bar__play-btn .eb-icon {
184
+ width: 30px;
185
+ height: 30px;
186
+ }
187
+
188
+ [data-theme="modern"] .eb-player .eb-middle-bar__seek-btn {
189
+ width: 52px;
190
+ height: 52px;
191
+ border-radius: 50%;
192
+ background: rgba(255,255,255,.14);
193
+ backdrop-filter: blur(6px);
194
+ -webkit-backdrop-filter: blur(6px);
195
+ border: 1.5px solid rgba(255,255,255,.22);
196
+ flex-direction: column;
197
+ align-items: center;
198
+ justify-content: center;
199
+ gap: 1px;
200
+ transition: background .15s;
201
+ padding: 0;
202
+ }
203
+
204
+ [data-theme="modern"] .eb-player .eb-middle-bar__seek-btn:hover {
205
+ background: rgba(255,255,255,.24);
206
+ }
207
+
208
+ [data-theme="modern"] .eb-player .eb-seek-circle {
209
+ width: 18px;
210
+ height: 18px;
211
+ /* Reference uses filled skip arrows instead of the stroke circle */
212
+ fill: white;
213
+ stroke: none;
214
+ }
215
+
216
+ [data-theme="modern"] .eb-player .eb-seek-label {
217
+ font-size: .58em;
218
+ font-weight: 700;
219
+ color: rgba(255,255,255,.9);
220
+ line-height: 1;
221
+ }
222
+
223
+ /* ============================================================
224
+ Buttons: rounded, softer color, scale on active
225
+ ============================================================ */
226
+ [data-theme="modern"] .eb-player .eb-button,
227
+ [data-theme="modern"] .eb-player .eb-play-pause,
228
+ [data-theme="modern"] .eb-player .eb-fullscreen,
229
+ [data-theme="modern"] .eb-player .eb-pip,
230
+ [data-theme="modern"] .eb-player .eb-cast,
231
+ [data-theme="modern"] .eb-player .eb-volume-mute,
232
+ [data-theme="modern"] .eb-player .eb-live-sync {
233
+ color: rgba(255,255,255,.82);
234
+ border-radius: 8px;
235
+ width: 38px;
236
+ height: 38px;
237
+ transition: background .15s, color .15s, transform .1s;
238
+ flex-shrink: 0;
239
+ }
240
+
241
+ [data-theme="modern"] .eb-player .eb-button:hover,
242
+ [data-theme="modern"] .eb-player .eb-play-pause:hover,
243
+ [data-theme="modern"] .eb-player .eb-fullscreen:hover,
244
+ [data-theme="modern"] .eb-player .eb-pip:hover,
245
+ [data-theme="modern"] .eb-player .eb-cast:hover,
246
+ [data-theme="modern"] .eb-player .eb-volume-mute:hover,
247
+ [data-theme="modern"] .eb-player .eb-live-sync:hover {
248
+ background: rgba(255,255,255,.12);
249
+ color: #fff;
250
+ }
251
+
252
+ [data-theme="modern"] .eb-player .eb-button:active,
253
+ [data-theme="modern"] .eb-player .eb-play-pause:active,
254
+ [data-theme="modern"] .eb-player .eb-fullscreen:active,
255
+ [data-theme="modern"] .eb-player .eb-pip:active,
256
+ [data-theme="modern"] .eb-player .eb-cast:active,
257
+ [data-theme="modern"] .eb-player .eb-volume-mute:active,
258
+ [data-theme="modern"] .eb-player .eb-live-sync:active {
259
+ transform: scale(.88);
260
+ }
261
+
262
+ /* ============================================================
263
+ Seekbar
264
+ ============================================================ */
265
+ [data-theme="modern"] .eb-player .eb-seekbar-track {
266
+ height: 3px;
267
+ background: rgba(255,255,255,.22);
268
+ border-radius: 3px;
269
+ transition: height .15s;
270
+ }
271
+
272
+ [data-theme="modern"] .eb-player .eb-seekbar:hover .eb-seekbar-track {
273
+ height: 5px;
274
+ }
275
+
276
+ [data-theme="modern"] .eb-player .eb-seekbar-buffered {
277
+ background: rgba(255,255,255,.28);
278
+ border-radius: 3px;
279
+ transition: height .15s;
280
+ }
281
+
282
+ [data-theme="modern"] .eb-player .eb-seekbar-progress {
283
+ background: linear-gradient(90deg, #a78bfa, #7c3aed);
284
+ border-radius: 3px;
285
+ transition: height .15s;
286
+ }
287
+
288
+ [data-theme="modern"] .eb-player .eb-seekbar-thumb {
289
+ width: 14px;
290
+ height: 14px;
291
+ right: -7px;
292
+ background: #fff;
293
+ box-shadow: 0 0 0 3px rgba(124,58,237,.45);
294
+ }
295
+
296
+ /* ============================================================
297
+ Seekbar tooltip & preview
298
+ ============================================================ */
299
+ [data-theme="modern"] .eb-player .eb-seekbar-tooltip {
300
+ bottom: 24px;
301
+ background: rgba(0,0,0,.82);
302
+ border-radius: 5px;
303
+ font-size: 11px;
304
+ padding: 3px 7px;
305
+ }
306
+
307
+ [data-theme="modern"] .eb-player .eb-seekbar-preview {
308
+ width: 128px;
309
+ height: 72px;
310
+ background: #111;
311
+ border: 2px solid rgba(255,255,255,.16);
312
+ border-radius: 6px;
313
+ }
314
+
315
+ /* ============================================================
316
+ Chapter markers
317
+ ============================================================ */
318
+ [data-theme="modern"] .eb-player .eb-chapter-marker {
319
+ width: 2px;
320
+ height: 7px;
321
+ background: rgba(0,0,0,.45);
322
+ border-radius: 1px;
323
+ top: 50%;
324
+ transform: translate(-50%, -50%);
325
+ }
326
+
327
+ /* ============================================================
328
+ Volume: expandable slider, white fill
329
+ ============================================================ */
330
+ [data-theme="modern"] .eb-player .eb-volume-control {
331
+ flex-direction: row;
332
+ gap: 0;
333
+ margin-right: 0;
334
+ }
335
+
336
+ [data-theme="modern"] .eb-player .eb-volume-track {
337
+ width: 0;
338
+ height: 3px;
339
+ background: rgba(255,255,255,.22);
340
+ border-radius: 3px;
341
+ overflow: hidden;
342
+ transition: width .25s ease, margin .25s ease;
343
+ margin: 0;
344
+ }
345
+
346
+ [data-theme="modern"] .eb-player .eb-volume-control:hover .eb-volume-track,
347
+ [data-theme="modern"] .eb-player .eb-volume-control:focus-within .eb-volume-track {
348
+ width: 66px;
349
+ margin: 0 6px 0 2px;
350
+ }
351
+
352
+ [data-theme="modern"] .eb-player .eb-volume-fill {
353
+ background: #fff;
354
+ }
355
+
356
+ [data-theme="modern"] .eb-player .eb-volume-thumb {
357
+ width: 11px;
358
+ height: 11px;
359
+ background: #fff;
360
+ box-shadow: 0 0 0 2px rgba(255,255,255,.35);
361
+ transform: translate(-50%, -50%) scale(0);
362
+ transition: transform .15s;
363
+ }
364
+
365
+ [data-theme="modern"] .eb-player .eb-volume-control:hover .eb-volume-thumb {
366
+ transform: translate(-50%, -50%) scale(1);
367
+ }
368
+
369
+ /* ============================================================
370
+ Time display
371
+ ============================================================ */
372
+ [data-theme="modern"] .eb-player .eb-time-display {
373
+ font-size: 12px;
374
+ color: rgba(255,255,255,.6);
375
+ letter-spacing: .02em;
376
+ }
377
+
378
+ /* ============================================================
379
+ Live badge
380
+ ============================================================ */
381
+ [data-theme="modern"] .eb-player .eb-live-sync {
382
+ width: auto;
383
+ height: auto;
384
+ padding: 4px 10px;
385
+ border-radius: 6px;
386
+ font-size: 11px;
387
+ font-weight: 700;
388
+ letter-spacing: .08em;
389
+ text-transform: uppercase;
390
+ }
391
+
392
+ [data-theme="modern"] .eb-player .eb-live-synced {
393
+ background: rgba(220,38,38,.9);
394
+ color: #fff;
395
+ box-shadow: 0 2px 8px rgba(220,38,38,.4);
396
+ }
397
+
398
+ /* ============================================================
399
+ Settings panel: glassmorphism + refined layout
400
+ ============================================================ */
401
+ [data-theme="modern"] .eb-player .eb-settings-panel {
402
+ background: rgba(10,10,20,.55);
403
+ backdrop-filter: blur(18px) saturate(160%);
404
+ -webkit-backdrop-filter: blur(18px) saturate(160%);
405
+ border-radius: 12px;
406
+ min-width: 280px;
407
+ box-shadow: 0 16px 48px rgba(0,0,0,.6), 0 0 0 1px rgba(255,255,255,.1);
408
+ }
409
+
410
+ [data-theme="modern"] .eb-player .eb-settings-menu {
411
+ padding: 0;
412
+ }
413
+
414
+ [data-theme="modern"] .eb-player .eb-settings-category,
415
+ [data-theme="modern"] .eb-player .eb-settings-item,
416
+ [data-theme="modern"] .eb-player .eb-settings-back {
417
+ padding: 15px 20px;
418
+ font-size: 13px;
419
+ color: rgba(255,255,255,.9);
420
+ border-bottom: 1px solid rgba(255,255,255,.06);
421
+ transition: background .12s;
422
+ }
423
+
424
+ [data-theme="modern"] .eb-player .eb-settings-category:last-child,
425
+ [data-theme="modern"] .eb-player .eb-settings-item:last-child {
426
+ border-bottom: none;
427
+ }
428
+
429
+ [data-theme="modern"] .eb-player .eb-settings-category:hover,
430
+ [data-theme="modern"] .eb-player .eb-settings-item:hover,
431
+ [data-theme="modern"] .eb-player .eb-settings-back:hover {
432
+ background: rgba(255,255,255,.05);
433
+ }
434
+
435
+ [data-theme="modern"] .eb-player .eb-settings-item--selected {
436
+ color: #fff;
437
+ font-weight: 500;
438
+ }
439
+
440
+ /* Active selection dot */
441
+ [data-theme="modern"] .eb-player .eb-settings-item--selected::after {
442
+ content: '';
443
+ width: 10px;
444
+ height: 10px;
445
+ border-radius: 50%;
446
+ background: #1a73e8;
447
+ box-shadow: 0 0 0 3px rgba(26,115,232,.25);
448
+ flex-shrink: 0;
449
+ }
450
+
451
+ /* Non-selected items: hollow dot */
452
+ [data-theme="modern"] .eb-player .eb-settings-item:not(.eb-settings-item--selected)::after {
453
+ content: '';
454
+ width: 10px;
455
+ height: 10px;
456
+ border-radius: 50%;
457
+ border: 2px solid rgba(255,255,255,.2);
458
+ flex-shrink: 0;
459
+ }
460
+
461
+ /* Sub-panel back button */
462
+ [data-theme="modern"] .eb-player .eb-settings-back {
463
+ gap: 14px;
464
+ font-weight: 600;
465
+ }
466
+
467
+ /* ============================================================
468
+ Loading spinner
469
+ ============================================================ */
470
+ [data-theme="modern"] .eb-player .eb-loading .eb-icon {
471
+ color: rgba(255,255,255,.7);
472
+ }
473
+
474
+ /* ============================================================
475
+ Error overlay
476
+ ============================================================ */
477
+ [data-theme="modern"] .eb-player .eb-error {
478
+ background: rgba(10,10,20,.85);
479
+ backdrop-filter: blur(12px);
480
+ -webkit-backdrop-filter: blur(12px);
481
+ }
482
+
483
+ [data-theme="modern"] .eb-player .eb-error-retry {
484
+ border-radius: 8px;
485
+ background: rgba(255,255,255,.1);
486
+ border-color: rgba(255,255,255,.15);
487
+ transition: background .2s, color .2s;
488
+ }
489
+
490
+ [data-theme="modern"] .eb-player .eb-error-retry:hover {
491
+ background: rgba(255,255,255,.18);
492
+ }
493
+
494
+ /* ============================================================
495
+ Toast
496
+ ============================================================ */
497
+ [data-theme="modern"] .eb-player .eb-toast {
498
+ background: rgba(0,0,0,.72);
499
+ backdrop-filter: blur(10px);
500
+ -webkit-backdrop-filter: blur(10px);
501
+ border-radius: 10px;
502
+ font-size: 13px;
503
+ }
504
+
505
+ /* ============================================================
506
+ Info & socials overlays
507
+ ============================================================ */
508
+ [data-theme="modern"] .eb-player .eb-info-overlay,
509
+ [data-theme="modern"] .eb-player .eb-socials-overlay {
510
+ background: rgba(10,10,20,.85);
511
+ backdrop-filter: blur(12px);
512
+ -webkit-backdrop-filter: blur(12px);
513
+ }
514
+
515
+ [data-theme="modern"] .eb-player .eb-info-close,
516
+ [data-theme="modern"] .eb-player .eb-socials-close {
517
+ border-radius: 8px;
518
+ background: rgba(255,255,255,.07);
519
+ border-color: rgba(255,255,255,.08);
520
+ transition: background .2s, color .2s;
521
+ }
522
+
523
+ [data-theme="modern"] .eb-player .eb-info-close:hover,
524
+ [data-theme="modern"] .eb-player .eb-socials-close:hover {
525
+ background: rgba(255,255,255,.13);
526
+ color: #fff;
527
+ }
528
+
529
+ [data-theme="modern"] .eb-player .eb-socials-link {
530
+ background: rgba(255,255,255,.07);
531
+ border: 1px solid rgba(255,255,255,.08);
532
+ border-radius: 8px;
533
+ transition: background .2s, color .2s;
534
+ }
535
+
536
+ [data-theme="modern"] .eb-player .eb-socials-link:hover {
537
+ background: rgba(167,139,250,.15);
538
+ border-color: rgba(167,139,250,.35);
539
+ color: #c4b5fd;
540
+ }
541
+
542
+ /* ============================================================
543
+ Bottom bar: two-row layout (seekbar above, buttons below)
544
+ ============================================================ */
545
+ [data-theme="modern"] .eb-player .eb-bottom-bar__controls-row {
546
+ flex-wrap: wrap;
547
+ }
548
+
549
+ /* Seekbar fills full width as its own row */
550
+ [data-theme="modern"] .eb-player .eb-bottom-bar__seekbar-zone {
551
+ flex: none;
552
+ width: 100%;
553
+ order: -1;
554
+ margin-bottom: -6px;
555
+ }
556
+
557
+ /* Time display sits before seekbar visually (after live badge) */
558
+ [data-theme="modern"] .eb-player .eb-slot-time {
559
+ order: -1;
560
+ margin-left: auto;
561
+ }
562
+
563
+ /* Live sync badge before time */
564
+ [data-theme="modern"] .eb-player .eb-slot-live-sync {
565
+ order: -2;
566
+ }
567
+
568
+ /* Move settings + pip to right end of control row */
569
+ [data-theme="modern"] .eb-player .eb-slot-settings {
570
+ margin-left: auto;
571
+ }
572
+
573
+ /* ============================================================
574
+ Poster
575
+ ============================================================ */
576
+ [data-theme="modern"] .eb-player .eb-poster {
577
+ background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
578
+ }
579
+
580
+ /**
581
+ * Radio theme overrides
582
+ *
583
+ * Applied when the container has [data-theme="radio"].
584
+ * Uses higher specificity than base.css .eb-player selector.
585
+ */
586
+
587
+ [data-theme="radio"] .eb-player {
588
+ --eb-color-primary: #F4A261;
589
+ --eb-color-background: rgba(20, 20, 30, 0.95);
590
+ }
591
+
592
+ /**
593
+ * SNRT theme overrides
594
+ *
595
+ * Applied when the container has [data-theme="snrt"].
596
+ * Uses higher specificity than base.css .eb-player selector.
597
+ */
598
+
599
+ [data-theme="snrt"] .eb-player {
600
+ --eb-color-primary: #006633;
601
+ --eb-color-background: rgba(0, 0, 0, 0.9);
602
+ }
603
+
604
+ /**
605
+ * V2 theme — based on snrtlive.ma (Aloula) player styling
606
+ *
607
+ * Applied when the container has [data-theme="v2"].
608
+ * Dark UI with orange accent (#ff841f), Inter font, rounded container,
609
+ * backdrop-blur panels, expandable volume, two-row bottom bar
610
+ * (seekbar on top, buttons below), gradient overlays, centered
611
+ * frosted-glass transport circles, and refined slide/fade animations.
612
+ */
613
+
614
+ /* ============================================================
615
+ Google Fonts (Inter 300-700)
616
+ ============================================================ */
617
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
618
+
619
+ /* ============================================================
620
+ Root vars & container
621
+ ============================================================ */
622
+ [data-theme="v2"] .eb-player {
623
+ --eb-color-primary: #ff841f;
624
+ --eb-color-progress: #ff841f;
625
+ --eb-color-background: rgba(10, 10, 20, 0.85);
626
+ --eb-accent: #ff841f;
627
+ --eb-color-text: #fff;
628
+ --eb-font-family: 'Inter', -apple-system, sans-serif;
629
+ --eb-font-size-base: 14px;
630
+ --eb-radius-control: 8px;
631
+ --eb-duration-transition: 200ms;
632
+ font-family: 'Inter', -apple-system, sans-serif;
633
+ border-radius: 14px;
634
+ box-shadow: 0 40px 80px rgba(0,0,0,.8), 0 0 0 1px rgba(255,255,255,.06);
635
+ color: #fff;
636
+ }
637
+
638
+ /* ============================================================
639
+ Icons: bolder stroke weight to match filled-style target
640
+ ============================================================ */
641
+ [data-theme="v2"] .eb-player .eb-icon {
642
+ stroke-width: 2.5;
643
+ }
644
+
645
+ /* Fullscreen: fill viewport, drop card styling */
646
+ [data-theme="v2"] .eb-player:fullscreen,
647
+ [data-theme="v2"] .eb-player:-webkit-full-screen {
648
+ border-radius: 0;
649
+ box-shadow: none;
650
+ }
651
+
652
+ /* ============================================================
653
+ Gradients (top & bottom)
654
+ ============================================================ */
655
+ [data-theme="v2"] .eb-player .eb-top-bar {
656
+ background: linear-gradient(to bottom, rgba(0,0,0,.72), transparent);
657
+ height: 110px;
658
+ padding: 14px 16px;
659
+ gap: 6px;
660
+ }
661
+
662
+ [data-theme="v2"] .eb-player .eb-bottom-bar__gradient {
663
+ height: 150px;
664
+ background: linear-gradient(to top, rgba(0,0,0,.9), transparent);
665
+ }
666
+
667
+ /* ============================================================
668
+ Top bar: slide-in from above
669
+ ============================================================ */
670
+ [data-theme="v2"] .eb-player.eb-controls-visible .eb-top-bar {
671
+ opacity: 1;
672
+ transform: translateY(0);
673
+ transition: opacity .3s, transform .3s;
674
+ }
675
+
676
+ [data-theme="v2"] .eb-player.eb-controls-hidden .eb-top-bar {
677
+ opacity: 0;
678
+ transform: translateY(-6px);
679
+ transition: opacity .3s, transform .3s;
680
+ }
681
+
682
+ [data-theme="v2"] .eb-player .eb-top-bar__actions {
683
+ gap: 6px;
684
+ }
685
+
686
+ /* Logo */
687
+ [data-theme="v2"] .eb-player .eb-top-bar__logo {
688
+ max-height: 32px;
689
+ max-width: 120px;
690
+ opacity: .85;
691
+ }
692
+
693
+ /* ============================================================
694
+ Bottom bar: slide-up animation + spacing
695
+ ============================================================ */
696
+ [data-theme="v2"] .eb-player .eb-bottom-bar__controls-row {
697
+ padding: 0 14px 12px;
698
+ gap: 8px;
699
+ }
700
+
701
+ [data-theme="v2"] .eb-player.eb-controls-visible .eb-bottom-bar {
702
+ opacity: 1;
703
+ transform: translateY(0);
704
+ transition: opacity .3s, transform .3s;
705
+ }
706
+
707
+ [data-theme="v2"] .eb-player.eb-controls-hidden .eb-bottom-bar {
708
+ opacity: 0;
709
+ transform: translateY(8px);
710
+ transition: opacity .3s, transform .3s;
711
+ }
712
+
713
+ /* ============================================================
714
+ Bottom bar: single-row layout
715
+ play | live | time | ——seekbar—— | settings | volume | fullscreen
716
+ PiP / Cast are in the top bar (via THEME_LAYOUTS.v2 in config.ts)
717
+ ============================================================ */
718
+
719
+ /* ============================================================
720
+ Middle bar: glassmorphism transport circles
721
+ ============================================================ */
722
+ [data-theme="v2"] .eb-player .eb-middle-bar {
723
+ gap: 28px;
724
+ }
725
+
726
+ [data-theme="v2"] .eb-player.eb-controls-visible .eb-middle-bar {
727
+ opacity: 1;
728
+ transition: opacity .3s;
729
+ }
730
+
731
+ [data-theme="v2"] .eb-player.eb-controls-hidden .eb-middle-bar {
732
+ opacity: 0;
733
+ transition: opacity .3s;
734
+ }
735
+
736
+ /* Central play/pause — large frosted circle */
737
+ [data-theme="v2"] .eb-player .eb-middle-bar__play-btn {
738
+ width: 80px;
739
+ height: 80px;
740
+ border-radius: 50%;
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ background: rgba(255,255,255,.15);
745
+ backdrop-filter: blur(8px);
746
+ -webkit-backdrop-filter: blur(8px);
747
+ border: 2px solid rgba(255,255,255,.25);
748
+ color: #fff;
749
+ padding: 0;
750
+ transition: background .15s, transform .25s, opacity .25s;
751
+ }
752
+
753
+ [data-theme="v2"] .eb-player .eb-middle-bar__play-btn:hover {
754
+ background: rgba(255,255,255,.25);
755
+ }
756
+
757
+ [data-theme="v2"] .eb-player .eb-middle-bar__play-btn:active {
758
+ transform: scale(.92);
759
+ }
760
+
761
+ [data-theme="v2"] .eb-player .eb-middle-bar__play-btn .eb-icon {
762
+ width: 32px;
763
+ height: 32px;
764
+ stroke-width: 2.5;
765
+ }
766
+
767
+ /* Seek buttons — smaller frosted circles, same style as play button */
768
+ [data-theme="v2"] .eb-player .eb-middle-bar__seek-btn {
769
+ width: 56px;
770
+ height: 56px;
771
+ border-radius: 50%;
772
+ display: flex;
773
+ flex-direction: column;
774
+ align-items: center;
775
+ justify-content: center;
776
+ background: rgba(255,255,255,.15);
777
+ backdrop-filter: blur(8px);
778
+ -webkit-backdrop-filter: blur(8px);
779
+ border: 2px solid rgba(255,255,255,.25);
780
+ color: #fff;
781
+ gap: 1px;
782
+ padding: 0;
783
+ transition: background .15s;
784
+ }
785
+
786
+ [data-theme="v2"] .eb-player .eb-middle-bar__seek-btn:hover {
787
+ background: rgba(255,255,255,.25);
788
+ }
789
+
790
+ [data-theme="v2"] .eb-player .eb-seek-circle {
791
+ width: 24px;
792
+ height: 24px;
793
+ color: rgba(255,255,255,.85);
794
+ fill: currentColor;
795
+ stroke: none;
796
+ }
797
+
798
+ [data-theme="v2"] .eb-player .eb-seek-label {
799
+ font-size: .75em;
800
+ font-weight: 700;
801
+ color: rgba(255,255,255,.9);
802
+ line-height: 1;
803
+ }
804
+
805
+ /* ============================================================
806
+ Buttons: rounded, soft color, scale on press
807
+ ============================================================ */
808
+ [data-theme="v2"] .eb-player .eb-button:not(.eb-middle-bar__seek-btn):not(.eb-middle-bar__play-btn),
809
+ [data-theme="v2"] .eb-player .eb-play-pause,
810
+ [data-theme="v2"] .eb-player .eb-fullscreen,
811
+ [data-theme="v2"] .eb-player .eb-pip,
812
+ [data-theme="v2"] .eb-player .eb-cast,
813
+ [data-theme="v2"] .eb-player .eb-volume-mute,
814
+ [data-theme="v2"] .eb-player .eb-live-sync {
815
+ color: rgba(255,255,255,.82);
816
+ border-radius: 8px;
817
+ width: 38px;
818
+ height: 38px;
819
+ transition: background .15s, color .15s, transform .1s;
820
+ flex-shrink: 0;
821
+ }
822
+
823
+ [data-theme="v2"] .eb-player .eb-button:not(.eb-middle-bar__seek-btn):not(.eb-middle-bar__play-btn):hover,
824
+ [data-theme="v2"] .eb-player .eb-play-pause:hover,
825
+ [data-theme="v2"] .eb-player .eb-fullscreen:hover,
826
+ [data-theme="v2"] .eb-player .eb-pip:hover,
827
+ [data-theme="v2"] .eb-player .eb-cast:hover,
828
+ [data-theme="v2"] .eb-player .eb-volume-mute:hover,
829
+ [data-theme="v2"] .eb-player .eb-live-sync:hover {
830
+ background: rgba(255,255,255,.12);
831
+ color: #fff;
832
+ }
833
+
834
+ [data-theme="v2"] .eb-player .eb-button:not(.eb-middle-bar__seek-btn):not(.eb-middle-bar__play-btn):active,
835
+ [data-theme="v2"] .eb-player .eb-play-pause:active,
836
+ [data-theme="v2"] .eb-player .eb-fullscreen:active,
837
+ [data-theme="v2"] .eb-player .eb-pip:active,
838
+ [data-theme="v2"] .eb-player .eb-cast:active,
839
+ [data-theme="v2"] .eb-player .eb-volume-mute:active,
840
+ [data-theme="v2"] .eb-player .eb-live-sync:active {
841
+ transform: scale(.88);
842
+ }
843
+
844
+ /* Icon size inside buttons (not middle bar transport) */
845
+ [data-theme="v2"] .eb-player .eb-button:not(.eb-middle-bar__seek-btn):not(.eb-middle-bar__play-btn) .eb-icon,
846
+ [data-theme="v2"] .eb-player .eb-play-pause .eb-icon,
847
+ [data-theme="v2"] .eb-player .eb-fullscreen .eb-icon,
848
+ [data-theme="v2"] .eb-player .eb-pip .eb-icon,
849
+ [data-theme="v2"] .eb-player .eb-cast .eb-icon,
850
+ [data-theme="v2"] .eb-player .eb-volume-mute .eb-icon {
851
+ width: 22px;
852
+ height: 22px;
853
+ }
854
+
855
+ /* Top bar icons slightly larger */
856
+ [data-theme="v2"] .eb-player .eb-top-bar .eb-icon {
857
+ width: 24px;
858
+ height: 24px;
859
+ }
860
+
861
+ /* Play/pause icons should be filled (solid), not stroke outlines */
862
+ [data-theme="v2"] .eb-player .eb-play-pause .eb-icon,
863
+ [data-theme="v2"] .eb-player .eb-middle-bar__play-btn .eb-icon {
864
+ fill: currentColor;
865
+ stroke: none;
866
+ }
867
+
868
+ /* Volume icon: fill the speaker body, keep stroke for sound waves */
869
+ [data-theme="v2"] .eb-player .eb-volume-mute .eb-icon path:first-child {
870
+ fill: currentColor;
871
+ }
872
+
873
+ /* Cast button active state — cyan */
874
+ [data-theme="v2"] .eb-player .eb-cast-active {
875
+ color: #1eb6d4 !important;
876
+ background: rgba(30, 182, 212, .15) !important;
877
+ }
878
+
879
+ [data-theme="v2"] .eb-player .eb-cast-active .eb-icon {
880
+ filter: drop-shadow(0 0 4px rgba(30, 182, 212, .6));
881
+ }
882
+
883
+ /* ============================================================
884
+ Seekbar
885
+ ============================================================ */
886
+ [data-theme="v2"] .eb-player .eb-seekbar-track {
887
+ height: 3px;
888
+ background: rgba(255,255,255,.22);
889
+ border-radius: 3px;
890
+ transition: height .15s;
891
+ }
892
+
893
+ [data-theme="v2"] .eb-player .eb-seekbar:hover .eb-seekbar-track {
894
+ height: 5px;
895
+ }
896
+
897
+ [data-theme="v2"] .eb-player .eb-seekbar-buffered {
898
+ background: rgba(255,255,255,.28);
899
+ border-radius: 3px;
900
+ transition: height .15s;
901
+ }
902
+
903
+ /* Orange gradient fill */
904
+ [data-theme="v2"] .eb-player .eb-seekbar-progress {
905
+ background: linear-gradient(90deg, #ff841f, color-mix(in srgb, #ff841f 70%, #fff));
906
+ border-radius: 3px;
907
+ transition: height .15s;
908
+ }
909
+
910
+ [data-theme="v2"] .eb-player .eb-seekbar-thumb {
911
+ width: 14px;
912
+ height: 14px;
913
+ right: -7px;
914
+ background: #fff;
915
+ box-shadow: 0 0 0 3px rgba(255,132,31,.45);
916
+ }
917
+
918
+ /* ============================================================
919
+ Seekbar tooltip & preview
920
+ ============================================================ */
921
+ [data-theme="v2"] .eb-player .eb-seekbar-tooltip {
922
+ bottom: 28px;
923
+ background: rgba(0,0,0,.88);
924
+ border: 1px solid rgba(255,255,255,.12);
925
+ border-radius: 7px;
926
+ font-size: 11px;
927
+ font-weight: 500;
928
+ padding: 0;
929
+ overflow: hidden;
930
+ box-shadow: 0 4px 16px rgba(0,0,0,.5);
931
+ display: flex;
932
+ flex-direction: column;
933
+ align-items: center;
934
+ }
935
+
936
+ [data-theme="v2"] .eb-player .eb-seekbar-preview {
937
+ width: 160px;
938
+ height: 90px;
939
+ background: #111;
940
+ border: none;
941
+ border-radius: 0;
942
+ margin: 0;
943
+ }
944
+
945
+ /* ============================================================
946
+ Chapter markers
947
+ ============================================================ */
948
+ [data-theme="v2"] .eb-player .eb-chapter-marker {
949
+ width: 2px;
950
+ height: 7px;
951
+ background: rgba(0,0,0,.45);
952
+ border-radius: 1px;
953
+ top: 50%;
954
+ transform: translate(-50%, -50%);
955
+ }
956
+
957
+ /* ============================================================
958
+ Volume: expandable slider, white fill
959
+ ============================================================ */
960
+ [data-theme="v2"] .eb-player .eb-volume-control {
961
+ flex-direction: row;
962
+ gap: 0;
963
+ margin-right: 0;
964
+ }
965
+
966
+ [data-theme="v2"] .eb-player .eb-volume-track {
967
+ width: 0;
968
+ height: 3px;
969
+ background: rgba(255,255,255,.22);
970
+ border-radius: 3px;
971
+ overflow: hidden;
972
+ transition: width .25s ease, margin .25s ease;
973
+ margin: 0;
974
+ }
975
+
976
+ [data-theme="v2"] .eb-player .eb-volume-control:hover .eb-volume-track,
977
+ [data-theme="v2"] .eb-player .eb-volume-control:focus-within .eb-volume-track {
978
+ width: 66px;
979
+ margin: 0 6px 0 2px;
980
+ }
981
+
982
+ [data-theme="v2"] .eb-player .eb-volume-fill {
983
+ background: #fff;
984
+ }
985
+
986
+ [data-theme="v2"] .eb-player .eb-volume-thumb {
987
+ width: 11px;
988
+ height: 11px;
989
+ background: #fff;
990
+ box-shadow: 0 0 0 2px rgba(255,255,255,.35);
991
+ transform: translate(-50%, -50%) scale(0);
992
+ transition: transform .15s;
993
+ }
994
+
995
+ [data-theme="v2"] .eb-player .eb-volume-control:hover .eb-volume-thumb {
996
+ transform: translate(-50%, -50%) scale(1);
997
+ }
998
+
999
+ /* ============================================================
1000
+ Time display
1001
+ ============================================================ */
1002
+ [data-theme="v2"] .eb-player .eb-time-display {
1003
+ font-size: 13px;
1004
+ color: rgba(255,255,255,.85);
1005
+ font-weight: 500;
1006
+ letter-spacing: .02em;
1007
+ }
1008
+
1009
+ /* ============================================================
1010
+ Live badge — text badge with blinking dot (not icon)
1011
+ ============================================================ */
1012
+ [data-theme="v2"] .eb-player .eb-live-sync {
1013
+ width: auto;
1014
+ height: auto;
1015
+ padding: 4px 10px;
1016
+ border-radius: 6px;
1017
+ font-size: 11px;
1018
+ font-weight: 700;
1019
+ letter-spacing: .08em;
1020
+ text-transform: uppercase;
1021
+ gap: 5px;
1022
+ }
1023
+
1024
+ /* Hide icon, show dot + label */
1025
+ [data-theme="v2"] .eb-player .eb-live-sync__icon {
1026
+ display: none;
1027
+ }
1028
+
1029
+ [data-theme="v2"] .eb-player .eb-live-sync__dot {
1030
+ display: block;
1031
+ width: 6px;
1032
+ height: 6px;
1033
+ border-radius: 50%;
1034
+ background: #fff;
1035
+ flex-shrink: 0;
1036
+ }
1037
+
1038
+ [data-theme="v2"] .eb-player .eb-live-sync__label {
1039
+ display: block;
1040
+ }
1041
+
1042
+ /* Synced state — red background with blinking dot */
1043
+ [data-theme="v2"] .eb-player .eb-live-synced {
1044
+ background: rgba(220,38,38,.9);
1045
+ color: #fff;
1046
+ box-shadow: 0 2px 8px rgba(220,38,38,.4);
1047
+ }
1048
+
1049
+ [data-theme="v2"] .eb-player .eb-live-synced .eb-live-sync__dot {
1050
+ animation: eb-v2-blink 1.2s ease infinite;
1051
+ }
1052
+
1053
+ /* Delayed / not-at-live-edge */
1054
+ [data-theme="v2"] .eb-player .eb-live-sync:not(.eb-live-synced) {
1055
+ background: rgba(60,60,80,.75);
1056
+ color: rgba(255,255,255,.7);
1057
+ box-shadow: none;
1058
+ }
1059
+
1060
+ [data-theme="v2"] .eb-player .eb-live-sync:not(.eb-live-synced) .eb-live-sync__dot {
1061
+ background: rgba(255,255,255,.5);
1062
+ animation: none;
1063
+ }
1064
+
1065
+ [data-theme="v2"] .eb-player .eb-live-sync:not(.eb-live-synced):hover {
1066
+ background: rgba(220,38,38,.7);
1067
+ color: #fff;
1068
+ }
1069
+
1070
+ @keyframes eb-v2-blink {
1071
+ 0%, 100% { opacity: 1; }
1072
+ 50% { opacity: .15; }
1073
+ }
1074
+
1075
+ /* ============================================================
1076
+ Settings panel: glassmorphism dropdown
1077
+ ============================================================ */
1078
+ [data-theme="v2"] .eb-player .eb-settings-panel {
1079
+ background: rgba(10,10,20,.55);
1080
+ backdrop-filter: blur(18px) saturate(160%);
1081
+ -webkit-backdrop-filter: blur(18px) saturate(160%);
1082
+ border-radius: 12px;
1083
+ min-width: 300px;
1084
+ box-shadow: 0 16px 48px rgba(0,0,0,.6), 0 0 0 1px rgba(255,255,255,.1);
1085
+ }
1086
+
1087
+ [data-theme="v2"] .eb-player .eb-settings-menu {
1088
+ padding: 0;
1089
+ }
1090
+
1091
+ [data-theme="v2"] .eb-player .eb-settings-category,
1092
+ [data-theme="v2"] .eb-player .eb-settings-item,
1093
+ [data-theme="v2"] .eb-player .eb-settings-back {
1094
+ padding: 15px 20px;
1095
+ font-size: 13px;
1096
+ color: rgba(255,255,255,.9);
1097
+ border-bottom: 1px solid rgba(255,255,255,.06);
1098
+ transition: background .12s;
1099
+ }
1100
+
1101
+ [data-theme="v2"] .eb-player .eb-settings-category:last-child,
1102
+ [data-theme="v2"] .eb-player .eb-settings-item:last-child {
1103
+ border-bottom: none;
1104
+ }
1105
+
1106
+ [data-theme="v2"] .eb-player .eb-settings-category:hover,
1107
+ [data-theme="v2"] .eb-player .eb-settings-item:hover,
1108
+ [data-theme="v2"] .eb-player .eb-settings-back:hover {
1109
+ background: rgba(255,255,255,.05);
1110
+ }
1111
+
1112
+ /* Selected item text */
1113
+ [data-theme="v2"] .eb-player .eb-settings-item--selected {
1114
+ color: #fff;
1115
+ font-weight: 500;
1116
+ }
1117
+
1118
+ /* Active selection dot (filled orange) */
1119
+ [data-theme="v2"] .eb-player .eb-settings-item--selected::after {
1120
+ content: '';
1121
+ width: 10px;
1122
+ height: 10px;
1123
+ border-radius: 50%;
1124
+ background: var(--eb-accent, #ff841f);
1125
+ box-shadow: 0 0 0 3px rgba(255,132,31,.25);
1126
+ flex-shrink: 0;
1127
+ }
1128
+
1129
+ /* Non-selected items: hollow dot */
1130
+ [data-theme="v2"] .eb-player .eb-settings-item:not(.eb-settings-item--selected)::after {
1131
+ content: '';
1132
+ width: 10px;
1133
+ height: 10px;
1134
+ border-radius: 50%;
1135
+ border: 2px solid rgba(255,255,255,.2);
1136
+ flex-shrink: 0;
1137
+ }
1138
+
1139
+ /* Back button */
1140
+ [data-theme="v2"] .eb-player .eb-settings-back {
1141
+ gap: 14px;
1142
+ font-weight: 600;
1143
+ }
1144
+
1145
+ /* ============================================================
1146
+ Loading spinner
1147
+ ============================================================ */
1148
+ [data-theme="v2"] .eb-player .eb-loading .eb-icon {
1149
+ width: 52px;
1150
+ height: 52px;
1151
+ color: rgba(255,255,255,.7);
1152
+ filter: drop-shadow(0 1px 6px rgba(0,0,0,.5));
1153
+ animation: eb-spin .75s linear infinite;
1154
+ }
1155
+
1156
+ /* ============================================================
1157
+ Error overlay
1158
+ ============================================================ */
1159
+ [data-theme="v2"] .eb-player .eb-error {
1160
+ background: rgba(10,10,20,.85);
1161
+ backdrop-filter: blur(12px);
1162
+ -webkit-backdrop-filter: blur(12px);
1163
+ }
1164
+
1165
+ [data-theme="v2"] .eb-player .eb-error-message {
1166
+ font-weight: 400;
1167
+ letter-spacing: .01em;
1168
+ }
1169
+
1170
+ [data-theme="v2"] .eb-player .eb-error-retry {
1171
+ border-radius: 8px;
1172
+ background: rgba(255,255,255,.1);
1173
+ border-color: rgba(255,255,255,.15);
1174
+ transition: background .2s, color .2s;
1175
+ }
1176
+
1177
+ [data-theme="v2"] .eb-player .eb-error-retry:hover {
1178
+ background: rgba(255,255,255,.18);
1179
+ }
1180
+
1181
+ /* ============================================================
1182
+ Toast (keyboard hints, status messages)
1183
+ ============================================================ */
1184
+ [data-theme="v2"] .eb-player .eb-toast {
1185
+ background: rgba(0,0,0,.72);
1186
+ backdrop-filter: blur(10px);
1187
+ -webkit-backdrop-filter: blur(10px);
1188
+ border-radius: 10px;
1189
+ font-size: 13px;
1190
+ padding: 8px 16px;
1191
+ }
1192
+
1193
+ /* ============================================================
1194
+ Info & socials overlays
1195
+ ============================================================ */
1196
+ [data-theme="v2"] .eb-player .eb-info-overlay,
1197
+ [data-theme="v2"] .eb-player .eb-socials-overlay {
1198
+ background: rgba(10,10,20,.85);
1199
+ backdrop-filter: blur(12px);
1200
+ -webkit-backdrop-filter: blur(12px);
1201
+ }
1202
+
1203
+ [data-theme="v2"] .eb-player .eb-info-close,
1204
+ [data-theme="v2"] .eb-player .eb-socials-close {
1205
+ border-radius: 8px;
1206
+ background: rgba(255,255,255,.07);
1207
+ border-color: rgba(255,255,255,.08);
1208
+ transition: background .2s, color .2s;
1209
+ }
1210
+
1211
+ [data-theme="v2"] .eb-player .eb-info-close:hover,
1212
+ [data-theme="v2"] .eb-player .eb-socials-close:hover {
1213
+ background: rgba(255,255,255,.13);
1214
+ color: #fff;
1215
+ }
1216
+
1217
+ [data-theme="v2"] .eb-player .eb-socials-link {
1218
+ background: rgba(255,255,255,.07);
1219
+ border: 1px solid rgba(255,255,255,.08);
1220
+ border-radius: 8px;
1221
+ transition: background .2s, color .2s, border-color .2s;
1222
+ }
1223
+
1224
+ [data-theme="v2"] .eb-player .eb-socials-link:hover {
1225
+ background: rgba(255,132,31,.15);
1226
+ border-color: rgba(255,132,31,.35);
1227
+ color: #ffb980;
1228
+ }
1229
+
1230
+ /* ============================================================
1231
+ Poster
1232
+ ============================================================ */
1233
+ [data-theme="v2"] .eb-player .eb-poster {
1234
+ background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
1235
+ }
1236
+
1237
+ /* ============================================================
1238
+ Radio overlay
1239
+ ============================================================ */
1240
+ [data-theme="v2"] .eb-player .eb-radio-overlay {
1241
+ background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
1242
+ }
1243
+
1244
+ [data-theme="v2"] .eb-player .eb-radio-bar {
1245
+ background: rgba(255,132,31,.8);
1246
+ }
1247
+
1248
+ /* ============================================================
1249
+ Chapter skip button
1250
+ ============================================================ */
1251
+ [data-theme="v2"] .eb-player .eb-chapter-skip {
1252
+ background: rgba(10,10,20,.55);
1253
+ backdrop-filter: blur(12px);
1254
+ -webkit-backdrop-filter: blur(12px);
1255
+ border: 1px solid rgba(255,255,255,.15);
1256
+ border-radius: 8px;
1257
+ font-size: 12px;
1258
+ font-weight: 500;
1259
+ transition: background .15s;
1260
+ }
1261
+
1262
+ [data-theme="v2"] .eb-player .eb-chapter-skip:hover {
1263
+ background: rgba(255,255,255,.12);
1264
+ }
1265
+
1266
+ /* eb-player skin CSS — BEM-prefixed structural styles */
1267
+ /* All class names use the eb- prefix to avoid collisions with consumer CSS */
1268
+
1269
+ /* ============================================================
1270
+ Root container
1271
+ ============================================================ */
1272
+ .eb-player {
1273
+ position: relative;
1274
+ width: 100%;
1275
+ height: 100%;
1276
+ overflow: hidden;
1277
+ font-family: sans-serif;
1278
+ background: #000;
1279
+ color: #fff;
1280
+ box-sizing: border-box;
1281
+ user-select: none;
1282
+ }
1283
+
1284
+ /* Video element fills the container */
1285
+ .eb-player video.eb-video {
1286
+ position: absolute;
1287
+ top: 0;
1288
+ left: 0;
1289
+ width: 100%;
1290
+ height: 100%;
1291
+ display: block;
1292
+ object-fit: contain;
1293
+ z-index: 1;
1294
+ }
1295
+
1296
+ /* ============================================================
1297
+ Overlay zone (poster, radio, loading, error, socials, info)
1298
+ ============================================================ */
1299
+ .eb-overlay-zone {
1300
+ position: absolute;
1301
+ inset: 0;
1302
+ pointer-events: none;
1303
+ display: flex;
1304
+ align-items: center;
1305
+ justify-content: center;
1306
+ z-index: 10;
1307
+ }
1308
+
1309
+ /* Poster image */
1310
+ .eb-poster {
1311
+ position: absolute;
1312
+ inset: 0;
1313
+ width: 100%;
1314
+ height: 100%;
1315
+ object-fit: contain;
1316
+ pointer-events: none;
1317
+ background: #000;
1318
+ padding: 15%;
1319
+ box-sizing: border-box;
1320
+ }
1321
+
1322
+ /* Ads container (for IMA SDK) */
1323
+ .eb-ads-container {
1324
+ position: absolute;
1325
+ inset: 0;
1326
+ z-index: 20;
1327
+ pointer-events: none;
1328
+ }
1329
+
1330
+ /* ============================================================
1331
+ Top bar
1332
+ ============================================================ */
1333
+ .eb-top-bar {
1334
+ position: absolute;
1335
+ top: 0;
1336
+ left: 0;
1337
+ right: 0;
1338
+ display: flex;
1339
+ flex-direction: row;
1340
+ align-items: center;
1341
+ justify-content: space-between;
1342
+ padding: 8px 12px;
1343
+ background: linear-gradient(to bottom, rgba(0,0,0,0.6), transparent);
1344
+ z-index: 30;
1345
+ pointer-events: auto;
1346
+ }
1347
+
1348
+ .eb-top-bar__logo {
1349
+ height: 28px;
1350
+ width: auto;
1351
+ display: block;
1352
+ }
1353
+
1354
+ .eb-top-bar__logo-link {
1355
+ display: inline-flex;
1356
+ text-decoration: none;
1357
+ }
1358
+
1359
+ .eb-top-bar__actions {
1360
+ display: flex;
1361
+ align-items: center;
1362
+ gap: 4px;
1363
+ margin-left: auto;
1364
+ }
1365
+
1366
+ /* ============================================================
1367
+ Bottom bar
1368
+ ============================================================ */
1369
+ .eb-bottom-bar {
1370
+ position: absolute;
1371
+ bottom: 0;
1372
+ left: 0;
1373
+ right: 0;
1374
+ display: flex;
1375
+ flex-direction: column;
1376
+ z-index: 30;
1377
+ pointer-events: auto;
1378
+ }
1379
+
1380
+ .eb-bottom-bar__gradient {
1381
+ position: absolute;
1382
+ left: 0;
1383
+ right: 0;
1384
+ bottom: 0;
1385
+ height: 100px;
1386
+ background: linear-gradient(to top, rgba(0,0,0,0.7), transparent);
1387
+ pointer-events: none;
1388
+ z-index: -1;
1389
+ }
1390
+
1391
+ .eb-bottom-bar__controls-row {
1392
+ display: flex;
1393
+ flex-direction: row;
1394
+ align-items: center;
1395
+ gap: 4px;
1396
+ padding: 4px 8px 8px;
1397
+ }
1398
+
1399
+ .eb-bottom-bar__seekbar-zone {
1400
+ flex: 1;
1401
+ min-width: 0;
1402
+ }
1403
+
1404
+ /* ============================================================
1405
+ Middle bar
1406
+ ============================================================ */
1407
+ .eb-middle-bar {
1408
+ position: absolute;
1409
+ top: 50%;
1410
+ left: 50%;
1411
+ transform: translate(-50%, -50%);
1412
+ pointer-events: auto;
1413
+ z-index: 25;
1414
+ display: flex;
1415
+ align-items: center;
1416
+ gap: 16px;
1417
+ }
1418
+
1419
+ .eb-middle-bar__play-btn {
1420
+ width: 64px;
1421
+ height: 64px;
1422
+ border-radius: 50%;
1423
+ background: rgba(0,0,0,0.5);
1424
+ display: flex;
1425
+ align-items: center;
1426
+ justify-content: center;
1427
+ }
1428
+
1429
+ .eb-middle-bar__seek-btn {
1430
+ flex-direction: column;
1431
+ gap: 2px;
1432
+ background: none;
1433
+ padding: 4px;
1434
+ }
1435
+
1436
+ .eb-middle-bar__seek-btn:hover {
1437
+ background: rgba(255,255,255,0.1);
1438
+ border-radius: 8px;
1439
+ }
1440
+
1441
+ .eb-seek-circle {
1442
+ width: 32px;
1443
+ height: 32px;
1444
+ display: block;
1445
+ pointer-events: none;
1446
+ fill: currentColor;
1447
+ }
1448
+
1449
+ .eb-seek-label {
1450
+ font-size: 11px;
1451
+ font-weight: 600;
1452
+ line-height: 1;
1453
+ opacity: 0.85;
1454
+ }
1455
+
1456
+ /* ============================================================
1457
+ Extension zones
1458
+ ============================================================ */
1459
+ .eb-extension-top-extra,
1460
+ .eb-extension-bottom-extra,
1461
+ .eb-extension-overlay,
1462
+ .eb-extension-controls-extra {
1463
+ position: absolute;
1464
+ pointer-events: none;
1465
+ z-index: 35;
1466
+ }
1467
+
1468
+ .eb-extension-top-extra > *,
1469
+ .eb-extension-bottom-extra > *,
1470
+ .eb-extension-overlay > *,
1471
+ .eb-extension-controls-extra > * {
1472
+ pointer-events: auto;
1473
+ }
1474
+
1475
+ .eb-extension-top-extra {
1476
+ top: 0;
1477
+ left: 0;
1478
+ right: 0;
1479
+ }
1480
+
1481
+ .eb-extension-bottom-extra {
1482
+ bottom: 0;
1483
+ left: 0;
1484
+ right: 0;
1485
+ }
1486
+
1487
+ .eb-extension-overlay {
1488
+ inset: 0;
1489
+ display: flex;
1490
+ align-items: center;
1491
+ justify-content: center;
1492
+ }
1493
+
1494
+ .eb-extension-controls-extra {
1495
+ bottom: 0;
1496
+ right: 0;
1497
+ display: flex;
1498
+ align-items: center;
1499
+ gap: 4px;
1500
+ padding: 4px 8px 8px;
1501
+ }
1502
+
1503
+ /* ============================================================
1504
+ Time display
1505
+ ============================================================ */
1506
+ .eb-time-display {
1507
+ font-size: 13px;
1508
+ line-height: 1;
1509
+ white-space: nowrap;
1510
+ padding: 0 4px;
1511
+ color: #fff;
1512
+ font-variant-numeric: tabular-nums;
1513
+ }
1514
+
1515
+ /* ============================================================
1516
+ Volume control
1517
+ ============================================================ */
1518
+ .eb-volume-control {
1519
+ display: flex;
1520
+ align-items: center;
1521
+ gap: 4px;
1522
+ margin-right: 8px;
1523
+ }
1524
+
1525
+ .eb-volume-track {
1526
+ position: relative;
1527
+ width: 60px;
1528
+ height: 4px;
1529
+ background: rgba(255, 255, 255, 0.2);
1530
+ border-radius: 2px;
1531
+ cursor: pointer;
1532
+ }
1533
+
1534
+ .eb-volume-fill {
1535
+ position: absolute;
1536
+ top: 0;
1537
+ left: 0;
1538
+ height: 100%;
1539
+ background: var(--eb-color-volume, var(--eb-color-primary, #fff));
1540
+ border-radius: 2px;
1541
+ pointer-events: none;
1542
+ }
1543
+
1544
+ .eb-volume-thumb {
1545
+ position: absolute;
1546
+ top: 50%;
1547
+ width: 10px;
1548
+ height: 10px;
1549
+ border-radius: 50%;
1550
+ background: var(--eb-color-volume, var(--eb-color-primary, #fff));
1551
+ transform: translate(-50%, -50%);
1552
+ pointer-events: none;
1553
+ }
1554
+
1555
+ /* ============================================================
1556
+ Settings panel
1557
+ ============================================================ */
1558
+ .eb-settings-wrapper {
1559
+ position: relative;
1560
+ }
1561
+
1562
+ .eb-settings-panel {
1563
+ position: absolute;
1564
+ background: rgba(0, 0, 0, 0.85);
1565
+ border-radius: 6px;
1566
+ min-width: 180px;
1567
+ overflow: hidden;
1568
+ font-size: 13px;
1569
+ z-index: 40;
1570
+ }
1571
+
1572
+ /* Vertical direction: up (default) or down */
1573
+ .eb-settings-panel--up {
1574
+ bottom: calc(100% + 8px);
1575
+ }
1576
+
1577
+ .eb-settings-panel--down {
1578
+ top: calc(100% + 8px);
1579
+ }
1580
+
1581
+ /* Horizontal alignment: right (default) or left */
1582
+ .eb-settings-panel--right {
1583
+ right: 0;
1584
+ }
1585
+
1586
+ .eb-settings-panel--left {
1587
+ left: 0;
1588
+ }
1589
+
1590
+ .eb-settings-menu {
1591
+ list-style: none;
1592
+ margin: 0;
1593
+ padding: 4px 0;
1594
+ }
1595
+
1596
+ .eb-settings-category,
1597
+ .eb-settings-item,
1598
+ .eb-settings-back {
1599
+ display: flex;
1600
+ align-items: center;
1601
+ justify-content: space-between;
1602
+ width: 100%;
1603
+ padding: 8px 14px;
1604
+ border: none;
1605
+ background: none;
1606
+ color: #fff;
1607
+ cursor: pointer;
1608
+ font-size: 13px;
1609
+ text-align: left;
1610
+ }
1611
+
1612
+ .eb-settings-category:hover,
1613
+ .eb-settings-item:hover,
1614
+ .eb-settings-back:hover {
1615
+ background: rgba(255, 255, 255, 0.1);
1616
+ }
1617
+
1618
+ .eb-settings-item--selected {
1619
+ color: var(--eb-accent, #e53935);
1620
+ }
1621
+
1622
+ /* ============================================================
1623
+ Seekbar
1624
+ ============================================================ */
1625
+ .eb-seekbar {
1626
+ position: relative;
1627
+ width: 100%;
1628
+ padding: 8px 0;
1629
+ cursor: pointer;
1630
+ }
1631
+
1632
+ .eb-seekbar-disabled {
1633
+ pointer-events: none;
1634
+ opacity: 0.4;
1635
+ }
1636
+
1637
+ .eb-seekbar-track {
1638
+ position: relative;
1639
+ height: 4px;
1640
+ background: rgba(255, 255, 255, 0.2);
1641
+ border-radius: 2px;
1642
+ }
1643
+
1644
+ .eb-seekbar-buffered {
1645
+ position: absolute;
1646
+ top: 0;
1647
+ left: 0;
1648
+ height: 100%;
1649
+ background: rgba(255, 255, 255, 0.4);
1650
+ border-radius: 2px;
1651
+ pointer-events: none;
1652
+ }
1653
+
1654
+ .eb-seekbar-progress {
1655
+ position: absolute;
1656
+ top: 0;
1657
+ left: 0;
1658
+ height: 100%;
1659
+ background: var(--eb-color-progress, var(--eb-color-primary, #e53935));
1660
+ border-radius: 2px;
1661
+ pointer-events: none;
1662
+ }
1663
+
1664
+ .eb-seekbar-thumb {
1665
+ position: absolute;
1666
+ right: -6px;
1667
+ top: 50%;
1668
+ width: 12px;
1669
+ height: 12px;
1670
+ border-radius: 50%;
1671
+ background: var(--eb-color-progress, var(--eb-color-primary, #e53935));
1672
+ transform: translateY(-50%) scale(0);
1673
+ transition: transform 0.15s;
1674
+ pointer-events: none;
1675
+ }
1676
+
1677
+ .eb-seekbar:hover .eb-seekbar-thumb {
1678
+ transform: translateY(-50%) scale(1);
1679
+ }
1680
+
1681
+ .eb-seekbar:hover .eb-seekbar-track {
1682
+ height: 6px;
1683
+ }
1684
+
1685
+ .eb-seekbar-tooltip {
1686
+ position: absolute;
1687
+ bottom: calc(100% + 8px);
1688
+ transform: translateX(-50%);
1689
+ background: rgba(0, 0, 0, 0.8);
1690
+ color: #fff;
1691
+ font-size: 12px;
1692
+ padding: 4px 8px;
1693
+ border-radius: 3px;
1694
+ white-space: nowrap;
1695
+ pointer-events: none;
1696
+ text-align: center;
1697
+ }
1698
+
1699
+ .eb-seekbar-preview {
1700
+ width: 120px;
1701
+ height: auto;
1702
+ display: block;
1703
+ margin-bottom: 4px;
1704
+ }
1705
+
1706
+ .eb-chapter-marker {
1707
+ position: absolute;
1708
+ top: 0;
1709
+ width: 3px;
1710
+ height: 100%;
1711
+ background: rgba(255, 255, 255, 0.6);
1712
+ transform: translateX(-50%);
1713
+ pointer-events: none;
1714
+ }
1715
+
1716
+ .eb-chapter-marker.eb-chapter-active {
1717
+ background: #fff;
1718
+ }
1719
+
1720
+ .eb-chapter-skip {
1721
+ position: absolute;
1722
+ right: 0;
1723
+ bottom: calc(100% + 4px);
1724
+ background: rgba(0, 0, 0, 0.7);
1725
+ color: #fff;
1726
+ border: 1px solid rgba(255, 255, 255, 0.4);
1727
+ border-radius: 4px;
1728
+ padding: 6px 16px;
1729
+ font-size: 13px;
1730
+ cursor: pointer;
1731
+ }
1732
+
1733
+ .eb-chapter-skip:hover {
1734
+ background: rgba(255, 255, 255, 0.2);
1735
+ }
1736
+
1737
+ .eb-epg-segment {
1738
+ position: absolute;
1739
+ top: 0;
1740
+ height: 100%;
1741
+ border-right: 1px solid rgba(255, 255, 255, 0.3);
1742
+ pointer-events: none;
1743
+ }
1744
+
1745
+ .eb-epg-segment.eb-epg-current {
1746
+ background: rgba(255, 255, 255, 0.1);
1747
+ }
1748
+
1749
+ /* ============================================================
1750
+ Icons
1751
+ ============================================================ */
1752
+ .eb-icon {
1753
+ width: 20px;
1754
+ height: 20px;
1755
+ fill: none;
1756
+ stroke: currentColor;
1757
+ stroke-width: 2;
1758
+ stroke-linecap: round;
1759
+ stroke-linejoin: round;
1760
+ display: block;
1761
+ pointer-events: none;
1762
+ flex-shrink: 0;
1763
+ }
1764
+
1765
+ /* ============================================================
1766
+ Buttons (base style)
1767
+ ============================================================ */
1768
+ .eb-button,
1769
+ .eb-play-pause,
1770
+ .eb-fullscreen,
1771
+ .eb-pip,
1772
+ .eb-cast,
1773
+ .eb-volume-mute,
1774
+ .eb-live-sync {
1775
+ cursor: pointer;
1776
+ background: none;
1777
+ border: none;
1778
+ padding: 6px;
1779
+ color: var(--eb-color-icon, inherit);
1780
+ display: flex;
1781
+ align-items: center;
1782
+ justify-content: center;
1783
+ border-radius: 4px;
1784
+ transition: background 0.15s;
1785
+ -webkit-tap-highlight-color: transparent;
1786
+ }
1787
+
1788
+ .eb-button:hover,
1789
+ .eb-play-pause:hover,
1790
+ .eb-fullscreen:hover,
1791
+ .eb-pip:hover,
1792
+ .eb-cast:hover,
1793
+ .eb-volume-mute:hover,
1794
+ .eb-live-sync:hover {
1795
+ background: rgba(255,255,255,0.15);
1796
+ }
1797
+
1798
+ .eb-button:active,
1799
+ .eb-play-pause:active,
1800
+ .eb-fullscreen:active,
1801
+ .eb-pip:active,
1802
+ .eb-cast:active,
1803
+ .eb-volume-mute:active,
1804
+ .eb-live-sync:active {
1805
+ background: rgba(255,255,255,0.25);
1806
+ }
1807
+
1808
+ /* ============================================================
1809
+ Radio overlay
1810
+ ============================================================ */
1811
+ .eb-radio-overlay {
1812
+ position: absolute;
1813
+ inset: 0;
1814
+ display: flex;
1815
+ align-items: center;
1816
+ justify-content: center;
1817
+ background: #000;
1818
+ z-index: 15;
1819
+ }
1820
+
1821
+ .eb-radio-bars {
1822
+ display: flex;
1823
+ align-items: flex-end;
1824
+ gap: 4px;
1825
+ height: 40px;
1826
+ }
1827
+
1828
+ .eb-radio-bar {
1829
+ display: block;
1830
+ width: 6px;
1831
+ background: #fff;
1832
+ border-radius: 3px;
1833
+ animation: eb-radio-bar-bounce 0.8s ease-in-out infinite;
1834
+ }
1835
+
1836
+ .eb-radio-bar:nth-child(1) { animation-delay: 0s; height: 20px; }
1837
+ .eb-radio-bar:nth-child(2) { animation-delay: 0.1s; height: 32px; }
1838
+ .eb-radio-bar:nth-child(3) { animation-delay: 0.2s; height: 40px; }
1839
+ .eb-radio-bar:nth-child(4) { animation-delay: 0.3s; height: 28px; }
1840
+ .eb-radio-bar:nth-child(5) { animation-delay: 0.4s; height: 16px; }
1841
+
1842
+ @keyframes eb-radio-bar-bounce {
1843
+ 0%, 100% { transform: scaleY(0.4); opacity: 0.7; }
1844
+ 50% { transform: scaleY(1); opacity: 1; }
1845
+ }
1846
+
1847
+ /* Volume mute button — base styles shared via .eb-button group above */
1848
+
1849
+ /* ============================================================
1850
+ Live sync button
1851
+ ============================================================ */
1852
+ .eb-live-sync[hidden] {
1853
+ display: none;
1854
+ }
1855
+
1856
+ .eb-live-synced {
1857
+ color: var(--eb-accent, #e53935);
1858
+ }
1859
+
1860
+ /* Default theme: show icon only, hide text badge elements */
1861
+ .eb-live-sync__dot,
1862
+ .eb-live-sync__label {
1863
+ display: none;
1864
+ }
1865
+
1866
+ /* ============================================================
1867
+ Overlay panels (error, info, socials — mounted in .eb-player)
1868
+ ============================================================ */
1869
+ .eb-error-slot,
1870
+ .eb-info-slot,
1871
+ .eb-socials-slot {
1872
+ position: absolute;
1873
+ inset: 0;
1874
+ z-index: 50;
1875
+ pointer-events: none;
1876
+ }
1877
+
1878
+ .eb-toast-slot {
1879
+ position: absolute;
1880
+ bottom: 60px;
1881
+ left: 50%;
1882
+ transform: translateX(-50%);
1883
+ z-index: 50;
1884
+ pointer-events: none;
1885
+ }
1886
+
1887
+ .eb-toast {
1888
+ background: rgba(0, 0, 0, 0.8);
1889
+ color: #fff;
1890
+ padding: 8px 20px;
1891
+ border-radius: 4px;
1892
+ font-size: 13px;
1893
+ white-space: nowrap;
1894
+ pointer-events: auto;
1895
+ }
1896
+
1897
+ .eb-error,
1898
+ .eb-info-overlay,
1899
+ .eb-socials-overlay {
1900
+ position: absolute;
1901
+ inset: 0;
1902
+ display: flex;
1903
+ flex-direction: column;
1904
+ align-items: center;
1905
+ justify-content: center;
1906
+ background: rgba(0, 0, 0, 0.75);
1907
+ color: #fff;
1908
+ z-index: 50;
1909
+ pointer-events: auto;
1910
+ padding: 24px;
1911
+ text-align: center;
1912
+ }
1913
+
1914
+ .eb-error[hidden],
1915
+ .eb-info-overlay[hidden],
1916
+ .eb-socials-overlay[hidden] {
1917
+ display: none;
1918
+ }
1919
+
1920
+ .eb-error-message {
1921
+ font-size: 16px;
1922
+ margin: 0 0 16px;
1923
+ }
1924
+
1925
+ .eb-error-retry {
1926
+ background: rgba(255, 255, 255, 0.15);
1927
+ color: #fff;
1928
+ border: 1px solid rgba(255, 255, 255, 0.3);
1929
+ border-radius: 4px;
1930
+ padding: 8px 24px;
1931
+ font-size: 14px;
1932
+ cursor: pointer;
1933
+ }
1934
+
1935
+ .eb-error-retry:hover {
1936
+ background: rgba(255, 255, 255, 0.25);
1937
+ }
1938
+
1939
+ .eb-info-content {
1940
+ font-size: 14px;
1941
+ line-height: 1.5;
1942
+ max-width: 400px;
1943
+ margin-bottom: 16px;
1944
+ }
1945
+
1946
+ .eb-info-close,
1947
+ .eb-socials-close {
1948
+ background: rgba(255, 255, 255, 0.15);
1949
+ color: #fff;
1950
+ border: 1px solid rgba(255, 255, 255, 0.3);
1951
+ border-radius: 4px;
1952
+ padding: 8px 24px;
1953
+ font-size: 14px;
1954
+ cursor: pointer;
1955
+ }
1956
+
1957
+ .eb-info-close:hover,
1958
+ .eb-socials-close:hover {
1959
+ background: rgba(255, 255, 255, 0.25);
1960
+ }
1961
+
1962
+ .eb-socials-links {
1963
+ display: flex;
1964
+ flex-wrap: wrap;
1965
+ gap: 12px;
1966
+ justify-content: center;
1967
+ margin-bottom: 16px;
1968
+ }
1969
+
1970
+ .eb-socials-link {
1971
+ color: #fff;
1972
+ text-decoration: none;
1973
+ background: rgba(255, 255, 255, 0.1);
1974
+ border-radius: 4px;
1975
+ padding: 8px 16px;
1976
+ font-size: 14px;
1977
+ text-transform: capitalize;
1978
+ }
1979
+
1980
+ .eb-socials-link:hover {
1981
+ background: rgba(255, 255, 255, 0.25);
1982
+ }
1983
+
1984
+ /* ============================================================
1985
+ Loading spinner
1986
+ ============================================================ */
1987
+ .eb-loading {
1988
+ display: flex;
1989
+ flex-direction: column;
1990
+ align-items: center;
1991
+ justify-content: center;
1992
+ gap: 8px;
1993
+ color: #fff;
1994
+ pointer-events: none;
1995
+ }
1996
+
1997
+ .eb-loading[hidden] {
1998
+ display: none;
1999
+ }
2000
+
2001
+ .eb-loading .eb-icon {
2002
+ width: 40px;
2003
+ height: 40px;
2004
+ animation: eb-spin 1s linear infinite;
2005
+ }
2006
+
2007
+ .eb-loading-text {
2008
+ font-size: 14px;
2009
+ }
2010
+
2011
+ @keyframes eb-spin {
2012
+ from { transform: rotate(0deg); }
2013
+ to { transform: rotate(360deg); }
2014
+ }
2015
+
2016
+ /* ============================================================
2017
+ Controls visibility
2018
+ ============================================================ */
2019
+ .eb-controls-visible .eb-top-bar,
2020
+ .eb-controls-visible .eb-bottom-bar,
2021
+ .eb-controls-visible .eb-middle-bar {
2022
+ opacity: 1;
2023
+ transition: opacity 0.3s;
2024
+ }
2025
+
2026
+ .eb-controls-hidden .eb-top-bar,
2027
+ .eb-controls-hidden .eb-bottom-bar,
2028
+ .eb-controls-hidden .eb-middle-bar {
2029
+ opacity: 0;
2030
+ transition: opacity 0.3s;
2031
+ pointer-events: none;
2032
+ }
2033
+
2034
+ /* ============================================================
2035
+ iOS native controls fallback
2036
+ ============================================================ */
2037
+ .eb-ios-native .eb-top-bar,
2038
+ .eb-ios-native .eb-bottom-bar,
2039
+ .eb-ios-native .eb-middle-bar,
2040
+ .eb-ios-native .eb-overlay-zone,
2041
+ .eb-ios-native .eb-error-slot,
2042
+ .eb-ios-native .eb-info-slot,
2043
+ .eb-ios-native .eb-socials-slot,
2044
+ .eb-ios-native .eb-toast-slot {
2045
+ display: none;
2046
+ }
2047
+
2048
+ /* ============================================================
2049
+ RTL support
2050
+ ============================================================ */
2051
+ [dir="rtl"] .eb-bottom-bar__controls-row {
2052
+ flex-direction: row-reverse;
2053
+ }
2054
+
2055
+ [dir="rtl"] .eb-top-bar {
2056
+ flex-direction: row-reverse;
2057
+ }
2058
+
2059
+ /* ============================================================
2060
+ Responsive: ensure container fills parent
2061
+ ============================================================ */
2062
+ .eb-player,
2063
+ .eb-player video {
2064
+ max-width: 100%;
2065
+ max-height: 100%;
2066
+ }