@videojs/react 10.0.0-beta.8 → 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 (118) hide show
  1. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  2. package/dist/default/presets/audio/minimal-skin.css +161 -141
  3. package/dist/default/presets/audio/minimal-skin.js +110 -100
  4. package/dist/default/presets/audio/minimal-skin.js.map +1 -1
  5. package/dist/default/presets/audio/minimal-skin.tailwind.js +120 -111
  6. package/dist/default/presets/audio/minimal-skin.tailwind.js.map +1 -1
  7. package/dist/default/presets/audio/skin.css +164 -132
  8. package/dist/default/presets/audio/skin.js +101 -91
  9. package/dist/default/presets/audio/skin.js.map +1 -1
  10. package/dist/default/presets/audio/skin.tailwind.js +111 -102
  11. package/dist/default/presets/audio/skin.tailwind.js.map +1 -1
  12. package/dist/default/presets/{video/error-dialog.js → error-dialog.js} +18 -18
  13. package/dist/default/presets/error-dialog.js.map +1 -0
  14. package/dist/default/presets/video/minimal-skin.css +224 -192
  15. package/dist/default/presets/video/minimal-skin.js +58 -62
  16. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  17. package/dist/default/presets/video/minimal-skin.tailwind.js +70 -78
  18. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  19. package/dist/default/presets/video/skin.css +238 -189
  20. package/dist/default/presets/video/skin.js +58 -62
  21. package/dist/default/presets/video/skin.js.map +1 -1
  22. package/dist/default/presets/video/skin.tailwind.js +69 -77
  23. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  24. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +5 -4
  25. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  26. package/dist/default/skins/dist/default/default/tailwind/components/button.js +4 -3
  27. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  28. package/dist/default/skins/dist/default/default/tailwind/components/error.js +2 -2
  29. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  30. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  31. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  32. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +1 -1
  33. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  34. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +1 -1
  35. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  36. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
  37. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  38. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +9 -4
  39. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  40. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  41. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  42. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +2 -2
  43. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  44. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  45. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  46. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
  47. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  48. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  49. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  50. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  51. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  52. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +10 -4
  53. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  54. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
  55. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  56. package/dist/dev/presets/audio/minimal-skin.css +161 -141
  57. package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -1
  58. package/dist/dev/presets/audio/minimal-skin.js +110 -100
  59. package/dist/dev/presets/audio/minimal-skin.js.map +1 -1
  60. package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts.map +1 -1
  61. package/dist/dev/presets/audio/minimal-skin.tailwind.js +120 -111
  62. package/dist/dev/presets/audio/minimal-skin.tailwind.js.map +1 -1
  63. package/dist/dev/presets/audio/skin.css +164 -132
  64. package/dist/dev/presets/audio/skin.d.ts.map +1 -1
  65. package/dist/dev/presets/audio/skin.js +101 -91
  66. package/dist/dev/presets/audio/skin.js.map +1 -1
  67. package/dist/dev/presets/audio/skin.tailwind.d.ts.map +1 -1
  68. package/dist/dev/presets/audio/skin.tailwind.js +111 -102
  69. package/dist/dev/presets/audio/skin.tailwind.js.map +1 -1
  70. package/dist/dev/presets/{video/error-dialog.js → error-dialog.js} +18 -18
  71. package/dist/dev/presets/error-dialog.js.map +1 -0
  72. package/dist/dev/presets/video/minimal-skin.css +224 -192
  73. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  74. package/dist/dev/presets/video/minimal-skin.js +58 -62
  75. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  76. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  77. package/dist/dev/presets/video/minimal-skin.tailwind.js +70 -78
  78. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  79. package/dist/dev/presets/video/skin.css +238 -189
  80. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  81. package/dist/dev/presets/video/skin.js +58 -62
  82. package/dist/dev/presets/video/skin.js.map +1 -1
  83. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  84. package/dist/dev/presets/video/skin.tailwind.js +69 -77
  85. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  86. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +5 -4
  87. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  88. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +4 -3
  89. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  90. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +2 -2
  91. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  92. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  93. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  94. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +1 -1
  95. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  96. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +1 -1
  97. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  98. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
  99. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  100. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +9 -4
  101. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  102. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  103. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  104. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +2 -2
  105. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  106. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  107. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  108. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
  109. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  110. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  111. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  112. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  113. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  114. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +10 -4
  115. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  116. package/package.json +7 -7
  117. package/dist/default/presets/video/error-dialog.js.map +0 -1
  118. package/dist/dev/presets/video/error-dialog.js.map +0 -1
