@videojs/html 10.0.0-beta.7 → 10.0.0-beta.9

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 (177) hide show
  1. package/cdn/audio-minimal.dev.js +9 -9
  2. package/cdn/audio-minimal.dev.js.map +1 -1
  3. package/cdn/audio-minimal.js +1 -1
  4. package/cdn/audio-minimal.js.map +1 -1
  5. package/cdn/audio.dev.js +9 -9
  6. package/cdn/audio.dev.js.map +1 -1
  7. package/cdn/audio.js +1 -1
  8. package/cdn/audio.js.map +1 -1
  9. package/cdn/background.dev.js +14 -1
  10. package/cdn/background.dev.js.map +1 -1
  11. package/cdn/background.js +1 -1
  12. package/cdn/background.js.map +1 -1
  13. package/cdn/{create-player-Dv7K1Ezk.js → create-player-4kACDl5S.js} +3 -2
  14. package/cdn/create-player-4kACDl5S.js.map +1 -0
  15. package/cdn/{create-player-QjiNZlh7.js → create-player-DxN4WCxY.js} +3 -3
  16. package/cdn/create-player-DxN4WCxY.js.map +1 -0
  17. package/cdn/media/simple-hls-video.dev.js +22 -4
  18. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  19. package/cdn/media/simple-hls-video.js +1 -1
  20. package/cdn/media/simple-hls-video.js.map +1 -1
  21. package/cdn/{player-CztIlNio.js → player-DVYGAHSo.js} +2 -2
  22. package/cdn/{player-CztIlNio.js.map → player-DVYGAHSo.js.map} +1 -1
  23. package/cdn/{player-Dvj38jlr.js → player-u-bvetUg.js} +2 -2
  24. package/cdn/{player-Dvj38jlr.js.map → player-u-bvetUg.js.map} +1 -1
  25. package/cdn/{poster-O0SI05LC.js → poster-BoF67sLZ.js} +3 -3
  26. package/cdn/{poster-O0SI05LC.js.map → poster-BoF67sLZ.js.map} +1 -1
  27. package/cdn/{poster-C4WHg3BH.js → poster-CkKPGKQ1.js} +2 -2
  28. package/cdn/{poster-C4WHg3BH.js.map → poster-CkKPGKQ1.js.map} +1 -1
  29. package/cdn/video-minimal.dev.js +12 -12
  30. package/cdn/video-minimal.dev.js.map +1 -1
  31. package/cdn/video-minimal.js +1 -1
  32. package/cdn/video-minimal.js.map +1 -1
  33. package/cdn/video.dev.js +12 -12
  34. package/cdn/video.dev.js.map +1 -1
  35. package/cdn/video.js +1 -1
  36. package/cdn/video.js.map +1 -1
  37. package/cdn/{volume-slider-BqzTytgB.js → volume-slider-Bv1urvub.js} +2 -2
  38. package/cdn/{volume-slider-BqzTytgB.js.map → volume-slider-Bv1urvub.js.map} +1 -1
  39. package/cdn/{volume-slider-CfhOO9RM.js → volume-slider-DYG1mki7.js} +2 -2
  40. package/cdn/{volume-slider-CfhOO9RM.js.map → volume-slider-DYG1mki7.js.map} +1 -1
  41. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  42. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  43. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  44. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  45. package/dist/default/_virtual/inline-css_src/define/background/skin.js +6 -0
  46. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  47. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  48. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  49. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  50. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  51. package/dist/default/define/audio/minimal-skin.css +161 -141
  52. package/dist/default/define/audio/minimal-skin.js +1 -1
  53. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  54. package/dist/default/define/audio/minimal-skin.tailwind.js +1 -1
  55. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  56. package/dist/default/define/audio/skin.css +164 -132
  57. package/dist/default/define/audio/skin.js +1 -1
  58. package/dist/default/define/audio/skin.js.map +1 -1
  59. package/dist/default/define/audio/skin.tailwind.js +1 -1
  60. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  61. package/dist/default/define/background/skin.js +10 -0
  62. package/dist/default/define/background/skin.js.map +1 -1
  63. package/dist/default/define/video/minimal-skin.css +224 -192
  64. package/dist/default/define/video/minimal-skin.js +1 -1
  65. package/dist/default/define/video/minimal-skin.js.map +1 -1
  66. package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
  67. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  68. package/dist/default/define/video/skin.css +238 -189
  69. package/dist/default/define/video/skin.js +1 -1
  70. package/dist/default/define/video/skin.js.map +1 -1
  71. package/dist/default/define/video/skin.tailwind.js +1 -1
  72. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  73. package/dist/default/media/simple-hls-video/index.js +1 -0
  74. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  75. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +4 -3
  76. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  77. package/dist/default/skins/dist/default/default/tailwind/components/button.js +4 -3
  78. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  79. package/dist/default/skins/dist/default/default/tailwind/components/error.js +2 -2
  80. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  81. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  82. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  83. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +1 -1
  84. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  85. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +1 -1
  86. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  87. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
  88. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  89. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +8 -2
  90. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  91. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  92. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  93. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +15 -0
  94. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  95. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  96. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  97. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
  98. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  99. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  100. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  101. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  102. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  103. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +9 -2
  104. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  105. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  106. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  107. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  108. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  109. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +6 -0
  110. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  111. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  112. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  113. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  114. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  115. package/dist/dev/define/audio/minimal-skin.css +161 -141
  116. package/dist/dev/define/audio/minimal-skin.js +5 -5
  117. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  118. package/dist/dev/define/audio/minimal-skin.tailwind.js +5 -5
  119. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  120. package/dist/dev/define/audio/skin.css +164 -132
  121. package/dist/dev/define/audio/skin.js +5 -5
  122. package/dist/dev/define/audio/skin.js.map +1 -1
  123. package/dist/dev/define/audio/skin.tailwind.js +5 -5
  124. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  125. package/dist/dev/define/background/skin.d.ts.map +1 -1
  126. package/dist/dev/define/background/skin.js +10 -0
  127. package/dist/dev/define/background/skin.js.map +1 -1
  128. package/dist/dev/define/video/minimal-skin.css +224 -192
  129. package/dist/dev/define/video/minimal-skin.js +8 -8
  130. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  131. package/dist/dev/define/video/minimal-skin.tailwind.js +8 -8
  132. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  133. package/dist/dev/define/video/skin.css +238 -189
  134. package/dist/dev/define/video/skin.js +8 -8
  135. package/dist/dev/define/video/skin.js.map +1 -1
  136. package/dist/dev/define/video/skin.tailwind.js +8 -8
  137. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  138. package/dist/dev/media/simple-hls-video/index.js +1 -0
  139. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  140. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +4 -3
  141. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  142. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +4 -3
  143. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  144. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +2 -2
  145. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  146. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  147. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  148. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +1 -1
  149. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  150. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +1 -1
  151. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  152. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
  153. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  154. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +8 -2
  155. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  156. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  157. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  158. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +15 -0
  159. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  160. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  161. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  162. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
  163. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  164. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  165. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  166. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  167. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  168. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +9 -2
  169. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  170. package/package.json +9 -9
  171. package/cdn/audio-minimal.css +0 -1
  172. package/cdn/audio.css +0 -1
  173. package/cdn/background.css +0 -1
  174. package/cdn/create-player-Dv7K1Ezk.js.map +0 -1
  175. package/cdn/create-player-QjiNZlh7.js.map +0 -1
  176. package/cdn/video-minimal.css +0 -1
  177. package/cdn/video.css +0 -1
