@videojs/html 10.0.0-alpha.9 → 10.0.0-beta.10

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