@@ -1,67 +1,3 @@
1
- /* ==========================================================================
2
- Icon State Visibility for Audio 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
- display: none;
18
- opacity: 0;
19
- }
20
-
21
- /* --- Active icon per state --- */
22
-
23
- /* Play: ended → restart */
24
- .media-button--play[data-ended] .media-icon--restart,
25
- /* Play: paused (not ended) → play */
26
- .media-button--play:not([data-ended])[data-paused] .media-icon--play,
27
- /* Play: playing (not paused, not ended) → pause */
28
- .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
29
- /* Mute: muted → volume off */
30
- .media-button--mute[data-muted] .media-icon--volume-off,
31
- /* Mute: volume low (not muted) → volume low */
32
- .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
33
- /* Mute: volume high (not muted, not low) → volume high */
34
- .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high {
35
- display: block;
36
- opacity: 1;
37
- }
38
-
39
- /* ==========================================================================
40
- Tooltip Label State Visibility for Audio Skins
41
-
42
- Data-attribute-driven visibility rules for multi-state tooltip labels.
43
- Uses adjacent sibling selectors to match button state → tooltip content.
44
- ========================================================================== */
45
-
46
- /* --- All multi-state labels hidden by default --- */
47
-
48
- .media-tooltip-label {
49
- display: none;
50
- }
51
-
52
- /* --- Active label per state --- */
53
-
54
- /* Play: ended → replay */
55
- .media-button--play[data-ended] + .media-tooltip .media-tooltip-label--replay,
56
- /* Play: paused (not ended) → play */
57
- .media-button--play:not([data-ended])[data-paused] + .media-tooltip
58
- .media-tooltip-label--play,
59
- /* Play: playing (not paused, not ended) → pause */
60
- .media-button--play:not([data-paused]):not([data-ended]) + .media-tooltip
61
- .media-tooltip-label--pause {
62
- display: block;
63
- }
64
-
65
1
  /* ==========================================================================
66
2
  Reset
67
3
  ========================================================================== */
@@ -171,57 +107,7 @@
171
107
  ========================================================================== */
172
108
 
173
109
  .media-default-skin .media-error {
174
- position: absolute;
175
- inset: 0;
176
- z-index: 20;
177
- display: flex;
178
- align-items: center;
179
- justify-content: center;
180
- }
181
-
182
- .media-default-skin .media-error__dialog {
183
- display: flex;
184
- flex-direction: column;
185
- gap: 0.75rem;
186
- max-width: 18rem;
187
- padding: 0.75rem;
188
- border-radius: 1.75rem;
189
- color: oklch(1 0 0);
190
- font-size: 0.875rem;
191
- transition-property: opacity, scale;
192
- transition-duration: 500ms;
193
- transition-delay: 100ms;
194
- transition-timing-function: linear(
195
- 0,
196
- 0.034 1.5%,
197
- 0.763 9.7%,
198
- 1.066 13.9%,
199
- 1.198 19.9%,
200
- 1.184 21.8%,
201
- 0.963 37.5%,
202
- 0.997 50.9%,
203
- 1
204
- );
205
-
206
- /* Simple, fast transition for reduced motion users */
207
- @media (prefers-reduced-motion: reduce) {
208
- transition-duration: 100ms;
209
- transition-delay: 0ms;
210
- transition-timing-function: ease-out;
211
- }
212
- }
213
-
214
- .media-default-skin .media-error[data-starting-style] .media-error__dialog,
215
- .media-default-skin .media-error[data-ending-style] .media-error__dialog {
216
- opacity: 0;
217
- scale: 0.5;
218
- }
219
-
220
- .media-default-skin .media-error__content {
221
- display: flex;
222
- flex-direction: column;
223
- gap: 0.5rem;
224
- padding: 0.5rem 0.5rem 0.375rem;
110
+ outline: none;
225
111
  }
