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