@@ -1,103 +1,3 @@
1
- /* ==========================================================================
2
- Icon State Visibility for Video Skins
3
-
4
- Data-attribute-driven visibility rules for multi-state icon buttons.
5
- Uses :is() with both element selectors (for HTML custom element wrappers)
6
- and class selectors (for React rendered SVG elements).
7
- ========================================================================== */
8
-
9
- /* --- All icons hidden by default --- */
10
-
11
- .media-button--play .media-icon--restart,
12
- .media-button--play .media-icon--play,
13
- .media-button--play .media-icon--pause,
14
- .media-button--mute .media-icon--volume-off,
15
- .media-button--mute .media-icon--volume-low,
16
- .media-button--mute .media-icon--volume-high,
17
- .media-button--fullscreen .media-icon--fullscreen-enter,
18
- .media-button--fullscreen .media-icon--fullscreen-exit,
19
- .media-button--pip .media-icon--pip-enter,
20
- .media-button--pip .media-icon--pip-exit,
21
- .media-button--captions .media-icon--captions-off,
22
- .media-button--captions .media-icon--captions-on {
23
- display: none;
24
- opacity: 0;
25
- }
26
-
27
- /* --- Active icon per state --- */
28
-
29
- /* Play: ended → restart */
30
- .media-button--play[data-ended] .media-icon--restart,
31
- /* Play: paused (not ended) → play */
32
- .media-button--play:not([data-ended])[data-paused] .media-icon--play,
33
- /* Play: playing (not paused, not ended) → pause */
34
- .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
35
- /* Mute: muted → volume off */
36
- .media-button--mute[data-muted] .media-icon--volume-off,
37
- /* Mute: volume low (not muted) → volume low */
38
- .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
39
- /* Mute: volume high (not muted, not low) → volume high */
40
- .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high,
41
- /* Fullscreen: not fullscreen → enter */
42
- .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,
43
- /* Fullscreen: fullscreen → exit */
44
- .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,
45
- /* Picture-in-Picture: not active → enter */
46
- .media-button--pip:not([data-pip]) .media-icon--pip-enter,
47
- /* Picture-in-Picture: active → exit */
48
- .media-button--pip[data-pip] .media-icon--pip-exit,
49
- /* Captions: not active → captions off */
50
- .media-button--captions:not([data-active]) .media-icon--captions-off,
51
- /* Captions: active → captions on */
52
- .media-button--captions[data-active] .media-icon--captions-on {
53
- display: block;
54
- opacity: 1;
55
- }
56
-
57
- /* ==========================================================================
58
- Tooltip Label State Visibility for Video Skins
59
-
60
- Data-attribute-driven visibility rules for multi-state tooltip labels.
61
- Uses adjacent sibling selectors to match button state → tooltip content.
62
- ========================================================================== */
63
-
64
- /* --- All multi-state labels hidden by default --- */
65
-
66
- .media-tooltip-label {
67
- display: none;
68
- }
69
-
70
- /* --- Active label per state --- */
71
-
72
- /* Play: ended → replay */
73
- .media-button--play[data-ended] + .media-tooltip .media-tooltip-label--replay,
74
- /* Play: paused (not ended) → play */
75
- .media-button--play:not([data-ended])[data-paused] + .media-tooltip
76
- .media-tooltip-label--play,
77
- /* Play: playing (not paused, not ended) → pause */
78
- .media-button--play:not([data-paused]):not([data-ended]) + .media-tooltip
79
- .media-tooltip-label--pause,
80
- /* Fullscreen: not fullscreen → enter */
81
- .media-button--fullscreen:not([data-fullscreen]) + .media-tooltip
82
- .media-tooltip-label--enter-fullscreen,
83
- /* Fullscreen: fullscreen → exit */
84
- .media-button--fullscreen[data-fullscreen] + .media-tooltip
85
- .media-tooltip-label--exit-fullscreen,
86
- /* Captions: not active → enable */
87
- .media-button--captions:not([data-active]) + .media-tooltip
88
- .media-tooltip-label--enable-captions,
89
- /* Captions: active → disable */
90
- .media-button--captions[data-active] + .media-tooltip
91
- .media-tooltip-label--disable-captions,
92
- /* PiP: not in pip → enter */
93
- .media-button--pip:not([data-pip]) + .media-tooltip
94
- .media-tooltip-label--enter-pip,
95
- /* PiP: in pip → exit */
96
- .media-button--pip[data-pip] + .media-tooltip
97
- .media-tooltip-label--exit-pip {
98
- display: block;
99
- }
100
-
101
1
  /* ==========================================================================
102
2
  Reset
103
3
  ========================================================================== */
@@ -215,27 +115,20 @@
215
115
  backdrop-filter: blur(0) saturate(1.5);
216
116
  opacity: 0;
217
117
  pointer-events: none;
118
+ transition-property: opacity, backdrop-filter;
119
+ transition-duration: var(--media-controls-transition-duration);
120
+ transition-delay: var(--media-controls-transition-delay);
121
+ transition-timing-function: ease-out;
122
+ }
218
123
 
219
- @media (pointer: fine) {
220
- transition-property: opacity, backdrop-filter;
221
- transition-duration: 300ms;
222
- transition-delay: 500ms;
223
- transition-timing-function: ease-out;
224
-
225
- @media (prefers-reduced-motion: reduce) {
226
- transition-duration: 100ms;
227
- }
228
- }
124
+ .media-default-skin .media-error ~ .media-overlay {
125
+ transition-duration: var(--media-error-dialog-transition-duration);
126
+ transition-delay: var(--media-error-dialog-transition-delay);
229
127
  }
230
128
 
231
129
  .media-default-skin .media-controls[data-visible] ~ .media-overlay,
232
130
  .media-default-skin .media-error[data-open] ~ .media-overlay {
233
131
  opacity: 1;
234
-
235
- @media (pointer: fine) {
236
- transition-duration: 150ms;
237
- transition-delay: 0ms;
238
- }
239
132
  }
240
133
 
241
134
  .media-default-skin .media-error[data-open] ~ .media-overlay {
@@ -270,57 +163,7 @@
270
163
  ========================================================================== */
271
164
 
272
165
  .media-default-skin .media-error {
273
- position: absolute;
274
- inset: 0;
275
- z-index: 20;
276
- display: flex;
277
- align-items: center;
278
- justify-content: center;
279
- }
280
-
281
- .media-default-skin .media-error__dialog {
282
- display: flex;
283
- flex-direction: column;
284
- gap: 0.75rem;
285
- max-width: 18rem;
286
- padding: 0.75rem;
287
- border-radius: 1.75rem;
288
- color: oklch(1 0 0);
289
- font-size: 0.875rem;
290
- transition-property: opacity, scale;
291
- transition-duration: 500ms;
292
- transition-delay: 100ms;
293
- transition-timing-function: linear(
294
- 0,
295
- 0.034 1.5%,
296
- 0.763 9.7%,
297
- 1.066 13.9%,
298
- 1.198 19.9%,
299
- 1.184 21.8%,
300
- 0.963 37.5%,
301
- 0.997 50.9%,
302
- 1
303
- );
304
-
305
- /* Simple, fast transition for reduced motion users */
306
- @media (prefers-reduced-motion: reduce) {
307
- transition-duration: 100ms;
308
- transition-delay: 0ms;
309
- transition-timing-function: ease-out;
310
- }
311
- }
312
-
313
- .media-default-skin .media-error[data-starting-style] .media-error__dialog,
314
- .media-default-skin .media-error[data-ending-style] .media-error__dialog {
315
- opacity: 0;
316
- scale: 0.5;
317
- }
318
-
319
- .media-default-skin .media-error__content {
320
- display: flex;
321
- flex-direction: column;
322
- gap: 0.5rem;
323
- padding: 0.5rem 0.5rem 0.375rem;
166
+ outline: none;
324
167
  }
325
168
 
326
169
  .media-default-skin .media-error__title {
@@ -342,6 +185,10 @@
342
185
  }
343
186
  }