226
112
 
227
113
  .media-default-skin .media-error__title {
@@ -243,6 +129,10 @@
243
129
  }
244
130
  }
245
131
 
132
+ .media-default-skin .media-error[data-open] ~ .media-controls * {
133
+ visibility: hidden;
134
+ }
135
+
246
136
  /* ==========================================================================
247
137
  Controls
248
138
  ========================================================================== */
@@ -303,15 +193,11 @@
303
193
  justify-content: center;
304
194
  flex-shrink: 0;
305
195
  padding: 0.5rem 1rem;
306
- background: oklch(1 0 0);
307
196
  border: none;
308
197
  border-radius: calc(infinity * 1px);
309
198
  outline: 2px solid transparent;
310
199
  outline-offset: -2px;
311
- color: oklch(0 0 0);
312
- font-weight: 500;
313
- text-align: center;
314
- transition-property: background-color, color, outline-offset, scale;
200
+ transition-property: background-color, outline-offset, scale;
315
201
  transition-duration: 150ms;
316
202
  transition-timing-function: ease-out;
317
203
  cursor: pointer;
@@ -319,10 +205,14 @@
319
205
  touch-action: manipulation;
320
206
 
321
207
  &:focus-visible {
322
- outline-color: oklch(62.3% 0.214 259.815);
208
+ outline-color: currentColor;
323
209
  outline-offset: 2px;
324
210
  }
325
211
 
212
+ &:active {
213
+ scale: 0.98;
214
+ }
215
+
326
216
  &[disabled] {
327
217
  opacity: 0.5;
328
218
  filter: grayscale(1);
@@ -334,12 +224,16 @@
334
224
  }
335
225
  }
336
226
 
337
- /* Icon button variant */
338
- .media-default-skin .media-button--icon {
339
- display: grid;
340
- width: 2.125rem;
341
- padding: 0;
342
- aspect-ratio: 1;
227
+ /* Primary button variant */
228
+ .media-default-skin .media-button--primary {
229
+ background: oklch(1 0 0);
230
+ color: oklch(0 0 0);
231
+ font-weight: 500;
232
+ text-align: center;
233
+ }
234
+
235
+ /* Subtle button variant */
236
+ .media-default-skin .media-button--subtle {
343
237
  background: transparent;
344
238
  color: inherit;
345
239
  text-shadow: inherit;
@@ -350,6 +244,14 @@
350
244
  background-color: oklch(from currentColor l c h / 0.1);
351
245
  text-decoration: none;
352
246
  }
247
+ }
248
+
249
+ /* Icon button variant */
250
+ .media-default-skin .media-button--icon {
251
+ display: grid;
252
+ width: 2.125rem;
253
+ padding: 0;
254
+ aspect-ratio: 1;
353
255
 
354
256
  &:active {
355
257
  scale: 0.9;
@@ -366,7 +268,7 @@
366
268
  position: absolute;
367
269
  right: -1px;
368
270
  bottom: -3px;
369
- font-size: 0.75em;
271
+ font-size: 10px;
370
272
  font-weight: 480;
371
273
  font-variant-numeric: tabular-nums;
372
274
  }
@@ -495,6 +397,22 @@
495
397
  outline-color: oklch(from currentColor l c h / 0.25);
496
398
  outline-offset: 0;
497
399
  }
400
+
401
+ &::after {
402
+ content: "";
403
+ position: absolute;
404
+ inset: -4px;
405
+ border-radius: inherit;
406
+ box-shadow: 0 0 0 2px oklch(1 0 0);
407
+ transition-property: opacity, scale;
408
+ transition-duration: 150ms;
409
+ transition-timing-function: ease-out;
410
+ }
411
+
412
+ &:not(:focus-visible)::after {
413
+ scale: 0.5;
414
+ opacity: 0;
415
+ }
498
416
  }
