@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.
- package/dist/default/media/simple-hls-video/index.js.map +1 -1
- package/dist/default/presets/audio/minimal-skin.css +161 -141
- package/dist/default/presets/audio/minimal-skin.js +110 -100
- package/dist/default/presets/audio/minimal-skin.js.map +1 -1
- package/dist/default/presets/audio/minimal-skin.tailwind.js +120 -111
- package/dist/default/presets/audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/presets/audio/skin.css +164 -132
- package/dist/default/presets/audio/skin.js +101 -91
- package/dist/default/presets/audio/skin.js.map +1 -1
- package/dist/default/presets/audio/skin.tailwind.js +111 -102
- package/dist/default/presets/audio/skin.tailwind.js.map +1 -1
- package/dist/default/presets/{video/error-dialog.js → error-dialog.js} +18 -18
- package/dist/default/presets/error-dialog.js.map +1 -0
- package/dist/default/presets/video/minimal-skin.css +224 -192
- package/dist/default/presets/video/minimal-skin.js +58 -62
- package/dist/default/presets/video/minimal-skin.js.map +1 -1
- package/dist/default/presets/video/minimal-skin.tailwind.js +70 -78
- package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/presets/video/skin.css +238 -189
- package/dist/default/presets/video/skin.js +58 -62
- package/dist/default/presets/video/skin.js.map +1 -1
- package/dist/default/presets/video/skin.tailwind.js +69 -77
- package/dist/default/presets/video/skin.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +5 -4
- package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +4 -3
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/error.js +2 -2
- package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/popup.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/seek.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +9 -4
- package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +4 -3
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +2 -2
- package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +10 -4
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
- package/dist/dev/media/simple-hls-video/index.js.map +1 -1
- package/dist/dev/presets/audio/minimal-skin.css +161 -141
- package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -1
- package/dist/dev/presets/audio/minimal-skin.js +110 -100
- package/dist/dev/presets/audio/minimal-skin.js.map +1 -1
- package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/audio/minimal-skin.tailwind.js +120 -111
- package/dist/dev/presets/audio/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/presets/audio/skin.css +164 -132
- package/dist/dev/presets/audio/skin.d.ts.map +1 -1
- package/dist/dev/presets/audio/skin.js +101 -91
- package/dist/dev/presets/audio/skin.js.map +1 -1
- package/dist/dev/presets/audio/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/audio/skin.tailwind.js +111 -102
- package/dist/dev/presets/audio/skin.tailwind.js.map +1 -1
- package/dist/dev/presets/{video/error-dialog.js → error-dialog.js} +18 -18
- package/dist/dev/presets/error-dialog.js.map +1 -0
- package/dist/dev/presets/video/minimal-skin.css +224 -192
- package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.js +58 -62
- package/dist/dev/presets/video/minimal-skin.js.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.js +70 -78
- package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/presets/video/skin.css +238 -189
- package/dist/dev/presets/video/skin.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.js +58 -62
- package/dist/dev/presets/video/skin.js.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.js +69 -77
- package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +5 -4
- package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/button.js +4 -3
- package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/error.js +2 -2
- package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
- package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +5 -3
- package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +9 -4
- package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +4 -3
- package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +2 -2
- package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
- package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +10 -4
- package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/package.json +7 -7
- package/dist/default/presets/video/error-dialog.js.map +0 -1
- 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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
/*
|
|
338
|
-
.media-default-skin .media-button--
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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:
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
|
@@ -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 {
|
|
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
|
|
45
|
-
return paused ?
|
|
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__ */
|
|
50
|
-
|
|
51
|
-
|
|
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: [
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
children: [
|
|
92
|
-
|
|
93
|
-
/* @__PURE__ */ jsx(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
]
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
className: "media-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
|