344
187
 
188
+ .media-default-skin .media-error[data-open] ~ .media-controls * {
189
+ visibility: hidden;
190
+ }
191
+
345
192
  /* ==========================================================================
346
193
  Controls
347
194
  ========================================================================== */
@@ -402,15 +249,11 @@
402
249
  justify-content: center;
403
250
  flex-shrink: 0;
404
251
  padding: 0.5rem 1rem;
405
- background: oklch(1 0 0);
406
252
  border: none;
407
253
  border-radius: calc(infinity * 1px);
408
254
  outline: 2px solid transparent;
409
255
  outline-offset: -2px;
410
- color: oklch(0 0 0);
411
- font-weight: 500;
412
- text-align: center;
413
- transition-property: background-color, color, outline-offset, scale;
256
+ transition-property: background-color, outline-offset, scale;
414
257
  transition-duration: 150ms;
415
258
  transition-timing-function: ease-out;
416
259
  cursor: pointer;
@@ -418,10 +261,14 @@
418
261
  touch-action: manipulation;
419
262
 
420
263
  &:focus-visible {
421
- outline-color: oklch(62.3% 0.214 259.815);
264
+ outline-color: currentColor;
422
265
  outline-offset: 2px;
423
266
  }
424
267
 
268
+ &:active {
269
+ scale: 0.98;
270
+ }
271
+
425
272
  &[disabled] {
426
273
  opacity: 0.5;
427
274
  filter: grayscale(1);
@@ -433,12 +280,16 @@
433
280
  }
434
281
  }
435
282
 
436
- /* Icon button variant */
437
- .media-default-skin .media-button--icon {
438
- display: grid;
439
- width: 2.125rem;
440
- padding: 0;
441
- aspect-ratio: 1;
283
+ /* Primary button variant */
284
+ .media-default-skin .media-button--primary {
285
+ background: oklch(1 0 0);
286
+ color: oklch(0 0 0);
287
+ font-weight: 500;
288
+ text-align: center;
289
+ }
290
+
291
+ /* Subtle button variant */
292
+ .media-default-skin .media-button--subtle {
442
293
  background: transparent;
443
294
  color: inherit;
444
295
  text-shadow: inherit;
@@ -449,6 +300,14 @@
449
300
  background-color: oklch(from currentColor l c h / 0.1);
450
301
  text-decoration: none;
451
302
  }
303
+ }
304
+
305
+ /* Icon button variant */
306
+ .media-default-skin .media-button--icon {
307
+ display: grid;
308
+ width: 2.125rem;
309
+ padding: 0;
310
+ aspect-ratio: 1;
452
311
 
453
312
  &:active {
454
313
  scale: 0.9;
@@ -465,7 +324,7 @@
465
324
  position: absolute;
466
325
  right: -1px;
467
326
  bottom: -3px;
468
- font-size: 0.75em;
327
+ font-size: 10px;
469
328
  font-weight: 480;
470
329
  font-variant-numeric: tabular-nums;
471
330
  }
@@ -688,6 +547,22 @@
688
547
  outline-color: oklch(from currentColor l c h / 0.25);
689
548
  outline-offset: 0;
690
549
  }
550
+
551
+ &::after {
552
+ content: "";
553
+ position: absolute;
554
+ inset: -4px;
555
+ border-radius: inherit;
556
+ box-shadow: 0 0 0 2px oklch(1 0 0);
557
+ transition-property: opacity, scale;
558
+ transition-duration: 150ms;
559
+ transition-timing-function: ease-out;
560
+ }
561
+
562
+ &:not(:focus-visible)::after {
563
+ scale: 0.5;
564
+ opacity: 0;
565
+ }
691
566
  }
692
567
 
693
568
  .media-default-skin .media-slider:active .media-slider__thumb,
@@ -763,7 +638,8 @@
763
638
  color: inherit;
764
639
  overflow: visible;
765
640
  transition-property: scale, opacity, filter;
766
- transition-duration: 150ms;
641
+ transition-duration: var(--media-popup-transition-duration);
642
+ transition-timing-function: var(--media-popup-transition-timing-function);
767
643
 
768
644
  &[data-starting-style],
769
645
  &[data-ending-style] {
@@ -882,6 +758,106 @@
882
758
  font-family: inherit;
883
759
  }
884
760
 
761
+ /* ==========================================================================
762
+ Icon State Visibility for Video Skins
763
+
764
+ Data-attribute-driven visibility rules for multi-state icon buttons.
765
+ Uses :is() with both element selectors (for HTML custom element wrappers)
766
+ and class selectors (for React rendered SVG elements).
767
+ ========================================================================== */
768
+
769
+ /* --- All icons hidden by default --- */
770
+
771
+ .media-button--play .media-icon--restart,
772
+ .media-button--play .media-icon--play,
773
+ .media-button--play .media-icon--pause,
774
+ .media-button--mute .media-icon--volume-off,
775
+ .media-button--mute .media-icon--volume-low,
776
+ .media-button--mute .media-icon--volume-high,
777
+ .media-button--fullscreen .media-icon--fullscreen-enter,
778
+ .media-button--fullscreen .media-icon--fullscreen-exit,
779
+ .media-button--pip .media-icon--pip-enter,
780
+ .media-button--pip .media-icon--pip-exit,
781
+ .media-button--captions .media-icon--captions-off,
782
+ .media-button--captions .media-icon--captions-on {
783
+ display: none;
784
+ opacity: 0;
785
+ }
786
+
787
+ /* --- Active icon per state --- */
788
+
789
+ /* Play: ended → restart */
790
+ .media-button--play[data-ended] .media-icon--restart,
791
+ /* Play: paused (not ended) → play */
792
+ .media-button--play:not([data-ended])[data-paused] .media-icon--play,
793
+ /* Play: playing (not paused, not ended) → pause */
794
+ .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
795
+ /* Mute: muted → volume off */
796
+ .media-button--mute[data-muted] .media-icon--volume-off,
797
+ /* Mute: volume low (not muted) → volume low */
798
+ .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
799
+ /* Mute: volume high (not muted, not low) → volume high */
800
+ .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high,
801
+ /* Fullscreen: not fullscreen → enter */
802
+ .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,
803
+ /* Fullscreen: fullscreen → exit */
804
+ .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,
805
+ /* Picture-in-Picture: not active → enter */
806
+ .media-button--pip:not([data-pip]) .media-icon--pip-enter,
807
+ /* Picture-in-Picture: active → exit */
808
+ .media-button--pip[data-pip] .media-icon--pip-exit,
809
+ /* Captions: not active → captions off */
810
+ .media-button--captions:not([data-active]) .media-icon--captions-off,
811
+ /* Captions: active → captions on */
812
+ .media-button--captions[data-active] .media-icon--captions-on {
813
+ display: block;
814
+ opacity: 1;
815
+ }
816
+
817
+ /* ==========================================================================
818
+ Tooltip Label State Visibility for Video Skins
819
+
820
+ Data-attribute-driven visibility rules for multi-state tooltip labels.
821
+ Uses adjacent sibling selectors to match button state → tooltip content.
822
+ ========================================================================== */
823
+
824
+ /* --- All multi-state labels hidden by default --- */
825
+
826
+ .media-tooltip-label {
827
+ display: none;
828
+ }
829
+
830
+ /* --- Active label per state --- */
831
+
832
+ /* Play: ended → replay */
833
+ .media-button--play[data-ended] + .media-tooltip .media-tooltip-label--replay,
834
+ /* Play: paused (not ended) → play */
835
+ .media-button--play:not([data-ended])[data-paused] + .media-tooltip
836
+ .media-tooltip-label--play,
837
+ /* Play: playing (not paused, not ended) → pause */
838
+ .media-button--play:not([data-paused]):not([data-ended]) + .media-tooltip
839
+ .media-tooltip-label--pause,
840
+ /* Fullscreen: not fullscreen → enter */
841
+ .media-button--fullscreen:not([data-fullscreen]) + .media-tooltip
842
+ .media-tooltip-label--enter-fullscreen,
843
+ /* Fullscreen: fullscreen → exit */
844
+ .media-button--fullscreen[data-fullscreen] + .media-tooltip
845
+ .media-tooltip-label--exit-fullscreen,
846
+ /* Captions: not active → enable */
847
+ .media-button--captions:not([data-active]) + .media-tooltip
848
+ .media-tooltip-label--enable-captions,
849
+ /* Captions: active → disable */
850
+ .media-button--captions[data-active] + .media-tooltip
851
+ .media-tooltip-label--disable-captions,
852
+ /* PiP: not in pip → enter */
853
+ .media-button--pip:not([data-pip]) + .media-tooltip
854
+ .media-tooltip-label--enter-pip,
855
+ /* PiP: in pip → exit */
856
+ .media-button--pip[data-pip] + .media-tooltip
857
+ .media-tooltip-label--exit-pip {
858
+ display: block;
859
+ }
860
+
885
861
 