499
417
 
500
418
  .media-default-skin .media-slider:active .media-slider__thumb,
@@ -570,7 +488,8 @@
570
488
  color: inherit;
571
489
  overflow: visible;
572
490
  transition-property: scale, opacity, filter;
573
- transition-duration: 150ms;
491
+ transition-duration: var(--media-popup-transition-duration);
492
+ transition-timing-function: var(--media-popup-transition-timing-function);
574
493
 
575
494
  &[data-starting-style],
576
495
  &[data-ending-style] {
@@ -666,6 +585,70 @@
666
585
  }
667
586
  }
668
587
 
588
+ /* ==========================================================================
589
+ Icon State Visibility for Audio Skins
590
+
591
+ Data-attribute-driven visibility rules for multi-state icon buttons.
592
+ Uses :is() with both element selectors (for HTML custom element wrappers)
593
+ and class selectors (for React rendered SVG elements).
594
+ ========================================================================== */
595
+
596
+ /* --- All icons hidden by default --- */
597
+
598
+ .media-button--play .media-icon--restart,
599
+ .media-button--play .media-icon--play,
600
+ .media-button--play .media-icon--pause,
601
+ .media-button--mute .media-icon--volume-off,
602
+ .media-button--mute .media-icon--volume-low,
603
+ .media-button--mute .media-icon--volume-high {
604
+ display: none;
605
+ opacity: 0;
606
+ }
607
+
608
+ /* --- Active icon per state --- */
609
+
610
+ /* Play: ended → restart */
611
+ .media-button--play[data-ended] .media-icon--restart,
612
+ /* Play: paused (not ended) → play */
613
+ .media-button--play:not([data-ended])[data-paused] .media-icon--play,
614
+ /* Play: playing (not paused, not ended) → pause */
615
+ .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
616
+ /* Mute: muted → volume off */
617
+ .media-button--mute[data-muted] .media-icon--volume-off,
618
+ /* Mute: volume low (not muted) → volume low */
619
+ .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
620
+ /* Mute: volume high (not muted, not low) → volume high */
621
+ .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high {
622
+ display: block;
623
+ opacity: 1;
624
+ }
625
+
626
+ /* ==========================================================================
627
+ Tooltip Label State Visibility for Audio Skins
628
+
629
+ Data-attribute-driven visibility rules for multi-state tooltip labels.
630
+ Uses adjacent sibling selectors to match button state → tooltip content.
631
+ ========================================================================== */
632
+
633
+ /* --- All multi-state labels hidden by default --- */
634
+
635
+ .media-tooltip-label {
636
+ display: none;
637
+ }
638
+
639
+ /* --- Active label per state --- */
640
+
641
+ /* Play: ended → replay */
642
+ .media-button--play[data-ended] + .media-tooltip .media-tooltip-label--replay,
643
+ /* Play: paused (not ended) → play */
644
+ .media-button--play:not([data-ended])[data-paused] + .media-tooltip
645
+ .media-tooltip-label--play,
646
+ /* Play: playing (not paused, not ended) → pause */
647
+ .media-button--play:not([data-paused]):not([data-ended]) + .media-tooltip
648
+ .media-tooltip-label--pause {
649
+ display: block;
650
+ }
651
+
669
652
 
