@m4l/gclick 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts +2 -2
  2. package/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts.map +1 -1
  3. package/components/CameraStream/defaults/DefaultPhaseStreaming.js +23 -21
  4. package/components/CameraStream/types.d.ts +9 -0
  5. package/components/CameraStream/types.d.ts.map +1 -1
  6. package/components/VideoPlayer/VideoPlayer.d.ts +4 -1
  7. package/components/VideoPlayer/VideoPlayer.d.ts.map +1 -1
  8. package/components/VideoPlayer/VideoPlayer.js +28 -25
  9. package/components/VideoPlayer/VideoPlayer.styles.d.ts +7 -1
  10. package/components/VideoPlayer/VideoPlayer.styles.d.ts.map +1 -1
  11. package/components/VideoPlayer/VideoPlayer.styles.js +72 -10
  12. package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts +8 -0
  13. package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts.map +1 -0
  14. package/components/VideoPlayer/{VideojsSkin.styles.js → VideojsDefaultSkin.styles.js} +478 -248
  15. package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts +8 -0
  16. package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts.map +1 -0
  17. package/components/VideoPlayer/VideojsMinimalSkin.styles.js +1561 -0
  18. package/components/VideoPlayer/constants.d.ts +33 -0
  19. package/components/VideoPlayer/constants.d.ts.map +1 -1
  20. package/components/VideoPlayer/constants.js +20 -4
  21. package/components/VideoPlayer/hlsConfig.d.ts +21 -11
  22. package/components/VideoPlayer/hlsConfig.d.ts.map +1 -1
  23. package/components/VideoPlayer/hlsConfig.js +28 -21
  24. package/components/VideoPlayer/index.d.ts +2 -2
  25. package/components/VideoPlayer/index.d.ts.map +1 -1
  26. package/components/VideoPlayer/player.factory.d.ts +3 -3
  27. package/components/VideoPlayer/player.factory.d.ts.map +1 -1
  28. package/components/VideoPlayer/slots/VideoPlayerSlots.d.ts +1 -1
  29. package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts +5 -2
  30. package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts.map +1 -1
  31. package/components/VideoPlayer/subcomponents/GclickVideoSkin.js +34 -178
  32. package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts +4 -3
  33. package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts.map +1 -1
  34. package/components/VideoPlayer/subcomponents/VideoPlayerStage.js +43 -42
  35. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts +6 -0
  36. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts.map +1 -0
  37. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.js +87 -0
  38. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts +9 -0
  39. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts.map +1 -0
  40. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.js +17 -0
  41. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts +11 -0
  42. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts.map +1 -0
  43. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.js +19 -0
  44. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts +9 -0
  45. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts.map +1 -0
  46. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.js +48 -0
  47. package/components/VideoPlayer/subcomponents/skin/primitives.d.ts +81 -0
  48. package/components/VideoPlayer/subcomponents/skin/primitives.d.ts.map +1 -0
  49. package/components/VideoPlayer/subcomponents/skin/primitives.js +142 -0
  50. package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts +19 -0
  51. package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts.map +1 -0
  52. package/components/VideoPlayer/subcomponents/skin/skinVariant.js +23 -0
  53. package/components/VideoPlayer/types.d.ts +25 -6
  54. package/components/VideoPlayer/types.d.ts.map +1 -1
  55. package/index.js +123 -122
  56. package/package.json +4 -4
  57. package/components/VideoPlayer/VideojsSkin.styles.d.ts +0 -9
  58. package/components/VideoPlayer/VideojsSkin.styles.d.ts.map +0 -1