886
862
  /* ==========================================================================
887
863
  Root
@@ -889,6 +865,17 @@
889
865
 
890
866
  .media-default-skin--video {
891
867
  background: oklch(0 0 0);
868
+ --media-spring-transition: linear(
869
+ 0,
870
+ 0.034 1.5%,
871
+ 0.763 9.7%,
872
+ 1.066 13.9%,
873
+ 1.198 19.9%,
874
+ 1.184 21.8%,
875
+ 0.963 37.5%,
876
+ 0.997 50.9%,
877
+ 1
878
+ );
892
879
  --media-border-color: oklch(0 0 0 / 0.1);
893
880
  --media-surface-background-color: oklch(1 0 0 / 0.1);
894
881
  --media-surface-inner-border-color: oklch(1 0 0 / 0.05);
@@ -898,6 +885,19 @@
898
885
  --media-video-border-radius: var(--media-border-radius, 2rem);
899
886
  --media-controls-transition-duration: 100ms;
900
887
  --media-controls-transition-delay: 0ms;
888
+ --media-controls-transition-timing-function: ease-out;
889
+ --media-error-dialog-transition-duration: 350ms;
890
+ --media-error-dialog-transition-delay: 100ms;
891
+ --media-error-dialog-transition-timing-function: var(--media-spring-transition);
892
+ --media-popup-transition-duration: 100ms;
893
+ --media-popup-transition-timing-function: ease-out;
894
+
895
+ @media (prefers-reduced-motion: reduce) {
896
+ --media-error-dialog-transition-duration: 50ms;
897
+ --media-error-dialog-transition-delay: 0ms;
898
+ --media-error-dialog-transition-timing-function: ease-out;
899
+ --media-popup-transition-duration: 0ms;
900
+ }
901
901
 
902
902
  @media (prefers-color-scheme: dark) {
903
903
  --media-border-color: oklch(1 0 0 / 0.15);
@@ -913,7 +913,7 @@
913
913
  --media-controls-transition-duration: 150ms;
914
914
  }
915
915
  @media (prefers-reduced-motion: reduce) {
916
- --media-controls-transition-duration: 100ms;
916
+ --media-controls-transition-duration: 50ms;
917
917
  }
918
918
  }
919
919
 
@@ -933,6 +933,55 @@
933
933
  }
934
934
  }
935
935
 
936
+ /* ==========================================================================
937
+ Error Dialog
938
+ ========================================================================== */
939
+
940
+ .media-default-skin--video .media-error {
941
+ position: absolute;
942
+ inset: 0;
943
+ z-index: 20;
944
+ display: flex;
945
+ align-items: center;
946
+ justify-content: center;
947
+ }
948
+
949
+ .media-default-skin--video .media-error__dialog {
950
+ display: flex;
951
+ flex-direction: column;
952
+ gap: 0.75rem;
953
+ max-width: 18rem;
954
+ padding: 0.75rem;
955
+ border-radius: 1.75rem;
956
+ color: oklch(1 0 0);
957
+ text-shadow: 0 1px 0 oklch(0 0 0 / 0.25);
958
+ transition-property: opacity, scale;
959
+ transition-duration: var(--media-error-dialog-transition-duration);
960
+ transition-delay: var(--media-error-dialog-transition-delay);
961
+ transition-timing-function: var(--media-error-dialog-transition-timing-function);
962
+ }
963
+
964
+ .media-default-skin--video .media-error[data-starting-style] .media-error__dialog,
965
+ .media-default-skin--video .media-error[data-ending-style] .media-error__dialog {
966
+ opacity: 0;
967
+ scale: 0.5;
968
+ }
969
+ .media-default-skin--video .media-error[data-ending-style] .media-error__dialog {
970
+ transition-delay: 0ms;
971
+ }
972
+
973
+ .media-default-skin--video .media-error__content {
974
+ display: flex;
975
+ flex-direction: column;
976
+ gap: 0.5rem;
977
+ padding: 0.5rem 0.5rem 0.375rem;
978
+ text-shadow: inherit;
979
+ }
980
+
981
+ .media-default-skin--video .media-error__title {
982
+ font-size: 1rem;
983
+ }
984
+
936
985
  /* ==========================================================================
937
986
  Controls (hide/show behavior)
938
987
  ========================================================================== */
@@ -943,9 +992,9 @@
943
992
  inset-inline: 0.75rem;
944
993
  z-index: 10;
945
994
  color: var(--media-color-primary, oklch(1 0 0));
946
- transition-timing-function: ease-out;
947
995
  transition-duration: var(--media-controls-transition-duration);
948
996
  transition-delay: var(--media-controls-transition-delay);
997
+ transition-timing-function: var(--media-controls-transition-timing-function);
949
998
  transform-origin: bottom;
950
999
 
951
1000
  @media (pointer: fine) {
@@ -963,12 +1012,8 @@
963
1012
  pointer-events: none;
964
1013
  scale: 0.9;
965
1014
 
966
- @media (pointer: fine) {
1015
+ @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
967
1016
  filter: blur(8px);
968
-
969
- @media (prefers-reduced-motion: reduce) {
970
- filter: blur(0);
971
- }
972
1017
  }
973
1018
 
974
1019
  @media (prefers-reduced-motion: reduce) {
@@ -977,6 +1022,10 @@
977
1022
  }
978
1023
  }
979
1024
 
1025
+ .media-default-skin--video .media-error[data-open] ~ .media-controls {
1026
+ display: none;
1027
+ }
1028
+
980
1029
  /* Hide cursor when controls are hidden in fullscreen */