670
653
  /* ==========================================================================
671
654
  Root
@@ -678,26 +661,75 @@
678
661
  --media-surface-outer-border-color: oklch(0 0 0 / 0.05);
679
662
  --media-surface-shadow-color: oklch(0 0 0 / 0.15);
680
663
  --media-surface-backdrop-filter: blur(16px) saturate(1.5);
681
- --media-controls-text-color: var(--media-color-primary, oklch(0 0 0));
664
+ --media-text-color: var(--media-color-primary, oklch(0 0 0));
665
+ --media-error-dialog-transition-duration: 250ms;
666
+ --media-error-dialog-transition-delay: 100ms;
667
+ --media-popup-transition-duration: 100ms;
668
+ --media-popup-transition-timing-function: ease-out;
669
+
670
+ @media (prefers-reduced-motion: reduce) {
671
+ --media-error-dialog-transition-duration: 50ms;
672
+ --media-error-dialog-transition-delay: 0ms;
673
+ --media-popup-transition-duration: 0ms;
674
+ }
682
675
 
683
676
  @media (prefers-color-scheme: dark) {
684
677
  --media-border-color: oklch(1 0 0 / 0.1);
685
678
  --media-surface-background-color: oklch(0 0 0 / 0.4);
686
- --media-controls-text-color: var(--media-color-primary, oklch(1 0 0));
679
+ --media-text-color: var(--media-color-primary, oklch(1 0 0));
687
680
  }
688
681
  }
689
682
 
683
+ /* ==========================================================================
684
+ Error Dialog
685
+ ========================================================================== */
686
+
687
+ .media-default-skin--audio .media-error__dialog {
688
+ position: absolute;
689
+ inset: 0;
690
+ z-index: 20;
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 0.75rem;
694
+ padding-inline: 1.25rem 0.125rem;
695
+ transition-property: opacity, filter;
696
+ transition-duration: var(--media-error-dialog-transition-duration);
697
+ transition-delay: var(--media-error-dialog-transition-delay);
698
+ transition-timing-function: ease-out;
699
+ border-radius: calc(infinity * 1px);
700
+ background-color: var(--media-surface-background-color);
701
+ backdrop-filter: var(--media-surface-backdrop-filter);
702
+ color: var(--media-text-color);
703
+ }
704
+
705
+ .media-default-skin .media-error[data-starting-style] .media-error__dialog,
706
+ .media-default-skin .media-error[data-ending-style] .media-error__dialog {
707
+ opacity: 0;
708
+ filter: blur(4px);
709
+ }
710
+ .media-default-skin .media-error[data-ending-style] .media-error__dialog {
711
+ transition-delay: 0ms;
712
+ }
713
+
714
+ .media-default-skin--audio .media-error__content {
715
+ flex: 1;
716
+ display: flex;
717
+ gap: 0.5rem;
718
+ align-items: center;
719
+ }
720
+
690
721
  /* ==========================================================================
691
722
  Controls
692
723
  ========================================================================== */
693
724
 
694
725
  .media-default-skin--audio .media-controls {
695
- color: var(--media-controls-text-color);
726
+ color: var(--media-text-color);
696
727
  }
697
728
 
698
729
  /* ==========================================================================
699
730
  Sliders
700
731
  ========================================================================== */