@@ -32,14 +32,14 @@ const t = (e) => ({
32
32
  "--media-current-shadow-color": "oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15))",
33
33
  "--media-current-shadow-color-subtle": "oklch(from var(--media-current-shadow-color) l c h / calc(alpha * 0.4))",
34
34
  "--media-icon-size": "18px",
35
+ "--media-color-scrollbar-thumb": "oklch(from currentColor l c h / 0.3)",
35
36
  position: "relative",
36
37
  display: "block",
37
38
  width: "100%",
38
39
  height: "100%",
39
40
  container: "media-root / inline-size",
40
- // Themed (vendor value: `Inter Variable, Inter, ui-sans-serif, system-ui,
41
- // sans-serif`) — the chrome follows the platform font instead of shipping
42
- // the vendor's stack.
41
+ // Themed deviation (vendor value: `Inter Variable, Inter, ui-sans-serif, system-ui, sans-serif`) —
42
+ // the chrome follows the platform font instead of the vendor stack.
43
43
  fontFamily: e.typography.fontFamily,
44
44
  fontSize: "0.8125rem",
45
45
  /* 13px at 100% font size */
@@ -49,6 +49,8 @@ const t = (e) => ({
49
49
  letterSpacing: "normal",
50
50
  outline: "2px solid transparent",
51
51
  outlineOffset: "-4px",
52
+ scrollbarColor: "var(--media-color-scrollbar-thumb) transparent",
53
+ scrollbarWidth: "thin",
52
54
  borderRadius: "var(--media-border-radius, 2rem)",
53
55
  isolation: "isolate",
54
56
  transitionTimingFunction: "ease-out",
@@ -57,6 +59,14 @@ const t = (e) => ({
57
59
  "&:focus-visible": {
58
60
  outlineColor: "currentColor",
59
61
  outlineOffset: "2px"
62
+ },
63
+ "&::-webkit-scrollbar-thumb": {
64
+ background: "var(--media-color-scrollbar-thumb)",
65
+ borderRadius: "9999px"
66
+ },
67
+ "@media (prefers-reduced-transparency: reduce) or (prefers-contrast: more)": {
68
+ "--media-color-scrollbar-thumb": "oklch(from currentColor l c h / 0.8)",
69
+ scrollbarWidth: "auto"
60
70
  }
61
71
  },
62
72
  /*
@@ -88,9 +98,8 @@ const t = (e) => ({
88
98
  display: "block",
89
99
  width: "100%",
90
100
  height: "100%",
91
- // Double cast: csstype narrows `objectFit` to keywords and rejects the
92
- // vendor's `var()` expression (a kebab-case key would trip Emotion's
93
- // dev-mode warning instead). Serializes identically.
101
+ // Double cast: csstype narrows this property to keywords and rejects the
102
+ // vendor's `var()` expression. Serializes identically.
94
103
  objectFit: "var(--media-object-fit, contain)",
95
104
  objectPosition: "var(--media-object-position, center)"
96
105
  },
@@ -112,7 +121,7 @@ const t = (e) => ({
112
121
  position: "absolute",
113
122
  inset: "0",
114
123
  pointerEvents: "none",
115
- backgroundImage: "linear-gradient(to top, oklch(0 0 0 / 0.5), oklch(0 0 0 / 0.3), oklch(0 0 0 / 0))",
124
+ backgroundImage: "linear-gradient(to top, oklch(0 0 0 / 0.5), oklch(0 0 0 / 0.3) 25%, oklch(0 0 0 / 0))",
116
125
  borderRadius: "inherit",
117
126
  opacity: "0",
118
127
  backdropFilter: "blur(0) saturate(1)",
@@ -127,6 +136,11 @@ const t = (e) => ({
127
136
  ".media-default-skin .media-controls[data-visible] ~ .media-overlay, .media-default-skin .media-error[data-open] ~ .media-overlay": {
128
137
  opacity: "1"
129
138
  },
139
+ ".media-default-skin .media-buffering-indicator[data-visible] ~ .media-overlay": {
140
+ background: "oklch(0 0 0 / 0.35)",
141
+ opacity: "1",
142
+ backdropFilter: "blur(8px)"
143
+ },
130
144
  ".media-default-skin .media-error[data-open] ~ .media-overlay": {
131
145
  backdropFilter: "blur(16px) saturate(1.5)"
132
146
  },
@@ -138,20 +152,16 @@ const t = (e) => ({
138
152
  ".media-default-skin .media-buffering-indicator": {
139
153
  position: "absolute",
140
154
  inset: "0",
155
+ zIndex: "10",
141
156
  display: "none",
142
- alignItems: "center",
143
- justifyContent: "center",
157
+ placeContent: "center",
144
158
  color: "oklch(1 0 0)",
145
159
  pointerEvents: "none",
146
160
  "&:not([data-visible])": {
147
161
  "--media-spinner-animation": "none"
148
162
  },
149
163
  "&[data-visible]": {
150
- display: "flex"
151
- },
152
- ".media-surface": {
153
- padding: "0.25rem",
154
- borderRadius: "100%"
164
+ display: "grid"
155
165
  }
156
166
  },
157
167
  /*
@@ -213,6 +223,19 @@ const t = (e) => ({
213
223
  ".media-default-skin .media-time": {
214
224
  fontVariantNumeric: "tabular-nums"
215
225
  },
226
+ '.media-default-skin .media-time[role="button"]': {
227
+ cursor: "pointer",
228
+ outline: "2px solid transparent",
229
+ outlineOffset: "-2px",
230
+ borderRadius: "0.25rem",
231
+ transitionTimingFunction: "ease-out",
232
+ transitionDuration: "100ms",
233
+ transitionProperty: "outline-color, outline-offset",
234
+ "&:focus-visible": {
235
+ outlineColor: "currentColor",
236
+ outlineOffset: "2px"
237
+ }
238
+ },
216
239
  /*
217
240
  * ==========================================================================
218
241
  * Buttons
@@ -281,6 +304,9 @@ const t = (e) => ({
281
304
  "&:active": {
282
305
  scale: "0.9"
283
306
  },
307
+ "& .media-icon__container": {
308
+ display: "grid"
309
+ },
284
310
  "& .media-icon": {
285
311
  gridArea: "1 / 1",
286
312
  transitionBehavior: "allow-discrete",
@@ -297,8 +323,9 @@ const t = (e) => ({
297
323
  right: "-1px",
298
324
  bottom: "-3px",
299
325
  fontSize: "10px",
300
- fontWeight: "480",
301
- fontVariantNumeric: "tabular-nums"
326
+ fontWeight: "500",
327
+ fontVariantNumeric: "tabular-nums",
328
+ letterSpacing: "-0.05em"
302
329
  },
303
330
  "&:has(.media-icon--flipped) .media-icon__label": {
304
331
  right: "unset",
@@ -317,6 +344,22 @@ const t = (e) => ({
317
344
  content: "none"
318
345
  }
319
346
  },
347
+ /* Settings button */
348
+ ".media-default-skin .media-button--settings": {
349
+ display: "none",
350
+ "& .media-icon--settings": {
351
+ transition: "transform 150ms ease-in-out",
352
+ "@media (prefers-reduced-motion: reduce)": {
353
+ transitionDuration: "0ms"
354
+ }
355
+ },
356
+ '&[aria-expanded="true"] .media-icon--settings': {
357
+ transform: "rotate(90deg)"
358
+ }
359
+ },
360
+ '.media-default-skin .media-button-group:has([data-availability="available"]) .media-button--settings': {
361
+ display: "grid"
362
+ },
320
363
  /*
321
364
  * Live button — wide pill button with a status dot (gray → red at the live
322
365
  * edge) rendered via ::before, and "LIVE" text rendered as the button's own
@@ -361,6 +404,21 @@ const t = (e) => ({
361
404
  gap: "0.125rem"
362
405
  }
363
406
  },
407
+ /*
408
+ * ==========================================================================
409
+ * Badge
410
+ * ==========================================================================
411
+ */
412
+ ".media-default-skin .media-badge": {
413
+ padding: "0.125rem 0.375rem",
414
+ fontSize: "0.6875rem",
415
+ fontWeight: "500",
416
+ lineHeight: "1",
417
+ color: "oklch(from currentColor l c h / 0.85)",
418
+ whiteSpace: "nowrap",
419
+ backgroundColor: "oklch(from currentColor l c h / 0.1)",
420
+ borderRadius: "calc(infinity * 1px)"
421
+ },
364
422
  /*
365
423
  * ==========================================================================
366
424
  * Icons
@@ -377,88 +435,6 @@ const t = (e) => ({
377
435
  ".media-default-skin .media-icon--flipped": {
378
436
  scale: "-1 1"
379
437
  },
380
- /*
381
- * ==========================================================================
382
- * Menus
383
- * Note: Menus use `.media-popover` styles for positioning and transitions.
384
- * ==========================================================================
385
- */
386
- ".media-default-skin .media-popover.media-menu": {
387
- boxSizing: "border-box",
388
- minWidth: "min(6rem, var(--media-popover-available-width, 6rem))",
389
- maxWidth: "var(--media-popover-available-width, none)",
390
- maxHeight: "var(--media-popover-available-height, none)",
391
- padding: "0.375rem",
392
- overflow: "auto",
393
- overscrollBehavior: "none",
394
- borderRadius: "1.25rem",
395
- "&::before": {
396
- display: "none"
397
- }
398
- },
399
- ".media-default-skin .media-popover.media-menu .media-menu__group": {
400
- position: "relative",
401
- display: "flex",
402
- flexDirection: "column",
403
- gap: "0.125rem",
404
- "&::before": {
405
- position: "absolute",
406
- positionAnchor: "--media-menu-item-highlight-anchor",
407
- inset: "anchor(inside)",
408
- pointerEvents: "none",
409
- content: '""',
410
- backgroundColor: "oklch(from currentColor l c h / 0.1)",
411
- borderRadius: "calc(infinity * 1px)",
412
- transition: "inset ease-in-out 100ms"
413
- },
414
- "@supports not (top: anchor(top))": {
415
- "&::before": {
416
- display: "none"
417
- }
418
- }
419
- },
420
- ".media-default-skin .media-popover.media-menu .media-menu__item": {
421
- display: "flex",
422
- gap: "0.5rem",
423
- alignItems: "center",
424
- justifyContent: "space-between",
425
- minHeight: "2rem",
426
- padding: "0 0.75rem",
427
- fontVariantNumeric: "tabular-nums",
428
- color: "inherit",
429
- cursor: "pointer",
430
- outline: "2px solid transparent",
431
- outlineOffset: "-2px",
432
- borderRadius: "calc(infinity * 1px)",
433
- "&:hover, &[data-highlighted]": {
434
- anchorName: "--media-menu-item-highlight-anchor"
435
- },
436
- "@supports not (top: anchor(top))": {
437
- "&:hover, &[data-highlighted]": {
438
- backgroundColor: "oklch(from currentColor l c h / 0.1)"
439
- }
440
- },
441
- "&:focus-visible": {
442
- outlineColor: "currentColor",
443
- outlineOffset: "2px"
444
- },
445
- '&[aria-checked="true"] .media-menu__indicator': {
446
- opacity: "1"
447
- },
448
- '&[aria-disabled="true"]': {
449
- pointerEvents: "none",
450
- cursor: "not-allowed",
451
- opacity: "0.5"
452
- }
453
- },
454
- ".media-default-skin .media-popover.media-menu .media-menu__indicator": {
455
- flexShrink: "0",
456
- marginRight: "-0.25rem",
457
- opacity: "0"
458
- },
459
- ".media-default-skin .media-popover.media-menu .media-menu__indicator .media-icon": {
460
- filter: "drop-shadow(0 1px 0 var(--media-current-shadow-color))"
461
- },
462
438
  /*
463
439
  * ==========================================================================
464
440
  * Poster Image
@@ -472,7 +448,7 @@ const t = (e) => ({
472
448
  pointerEvents: "none",
473
449
  transition: "opacity 0.25s"
474
450
  },
475
- ".media-default-skin media-poster:not([data-visible]), .media-default-skin > img:not([data-visible])": {
451
+ ".media-default-skin media-poster:not([data-visible]), .media-default-skin > img:not([data-visible]), .media-default-skin > img[data-visible]:not([data-loaded])": {
476
452
  opacity: "0"
477
453
  },
478
454
  ".media-default-skin media-poster ::slotted(img), .media-default-skin media-poster img": {
@@ -480,34 +456,53 @@ const t = (e) => ({
480
456
  inset: "0",
481
457
  width: "100%",
482
458
  height: "100%",
483
- // Double cast: csstype narrows `objectFit` to keywords and rejects the
484
- // vendor's `var()` expression (a kebab-case key would trip Emotion's
485
- // dev-mode warning instead). Serializes identically.
459
+ // Double cast: csstype narrows this property to keywords and rejects the
460
+ // vendor's `var()` expression. Serializes identically.
486
461
  objectFit: "var(--media-object-fit, contain)",
487
462
  objectPosition: "var(--media-object-position, center)",
488
463
  borderRadius: "var(--media-video-border-radius)"
489
464
  },
490
465
  ".media-default-skin > img": {
491
- // Double cast: csstype narrows `objectFit` to keywords and rejects the
492
- // vendor's `var()` expression (a kebab-case key would trip Emotion's
493
- // dev-mode warning instead). Serializes identically.
466
+ // Double cast: csstype narrows this property to keywords and rejects the
467
+ // vendor's `var()` expression. Serializes identically.
494
468
  objectFit: "var(--media-object-fit, contain)",
495
469
  objectPosition: "var(--media-object-position, center)",
496
470
  borderRadius: "inherit"
497
471
  },
472
+ /* Blurred placeholder: HTML path targets media-poster::before, React path targets the skin container::before */
473
+ ".media-default-skin media-poster::before, .media-default-skin::before": {
474
+ position: "absolute",
475
+ inset: "0",
476
+ pointerEvents: "none",
477
+ content: '""',
478
+ backgroundImage: "var(--media-poster-placeholder, none)",
479
+ backgroundRepeat: "no-repeat",
480
+ backgroundPosition: "var(--media-object-position, center)",
481
+ backgroundSize: "var(--media-object-fit, contain)",
482
+ filter: "blur(var(--media-poster-placeholder-blur, 20px))"
483
+ },
484
+ /* React path: hidden by default, transitions in while poster loads */
485
+ ".media-default-skin::before": {
486
+ opacity: "0",
487
+ transition: "opacity 0.25s"
488
+ },
489
+ /* Show placeholder while the poster is visible but not yet loaded */
490
+ ".media-default-skin:has(img[data-visible]:not([data-loaded]))::before": {
491
+ opacity: "1"
492
+ },
498
493
  ".media-default-skin:fullscreen media-poster ::slotted(img), .media-default-skin:fullscreen media-poster img, .media-default-skin:fullscreen > img": {
499
494
  objectFit: "contain"
500
495
  },
501
496
  /*
502
497
  * ==========================================================================
503
- * Media preview
498
+ * Media thumbnail
504
499
  * ==========================================================================
505
500
  */
506
- ".media-default-skin .media-preview": {
501
+ ".media-default-skin .media-thumbnail": {
507
502
  pointerEvents: "none",
508
503
  backgroundColor: "oklch(0 0 0 / 0.9)",
509
504
  borderRadius: "0.75rem",
510
- "& .media-preview__thumbnail": {
505
+ "& .media-thumbnail__image": {
511
506
  position: "relative",
512
507
  display: "block",
513
508
  overflow: "clip",
@@ -520,35 +515,32 @@ const t = (e) => ({
520
515
  borderRadius: "inherit"
521
516
  }
522
517
  },
523
- "& .media-preview__time": {
518
+ "& .media-thumbnail__time": {
524
519
  position: "absolute",
525
520
  insetInline: "0",
526
521
  bottom: "0.5rem",
527
522
  textAlign: "center"
528
523
  },
529
- "& .media-overlay": {
530
- opacity: "1"
531
- },
532
- "& .media-preview__spinner": {
524
+ "& .media-thumbnail__spinner": {
533
525
  position: "absolute",
534
526
  top: "50%",
535
527
  left: "50%",
536
528
  opacity: "0",
537
529
  translate: "-50% -50%"
538
530
  },
539
- "& .media-preview__thumbnail, & .media-preview__spinner": {
531
+ "& .media-thumbnail__image, & .media-thumbnail__spinner": {
540
532
  transition: "opacity 150ms ease-out"
541
533
  },
542
- "&:not(:has(.media-preview__thumbnail[data-loading]))": {
543
- "& .media-preview__spinner": {
534
+ "&:not(:has(.media-thumbnail__image[data-loading]))": {
535
+ "& .media-thumbnail__spinner": {
544
536
  "--media-spinner-animation": "none"
545
537
  }
546
538
  },
547
- "&:has(.media-preview__thumbnail[data-loading])": {
548
- "& .media-preview__thumbnail": {
539
+ "&:has(.media-thumbnail__image[data-loading])": {
540
+ "& .media-thumbnail__image": {
549
541
  opacity: "0"
550
542
  },
551
- "& .media-preview__spinner": {
543
+ "& .media-thumbnail__spinner": {
552
544
  opacity: "1"
553
545
  }
554
546
  }
@@ -604,7 +596,7 @@ const t = (e) => ({
604
596
  outlineOffset: "-4px",
605
597
  backgroundColor: "currentColor",
606
598
  borderRadius: "calc(infinity * 1px)",
607
- boxShadow: "0 0 0 1px var(--media-current-shadow-color-subtle, oklch(0 0 0 / 0.1)), 0 1px 3px 0 oklch(0 0 0 / 0.15), 0 1px 2px -1px oklch(0 0 0 / 0.15)",
599
+ boxShadow: "0 0 0 1px var(--media-current-shadow-color, oklch(0 0 0 / 0.1)), 0 1px 3px 0 oklch(0 0 0 / 0.35), 0 1px 2px -1px oklch(0 0 0 / 0.35)",
608
600
  opacity: "0",
609
601
  translate: "-50% -50%",
610
602
  transitionTimingFunction: "ease-out",
@@ -619,7 +611,7 @@ const t = (e) => ({
619
611
  left: "50%"
620
612
  },
621
613
  "&:hover, &:focus": {
622
- outlineColor: "oklch(from currentColor l c h / 0.25)",
614
+ outlineColor: "oklch(from currentColor l c h / 0.15)",
623
615
  outlineOffset: "0"
624
616
  },
625
617
  "&::after": {
@@ -627,7 +619,7 @@ const t = (e) => ({
627
619
  inset: "-4px",
628
620
  content: '""',
629
621
  borderRadius: "inherit",
630
- boxShadow: "0 0 0 2px oklch(1 0 0)",
622
+ boxShadow: "0 0 0 2px currentColor",
631
623
  transitionTimingFunction: "ease-out",
632
624
  transitionDuration: "150ms",
633
625
  transitionProperty: "opacity, scale"
@@ -644,6 +636,41 @@ const t = (e) => ({
644
636
  ".media-default-skin .media-slider:hover .media-slider__thumb, .media-default-skin .media-slider__thumb:focus-visible, .media-default-skin .media-slider__thumb--persistent": {
645
637
  opacity: "1"
646
638
  },
639
+ /* Preview */
640
+ ".media-default-skin .media-slider__preview": {
641
+ "& .media-slider__value, &::before": {
642
+ opacity: "0",
643
+ scale: "0.5",
644
+ transitionTimingFunction: "ease-out",
645
+ transitionDuration: "200ms",
646
+ transitionProperty: "opacity, scale"
647
+ },
648
+ "& .media-slider__value": {
649
+ position: "absolute",
650
+ bottom: "2.25rem",
651
+ textShadow: "0 1px 0 var(--media-current-shadow-color)",
652
+ filter: "blur(8px)",
653
+ translate: "-50% 0.5rem",
654
+ transitionProperty: "filter, opacity, scale, translate"
655
+ },
656
+ "&::before": {
657
+ display: "block",
658
+ minWidth: "0.25rem",
659
+ height: "0.25rem",
660
+ content: '""',
661
+ backgroundColor: "currentColor",
662
+ borderRadius: "100%",
663
+ boxShadow: "0 0 0 1px var(--media-current-shadow-color, oklch(0 0 0 / 0.15)), 0 1px 2px 0 oklch(0 0 0 / 0.35)"
664
+ },
665
+ "&[data-pointing] .media-slider__value, &[data-pointing]:not([data-dragging])::before": {
666
+ opacity: "1",
667
+ scale: "1"
668
+ },
669
+ "&[data-pointing] .media-slider__value": {
670
+ filter: "blur(0)",
671
+ translate: "-50% 0"
672
+ }
673
+ },
647
674
  /* Shared track fills */
648
675
  ".media-default-skin .media-slider__buffer, .media-default-skin .media-slider__fill": {
649
676
  position: "absolute",
@@ -700,33 +727,42 @@ const t = (e) => ({
700
727
  * Popups & Tooltips
701
728
  * ==========================================================================
702
729
  */
730
+ ".media-default-skin ": {
731
+ "--media-popup-transition": "opacity var(--media-popup-transition-timing-function) var(--media-popup-transition-duration), filter var(--media-popup-transition-timing-function) var(--media-popup-transition-duration), transform var(--media-popup-transition-timing-function) var(--media-popup-transition-duration), scale var(--media-popup-transition-timing-function) var(--media-popup-transition-duration)"
732
+ },
703
733
  ".media-default-skin .media-popover, .media-default-skin .media-tooltip": {
734
+ "--popup-translate-distance": "0.5rem",
704
735
  margin: "0",
705
736
  overflow: "visible",
706
737
  color: "inherit",
707
738
  border: "0",
708
- filter: "blur(0px)",
709
- transitionTimingFunction: "var(--media-popup-transition-timing-function)",
710
- transitionDuration: "var(--media-popup-transition-duration)",
711
- transitionProperty: "scale, opacity, filter",
739
+ transition: "var(--media-popup-transition)",
712
740
  "&[data-starting-style], &[data-ending-style]": {
713
741
  opacity: "0",
714
- filter: "blur(8px)",
715
- scale: "0.85"
742
+ filter: "blur(4px)",
743
+ /* We have to use transform here for translate as the translate property is used for positioning by core. */
744
+ transform: "translate(var(--popup-translate-x-distance, 0), var(--popup-translate-y-distance, 0))",
745
+ scale: "0.95"
716
746
  },
717
- "&[data-instant]": {
718
- transitionDuration: "0ms"
747
+ "&[data-ending-style]": {
748
+ transform: "none",
749
+ /* Speed up the exit transition. */
750
+ transitionDuration: "max(0ms, calc(var(--media-popup-transition-duration) - 50ms))"
719
751
  },
720
752
  '&[data-side="top"]': {
753
+ "--popup-translate-y-distance": "var(--popup-translate-distance)",
721
754
  transformOrigin: "bottom"
722
755
  },
723
756
  '&[data-side="bottom"]': {
757
+ "--popup-translate-y-distance": "calc(var(--popup-translate-distance) * -1)",
724
758
  transformOrigin: "top"
725
759
  },
726
760
  '&[data-side="left"]': {
761
+ "--popup-translate-x-distance": "var(--popup-translate-distance)",
727
762
  transformOrigin: "right"
728
763
  },
729
764
  '&[data-side="right"]': {
765
+ "--popup-translate-x-distance": "calc(var(--popup-translate-distance) * -1)",
730
766
  transformOrigin: "left"
731
767
  },
732
768
  /* Safe area between trigger and popup */
@@ -776,11 +812,218 @@ const t = (e) => ({
776
812
  fontSize: "0.75rem",
777
813
  whiteSpace: "nowrap",
778
814
  borderRadius: "calc(infinity * 1px)",
815
+ /* `display: flex` must not apply while closed — it overrides UA `[popover]` hiding. */
816
+ "&[data-open]": {
817
+ display: "flex",
818
+ columnGap: "0.25rem",
819
+ alignItems: "center"
820
+ },
779
821
  '&[data-side="top"]::before, &[data-side="bottom"]::before': {
780
822
  height: "var(--media-tooltip-side-offset)"
781
823
  },
782
824
  '&[data-side="left"]::before, &[data-side="right"]::before': {
783
825
  width: "var(--media-tooltip-side-offset)"
826
+ },
827
+ "& .media-tooltip__kbd": {
828
+ minWidth: "1.5em",
829
+ padding: "0.1em",
830
+ fontFamily: "inherit",
831
+ fontSize: "90%",
832
+ fontWeight: "600",
833
+ lineHeight: "1.25",
834
+ textAlign: "center",
835
+ backgroundColor: "oklch(from currentColor l c h / 0.3)",
836
+ borderRadius: "0.25rem"
837
+ }
838
+ },
839
+ /*
840
+ * ==========================================================================
841
+ * Menus
842
+ * Note: Menus use `.media-popover` styles for positioning and transitions.
843
+ * ==========================================================================
844
+ */
845
+ ".media-default-skin .media-menu": {
846
+ "--menu-transition-duration": "250ms",
847
+ "--menu-max-height": "14rem",
848
+ "--menu-padding": "0.25rem",
849
+ "--menu-border-radius": "0.75rem",
850
+ "--menu-item-border-radius": "calc(var(--menu-border-radius) - var(--menu-padding))",
851
+ boxSizing: "border-box",
852
+ maxWidth: "var(--media-popover-available-width, none)",
853
+ maxHeight: "min(var(--media-popover-available-height, var(--menu-max-height)), var(--menu-max-height))",
854
+ padding: "var(--menu-padding)",
855
+ overflow: "auto",
856
+ overscrollBehavior: "none",
857
+ borderRadius: "var(--menu-border-radius)",
858
+ "@media (prefers-reduced-motion: reduce)": {
859
+ "--menu-transition-duration": "0ms"
860
+ },
861
+ "& .media-menu__panel": {
862
+ position: "absolute",
863
+ inset: "0",
864
+ padding: "var(--menu-padding)",
865
+ overflow: "auto",
866
+ overscrollBehavior: "none",
867
+ outline: "none",
868
+ translate: "0 0",
869
+ transitionTimingFunction: "ease-in-out",
870
+ transitionDuration: "var(--menu-transition-duration)",
871
+ transitionProperty: "translate, filter",
872
+ willChange: "translate, filter",
873
+ "&[data-starting-style], &[data-ending-style]": {
874
+ overflow: "hidden"
875
+ },
876
+ /* Root settings view — slides out when a submenu is active */
877
+ '&[data-menu-root-view][data-menu-view-state="inactive"]': {
878
+ filter: "blur(8px)",
879
+ translate: "-100% 0",
880
+ /* Hide the indicator while transitioning */
881
+ "& .media-menu__group::before": {
882
+ display: "none"
883
+ }
884
+ },
885
+ /* Submenu panels — slide in/out alongside the root view */
886
+ "&[data-submenu]": {
887
+ zIndex: "10",
888
+ "&:not([data-open], [data-ending-style])": {
889
+ translate: "-100% 0",
890
+ transitionProperty: "none"
891
+ },
892
+ "&[data-starting-style], &[data-ending-style]": {
893
+ pointerEvents: "none",
894
+ filter: "blur(8px)"
895
+ },
896
+ '&[data-starting-style][data-direction="forward"], &[data-ending-style][data-direction="back"]': {
897
+ translate: "100% 0"
898
+ },
899
+ '&[data-ending-style][data-direction="forward"], &[data-starting-style][data-direction="back"]': {
900
+ translate: "-100% 0"
901
+ }
902
+ }
903
+ },
904
+ "& .media-menu__separator": {
905
+ marginBlock: "0.25rem",
906
+ borderBottom: "1px solid oklch(0 0 0 / 0.1)",
907
+ boxShadow: "0 1px 0 0 oklch(1 0 0 / 0.075)"
908
+ },
909
+ "& .media-menu__group": {
910
+ display: "flex",
911
+ flexDirection: "column",
912
+ gap: "0.125rem",
913
+ "@supports (top: anchor(top))": {
914
+ "&::before": {
915
+ position: "absolute",
916
+ positionAnchor: "--media-menu-item-highlight-anchor",
917
+ inset: "anchor(inside)",
918
+ pointerEvents: "none",
919
+ content: '""',
920
+ backgroundColor: "oklch(from currentColor l c h / 0.1)",
921
+ borderRadius: "var(--menu-item-border-radius)",
922
+ transition: "inset ease-in-out 100ms"
923
+ }
924
+ }
925
+ },
926
+ "& .media-menu__item, & .media-menu__back": {
927
+ display: "flex",
928
+ gap: "0.375rem",
929
+ alignItems: "center",
930
+ padding: "0.375rem 0.5rem",
931
+ textAlign: "left",
932
+ textShadow: "0 1px 0 var(--media-current-shadow-color)",
933
+ cursor: "pointer",
934
+ userSelect: "none",
935
+ outline: "2px solid transparent",
936
+ outlineOffset: "-2px",
937
+ borderRadius: "var(--menu-item-border-radius)",
938
+ transition: "background-color, color",
939
+ transitionTimingFunction: "ease-out",
940
+ transitionDuration: "100ms",
941
+ "&:focus-visible": {
942
+ outlineColor: "currentColor",
943
+ outlineOffset: "2px"
944
+ },
945
+ "&:hover, &[data-highlighted]": {
946
+ backgroundColor: "oklch(from currentColor l c h / 0.1)",
947
+ "@supports (top: anchor(top))": {
948
+ anchorName: "--media-menu-item-highlight-anchor",
949
+ backgroundColor: "transparent"
950
+ }
951
+ },
952
+ "& .media-icon": {
953
+ flexShrink: "0",
954
+ color: "oklch(from currentColor l c h / 0.65)",
955
+ filter: "drop-shadow(0 1px 0 var(--media-current-shadow-color))"
956
+ }
957
+ },
958
+ "& .media-menu__indicator": {
959
+ flexShrink: "0",
960
+ marginRight: "-0.25rem",
961
+ marginLeft: "auto",
962
+ opacity: "0",
963
+ "& .media-icon": {
964
+ filter: "drop-shadow(0 1px 0 var(--media-current-shadow-color))"
965
+ }
966
+ },
967
+ "& .media-menu__item": {
968
+ justifyContent: "space-between",
969
+ fontVariantNumeric: "tabular-nums",
970
+ color: "inherit",
971
+ '&[aria-disabled="true"]': {
972
+ pointerEvents: "none",
973
+ cursor: "not-allowed",
974
+ opacity: "0.5"
975
+ },
976
+ '&[aria-checked="true"] .media-menu__indicator': {
977
+ opacity: "1"
978
+ },
979
+ '&[data-availability="unavailable"], &[data-availability="unsupported"]': {
980
+ display: "none"
981
+ }
982
+ },
983
+ "& .media-menu__tier": {
984
+ paddingTop: "1px",
985
+ paddingLeft: "0.125rem",
986
+ fontSize: "0.5625rem",
987
+ fontWeight: "600",
988
+ lineHeight: "1",
989
+ color: "oklch(from currentColor l c h / 0.7)"
990
+ },
991
+ "& .media-menu__back": {
992
+ width: "100%",
993
+ marginBottom: "0.125rem"
994
+ },
995
+ "& .media-menu__hint": {
996
+ display: "inline-flex",
997
+ gap: "0.25rem",
998
+ alignItems: "center",
999
+ minWidth: "0",
1000
+ paddingLeft: "0.5rem",
1001
+ marginLeft: "auto",
1002
+ fontSize: "0.75rem",
1003
+ color: "oklch(from currentColor l c h / 0.65)"
1004
+ },
1005
+ "& .media-menu__hint-label": {
1006
+ maxWidth: "6rem",
1007
+ overflow: "hidden",
1008
+ textOverflow: "ellipsis",
1009
+ whiteSpace: "nowrap"
1010
+ },
1011
+ "& .media-menu__chevron": {
1012
+ width: "0.875rem",
1013
+ height: "0.875rem"
1014
+ },
1015
+ /* Settings menu */
1016
+ "&.media-menu--settings": {
1017
+ width: "var(--media-menu-width)",
1018
+ minWidth: "12rem",
1019
+ height: "var(--media-menu-height)",
1020
+ overflow: "hidden",
1021
+ /* Add height and width transitions. */
1022
+ transition: "var(--media-popup-transition), height var(--media-popup-transition-timing-function) var(--menu-transition-duration), width var(--media-popup-transition-timing-function) var(--menu-transition-duration)",
1023
+ /* Don't transition width and height on open/close. */
1024
+ "&[data-starting-style], &[data-ending-style]": {
1025
+ transition: "var(--media-popup-transition)"
1026
+ }
784
1027
  }
785
1028
  },
786
1029
  /*
@@ -788,9 +1031,7 @@ const t = (e) => ({
788
1031
  * Native Caption Track
789
1032
  * ==========================================================================
790
1033
  */
791
- // Selector repeated by the vendor stylesheet at this level — the key carries a
792
- // trailing space so it stays a distinct JS object key (serializes to the same CSS).
793
- ".media-default-skin ": {
1034
+ ".media-default-skin ": {
794
1035
  "--media-caption-track-duration": "var(--media-controls-transition-duration)",
795
1036
  "--media-caption-track-delay": "25ms",
796
1037
  "--media-caption-track-y": "-0.5rem",
@@ -897,96 +1138,97 @@ const t = (e) => ({
897
1138
  backgroundImage: "linear-gradient( to right, currentColor 0%, currentColor var(--media-progress-fill), transparent var(--media-progress-fill), transparent 100% )",
898
1139
  borderRadius: "inherit",
899
1140
  transition: "--media-progress-fill 200ms linear"
1141
+ },
1142
+ '&[data-level="high"] .media-icon--volume-high, &[data-level="low"] .media-icon--volume-low, &[data-level="off"] .media-icon--volume-off': {
1143
+ display: "block"
1144
+ },
1145
+ "@media (prefers-reduced-motion: no-preference)": {
1146
+ "&[data-min], &[data-max]": {
1147
+ animation: "media-shake 300ms ease-in-out"
1148
+ }
900
1149
  }
901
1150
  },
902
- '.media-default-skin .media-input-feedback-island--volume[data-level="high"] .media-icon--volume-high, .media-default-skin .media-input-feedback-island--volume[data-level="low"] .media-icon--volume-low, .media-default-skin .media-input-feedback-island--volume[data-level="off"] .media-icon--volume-off': {
903
- display: "block"
904
- },
905
- '.media-default-skin .media-input-feedback-island--status[data-status="captions-on"] .media-icon--captions-on, .media-default-skin .media-input-feedback-island--status[data-status="captions-off"] .media-icon--captions-off, .media-default-skin .media-input-feedback-island--status[data-status="fullscreen"] .media-icon--fullscreen-enter, .media-default-skin .media-input-feedback-island--status[data-status="exit-fullscreen"] .media-icon--fullscreen-exit, .media-default-skin .media-input-feedback-island--status[data-status="pip"] .media-icon--pip-enter, .media-default-skin .media-input-feedback-island--status[data-status="exit-pip"] .media-icon--pip-exit': {
906
- display: "block"
907
- },
908
- /* --- Boundary shake ------------------------------------------------------- */
909
- // At-rule repeated by the vendor stylesheet at this level — the key carries a
910
- // trailing space so it stays a distinct JS object key (serializes to the same CSS).
911
- "@media (prefers-reduced-motion: no-preference) ": {
912
- ".media-default-skin .media-input-feedback-island--volume[data-min], .media-default-skin .media-input-feedback-island--volume[data-max]": {
913
- animation: "media-shake 300ms ease-in-out"
1151
+ ".media-default-skin .media-input-feedback-island--status": {
1152
+ '&[data-status="captions-on"] .media-icon--captions-on, &[data-status="captions-off"] .media-icon--captions-off, &[data-status="fullscreen"] .media-icon--fullscreen-enter, &[data-status="exit-fullscreen"] .media-icon--fullscreen-exit, &[data-status="pip"] .media-icon--pip-enter, &[data-status="exit-pip"] .media-icon--pip-exit': {
1153
+ display: "block"
914
1154
  }
915
1155
  },
916
1156
  /* --- Bubble ---------------------------------------------------------------- */
917
1157
  ".media-default-skin .media-input-feedback-bubble": {
918
- display: "flex",
919
- flexDirection: "column",
1158
+ display: "grid",
920
1159
  gridRow: "1",
921
1160
  gridColumn: "2",
922
- /* default to center for status bubbles and undirected seeks */
923
- alignItems: "center",
924
- justifyContent: "center",
1161
+ placeContent: "center",
925
1162
  padding: "1rem",
926
- transition: "opacity 250ms ease-out",
927
- "@container media-root (width > 24rem)": {
928
- padding: "2rem"
1163
+ textAlign: "center",
1164
+ /* Central bubble (play, pause) */
1165
+ "&:not([data-direction])": {
1166
+ background: "oklch(0 0 0 / 0.35)",
1167
+ borderRadius: "100%",
1168
+ backdropFilter: "blur(8px)",
1169
+ transitionTimingFunction: "ease-out",
1170
+ transitionDuration: "200ms",
1171
+ transitionProperty: "opacity, scale",
1172
+ "&[data-starting-style], &[data-ending-style]": {
1173
+ opacity: "0",
1174
+ scale: "0.85"
1175
+ },
1176
+ "&[data-ending-style]": {
1177
+ transitionTimingFunction: "ease-in",
1178
+ transitionDuration: "100ms"
1179
+ },
1180
+ "@media (prefers-reduced-motion: reduce)": {
1181
+ transitionDuration: "50ms",
1182
+ transitionProperty: "opacity"
1183
+ }
929
1184
  },
930
- "&[data-starting-style], &[data-ending-style]": {
931
- opacity: "0",
932
- transitionTimingFunction: "ease-in",
933
- transitionDuration: "200ms"
934
- }
935
- },
936
- /* Direction placement — seek bubbles move to the side implied by their direction. */
937
- '.media-default-skin .media-input-feedback-bubble[data-direction="backward"]': {
938
- gridColumn: "1",
939
- justifySelf: "left"
940
- },
941
- ".media-default-skin .media-input-feedback-bubble:not([data-direction])": {
942
- gridColumn: "2",
943
- transitionTimingFunction: "ease-out, linear(0, 0.12 1.5%, 1.35 9.7%, 2.2 13.9%, 3 19.9%, 2.7 21.8%, 0.62 37.5%, 0.96 50.9%, 1)",
944
- transitionDuration: "600ms",
945
- transitionProperty: "opacity, scale",
946
- "@media (prefers-reduced-motion: reduce)": {
947
- transition: "opacity 100ms ease-out"
1185
+ /* Directional bubbles (seek) */
1186
+ "&[data-direction]": {
1187
+ gap: "0.25rem",
1188
+ "@container media-root (width > 24rem)": {
1189
+ padding: "1.5rem"
1190
+ }
948
1191
  },
949
- "&[data-starting-style], &[data-ending-style]": {
950
- opacity: "0",
951
- scale: "0.8",
952
- transitionTimingFunction: "ease-in",
953
- transitionDuration: "200ms"
954
- }
955
- },
956
- '.media-default-skin .media-input-feedback-bubble[data-direction="forward"]': {
957
- gridColumn: "3",
958
- justifySelf: "right"
959
- },
960
- /* --- Bubble icons ---------------------------------------------------------- */
961
- ".media-default-skin .media-input-feedback-bubble .media-icon": {
962
- display: "none",
963
- width: "36px",
964
- height: "36px"
965
- },
966
- /* seek: seek icon, flipped for backward */
967
- ".media-default-skin .media-input-feedback-bubble[data-direction] .media-icon--seek": {
968
- display: "block"
969
- },
970
- '.media-default-skin .media-input-feedback-bubble[data-direction="backward"] .media-icon--seek': {
971
- transform: "scaleX(-1)"
972
- },
973
- // At-rule repeated by the vendor stylesheet at this level (third occurrence) —
974
- // the key carries TWO trailing spaces so it stays a distinct JS object key
975
- // (serializes to the same CSS).
976
- "@media (prefers-reduced-motion: no-preference) ": {
977
- '.media-default-skin .media-input-feedback-bubble[data-direction="forward"]:not([data-starting-style]) .media-icon--seek': {
978
- animation: "media-slide-in-forward 300ms ease-in-out"
1192
+ '&[data-direction="backward"]': {
1193
+ gridColumn: "1",
1194
+ justifySelf: "left"
979
1195
  },
980
- '.media-default-skin .media-input-feedback-bubble[data-direction="backward"]:not([data-starting-style]) .media-icon--seek': {
981
- animation: "media-slide-in-backward 300ms ease-in-out"
1196
+ '&[data-direction="forward"]': {
1197
+ gridColumn: "3",
1198
+ justifySelf: "right"
982
1199
  },
983
- ".media-default-skin .media-input-feedback-island--status[data-status]:not([data-starting-style]) .media-icon, .media-default-skin .media-input-feedback-bubble[data-status]:not([data-starting-style]) .media-icon": {
984
- animation: "media-pop-in 250ms ease-out"
1200
+ /* Icons */
1201
+ ".media-icon": {
1202
+ display: "none",
1203
+ width: "calc(var(--media-icon-size) * 1.5)",
1204
+ height: "calc(var(--media-icon-size) * 1.5)",
1205
+ "&.media-icon--play": {
1206
+ translate: "1px 0"
1207
+ }
1208
+ },
1209
+ '&[data-direction] .media-icon--seek, &[data-status="pause"] .media-icon--pause, &[data-status="play"] .media-icon--play': {
1210
+ display: "block"
1211
+ },
1212
+ '&[data-direction="backward"] .media-icon--seek': {
1213
+ scale: "-1 1"
1214
+ },
1215
+ "@media (prefers-reduced-motion: no-preference)": {
1216
+ ".media-icon--seek": {
1217
+ transitionTimingFunction: "ease-in-out",
1218
+ transitionDuration: "200ms",
1219
+ transitionProperty: "translate, opacity"
1220
+ },
1221
+ "&[data-starting-style] .media-icon--seek, &[data-ending-style] .media-icon--seek": {
1222
+ opacity: "0"
1223
+ },
1224
+ '&[data-direction="forward"][data-starting-style] .media-icon--seek': {
1225
+ translate: "-60% 0"
1226
+ },
1227
+ '&[data-direction="backward"][data-starting-style] .media-icon--seek': {
1228
+ translate: "60% 0"
1229
+ }
985
1230
  }
986
1231
  },
987
- '.media-default-skin .media-input-feedback-bubble[data-status="pause"] .media-icon--pause, .media-default-skin .media-input-feedback-bubble[data-status="play"] .media-icon--play': {
988
- display: "block"
989
- },
990
1232
  /*
991
1233
  * ==========================================================================
992
1234
  * Icon State Visibility for Video Skins
@@ -997,16 +1239,27 @@ const t = (e) => ({
997
1239
  * ==========================================================================
998
1240
  */
999
1241
  /* --- All icons hidden by default --- */
1000
- ".media-button--play .media-icon--restart, .media-button--play .media-icon--play, .media-button--play .media-icon--pause, .media-button--mute .media-icon--volume-off, .media-button--mute .media-icon--volume-low, .media-button--mute .media-icon--volume-high, .media-button--fullscreen .media-icon--fullscreen-enter, .media-button--fullscreen .media-icon--fullscreen-exit, .media-button--pip .media-icon--pip-enter, .media-button--pip .media-icon--pip-exit, .media-button--cast .media-icon--cast-enter, .media-button--cast .media-icon--cast-exit, .media-button--captions .media-icon--captions-off, .media-button--captions .media-icon--captions-on": {
1242
+ ".media-button--play .media-icon--restart, .media-button--play .media-icon--play, .media-button--play .media-icon--pause, .media-button--mute .media-icon--volume-off, .media-button--mute .media-icon--volume-low, .media-button--mute .media-icon--volume-high, .media-button--fullscreen .media-icon--fullscreen-enter, .media-button--fullscreen .media-icon--fullscreen-exit, .media-button--pip .media-icon--pip-enter, .media-button--pip .media-icon--pip-exit, .media-button--cast .media-icon--cast-enter, .media-button--cast .media-icon--cast-exit, .media-button--airplay .media-icon--airplay-enter, .media-button--airplay .media-icon--airplay-exit, .media-button--captions .media-icon--captions-off, .media-button--captions .media-icon--captions-on": {
1001
1243
  display: "none",
1002
1244
  opacity: "0"
1003
1245
  },
1004
1246
  /* --- Active icon per state --- */
1005
1247
  /* Play: ended → restart */
1006
- '.media-button--play[data-ended] .media-icon--restart, .media-button--play:not([data-ended])[data-paused] .media-icon--play, .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause, .media-button--mute[data-muted] .media-icon--volume-off, .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low, .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high, .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter, .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit, .media-button--pip:not([data-pip]) .media-icon--pip-enter, .media-button--pip[data-pip] .media-icon--pip-exit, .media-button--cast:not([data-cast-state="connected"]) .media-icon--cast-enter, .media-button--cast[data-cast-state="connected"] .media-icon--cast-exit, .media-button--captions:not([data-active]) .media-icon--captions-off, .media-button--captions[data-active] .media-icon--captions-on': {
1248
+ '.media-button--play[data-ended] .media-icon--restart, .media-button--play:not([data-ended])[data-paused] .media-icon--play, .media-button--play:not([data-ended]):not([data-started]) .media-icon--play, .media-button--play[data-started]:not([data-paused]):not([data-ended]) .media-icon--pause, .media-button--mute[data-muted] .media-icon--volume-off, .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low, .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high, .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter, .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit, .media-button--pip:not([data-pip]) .media-icon--pip-enter, .media-button--pip[data-pip] .media-icon--pip-exit, .media-button--cast:not([data-cast-state="connected"]) .media-icon--cast-enter, .media-button--cast[data-cast-state="connected"] .media-icon--cast-exit, .media-button--airplay:not([data-airplay-state="connected"]) .media-icon--airplay-enter, .media-button--airplay[data-airplay-state="connected"] .media-icon--airplay-exit, .media-button--captions:not([data-active]) .media-icon--captions-off, .media-button--captions[data-active] .media-icon--captions-on': {
1007
1249
  display: "block",
1008
1250
  opacity: "1"
1009
1251
  },
1252
+ /* --- Pause keyframe animations on inactive icons --- */
1253
+ /*
1254
+ * The airplay-exit SVG defines its keyframes against CSS variables (mirroring
1255
+ * the spinner pattern). When the AirPlay session isn't active the SVG is
1256
+ * still in the DOM — just `display: none` — so its animations would keep
1257
+ * running. Set the variables to `none` to short-circuit the keyframes.
1258
+ */
1259
+ '.media-button--airplay:not([data-airplay-state="connected"])': {
1260
+ "--media-icon--airplay__fill-animation": "none",
1261
+ "--media-icon--airplay__triangle-animation": "none"
1262
+ },
1010
1263
  /* -------------------------------------------------------------------------- */
1011
1264
  /* Global @keyframes for all video skins (CSS & Tailwind) */
1012
1265
  /* -------------------------------------------------------------------------- */
@@ -1027,24 +1280,6 @@ const t = (e) => ({
1027
1280
  translate: "1px 0"
1028
1281
  }
1029
1282
  },
1030
- "@keyframes media-slide-in-forward": {
1031
- from: {
1032
- translate: "-60% 0",
1033
- opacity: "0"
1034
- }
1035
- },
1036
- "@keyframes media-slide-in-backward": {
1037
- from: {
1038
- translate: "60% 0",
1039
- opacity: "0"
1040
- }
1041
- },
1042
- "@keyframes media-pop-in": {
1043
- from: {
1044
- scale: "0.8",
1045
- opacity: "0"
1046
- }
1047
- },
1048
1283
  /* -------------------------------------------------------------------------- */
1049
1284
  /* Global @properties for all video skins (CSS & Tailwind) */
1050
1285
  /* -------------------------------------------------------------------------- */
@@ -1078,6 +1313,7 @@ const t = (e) => ({
1078
1313
  "--media-tooltip-boundary-offset": "0.5rem",
1079
1314
  "--media-popover-side-offset": "0.5rem",
1080
1315
  "--media-popover-boundary-offset": "0.5rem",
1316
+ overflow: "clip",
1081
1317
  background: "oklch(0 0 0)",
1082
1318
  "@media (prefers-reduced-motion: reduce)": {
1083
1319
  "--media-error-dialog-transition-duration": "50ms",
@@ -1174,8 +1410,6 @@ const t = (e) => ({
1174
1410
  bottom: "0.5rem",
1175
1411
  zIndex: "10",
1176
1412
  flexWrap: "wrap",
1177
- maxWidth: "56rem",
1178
- marginInline: "auto",
1179
1413
  color: "var(--media-color-primary, oklch(1 0 0))",
1180
1414
  transformOrigin: "bottom",
1181
1415
  transitionTimingFunction: "var(--media-controls-transition-timing-function)",
@@ -1204,9 +1438,6 @@ const t = (e) => ({
1204
1438
  order: "-1",
1205
1439
  paddingInline: "0.625rem"
1206
1440
  },
1207
- // Vendor uses `:first-child` here; swapped to the DOM-equivalent
1208
- // `:first-of-type` (the control bar children are exactly three `div`s) to
1209
- // avoid Emotion's dev-mode "unsafe for SSR" console.error on every mount.
1210
1441
  "& .media-button-group:first-of-type": {
1211
1442
  flex: "1",
1212
1443
  textAlign: "left"
@@ -1225,8 +1456,6 @@ const t = (e) => ({
1225
1456
  flex: "1",
1226
1457
  order: "unset"
1227
1458
  },
1228
- // `:first-of-type` instead of the vendor's `:first-child` — see the note
1229
- // on the sibling rule above (Emotion dev-mode SSR warning).
1230
1459
  "& .media-button-group:first-of-type, & .media-button-group:last-child": {
1231
1460
  flex: "0 0 auto"
1232
1461
  }
@@ -1248,18 +1477,18 @@ const t = (e) => ({
1248
1477
  backgroundColor: "oklch(1 0 0 / 0.2)",
1249
1478
  boxShadow: "0 0 0 1px oklch(0 0 0 / 0.05)"
1250
1479
  },
1251
- ".media-default-skin--video .media-slider__preview": {
1252
- "--media-preview-max-width": "11rem",
1253
- "--media-preview-padding": "-1.125rem",
1480
+ ".media-default-skin--video .media-slider__thumbnail": {
1481
+ "--media-slider-thumbnail-max-width": "11rem",
1482
+ "--media-slider-thumbnail-max-height": "8rem",
1483
+ "--media-slider-thumbnail-padding": "-1.125rem",
1254
1484
  /*
1255
- * *
1256
1485
  * Inset is the difference between the container width and the slider (100%) width.
1257
1486
  * Divided by 2 as we render the time on both sides.
1258
1487
  */
1259
- "--media-preview-inset": "calc((100cqi - 100%) / 2)",
1488
+ "--media-slider-thumbnail-inset": "calc((100cqi - 100%) / 2)",
1260
1489
  position: "absolute",
1261
1490
  bottom: "calc(100% + 1.2rem)",
1262
- left: "clamp( calc(var(--media-preview-max-width) / 2 + var(--media-preview-padding) - var(--media-preview-inset)), var(--media-slider-pointer), calc(100% - var(--media-preview-max-width) / 2 - var(--media-preview-padding) + var(--media-preview-inset)) )",
1491
+ left: "clamp( calc( var(--media-slider-thumbnail-max-width) / 2 + var(--media-slider-thumbnail-padding) - var(--media-slider-thumbnail-inset) ), var(--media-slider-pointer), calc( 100% - var(--media-slider-thumbnail-max-width) / 2 - var(--media-slider-thumbnail-padding) + var(--media-slider-thumbnail-inset) ) )",
1263
1492
  pointerEvents: "none",
1264
1493
  opacity: "0",
1265
1494
  filter: "blur(8px)",
@@ -1269,22 +1498,23 @@ const t = (e) => ({
1269
1498
  transitionTimingFunction: "ease-out",
1270
1499
  transitionDuration: "150ms",
1271
1500
  transitionProperty: "scale, opacity, filter",
1272
- "& .media-preview__thumbnail": {
1273
- maxWidth: "var(--media-preview-max-width)"
1274
- },
1275
- "&:has(.media-preview__thumbnail[data-loading])": {
1276
- maxHeight: "6rem"
1501
+ "& .media-thumbnail__image": {
1502
+ maxWidth: "var(--media-slider-thumbnail-max-width)",
1503
+ maxHeight: "var(--media-slider-thumbnail-max-height)"
1277
1504
  }
1278
1505
  },
1279
- '.media-default-skin--video .media-slider[data-pointing] .media-slider__preview:has([role="img"]:not([data-hidden]))': {
1506
+ '.media-default-skin--video .media-slider[data-pointing] .media-slider__thumbnail:has([role="img"]:not([data-hidden]))': {
1280
1507
  opacity: "1",
1281
1508
  filter: "blur(0)",
1282
1509
  scale: "1"
1510
+ },
1511
+ '.media-default-skin--video .media-slider__thumbnail:has([role="img"]:not([data-hidden])) + .media-slider__preview .media-slider__value': {
1512
+ display: "none"
1283
1513
  }
1284
1514
  }), a = /* @__PURE__ */ new WeakMap(), o = (e) => {
1285
1515
  let i = a.get(e);
1286
1516
  return i || (i = t(e), a.set(e, i)), i;
1287
1517
  };
1288
1518
  export {
1289
- o as videojsSkinAllStyles
1519
+ o as videojsDefaultSkinAllStyles
1290
1520
  };