981
1030
  @media (pointer: fine) {
982
1031
  .media-default-skin--video:fullscreen:has(.media-controls:not([data-visible])) {
@@ -993,7 +1042,7 @@
993
1042
  box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
994
1043
  }
995
1044
 
996
- .media-default-skin .media-slider__preview {
1045
+ .media-default-skin--video .media-slider__preview {
997
1046
  position: absolute;
998
1047
  left: var(--media-slider-pointer);
999
1048
  bottom: calc(100% + 1.2rem);
@@ -1015,7 +1064,7 @@
1015
1064
  max-height: 6rem;
1016
1065
  }
1017
1066
  }
1018
- .media-default-skin .media-slider[data-pointing] .media-slider__preview:has([role="img"]:not([data-hidden])) {
1067
+ .media-default-skin--video .media-slider[data-pointing] .media-slider__preview:has([role="img"]:not([data-hidden])) {
1019
1068
  opacity: 1;
1020
1069
  scale: 1;
1021
1070
  filter: blur(0);
@@ -23,7 +23,7 @@ import { ReactiveElement } from "@videojs/element";
23
23
  //#region src/define/video/skin.ts
24
24
  const SEEK_TIME = 10;
25
25
  function getTemplateHTML() {
26
- return `<media-container class="media-default-skin media-default-skin--video"><slot name="media"></slot><slot></slot><media-poster><slot name="poster"></slot></media-poster><media-buffering-indicator class="media-buffering-indicator"><div class="media-surface"> ${renderIcon("spinner", { class: "media-icon" })} </div></media-buffering-indicator><media-controls class="media-surface media-controls"><media-tooltip-group><media-play-button commandfor="play-tooltip" class="media-button media-button--icon media-button--play"> ${renderIcon("restart", { class: "media-icon media-icon--restart" })} ${renderIcon("play", { class: "media-icon media-icon--play" })} ${renderIcon("pause", { class: "media-icon media-icon--pause" })} </media-play-button><media-tooltip id="play-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--replay">Replay</span><span class="media-tooltip-label media-tooltip-label--play">Play</span><span class="media-tooltip-label media-tooltip-label--pause">Pause</span></media-tooltip><media-seek-button commandfor="seek-backward-tooltip" seconds="${-SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon media-icon--flipped" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-backward-tooltip" side="top" class="media-surface media-tooltip"> Seek backward ${SEEK_TIME} seconds </media-tooltip><media-seek-button commandfor="seek-forward-tooltip" seconds="${SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-forward-tooltip" side="top" class="media-surface media-tooltip"> Seek forward ${SEEK_TIME} seconds </media-tooltip><media-time-group class="media-time"><media-time type="current" class="media-time__value"></media-time><media-time-slider class="media-slider"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill><media-slider-buffer class="media-slider__buffer"></media-slider-buffer></media-slider-track><media-slider-thumb class="media-slider__thumb"></media-slider-thumb><div class="media-surface media-preview media-slider__preview"><media-slider-thumbnail class="media-preview__thumbnail"></media-slider-thumbnail><media-slider-value type="pointer" class="media-preview__timestamp"></media-slider-value> ${renderIcon("spinner", { class: "media-preview__spinner media-icon" })} </div></media-time-slider><media-time type="duration" class="media-time__value"></media-time></media-time-group><media-playback-rate-button commandfor="playback-rate-tooltip" class="media-button media-button--icon media-button--playback-rate"></media-playback-rate-button><media-tooltip id="playback-rate-tooltip" side="top" class="media-surface media-tooltip"> Toggle playback rate </media-tooltip><media-mute-button commandfor="video-volume-popover" class="media-button media-button--icon media-button--mute"> ${renderIcon("volume-off", { class: "media-icon media-icon--volume-off" })} ${renderIcon("volume-low", { class: "media-icon media-icon--volume-low" })} ${renderIcon("volume-high", { class: "media-icon media-icon--volume-high" })} </media-mute-button><media-popover id="video-volume-popover" open-on-hover delay="200" close-delay="100" side="top" class="media-surface media-popover media-popover--volume"><media-volume-slider class="media-slider" orientation="vertical" thumb-alignment="edge"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill></media-slider-track><media-slider-thumb class="media-slider__thumb media-slider__thumb--persistent"></media-slider-thumb></media-volume-slider></media-popover><media-captions-button commandfor="captions-tooltip" class="media-button media-button--icon media-button--captions"> ${renderIcon("captions-off", { class: "media-icon media-icon--captions-off" })} ${renderIcon("captions-on", { class: "media-icon media-icon--captions-on" })} </media-captions-button><media-tooltip id="captions-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enable-captions">Enable captions</span><span class="media-tooltip-label media-tooltip-label--disable-captions">Disable captions</span></media-tooltip><media-pip-button commandfor="pip-tooltip" class="media-button media-button--icon media-button--pip"> ${renderIcon("pip-enter", { class: "media-icon media-icon--pip-enter" })} ${renderIcon("pip-exit", { class: "media-icon media-icon--pip-exit" })} </media-pip-button><media-tooltip id="pip-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-pip">Enter picture-in-picture</span><span class="media-tooltip-label media-tooltip-label--exit-pip">Exit picture-in-picture</span></media-tooltip><media-fullscreen-button commandfor="fullscreen-tooltip" class="media-button media-button--icon media-button--fullscreen"> ${renderIcon("fullscreen-enter", { class: "media-icon media-icon--fullscreen-enter" })} ${renderIcon("fullscreen-exit", { class: "media-icon media-icon--fullscreen-exit" })} </media-fullscreen-button><media-tooltip id="fullscreen-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-fullscreen">Enter fullscreen</span><span class="media-tooltip-label media-tooltip-label--exit-fullscreen">Exit fullscreen</span></media-tooltip></media-tooltip-group></media-controls><div class="media-overlay"></div></media-container>`;
26
+ return `<media-container class="media-default-skin media-default-skin--video"><slot name="media"></slot><slot></slot><media-poster><slot name="poster"></slot></media-poster><media-buffering-indicator class="media-buffering-indicator"><div class="media-surface"> ${renderIcon("spinner", { class: "media-icon" })} </div></media-buffering-indicator><media-controls class="media-surface media-controls"><media-tooltip-group><media-play-button commandfor="play-tooltip" class="media-button media-button--subtle media-button--icon media-button--play"> ${renderIcon("restart", { class: "media-icon media-icon--restart" })} ${renderIcon("play", { class: "media-icon media-icon--play" })} ${renderIcon("pause", { class: "media-icon media-icon--pause" })} </media-play-button><media-tooltip id="play-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--replay">Replay</span><span class="media-tooltip-label media-tooltip-label--play">Play</span><span class="media-tooltip-label media-tooltip-label--pause">Pause</span></media-tooltip><media-seek-button commandfor="seek-backward-tooltip" seconds="${-SEEK_TIME}" class="media-button media-button--subtle media-button--icon media-button--seek"> <span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon media-icon--flipped" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-backward-tooltip" side="top" class="media-surface media-tooltip"> Seek backward ${SEEK_TIME} seconds </media-tooltip><media-seek-button commandfor="seek-forward-tooltip" seconds="${SEEK_TIME}" class="media-button media-button--subtle media-button--icon media-button--seek"> <span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-forward-tooltip" side="top" class="media-surface media-tooltip"> Seek forward ${SEEK_TIME} seconds </media-tooltip><media-time-group class="media-time"><media-time type="current" class="media-time__value"></media-time><media-time-slider class="media-slider"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill><media-slider-buffer class="media-slider__buffer"></media-slider-buffer></media-slider-track><media-slider-thumb class="media-slider__thumb"></media-slider-thumb><div class="media-surface media-preview media-slider__preview"><media-slider-thumbnail class="media-preview__thumbnail"></media-slider-thumbnail><media-slider-value type="pointer" class="media-preview__timestamp"></media-slider-value> ${renderIcon("spinner", { class: "media-preview__spinner media-icon" })} </div></media-time-slider><media-time type="duration" class="media-time__value"></media-time></media-time-group><media-playback-rate-button commandfor="playback-rate-tooltip" class="media-button media-button--subtle media-button--icon media-button--playback-rate"></media-playback-rate-button><media-tooltip id="playback-rate-tooltip" side="top" class="media-surface media-tooltip"> Toggle playback rate </media-tooltip><media-mute-button commandfor="video-volume-popover" class="media-button media-button--subtle media-button--icon media-button--mute"> ${renderIcon("volume-off", { class: "media-icon media-icon--volume-off" })} ${renderIcon("volume-low", { class: "media-icon media-icon--volume-low" })} ${renderIcon("volume-high", { class: "media-icon media-icon--volume-high" })} </media-mute-button><media-popover id="video-volume-popover" open-on-hover delay="200" close-delay="100" side="top" class="media-surface media-popover media-popover--volume"><media-volume-slider class="media-slider" orientation="vertical" thumb-alignment="edge"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill></media-slider-track><media-slider-thumb class="media-slider__thumb media-slider__thumb--persistent"></media-slider-thumb></media-volume-slider></media-popover><media-captions-button commandfor="captions-tooltip" class="media-button media-button--subtle media-button--icon media-button--captions"> ${renderIcon("captions-off", { class: "media-icon media-icon--captions-off" })} ${renderIcon("captions-on", { class: "media-icon media-icon--captions-on" })} </media-captions-button><media-tooltip id="captions-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enable-captions">Enable captions</span><span class="media-tooltip-label media-tooltip-label--disable-captions">Disable captions</span></media-tooltip><media-pip-button commandfor="pip-tooltip" class="media-button media-button--subtle media-button--icon media-button--pip"> ${renderIcon("pip-enter", { class: "media-icon media-icon--pip-enter" })} ${renderIcon("pip-exit", { class: "media-icon media-icon--pip-exit" })} </media-pip-button><media-tooltip id="pip-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-pip">Enter picture-in-picture</span><span class="media-tooltip-label media-tooltip-label--exit-pip">Exit picture-in-picture</span></media-tooltip><media-fullscreen-button commandfor="fullscreen-tooltip" class="media-button media-button--subtle media-button--icon media-button--fullscreen"> ${renderIcon("fullscreen-enter", { class: "media-icon media-icon--fullscreen-enter" })} ${renderIcon("fullscreen-exit", { class: "media-icon media-icon--fullscreen-exit" })} </media-fullscreen-button><media-tooltip id="fullscreen-tooltip" side="top" class="media-surface media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-fullscreen">Enter fullscreen</span><span class="media-tooltip-label media-tooltip-label--exit-fullscreen">Exit fullscreen</span></media-tooltip></media-tooltip-group></media-controls><div class="media-overlay"></div></media-container>`;
27
27
  }
28
28
  var VideoSkinElement = class extends SkinMixin(ReactiveElement) {
29
29
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"skin.js","names":[],"sources":["../../../../src/define/video/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { renderIcon } from '@videojs/icons/render';\nimport { createStyles, SkinMixin } from '../skin-mixin';\nimport styles from './skin.css?inline';\n\n// Side-effect imports: register all custom elements used in the template.\nimport '../media/container';\nimport '../ui/buffering-indicator';\nimport '../ui/captions-button';\nimport '../ui/controls';\nimport '../ui/fullscreen-button';\nimport '../ui/mute-button';\nimport '../ui/pip-button';\nimport '../ui/play-button';\nimport '../ui/playback-rate-button';\nimport '../ui/popover';\nimport '../ui/poster';\nimport '../ui/seek-button';\nimport '../ui/time';\nimport '../ui/time-slider';\nimport '../ui/tooltip';\nimport '../ui/tooltip-group';\nimport '../ui/volume-slider';\n\nconst SEEK_TIME = 10;\n\nfunction getTemplateHTML() {\n return /*html*/ `\n <media-container class=\"media-default-skin media-default-skin--video\">\n <!-- @deprecated slot=\"media\" is no longer required, use the default slot instead -->\n <slot name=\"media\"></slot>\n <slot></slot>\n\n <media-poster>\n <slot name=\"poster\"></slot>\n </media-poster>\n\n <media-buffering-indicator class=\"media-buffering-indicator\">\n <div class=\"media-surface\">\n ${renderIcon('spinner', { class: 'media-icon' })}\n </div>\n </media-buffering-indicator>\n\n <media-controls class=\"media-surface media-controls\">\n <media-tooltip-group>\n <media-play-button commandfor=\"play-tooltip\" class=\"media-button media-button--icon media-button--play\">\n ${renderIcon('restart', { class: 'media-icon media-icon--restart' })}\n ${renderIcon('play', { class: 'media-icon media-icon--play' })}\n ${renderIcon('pause', { class: 'media-icon media-icon--pause' })}\n </media-play-button>\n <media-tooltip id=\"play-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--replay\">Replay</span>\n <span class=\"media-tooltip-label media-tooltip-label--play\">Play</span>\n <span class=\"media-tooltip-label media-tooltip-label--pause\">Pause</span>\n </media-tooltip>\n\n <media-seek-button commandfor=\"seek-backward-tooltip\" seconds=\"${-SEEK_TIME}\" class=\"media-button media-button--icon media-button--seek\">\n <span class=\"media-icon__container\">\n ${renderIcon('seek', { class: 'media-icon media-icon--flipped' })}\n <span class=\"media-icon__label\">${SEEK_TIME}</span>\n </span>\n </media-seek-button>\n <media-tooltip id=\"seek-backward-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Seek backward ${SEEK_TIME} seconds\n </media-tooltip>\n\n <media-seek-button commandfor=\"seek-forward-tooltip\" seconds=\"${SEEK_TIME}\" class=\"media-button media-button--icon media-button--seek\">\n <span class=\"media-icon__container\">\n ${renderIcon('seek', { class: 'media-icon' })}\n <span class=\"media-icon__label\">${SEEK_TIME}</span>\n </span>\n </media-seek-button>\n <media-tooltip id=\"seek-forward-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Seek forward ${SEEK_TIME} seconds\n </media-tooltip>\n\n <media-time-group class=\"media-time\">\n <media-time type=\"current\" class=\"media-time__value\"></media-time>\n <media-time-slider class=\"media-slider\">\n <media-slider-track class=\"media-slider__track\">\n <media-slider-fill class=\"media-slider__fill\"></media-slider-fill>\n <media-slider-buffer class=\"media-slider__buffer\"></media-slider-buffer>\n </media-slider-track>\n <media-slider-thumb class=\"media-slider__thumb\"></media-slider-thumb>\n\n <div class=\"media-surface media-preview media-slider__preview\">\n <media-slider-thumbnail class=\"media-preview__thumbnail\"></media-slider-thumbnail>\n <media-slider-value type=\"pointer\" class=\"media-preview__timestamp\"></media-slider-value>\n ${renderIcon('spinner', { class: 'media-preview__spinner media-icon' })}\n </div>\n </media-time-slider>\n <media-time type=\"duration\" class=\"media-time__value\"></media-time>\n </media-time-group>\n\n <media-playback-rate-button commandfor=\"playback-rate-tooltip\" class=\"media-button media-button--icon media-button--playback-rate\"></media-playback-rate-button>\n <media-tooltip id=\"playback-rate-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Toggle playback rate\n </media-tooltip>\n\n <media-mute-button commandfor=\"video-volume-popover\" class=\"media-button media-button--icon media-button--mute\">\n ${renderIcon('volume-off', { class: 'media-icon media-icon--volume-off' })}\n ${renderIcon('volume-low', { class: 'media-icon media-icon--volume-low' })}\n ${renderIcon('volume-high', { class: 'media-icon media-icon--volume-high' })}\n </media-mute-button>\n\n <media-popover id=\"video-volume-popover\" open-on-hover delay=\"200\" close-delay=\"100\" side=\"top\" class=\"media-surface media-popover media-popover--volume\">\n <media-volume-slider class=\"media-slider\" orientation=\"vertical\" thumb-alignment=\"edge\">\n <media-slider-track class=\"media-slider__track\">\n <media-slider-fill class=\"media-slider__fill\"></media-slider-fill>\n </media-slider-track>\n <media-slider-thumb class=\"media-slider__thumb media-slider__thumb--persistent\"></media-slider-thumb>\n </media-volume-slider>\n </media-popover>\n\n <media-captions-button commandfor=\"captions-tooltip\" class=\"media-button media-button--icon media-button--captions\">\n ${renderIcon('captions-off', { class: 'media-icon media-icon--captions-off' })}\n ${renderIcon('captions-on', { class: 'media-icon media-icon--captions-on' })}\n </media-captions-button>\n <media-tooltip id=\"captions-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enable-captions\">Enable captions</span>\n <span class=\"media-tooltip-label media-tooltip-label--disable-captions\">Disable captions</span>\n </media-tooltip>\n\n <media-pip-button commandfor=\"pip-tooltip\" class=\"media-button media-button--icon media-button--pip\">\n ${renderIcon('pip-enter', { class: 'media-icon media-icon--pip-enter' })}\n ${renderIcon('pip-exit', { class: 'media-icon media-icon--pip-exit' })}\n </media-pip-button>\n <media-tooltip id=\"pip-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enter-pip\">Enter picture-in-picture</span>\n <span class=\"media-tooltip-label media-tooltip-label--exit-pip\">Exit picture-in-picture</span>\n </media-tooltip>\n\n <media-fullscreen-button commandfor=\"fullscreen-tooltip\" class=\"media-button media-button--icon media-button--fullscreen\">\n ${renderIcon('fullscreen-enter', { class: 'media-icon media-icon--fullscreen-enter' })}\n ${renderIcon('fullscreen-exit', { class: 'media-icon media-icon--fullscreen-exit' })}\n </media-fullscreen-button>\n <media-tooltip id=\"fullscreen-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enter-fullscreen\">Enter fullscreen</span>\n <span class=\"media-tooltip-label media-tooltip-label--exit-fullscreen\">Exit fullscreen</span>\n </media-tooltip>\n </media-tooltip-group>\n </media-controls>\n\n <div class=\"media-overlay\"></div>\n </media-container>\n `;\n}\n\nexport class VideoSkinElement extends SkinMixin(ReactiveElement) {\n static readonly tagName = 'video-skin';\n static styles = createStyles(styles);\n static getTemplateHTML = getTemplateHTML;\n}\n\ncustomElements.define(VideoSkinElement.tagName, VideoSkinElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [VideoSkinElement.tagName]: VideoSkinElement;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,YAAY;AAElB,SAAS,kBAAkB;AACzB,QAAgB,iQAAA,WAAA,WAAA,EAAA,OAAA,cAAA,CAAA,CAAA,wNAAA,WAAA,WAAA,EAAA,OAAA,kCAAA,CAAA,CAAA,GAAA,WAAA,QAAA,EAAA,OAAA,+BAAA,CAAA,CAAA,GAAA,WAAA,SAAA,EAAA,OAAA,gCAAA,CAAA,CAAA,iZAAA,CAAA,UAAA,oGAAA,WAAA,QAAA,EAAA,OAAA,kCAAA,CAAA,CAAA,mCAAA,UAAA,4IAAA,UAAA,yFAAA,UAAA,oGAAA,WAAA,QAAA,EAAA,OAAA,cAAA,CAAA,CAAA,mCAAA,UAAA,0IAAA,UAAA,yqBAAA,WAAA,WAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,mgBAAA,WAAA,cAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,GAAA,WAAA,cAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,GAAA,WAAA,eAAA,EAAA,OAAA,sCAAA,CAAA,CAAA,gpBAAA,WAAA,gBAAA,EAAA,OAAA,uCAAA,CAAA,CAAA,GAAA,WAAA,eAAA,EAAA,OAAA,sCAAA,CAAA,CAAA,iaAAA,WAAA,aAAA,EAAA,OAAA,oCAAA,CAAA,CAAA,GAAA,WAAA,YAAA,EAAA,OAAA,mCAAA,CAAA,CAAA,8aAAA,WAAA,oBAAA,EAAA,OAAA,2CAAA,CAAA,CAAA,GAAA,WAAA,mBAAA,EAAA,OAAA,0CAAA,CAAA,CAAA;;AAGlB,IAAY,mBAAZ,cAA+B,UAAA,gBAAA,CAAA;;iBACb;;;;;;yBAEC"}
1
+ {"version":3,"file":"skin.js","names":[],"sources":["../../../../src/define/video/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { renderIcon } from '@videojs/icons/render';\nimport { createStyles, SkinMixin } from '../skin-mixin';\nimport styles from './skin.css?inline';\n\n// Side-effect imports: register all custom elements used in the template.\nimport '../media/container';\nimport '../ui/buffering-indicator';\nimport '../ui/captions-button';\nimport '../ui/controls';\nimport '../ui/fullscreen-button';\nimport '../ui/mute-button';\nimport '../ui/pip-button';\nimport '../ui/play-button';\nimport '../ui/playback-rate-button';\nimport '../ui/popover';\nimport '../ui/poster';\nimport '../ui/seek-button';\nimport '../ui/time';\nimport '../ui/time-slider';\nimport '../ui/tooltip';\nimport '../ui/tooltip-group';\nimport '../ui/volume-slider';\n\nconst SEEK_TIME = 10;\n\nfunction getTemplateHTML() {\n return /*html*/ `\n <media-container class=\"media-default-skin media-default-skin--video\">\n <!-- @deprecated slot=\"media\" is no longer required, use the default slot instead -->\n <slot name=\"media\"></slot>\n <slot></slot>\n\n <media-poster>\n <slot name=\"poster\"></slot>\n </media-poster>\n\n <media-buffering-indicator class=\"media-buffering-indicator\">\n <div class=\"media-surface\">\n ${renderIcon('spinner', { class: 'media-icon' })}\n </div>\n </media-buffering-indicator>\n\n <media-controls class=\"media-surface media-controls\">\n <media-tooltip-group>\n <media-play-button commandfor=\"play-tooltip\" class=\"media-button media-button--subtle media-button--icon media-button--play\">\n ${renderIcon('restart', { class: 'media-icon media-icon--restart' })}\n ${renderIcon('play', { class: 'media-icon media-icon--play' })}\n ${renderIcon('pause', { class: 'media-icon media-icon--pause' })}\n </media-play-button>\n <media-tooltip id=\"play-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--replay\">Replay</span>\n <span class=\"media-tooltip-label media-tooltip-label--play\">Play</span>\n <span class=\"media-tooltip-label media-tooltip-label--pause\">Pause</span>\n </media-tooltip>\n\n <media-seek-button commandfor=\"seek-backward-tooltip\" seconds=\"${-SEEK_TIME}\" class=\"media-button media-button--subtle media-button--icon media-button--seek\">\n <span class=\"media-icon__container\">\n ${renderIcon('seek', { class: 'media-icon media-icon--flipped' })}\n <span class=\"media-icon__label\">${SEEK_TIME}</span>\n </span>\n </media-seek-button>\n <media-tooltip id=\"seek-backward-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Seek backward ${SEEK_TIME} seconds\n </media-tooltip>\n\n <media-seek-button commandfor=\"seek-forward-tooltip\" seconds=\"${SEEK_TIME}\" class=\"media-button media-button--subtle media-button--icon media-button--seek\">\n <span class=\"media-icon__container\">\n ${renderIcon('seek', { class: 'media-icon' })}\n <span class=\"media-icon__label\">${SEEK_TIME}</span>\n </span>\n </media-seek-button>\n <media-tooltip id=\"seek-forward-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Seek forward ${SEEK_TIME} seconds\n </media-tooltip>\n\n <media-time-group class=\"media-time\">\n <media-time type=\"current\" class=\"media-time__value\"></media-time>\n <media-time-slider class=\"media-slider\">\n <media-slider-track class=\"media-slider__track\">\n <media-slider-fill class=\"media-slider__fill\"></media-slider-fill>\n <media-slider-buffer class=\"media-slider__buffer\"></media-slider-buffer>\n </media-slider-track>\n <media-slider-thumb class=\"media-slider__thumb\"></media-slider-thumb>\n\n <div class=\"media-surface media-preview media-slider__preview\">\n <media-slider-thumbnail class=\"media-preview__thumbnail\"></media-slider-thumbnail>\n <media-slider-value type=\"pointer\" class=\"media-preview__timestamp\"></media-slider-value>\n ${renderIcon('spinner', { class: 'media-preview__spinner media-icon' })}\n </div>\n </media-time-slider>\n <media-time type=\"duration\" class=\"media-time__value\"></media-time>\n </media-time-group>\n\n <media-playback-rate-button commandfor=\"playback-rate-tooltip\" class=\"media-button media-button--subtle media-button--icon media-button--playback-rate\"></media-playback-rate-button>\n <media-tooltip id=\"playback-rate-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n Toggle playback rate\n </media-tooltip>\n\n <media-mute-button commandfor=\"video-volume-popover\" class=\"media-button media-button--subtle media-button--icon media-button--mute\">\n ${renderIcon('volume-off', { class: 'media-icon media-icon--volume-off' })}\n ${renderIcon('volume-low', { class: 'media-icon media-icon--volume-low' })}\n ${renderIcon('volume-high', { class: 'media-icon media-icon--volume-high' })}\n </media-mute-button>\n\n <media-popover id=\"video-volume-popover\" open-on-hover delay=\"200\" close-delay=\"100\" side=\"top\" class=\"media-surface media-popover media-popover--volume\">\n <media-volume-slider class=\"media-slider\" orientation=\"vertical\" thumb-alignment=\"edge\">\n <media-slider-track class=\"media-slider__track\">\n <media-slider-fill class=\"media-slider__fill\"></media-slider-fill>\n </media-slider-track>\n <media-slider-thumb class=\"media-slider__thumb media-slider__thumb--persistent\"></media-slider-thumb>\n </media-volume-slider>\n </media-popover>\n\n <media-captions-button commandfor=\"captions-tooltip\" class=\"media-button media-button--subtle media-button--icon media-button--captions\">\n ${renderIcon('captions-off', { class: 'media-icon media-icon--captions-off' })}\n ${renderIcon('captions-on', { class: 'media-icon media-icon--captions-on' })}\n </media-captions-button>\n <media-tooltip id=\"captions-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enable-captions\">Enable captions</span>\n <span class=\"media-tooltip-label media-tooltip-label--disable-captions\">Disable captions</span>\n </media-tooltip>\n\n <media-pip-button commandfor=\"pip-tooltip\" class=\"media-button media-button--subtle media-button--icon media-button--pip\">\n ${renderIcon('pip-enter', { class: 'media-icon media-icon--pip-enter' })}\n ${renderIcon('pip-exit', { class: 'media-icon media-icon--pip-exit' })}\n </media-pip-button>\n <media-tooltip id=\"pip-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enter-pip\">Enter picture-in-picture</span>\n <span class=\"media-tooltip-label media-tooltip-label--exit-pip\">Exit picture-in-picture</span>\n </media-tooltip>\n\n <media-fullscreen-button commandfor=\"fullscreen-tooltip\" class=\"media-button media-button--subtle media-button--icon media-button--fullscreen\">\n ${renderIcon('fullscreen-enter', { class: 'media-icon media-icon--fullscreen-enter' })}\n ${renderIcon('fullscreen-exit', { class: 'media-icon media-icon--fullscreen-exit' })}\n </media-fullscreen-button>\n <media-tooltip id=\"fullscreen-tooltip\" side=\"top\" class=\"media-surface media-tooltip\">\n <span class=\"media-tooltip-label media-tooltip-label--enter-fullscreen\">Enter fullscreen</span>\n <span class=\"media-tooltip-label media-tooltip-label--exit-fullscreen\">Exit fullscreen</span>\n </media-tooltip>\n </media-tooltip-group>\n </media-controls>\n\n <div class=\"media-overlay\"></div>\n </media-container>\n `;\n}\n\nexport class VideoSkinElement extends SkinMixin(ReactiveElement) {\n static readonly tagName = 'video-skin';\n static styles = createStyles(styles);\n static getTemplateHTML = getTemplateHTML;\n}\n\ncustomElements.define(VideoSkinElement.tagName, VideoSkinElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [VideoSkinElement.tagName]: VideoSkinElement;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,YAAY;AAElB,SAAS,kBAAkB;AACzB,QAAgB,iQAAA,WAAA,WAAA,EAAA,OAAA,cAAA,CAAA,CAAA,6OAAA,WAAA,WAAA,EAAA,OAAA,kCAAA,CAAA,CAAA,GAAA,WAAA,QAAA,EAAA,OAAA,+BAAA,CAAA,CAAA,GAAA,WAAA,SAAA,EAAA,OAAA,gCAAA,CAAA,CAAA,iZAAA,CAAA,UAAA,0HAAA,WAAA,QAAA,EAAA,OAAA,kCAAA,CAAA,CAAA,mCAAA,UAAA,4IAAA,UAAA,yFAAA,UAAA,0HAAA,WAAA,QAAA,EAAA,OAAA,cAAA,CAAA,CAAA,mCAAA,UAAA,0IAAA,UAAA,yqBAAA,WAAA,WAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,6iBAAA,WAAA,cAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,GAAA,WAAA,cAAA,EAAA,OAAA,qCAAA,CAAA,CAAA,GAAA,WAAA,eAAA,EAAA,OAAA,sCAAA,CAAA,CAAA,qqBAAA,WAAA,gBAAA,EAAA,OAAA,uCAAA,CAAA,CAAA,GAAA,WAAA,eAAA,EAAA,OAAA,sCAAA,CAAA,CAAA,sbAAA,WAAA,aAAA,EAAA,OAAA,oCAAA,CAAA,CAAA,GAAA,WAAA,YAAA,EAAA,OAAA,mCAAA,CAAA,CAAA,mcAAA,WAAA,oBAAA,EAAA,OAAA,2CAAA,CAAA,CAAA,GAAA,WAAA,mBAAA,EAAA,OAAA,0CAAA,CAAA,CAAA;;AAGlB,IAAY,mBAAZ,cAA+B,UAAA,gBAAA,CAAA;;iBACb;;;;;;yBAEC"}