732
+
701
733
  .media-default-skin--audio .media-slider__track {
702
734
  background-color: oklch(0 0 0 / 0.1);
703
735
 
@@ -1 +1 @@
1
- {"version":3,"file":"skin.d.ts","names":[],"sources":["../../../../src/presets/audio/skin.tsx"],"mappings":";;;;KAyBY,cAAA,GAAiB,aAAA;AAAA,iBA6Cb,SAAA,CAAU,KAAA,EAAO,cAAA,GAAiB,SAAA"}
1
+ {"version":3,"file":"skin.d.ts","names":[],"sources":["../../../../src/presets/audio/skin.tsx"],"mappings":";;;;KAoCY,cAAA,GAAiB,aAAA;AAAA,iBAgDb,SAAA,CAAU,KAAA,EAAO,cAAA,GAAiB,SAAA"}
@@ -18,6 +18,7 @@ import { TooltipProvider } from "../../ui/tooltip/tooltip-provider.js";
18
18
  import { TooltipRoot } from "../../ui/tooltip/tooltip-root.js";
19
19
  import { TooltipTrigger } from "../../ui/tooltip/tooltip-trigger.js";
20
20
  import { VolumeSliderRoot } from "../../ui/volume-slider/volume-slider-root.js";
21
+ import { ErrorDialog } from "../error-dialog.js";
21
22
  import PauseIcon from "../../icons/dist/react/default/pause.js";
22
23
  import PlayIcon from "../../icons/dist/react/default/play.js";
23
24
  import RestartIcon from "../../icons/dist/react/default/restart.js";
@@ -26,35 +27,44 @@ import VolumeHighIcon from "../../icons/dist/react/default/volume-high.js";
26
27
  import VolumeLowIcon from "../../icons/dist/react/default/volume-low.js";
27
28
  import VolumeOffIcon from "../../icons/dist/react/default/volume-off.js";
28
29
  import { forwardRef } from "react";
29
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
30
+ import { jsx, jsxs } from "react/jsx-runtime";
30
31
  import { cn } from "@videojs/utils/style";
31
32
 
32
33
  //#region src/presets/audio/skin.tsx
33
34
  const SEEK_TIME = 10;
35
+ const ERROR_CLASSNAMES = {
36
+ root: "media-error",
37
+ dialog: "media-error__dialog",
38
+ content: "media-error__content",
39
+ title: "media-error__title",
40
+ description: "media-error__description",
41
+ actions: "media-error__actions",
42
+ close: "media-button media-button--subtle"
43
+ };
34
44
  const Button = forwardRef(function Button({ className, ...props }, ref) {
35
45
  return /* @__PURE__ */ jsx("button", {
36
46
  ref,
37
47
  type: "button",
38
- className: cn("media-button", className),
48
+ className: cn("media-button media-button--subtle media-button--icon", className),
39
49
  ...props
40
50
  });
41
51
  });
42
52
  function PlayLabel() {
43
53
  const paused = usePlayer((s) => Boolean(s.paused));
44
- if (usePlayer((s) => Boolean(s.ended))) return /* @__PURE__ */ jsx(Fragment, { children: "Replay" });
45
- return paused ? /* @__PURE__ */ jsx(Fragment, { children: "Play" }) : /* @__PURE__ */ jsx(Fragment, { children: "Pause" });
54
+ if (usePlayer((s) => Boolean(s.ended))) return "Replay";
55
+ return paused ? "Play" : "Pause";
46
56
  }
47
57
  function VolumePopover() {
48
58
  const volumeUnsupported = usePlayer((s) => s.volumeAvailability === "unsupported");
49
- const muteButton = /* @__PURE__ */ jsx(MuteButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
50
- ...props,
51
- className: "media-button--icon media-button--mute",
59
+ const muteButton = /* @__PURE__ */ jsxs(MuteButton, {
60
+ className: "media-button--mute",
61
+ render: /* @__PURE__ */ jsx(Button, {}),
52
62
  children: [
53
63
  /* @__PURE__ */ jsx(VolumeOffIcon, { className: "media-icon media-icon--volume-off" }),
54
64
  /* @__PURE__ */ jsx(VolumeLowIcon, { className: "media-icon media-icon--volume-low" }),
55
65
  /* @__PURE__ */ jsx(VolumeHighIcon, { className: "media-icon media-icon--volume-high" })
56
66
  ]
57
- }) });
67
+ });
58
68
  if (volumeUnsupported) return muteButton;
