@videojs/react 10.0.0-beta.22 → 10.0.0-beta.23

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 (256) hide show
  1. package/dist/default/index.js +4 -5
  2. package/dist/default/media/dash-video/index.js +6 -6
  3. package/dist/default/media/dash-video/index.js.map +1 -1
  4. package/dist/default/media/hls-video/index.js +6 -6
  5. package/dist/default/media/hls-video/index.js.map +1 -1
  6. package/dist/default/media/mux-audio/index.js +9 -8
  7. package/dist/default/media/mux-audio/index.js.map +1 -1
  8. package/dist/default/media/mux-video/index.js +6 -6
  9. package/dist/default/media/mux-video/index.js.map +1 -1
  10. package/dist/default/media/native-hls-video/index.js +6 -6
  11. package/dist/default/media/native-hls-video/index.js.map +1 -1
  12. package/dist/default/media/simple-hls-video/index.js +6 -5
  13. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  14. package/dist/default/presets/audio/minimal-skin.css +2 -1
  15. package/dist/default/presets/audio/skin.css +2 -1
  16. package/dist/default/presets/audio/skin.js +15 -15
  17. package/dist/default/presets/audio/skin.js.map +1 -1
  18. package/dist/default/presets/live-audio/index.js +7 -0
  19. package/dist/default/presets/live-audio/minimal-skin.css +736 -0
  20. package/dist/default/presets/live-audio/minimal-skin.js +136 -0
  21. package/dist/default/presets/live-audio/minimal-skin.js.map +1 -0
  22. package/dist/default/presets/live-audio/minimal-skin.tailwind.js +166 -0
  23. package/dist/default/presets/live-audio/minimal-skin.tailwind.js.map +1 -0
  24. package/dist/default/presets/live-audio/skin.css +752 -0
  25. package/dist/default/presets/live-audio/skin.js +158 -0
  26. package/dist/default/presets/live-audio/skin.js.map +1 -0
  27. package/dist/default/presets/live-audio/skin.tailwind.js +165 -0
  28. package/dist/default/presets/live-audio/skin.tailwind.js.map +1 -0
  29. package/dist/default/presets/live-video/index.js +7 -0
  30. package/dist/default/presets/live-video/minimal-skin.css +1127 -0
  31. package/dist/default/presets/live-video/minimal-skin.js +198 -0
  32. package/dist/default/presets/live-video/minimal-skin.js.map +1 -0
  33. package/dist/default/presets/live-video/minimal-skin.tailwind.js +231 -0
  34. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -0
  35. package/dist/default/presets/live-video/skin.css +1117 -0
  36. package/dist/default/presets/live-video/skin.js +252 -0
  37. package/dist/default/presets/live-video/skin.js.map +1 -0
  38. package/dist/default/presets/live-video/skin.tailwind.js +233 -0
  39. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -0
  40. package/dist/default/presets/video/minimal-skin.css +2 -1
  41. package/dist/default/presets/video/skin.css +2 -1
  42. package/dist/default/presets/video/skin.js +24 -24
  43. package/dist/default/presets/video/skin.js.map +1 -1
  44. package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
  45. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  46. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  47. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  48. package/dist/default/ui/cast-button/cast-button.js +2 -2
  49. package/dist/default/ui/cast-button/cast-button.js.map +1 -1
  50. package/dist/default/ui/gesture/{media-gesture.js → gesture.js} +6 -4
  51. package/dist/default/ui/gesture/gesture.js.map +1 -0
  52. package/dist/default/ui/hotkey/{media-hotkey.js → hotkey.js} +6 -4
  53. package/dist/default/ui/hotkey/hotkey.js.map +1 -0
  54. package/dist/default/utils/use-attach-media.js +14 -0
  55. package/dist/default/utils/use-attach-media.js.map +1 -0
  56. package/dist/default/utils/use-sync-props.js +14 -0
  57. package/dist/default/utils/use-sync-props.js.map +1 -0
  58. package/dist/dev/index.d.ts +4 -5
  59. package/dist/dev/index.js +4 -5
  60. package/dist/dev/media/audio.d.ts +2 -2
  61. package/dist/dev/media/audio.d.ts.map +1 -1
  62. package/dist/dev/media/background-video/index.d.ts +2 -2
  63. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  64. package/dist/dev/media/dash-video/index.d.ts +7 -8
  65. package/dist/dev/media/dash-video/index.d.ts.map +1 -1
  66. package/dist/dev/media/dash-video/index.js +6 -6
  67. package/dist/dev/media/dash-video/index.js.map +1 -1
  68. package/dist/dev/media/hls-video/index.d.ts +7 -8
  69. package/dist/dev/media/hls-video/index.d.ts.map +1 -1
  70. package/dist/dev/media/hls-video/index.js +6 -6
  71. package/dist/dev/media/hls-video/index.js.map +1 -1
  72. package/dist/dev/media/mux-audio/index.d.ts +11 -9
  73. package/dist/dev/media/mux-audio/index.d.ts.map +1 -1
  74. package/dist/dev/media/mux-audio/index.js +9 -8
  75. package/dist/dev/media/mux-audio/index.js.map +1 -1
  76. package/dist/dev/media/mux-video/index.d.ts +7 -8
  77. package/dist/dev/media/mux-video/index.d.ts.map +1 -1
  78. package/dist/dev/media/mux-video/index.js +6 -6
  79. package/dist/dev/media/mux-video/index.js.map +1 -1
  80. package/dist/dev/media/native-hls-video/index.d.ts +7 -8
  81. package/dist/dev/media/native-hls-video/index.d.ts.map +1 -1
  82. package/dist/dev/media/native-hls-video/index.js +6 -6
  83. package/dist/dev/media/native-hls-video/index.js.map +1 -1
  84. package/dist/dev/media/simple-hls-video/index.d.ts +7 -6
  85. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
  86. package/dist/dev/media/simple-hls-video/index.js +6 -5
  87. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  88. package/dist/dev/media/video.d.ts +2 -2
  89. package/dist/dev/media/video.d.ts.map +1 -1
  90. package/dist/dev/player/context.d.ts +2 -2
  91. package/dist/dev/player/context.d.ts.map +1 -1
  92. package/dist/dev/presets/audio/minimal-skin.css +2 -1
  93. package/dist/dev/presets/audio/skin.css +2 -1
  94. package/dist/dev/presets/audio/skin.js +15 -15
  95. package/dist/dev/presets/audio/skin.js.map +1 -1
  96. package/dist/dev/presets/background/skin.d.ts +2 -2
  97. package/dist/dev/presets/background/skin.d.ts.map +1 -1
  98. package/dist/dev/presets/live-audio/index.d.ts +7 -0
  99. package/dist/dev/presets/live-audio/index.js +7 -0
  100. package/dist/dev/presets/live-audio/minimal-skin.css +736 -0
  101. package/dist/dev/presets/live-audio/minimal-skin.d.ts +16 -0
  102. package/dist/dev/presets/live-audio/minimal-skin.d.ts.map +1 -0
  103. package/dist/dev/presets/live-audio/minimal-skin.js +136 -0
  104. package/dist/dev/presets/live-audio/minimal-skin.js.map +1 -0
  105. package/dist/dev/presets/live-audio/minimal-skin.tailwind.d.ts +8 -0
  106. package/dist/dev/presets/live-audio/minimal-skin.tailwind.d.ts.map +1 -0
  107. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js +166 -0
  108. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js.map +1 -0
  109. package/dist/dev/presets/live-audio/skin.css +752 -0
  110. package/dist/dev/presets/live-audio/skin.d.ts +15 -0
  111. package/dist/dev/presets/live-audio/skin.d.ts.map +1 -0
  112. package/dist/dev/presets/live-audio/skin.js +158 -0
  113. package/dist/dev/presets/live-audio/skin.js.map +1 -0
  114. package/dist/dev/presets/live-audio/skin.tailwind.d.ts +8 -0
  115. package/dist/dev/presets/live-audio/skin.tailwind.d.ts.map +1 -0
  116. package/dist/dev/presets/live-audio/skin.tailwind.js +165 -0
  117. package/dist/dev/presets/live-audio/skin.tailwind.js.map +1 -0
  118. package/dist/dev/presets/live-video/index.d.ts +7 -0
  119. package/dist/dev/presets/live-video/index.js +7 -0
  120. package/dist/dev/presets/live-video/minimal-skin.css +1127 -0
  121. package/dist/dev/presets/live-video/minimal-skin.d.ts +16 -0
  122. package/dist/dev/presets/live-video/minimal-skin.d.ts.map +1 -0
  123. package/dist/dev/presets/live-video/minimal-skin.js +198 -0
  124. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -0
  125. package/dist/dev/presets/live-video/minimal-skin.tailwind.d.ts +8 -0
  126. package/dist/dev/presets/live-video/minimal-skin.tailwind.d.ts.map +1 -0
  127. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +231 -0
  128. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -0
  129. package/dist/dev/presets/live-video/skin.css +1117 -0
  130. package/dist/dev/presets/live-video/skin.d.ts +15 -0
  131. package/dist/dev/presets/live-video/skin.d.ts.map +1 -0
  132. package/dist/dev/presets/live-video/skin.js +252 -0
  133. package/dist/dev/presets/live-video/skin.js.map +1 -0
  134. package/dist/dev/presets/live-video/skin.tailwind.d.ts +8 -0
  135. package/dist/dev/presets/live-video/skin.tailwind.d.ts.map +1 -0
  136. package/dist/dev/presets/live-video/skin.tailwind.js +233 -0
  137. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -0
  138. package/dist/dev/presets/video/minimal-skin.css +2 -1
  139. package/dist/dev/presets/video/skin.css +2 -1
  140. package/dist/dev/presets/video/skin.js +24 -24
  141. package/dist/dev/presets/video/skin.js.map +1 -1
  142. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +1 -1
  143. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  144. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  145. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  146. package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts +2 -2
  147. package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts.map +1 -1
  148. package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts +2 -2
  149. package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts.map +1 -1
  150. package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts +2 -2
  151. package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts.map +1 -1
  152. package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts +2 -2
  153. package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts.map +1 -1
  154. package/dist/dev/ui/buffering-indicator/buffering-indicator.d.ts +2 -2
  155. package/dist/dev/ui/buffering-indicator/buffering-indicator.d.ts.map +1 -1
  156. package/dist/dev/ui/captions-button/captions-button.d.ts +2 -2
  157. package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
  158. package/dist/dev/ui/cast-button/cast-button.d.ts +2 -2
  159. package/dist/dev/ui/cast-button/cast-button.d.ts.map +1 -1
  160. package/dist/dev/ui/cast-button/cast-button.js +2 -2
  161. package/dist/dev/ui/cast-button/cast-button.js.map +1 -1
  162. package/dist/dev/ui/controls/controls-group.d.ts +2 -2
  163. package/dist/dev/ui/controls/controls-group.d.ts.map +1 -1
  164. package/dist/dev/ui/controls/controls-root.d.ts +2 -2
  165. package/dist/dev/ui/controls/controls-root.d.ts.map +1 -1
  166. package/dist/dev/ui/error-dialog/error-dialog-description.d.ts +2 -2
  167. package/dist/dev/ui/error-dialog/error-dialog-description.d.ts.map +1 -1
  168. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts +2 -2
  169. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts.map +1 -1
  170. package/dist/dev/ui/gesture/gesture.d.ts +30 -0
  171. package/dist/dev/ui/gesture/gesture.d.ts.map +1 -0
  172. package/dist/dev/ui/gesture/{media-gesture.js → gesture.js} +6 -4
  173. package/dist/dev/ui/gesture/gesture.js.map +1 -0
  174. package/dist/dev/ui/hotkey/hotkey.d.ts +28 -0
  175. package/dist/dev/ui/hotkey/hotkey.d.ts.map +1 -0
  176. package/dist/dev/ui/hotkey/{media-hotkey.js → hotkey.js} +6 -4
  177. package/dist/dev/ui/hotkey/hotkey.js.map +1 -0
  178. package/dist/dev/ui/mute-button/mute-button.d.ts +2 -2
  179. package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -1
  180. package/dist/dev/ui/pip-button/pip-button.d.ts +2 -2
  181. package/dist/dev/ui/pip-button/pip-button.d.ts.map +1 -1
  182. package/dist/dev/ui/play-button/play-button.d.ts +2 -2
  183. package/dist/dev/ui/play-button/play-button.d.ts.map +1 -1
  184. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts +2 -2
  185. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts.map +1 -1
  186. package/dist/dev/ui/popover/popover-arrow.d.ts +2 -2
  187. package/dist/dev/ui/popover/popover-arrow.d.ts.map +1 -1
  188. package/dist/dev/ui/popover/popover-popup.d.ts +2 -2
  189. package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -1
  190. package/dist/dev/ui/popover/popover-trigger.d.ts +2 -2
  191. package/dist/dev/ui/popover/popover-trigger.d.ts.map +1 -1
  192. package/dist/dev/ui/poster/poster.d.ts +2 -2
  193. package/dist/dev/ui/poster/poster.d.ts.map +1 -1
  194. package/dist/dev/ui/seek-button/seek-button.d.ts +2 -2
  195. package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -1
  196. package/dist/dev/ui/slider/slider-buffer.d.ts +2 -2
  197. package/dist/dev/ui/slider/slider-buffer.d.ts.map +1 -1
  198. package/dist/dev/ui/slider/slider-fill.d.ts +2 -2
  199. package/dist/dev/ui/slider/slider-fill.d.ts.map +1 -1
  200. package/dist/dev/ui/slider/slider-preview.d.ts +2 -2
  201. package/dist/dev/ui/slider/slider-preview.d.ts.map +1 -1
  202. package/dist/dev/ui/slider/slider-root.d.ts +2 -2
  203. package/dist/dev/ui/slider/slider-root.d.ts.map +1 -1
  204. package/dist/dev/ui/slider/slider-thumb.d.ts +2 -2
  205. package/dist/dev/ui/slider/slider-thumb.d.ts.map +1 -1
  206. package/dist/dev/ui/slider/slider-thumbnail.d.ts +2 -2
  207. package/dist/dev/ui/slider/slider-thumbnail.d.ts.map +1 -1
  208. package/dist/dev/ui/slider/slider-track.d.ts +2 -2
  209. package/dist/dev/ui/slider/slider-track.d.ts.map +1 -1
  210. package/dist/dev/ui/slider/slider-value.d.ts +2 -2
  211. package/dist/dev/ui/slider/slider-value.d.ts.map +1 -1
  212. package/dist/dev/ui/thumbnail/thumbnail.d.ts +2 -2
  213. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -1
  214. package/dist/dev/ui/time/time-group.d.ts +2 -2
  215. package/dist/dev/ui/time/time-group.d.ts.map +1 -1
  216. package/dist/dev/ui/time/time-separator.d.ts +2 -2
  217. package/dist/dev/ui/time/time-separator.d.ts.map +1 -1
  218. package/dist/dev/ui/time/time-value.d.ts +2 -2
  219. package/dist/dev/ui/time/time-value.d.ts.map +1 -1
  220. package/dist/dev/ui/time-slider/time-slider-root.d.ts +2 -2
  221. package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -1
  222. package/dist/dev/ui/tooltip/tooltip-arrow.d.ts +2 -2
  223. package/dist/dev/ui/tooltip/tooltip-arrow.d.ts.map +1 -1
  224. package/dist/dev/ui/tooltip/tooltip-popup.d.ts +2 -2
  225. package/dist/dev/ui/tooltip/tooltip-popup.d.ts.map +1 -1
  226. package/dist/dev/ui/tooltip/tooltip-trigger.d.ts +2 -2
  227. package/dist/dev/ui/tooltip/tooltip-trigger.d.ts.map +1 -1
  228. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts +2 -2
  229. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts.map +1 -1
  230. package/dist/dev/utils/use-attach-media.d.ts +8 -0
  231. package/dist/dev/utils/use-attach-media.d.ts.map +1 -0
  232. package/dist/dev/utils/use-attach-media.js +14 -0
  233. package/dist/dev/utils/use-attach-media.js.map +1 -0
  234. package/dist/dev/utils/use-sync-props.js +14 -0
  235. package/dist/dev/utils/use-sync-props.js.map +1 -0
  236. package/package.json +30 -9
  237. package/dist/default/ui/gesture/media-gesture.js.map +0 -1
  238. package/dist/default/ui/hotkey/media-hotkey.js.map +0 -1
  239. package/dist/default/utils/attach-media-element.js +0 -12
  240. package/dist/default/utils/attach-media-element.js.map +0 -1
  241. package/dist/default/utils/media-props.js +0 -19
  242. package/dist/default/utils/media-props.js.map +0 -1
  243. package/dist/dev/ui/gesture/media-gesture.d.ts +0 -23
  244. package/dist/dev/ui/gesture/media-gesture.d.ts.map +0 -1
  245. package/dist/dev/ui/gesture/media-gesture.js.map +0 -1
  246. package/dist/dev/ui/hotkey/media-hotkey.d.ts +0 -21
  247. package/dist/dev/ui/hotkey/media-hotkey.d.ts.map +0 -1
  248. package/dist/dev/ui/hotkey/media-hotkey.js.map +0 -1
  249. package/dist/dev/utils/attach-media-element.d.ts +0 -9
  250. package/dist/dev/utils/attach-media-element.d.ts.map +0 -1
  251. package/dist/dev/utils/attach-media-element.js +0 -12
  252. package/dist/dev/utils/attach-media-element.js.map +0 -1
  253. package/dist/dev/utils/media-props.d.ts +0 -8
  254. package/dist/dev/utils/media-props.d.ts.map +0 -1
  255. package/dist/dev/utils/media-props.js +0 -19
  256. package/dist/dev/utils/media-props.js.map +0 -1