59
69
  return /* @__PURE__ */ jsxs(PopoverRoot, {
60
70
  openOnHover: true,
@@ -80,31 +90,33 @@ function AudioSkin(props) {
80
90
  return /* @__PURE__ */ jsxs(Container, {
81
91
  className: cn("media-default-skin media-default-skin--audio", className),
82
92
  ...rest,
83
- children: [children, /* @__PURE__ */ jsx("div", {
84
- className: "media-surface media-controls",
85
- children: /* @__PURE__ */ jsxs(TooltipProvider, { children: [
86
- /* @__PURE__ */ jsxs(TooltipRoot, {
87
- side: "top",
88
- children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(PlayButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
89
- ...props,
90
- className: "media-button--icon media-button--play",
91
- children: [
92
- /* @__PURE__ */ jsx(RestartIcon, { className: "media-icon media-icon--restart" }),
93
- /* @__PURE__ */ jsx(PlayIcon, { className: "media-icon media-icon--play" }),
94
- /* @__PURE__ */ jsx(PauseIcon, { className: "media-icon media-icon--pause" })
95
- ]
96
- }) }) }), /* @__PURE__ */ jsx(TooltipPopup, {
97
- className: "media-surface media-tooltip",
98
- children: /* @__PURE__ */ jsx(PlayLabel, {})
99
- })]
100
- }),
101
- /* @__PURE__ */ jsxs(TooltipRoot, {
102
- side: "top",
103
- children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(SeekButton, {
104
- seconds: -SEEK_TIME,
105
- render: (props) => /* @__PURE__ */ jsx(Button, {
106
- ...props,
107
- className: "media-button--icon media-button--seek",
93
+ children: [
94
+ children,
95
+ /* @__PURE__ */ jsx(ErrorDialog, { classNames: ERROR_CLASSNAMES }),
96
+ /* @__PURE__ */ jsx("div", {
97
+ className: "media-surface media-controls",
98
+ children: /* @__PURE__ */ jsxs(TooltipProvider, { children: [
99
+ /* @__PURE__ */ jsxs(TooltipRoot, {
100
+ side: "top",
101
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsxs(PlayButton, {
102
+ className: "media-button--play",
103
+ render: /* @__PURE__ */ jsx(Button, {}),
104
+ children: [
105
+ /* @__PURE__ */ jsx(RestartIcon, { className: "media-icon media-icon--restart" }),
106
+ /* @__PURE__ */ jsx(PlayIcon, { className: "media-icon media-icon--play" }),
107
+ /* @__PURE__ */ jsx(PauseIcon, { className: "media-icon media-icon--pause" })
108
+ ]
109
+ }) }), /* @__PURE__ */ jsx(TooltipPopup, {
110
+ className: "media-surface media-tooltip",
111
+ children: /* @__PURE__ */ jsx(PlayLabel, {})
112
+ })]
113
+ }),
114
+ /* @__PURE__ */ jsxs(TooltipRoot, {
115
+ side: "top",
116
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(SeekButton, {
117
+ seconds: -SEEK_TIME,
118
+ className: "media-button--seek",
119
+ render: /* @__PURE__ */ jsx(Button, {}),
108
120
  children: /* @__PURE__ */ jsxs("span", {
109
121
  className: "media-icon__container",
110
122
  children: [/* @__PURE__ */ jsx(SeekIcon, { className: "media-icon media-icon--seek media-icon--flipped" }), /* @__PURE__ */ jsx("span", {
@@ -112,23 +124,21 @@ function AudioSkin(props) {
112
124
  children: SEEK_TIME
113
125
  })]
114
126
  })
115
- })
116
- }) }), /* @__PURE__ */ jsxs(TooltipPopup, {
117
- className: "media-surface media-tooltip",
118
- children: [
119
- "Seek backward ",
120
- SEEK_TIME,
121
- " seconds"
122
- ]
123
- })]
124
- }),
125
- /* @__PURE__ */ jsxs(TooltipRoot, {
126
- side: "top",
127
- children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(SeekButton, {
128
- seconds: SEEK_TIME,
129
- render: (props) => /* @__PURE__ */ jsx(Button, {
130
- ...props,
131
- className: "media-button--icon media-button--seek",
127
+ }) }), /* @__PURE__ */ jsxs(TooltipPopup, {
128
+ className: "media-surface media-tooltip",
129
+ children: [
130
+ "Seek backward ",
131
+ SEEK_TIME,
132
+ " seconds"
133
+ ]
134
+ })]
135
+ }),
136
+ /* @__PURE__ */ jsxs(TooltipRoot, {
137
+ side: "top",
138
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(SeekButton, {
139
+ seconds: SEEK_TIME,
140
+ className: "media-button--seek",
141
+ render: /* @__PURE__ */ jsx(Button, {}),
132
142
  children: /* @__PURE__ */ jsxs("span", {
133
143
  className: "media-icon__container",
134
144
  children: [/* @__PURE__ */ jsx(SeekIcon, { className: "media-icon media-icon--seek" }), /* @__PURE__ */ jsx("span", {
@@ -136,49 +146,49 @@ function AudioSkin(props) {
136
146
  children: SEEK_TIME
137
147
  })]
138
148
  })
139
- })
140
- }) }), /* @__PURE__ */ jsxs(TooltipPopup, {
141
- className: "media-surface media-tooltip",
149
+ }) }), /* @__PURE__ */ jsxs(TooltipPopup, {
150
+ className: "media-surface media-tooltip",
151
+ children: [
152
+ "Seek forward ",
153
+ SEEK_TIME,
154
+ " seconds"
155
+ ]
156
+ })]
157
+ }),
158
+ /* @__PURE__ */ jsxs(Group, {
159
+ className: "media-time",
142
160
  children: [
143
- "Seek forward ",
144
- SEEK_TIME,
145
- " seconds"
161
+ /* @__PURE__ */ jsx(Value, {
162
+ type: "current",
163
+ className: "media-time__value"
164
+ }),
165
+ /* @__PURE__ */ jsxs(TimeSliderRoot, {
166
+ className: "media-slider",
167
+ children: [/* @__PURE__ */ jsxs(SliderTrack, {
168
+ className: "media-slider__track",
169
+ children: [/* @__PURE__ */ jsx(SliderFill, { className: "media-slider__fill" }), /* @__PURE__ */ jsx(SliderBuffer, { className: "media-slider__buffer" })]
170
+ }), /* @__PURE__ */ jsx(SliderThumb, { className: "media-slider__thumb" })]
171
+ }),
172
+ /* @__PURE__ */ jsx(Value, {
173
+ type: "duration",
174
+ className: "media-time__value"
175
+ })
146
176
  ]
147
- })]
148
- }),
149
- /* @__PURE__ */ jsxs(Group, {
150
- className: "media-time",
151
- children: [
152
- /* @__PURE__ */ jsx(Value, {
153
- type: "current",
154
- className: "media-time__value"
155
- }),
156
- /* @__PURE__ */ jsxs(TimeSliderRoot, {
157
- className: "media-slider",
158
- children: [/* @__PURE__ */ jsxs(SliderTrack, {
159
- className: "media-slider__track",
160
- children: [/* @__PURE__ */ jsx(SliderFill, { className: "media-slider__fill" }), /* @__PURE__ */ jsx(SliderBuffer, { className: "media-slider__buffer" })]
161
- }), /* @__PURE__ */ jsx(SliderThumb, { className: "media-slider__thumb" })]
162
- }),
163
- /* @__PURE__ */ jsx(Value, {
164
- type: "duration",
165
- className: "media-time__value"
166
- })
167
- ]
168
- }),
169
- /* @__PURE__ */ jsxs(TooltipRoot, {
170
- side: "top",
171
- children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(PlaybackRateButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
172
- ...props,
173
- className: "media-button--icon media-button--playback-rate"
174
- }) }) }), /* @__PURE__ */ jsx(TooltipPopup, {
175
- className: "media-surface media-tooltip",
176
- children: "Toggle playback rate"
177
- })]
178
- }),
179
- /* @__PURE__ */ jsx(VolumePopover, {})
180
- ] })
181
- })]
177
+ }),
178
+ /* @__PURE__ */ jsxs(TooltipRoot, {
179
+ side: "top",
180
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: /* @__PURE__ */ jsx(PlaybackRateButton, {
181
+ className: "media-button--playback-rate",
182
+ render: /* @__PURE__ */ jsx(Button, {})
183
+ }) }), /* @__PURE__ */ jsx(TooltipPopup, {
184
+ className: "media-surface media-tooltip",
185
+ children: "Toggle playback rate"
186
+ })]
187
+ }),
188
+ /* @__PURE__ */ jsx(VolumePopover, {})
189
+ ] })
190
+ })
191
+ ]
182
192
  });
183
193
  }
184
194