@@ -0,0 +1,1127 @@
1
+ /* ==========================================================================
2
+ Reset
3
+ ========================================================================== */
4
+
5
+ .media-minimal-skin *,
6
+ .media-minimal-skin *::before,
7
+ .media-minimal-skin *::after {
8
+ box-sizing: border-box;
9
+ }
10
+ .media-minimal-skin img,
11
+ .media-minimal-skin video,
12
+ .media-minimal-skin svg {
13
+ display: block;
14
+ max-width: 100%;
15
+ }
16
+ .media-minimal-skin button {
17
+ font: inherit;
18
+ }
19
+ @media (prefers-reduced-motion: no-preference) {
20
+ .media-minimal-skin {
21
+ interpolate-size: allow-keywords;
22
+ }
23
+ }
24
+
25
+ /* ==========================================================================
26
+ Root Container
27
+ ========================================================================== */
28
+
29
+ .media-minimal-skin {
30
+ container: media-root / inline-size;
31
+ position: relative;
32
+ isolation: isolate;
33
+ display: block;
34
+ height: 100%;
35
+ width: 100%;
36
+ border-radius: var(--media-border-radius, 0.75rem);
37
+ outline: 2px solid transparent;
38
+ outline-offset: 2px;
39
+
40
+ &:focus-visible {
41
+ outline-color: currentColor;
42
+ }
43
+ font-family:
44
+ Inter Variable,
45
+ Inter,
46
+ ui-sans-serif,
47
+ system-ui,
48
+ sans-serif;
49
+ line-height: 1.5;
50
+ letter-spacing: normal;
51
+ -webkit-font-smoothing: auto;
52
+ -moz-osx-font-smoothing: auto;
53
+
54
+ & > * {
55
+ font-size: 0.75rem; /* 12px at 100% font size */
56
+ }
57
+
58
+ @container media-root (width > 48rem) {
59
+ & > * {
60
+ font-size: 0.875rem; /* 14px at 100% font size */
61
+ }
62
+ }
63
+ }
64
+
65
+ /* ==========================================================================
66
+ Media Element
67
+ ========================================================================== */
68
+
69
+ .media-minimal-skin ::slotted(video),
70
+ .media-minimal-skin video {
71
+ display: block;
72
+ width: 100%;
73
+ height: 100%;
74
+ object-fit: var(--media-object-fit, contain);
75
+ object-position: var(--media-object-position, center);
76
+ }
77
+ .media-minimal-skin ::slotted(video) {
78
+ border-radius: var(--media-video-border-radius);
79
+ }
80
+ .media-minimal-skin video {
81
+ border-radius: inherit;
82
+ }
83
+
84
+ .media-minimal-skin:fullscreen ::slotted(video),
85
+ .media-minimal-skin:fullscreen video {
86
+ object-fit: contain;
87
+ }
88
+
89
+ /* ==========================================================================
90
+ Overlay / Scrim
91
+ ========================================================================== */
92
+
93
+ .media-minimal-skin .media-overlay {
94
+ position: absolute;
95
+ inset: 0;
96
+ border-radius: inherit;
97
+ background-image: linear-gradient(to top, oklch(0 0 0 / 0.7), oklch(0 0 0 / 0.5) 7.5rem, oklch(0 0 0 / 0));
98
+ backdrop-filter: blur(0) saturate(1);
99
+ opacity: 0;
100
+ pointer-events: none;
101
+ transition-property: opacity, backdrop-filter;
102
+ transition-duration: var(--media-controls-transition-duration);
103
+ transition-timing-function: ease-out;
104
+ }
105
+
106
+ .media-minimal-skin .media-error ~ .media-overlay {
107
+ transition-duration: var(--media-error-dialog-transition-duration);
108
+ transition-delay: var(--media-error-dialog-transition-delay);
109
+ }
110
+
111
+ .media-minimal-skin .media-controls[data-visible] ~ .media-overlay,
112
+ .media-minimal-skin .media-error[data-open] ~ .media-overlay {
113
+ opacity: 1;
114
+ }
115
+
116
+ .media-minimal-skin .media-error[data-open] ~ .media-overlay {
117
+ backdrop-filter: blur(16px) saturate(1.2);
118
+ }
119
+
120
+ /* ==========================================================================
121
+ Buffering Indicator
122
+ ========================================================================== */
123
+
124
+ .media-minimal-skin .media-buffering-indicator {
125
+ position: absolute;
126
+ inset: 0;
127
+ display: none;
128
+ align-items: center;
129
+ justify-content: center;
130
+ color: oklch(1 0 0);
131
+ pointer-events: none;
132
+
133
+ &[data-visible] {
134
+ display: flex;
135
+ }
136
+ }
137
+
138
+ /* ==========================================================================
139
+ Error Dialog
140
+ ========================================================================== */
141
+
142
+ .media-minimal-skin .media-error:not([data-open]) {
143
+ display: none;
144
+ }
145
+
146
+ .media-minimal-skin .media-error__title {
147
+ font-weight: 600;
148
+ line-height: 1.25;
149
+ }
150
+
151
+ .media-minimal-skin .media-error__description {
152
+ opacity: 0.7;
153
+ overflow-wrap: anywhere;
154
+ }
155
+
156
+ .media-minimal-skin .media-error__actions {
157
+ display: flex;
158
+ gap: 0.5rem;
159
+
160
+ & > * {
161
+ flex: 1;
162
+ }
163
+ }
164
+
165
+ .media-minimal-skin .media-error[data-open] ~ .media-controls * {
166
+ visibility: hidden;
167
+ }
168
+
169
+ /* ==========================================================================
170
+ Controls
171
+ ========================================================================== */
172
+
173
+ .media-minimal-skin .media-controls {
174
+ container: media-controls / inline-size;
175
+ display: flex;
176
+ align-items: center;
177
+ --media-controls-current-shadow-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));
178
+ --media-controls-current-shadow-color-subtle: oklch(
179
+ from var(--media-controls-current-shadow-color) l c h /
180
+ calc(alpha * 0.4)
181
+ );
182
+ background-color: var(--media-controls-background-color);
183
+ backdrop-filter: var(--media-controls-backdrop-filter);
184
+ text-shadow: 0 1px 0 var(--media-controls-current-shadow-color);
185
+ }
186
+
187
+ /* ==========================================================================
188
+ Time Controls & Display
189
+ ========================================================================== */
190
+
191
+ .media-minimal-skin .media-time-controls {
192
+ container: media-time-controls / inline-size;
193
+ display: flex;
194
+ flex-direction: row-reverse;
195
+ align-items: center;
196
+ flex: 1;
197
+ gap: 0.75rem;
198
+ }
199
+
200
+ .media-minimal-skin .media-time-group {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 0.25rem;
204
+ }
205
+
206
+ .media-minimal-skin .media-time {
207
+ font-variant-numeric: tabular-nums;
208
+ }
209
+
210
+ .media-minimal-skin .media-time--current,
211
+ .media-minimal-skin .media-time-separator {
212
+ display: none;
213
+ }
214
+
215
+ @container media-root (width > 42rem) {
216
+ .media-minimal-skin .media-time-controls {
217
+ flex-direction: row;
218
+ }
219
+
220
+ .media-minimal-skin .media-time--duration,
221
+ .media-minimal-skin .media-time-separator {
222
+ color: oklch(from currentColor l c h / 0.6);
223
+ }
224
+
225
+ .media-minimal-skin .media-time--current,
226
+ .media-minimal-skin .media-time-separator {
227
+ display: inline;
228
+ }
229
+ }
230
+
231
+ /* ==========================================================================
232
+ Buttons
233
+ ========================================================================== */
234
+
235
+ /* Base button */
236
+ .media-minimal-skin .media-button {
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ flex-shrink: 0;
241
+ padding: 0.5rem 1rem;
242
+ border: none;
243
+ border-radius: 0.5rem;
244
+ outline: 2px solid transparent;
245
+ outline-offset: -2px;
246
+ transition-property: background-color, outline-offset, scale;
247
+ /* Fix weird jumping when clicking on the buttons in Safari. */
248
+ will-change: scale;
249
+ transition-duration: 150ms;
250
+ transition-timing-function: ease-out;
251
+ cursor: pointer;
252
+ user-select: none;
253
+ text-align: center;
254
+ touch-action: manipulation;
255
+
256
+ &:focus-visible {
257
+ outline-color: currentColor;
258
+ outline-offset: 2px;
259
+ }
260
+
261
+ &:active {
262
+ scale: 0.98;
263
+ }
264
+
265
+ &[disabled] {
266
+ opacity: 0.5;
267
+ filter: grayscale(1);
268
+ cursor: not-allowed;
269
+ }
270
+
271
+ &[data-availability="unavailable"],
272
+ &[data-availability="unsupported"] {
273
+ display: none;
274
+ }
275
+ }
276
+
277
+ /* biome-ignore lint/correctness/noUnknownProperty: corner-shape is an emerging CSS spec */
278
+ @supports (corner-shape: squircle) {
279
+ .media-minimal-skin .media-button {
280
+ border-radius: 1rem;
281
+ /* biome-ignore lint/correctness/noUnknownProperty: corner-shape is an emerging CSS spec */
282
+ corner-shape: squircle;
283
+ }
284
+ }
285
+
286
+ /* Primary button variant */
287
+ .media-minimal-skin .media-button--primary {
288
+ background: oklch(1 0 0);
289
+ color: oklch(0 0 0);
290
+ font-weight: 500;
291
+ text-shadow: none;
292
+ }
293
+
294
+ /* Subtle button variant */
295
+ .media-minimal-skin .media-button--subtle {
296
+ background: transparent;
297
+ color: inherit;
298
+ text-shadow: inherit;
299
+
300
+ &:hover,
301
+ &:focus-visible,
302
+ &[aria-expanded="true"] {
303
+ background: oklch(from currentColor l c h / 0.1);
304
+ }
305
+ }
306
+
307
+ /* Icon button variant */
308
+ .media-minimal-skin .media-button--icon {
309
+ display: grid;
310
+ width: 2.375rem;
311
+ padding: 0;
312
+ aspect-ratio: 1;
313
+
314
+ &:active {
315
+ scale: 0.9;
316
+ }
317
+
318
+ & .media-icon {
319
+ filter: drop-shadow(0 1px 0 var(--media-controls-current-shadow-color, oklch(0 0 0 / 0.25)));
320
+ }
321
+ }
322
+
323
+ /* Seek button */
324
+ .media-minimal-skin .media-button--seek {
325
+ & .media-icon__label {
326
+ position: absolute;
327
+ right: -1px;
328
+ bottom: -3px;
329
+ font-size: 10px; /* Hard coded due to size limitations. */
330
+ font-weight: 480;
331
+ font-variant-numeric: tabular-nums;
332
+ }
333
+
334
+ &:has(.media-icon--flipped) .media-icon__label {
335
+ right: unset;
336
+ left: -1px;
337
+ }
338
+ }
339
+
340
+ /* Playback rate button */
341
+ .media-minimal-skin .media-button--playback-rate {
342
+ padding: 0;
343
+
344
+ &::after {
345
+ content: attr(data-rate) "\00D7";
346
+ width: 4ch;
347
+ font-variant-numeric: tabular-nums;
348
+ }
349
+ }
350
+
351
+ /* ==========================================================================
352
+ Button Groups
353
+ ========================================================================== */
354
+
355
+ .media-minimal-skin .media-button-group {
356
+ display: flex;
357
+ align-items: center;
358
+ gap: 0.075rem;
359
+
360
+ @container media-root (width > 42rem) {
361
+ gap: 0.125rem;
362
+ }
363
+ }
364
+
365
+ /* ==========================================================================
366
+ Icons
367
+ ========================================================================== */
368
+
369
+ .media-minimal-skin .media-icon__container {
370
+ position: relative;
371
+ }
372
+ .media-minimal-skin .media-icon {
373
+ display: block;
374
+ flex-shrink: 0;
375
+ grid-area: 1 / 1;
376
+ width: 18px;
377
+ height: 18px;
378
+ transition-behavior: allow-discrete;
379
+ transition-property: display, opacity;
380
+ transition-duration: 150ms;
381
+ transition-timing-function: ease-out;
382
+ }
383
+ .media-minimal-skin .media-icon--flipped {
384
+ scale: -1 1;
385
+ }
386
+
387
+ /* ==========================================================================
388
+ Poster Image
389
+ ========================================================================== */
390
+
391
+ .media-minimal-skin media-poster,
392
+ .media-minimal-skin > img {
393
+ position: absolute;
394
+ inset: 0;
395
+ width: 100%;
396
+ height: 100%;
397
+ transition: opacity 0.25s;
398
+ pointer-events: none;
399
+ }
400
+ .media-minimal-skin media-poster:not([data-visible]),
401
+ .media-minimal-skin > img:not([data-visible]) {
402
+ opacity: 0;
403
+ }
404
+ .media-minimal-skin media-poster ::slotted(img),
405
+ .media-minimal-skin media-poster img {
406
+ position: absolute;
407
+ inset: 0;
408
+ width: 100%;
409
+ height: 100%;
410
+ object-fit: var(--media-object-fit, contain);
411
+ object-position: var(--media-object-position, center);
412
+ border-radius: var(--media-video-border-radius);
413
+ }
414
+ .media-minimal-skin > img {
415
+ object-fit: var(--media-object-fit, contain);
416
+ object-position: var(--media-object-position, center);
417
+ border-radius: inherit;
418
+ }
419
+
420
+ .media-minimal-skin:fullscreen media-poster ::slotted(img),
421
+ .media-minimal-skin:fullscreen media-poster img,
422
+ .media-minimal-skin:fullscreen > img {
423
+ object-fit: contain;
424
+ }
425
+
426
+ /* ==========================================================================
427
+ Media preview
428
+ ========================================================================== */
429
+ .media-minimal-skin .media-preview {
430
+ pointer-events: none;
431
+
432
+ & .media-preview__thumbnail-wrapper {
433
+ position: relative;
434
+ border-radius: 0.5rem;
435
+ background-color: oklch(0 0 0 / 0.9);
436
+ }
437
+ & .media-preview__thumbnail {
438
+ display: block;
439
+ border-radius: inherit;
440
+ }
441
+
442
+ & .media-preview__time {
443
+ display: block;
444
+ text-align: center;
445
+ margin-top: 0.5rem;
446
+ }
447
+
448
+ & .media-overlay {
449
+ opacity: 1;
450
+ }
451
+
452
+ & .media-preview__spinner {
453
+ position: absolute;
454
+ top: 50%;
455
+ left: 50%;
456
+ translate: -50% -50%;
457
+ opacity: 0;
458
+ }
459
+
460
+ & .media-preview__thumbnail,
461
+ & .media-preview__spinner {
462
+ transition: opacity 150ms ease-out;
463
+ }
464
+
465
+ &:has(.media-preview__thumbnail[data-loading]) {
466
+ & .media-preview__thumbnail {
467
+ opacity: 0;
468
+ }
469
+ & .media-preview__spinner {
470
+ opacity: 1;
471
+ }
472
+ }
473
+ }
474
+
475
+ /* ==========================================================================
476
+ Slider
477
+ ========================================================================== */
478
+
479
+ .media-minimal-skin .media-slider {
480
+ position: relative;
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: center;
484
+ flex: 1;
485
+ border-radius: calc(infinity * 1px);
486
+ outline: none;
487
+ cursor: pointer;
488
+
489
+ &[data-orientation="horizontal"] {
490
+ min-width: 5rem;
491
+ width: 100%;
492
+ height: 2rem;
493
+ }
494
+
495
+ &[data-orientation="vertical"] {
496
+ width: 2rem;
497
+ height: 4.5rem;
498
+ }
499
+ }
500
+
501
+ /* Track */
502
+ .media-minimal-skin .media-slider__track {
503
+ position: relative;
504
+ isolation: isolate;
505
+ overflow: hidden;
506
+ border-radius: inherit;
507
+ user-select: none;
508
+ background-color: oklch(from currentColor l c h / 0.2);
509
+
510
+ &[data-orientation="horizontal"] {
511
+ width: 100%;
512
+ height: 0.1875rem;
513
+ }
514
+
515
+ &[data-orientation="vertical"] {
516
+ width: 0.1875rem;
517
+ height: 100%;
518
+ }
519
+ }
520
+
521
+ /* Thumb */
522
+ .media-minimal-skin .media-slider__thumb {
523
+ position: absolute;
524
+ translate: -50% -50%;
525
+ z-index: 10;
526
+ width: 0.75rem;
527
+ height: 0.75rem;
528
+ background-color: currentColor;
529
+ border-radius: calc(infinity * 1px);
530
+ box-shadow:
531
+ 0 0 0 1px var(--media-controls-current-shadow-color-subtle, oklch(0 0 0 / 0.1)),
532
+ 0 1px 3px 0 oklch(0 0 0 / 0.15),
533
+ 0 1px 2px -1px oklch(0 0 0 / 0.15);
534
+ opacity: 0;
535
+ scale: 0.7;
536
+ transform-origin: center;
537
+ transition-property: opacity, scale, outline-offset;
538
+ transition-duration: 150ms;
539
+ transition-timing-function: ease-out;
540
+ user-select: none;
541
+ outline: 2px solid transparent;
542
+ outline-offset: -2px;
543
+
544
+ &[data-orientation="horizontal"] {
545
+ top: 50%;
546
+ left: var(--media-slider-fill);
547
+ }
548
+
549
+ &[data-orientation="vertical"] {
550
+ left: 50%;
551
+ top: calc(100% - var(--media-slider-fill));
552
+ }
553
+
554
+ &:focus-visible {
555
+ outline-color: currentColor;
556
+ outline-offset: 2px;
557
+ }
558
+ }
559
+
560
+ .media-minimal-skin .media-slider:hover .media-slider__thumb,
561
+ .media-minimal-skin .media-slider:focus-within .media-slider__thumb,
562
+ .media-minimal-skin .media-slider__thumb--persistent {
563
+ opacity: 1;
564
+ scale: 1;
565
+ }
566
+
567
+ /* Shared track fills */
568
+ .media-minimal-skin .media-slider__buffer,
569
+ .media-minimal-skin .media-slider__fill {
570
+ position: absolute;
571
+ border-radius: inherit;
572
+ pointer-events: none;
573
+ }
574
+
575
+ .media-minimal-skin .media-slider__buffer[data-orientation="horizontal"],
576
+ .media-minimal-skin .media-slider__fill[data-orientation="horizontal"] {
577
+ inset-block: 0;
578
+ left: 0;
579
+ }
580
+
581
+ .media-minimal-skin .media-slider__buffer[data-orientation="vertical"],
582
+ .media-minimal-skin .media-slider__fill[data-orientation="vertical"] {
583
+ inset-inline: 0;
584
+ bottom: 0;
585
+ }
586
+
587
+ /* Buffer */
588
+ .media-minimal-skin .media-slider__buffer {
589
+ background-color: oklch(from currentColor l c h / 0.2);
590
+ transition-duration: 0.25s;
591
+ transition-timing-function: ease-out;
592
+
593
+ &[data-orientation="horizontal"] {
594
+ width: var(--media-slider-buffer);
595
+ transition-property: width;
596
+ }
597
+
598
+ &[data-orientation="vertical"] {
599
+ height: var(--media-slider-buffer);
600
+ transition-property: height;
601
+ }
602
+ }
603
+
604
+ /* Fill */
605
+ .media-minimal-skin .media-slider__fill {
606
+ background-color: currentColor;
607
+
608
+ &[data-orientation="horizontal"] {
609
+ width: var(--media-slider-fill);
610
+ }
611
+
612
+ &[data-orientation="vertical"] {
613
+ height: var(--media-slider-fill);
614
+ }
615
+ }
616
+
617
+ /* Dragging — thumb and fill follow the pointer position */
618
+ .media-minimal-skin .media-slider[data-dragging] .media-slider__thumb[data-orientation="horizontal"] {
619
+ left: var(--media-slider-pointer);
620
+ }
621
+
622
+ .media-minimal-skin .media-slider[data-dragging] .media-slider__thumb[data-orientation="vertical"] {
623
+ top: calc(100% - var(--media-slider-pointer));
624
+ }
625
+
626
+ .media-minimal-skin .media-slider[data-dragging] .media-slider__fill[data-orientation="horizontal"] {
627
+ width: var(--media-slider-pointer);
628
+ }
629
+
630
+ .media-minimal-skin .media-slider[data-dragging] .media-slider__fill[data-orientation="vertical"] {
631
+ height: var(--media-slider-pointer);
632
+ }
633
+
634
+ /* ==========================================================================
635
+ Popups & Animations
636
+ ========================================================================== */
637
+
638
+ .media-minimal-skin .media-popover,
639
+ .media-minimal-skin .media-tooltip {
640
+ margin: 0;
641
+ border: 0;
642
+ color: inherit;
643
+ overflow: visible;
644
+ transition-property: scale, opacity, filter;
645
+ transition-duration: var(--media-popup-transition-duration);
646
+ transition-timing-function: var(--media-popup-transition-timing-function);
647
+
648
+ &[data-starting-style],
649
+ &[data-ending-style] {
650
+ opacity: 0;
651
+ scale: 0.5;
652
+ filter: blur(8px);
653
+ }
654
+
655
+ &[data-instant] {
656
+ transition-duration: 0ms;
657
+ }
658
+
659
+ &[data-side="top"] {
660
+ transform-origin: bottom;
661
+ }
662
+ &[data-side="bottom"] {
663
+ transform-origin: top;
664
+ }
665
+ &[data-side="left"] {
666
+ transform-origin: right;
667
+ }
668
+ &[data-side="right"] {
669
+ transform-origin: left;
670
+ }
671
+
672
+ /* Safe area between trigger and popup */
673
+ &::before {
674
+ content: "";
675
+ position: absolute;
676
+ pointer-events: inherit;
677
+ }
678
+
679
+ &[data-side="top"]::before,
680
+ &[data-side="bottom"]::before {
681
+ width: 100%;
682
+ inset-inline: 0;
683
+ }
684
+ &[data-side="top"]::before {
685
+ top: 100%;
686
+ }
687
+ &[data-side="bottom"]::before {
688
+ bottom: 100%;
689
+ }
690
+
691
+ &[data-side="left"]::before,
692
+ &[data-side="right"]::before {
693
+ height: 100%;
694
+ inset-block: 0;
695
+ }
696
+ &[data-side="left"]::before {
697
+ left: 100%;
698
+ }
699
+ &[data-side="right"]::before {
700
+ right: 100%;
701
+ }
702
+ }
703
+
704
+ .media-minimal-skin .media-popover {
705
+ &[data-side="top"]::before,
706
+ &[data-side="bottom"]::before {
707
+ height: var(--media-popover-side-offset);
708
+ }
709
+ &[data-side="left"]::before,
710
+ &[data-side="right"]::before {
711
+ width: var(--media-popover-side-offset);
712
+ }
713
+ }
714
+
715
+ .media-minimal-skin .media-tooltip {
716
+ padding: 0.25rem 0.5rem;
717
+ border-radius: 0.5rem;
718
+ background-color: var(--media-tooltip-background-color);
719
+ backdrop-filter: var(--media-tooltip-backdrop-filter);
720
+ box-shadow:
721
+ 0 0 0 1px var(--media-tooltip-border-color),
722
+ 0 4px 6px -1px oklch(0 0 0 / 0.1),
723
+ 0 2px 4px -2px oklch(0 0 0 / 0.1);
724
+ color: var(--media-tooltip-text-color);
725
+ font-size: 0.75rem; /* 12px at 100% font size */
726
+ white-space: nowrap;
727
+
728
+ &[data-side="top"]::before,
729
+ &[data-side="bottom"]::before {
730
+ height: var(--media-tooltip-side-offset);
731
+ }
732
+ &[data-side="left"]::before,
733
+ &[data-side="right"]::before {
734
+ width: var(--media-tooltip-side-offset);
735
+ }
736
+ }
737
+
738
+ .media-minimal-skin .media-popover--volume:has(media-volume-slider[data-availability="unsupported"]) {
739
+ display: none;
740
+ }
741
+
742
+ /* ==========================================================================
743
+ Native Caption Track
744
+ ========================================================================== */
745
+
746
+ .media-minimal-skin {
747
+ --media-caption-track-duration: var(--media-controls-transition-duration);
748
+ --media-caption-track-delay: 25ms;
749
+ --media-caption-track-y: -0.5rem;
750
+
751
+ &:has(.media-controls[data-visible]) {
752
+ --media-caption-track-y: -5rem;
753
+ }
754
+
755
+ @container media-root (width > 42rem) {
756
+ &:has(.media-controls[data-visible]) > * {
757
+ --media-caption-track-y: -3rem;
758
+ }
759
+ }
760
+ }
761
+
762
+ .media-minimal-skin video::-webkit-media-text-track-container {
763
+ transition: translate var(--media-caption-track-duration) ease-out;
764
+ transition-delay: var(--media-caption-track-delay);
765
+ translate: 0 var(--media-caption-track-y);
766
+ scale: 0.98;
767
+ z-index: 1;
768
+ font-family: inherit;
769
+ }
770
+
771
+ /* ==========================================================================
772
+ Icon State Visibility for Video Skins
773
+
774
+ Data-attribute-driven visibility rules for multi-state icon buttons.
775
+ Uses :is() with both element selectors (for HTML custom element wrappers)
776
+ and class selectors (for React rendered SVG elements).
777
+ ========================================================================== */
778
+
779
+ /* --- All icons hidden by default --- */
780
+
781
+ .media-button--play .media-icon--restart,
782
+ .media-button--play .media-icon--play,
783
+ .media-button--play .media-icon--pause,
784
+ .media-button--mute .media-icon--volume-off,
785
+ .media-button--mute .media-icon--volume-low,
786
+ .media-button--mute .media-icon--volume-high,
787
+ .media-button--fullscreen .media-icon--fullscreen-enter,
788
+ .media-button--fullscreen .media-icon--fullscreen-exit,
789
+ .media-button--pip .media-icon--pip-enter,
790
+ .media-button--pip .media-icon--pip-exit,
791
+ .media-button--cast .media-icon--cast-enter,
792
+ .media-button--cast .media-icon--cast-exit,
793
+ .media-button--captions .media-icon--captions-off,
794
+ .media-button--captions .media-icon--captions-on {
795
+ display: none;
796
+ opacity: 0;
797
+ }
798
+
799
+ /* --- Active icon per state --- */
800
+
801
+ /* Play: ended → restart */
802
+ .media-button--play[data-ended] .media-icon--restart,
803
+ /* Play: paused (not ended) → play */
804
+ .media-button--play:not([data-ended])[data-paused] .media-icon--play,
805
+ /* Play: playing (not paused, not ended) → pause */
806
+ .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
807
+ /* Mute: muted → volume off */
808
+ .media-button--mute[data-muted] .media-icon--volume-off,
809
+ /* Mute: volume low (not muted) → volume low */
810
+ .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
811
+ /* Mute: volume high (not muted, not low) → volume high */
812
+ .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high,
813
+ /* Fullscreen: not fullscreen → enter */
814
+ .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,
815
+ /* Fullscreen: fullscreen → exit */
816
+ .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,
817
+ /* Picture-in-Picture: not active → enter */
818
+ .media-button--pip:not([data-pip]) .media-icon--pip-enter,
819
+ /* Picture-in-Picture: active → exit */
820
+ .media-button--pip[data-pip] .media-icon--pip-exit,
821
+ /* Cast: not connected → enter */
822
+ .media-button--cast:not([data-cast-state="connected"]) .media-icon--cast-enter,
823
+ /* Cast: connected → exit */
824
+ .media-button--cast[data-cast-state="connected"] .media-icon--cast-exit,
825
+ /* Captions: not active → captions off */
826
+ .media-button--captions:not([data-active]) .media-icon--captions-off,
827
+ /* Captions: active → captions on */
828
+ .media-button--captions[data-active] .media-icon--captions-on {
829
+ display: block;
830
+ opacity: 1;
831
+ }
832
+
833
+
834
+ /* ==========================================================================
835
+ Root
836
+ ========================================================================== */
837
+
838
+ .media-minimal-skin--video {
839
+ overflow: clip;
840
+ background: oklch(0 0 0);
841
+ --media-border-color: oklch(0 0 0 / 0.15);
842
+ --media-video-border-radius: var(--media-border-radius, 0.75rem);
843
+ --media-controls-background-color: transparent;
844
+ --media-controls-transition-duration: 100ms;
845
+ --media-controls-transition-timing-function: ease-out;
846
+ --media-error-dialog-transition-duration: 150ms;
847
+ --media-error-dialog-transition-delay: 100ms;
848
+ --media-error-dialog-transition-timing-function: ease-out;
849
+ --media-popup-transition-duration: 100ms;
850
+ --media-popup-transition-timing-function: ease-out;
851
+ --media-tooltip-background-color: oklch(1 0 0 / 0.1);
852
+ --media-tooltip-border-color: transparent;
853
+ --media-tooltip-backdrop-filter: blur(16px) saturate(1.5);
854
+ --media-tooltip-text-color: currentColor;
855
+ --media-tooltip-side-offset: 0.5rem;
856
+ --media-popover-side-offset: 1.5rem;
857
+
858
+ @media (prefers-reduced-motion: reduce) {
859
+ --media-error-dialog-transition-duration: 50ms;
860
+ --media-error-dialog-transition-delay: 0ms;
861
+ --media-popup-transition-duration: 0ms;
862
+ }
863
+
864
+ @media (prefers-color-scheme: dark) {
865
+ --media-border-color: oklch(1 0 0 / 0.15);
866
+ }
867
+
868
+ @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
869
+ --media-controls-background-color: oklch(0 0 0);
870
+ --media-tooltip-background-color: oklch(0 0 0);
871
+ }
872
+
873
+ @container media-root (width > 42rem) {
874
+ & > * {
875
+ --media-popover-side-offset: 0rem;
876
+ }
877
+ }
878
+
879
+ &:has(.media-controls:not([data-visible])) {
880
+ /* Slight delay to hide controls on non-touch devices after interaction */
881
+ @media (pointer: fine) {
882
+ --media-controls-transition-duration: 300ms;
883
+ }
884
+ @media (pointer: coarse) {
885
+ --media-controls-transition-duration: 150ms;
886
+ }
887
+ @media (prefers-reduced-motion: reduce) {
888
+ --media-controls-transition-duration: 50ms;
889
+ }
890
+ }
891
+
892
+ /* Inner border ring */
893
+ &::after {
894
+ content: "";
895
+ position: absolute;
896
+ inset: 0;
897
+ z-index: 10;
898
+ border-radius: inherit;
899
+ box-shadow: inset 0 0 0 1px var(--media-border-color);
900
+ pointer-events: none;
901
+ }
902
+
903
+ /* Fullscreen */
904
+ &:fullscreen {
905
+ --media-border-radius: 0;
906
+ }
907
+ }
908
+
909
+ /* ==========================================================================
910
+ Error Dialog
911
+ ========================================================================== */
912
+
913
+ .media-minimal-skin--video .media-error {
914
+ position: absolute;
915
+ inset: 0;
916
+ z-index: 20;
917
+ display: flex;
918
+ align-items: center;
919
+ justify-content: center;
920
+ pointer-events: none;
921
+ outline: none;
922
+ }
923
+
924
+ .media-minimal-skin--video .media-error__dialog {
925
+ display: flex;
926
+ flex-direction: column;
927
+ gap: 0.75rem;
928
+ max-width: 16rem;
929
+ padding: 1rem;
930
+ color: oklch(1 0 0);
931
+ text-shadow: 0 1px 0 oklch(0 0 0 / 0.5);
932
+ transition-property: opacity, scale;
933
+ transition-duration: var(--media-error-dialog-transition-duration);
934
+ transition-delay: var(--media-error-dialog-transition-delay);
935
+ transition-timing-function: var(--media-error-dialog-transition-timing-function);
936
+ pointer-events: auto;
937
+ }
938
+
939
+ .media-minimal-skin--video .media-error[data-starting-style] .media-error__dialog,
940
+ .media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {
941
+ opacity: 0;
942
+ scale: 0.5;
943
+ }
944
+ .media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {
945
+ transition-delay: 0ms;
946
+ }
947
+
948
+ .media-minimal-skin--video .media-error__content {
949
+ display: flex;
950
+ flex-direction: column;
951
+ gap: 0.5rem;
952
+ padding: 0.375rem 0;
953
+ }
954
+
955
+ .media-minimal-skin--video .media-error__title {
956
+ font-size: 1.125rem;
957
+ }
958
+
959
+ .media-minimal-skin--video .media-error[data-open] ~ .media-controls {
960
+ display: none;
961
+ }
962
+
963
+ /* ==========================================================================
964
+ Controls (hide/show behavior)
965
+ ========================================================================== */
966
+
967
+ .media-minimal-skin--video .media-controls {
968
+ padding: 0.25rem;
969
+ column-gap: 0.5rem;
970
+ flex-wrap: wrap;
971
+ position: absolute;
972
+ bottom: 0.25rem;
973
+ inset-inline: 0.25rem;
974
+ z-index: 10;
975
+ color: oklch(1 0 0);
976
+ border-radius: 0.75rem;
977
+ transition-duration: var(--media-controls-transition-duration);
978
+ transition-timing-function: var(--media-controls-transition-timing-function);
979
+
980
+ @media (pointer: fine) {
981
+ will-change: translate, filter, opacity;
982
+ transition-property: translate, filter, opacity;
983
+ }
984
+
985
+ @media (pointer: coarse) {
986
+ will-change: translate, opacity;
987
+ transition-property: translate, opacity;
988
+ }
989
+
990
+ &:not([data-visible]) {
991
+ opacity: 0;
992
+ pointer-events: none;
993
+ translate: 0 100%;
994
+
995
+ @media (pointer: fine) {
996
+ filter: blur(8px);
997
+ }
998
+
999
+ @media (prefers-reduced-motion: reduce) {
1000
+ translate: 0 0;
1001
+ filter: blur(0);
1002
+ }
1003
+ }
1004
+
1005
+ & .media-time-controls {
1006
+ order: -1;
1007
+ flex: 0 0 100%;
1008
+ padding-inline: 0.625rem;
1009
+ }
1010
+
1011
+ & .media-button-group:first-child {
1012
+ flex: 1;
1013
+ text-align: left;
1014
+ }
1015
+
1016
+ & .media-button-group:last-child {
1017
+ flex: 1;
1018
+ justify-content: end;
1019
+ }
1020
+
1021
+ @container media-root (width > 42rem) {
1022
+ flex-wrap: nowrap;
1023
+ bottom: 0.5rem;
1024
+ inset-inline: 0.5rem;
1025
+
1026
+ & .media-time-controls {
1027
+ order: unset;
1028
+ flex: 1;
1029
+ }
1030
+
1031
+ & .media-button-group:first-child,
1032
+ & .media-button-group:last-child {
1033
+ flex: 0 0 auto;
1034
+ }
1035
+ }
1036
+ }
1037
+
1038
+ /* Hide cursor when controls are hidden */
1039
+ .media-minimal-skin--video:has(.media-controls:not([data-visible])) {
1040
+ cursor: none;
1041
+ }
1042
+
1043
+ /* ==========================================================================
1044
+ Sliders
1045
+ ========================================================================== */
1046
+
1047
+ .media-minimal-skin--video .media-slider__track {
1048
+ box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
1049
+ }
1050
+
1051
+ /* ==========================================================================
1052
+ Popups & Animations
1053
+ ========================================================================== */
1054
+
1055
+ .media-minimal-skin--video .media-popover--volume {
1056
+ background: transparent;
1057
+ padding-block: 0.75rem;
1058
+ border-radius: 0.75rem;
1059
+
1060
+ @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
1061
+ background: var(--media-controls-background-color);
1062
+ }
1063
+ }
1064
+
1065
+ /* ==========================================================================
1066
+ Slider preview
1067
+ ========================================================================== */
1068
+
1069
+ .media-minimal-skin--video .media-slider__preview {
1070
+ --media-preview-max-width: 11rem;
1071
+ --media-preview-padding: -0.5rem;
1072
+ /**
1073
+ Inset is the difference between the container width and the slider (100%) width.
1074
+ We only add to the end as we render the time there.
1075
+ */
1076
+ --media-preview-inset: calc(100cqi - 100%);
1077
+
1078
+ position: absolute;
1079
+ left: clamp(
1080
+ calc(var(--media-preview-max-width) / 2 + var(--media-preview-padding)),
1081
+ var(--media-slider-pointer),
1082
+ calc(100% - var(--media-preview-max-width) / 2 - var(--media-preview-padding) + var(--media-preview-inset))
1083
+ );
1084
+ bottom: 100%;
1085
+ translate: -50%;
1086
+ opacity: 0;
1087
+ scale: 0.8;
1088
+ filter: blur(8px);
1089
+ transition-property: scale, opacity, filter;
1090
+ transition-duration: 150ms;
1091
+ transition-timing-function: ease-out;
1092
+ transform-origin: bottom;
1093
+
1094
+ @container media-root (width > 42rem) {
1095
+ bottom: calc(100% + 0.25rem);
1096
+ left: var(--media-slider-pointer);
1097
+ }
1098
+
1099
+ & .media-preview__thumbnail-wrapper {
1100
+ position: relative;
1101
+
1102
+ &::after {
1103
+ content: "";
1104
+ position: absolute;
1105
+ inset: 0;
1106
+ border-radius: inherit;
1107
+ box-shadow:
1108
+ 0 0 0 1px oklch(0 0 0 / 0.05),
1109
+ 0 1px 3px 0 oklch(0 0 0 / 0.2),
1110
+ 0 1px 2px -1px oklch(0 0 0 / 0.2);
1111
+ }
1112
+ }
1113
+
1114
+ & .media-preview__thumbnail {
1115
+ max-width: var(--media-preview-max-width);
1116
+ }
1117
+
1118
+ &:has(.media-preview__thumbnail[data-loading]) {
1119
+ max-height: 6rem;
1120
+ }
1121
+ }
1122
+ .media-minimal-skin--video .media-slider[data-pointing] .media-slider__preview:has([role="img"]:not([data-hidden])) {
1123
+ opacity: 1;
1124
+ scale: 1;
1125
+ filter: blur(0);
1126
+ }
1127
+