@videojs/react 10.0.0-beta.26 → 10.0.0-beta.27

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 (1027) hide show
  1. package/dist/default/__generated__/skins/default-video/styles/base.css +25 -0
  2. package/dist/default/__generated__/skins/default-video/styles/buttons.css +152 -0
  3. package/dist/default/__generated__/skins/default-video/styles/container.css +45 -0
  4. package/dist/default/__generated__/skins/default-video/styles/controls.css +45 -0
  5. package/dist/default/__generated__/skins/default-video/styles/overlays.css +11 -0
  6. package/dist/default/__generated__/skins/default-video/styles/popups.css +45 -0
  7. package/dist/default/__generated__/skins/default-video/styles/poster.css +47 -0
  8. package/dist/default/__generated__/skins/default-video/styles/sliders.css +112 -0
  9. package/dist/default/__generated__/skins/default-video/styles/styles.css +514 -0
  10. package/dist/default/__generated__/skins/default-video/styles/theme.css +22 -0
  11. package/dist/default/i18n/context.js +3 -3
  12. package/dist/default/i18n/context.js.map +1 -1
  13. package/dist/default/i18n/locales/id/register.js +8 -0
  14. package/dist/default/i18n/locales/id/register.js.map +1 -0
  15. package/dist/default/i18n/locales/id.js +2 -0
  16. package/dist/default/i18n/locales/lt/register.js +8 -0
  17. package/dist/default/i18n/locales/lt/register.js.map +1 -0
  18. package/dist/default/i18n/locales/lt.js +2 -0
  19. package/dist/default/icons/dist/react/default/airplay-enter.js.map +1 -1
  20. package/dist/default/icons/dist/react/default/airplay-exit.js +1 -2
  21. package/dist/default/icons/dist/react/default/airplay-exit.js.map +1 -1
  22. package/dist/default/icons/dist/react/default/captions-off.js.map +1 -1
  23. package/dist/default/icons/dist/react/default/captions-on.js.map +1 -1
  24. package/dist/default/icons/dist/react/default/cast-enter.js +2 -45
  25. package/dist/default/icons/dist/react/default/cast-enter.js.map +1 -1
  26. package/dist/default/icons/dist/react/default/cast-exit.js +4 -61
  27. package/dist/default/icons/dist/react/default/cast-exit.js.map +1 -1
  28. package/dist/default/icons/dist/react/default/check.js.map +1 -1
  29. package/dist/default/icons/dist/react/default/chevron.js.map +1 -1
  30. package/dist/default/icons/dist/react/default/fullscreen-enter.js.map +1 -1
  31. package/dist/default/icons/dist/react/default/fullscreen-exit.js.map +1 -1
  32. package/dist/default/icons/dist/react/default/gear.js.map +1 -1
  33. package/dist/default/icons/dist/react/default/pause.js.map +1 -1
  34. package/dist/default/icons/dist/react/default/pip-enter.js.map +1 -1
  35. package/dist/default/icons/dist/react/default/pip-exit.js.map +1 -1
  36. package/dist/default/icons/dist/react/default/play.js.map +1 -1
  37. package/dist/default/icons/dist/react/default/quality.js +1 -1
  38. package/dist/default/icons/dist/react/default/quality.js.map +1 -1
  39. package/dist/default/icons/dist/react/default/restart.js.map +1 -1
  40. package/dist/default/icons/dist/react/default/seek.js.map +1 -1
  41. package/dist/default/icons/dist/react/default/speech.js.map +1 -1
  42. package/dist/default/icons/dist/react/default/speed.js.map +1 -1
  43. package/dist/default/icons/dist/react/default/spinner.js +1 -1
  44. package/dist/default/icons/dist/react/default/spinner.js.map +1 -1
  45. package/dist/default/icons/dist/react/default/switches.js.map +1 -1
  46. package/dist/default/icons/dist/react/default/volume-high.js.map +1 -1
  47. package/dist/default/icons/dist/react/default/volume-low.js.map +1 -1
  48. package/dist/default/icons/dist/react/default/volume-off.js.map +1 -1
  49. package/dist/default/icons/dist/react/minimal/airplay-enter.js.map +1 -1
  50. package/dist/default/icons/dist/react/minimal/airplay-exit.js +1 -2
  51. package/dist/default/icons/dist/react/minimal/airplay-exit.js.map +1 -1
  52. package/dist/default/icons/dist/react/minimal/captions-off.js.map +1 -1
  53. package/dist/default/icons/dist/react/minimal/captions-on.js.map +1 -1
  54. package/dist/default/icons/dist/react/minimal/cast-enter.js +2 -45
  55. package/dist/default/icons/dist/react/minimal/cast-enter.js.map +1 -1
  56. package/dist/default/icons/dist/react/minimal/cast-exit.js +4 -61
  57. package/dist/default/icons/dist/react/minimal/cast-exit.js.map +1 -1
  58. package/dist/default/icons/dist/react/minimal/check.js.map +1 -1
  59. package/dist/default/icons/dist/react/minimal/chevron.js.map +1 -1
  60. package/dist/default/icons/dist/react/minimal/fullscreen-enter.js.map +1 -1
  61. package/dist/default/icons/dist/react/minimal/fullscreen-exit.js.map +1 -1
  62. package/dist/default/icons/dist/react/minimal/gear.js.map +1 -1
  63. package/dist/default/icons/dist/react/minimal/pause.js.map +1 -1
  64. package/dist/default/icons/dist/react/minimal/pip-enter.js.map +1 -1
  65. package/dist/default/icons/dist/react/minimal/pip-exit.js.map +1 -1
  66. package/dist/default/icons/dist/react/minimal/play.js.map +1 -1
  67. package/dist/default/icons/dist/react/minimal/quality.js +1 -1
  68. package/dist/default/icons/dist/react/minimal/quality.js.map +1 -1
  69. package/dist/default/icons/dist/react/minimal/restart.js.map +1 -1
  70. package/dist/default/icons/dist/react/minimal/seek.js.map +1 -1
  71. package/dist/default/icons/dist/react/minimal/speech.js +7 -40
  72. package/dist/default/icons/dist/react/minimal/speech.js.map +1 -1
  73. package/dist/default/icons/dist/react/minimal/speed.js.map +1 -1
  74. package/dist/default/icons/dist/react/minimal/spinner.js +1 -1
  75. package/dist/default/icons/dist/react/minimal/spinner.js.map +1 -1
  76. package/dist/default/icons/dist/react/minimal/switches.js.map +1 -1
  77. package/dist/default/icons/dist/react/minimal/volume-high.js.map +1 -1
  78. package/dist/default/icons/dist/react/minimal/volume-low.js.map +1 -1
  79. package/dist/default/icons/dist/react/minimal/volume-off.js.map +1 -1
  80. package/dist/default/index.js +7 -3
  81. package/dist/default/media/cloudflare-video/index.js +2 -0
  82. package/dist/default/media/cloudflare-video/media.js +38 -0
  83. package/dist/default/media/cloudflare-video/media.js.map +1 -0
  84. package/dist/default/media/google-cast/google-cast.js +3 -3
  85. package/dist/default/media/google-cast/google-cast.js.map +1 -1
  86. package/dist/default/media/hls-audio/index.js +2 -0
  87. package/dist/default/media/hls-audio/media.js +21 -0
  88. package/dist/default/media/hls-audio/media.js.map +1 -0
  89. package/dist/default/media/hls-background-video/index.js +2 -0
  90. package/dist/default/media/hls-background-video/media.js +45 -0
  91. package/dist/default/media/hls-background-video/media.js.map +1 -0
  92. package/dist/default/media/hls-video/index.js +2 -0
  93. package/dist/{dev/media/simple-hls-video → default/media/hls-video}/media.js +6 -7
  94. package/dist/default/media/hls-video/media.js.map +1 -0
  95. package/dist/default/media/mux-audio/{media.js → hls-js.js} +2 -2
  96. package/dist/default/media/mux-audio/hls-js.js.map +1 -0
  97. package/dist/default/media/mux-audio/index.js +1 -1
  98. package/dist/default/media/mux-audio/spf.js +26 -0
  99. package/dist/default/media/mux-audio/spf.js.map +1 -0
  100. package/dist/default/media/mux-background-video/index.js +2 -0
  101. package/dist/default/media/mux-data/mux-data.js +7 -3
  102. package/dist/default/media/mux-data/mux-data.js.map +1 -1
  103. package/dist/default/media/mux-video/hls-js.js +27 -0
  104. package/dist/default/media/mux-video/hls-js.js.map +1 -0
  105. package/dist/default/media/mux-video/index.js +1 -1
  106. package/dist/default/media/mux-video/spf.js +27 -0
  107. package/dist/default/media/mux-video/spf.js.map +1 -0
  108. package/dist/default/media/mux-video/storyboard.js +43 -0
  109. package/dist/default/media/mux-video/storyboard.js.map +1 -0
  110. package/dist/default/media/spotify-audio/index.js +2 -0
  111. package/dist/default/media/spotify-audio/media.js +40 -0
  112. package/dist/default/media/spotify-audio/media.js.map +1 -0
  113. package/dist/default/media/tiktok-video/index.js +2 -0
  114. package/dist/default/media/tiktok-video/media.js +38 -0
  115. package/dist/default/media/tiktok-video/media.js.map +1 -0
  116. package/dist/default/media/twitch-video/index.js +2 -0
  117. package/dist/default/media/twitch-video/media.js +38 -0
  118. package/dist/default/media/twitch-video/media.js.map +1 -0
  119. package/dist/default/media/vimeo-video/media.js +4 -4
  120. package/dist/default/media/vimeo-video/media.js.map +1 -1
  121. package/dist/default/media/youtube-video/index.js +2 -0
  122. package/dist/default/media/youtube-video/media.js +37 -0
  123. package/dist/default/media/youtube-video/media.js.map +1 -0
  124. package/dist/default/player/container.js +8 -3
  125. package/dist/default/player/container.js.map +1 -1
  126. package/dist/default/player/context.js +6 -10
  127. package/dist/default/player/context.js.map +1 -1
  128. package/dist/default/player/create-player.js +44 -13
  129. package/dist/default/player/create-player.js.map +1 -1
  130. package/dist/default/player/popup-group-context.js +18 -0
  131. package/dist/default/player/popup-group-context.js.map +1 -0
  132. package/dist/default/presets/audio/index.js +8 -1
  133. package/dist/default/presets/audio/index.js.map +1 -0
  134. package/dist/default/presets/audio/minimal-skin.css +426 -295
  135. package/dist/default/presets/audio/minimal-skin.js +12 -19
  136. package/dist/default/presets/audio/minimal-skin.js.map +1 -1
  137. package/dist/default/presets/audio/minimal-skin.tailwind.js +81 -20
  138. package/dist/default/presets/audio/minimal-skin.tailwind.js.map +1 -1
  139. package/dist/default/presets/audio/player.js +13 -0
  140. package/dist/default/presets/audio/player.js.map +1 -0
  141. package/dist/default/presets/audio/skin.css +458 -341
  142. package/dist/default/presets/audio/skin.js +13 -19
  143. package/dist/default/presets/audio/skin.js.map +1 -1
  144. package/dist/default/presets/audio/skin.tailwind.js +14 -19
  145. package/dist/default/presets/audio/skin.tailwind.js.map +1 -1
  146. package/dist/default/presets/background/index.js +8 -1
  147. package/dist/default/presets/background/index.js.map +1 -0
  148. package/dist/default/presets/background/player.js +13 -0
  149. package/dist/default/presets/background/player.js.map +1 -0
  150. package/dist/default/presets/background/skin.css +3 -3
  151. package/dist/default/presets/live-audio/index.js +8 -1
  152. package/dist/default/presets/live-audio/index.js.map +1 -0
  153. package/dist/default/presets/live-audio/minimal-skin.css +426 -295
  154. package/dist/default/presets/live-audio/minimal-skin.js +2 -2
  155. package/dist/default/presets/live-audio/minimal-skin.js.map +1 -1
  156. package/dist/default/presets/live-audio/minimal-skin.tailwind.js +4 -4
  157. package/dist/default/presets/live-audio/minimal-skin.tailwind.js.map +1 -1
  158. package/dist/default/presets/live-audio/player.js +13 -0
  159. package/dist/default/presets/live-audio/player.js.map +1 -0
  160. package/dist/default/presets/live-audio/skin.css +458 -341
  161. package/dist/default/presets/live-audio/skin.js +2 -2
  162. package/dist/default/presets/live-audio/skin.js.map +1 -1
  163. package/dist/default/presets/live-audio/skin.tailwind.js +4 -4
  164. package/dist/default/presets/live-audio/skin.tailwind.js.map +1 -1
  165. package/dist/default/presets/live-video/index.js +8 -1
  166. package/dist/default/presets/live-video/index.js.map +1 -0
  167. package/dist/default/presets/live-video/minimal-skin.css +655 -588
  168. package/dist/default/presets/live-video/minimal-skin.js +12 -12
  169. package/dist/default/presets/live-video/minimal-skin.js.map +1 -1
  170. package/dist/default/presets/live-video/minimal-skin.tailwind.js +27 -26
  171. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  172. package/dist/default/presets/live-video/player.js +13 -0
  173. package/dist/default/presets/live-video/player.js.map +1 -0
  174. package/dist/default/presets/live-video/skin.css +656 -618
  175. package/dist/default/presets/live-video/skin.js +11 -11
  176. package/dist/default/presets/live-video/skin.js.map +1 -1
  177. package/dist/default/presets/live-video/skin.tailwind.js +24 -112
  178. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -1
  179. package/dist/default/presets/video/index.js +8 -1
  180. package/dist/default/presets/video/index.js.map +1 -0
  181. package/dist/default/presets/video/minimal-skin.css +655 -588
  182. package/dist/default/presets/video/minimal-skin.js +212 -211
  183. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  184. package/dist/default/presets/video/minimal-skin.tailwind.js +226 -233
  185. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  186. package/dist/default/presets/video/player.js +13 -0
  187. package/dist/default/presets/video/player.js.map +1 -0
  188. package/dist/default/presets/video/skin.css +656 -618
  189. package/dist/default/presets/video/skin.js +212 -207
  190. package/dist/default/presets/video/skin.js.map +1 -1
  191. package/dist/default/presets/video/skin.tailwind.js +224 -227
  192. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  193. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +6 -6
  194. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  195. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  196. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  197. package/dist/default/skins/dist/default/default/tailwind/components/button.js +4 -4
  198. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  199. package/dist/default/skins/dist/default/default/tailwind/components/container.js +8 -0
  200. package/dist/default/skins/dist/default/default/tailwind/components/container.js.map +1 -0
  201. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +1 -1
  202. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  203. package/dist/default/skins/dist/default/default/tailwind/components/error.js +1 -1
  204. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  205. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -1
  206. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  207. package/dist/default/skins/dist/default/default/tailwind/components/input-indicator-overlay.js +7 -0
  208. package/dist/default/skins/dist/default/default/tailwind/components/input-indicator-overlay.js.map +1 -0
  209. package/dist/default/skins/dist/default/default/tailwind/components/input-indicator.js +9 -0
  210. package/dist/default/skins/dist/default/default/tailwind/components/input-indicator.js.map +1 -0
  211. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +8 -12
  212. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  213. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  214. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  215. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +1 -1
  216. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  217. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +1 -1
  218. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  219. package/dist/default/skins/dist/default/default/tailwind/components/seek-indicator.js +12 -0
  220. package/dist/default/skins/dist/default/default/tailwind/components/seek-indicator.js.map +1 -0
  221. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +17 -9
  222. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  223. package/dist/default/skins/dist/default/default/tailwind/components/status-indicator.js +29 -0
  224. package/dist/default/skins/dist/default/default/tailwind/components/status-indicator.js.map +1 -0
  225. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +1 -1
  226. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  227. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +3 -4
  228. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  229. package/dist/default/skins/dist/default/default/tailwind/components/time.js +2 -2
  230. package/dist/default/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  231. package/dist/default/skins/dist/default/default/tailwind/components/volume-indicator.js +18 -0
  232. package/dist/default/skins/dist/default/default/tailwind/components/volume-indicator.js.map +1 -0
  233. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +22 -19
  234. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  235. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +6 -6
  236. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  237. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  238. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  239. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +4 -4
  240. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  241. package/dist/default/skins/dist/default/minimal/tailwind/components/container.js +8 -0
  242. package/dist/default/skins/dist/default/minimal/tailwind/components/container.js.map +1 -0
  243. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  244. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  245. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +1 -1
  246. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  247. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  248. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  249. package/dist/default/skins/dist/default/minimal/tailwind/components/input-indicator-overlay.js +7 -0
  250. package/dist/default/skins/dist/default/minimal/tailwind/components/input-indicator-overlay.js.map +1 -0
  251. package/dist/default/skins/dist/default/minimal/tailwind/components/input-indicator.js +10 -0
  252. package/dist/default/skins/dist/default/minimal/tailwind/components/input-indicator.js.map +1 -0
  253. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +9 -13
  254. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  255. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  256. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  257. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +2 -2
  258. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  259. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +1 -1
  260. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  261. package/dist/default/skins/dist/default/minimal/tailwind/components/seek-indicator.js +12 -0
  262. package/dist/default/skins/dist/default/minimal/tailwind/components/seek-indicator.js.map +1 -0
  263. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +17 -9
  264. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  265. package/dist/default/skins/dist/default/minimal/tailwind/components/status-indicator.js +29 -0
  266. package/dist/default/skins/dist/default/minimal/tailwind/components/status-indicator.js.map +1 -0
  267. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +3 -5
  268. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  269. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +2 -2
  270. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  271. package/dist/default/skins/dist/default/minimal/tailwind/components/volume-indicator.js +19 -0
  272. package/dist/default/skins/dist/default/minimal/tailwind/components/volume-indicator.js.map +1 -0
  273. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +14 -15
  274. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  275. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +22 -20
  276. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  277. package/dist/default/ui/audio-track/use-audio-track-options.js +8 -23
  278. package/dist/default/ui/audio-track/use-audio-track-options.js.map +1 -1
  279. package/dist/default/ui/audio-track-radio-group/audio-track-radio-group.js +65 -0
  280. package/dist/default/ui/audio-track-radio-group/audio-track-radio-group.js.map +1 -0
  281. package/dist/default/ui/audio-track-radio-group/index.js +2 -0
  282. package/dist/default/ui/captions-radio-group/captions-radio-group.js +65 -0
  283. package/dist/default/ui/captions-radio-group/captions-radio-group.js.map +1 -0
  284. package/dist/default/ui/captions-radio-group/index.js +2 -1
  285. package/dist/default/ui/captions-radio-group/use-captions-options.js +12 -29
  286. package/dist/default/ui/captions-radio-group/use-captions-options.js.map +1 -1
  287. package/dist/default/ui/hooks/create-radio-options-hook.js +43 -0
  288. package/dist/default/ui/hooks/create-radio-options-hook.js.map +1 -0
  289. package/dist/default/ui/hooks/use-slider.js +49 -13
  290. package/dist/default/ui/hooks/use-slider.js.map +1 -1
  291. package/dist/{dev/ui/input-indicators → default/ui/input-indicator}/use-indicator-visibility.js +1 -1
  292. package/dist/default/ui/input-indicator/use-indicator-visibility.js.map +1 -0
  293. package/dist/default/ui/{input-indicators → input-indicator}/use-input-action-subscription.js +1 -1
  294. package/dist/default/ui/input-indicator/use-input-action-subscription.js.map +1 -0
  295. package/dist/default/ui/{input-indicators → input-indicator}/use-input-indicator-root.js +1 -1
  296. package/dist/default/ui/input-indicator/use-input-indicator-root.js.map +1 -0
  297. package/dist/default/ui/{input-indicators → input-indicator}/use-rendered-indicator-state.js +1 -1
  298. package/dist/default/ui/input-indicator/use-rendered-indicator-state.js.map +1 -0
  299. package/dist/default/ui/menu/context.js +1 -11
  300. package/dist/default/ui/menu/context.js.map +1 -1
  301. package/dist/default/ui/menu/index.parts.js +3 -9
  302. package/dist/default/ui/menu/index.parts.js.map +1 -1
  303. package/dist/default/ui/menu/menu-checkbox-item.js +4 -1
  304. package/dist/default/ui/menu/menu-checkbox-item.js.map +1 -1
  305. package/dist/default/ui/menu/menu-content.js +78 -236
  306. package/dist/default/ui/menu/menu-content.js.map +1 -1
  307. package/dist/default/ui/menu/menu-item.js +11 -18
  308. package/dist/default/ui/menu/menu-item.js.map +1 -1
  309. package/dist/default/ui/menu/menu-keyboard.js +31 -0
  310. package/dist/default/ui/menu/menu-keyboard.js.map +1 -0
  311. package/dist/default/ui/menu/menu-radio-item.js +8 -6
  312. package/dist/default/ui/menu/menu-radio-item.js.map +1 -1
  313. package/dist/default/ui/menu/menu-root.js +46 -61
  314. package/dist/default/ui/menu/menu-root.js.map +1 -1
  315. package/dist/default/ui/menu/menu-trigger.js +50 -87
  316. package/dist/default/ui/menu/menu-trigger.js.map +1 -1
  317. package/dist/default/ui/mute-button/mute-button.js +2 -1
  318. package/dist/default/ui/mute-button/mute-button.js.map +1 -1
  319. package/dist/default/ui/playback-rate/use-playback-rate-options.js +14 -22
  320. package/dist/default/ui/playback-rate/use-playback-rate-options.js.map +1 -1
  321. package/dist/default/ui/playback-rate-radio-group/index.js +2 -0
  322. package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group.js +65 -0
  323. package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group.js.map +1 -0
  324. package/dist/default/ui/popover/popover-popup.js +10 -80
  325. package/dist/default/ui/popover/popover-popup.js.map +1 -1
  326. package/dist/default/ui/popover/popover-root.js +2 -1
  327. package/dist/default/ui/popover/popover-root.js.map +1 -1
  328. package/dist/default/ui/popover/popover-trigger.js +4 -5
  329. package/dist/default/ui/popover/popover-trigger.js.map +1 -1
  330. package/dist/default/ui/popover/use-popup-position.js +34 -0
  331. package/dist/default/ui/popover/use-popup-position.js.map +1 -0
  332. package/dist/default/ui/poster/poster.js +8 -4
  333. package/dist/default/ui/poster/poster.js.map +1 -1
  334. package/dist/default/ui/quality/use-quality-options.js +9 -30
  335. package/dist/default/ui/quality/use-quality-options.js.map +1 -1
  336. package/dist/default/ui/quality-radio-group/index.js +2 -0
  337. package/dist/default/ui/quality-radio-group/quality-radio-group.js +66 -0
  338. package/dist/default/ui/quality-radio-group/quality-radio-group.js.map +1 -0
  339. package/dist/default/ui/seek-indicator/seek-indicator-root.js +1 -1
  340. package/dist/default/ui/seek-indicator/seek-indicator-root.js.map +1 -1
  341. package/dist/default/ui/slider/context.js +7 -2
  342. package/dist/default/ui/slider/context.js.map +1 -1
  343. package/dist/default/ui/slider/slider-preview.js +2 -3
  344. package/dist/default/ui/slider/slider-preview.js.map +1 -1
  345. package/dist/default/ui/slider/slider-root.js +3 -1
  346. package/dist/default/ui/slider/slider-root.js.map +1 -1
  347. package/dist/default/ui/slider/slider-thumbnail.js +2 -2
  348. package/dist/default/ui/slider/slider-thumbnail.js.map +1 -1
  349. package/dist/default/ui/slider/slider-value.js +3 -2
  350. package/dist/default/ui/slider/slider-value.js.map +1 -1
  351. package/dist/default/ui/status-announcer/status-announcer.js +7 -4
  352. package/dist/default/ui/status-announcer/status-announcer.js.map +1 -1
  353. package/dist/default/ui/status-indicator/status-indicator-root.js +2 -2
  354. package/dist/default/ui/status-indicator/status-indicator-root.js.map +1 -1
  355. package/dist/default/ui/time/time-value.js +13 -5
  356. package/dist/default/ui/time/time-value.js.map +1 -1
  357. package/dist/default/ui/time-slider/index.parts.js +5 -1
  358. package/dist/default/ui/time-slider/index.parts.js.map +1 -1
  359. package/dist/default/ui/time-slider/time-slider-chapters/slider-segments.js +61 -0
  360. package/dist/default/ui/time-slider/time-slider-chapters/slider-segments.js.map +1 -0
  361. package/dist/default/ui/time-slider/time-slider-chapters/time-slider-chapter-title.js +46 -0
  362. package/dist/default/ui/time-slider/time-slider-chapters/time-slider-chapter-title.js.map +1 -0
  363. package/dist/default/ui/time-slider/time-slider-chapters/time-slider-chapters.js +52 -0
  364. package/dist/default/ui/time-slider/time-slider-chapters/time-slider-chapters.js.map +1 -0
  365. package/dist/default/ui/time-slider/time-slider-root.js +6 -4
  366. package/dist/default/ui/time-slider/time-slider-root.js.map +1 -1
  367. package/dist/default/ui/tooltip/tooltip-popup.js +13 -82
  368. package/dist/default/ui/tooltip/tooltip-popup.js.map +1 -1
  369. package/dist/default/ui/tooltip/tooltip-root.js +5 -1
  370. package/dist/default/ui/tooltip/tooltip-root.js.map +1 -1
  371. package/dist/default/ui/tooltip/tooltip-trigger.js +2 -4
  372. package/dist/default/ui/tooltip/tooltip-trigger.js.map +1 -1
  373. package/dist/default/ui/volume-indicator/volume-indicator-root.js +1 -1
  374. package/dist/default/ui/volume-indicator/volume-indicator-root.js.map +1 -1
  375. package/dist/default/ui/volume-slider/volume-slider-root.js +10 -4
  376. package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -1
  377. package/dist/dev/__generated__/skins/default-video/styles/base.css +25 -0
  378. package/dist/dev/__generated__/skins/default-video/styles/buttons.css +152 -0
  379. package/dist/dev/__generated__/skins/default-video/styles/container.css +45 -0
  380. package/dist/dev/__generated__/skins/default-video/styles/controls.css +45 -0
  381. package/dist/dev/__generated__/skins/default-video/styles/overlays.css +11 -0
  382. package/dist/dev/__generated__/skins/default-video/styles/popups.css +45 -0
  383. package/dist/dev/__generated__/skins/default-video/styles/poster.css +47 -0
  384. package/dist/dev/__generated__/skins/default-video/styles/sliders.css +112 -0
  385. package/dist/dev/__generated__/skins/default-video/styles/styles.css +514 -0
  386. package/dist/dev/__generated__/skins/default-video/styles/theme.css +22 -0
  387. package/dist/dev/_virtual/_rolldown/runtime.js +15 -1
  388. package/dist/dev/i18n/context.d.ts.map +1 -1
  389. package/dist/dev/i18n/context.js +3 -3
  390. package/dist/dev/i18n/context.js.map +1 -1
  391. package/dist/dev/i18n/locales/id/register.d.ts +1 -0
  392. package/dist/dev/i18n/locales/id/register.js +8 -0
  393. package/dist/dev/i18n/locales/id/register.js.map +1 -0
  394. package/dist/dev/i18n/locales/id.d.ts +2 -0
  395. package/dist/dev/i18n/locales/id.js +2 -0
  396. package/dist/dev/i18n/locales/lt/register.d.ts +1 -0
  397. package/dist/dev/i18n/locales/lt/register.js +8 -0
  398. package/dist/dev/i18n/locales/lt/register.js.map +1 -0
  399. package/dist/dev/i18n/locales/lt.d.ts +2 -0
  400. package/dist/dev/i18n/locales/lt.js +2 -0
  401. package/dist/dev/icons/dist/react/default/airplay-enter.js.map +1 -1
  402. package/dist/dev/icons/dist/react/default/airplay-exit.js +1 -2
  403. package/dist/dev/icons/dist/react/default/airplay-exit.js.map +1 -1
  404. package/dist/dev/icons/dist/react/default/captions-off.js.map +1 -1
  405. package/dist/dev/icons/dist/react/default/captions-on.js.map +1 -1
  406. package/dist/dev/icons/dist/react/default/cast-enter.js +2 -45
  407. package/dist/dev/icons/dist/react/default/cast-enter.js.map +1 -1
  408. package/dist/dev/icons/dist/react/default/cast-exit.js +4 -61
  409. package/dist/dev/icons/dist/react/default/cast-exit.js.map +1 -1
  410. package/dist/dev/icons/dist/react/default/check.js.map +1 -1
  411. package/dist/dev/icons/dist/react/default/chevron.js.map +1 -1
  412. package/dist/dev/icons/dist/react/default/fullscreen-enter.js.map +1 -1
  413. package/dist/dev/icons/dist/react/default/fullscreen-exit.js.map +1 -1
  414. package/dist/dev/icons/dist/react/default/gear.js.map +1 -1
  415. package/dist/dev/icons/dist/react/default/pause.js.map +1 -1
  416. package/dist/dev/icons/dist/react/default/pip-enter.js.map +1 -1
  417. package/dist/dev/icons/dist/react/default/pip-exit.js.map +1 -1
  418. package/dist/dev/icons/dist/react/default/play.js.map +1 -1
  419. package/dist/dev/icons/dist/react/default/quality.js +1 -1
  420. package/dist/dev/icons/dist/react/default/quality.js.map +1 -1
  421. package/dist/dev/icons/dist/react/default/restart.js.map +1 -1
  422. package/dist/dev/icons/dist/react/default/seek.js.map +1 -1
  423. package/dist/dev/icons/dist/react/default/speech.js.map +1 -1
  424. package/dist/dev/icons/dist/react/default/speed.js.map +1 -1
  425. package/dist/dev/icons/dist/react/default/spinner.js +1 -1
  426. package/dist/dev/icons/dist/react/default/spinner.js.map +1 -1
  427. package/dist/dev/icons/dist/react/default/switches.js.map +1 -1
  428. package/dist/dev/icons/dist/react/default/volume-high.js.map +1 -1
  429. package/dist/dev/icons/dist/react/default/volume-low.js.map +1 -1
  430. package/dist/dev/icons/dist/react/default/volume-off.js.map +1 -1
  431. package/dist/dev/icons/dist/react/minimal/airplay-enter.js.map +1 -1
  432. package/dist/dev/icons/dist/react/minimal/airplay-exit.js +1 -2
  433. package/dist/dev/icons/dist/react/minimal/airplay-exit.js.map +1 -1
  434. package/dist/dev/icons/dist/react/minimal/captions-off.js.map +1 -1
  435. package/dist/dev/icons/dist/react/minimal/captions-on.js.map +1 -1
  436. package/dist/dev/icons/dist/react/minimal/cast-enter.js +2 -45
  437. package/dist/dev/icons/dist/react/minimal/cast-enter.js.map +1 -1
  438. package/dist/dev/icons/dist/react/minimal/cast-exit.js +4 -61
  439. package/dist/dev/icons/dist/react/minimal/cast-exit.js.map +1 -1
  440. package/dist/dev/icons/dist/react/minimal/check.js.map +1 -1
  441. package/dist/dev/icons/dist/react/minimal/chevron.js.map +1 -1
  442. package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js.map +1 -1
  443. package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js.map +1 -1
  444. package/dist/dev/icons/dist/react/minimal/gear.js.map +1 -1
  445. package/dist/dev/icons/dist/react/minimal/pause.js.map +1 -1
  446. package/dist/dev/icons/dist/react/minimal/pip-enter.js.map +1 -1
  447. package/dist/dev/icons/dist/react/minimal/pip-exit.js.map +1 -1
  448. package/dist/dev/icons/dist/react/minimal/play.js.map +1 -1
  449. package/dist/dev/icons/dist/react/minimal/quality.js +1 -1
  450. package/dist/dev/icons/dist/react/minimal/quality.js.map +1 -1
  451. package/dist/dev/icons/dist/react/minimal/restart.js.map +1 -1
  452. package/dist/dev/icons/dist/react/minimal/seek.js.map +1 -1
  453. package/dist/dev/icons/dist/react/minimal/speech.js +7 -40
  454. package/dist/dev/icons/dist/react/minimal/speech.js.map +1 -1
  455. package/dist/dev/icons/dist/react/minimal/speed.js.map +1 -1
  456. package/dist/dev/icons/dist/react/minimal/spinner.js +1 -1
  457. package/dist/dev/icons/dist/react/minimal/spinner.js.map +1 -1
  458. package/dist/dev/icons/dist/react/minimal/switches.js.map +1 -1
  459. package/dist/dev/icons/dist/react/minimal/volume-high.js.map +1 -1
  460. package/dist/dev/icons/dist/react/minimal/volume-low.js.map +1 -1
  461. package/dist/dev/icons/dist/react/minimal/volume-off.js.map +1 -1
  462. package/dist/dev/index.d.ts +18 -2
  463. package/dist/dev/index.d.ts.map +1 -0
  464. package/dist/dev/index.js +7 -3
  465. package/dist/dev/media/cloudflare-video/index.d.ts +2 -0
  466. package/dist/dev/media/cloudflare-video/index.js +2 -0
  467. package/dist/dev/media/cloudflare-video/media.d.ts +13 -0
  468. package/dist/dev/media/cloudflare-video/media.d.ts.map +1 -0
  469. package/dist/dev/media/cloudflare-video/media.js +38 -0
  470. package/dist/dev/media/cloudflare-video/media.js.map +1 -0
  471. package/dist/dev/media/google-cast/google-cast.d.ts +3 -3
  472. package/dist/dev/media/google-cast/google-cast.js +3 -3
  473. package/dist/dev/media/google-cast/google-cast.js.map +1 -1
  474. package/dist/dev/media/hls-audio/index.d.ts +2 -0
  475. package/dist/dev/media/hls-audio/index.js +2 -0
  476. package/dist/dev/media/hls-audio/media.d.ts +13 -0
  477. package/dist/dev/media/hls-audio/media.d.ts.map +1 -0
  478. package/dist/dev/media/hls-audio/media.js +21 -0
  479. package/dist/dev/media/hls-audio/media.js.map +1 -0
  480. package/dist/dev/media/hls-background-video/index.d.ts +2 -0
  481. package/dist/dev/media/hls-background-video/index.js +2 -0
  482. package/dist/dev/media/hls-background-video/media.d.ts +28 -0
  483. package/dist/dev/media/hls-background-video/media.d.ts.map +1 -0
  484. package/dist/dev/media/hls-background-video/media.js +45 -0
  485. package/dist/dev/media/hls-background-video/media.js.map +1 -0
  486. package/dist/dev/media/hls-video/index.d.ts +2 -0
  487. package/dist/dev/media/hls-video/index.js +2 -0
  488. package/dist/dev/media/hls-video/media.d.ts +13 -0
  489. package/dist/dev/media/hls-video/media.d.ts.map +1 -0
  490. package/dist/{default/media/simple-hls-video → dev/media/hls-video}/media.js +6 -7
  491. package/dist/dev/media/hls-video/media.js.map +1 -0
  492. package/dist/dev/media/mux-audio/{media.d.ts → hls-js.d.ts} +3 -3
  493. package/dist/dev/media/mux-audio/hls-js.d.ts.map +1 -0
  494. package/dist/dev/media/mux-audio/{media.js → hls-js.js} +2 -2
  495. package/dist/dev/media/mux-audio/hls-js.js.map +1 -0
  496. package/dist/dev/media/mux-audio/index.d.ts +1 -1
  497. package/dist/dev/media/mux-audio/index.js +1 -1
  498. package/dist/dev/media/mux-audio/spf.d.ts +14 -0
  499. package/dist/dev/media/mux-audio/spf.d.ts.map +1 -0
  500. package/dist/dev/media/mux-audio/spf.js +26 -0
  501. package/dist/dev/media/mux-audio/spf.js.map +1 -0
  502. package/dist/dev/media/mux-background-video/index.d.ts +3 -0
  503. package/dist/dev/media/mux-background-video/index.js +2 -0
  504. package/dist/dev/media/mux-data/mux-data.d.ts +7 -3
  505. package/dist/dev/media/mux-data/mux-data.d.ts.map +1 -1
  506. package/dist/dev/media/mux-data/mux-data.js +7 -3
  507. package/dist/dev/media/mux-data/mux-data.js.map +1 -1
  508. package/dist/dev/media/mux-video/{media.d.ts → hls-js.d.ts} +3 -3
  509. package/dist/dev/media/mux-video/hls-js.d.ts.map +1 -0
  510. package/dist/dev/media/mux-video/hls-js.js +27 -0
  511. package/dist/dev/media/mux-video/hls-js.js.map +1 -0
  512. package/dist/dev/media/mux-video/index.d.ts +1 -1
  513. package/dist/dev/media/mux-video/index.js +1 -1
  514. package/dist/dev/media/mux-video/spf.d.ts +14 -0
  515. package/dist/dev/media/mux-video/spf.d.ts.map +1 -0
  516. package/dist/dev/media/mux-video/spf.js +27 -0
  517. package/dist/dev/media/mux-video/spf.js.map +1 -0
  518. package/dist/dev/media/mux-video/storyboard.js +43 -0
  519. package/dist/dev/media/mux-video/storyboard.js.map +1 -0
  520. package/dist/dev/media/spotify-audio/index.d.ts +2 -0
  521. package/dist/dev/media/spotify-audio/index.js +2 -0
  522. package/dist/dev/media/spotify-audio/media.d.ts +13 -0
  523. package/dist/dev/media/spotify-audio/media.d.ts.map +1 -0
  524. package/dist/dev/media/spotify-audio/media.js +40 -0
  525. package/dist/dev/media/spotify-audio/media.js.map +1 -0
  526. package/dist/dev/media/tiktok-video/index.d.ts +2 -0
  527. package/dist/dev/media/tiktok-video/index.js +2 -0
  528. package/dist/dev/media/tiktok-video/media.d.ts +13 -0
  529. package/dist/dev/media/tiktok-video/media.d.ts.map +1 -0
  530. package/dist/dev/media/tiktok-video/media.js +38 -0
  531. package/dist/dev/media/tiktok-video/media.js.map +1 -0
  532. package/dist/dev/media/twitch-video/index.d.ts +2 -0
  533. package/dist/dev/media/twitch-video/index.js +2 -0
  534. package/dist/dev/media/twitch-video/media.d.ts +13 -0
  535. package/dist/dev/media/twitch-video/media.d.ts.map +1 -0
  536. package/dist/dev/media/twitch-video/media.js +38 -0
  537. package/dist/dev/media/twitch-video/media.js.map +1 -0
  538. package/dist/dev/media/vimeo-video/media.d.ts.map +1 -1
  539. package/dist/dev/media/vimeo-video/media.js +4 -4
  540. package/dist/dev/media/vimeo-video/media.js.map +1 -1
  541. package/dist/dev/media/youtube-video/index.d.ts +2 -0
  542. package/dist/dev/media/youtube-video/index.js +2 -0
  543. package/dist/dev/media/youtube-video/media.d.ts +13 -0
  544. package/dist/dev/media/youtube-video/media.d.ts.map +1 -0
  545. package/dist/dev/media/youtube-video/media.js +37 -0
  546. package/dist/dev/media/youtube-video/media.js.map +1 -0
  547. package/dist/dev/player/container.d.ts.map +1 -1
  548. package/dist/dev/player/container.js +8 -3
  549. package/dist/dev/player/container.js.map +1 -1
  550. package/dist/dev/player/context.d.ts +7 -8
  551. package/dist/dev/player/context.d.ts.map +1 -1
  552. package/dist/dev/player/context.js +6 -10
  553. package/dist/dev/player/context.js.map +1 -1
  554. package/dist/dev/player/create-player.d.ts +6 -8
  555. package/dist/dev/player/create-player.d.ts.map +1 -1
  556. package/dist/dev/player/create-player.js +45 -14
  557. package/dist/dev/player/create-player.js.map +1 -1
  558. package/dist/dev/player/popup-group-context.js +18 -0
  559. package/dist/dev/player/popup-group-context.js.map +1 -0
  560. package/dist/dev/presets/audio/index.d.ts +2 -1
  561. package/dist/dev/presets/audio/index.js +8 -1
  562. package/dist/dev/presets/audio/index.js.map +1 -0
  563. package/dist/dev/presets/audio/minimal-skin.css +426 -295
  564. package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -1
  565. package/dist/dev/presets/audio/minimal-skin.js +12 -19
  566. package/dist/dev/presets/audio/minimal-skin.js.map +1 -1
  567. package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts.map +1 -1
  568. package/dist/dev/presets/audio/minimal-skin.tailwind.js +81 -20
  569. package/dist/dev/presets/audio/minimal-skin.tailwind.js.map +1 -1
  570. package/dist/dev/presets/audio/player.d.ts +13 -0
  571. package/dist/dev/presets/audio/player.d.ts.map +1 -0
  572. package/dist/dev/presets/audio/player.js +13 -0
  573. package/dist/dev/presets/audio/player.js.map +1 -0
  574. package/dist/dev/presets/audio/skin.css +458 -341
  575. package/dist/dev/presets/audio/skin.d.ts.map +1 -1
  576. package/dist/dev/presets/audio/skin.js +13 -19
  577. package/dist/dev/presets/audio/skin.js.map +1 -1
  578. package/dist/dev/presets/audio/skin.tailwind.d.ts.map +1 -1
  579. package/dist/dev/presets/audio/skin.tailwind.js +14 -19
  580. package/dist/dev/presets/audio/skin.tailwind.js.map +1 -1
  581. package/dist/dev/presets/background/index.d.ts +2 -1
  582. package/dist/dev/presets/background/index.js +8 -1
  583. package/dist/dev/presets/background/index.js.map +1 -0
  584. package/dist/dev/presets/background/player.d.ts +10 -0
  585. package/dist/dev/presets/background/player.d.ts.map +1 -0
  586. package/dist/dev/presets/background/player.js +13 -0
  587. package/dist/dev/presets/background/player.js.map +1 -0
  588. package/dist/dev/presets/background/skin.css +3 -3
  589. package/dist/dev/presets/live-audio/index.d.ts +2 -1
  590. package/dist/dev/presets/live-audio/index.js +8 -1
  591. package/dist/dev/presets/live-audio/index.js.map +1 -0
  592. package/dist/dev/presets/live-audio/minimal-skin.css +426 -295
  593. package/dist/dev/presets/live-audio/minimal-skin.js +2 -2
  594. package/dist/dev/presets/live-audio/minimal-skin.js.map +1 -1
  595. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js +4 -4
  596. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js.map +1 -1
  597. package/dist/dev/presets/live-audio/player.d.ts +13 -0
  598. package/dist/dev/presets/live-audio/player.d.ts.map +1 -0
  599. package/dist/dev/presets/live-audio/player.js +13 -0
  600. package/dist/dev/presets/live-audio/player.js.map +1 -0
  601. package/dist/dev/presets/live-audio/skin.css +458 -341
  602. package/dist/dev/presets/live-audio/skin.js +2 -2
  603. package/dist/dev/presets/live-audio/skin.js.map +1 -1
  604. package/dist/dev/presets/live-audio/skin.tailwind.js +4 -4
  605. package/dist/dev/presets/live-audio/skin.tailwind.js.map +1 -1
  606. package/dist/dev/presets/live-video/index.d.ts +2 -1
  607. package/dist/dev/presets/live-video/index.js +8 -1
  608. package/dist/dev/presets/live-video/index.js.map +1 -0
  609. package/dist/dev/presets/live-video/minimal-skin.css +655 -588
  610. package/dist/dev/presets/live-video/minimal-skin.js +12 -12
  611. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -1
  612. package/dist/dev/presets/live-video/minimal-skin.tailwind.d.ts.map +1 -1
  613. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +27 -26
  614. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  615. package/dist/dev/presets/live-video/player.d.ts +13 -0
  616. package/dist/dev/presets/live-video/player.d.ts.map +1 -0
  617. package/dist/dev/presets/live-video/player.js +13 -0
  618. package/dist/dev/presets/live-video/player.js.map +1 -0
  619. package/dist/dev/presets/live-video/skin.css +656 -618
  620. package/dist/dev/presets/live-video/skin.js +11 -11
  621. package/dist/dev/presets/live-video/skin.js.map +1 -1
  622. package/dist/dev/presets/live-video/skin.tailwind.d.ts.map +1 -1
  623. package/dist/dev/presets/live-video/skin.tailwind.js +24 -112
  624. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -1
  625. package/dist/dev/presets/video/index.d.ts +2 -1
  626. package/dist/dev/presets/video/index.js +8 -1
  627. package/dist/dev/presets/video/index.js.map +1 -0
  628. package/dist/dev/presets/video/minimal-skin.css +655 -588
  629. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  630. package/dist/dev/presets/video/minimal-skin.js +212 -211
  631. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  632. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  633. package/dist/dev/presets/video/minimal-skin.tailwind.js +226 -233
  634. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  635. package/dist/dev/presets/video/player.d.ts +13 -0
  636. package/dist/dev/presets/video/player.d.ts.map +1 -0
  637. package/dist/dev/presets/video/player.js +13 -0
  638. package/dist/dev/presets/video/player.js.map +1 -0
  639. package/dist/dev/presets/video/skin.css +656 -618
  640. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  641. package/dist/dev/presets/video/skin.js +212 -207
  642. package/dist/dev/presets/video/skin.js.map +1 -1
  643. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  644. package/dist/dev/presets/video/skin.tailwind.js +224 -227
  645. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  646. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +6 -6
  647. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  648. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  649. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  650. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +4 -4
  651. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  652. package/dist/dev/skins/dist/default/default/tailwind/components/container.js +8 -0
  653. package/dist/dev/skins/dist/default/default/tailwind/components/container.js.map +1 -0
  654. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +1 -1
  655. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  656. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +1 -1
  657. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  658. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +1 -1
  659. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  660. package/dist/dev/skins/dist/default/default/tailwind/components/input-indicator-overlay.js +7 -0
  661. package/dist/dev/skins/dist/default/default/tailwind/components/input-indicator-overlay.js.map +1 -0
  662. package/dist/dev/skins/dist/default/default/tailwind/components/input-indicator.js +9 -0
  663. package/dist/dev/skins/dist/default/default/tailwind/components/input-indicator.js.map +1 -0
  664. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js +8 -12
  665. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  666. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  667. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  668. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +1 -1
  669. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  670. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +1 -1
  671. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  672. package/dist/dev/skins/dist/default/default/tailwind/components/seek-indicator.js +12 -0
  673. package/dist/dev/skins/dist/default/default/tailwind/components/seek-indicator.js.map +1 -0
  674. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +17 -9
  675. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  676. package/dist/dev/skins/dist/default/default/tailwind/components/status-indicator.js +29 -0
  677. package/dist/dev/skins/dist/default/default/tailwind/components/status-indicator.js.map +1 -0
  678. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +1 -1
  679. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  680. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js +3 -4
  681. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  682. package/dist/dev/skins/dist/default/default/tailwind/components/time.js +2 -2
  683. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  684. package/dist/dev/skins/dist/default/default/tailwind/components/volume-indicator.js +18 -0
  685. package/dist/dev/skins/dist/default/default/tailwind/components/volume-indicator.js.map +1 -0
  686. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +22 -19
  687. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  688. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +6 -6
  689. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  690. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  691. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  692. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +4 -4
  693. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  694. package/dist/dev/skins/dist/default/minimal/tailwind/components/container.js +8 -0
  695. package/dist/dev/skins/dist/default/minimal/tailwind/components/container.js.map +1 -0
  696. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  697. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  698. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +1 -1
  699. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  700. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  701. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  702. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-indicator-overlay.js +7 -0
  703. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-indicator-overlay.js.map +1 -0
  704. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-indicator.js +10 -0
  705. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-indicator.js.map +1 -0
  706. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js +9 -13
  707. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  708. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  709. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  710. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +2 -2
  711. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  712. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +1 -1
  713. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  714. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek-indicator.js +12 -0
  715. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek-indicator.js.map +1 -0
  716. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +17 -9
  717. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  718. package/dist/dev/skins/dist/default/minimal/tailwind/components/status-indicator.js +29 -0
  719. package/dist/dev/skins/dist/default/minimal/tailwind/components/status-indicator.js.map +1 -0
  720. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js +3 -5
  721. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  722. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +2 -2
  723. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  724. package/dist/dev/skins/dist/default/minimal/tailwind/components/volume-indicator.js +19 -0
  725. package/dist/dev/skins/dist/default/minimal/tailwind/components/volume-indicator.js.map +1 -0
  726. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +14 -15
  727. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  728. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js +22 -20
  729. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  730. package/dist/dev/ui/audio-track/use-audio-track-options.d.ts +6 -6
  731. package/dist/dev/ui/audio-track/use-audio-track-options.d.ts.map +1 -1
  732. package/dist/dev/ui/audio-track/use-audio-track-options.js +9 -27
  733. package/dist/dev/ui/audio-track/use-audio-track-options.js.map +1 -1
  734. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group.d.ts +43 -0
  735. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group.d.ts.map +1 -0
  736. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group.js +65 -0
  737. package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group.js.map +1 -0
  738. package/dist/dev/ui/audio-track-radio-group/index.d.ts +2 -0
  739. package/dist/dev/ui/audio-track-radio-group/index.js +2 -0
  740. package/dist/dev/ui/captions-radio-group/captions-radio-group.d.ts +43 -0
  741. package/dist/dev/ui/captions-radio-group/captions-radio-group.d.ts.map +1 -0
  742. package/dist/dev/ui/captions-radio-group/captions-radio-group.js +65 -0
  743. package/dist/dev/ui/captions-radio-group/captions-radio-group.js.map +1 -0
  744. package/dist/dev/ui/captions-radio-group/index.d.ts +2 -1
  745. package/dist/dev/ui/captions-radio-group/index.js +2 -1
  746. package/dist/dev/ui/captions-radio-group/use-captions-options.d.ts +6 -6
  747. package/dist/dev/ui/captions-radio-group/use-captions-options.d.ts.map +1 -1
  748. package/dist/dev/ui/captions-radio-group/use-captions-options.js +13 -33
  749. package/dist/dev/ui/captions-radio-group/use-captions-options.js.map +1 -1
  750. package/dist/dev/ui/hooks/create-radio-options-hook.d.ts +11 -0
  751. package/dist/dev/ui/hooks/create-radio-options-hook.d.ts.map +1 -0
  752. package/dist/dev/ui/hooks/create-radio-options-hook.js +46 -0
  753. package/dist/dev/ui/hooks/create-radio-options-hook.js.map +1 -0
  754. package/dist/dev/ui/hooks/use-slider.d.ts +2 -1
  755. package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -1
  756. package/dist/dev/ui/hooks/use-slider.js +49 -13
  757. package/dist/dev/ui/hooks/use-slider.js.map +1 -1
  758. package/dist/{default/ui/input-indicators → dev/ui/input-indicator}/use-indicator-visibility.js +1 -1
  759. package/dist/dev/ui/input-indicator/use-indicator-visibility.js.map +1 -0
  760. package/dist/dev/ui/{input-indicators → input-indicator}/use-input-action-subscription.js +1 -1
  761. package/dist/dev/ui/input-indicator/use-input-action-subscription.js.map +1 -0
  762. package/dist/dev/ui/{input-indicators → input-indicator}/use-input-indicator-root.js +1 -1
  763. package/dist/dev/ui/input-indicator/use-input-indicator-root.js.map +1 -0
  764. package/dist/dev/ui/{input-indicators → input-indicator}/use-rendered-indicator-state.js +1 -1
  765. package/dist/dev/ui/input-indicator/use-rendered-indicator-state.js.map +1 -0
  766. package/dist/dev/ui/menu/context.d.ts +1 -10
  767. package/dist/dev/ui/menu/context.d.ts.map +1 -1
  768. package/dist/dev/ui/menu/context.js +1 -11
  769. package/dist/dev/ui/menu/context.js.map +1 -1
  770. package/dist/dev/ui/menu/index.parts.d.ts +3 -6
  771. package/dist/dev/ui/menu/index.parts.js +3 -9
  772. package/dist/dev/ui/menu/index.parts.js.map +1 -1
  773. package/dist/dev/ui/menu/menu-checkbox-item.js +4 -1
  774. package/dist/dev/ui/menu/menu-checkbox-item.js.map +1 -1
  775. package/dist/dev/ui/menu/menu-content.d.ts.map +1 -1
  776. package/dist/dev/ui/menu/menu-content.js +78 -236
  777. package/dist/dev/ui/menu/menu-content.js.map +1 -1
  778. package/dist/dev/ui/menu/menu-item.d.ts +0 -3
  779. package/dist/dev/ui/menu/menu-item.d.ts.map +1 -1
  780. package/dist/dev/ui/menu/menu-item.js +11 -18
  781. package/dist/dev/ui/menu/menu-item.js.map +1 -1
  782. package/dist/dev/ui/menu/menu-keyboard.js +31 -0
  783. package/dist/dev/ui/menu/menu-keyboard.js.map +1 -0
  784. package/dist/dev/ui/menu/menu-radio-item.d.ts.map +1 -1
  785. package/dist/dev/ui/menu/menu-radio-item.js +8 -6
  786. package/dist/dev/ui/menu/menu-radio-item.js.map +1 -1
  787. package/dist/dev/ui/menu/menu-root.d.ts.map +1 -1
  788. package/dist/dev/ui/menu/menu-root.js +46 -61
  789. package/dist/dev/ui/menu/menu-root.js.map +1 -1
  790. package/dist/dev/ui/menu/menu-trigger.d.ts +5 -5
  791. package/dist/dev/ui/menu/menu-trigger.d.ts.map +1 -1
  792. package/dist/dev/ui/menu/menu-trigger.js +50 -87
  793. package/dist/dev/ui/menu/menu-trigger.js.map +1 -1
  794. package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -1
  795. package/dist/dev/ui/mute-button/mute-button.js +2 -1
  796. package/dist/dev/ui/mute-button/mute-button.js.map +1 -1
  797. package/dist/dev/ui/playback-rate/use-playback-rate-options.d.ts +6 -7
  798. package/dist/dev/ui/playback-rate/use-playback-rate-options.d.ts.map +1 -1
  799. package/dist/dev/ui/playback-rate/use-playback-rate-options.js +15 -26
  800. package/dist/dev/ui/playback-rate/use-playback-rate-options.js.map +1 -1
  801. package/dist/dev/ui/playback-rate-radio-group/index.d.ts +2 -0
  802. package/dist/dev/ui/playback-rate-radio-group/index.js +2 -0
  803. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group.d.ts +43 -0
  804. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group.d.ts.map +1 -0
  805. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group.js +65 -0
  806. package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group.js.map +1 -0
  807. package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -1
  808. package/dist/dev/ui/popover/popover-popup.js +10 -80
  809. package/dist/dev/ui/popover/popover-popup.js.map +1 -1
  810. package/dist/dev/ui/popover/popover-root.d.ts.map +1 -1
  811. package/dist/dev/ui/popover/popover-root.js +2 -1
  812. package/dist/dev/ui/popover/popover-root.js.map +1 -1
  813. package/dist/dev/ui/popover/popover-trigger.d.ts.map +1 -1
  814. package/dist/dev/ui/popover/popover-trigger.js +4 -5
  815. package/dist/dev/ui/popover/popover-trigger.js.map +1 -1
  816. package/dist/dev/ui/popover/use-popup-position.js +34 -0
  817. package/dist/dev/ui/popover/use-popup-position.js.map +1 -0
  818. package/dist/dev/ui/poster/poster.js +8 -4
  819. package/dist/dev/ui/poster/poster.js.map +1 -1
  820. package/dist/dev/ui/quality/use-quality-options.d.ts +6 -8
  821. package/dist/dev/ui/quality/use-quality-options.d.ts.map +1 -1
  822. package/dist/dev/ui/quality/use-quality-options.js +10 -34
  823. package/dist/dev/ui/quality/use-quality-options.js.map +1 -1
  824. package/dist/dev/ui/quality-radio-group/index.d.ts +2 -0
  825. package/dist/dev/ui/quality-radio-group/index.js +2 -0
  826. package/dist/dev/ui/quality-radio-group/quality-radio-group.d.ts +44 -0
  827. package/dist/dev/ui/quality-radio-group/quality-radio-group.d.ts.map +1 -0
  828. package/dist/dev/ui/quality-radio-group/quality-radio-group.js +66 -0
  829. package/dist/dev/ui/quality-radio-group/quality-radio-group.js.map +1 -0
  830. package/dist/dev/ui/seek-indicator/seek-indicator-root.js +1 -1
  831. package/dist/dev/ui/seek-indicator/seek-indicator-root.js.map +1 -1
  832. package/dist/dev/ui/slider/context.js +7 -2
  833. package/dist/dev/ui/slider/context.js.map +1 -1
  834. package/dist/dev/ui/slider/slider-preview.d.ts.map +1 -1
  835. package/dist/dev/ui/slider/slider-preview.js +2 -3
  836. package/dist/dev/ui/slider/slider-preview.js.map +1 -1
  837. package/dist/dev/ui/slider/slider-root.d.ts.map +1 -1
  838. package/dist/dev/ui/slider/slider-root.js +3 -1
  839. package/dist/dev/ui/slider/slider-root.js.map +1 -1
  840. package/dist/dev/ui/slider/slider-thumbnail.js +2 -2
  841. package/dist/dev/ui/slider/slider-thumbnail.js.map +1 -1
  842. package/dist/dev/ui/slider/slider-value.d.ts.map +1 -1
  843. package/dist/dev/ui/slider/slider-value.js +3 -2
  844. package/dist/dev/ui/slider/slider-value.js.map +1 -1
  845. package/dist/dev/ui/status-announcer/status-announcer.d.ts.map +1 -1
  846. package/dist/dev/ui/status-announcer/status-announcer.js +7 -4
  847. package/dist/dev/ui/status-announcer/status-announcer.js.map +1 -1
  848. package/dist/dev/ui/status-indicator/status-indicator-root.d.ts.map +1 -1
  849. package/dist/dev/ui/status-indicator/status-indicator-root.js +2 -2
  850. package/dist/dev/ui/status-indicator/status-indicator-root.js.map +1 -1
  851. package/dist/dev/ui/time/time-value.d.ts.map +1 -1
  852. package/dist/dev/ui/time/time-value.js +13 -5
  853. package/dist/dev/ui/time/time-value.js.map +1 -1
  854. package/dist/dev/ui/time-slider/index.parts.d.ts +4 -2
  855. package/dist/dev/ui/time-slider/index.parts.js +5 -1
  856. package/dist/dev/ui/time-slider/index.parts.js.map +1 -1
  857. package/dist/dev/ui/time-slider/time-slider-chapters/slider-segments.js +61 -0
  858. package/dist/dev/ui/time-slider/time-slider-chapters/slider-segments.js.map +1 -0
  859. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapter-title.d.ts +19 -0
  860. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapter-title.d.ts.map +1 -0
  861. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapter-title.js +46 -0
  862. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapter-title.js.map +1 -0
  863. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapters.d.ts +22 -0
  864. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapters.d.ts.map +1 -0
  865. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapters.js +52 -0
  866. package/dist/dev/ui/time-slider/time-slider-chapters/time-slider-chapters.js.map +1 -0
  867. package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -1
  868. package/dist/dev/ui/time-slider/time-slider-root.js +6 -4
  869. package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -1
  870. package/dist/dev/ui/tooltip/tooltip-popup.d.ts.map +1 -1
  871. package/dist/dev/ui/tooltip/tooltip-popup.js +13 -82
  872. package/dist/dev/ui/tooltip/tooltip-popup.js.map +1 -1
  873. package/dist/dev/ui/tooltip/tooltip-root.d.ts.map +1 -1
  874. package/dist/dev/ui/tooltip/tooltip-root.js +5 -1
  875. package/dist/dev/ui/tooltip/tooltip-root.js.map +1 -1
  876. package/dist/dev/ui/tooltip/tooltip-trigger.d.ts.map +1 -1
  877. package/dist/dev/ui/tooltip/tooltip-trigger.js +2 -4
  878. package/dist/dev/ui/tooltip/tooltip-trigger.js.map +1 -1
  879. package/dist/dev/ui/volume-indicator/volume-indicator-root.js +1 -1
  880. package/dist/dev/ui/volume-indicator/volume-indicator-root.js.map +1 -1
  881. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts.map +1 -1
  882. package/dist/dev/ui/volume-slider/volume-slider-root.js +10 -4
  883. package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -1
  884. package/docs/README.md +1 -1
  885. package/docs/concepts/cast.md +6 -6
  886. package/docs/concepts/features.md +9 -6
  887. package/docs/concepts/i18n.md +16 -26
  888. package/docs/concepts/media-sources.md +383 -0
  889. package/docs/concepts/mux-data.md +9 -7
  890. package/docs/concepts/overview.md +15 -18
  891. package/docs/concepts/presets.md +18 -19
  892. package/docs/concepts/skins.md +864 -859
  893. package/docs/concepts/ui-components.md +3 -3
  894. package/docs/concepts/why-videojs.md +4 -4
  895. package/docs/how-to/build-your-own-component.md +7 -5
  896. package/docs/how-to/customize-skins.md +2677 -2363
  897. package/docs/how-to/i18n-override-translations.md +3 -3
  898. package/docs/how-to/i18n-register-locale.md +3 -3
  899. package/docs/how-to/i18n-ssr.md +3 -3
  900. package/docs/how-to/i18n-switch-locale.md +3 -3
  901. package/docs/how-to/installation.md +3 -8
  902. package/docs/llms.txt +42 -39
  903. package/docs/reference/airplay-button.md +6 -6
  904. package/docs/reference/audio-track-radio-group.md +198 -29
  905. package/docs/reference/buffering-indicator.md +6 -6
  906. package/docs/reference/captions-button.md +6 -6
  907. package/docs/reference/captions-radio-group.md +206 -29
  908. package/docs/reference/cast-button.md +6 -6
  909. package/docs/reference/controls.md +6 -6
  910. package/docs/reference/create-player.md +22 -31
  911. package/docs/reference/create-translator.md +1 -1
  912. package/docs/reference/dash-video.md +14 -0
  913. package/docs/reference/feature-controls.md +13 -1
  914. package/docs/reference/feature-fullscreen.md +1 -1
  915. package/docs/reference/feature-orientation-lock.md +2 -2
  916. package/docs/reference/feature-text-tracks.md +3 -1
  917. package/docs/reference/feature-volume.md +10 -0
  918. package/docs/reference/fullscreen-button.md +6 -6
  919. package/docs/reference/get-i18n-translations.md +1 -1
  920. package/docs/reference/has-registered-locale.md +1 -1
  921. package/docs/reference/{simple-hls-audio-only.md → hls-audio.md} +5 -5
  922. package/docs/reference/{simple-hls-video.md → hls-video.md} +4 -4
  923. package/docs/reference/hlsjs-video.md +17 -9
  924. package/docs/reference/menu.md +65 -157
  925. package/docs/reference/mute-button.md +60 -18
  926. package/docs/reference/mux-audio.md +1 -107
  927. package/docs/reference/mux-video.md +1 -107
  928. package/docs/reference/native-hls-video.md +24 -0
  929. package/docs/reference/pip-button.md +6 -6
  930. package/docs/reference/play-button.md +6 -6
  931. package/docs/reference/playback-rate-button.md +6 -6
  932. package/docs/reference/playback-rate-radio-group.md +200 -29
  933. package/docs/reference/player-container.md +25 -25
  934. package/docs/reference/player-provider.md +24 -24
  935. package/docs/reference/popover.md +6 -6
  936. package/docs/reference/poster.md +6 -6
  937. package/docs/reference/quality-radio-group.md +200 -31
  938. package/docs/reference/register-i18n.md +1 -1
  939. package/docs/reference/seek-button.md +6 -6
  940. package/docs/reference/slider.md +1 -1
  941. package/docs/reference/thumbnail.md +7 -7
  942. package/docs/reference/time-slider.md +251 -7
  943. package/docs/reference/time.md +78 -34
  944. package/docs/reference/translation-phrases.md +27 -3
  945. package/docs/reference/use-container-attach.md +5 -5
  946. package/docs/reference/use-locale.md +1 -1
  947. package/docs/reference/use-media-attach.md +2 -2
  948. package/docs/reference/use-media.md +16 -10
  949. package/docs/reference/use-player-context.md +2 -7
  950. package/docs/reference/use-player.md +25 -19
  951. package/docs/reference/use-store.md +15 -15
  952. package/docs/reference/volume-slider.md +13 -11
  953. package/package.json +28 -8
  954. package/dist/default/media/mux-audio/media.js.map +0 -1
  955. package/dist/default/media/mux-video/media.js +0 -56
  956. package/dist/default/media/mux-video/media.js.map +0 -1
  957. package/dist/default/media/simple-hls-audio-only/index.js +0 -2
  958. package/dist/default/media/simple-hls-audio-only/media.js +0 -22
  959. package/dist/default/media/simple-hls-audio-only/media.js.map +0 -1
  960. package/dist/default/media/simple-hls-video/index.js +0 -2
  961. package/dist/default/media/simple-hls-video/media.js.map +0 -1
  962. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js +0 -40
  963. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js.map +0 -1
  964. package/dist/default/skins/dist/default/default/tailwind/components/root.js +0 -8
  965. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +0 -1
  966. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js +0 -41
  967. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +0 -1
  968. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +0 -8
  969. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +0 -1
  970. package/dist/default/tailwind.css +0 -42
  971. package/dist/default/ui/input-indicators/use-indicator-visibility.js.map +0 -1
  972. package/dist/default/ui/input-indicators/use-input-action-subscription.js.map +0 -1
  973. package/dist/default/ui/input-indicators/use-input-indicator-root.js.map +0 -1
  974. package/dist/default/ui/input-indicators/use-rendered-indicator-state.js.map +0 -1
  975. package/dist/default/ui/menu/menu-back.js +0 -34
  976. package/dist/default/ui/menu/menu-back.js.map +0 -1
  977. package/dist/default/ui/menu/menu-item-setting-provider.js +0 -77
  978. package/dist/default/ui/menu/menu-item-setting-provider.js.map +0 -1
  979. package/dist/default/ui/menu/menu-item-value.js +0 -28
  980. package/dist/default/ui/menu/menu-item-value.js.map +0 -1
  981. package/dist/default/ui/menu/menu-view.js +0 -23
  982. package/dist/default/ui/menu/menu-view.js.map +0 -1
  983. package/dist/dev/media/mux-audio/media.d.ts.map +0 -1
  984. package/dist/dev/media/mux-audio/media.js.map +0 -1
  985. package/dist/dev/media/mux-video/media.d.ts.map +0 -1
  986. package/dist/dev/media/mux-video/media.js +0 -56
  987. package/dist/dev/media/mux-video/media.js.map +0 -1
  988. package/dist/dev/media/simple-hls-audio-only/index.d.ts +0 -2
  989. package/dist/dev/media/simple-hls-audio-only/index.js +0 -2
  990. package/dist/dev/media/simple-hls-audio-only/media.d.ts +0 -13
  991. package/dist/dev/media/simple-hls-audio-only/media.d.ts.map +0 -1
  992. package/dist/dev/media/simple-hls-audio-only/media.js +0 -22
  993. package/dist/dev/media/simple-hls-audio-only/media.js.map +0 -1
  994. package/dist/dev/media/simple-hls-video/index.d.ts +0 -2
  995. package/dist/dev/media/simple-hls-video/index.js +0 -2
  996. package/dist/dev/media/simple-hls-video/media.d.ts +0 -13
  997. package/dist/dev/media/simple-hls-video/media.d.ts.map +0 -1
  998. package/dist/dev/media/simple-hls-video/media.js.map +0 -1
  999. package/dist/dev/skins/dist/default/default/tailwind/components/input-feedback.js +0 -40
  1000. package/dist/dev/skins/dist/default/default/tailwind/components/input-feedback.js.map +0 -1
  1001. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +0 -8
  1002. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +0 -1
  1003. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-feedback.js +0 -41
  1004. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +0 -1
  1005. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +0 -8
  1006. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +0 -1
  1007. package/dist/dev/tailwind.css +0 -42
  1008. package/dist/dev/ui/input-indicators/use-indicator-visibility.js.map +0 -1
  1009. package/dist/dev/ui/input-indicators/use-input-action-subscription.js.map +0 -1
  1010. package/dist/dev/ui/input-indicators/use-input-indicator-root.js.map +0 -1
  1011. package/dist/dev/ui/input-indicators/use-rendered-indicator-state.js.map +0 -1
  1012. package/dist/dev/ui/menu/menu-back.d.ts +0 -17
  1013. package/dist/dev/ui/menu/menu-back.d.ts.map +0 -1
  1014. package/dist/dev/ui/menu/menu-back.js +0 -34
  1015. package/dist/dev/ui/menu/menu-back.js.map +0 -1
  1016. package/dist/dev/ui/menu/menu-item-setting-provider.js +0 -77
  1017. package/dist/dev/ui/menu/menu-item-setting-provider.js.map +0 -1
  1018. package/dist/dev/ui/menu/menu-item-type.d.ts +0 -5
  1019. package/dist/dev/ui/menu/menu-item-type.d.ts.map +0 -1
  1020. package/dist/dev/ui/menu/menu-item-value.d.ts +0 -12
  1021. package/dist/dev/ui/menu/menu-item-value.d.ts.map +0 -1
  1022. package/dist/dev/ui/menu/menu-item-value.js +0 -28
  1023. package/dist/dev/ui/menu/menu-item-value.js.map +0 -1
  1024. package/dist/dev/ui/menu/menu-view.d.ts +0 -13
  1025. package/dist/dev/ui/menu/menu-view.d.ts.map +0 -1
  1026. package/dist/dev/ui/menu/menu-view.js +0 -23
  1027. package/dist/dev/ui/menu/menu-view.js.map +0 -1
@@ -9,12 +9,12 @@ In prior versions of Video.js, skins were CSS-only themes applied to the same se
9
9
  tsx
10
10
 
11
11
  ```
12
- <Player.Provider>
12
+ <VideoPlayer>
13
13
  <VideoSkin>
14
14
  {/* wraps the Media component */}
15
15
  <Video src="video.mp4"></Video>
16
16
  </VideoSkin>
17
- </Player.Provider>
17
+ </VideoPlayer>
18
18
  ```
19
19
 
20
20
  ## Packaged vs. ejected
@@ -46,11 +46,11 @@ Future design updates manually applied, or intentionally ignored
46
46
  tsx
47
47
 
48
48
  ```
49
- <Player.Provider>
49
+ <VideoPlayer>
50
50
  <VideoSkin>
51
51
  {/* ...Media... */}
52
52
  </VideoSkin>
53
- </Player.Provider>
53
+ </VideoPlayer>
54
54
  ```
55
55
 
56
56
  ### Example of ejected
@@ -67,7 +67,7 @@ skin.css
67
67
  import { type CSSProperties, type ComponentProps, forwardRef, type ReactNode, isValidElement } from 'react';
68
68
  import { audioText, captionsText, playbackRateText, qualityText, settingsText, speedText } from '@videojs/core/i18n/text/menu';
69
69
  import { AirPlayEnterIcon, AirPlayExitIcon, CaptionsOffIcon, CaptionsOnIcon, CastEnterIcon, CastExitIcon, CheckIcon, ChevronIcon, FullscreenEnterIcon, FullscreenExitIcon, GearIcon, PauseIcon, PipEnterIcon, PipExitIcon, PlayIcon, QualityIcon, RestartIcon, SpeechIcon, SpeedIcon, SpinnerIcon, VolumeHighIcon, VolumeLowIcon, VolumeOffIcon } from '@videojs/react/icons';
70
- import { Poster, useTranslator, Container, usePlayer, AirPlayButton, useAudioTrackOptions, BufferingIndicator, CaptionsButton, useCaptionsOptions, CastButton, Controls, ErrorDialog, FullscreenButton, Gesture, Hotkey, Menu, MuteButton, PiPButton, PlayButton, usePlaybackRateOptions, Popover, useQualityOptions, SeekIndicator, Slider, StatusAnnouncer, StatusIndicator, Time, TimeSlider, Tooltip, VolumeIndicator, VolumeSlider, type RenderProp } from '@videojs/react';
70
+ import { Poster, useTranslator, Container, usePlayer, AirPlayButton, useAudioTrackOptions, AudioTrackRadioGroup, BufferingIndicator, CaptionsButton, CaptionsRadioGroup, useCaptionsOptions, CastButton, Controls, ErrorDialog, FullscreenButton, Gesture, Hotkey, Menu, MuteButton, PiPButton, PlayButton, usePlaybackRateOptions, PlaybackRateRadioGroup, Popover, useQualityOptions, QualityRadioGroup, SeekIndicator, Slider, StatusAnnouncer, StatusIndicator, Time, TimeSlider, Tooltip, VolumeIndicator, VolumeSlider, type RenderProp } from '@videojs/react';
71
71
  import { Video } from '@videojs/react/video';
72
72
  import './player.css';
73
73
  import { Player } from './player';
@@ -95,217 +95,172 @@ function SettingsMenu(): ReactNode {
95
95
 
96
96
  return (
97
97
  <Menu.Root side="top" align="center">
98
- <Menu.Trigger aria-label={t(settingsText)} className="media-button--settings" render={<Button />}>
99
- <GearIcon className="media-icon media-icon--settings" />
100
- </Menu.Trigger>
98
+ <Tooltip.Root side="top">
99
+ <Tooltip.Trigger
100
+ render={
101
+ <Menu.Trigger aria-label={t(settingsText)} className="media-button--settings" render={<Button />}>
102
+ <GearIcon className="media-icon media-icon--settings" />
103
+ </Menu.Trigger>
104
+ }
105
+ />
106
+ <Tooltip.Popup className="media-surface media-tooltip">
107
+ <Tooltip.Label>{t(settingsText)}</Tooltip.Label>
108
+ </Tooltip.Popup>
109
+ </Tooltip.Root>
101
110
  <Menu.Content className="media-surface media-popover media-menu media-menu--settings">
102
- <Menu.View className="media-menu__panel">
103
- <div className="media-menu__group">
104
- {hasQuality ? (
105
- <Menu.Root>
106
- <Menu.Trigger
107
- type="quality"
108
- className="media-menu__item media-menu__item--submenu"
109
- render={(props) => (
110
- <div {...props}>
111
- <QualityIcon className="media-icon" />
112
- <span>{t(qualityText)}</span>
113
- <span className="media-menu__hint">
114
- <Menu.ItemValue className="media-menu__hint-label" />
115
- <MenuChevron />
111
+ <div className="media-menu__group">
112
+ {hasQuality ? (
113
+ <Menu.Root>
114
+ <Menu.Trigger
115
+ className="media-menu__item media-menu__item--submenu"
116
+ render={(props) => (
117
+ <div {...props}>
118
+ <QualityIcon className="media-icon" />
119
+ <span>{t(qualityText)}</span>
120
+ <span className="media-menu__hint">
121
+ <span className="media-menu__hint-label">{quality.selectedLabel}</span>
122
+ <MenuChevron />
123
+ </span>
124
+ </div>
125
+ )}
126
+ />
127
+ <Menu.Content className="media-menu__panel">
128
+ <Menu.Item className="media-menu__back">
129
+ <MenuChevron flipped />
130
+ {t(qualityText)}
131
+ </Menu.Item>
132
+ <Menu.Separator className="media-menu__separator" />
133
+ <QualityRadioGroup
134
+ className="media-menu__group"
135
+ aria-label={t(qualityText)}
136
+ renderItem={(props, item) => (
137
+ <Menu.RadioItem {...props} className="media-menu__item">
138
+ <span>
139
+ {item.label}
140
+ {item.tier ? <sup className="media-menu__tier">{item.tier}</sup> : null}
116
141
  </span>
117
- </div>
142
+ {item.badge ? <span className="media-badge">{item.badge}</span> : null}
143
+ <Menu.ItemIndicator checked={item.checked} forceMount className="media-menu__indicator">
144
+ <CheckIcon className="media-icon" />
145
+ </Menu.ItemIndicator>
146
+ </Menu.RadioItem>
118
147
  )}
119
148
  />
120
- <Menu.Content className="media-menu__panel">
121
- <Menu.Back className="media-menu__back">
122
- <MenuChevron flipped />
123
- {t(qualityText)}
124
- </Menu.Back>
125
- <Menu.Separator className="media-menu__separator" />
126
- <Menu.RadioGroup
127
- className="media-menu__group"
128
- value={quality.value}
129
- onValueChange={quality.setValue}
130
- aria-label={t(qualityText)}
131
- >
132
- {quality.options.map((option) => (
133
- <Menu.RadioItem
134
- key={option.value}
135
- className="media-menu__item"
136
- value={option.value}
137
- disabled={option.disabled}
138
- >
139
- <span>
140
- {option.label}
141
- {option.tier ? <sup className="media-menu__tier">{option.tier}</sup> : null}
142
- </span>
143
- {option.badge ? <span className="media-badge">{option.badge}</span> : null}
144
- <Menu.ItemIndicator
145
- checked={option.value === quality.value}
146
- forceMount
147
- className="media-menu__indicator"
148
- >
149
- <CheckIcon className="media-icon" />
150
- </Menu.ItemIndicator>
151
- </Menu.RadioItem>
152
- ))}
153
- </Menu.RadioGroup>
154
- </Menu.Content>
155
- </Menu.Root>
156
- ) : null}
157
-
158
- {hasAudioTrack ? (
159
- <Menu.Root>
160
- <Menu.Trigger
161
- type="audio-track"
162
- className="media-menu__item media-menu__item--submenu"
163
- render={(props) => (
164
- <div {...props}>
165
- <SpeechIcon className="media-icon" />
166
- <span>{t(audioText)}</span>
167
- <span className="media-menu__hint">
168
- <Menu.ItemValue className="media-menu__hint-label" />
169
- <MenuChevron />
170
- </span>
171
- </div>
149
+ </Menu.Content>
150
+ </Menu.Root>
151
+ ) : null}
152
+
153
+ {hasAudioTrack ? (
154
+ <Menu.Root>
155
+ <Menu.Trigger
156
+ className="media-menu__item media-menu__item--submenu"
157
+ render={(props) => (
158
+ <div {...props}>
159
+ <SpeechIcon className="media-icon" />
160
+ <span>{t(audioText)}</span>
161
+ <span className="media-menu__hint">
162
+ <span className="media-menu__hint-label">{audioTrack.selectedLabel}</span>
163
+ <MenuChevron />
164
+ </span>
165
+ </div>
166
+ )}
167
+ />
168
+ <Menu.Content className="media-menu__panel">
169
+ <Menu.Item className="media-menu__back">
170
+ <MenuChevron flipped />
171
+ {t(audioText)}
172
+ </Menu.Item>
173
+ <Menu.Separator className="media-menu__separator" />
174
+ <AudioTrackRadioGroup
175
+ className="media-menu__group"
176
+ aria-label={t(audioText)}
177
+ renderItem={(props, item) => (
178
+ <Menu.RadioItem {...props} className="media-menu__item">
179
+ <span>{item.label}</span>
180
+ <Menu.ItemIndicator checked={item.checked} forceMount className="media-menu__indicator">
181
+ <CheckIcon className="media-icon" />
182
+ </Menu.ItemIndicator>
183
+ </Menu.RadioItem>
172
184
  )}
173
185
  />
174
- <Menu.Content className="media-menu__panel">
175
- <Menu.Back className="media-menu__back">
176
- <MenuChevron flipped />
177
- {t(audioText)}
178
- </Menu.Back>
179
- <Menu.Separator className="media-menu__separator" />
180
- <Menu.RadioGroup
181
- className="media-menu__group"
182
- value={audioTrack.value}
183
- onValueChange={audioTrack.setValue}
184
- aria-label={t(audioText)}
185
- >
186
- {audioTrack.options.map((option) => (
187
- <Menu.RadioItem
188
- key={option.value}
189
- className="media-menu__item"
190
- value={option.value}
191
- disabled={option.disabled}
192
- >
193
- <span>{option.label}</span>
194
- <Menu.ItemIndicator
195
- checked={option.value === audioTrack.value}
196
- forceMount
197
- className="media-menu__indicator"
198
- >
199
- <CheckIcon className="media-icon" />
200
- </Menu.ItemIndicator>
201
- </Menu.RadioItem>
202
- ))}
203
- </Menu.RadioGroup>
204
- </Menu.Content>
205
- </Menu.Root>
206
- ) : null}
207
-
208
- {hasPlaybackRate ? (
209
- <Menu.Root>
210
- <Menu.Trigger
211
- type="playback-rate"
212
- className="media-menu__item media-menu__item--submenu"
213
- render={(props) => (
214
- <div {...props}>
215
- <SpeedIcon className="media-icon" />
216
- <span>{t(speedText)}</span>
217
- <span className="media-menu__hint">
218
- <Menu.ItemValue className="media-menu__hint-label" />
219
- <MenuChevron />
220
- </span>
221
- </div>
186
+ </Menu.Content>
187
+ </Menu.Root>
188
+ ) : null}
189
+
190
+ {hasPlaybackRate ? (
191
+ <Menu.Root>
192
+ <Menu.Trigger
193
+ className="media-menu__item media-menu__item--submenu"
194
+ render={(props) => (
195
+ <div {...props}>
196
+ <SpeedIcon className="media-icon" />
197
+ <span>{t(speedText)}</span>
198
+ <span className="media-menu__hint">
199
+ <span className="media-menu__hint-label">{playbackRate.selectedLabel}</span>
200
+ <MenuChevron />
201
+ </span>
202
+ </div>
203
+ )}
204
+ />
205
+ <Menu.Content className="media-menu__panel">
206
+ <Menu.Item className="media-menu__back">
207
+ <MenuChevron flipped />
208
+ {t(speedText)}
209
+ </Menu.Item>
210
+ <Menu.Separator className="media-menu__separator" />
211
+ <PlaybackRateRadioGroup
212
+ className="media-menu__group"
213
+ aria-label={t(playbackRateText)}
214
+ renderItem={(props, item) => (
215
+ <Menu.RadioItem {...props} className="media-menu__item">
216
+ <span>{item.label}</span>
217
+ <Menu.ItemIndicator checked={item.checked} forceMount className="media-menu__indicator">
218
+ <CheckIcon className="media-icon" />
219
+ </Menu.ItemIndicator>
220
+ </Menu.RadioItem>
222
221
  )}
223
222
  />
224
- <Menu.Content className="media-menu__panel">
225
- <Menu.Back className="media-menu__back">
226
- <MenuChevron flipped />
227
- {t(speedText)}
228
- </Menu.Back>
229
- <Menu.Separator className="media-menu__separator" />
230
- <Menu.RadioGroup
231
- className="media-menu__group"
232
- value={playbackRate.value}
233
- onValueChange={playbackRate.setValue}
234
- aria-label={t(playbackRateText)}
235
- >
236
- {playbackRate.options.map((option) => (
237
- <Menu.RadioItem
238
- key={option.value}
239
- className="media-menu__item"
240
- value={option.value}
241
- disabled={option.disabled}
242
- >
243
- <span>{option.label}</span>
244
- <Menu.ItemIndicator
245
- checked={option.value === playbackRate.value}
246
- forceMount
247
- className="media-menu__indicator"
248
- >
249
- <CheckIcon className="media-icon" />
250
- </Menu.ItemIndicator>
251
- </Menu.RadioItem>
252
- ))}
253
- </Menu.RadioGroup>
254
- </Menu.Content>
255
- </Menu.Root>
256
- ) : null}
257
-
258
- {hasCaptions ? (
259
- <Menu.Root>
260
- <Menu.Trigger
261
- type="captions"
262
- className="media-menu__item media-menu__item--submenu"
263
- render={(props) => (
264
- <div {...props}>
265
- <CaptionsOffIcon className="media-icon" />
266
- <span>{t(captionsText)}</span>
267
- <span className="media-menu__hint">
268
- <Menu.ItemValue className="media-menu__hint-label" />
269
- <MenuChevron />
270
- </span>
271
- </div>
223
+ </Menu.Content>
224
+ </Menu.Root>
225
+ ) : null}
226
+
227
+ {hasCaptions ? (
228
+ <Menu.Root>
229
+ <Menu.Trigger
230
+ className="media-menu__item media-menu__item--submenu"
231
+ render={(props) => (
232
+ <div {...props}>
233
+ <CaptionsOffIcon className="media-icon" />
234
+ <span>{t(captionsText)}</span>
235
+ <span className="media-menu__hint">
236
+ <span className="media-menu__hint-label">{captions.selectedLabel}</span>
237
+ <MenuChevron />
238
+ </span>
239
+ </div>
240
+ )}
241
+ />
242
+ <Menu.Content className="media-menu__panel">
243
+ <Menu.Item className="media-menu__back">
244
+ <MenuChevron flipped />
245
+ {t(captionsText)}
246
+ </Menu.Item>
247
+ <Menu.Separator className="media-menu__separator" />
248
+ <CaptionsRadioGroup
249
+ className="media-menu__group"
250
+ aria-label={t(captionsText)}
251
+ renderItem={(props, item) => (
252
+ <Menu.RadioItem {...props} className="media-menu__item">
253
+ <span>{item.label}</span>
254
+ <Menu.ItemIndicator checked={item.checked} forceMount className="media-menu__indicator">
255
+ <CheckIcon className="media-icon" />
256
+ </Menu.ItemIndicator>
257
+ </Menu.RadioItem>
272
258
  )}
273
259
  />
274
- <Menu.Content className="media-menu__panel">
275
- <Menu.Back className="media-menu__back">
276
- <MenuChevron flipped />
277
- {t(captionsText)}
278
- </Menu.Back>
279
- <Menu.Separator className="media-menu__separator" />
280
- <Menu.RadioGroup
281
- className="media-menu__group"
282
- value={captions.value}
283
- onValueChange={captions.setValue}
284
- aria-label={t(captionsText)}
285
- >
286
- {captions.options.map((option) => (
287
- <Menu.RadioItem
288
- key={option.value}
289
- className="media-menu__item"
290
- value={option.value}
291
- disabled={option.disabled}
292
- >
293
- <span>{option.label}</span>
294
- <Menu.ItemIndicator
295
- checked={option.value === captions.value}
296
- forceMount
297
- className="media-menu__indicator"
298
- >
299
- <CheckIcon className="media-icon" />
300
- </Menu.ItemIndicator>
301
- </Menu.RadioItem>
302
- ))}
303
- </Menu.RadioGroup>
304
- </Menu.Content>
305
- </Menu.Root>
306
- ) : null}
307
- </div>
308
- </Menu.View>
260
+ </Menu.Content>
261
+ </Menu.Root>
262
+ ) : null}
263
+ </div>
309
264
  </Menu.Content>
310
265
  </Menu.Root>
311
266
  );
@@ -415,7 +370,7 @@ export function VideoPlayer({ src, className, poster, placeholder, style, ...res
415
370
  : style;
416
371
 
417
372
  return (
418
- <Player.Provider>
373
+ <Player>
419
374
  <Container
420
375
  className={`media-default-skin media-default-skin--video ${className ?? ''}`}
421
376
  style={containerStyle}
@@ -475,19 +430,28 @@ export function VideoPlayer({ src, className, poster, placeholder, style, ...res
475
430
  <div className="media-time-controls">
476
431
  <Time.Value type="current" className="media-time" />
477
432
  <TimeSlider.Root className="media-slider">
478
- <TimeSlider.Track className="media-slider__track">
479
- <TimeSlider.Fill className="media-slider__fill" />
480
- <TimeSlider.Buffer className="media-slider__buffer" />
481
- </TimeSlider.Track>
433
+ <TimeSlider.Chapters
434
+ className="media-slider__chapters"
435
+ renderChapter={(props) => (
436
+ <div {...props} className={`${props.className} media-slider__chapter`}>
437
+ <TimeSlider.Track className="media-slider__track media-slider__chapter-track">
438
+ <TimeSlider.Buffer className="media-slider__buffer" />
439
+ <TimeSlider.Fill className="media-slider__fill" />
440
+ </TimeSlider.Track>
441
+ </div>
442
+ )}
443
+ />
482
444
  <TimeSlider.Thumb className="media-slider__thumb" />
483
445
 
484
- <div className="media-surface media-thumbnail media-slider__thumbnail">
485
- <Slider.Thumbnail className="media-thumbnail__image" />
486
- <TimeSlider.Value type="pointer" className="media-time media-thumbnail__time" />
487
- <SpinnerIcon className="media-thumbnail__spinner media-icon" />
488
- </div>
489
- <TimeSlider.Preview className="media-slider__preview">
490
- <TimeSlider.Value type="pointer" className="media-time media-slider__value" />
446
+ <TimeSlider.Preview overflow="visible" className="media-slider__preview">
447
+ <div className="media-surface media-thumbnail media-slider__thumbnail">
448
+ <Slider.Thumbnail className="media-thumbnail__image" />
449
+ <SpinnerIcon className="media-thumbnail__spinner media-icon" />
450
+ </div>
451
+ <div className="media-slider__value">
452
+ <TimeSlider.ChapterTitle className="media-slider__chapter-title" />
453
+ <TimeSlider.Value type="pointer" className="media-time" />
454
+ </div>
491
455
  </TimeSlider.Preview>
492
456
  </TimeSlider.Root>
493
457
  <Time.Value toggle type="remaining" className="media-time" />
@@ -552,46 +516,49 @@ export function VideoPlayer({ src, className, poster, placeholder, style, ...res
552
516
  <Gesture type="doubletap" action="toggleFullscreen" region="center" />
553
517
  <Gesture type="doubletap" action="seekStep" value={SEEK_TIME} region="right" />
554
518
 
555
- {/* Input Feedback */}
519
+ {/* Input Indicators */}
556
520
  <StatusAnnouncer className="media-sr-only" />
557
- <div className="media-input-feedback">
558
- <VolumeIndicator.Root className="media-surface media-input-feedback-island media-input-feedback-island--volume">
559
- <VolumeIndicator.Fill className="media-input-feedback-island__content">
521
+ <div className="media-input-indicator-overlay">
522
+ <VolumeIndicator.Root className="media-surface media-volume-indicator">
523
+ <VolumeIndicator.Fill className="media-volume-indicator__content">
560
524
  <VolumeHighIcon className="media-icon media-icon--volume-high" />
561
525
  <VolumeLowIcon className="media-icon media-icon--volume-low" />
562
526
  <VolumeOffIcon className="media-icon media-icon--volume-off" />
563
- <VolumeIndicator.Value className="media-input-feedback-island__value" />
527
+ <VolumeIndicator.Value className="media-volume-indicator__value" />
564
528
  </VolumeIndicator.Fill>
565
529
  </VolumeIndicator.Root>
566
530
 
567
531
  <StatusIndicator.Root
568
532
  actions={TOP_STATUS_ACTIONS}
569
- className="media-surface media-input-feedback-island media-input-feedback-island--status"
533
+ className="media-surface media-status-indicator media-status-indicator--state"
570
534
  >
571
- <div className="media-input-feedback-island__content">
535
+ <div className="media-status-indicator__content">
572
536
  <CaptionsOnIcon className="media-icon media-icon--captions-on" />
573
537
  <CaptionsOffIcon className="media-icon media-icon--captions-off" />
574
538
  <FullscreenEnterIcon className="media-icon media-icon--fullscreen-enter" />
575
539
  <FullscreenExitIcon className="media-icon media-icon--fullscreen-exit" />
576
540
  <PipEnterIcon className="media-icon media-icon--pip-enter" />
577
541
  <PipExitIcon className="media-icon media-icon--pip-exit" />
578
- <StatusIndicator.Value className="media-input-feedback-island__value" />
542
+ <StatusIndicator.Value className="media-status-indicator__value" />
579
543
  </div>
580
544
  </StatusIndicator.Root>
581
545
 
582
- <SeekIndicator.Root className="media-input-feedback-bubble">
546
+ <SeekIndicator.Root className="media-seek-indicator">
583
547
  <ChevronIcon className="media-icon media-icon--seek" />
584
- <SeekIndicator.Value className="media-time" />
548
+ <SeekIndicator.Value className="media-seek-indicator__value" />
585
549
  </SeekIndicator.Root>
586
550
 
587
- <StatusIndicator.Root actions={CENTER_STATUS_ACTIONS} className="media-input-feedback-bubble">
551
+ <StatusIndicator.Root
552
+ actions={CENTER_STATUS_ACTIONS}
553
+ className="media-status-indicator media-status-indicator--playback"
554
+ >
588
555
  <PlayIcon className="media-icon media-icon--play" />
589
556
  <PauseIcon className="media-icon media-icon--pause" />
590
557
  </StatusIndicator.Root>
591
558
  </div>
592
559
  </Container>
593
560
 
594
- </Player.Provider>
561
+ </Player>
595
562
  );
596
563
  }
597
564
 
@@ -611,7 +578,7 @@ const Button = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(function
611
578
  });
612
579
 
613
580
  function VolumePopover(): ReactNode {
614
- const volumeUnsupported = usePlayer((s) => s.volumeAvailability === 'unsupported');
581
+ const volumeUnavailable = usePlayer((s) => s.volumeAvailability !== 'available');
615
582
 
616
583
  const muteButton = (
617
584
  <MuteButton className="media-button--mute" render={<Button />}>
@@ -621,7 +588,7 @@ function VolumePopover(): ReactNode {
621
588
  </MuteButton>
622
589
  );
623
590
 
624
- if (volumeUnsupported) return muteButton;
591
+ if (volumeUnavailable) return muteButton;
625
592
 
626
593
  return (
627
594
  <Popover.Root openOnHover delay={200} closeDelay={100} side="top">
@@ -654,7 +621,7 @@ function isRenderProp(value: unknown): value is RenderProp<unknown> {
654
621
  import { createPlayer } from '@videojs/react';
655
622
  import { videoFeatures } from '@videojs/react/video';
656
623
 
657
- export const Player = createPlayer({ features: videoFeatures });
624
+ export const { Player } = createPlayer({ features: videoFeatures });
658
625
  ```
659
626
  ```
660
627
  .media-sr-only {
@@ -670,10 +637,6 @@ export const Player = createPlayer({ features: videoFeatures });
670
637
  }
671
638
 
672
639
 
673
- /* ==========================================================================
674
- Reset
675
- ========================================================================== */
676
-
677
640
  .media-default-skin *,
678
641
  .media-default-skin *::before,
679
642
  .media-default-skin *::after {
@@ -698,29 +661,37 @@ export const Player = createPlayer({ features: videoFeatures });
698
661
  }
699
662
  }
700
663
 
701
- /* ==========================================================================
702
- Root Container
703
- ========================================================================== */
704
-
705
664
  .media-default-skin {
706
665
  /* Colors */
707
- --media-current-shadow-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));
708
- --media-current-shadow-color-subtle: oklch(from var(--media-current-shadow-color) l c h / calc(alpha * 0.4));
666
+ --accent-color: var(--media-accent-color, var(--default-accent-color));
667
+ --accent-contrast-color: contrast-color(var(--accent-color));
668
+ --accent-background-color: var(
669
+ --media-accent-color,
670
+ oklch(from var(--default-accent-color) l c h / calc(alpha * 0.1))
671
+ );
672
+ --accent-text-color: var(--media-accent-text-color, contrast-color(var(--media-accent-color, oklch(0 0 0))));
673
+ --shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));
674
+ --shadow-subtle-current-color: oklch(from var(--shadow-current-color) l c h / calc(alpha * 0.4));
709
675
  --scrollbar-thumb-color: oklch(from currentColor l c h / 0.3);
710
676
 
711
- /* Scaling (used in video fullscreen) */
677
+ /* Scaling - used in video fullscreen to scale the UI. */
712
678
  --scale: 1;
713
- /* What value and unit to use - 1rem assumes the document font size remains at the default 16px */
714
- --base-size: 1rem;
715
- --size: calc(var(--base-size) * var(--scale));
716
- /* Create a Tailwind-like spacing unit */
679
+ /* Fixed scaling unit to avoid inheriting the document's root font size. This must be a CSS <length>. */
680
+ --scale-unit: var(--media-scale-unit, 16px);
681
+ --size: calc(var(--scale-unit) * var(--scale));
682
+ /* Create a Tailwind-like spacing unit where 1 equals 4px with default scaling. */
717
683
  --spacing: calc(var(--size) / 4);
684
+
685
+ /* Font sizes */
718
686
  --font-size-medium: calc(0.9375 * var(--size)); /* 15px */
719
687
  --font-size-base: calc(0.8125 * var(--size)); /* 13px */
720
688
  --font-size-small: calc(0.6875 * var(--size)); /* 11px */
721
689
  --font-size-tiny: calc(0.5625 * var(--size)); /* 9px */
722
690
  --media-icon-size: calc(1.125 * var(--size)); /* 18px */
723
691
 
692
+ /* Radii */
693
+ --container-border-radius: var(--media-border-radius, 1.75rem);
694
+
724
695
  position: relative;
725
696
  display: block;
726
697
  width: 100%;
@@ -741,14 +712,14 @@ export const Player = createPlayer({ features: videoFeatures });
741
712
  outline-offset: -4px;
742
713
  scrollbar-color: var(--scrollbar-thumb-color) transparent;
743
714
  scrollbar-width: thin;
744
- border-radius: var(--media-border-radius, 1.75rem);
715
+ border-radius: var(--container-border-radius, 1.75rem);
745
716
  isolation: isolate;
746
717
  transition-timing-function: ease-out;
747
718
  transition-duration: 100ms;
748
719
  transition-property: outline-offset, outline-color;
749
720
 
750
721
  &:focus-visible {
751
- outline-color: currentColor;
722
+ outline-color: var(--focus-ring-color);
752
723
  outline-offset: 2px;
753
724
  }
754
725
 
@@ -763,17 +734,13 @@ export const Player = createPlayer({ features: videoFeatures });
763
734
  }
764
735
  }
765
736
 
766
- /* ==========================================================================
767
- Surface (shared glass effect for tooltips, popovers, controls)
768
- ========================================================================== */
769
-
770
737
  .media-default-skin .media-surface {
771
- background-color: var(--media-surface-background-color);
738
+ background-color: var(--surface-background-color);
772
739
  box-shadow:
773
- 0 0 0 1px var(--media-surface-outer-border-color),
774
- 0 1px 3px 0 var(--media-surface-shadow-color),
775
- 0 1px 2px -1px var(--media-surface-shadow-color);
776
- backdrop-filter: var(--media-surface-backdrop-filter);
740
+ 0 0 0 1px var(--surface-outer-border-color),
741
+ 0 1px 3px 0 var(--surface-shadow-color),
742
+ 0 1px 2px -1px var(--surface-shadow-color);
743
+ backdrop-filter: var(--surface-backdrop-filter);
777
744
 
778
745
  /* Inner border ring */
779
746
  &::after {
@@ -784,15 +751,11 @@ export const Player = createPlayer({ features: videoFeatures });
784
751
  content: "";
785
752
  border-radius: inherit;
786
753
  box-shadow:
787
- inset 0 1px 0 0 var(--media-surface-inner-border-color),
788
- inset 0 0 0 1px oklch(from var(--media-surface-inner-border-color) l c h / calc(alpha * 0.5));
754
+ inset 0 1px 0 0 var(--surface-inner-border-color),
755
+ inset 0 0 0 1px oklch(from var(--surface-inner-border-color) l c h / calc(alpha * 0.5));
789
756
  }
790
757
  }
791
758
 
792
- /* ==========================================================================
793
- Media Element
794
- ========================================================================== */
795
-
796
759
  .media-default-skin ::slotted(video),
797
760
  .media-default-skin video {
798
761
  display: block;
@@ -802,7 +765,7 @@ export const Player = createPlayer({ features: videoFeatures });
802
765
  object-position: var(--media-object-position, center);
803
766
  }
804
767
  .media-default-skin ::slotted(video) {
805
- border-radius: var(--media-video-border-radius);
768
+ border-radius: var(--container-border-radius);
806
769
  }
807
770
  .media-default-skin video {
808
771
  border-radius: inherit;
@@ -813,10 +776,6 @@ export const Player = createPlayer({ features: videoFeatures });
813
776
  object-fit: contain;
814
777
  }
815
778
 
816
- /* ==========================================================================
817
- Overlay / Scrim
818
- ========================================================================== */
819
-
820
779
  .media-default-skin .media-overlay {
821
780
  position: absolute;
822
781
  inset: 0;
@@ -826,13 +785,13 @@ export const Player = createPlayer({ features: videoFeatures });
826
785
  opacity: 0;
827
786
  backdrop-filter: blur(0) saturate(1);
828
787
  transition-timing-function: ease-out;
829
- transition-duration: var(--media-controls-transition-duration);
788
+ transition-duration: var(--controls-transition-duration);
830
789
  transition-property: opacity, backdrop-filter;
831
790
  }
832
791
 
833
792
  .media-default-skin .media-error ~ .media-overlay {
834
- transition-delay: var(--media-error-dialog-transition-delay);
835
- transition-duration: var(--media-error-dialog-transition-duration);
793
+ transition-delay: var(--error-dialog-transition-delay);
794
+ transition-duration: var(--error-dialog-transition-duration);
836
795
  }
837
796
 
838
797
  .media-default-skin .media-controls[data-visible] ~ .media-overlay,
@@ -850,10 +809,6 @@ export const Player = createPlayer({ features: videoFeatures });
850
809
  backdrop-filter: blur(16px) saturate(1.5);
851
810
  }
852
811
 
853
- /* ==========================================================================
854
- Buffering Indicator
855
- ========================================================================== */
856
-
857
812
  .media-default-skin .media-buffering-indicator {
858
813
  position: absolute;
859
814
  inset: 0;
@@ -870,11 +825,11 @@ export const Player = createPlayer({ features: videoFeatures });
870
825
  &[data-visible] {
871
826
  display: grid;
872
827
  }
873
- }
874
828
 
875
- /* ==========================================================================
876
- Error Dialog
877
- ========================================================================== */
829
+ @media (prefers-reduced-motion: reduce) {
830
+ --media-spinner-animation: none;
831
+ }
832
+ }
878
833
 
879
834
  .media-default-skin .media-error {
880
835
  outline: none;
@@ -898,7 +853,7 @@ export const Player = createPlayer({ features: videoFeatures });
898
853
  display: flex;
899
854
  gap: calc(var(--spacing) * 2);
900
855
 
901
- & > * {
856
+ > * {
902
857
  flex: 1;
903
858
  }
904
859
  }
@@ -907,10 +862,6 @@ export const Player = createPlayer({ features: videoFeatures });
907
862
  visibility: hidden;
908
863
  }
909
864
 
910
- /* ==========================================================================
911
- Controls
912
- ========================================================================== */
913
-
914
865
  .media-default-skin .media-controls {
915
866
  --media-popover-side-offset: calc(var(--spacing) * (var(--base-side-offset, 2) + 1));
916
867
  --media-tooltip-side-offset: var(--media-popover-side-offset);
@@ -921,14 +872,10 @@ export const Player = createPlayer({ features: videoFeatures });
921
872
  align-items: center;
922
873
  padding: calc(var(--spacing) * 1);
923
874
  container: media-controls / inline-size;
924
- text-shadow: 0 1px 0 var(--media-current-shadow-color);
875
+ text-shadow: 0 1px 0 var(--shadow-current-color);
925
876
  border-radius: calc(Infinity * 1px);
926
877
  }
927
878
 
928
- /* ==========================================================================
929
- Time Display
930
- ========================================================================== */
931
-
932
879
  .media-default-skin .media-time-controls {
933
880
  display: flex;
934
881
  flex: 1;
@@ -936,8 +883,8 @@ export const Player = createPlayer({ features: videoFeatures });
936
883
  align-items: center;
937
884
  container: media-time-controls / inline-size;
938
885
 
939
- & .media-time:last-child {
940
- @container media-time-controls (width < 10rem) {
886
+ > .media-time:last-child {
887
+ @container media-time-controls (width < 16rem) {
941
888
  display: none;
942
889
  }
943
890
  }
@@ -957,15 +904,11 @@ export const Player = createPlayer({ features: videoFeatures });
957
904
  transition-property: outline-color, outline-offset;
958
905
 
959
906
  &:focus-visible {
960
- outline-color: currentColor;
907
+ outline-color: var(--focus-ring-color);
961
908
  outline-offset: 2px;
962
909
  }
963
910
  }
964
911
 
965
- /* ==========================================================================
966
- Buttons
967
- ========================================================================== */
968
-
969
912
  /* Base button */
970
913
  .media-default-skin .media-button {
971
914
  display: flex;
@@ -985,32 +928,31 @@ export const Player = createPlayer({ features: videoFeatures });
985
928
  border-radius: calc(Infinity * 1px);
986
929
  transition-timing-function: ease-out;
987
930
  transition-duration: 150ms;
988
- transition-property: background-color, outline-offset, scale;
931
+ transition-property: background-color, color, outline-offset, scale;
989
932
  /* Fix weird jumping when clicking on the buttons in Safari. */
990
933
  will-change: scale;
991
934
 
992
935
  &:focus-visible {
993
- outline-color: currentColor;
936
+ outline-color: var(--focus-ring-color);
994
937
  outline-offset: 2px;
995
938
  }
996
939
 
997
940
  &:active:not([aria-disabled="true"]) {
998
- scale: 0.98;
941
+ scale: 0.97;
999
942
  }
1000
943
 
1001
944
  &[aria-disabled="true"] {
1002
945
  cursor: not-allowed;
1003
946
  opacity: 0.5;
1004
- filter: grayscale(1);
1005
947
  }
1006
948
  }
1007
949
 
1008
950
  /* Primary button variant */
1009
951
  .media-default-skin .media-button--primary {
1010
952
  font-weight: 500;
1011
- color: oklch(0 0 0);
953
+ color: var(--accent-contrast-color);
1012
954
  text-shadow: none;
1013
- background: oklch(1 0 0);
955
+ background: var(--accent-color);
1014
956
  }
1015
957
 
1016
958
  /* Subtle button variant */
@@ -1019,11 +961,14 @@ export const Player = createPlayer({ features: videoFeatures });
1019
961
  text-shadow: inherit;
1020
962
  background: transparent;
1021
963
 
1022
- &:hover,
1023
- &:focus-visible,
1024
- &[aria-expanded="true"] {
1025
- text-decoration: none;
1026
- background-color: oklch(from currentColor l c h / 0.1);
964
+ &:not([aria-disabled="true"]) {
965
+ &:hover,
966
+ &:focus-visible,
967
+ &[aria-expanded="true"] {
968
+ color: var(--accent-text-color);
969
+ text-decoration: none;
970
+ background-color: var(--accent-background-color);
971
+ }
1027
972
  }
1028
973
  }
1029
974
 
@@ -1034,26 +979,25 @@ export const Player = createPlayer({ features: videoFeatures });
1034
979
  padding: 0;
1035
980
 
1036
981
  &:active:not([aria-disabled="true"]) {
1037
- scale: 0.9;
982
+ scale: 0.97;
1038
983
  }
1039
984
 
1040
- & .media-icon__container {
985
+ .media-icon__container {
1041
986
  display: grid;
1042
987
  }
1043
988
 
1044
- & .media-icon {
989
+ .media-icon {
1045
990
  grid-area: 1 / 1;
1046
- transition-behavior: allow-discrete;
1047
- transition-property: display, opacity;
1048
- transition-duration: 150ms;
991
+ filter: drop-shadow(0 1px 0 var(--shadow-current-color));
1049
992
  transition-timing-function: ease-out;
1050
- filter: drop-shadow(0 1px 0 var(--media-current-shadow-color));
993
+ transition-duration: 150ms;
994
+ transition-property: opacity, scale;
1051
995
  }
1052
996
  }
1053
997
 
1054
998
  /* Seek button */
1055
999
  .media-default-skin .media-button--seek {
1056
- & .media-icon__label {
1000
+ .media-icon__label {
1057
1001
  position: absolute;
1058
1002
  right: -1px;
1059
1003
  bottom: -3px;
@@ -1086,7 +1030,7 @@ export const Player = createPlayer({ features: videoFeatures });
1086
1030
 
1087
1031
  /* Settings button */
1088
1032
  .media-default-skin .media-button--settings {
1089
- & .media-icon--settings {
1033
+ .media-icon--settings {
1090
1034
  transition: transform 150ms ease-in-out;
1091
1035
 
1092
1036
  @media (prefers-reduced-motion: reduce) {
@@ -1131,9 +1075,13 @@ export const Player = createPlayer({ features: videoFeatures });
1131
1075
  }
1132
1076
  }
1133
1077
 
1134
- /* ==========================================================================
1135
- Button Groups
1136
- ========================================================================== */
1078
+ @media (prefers-reduced-motion: reduce) {
1079
+ .media-default-skin .media-button {
1080
+ scale: 1;
1081
+ transition-property: background-color, color, outline-offset;
1082
+ will-change: auto;
1083
+ }
1084
+ }
1137
1085
 
1138
1086
  .media-default-skin .media-button-group {
1139
1087
  display: flex;
@@ -1141,10 +1089,6 @@ export const Player = createPlayer({ features: videoFeatures });
1141
1089
  align-items: center;
1142
1090
  }
1143
1091
 
1144
- /* ==========================================================================
1145
- Badge
1146
- ========================================================================== */
1147
-
1148
1092
  .media-default-skin .media-badge {
1149
1093
  padding: calc(var(--spacing) * 0.5) calc(var(--spacing) * 1.5);
1150
1094
  font-size: var(--font-size-small);
@@ -1156,10 +1100,6 @@ export const Player = createPlayer({ features: videoFeatures });
1156
1100
  border-radius: calc(Infinity * 1px);
1157
1101
  }
1158
1102
 
1159
- /* ==========================================================================
1160
- Icons
1161
- ========================================================================== */
1162
-
1163
1103
  .media-default-skin .media-icon__container {
1164
1104
  position: relative;
1165
1105
  }
@@ -1173,10 +1113,6 @@ export const Player = createPlayer({ features: videoFeatures });
1173
1113
  scale: -1 1;
1174
1114
  }
1175
1115
 
1176
- /* ==========================================================================
1177
- Poster Image
1178
- ========================================================================== */
1179
-
1180
1116
  .media-default-skin media-poster,
1181
1117
  .media-default-skin > img {
1182
1118
  position: absolute;
@@ -1199,7 +1135,7 @@ export const Player = createPlayer({ features: videoFeatures });
1199
1135
  height: 100%;
1200
1136
  object-fit: var(--media-object-fit, contain);
1201
1137
  object-position: var(--media-object-position, center);
1202
- border-radius: var(--media-video-border-radius);
1138
+ border-radius: var(--container-border-radius);
1203
1139
  }
1204
1140
  .media-default-skin > img {
1205
1141
  object-fit: var(--media-object-fit, contain);
@@ -1237,18 +1173,17 @@ export const Player = createPlayer({ features: videoFeatures });
1237
1173
  object-fit: contain;
1238
1174
  }
1239
1175
 
1240
- /* ==========================================================================
1241
- Media thumbnail
1242
- ========================================================================== */
1243
-
1244
1176
  .media-default-skin .media-thumbnail {
1177
+ position: relative;
1245
1178
  pointer-events: none;
1246
1179
  background-color: oklch(0 0 0 / 0.9);
1247
1180
  border-radius: calc(var(--spacing) * 3);
1248
1181
 
1249
- & .media-thumbnail__image {
1182
+ .media-thumbnail__image {
1250
1183
  position: relative;
1251
1184
  display: block;
1185
+ max-width: var(--thumbnail-max-width);
1186
+ max-height: var(--max-height);
1252
1187
  overflow: clip;
1253
1188
  border-radius: inherit;
1254
1189
 
@@ -1261,14 +1196,7 @@ export const Player = createPlayer({ features: videoFeatures });
1261
1196
  }
1262
1197
  }
1263
1198
 
1264
- & .media-thumbnail__time {
1265
- position: absolute;
1266
- inset-inline: 0;
1267
- bottom: calc(var(--spacing) * 2);
1268
- text-align: center;
1269
- }
1270
-
1271
- & .media-thumbnail__spinner {
1199
+ .media-thumbnail__spinner {
1272
1200
  position: absolute;
1273
1201
  top: 50%;
1274
1202
  left: 50%;
@@ -1276,32 +1204,41 @@ export const Player = createPlayer({ features: videoFeatures });
1276
1204
  translate: -50% -50%;
1277
1205
  }
1278
1206
 
1279
- & .media-thumbnail__image,
1280
- & .media-thumbnail__spinner {
1207
+ .media-thumbnail__image,
1208
+ .media-thumbnail__spinner {
1281
1209
  transition: opacity 150ms ease-out;
1282
1210
  }
1283
1211
 
1284
1212
  &:not(:has(.media-thumbnail__image[data-loading])) {
1285
- & .media-thumbnail__spinner {
1213
+ .media-thumbnail__spinner {
1286
1214
  --media-spinner-animation: none;
1287
1215
  }
1288
1216
  }
1289
1217
 
1218
+ @media (prefers-reduced-motion: reduce) {
1219
+ --media-spinner-animation: none;
1220
+ }
1221
+
1290
1222
  &:has(.media-thumbnail__image[data-loading]) {
1291
- & .media-thumbnail__image {
1223
+ width: var(--thumbnail-max-width);
1224
+ max-width: 100%;
1225
+ aspect-ratio: 16 / 9;
1226
+ overflow: hidden;
1227
+
1228
+ .media-thumbnail__image {
1292
1229
  opacity: 0;
1293
1230
  }
1294
- & .media-thumbnail__spinner {
1231
+ .media-thumbnail__spinner {
1295
1232
  opacity: 1;
1296
1233
  }
1297
1234
  }
1298
1235
  }
1299
1236
 
1300
- /* ==========================================================================
1301
- Slider
1302
- ========================================================================== */
1303
-
1304
1237
  .media-default-skin .media-slider {
1238
+ --thumb-size: calc(var(--spacing) * 2.5);
1239
+ --thumb-active-size: calc(var(--spacing) * 3);
1240
+ --track-border-radius: calc(Infinity * 1px);
1241
+
1305
1242
  position: relative;
1306
1243
  display: flex;
1307
1244
  flex: 1;
@@ -1309,7 +1246,6 @@ export const Player = createPlayer({ features: videoFeatures });
1309
1246
  justify-content: center;
1310
1247
  cursor: pointer;
1311
1248
  outline: none;
1312
- border-radius: calc(infinity * 1px);
1313
1249
 
1314
1250
  &[data-orientation="horizontal"] {
1315
1251
  width: var(--slider-width, 100%);
@@ -1322,11 +1258,12 @@ export const Player = createPlayer({ features: videoFeatures });
1322
1258
  }
1323
1259
 
1324
1260
  /* Track */
1325
- & .media-slider__track {
1261
+ .media-slider__track {
1326
1262
  position: relative;
1327
1263
  overflow: hidden;
1328
1264
  user-select: none;
1329
- border-radius: inherit;
1265
+ background-color: oklch(from currentColor l c h / 0.2);
1266
+ border-radius: var(--track-border-radius);
1330
1267
  isolation: isolate;
1331
1268
 
1332
1269
  &[data-orientation="horizontal"] {
@@ -1339,19 +1276,192 @@ export const Player = createPlayer({ features: videoFeatures });
1339
1276
  }
1340
1277
  }
1341
1278
 
1279
+ /* Shared track fills */
1280
+ .media-slider__buffer,
1281
+ .media-slider__fill {
1282
+ position: absolute;
1283
+ pointer-events: none;
1284
+ border-radius: inherit;
1285
+
1286
+ &[data-orientation="horizontal"] {
1287
+ inset-block: 0;
1288
+ left: 0;
1289
+ width: 100%;
1290
+ transition-property: clip-path;
1291
+ }
1292
+ &[data-orientation="vertical"] {
1293
+ inset-inline: 0;
1294
+ bottom: 0;
1295
+ height: 100%;
1296
+ transition-property: clip-path;
1297
+ }
1298
+ }
1299
+
1300
+ /* Buffer */
1301
+ .media-slider__buffer {
1302
+ background-color: oklch(from currentColor l c h / 0.2);
1303
+
1304
+ &[data-orientation="horizontal"] {
1305
+ clip-path: inset(0 calc(100% - var(--media-slider-buffer)) 0 0 round var(--track-border-radius));
1306
+ }
1307
+ &[data-orientation="vertical"] {
1308
+ clip-path: inset(calc(100% - var(--media-slider-buffer)) 0 0 0 round var(--track-border-radius));
1309
+ }
1310
+ }
1311
+
1312
+ /* Fill */
1313
+ .media-slider__fill {
1314
+ background-color: var(--accent-color);
1315
+
1316
+ &[data-orientation="horizontal"] {
1317
+ clip-path: inset(0 calc(100% - var(--media-slider-fill)) 0 0 round var(--track-border-radius));
1318
+ }
1319
+ &[data-orientation="vertical"] {
1320
+ clip-path: inset(calc(100% - var(--media-slider-fill)) 0 0 0 round var(--track-border-radius));
1321
+ }
1322
+ }
1323
+
1324
+ /* Chapters */
1325
+ .media-slider__chapters {
1326
+ position: relative;
1327
+ display: flex;
1328
+ flex: 1;
1329
+ align-items: center;
1330
+ min-width: 0;
1331
+ min-height: 0;
1332
+ border-radius: inherit;
1333
+
1334
+ &[data-orientation="horizontal"] {
1335
+ width: 100%;
1336
+ height: 100%;
1337
+ }
1338
+ &[data-orientation="vertical"] {
1339
+ flex-direction: column-reverse;
1340
+ width: 100%;
1341
+ height: 100%;
1342
+ }
1343
+ }
1344
+
1345
+ .media-slider__chapter {
1346
+ --chapter-gap: calc(var(--spacing) * 1);
1347
+ --chapter-inset-start: 0.5;
1348
+ --chapter-inset-end: 0.5;
1349
+
1350
+ position: absolute;
1351
+ inset: 0;
1352
+ display: flex;
1353
+ align-items: center;
1354
+ justify-content: center;
1355
+ min-width: 0;
1356
+ min-height: 0;
1357
+ border-radius: inherit;
1358
+
1359
+ &:first-child {
1360
+ --chapter-inset-start: 0;
1361
+ }
1362
+ &:last-child {
1363
+ --chapter-inset-end: 0;
1364
+ }
1365
+
1366
+ .media-slider__chapter-track {
1367
+ --chapter-track-size: calc(var(--spacing) * 1);
1368
+ --chapter-track-highlighted-size: calc(var(--spacing) * 1.75);
1369
+
1370
+ border-radius: inherit;
1371
+
1372
+ @media (prefers-reduced-motion: no-preference) {
1373
+ transition: 200ms ease-out;
1374
+ transition-property: height, width;
1375
+ }
1376
+ }
1377
+
1378
+ &[data-orientation="horizontal"] {
1379
+ clip-path: inset(0 calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start));
1380
+
1381
+ .media-slider__chapter-track {
1382
+ height: var(--chapter-track-size);
1383
+ clip-path: inset(
1384
+ 0 calc(100% - var(--media-slider-chapter-end) + var(--chapter-gap) * var(--chapter-inset-end)) 0
1385
+ calc(var(--media-slider-chapter-start) + var(--chapter-gap) * var(--chapter-inset-start)) round
1386
+ var(--track-border-radius)
1387
+ );
1388
+ }
1389
+
1390
+ &[data-highlighted] .media-slider__chapter-track {
1391
+ height: var(--chapter-track-highlighted-size);
1392
+ }
1393
+ }
1394
+
1395
+ &[data-orientation="vertical"] {
1396
+ clip-path: inset(calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start) 0);
1397
+
1398
+ .media-slider__chapter-track {
1399
+ width: var(--chapter-track-size);
1400
+ clip-path: inset(
1401
+ calc(100% - var(--media-slider-chapter-end) + var(--chapter-gap) * var(--chapter-inset-end)) 0
1402
+ calc(var(--media-slider-chapter-start) + var(--chapter-gap) * var(--chapter-inset-start)) 0 round
1403
+ var(--track-border-radius)
1404
+ );
1405
+ }
1406
+
1407
+ &[data-highlighted] .media-slider__chapter-track {
1408
+ width: var(--chapter-track-highlighted-size);
1409
+ }
1410
+ }
1411
+ }
1412
+
1413
+ /* Dragging — thumb and fill follow the pointer position */
1414
+ &[data-dragging] {
1415
+ .media-slider__thumb[data-orientation="horizontal"] {
1416
+ left: var(--media-slider-pointer);
1417
+ }
1418
+ .media-slider__thumb[data-orientation="vertical"] {
1419
+ top: calc(100% - var(--media-slider-pointer));
1420
+ }
1421
+ .media-slider__fill[data-orientation="horizontal"] {
1422
+ clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--track-border-radius));
1423
+ }
1424
+ .media-slider__fill[data-orientation="vertical"] {
1425
+ clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--track-border-radius));
1426
+ }
1427
+ }
1428
+
1429
+ @media (prefers-reduced-motion: no-preference) {
1430
+ .media-slider__thumb {
1431
+ transition-property: opacity, height, width, outline-offset, left, top;
1432
+ }
1433
+ .media-slider__fill {
1434
+ transition-timing-function: linear;
1435
+ transition-duration: 200ms;
1436
+ }
1437
+ .media-slider__buffer {
1438
+ transition-timing-function: ease-out;
1439
+ transition-duration: 250ms;
1440
+ }
1441
+ }
1442
+
1443
+ &[data-dragging],
1444
+ &[data-seeking] {
1445
+ .media-slider__thumb,
1446
+ .media-slider__fill,
1447
+ .media-slider__buffer {
1448
+ transition-duration: 0ms;
1449
+ }
1450
+ }
1451
+
1342
1452
  /* Thumb */
1343
- & .media-slider__thumb {
1453
+ .media-slider__thumb {
1344
1454
  position: absolute;
1345
1455
  z-index: 10;
1346
- width: calc(var(--spacing) * 2.5);
1347
- height: calc(var(--spacing) * 2.5);
1456
+ width: var(--thumb-size);
1457
+ height: var(--thumb-size);
1348
1458
  user-select: none;
1349
1459
  outline: 4px solid transparent;
1350
1460
  outline-offset: -4px;
1351
1461
  background-color: currentColor;
1352
1462
  border-radius: calc(Infinity * 1px);
1353
1463
  box-shadow:
1354
- 0 0 0 1px var(--media-current-shadow-color, oklch(0 0 0 / 0.1)),
1464
+ 0 0 0 1px var(--shadow-current-color, oklch(0 0 0 / 0.1)),
1355
1465
  0 1px 3px 0 oklch(0 0 0 / 0.35),
1356
1466
  0 1px 2px -1px oklch(0 0 0 / 0.35);
1357
1467
  opacity: 0;
@@ -1369,10 +1479,17 @@ export const Player = createPlayer({ features: videoFeatures });
1369
1479
  left: 50%;
1370
1480
  }
1371
1481
 
1372
- &:hover,
1373
- &:focus {
1482
+ &:focus-visible {
1374
1483
  outline-color: oklch(from currentColor l c h / 0.15);
1375
1484
  outline-offset: 0;
1485
+ opacity: 1;
1486
+ }
1487
+
1488
+ @media (hover: hover) and (pointer: fine) {
1489
+ &:hover {
1490
+ outline-color: oklch(from currentColor l c h / 0.15);
1491
+ outline-offset: 0;
1492
+ }
1376
1493
  }
1377
1494
 
1378
1495
  &::after {
@@ -1390,148 +1507,122 @@ export const Player = createPlayer({ features: videoFeatures });
1390
1507
  opacity: 0;
1391
1508
  scale: 0.5;
1392
1509
  }
1510
+
1511
+ &.media-slider__thumb--persistent {
1512
+ width: var(--thumb-active-size);
1513
+ height: var(--thumb-active-size);
1514
+ opacity: 1;
1515
+ }
1393
1516
  }
1394
1517
 
1395
1518
  &:active .media-slider__thumb,
1396
- &:focus-within .media-slider__thumb,
1397
- & .media-slider__thumb--persistent {
1398
- width: calc(var(--spacing) * 3);
1399
- height: calc(var(--spacing) * 3);
1519
+ &:focus-within .media-slider__thumb {
1520
+ width: var(--thumb-active-size);
1521
+ height: var(--thumb-active-size);
1400
1522
  }
1401
1523
 
1402
- &:hover .media-slider__thumb,
1403
- & .media-slider__thumb:focus-visible,
1404
- & .media-slider__thumb--persistent {
1405
- opacity: 1;
1524
+ @media (hover: hover) and (pointer: fine) {
1525
+ &:hover .media-slider__thumb {
1526
+ opacity: 1;
1527
+ }
1406
1528
  }
1407
1529
 
1408
1530
  /* Preview */
1409
- & .media-slider__preview {
1410
- & .media-slider__value,
1411
- &::before {
1412
- opacity: 0;
1413
- scale: 0.5;
1414
- transition-timing-function: ease-out;
1415
- transition-duration: 200ms;
1416
- transition-property: opacity, scale;
1417
- }
1531
+ .media-slider__preview {
1532
+ --max-width: min(calc(var(--spacing) * 48), 100cqi);
1533
+ --max-height: calc(var(--spacing) * 32);
1418
1534
 
1419
- & .media-slider__value {
1535
+ min-width: var(--max-width);
1536
+ height: calc(var(--spacing) * 1);
1537
+
1538
+ .media-slider__thumbnail,
1539
+ .media-slider__value {
1420
1540
  position: absolute;
1421
- bottom: calc(var(--spacing) * 9);
1422
- text-shadow: 0 1px 0 var(--media-current-shadow-color);
1541
+ left: 50%;
1542
+ max-width: var(--max-width);
1543
+ opacity: 0;
1423
1544
  filter: blur(8px);
1545
+ transform-origin: bottom;
1546
+ scale: 0.8;
1424
1547
  translate: -50% calc(var(--spacing) * 2);
1425
- transition-property: filter, opacity, scale, translate;
1548
+ transition-timing-function: ease-out;
1549
+ transition-duration: 150ms;
1550
+ }
1551
+
1552
+ .media-slider__thumbnail {
1553
+ --thumbnail-max-width: var(--max-width);
1554
+ bottom: calc(100% + (var(--spacing) * 9));
1555
+ }
1556
+
1557
+ .media-slider__value {
1558
+ bottom: calc(100% + (var(--spacing) * 10.5));
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ align-items: center;
1562
+ text-shadow: 0 1px 0 var(--shadow-current-color);
1563
+ }
1564
+
1565
+ .media-slider__chapter-title {
1566
+ min-width: 0;
1567
+ max-width: var(--max-width);
1568
+ padding-inline: calc(var(--spacing) * 3);
1569
+ overflow: hidden;
1570
+ text-overflow: ellipsis;
1571
+ white-space: nowrap;
1572
+
1573
+ &:empty {
1574
+ display: none;
1575
+ }
1426
1576
  }
1427
1577
 
1428
1578
  &::before {
1429
- display: block;
1430
- min-width: calc(var(--spacing) * 1);
1579
+ position: absolute;
1580
+ top: 50%;
1581
+ left: 50%;
1582
+ z-index: 1;
1583
+ width: calc(var(--spacing) * 1);
1431
1584
  height: calc(var(--spacing) * 1);
1585
+ pointer-events: none;
1432
1586
  content: "";
1433
1587
  background-color: currentColor;
1434
1588
  border-radius: 100%;
1435
1589
  box-shadow:
1436
- 0 0 0 1px var(--media-current-shadow-color, oklch(0 0 0 / 0.15)),
1590
+ 0 0 0 1px var(--shadow-current-color, oklch(0 0 0 / 0.15)),
1437
1591
  0 1px 2px 0 oklch(0 0 0 / 0.35);
1592
+ opacity: 0;
1593
+ scale: 0.5;
1594
+ translate: -50% -50%;
1595
+ transition-timing-function: ease-out;
1596
+ transition-duration: 200ms;
1597
+ transition-property: opacity, scale;
1438
1598
  }
1439
1599
 
1440
- &[data-pointing] .media-slider__value,
1441
- &[data-pointing]:not([data-dragging])::before {
1600
+ &[data-pointing]:not([data-dragging])::before,
1601
+ &[data-pointing] :is(.media-slider__thumbnail, .media-slider__value),
1602
+ &[data-interactive]:not([data-pointing]):not([data-dragging]) :is(.media-slider__value, .media-slider__thumbnail) {
1442
1603
  opacity: 1;
1443
- scale: 1;
1444
- }
1445
- &[data-pointing] .media-slider__value {
1446
1604
  filter: blur(0);
1447
- translate: -50% 0;
1605
+ scale: 1;
1448
1606
  }
1449
1607
  }
1608
+ }
1450
1609
 
1451
- /* Shared track fills */
1452
- & .media-slider__buffer,
1453
- & .media-slider__fill {
1454
- position: absolute;
1455
- pointer-events: none;
1456
- border-radius: inherit;
1457
-
1458
- &[data-orientation="horizontal"],
1459
- &[data-orientation="horizontal"] {
1460
- inset-block: 0;
1461
- left: 0;
1462
- }
1463
- &[data-orientation="vertical"],
1464
- &[data-orientation="vertical"] {
1465
- inset-inline: 0;
1466
- bottom: 0;
1467
- }
1468
- }
1469
-
1470
- /* Buffer */
1471
- & .media-slider__buffer {
1472
- background-color: oklch(from currentColor l c h / 0.2);
1473
- transition-timing-function: ease-out;
1474
- transition-duration: 0.25s;
1475
-
1476
- &[data-orientation="horizontal"] {
1477
- width: var(--media-slider-buffer);
1478
- transition-property: width;
1479
- }
1480
- &[data-orientation="vertical"] {
1481
- height: var(--media-slider-buffer);
1482
- transition-property: height;
1483
- }
1484
- }
1485
-
1486
- /* Fill */
1487
- & .media-slider__fill {
1488
- background-color: currentColor;
1489
-
1490
- &[data-orientation="horizontal"] {
1491
- width: var(--media-slider-fill);
1492
- }
1493
- &[data-orientation="vertical"] {
1494
- height: var(--media-slider-fill);
1495
- }
1496
- }
1497
-
1498
- /* Dragging — thumb and fill follow the pointer position */
1499
- &[data-dragging] {
1500
- & .media-slider__thumb[data-orientation="horizontal"] {
1501
- left: var(--media-slider-pointer);
1502
- }
1503
- & .media-slider__thumb[data-orientation="vertical"] {
1504
- top: calc(100% - var(--media-slider-pointer));
1505
- }
1506
- & .media-slider__fill[data-orientation="horizontal"] {
1507
- width: var(--media-slider-pointer);
1508
- }
1509
- & .media-slider__fill[data-orientation="vertical"] {
1510
- height: var(--media-slider-pointer);
1511
- }
1512
- }
1513
- }
1514
-
1515
- /* ==========================================================================
1516
- Popups & Tooltips
1517
- ========================================================================== */
1518
-
1519
- .media-default-skin {
1520
- --media-popup-transition:
1521
- opacity var(--media-popup-transition-timing-function) var(--media-popup-transition-duration),
1522
- filter var(--media-popup-transition-timing-function) var(--media-popup-transition-duration),
1523
- transform var(--media-popup-transition-timing-function) var(--media-popup-transition-duration),
1524
- scale var(--media-popup-transition-timing-function) var(--media-popup-transition-duration);
1525
- }
1610
+ .media-default-skin {
1611
+ --popup-transition:
1612
+ opacity var(--popup-transition-timing-function) var(--popup-transition-duration),
1613
+ filter var(--popup-transition-timing-function) var(--popup-transition-duration),
1614
+ transform var(--popup-transition-timing-function) var(--popup-transition-duration),
1615
+ scale var(--popup-transition-timing-function) var(--popup-transition-duration);
1616
+ }
1526
1617
 
1527
1618
  .media-default-skin .media-popover,
1528
1619
  .media-default-skin .media-tooltip {
1529
- --popup-translate-distance: calc(0.5 * var(--base-size));
1620
+ --popup-translate-distance: calc(0.5 * var(--scale-unit));
1530
1621
  margin: 0;
1531
1622
  overflow: visible;
1532
1623
  color: inherit;
1533
1624
  border: 0;
1534
- transition: var(--media-popup-transition);
1625
+ transition: var(--popup-transition);
1535
1626
 
1536
1627
  &[data-starting-style],
1537
1628
  &[data-ending-style] {
@@ -1545,7 +1636,7 @@ export const Player = createPlayer({ features: videoFeatures });
1545
1636
  &[data-ending-style] {
1546
1637
  transform: none;
1547
1638
  /* Speed up the exit transition. */
1548
- transition-duration: max(0ms, calc(var(--media-popup-transition-duration) - 50ms));
1639
+ transition-duration: max(0ms, calc(var(--popup-transition-duration) - 50ms));
1549
1640
  }
1550
1641
 
1551
1642
  &[data-side="top"] {
@@ -1611,7 +1702,7 @@ export const Player = createPlayer({ features: videoFeatures });
1611
1702
  padding: calc(var(--spacing) * 3) 0;
1612
1703
  border-radius: calc(Infinity * 1px);
1613
1704
 
1614
- &:has(media-volume-slider[data-availability="unsupported"]) {
1705
+ &:has(media-volume-slider[data-hidden]) {
1615
1706
  display: none;
1616
1707
  }
1617
1708
  }
@@ -1638,7 +1729,7 @@ export const Player = createPlayer({ features: videoFeatures });
1638
1729
  width: var(--media-tooltip-side-offset);
1639
1730
  }
1640
1731
 
1641
- & .media-tooltip__kbd {
1732
+ .media-tooltip__kbd {
1642
1733
  min-width: 1.5em;
1643
1734
  padding: 0.1em;
1644
1735
  font-family: inherit;
@@ -1651,11 +1742,6 @@ export const Player = createPlayer({ features: videoFeatures });
1651
1742
  }
1652
1743
  }
1653
1744
 
1654
- /* ==========================================================================
1655
- Menus
1656
- Note: Menus use `.media-popover` styles for positioning and transitions.
1657
- ========================================================================== */
1658
-
1659
1745
  .media-default-skin .media-menu {
1660
1746
  --menu-transition-duration: 250ms;
1661
1747
  --menu-max-height: calc(var(--spacing) * 56);
@@ -1675,70 +1761,38 @@ export const Player = createPlayer({ features: videoFeatures });
1675
1761
  --menu-transition-duration: 0ms;
1676
1762
  }
1677
1763
 
1678
- & .media-menu__panel {
1764
+ & > .media-menu__panel {
1679
1765
  position: absolute;
1680
- inset: 0;
1766
+ inset-inline: 0;
1767
+ top: 0;
1768
+ z-index: 10;
1769
+ max-height: inherit;
1681
1770
  padding: var(--menu-padding);
1682
1771
  overflow: auto;
1683
1772
  overscroll-behavior: none;
1684
1773
  outline: none;
1685
1774
  translate: 0 0;
1686
- transition-timing-function: ease-in-out;
1775
+ transition-timing-function: ease-out;
1687
1776
  transition-duration: var(--menu-transition-duration);
1688
1777
  transition-property: translate, filter;
1689
1778
  will-change: translate, filter;
1690
1779
 
1691
- &[data-starting-style],
1692
- &[data-ending-style] {
1780
+ &:where([data-starting-style], [data-ending-style]) {
1693
1781
  overflow: hidden;
1694
- }
1695
-
1696
- /* Root settings view — slides out when a submenu is active */
1697
- &[data-menu-root-view][data-menu-view-state="inactive"] {
1782
+ pointer-events: none;
1698
1783
  filter: blur(8px);
1699
- translate: -100% 0;
1700
-
1701
- /* Hide the indicator while transitioning */
1702
- & .media-menu__group::before {
1703
- display: none;
1704
- }
1705
- }
1706
-
1707
- /* Submenu panels — slide in/out alongside the root view */
1708
- &[data-submenu] {
1709
- z-index: 10;
1710
-
1711
- &:not([data-open], [data-ending-style]) {
1712
- translate: -100% 0;
1713
- transition-property: none;
1714
- }
1715
-
1716
- &[data-starting-style],
1717
- &[data-ending-style] {
1718
- pointer-events: none;
1719
- filter: blur(8px);
1720
- }
1721
-
1722
- &[data-starting-style][data-direction="forward"],
1723
- &[data-ending-style][data-direction="back"] {
1724
- translate: 100% 0;
1725
- }
1726
-
1727
- &[data-ending-style][data-direction="forward"],
1728
- &[data-starting-style][data-direction="back"] {
1729
- translate: -100% 0;
1730
- }
1784
+ translate: 100% 0;
1731
1785
  }
1732
1786
  }
1733
1787
 
1734
- & .media-menu__separator {
1788
+ .media-menu__separator {
1735
1789
  margin-block: calc(var(--spacing) * 1);
1736
1790
  border-bottom: 1px solid oklch(0 0 0 / 0.1);
1737
1791
  box-shadow: 0 1px 0 0 oklch(1 0 0 / 0.075);
1738
1792
  }
1739
1793
 
1740
- & .media-menu__group {
1741
- anchor-scope: --media-menu-item-highlight-anchor;
1794
+ .media-menu__group {
1795
+ anchor-scope: --menu-item-highlight-anchor;
1742
1796
  display: flex;
1743
1797
  flex-direction: column;
1744
1798
  gap: calc(var(--spacing) * 0.5);
@@ -1746,63 +1800,85 @@ export const Player = createPlayer({ features: videoFeatures });
1746
1800
  @supports (top: anchor(top)) {
1747
1801
  &::before {
1748
1802
  position: absolute;
1749
- position-anchor: --media-menu-item-highlight-anchor;
1803
+ position-anchor: --menu-item-highlight-anchor;
1750
1804
  inset: anchor(inside);
1805
+ /* Firefox treats the moving highlight as a content shift and re-scrolls
1806
+ the menu while hovering. Exclude it from scroll anchoring. */
1807
+ overflow-anchor: none;
1751
1808
  pointer-events: none;
1752
1809
  content: "";
1753
- background-color: oklch(from currentColor l c h / 0.1);
1810
+ background-color: var(--accent-background-color);
1754
1811
  border-radius: var(--menu-item-border-radius);
1755
- transition: inset ease-in-out 100ms;
1812
+ transition: inset 100ms ease-in-out;
1813
+ }
1814
+
1815
+ &:has([data-highlighted=""])::before {
1816
+ transition-duration: 0ms;
1756
1817
  }
1757
1818
  }
1758
1819
  }
1759
1820
 
1760
- & .media-menu__item,
1761
- & .media-menu__back {
1821
+ .media-menu__item,
1822
+ .media-menu__back {
1823
+ position: relative;
1762
1824
  display: flex;
1763
1825
  gap: calc(var(--spacing) * 1.5);
1764
1826
  align-items: center;
1765
1827
  padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);
1766
1828
  text-align: left;
1767
- text-shadow: 0 1px 0 var(--media-current-shadow-color);
1829
+ text-shadow: 0 1px 0 var(--shadow-current-color);
1768
1830
  cursor: pointer;
1769
1831
  user-select: none;
1770
1832
  outline: 2px solid transparent;
1771
1833
  outline-offset: -2px;
1772
1834
  border-radius: var(--menu-item-border-radius);
1773
1835
  transition: background-color, color;
1774
- transition-timing-function: ease-out;
1836
+ transition-timing-function: ease-in-out;
1775
1837
  transition-duration: 100ms;
1776
1838
 
1839
+ .media-icon {
1840
+ flex-shrink: 0;
1841
+ color: oklch(from currentColor l c h / 0.65);
1842
+ filter: drop-shadow(0 1px 0 var(--shadow-current-color));
1843
+ }
1844
+
1777
1845
  &:focus-visible {
1778
- outline-color: currentColor;
1846
+ outline-color: var(--focus-ring-color);
1779
1847
  outline-offset: 2px;
1780
1848
  }
1781
1849
 
1782
1850
  &:hover,
1783
1851
  &[data-highlighted] {
1784
- background-color: oklch(from currentColor l c h / 0.1);
1852
+ color: var(--accent-text-color);
1853
+ background-color: var(--accent-background-color);
1854
+
1855
+ .media-icon {
1856
+ color: inherit;
1857
+ }
1785
1858
  }
1786
1859
 
1787
- & .media-icon {
1788
- flex-shrink: 0;
1789
- color: oklch(from currentColor l c h / 0.65);
1790
- filter: drop-shadow(0 1px 0 var(--media-current-shadow-color));
1860
+ @supports (top: anchor(top)) {
1861
+ transition-duration: 50ms;
1862
+
1863
+ &:hover,
1864
+ &[data-highlighted] {
1865
+ transition-duration: 200ms;
1866
+ }
1791
1867
  }
1792
1868
  }
1793
1869
 
1794
- & .media-menu__indicator {
1870
+ .media-menu__indicator {
1795
1871
  flex-shrink: 0;
1796
1872
  margin-right: calc(var(--spacing) * -1);
1797
1873
  margin-left: auto;
1798
1874
  opacity: 0;
1799
1875
 
1800
- & .media-icon {
1801
- filter: drop-shadow(0 1px 0 var(--media-current-shadow-color));
1876
+ .media-icon {
1877
+ filter: drop-shadow(0 1px 0 var(--shadow-current-color));
1802
1878
  }
1803
1879
  }
1804
1880
 
1805
- & .media-menu__item {
1881
+ .media-menu__item {
1806
1882
  justify-content: space-between;
1807
1883
  font-variant-numeric: tabular-nums;
1808
1884
  color: inherit;
@@ -1822,16 +1898,15 @@ export const Player = createPlayer({ features: videoFeatures });
1822
1898
  display: none;
1823
1899
  }
1824
1900
 
1825
- &:hover,
1826
1901
  &[data-highlighted] {
1827
1902
  @supports (top: anchor(top)) {
1828
- anchor-name: --media-menu-item-highlight-anchor;
1903
+ anchor-name: --menu-item-highlight-anchor;
1829
1904
  background-color: transparent;
1830
1905
  }
1831
1906
  }
1832
1907
  }
1833
1908
 
1834
- & .media-menu__tier {
1909
+ .media-menu__tier {
1835
1910
  padding-top: 1px;
1836
1911
  padding-left: calc(var(--spacing) * 0.5);
1837
1912
  font-size: var(--font-size-tiny);
@@ -1840,12 +1915,12 @@ export const Player = createPlayer({ features: videoFeatures });
1840
1915
  color: oklch(from currentColor l c h / 0.7);
1841
1916
  }
1842
1917
 
1843
- & .media-menu__back {
1918
+ .media-menu__back {
1844
1919
  width: 100%;
1845
1920
  margin-bottom: calc(var(--spacing) * 0.5);
1846
1921
  }
1847
1922
 
1848
- & .media-menu__hint {
1923
+ .media-menu__hint {
1849
1924
  display: inline-flex;
1850
1925
  gap: calc(var(--spacing) * 1);
1851
1926
  align-items: center;
@@ -1855,14 +1930,14 @@ export const Player = createPlayer({ features: videoFeatures });
1855
1930
  color: oklch(from currentColor l c h / 0.65);
1856
1931
  }
1857
1932
 
1858
- & .media-menu__hint-label {
1933
+ .media-menu__hint-label {
1859
1934
  max-width: calc(var(--spacing) * 24);
1860
1935
  overflow: hidden;
1861
1936
  text-overflow: ellipsis;
1862
1937
  white-space: nowrap;
1863
1938
  }
1864
1939
 
1865
- & .media-menu__chevron {
1940
+ .media-menu__chevron {
1866
1941
  width: calc(var(--spacing) * 3.5);
1867
1942
  height: calc(var(--spacing) * 3.5);
1868
1943
  }
@@ -1873,37 +1948,46 @@ export const Player = createPlayer({ features: videoFeatures });
1873
1948
  min-width: calc(var(--spacing) * 48);
1874
1949
  height: var(--media-menu-height);
1875
1950
  overflow: hidden;
1876
- /* Add height and width transitions. */
1951
+ /* Only the menu size changes between panels. */
1877
1952
  transition:
1878
- var(--media-popup-transition),
1879
- height var(--media-popup-transition-timing-function) var(--menu-transition-duration),
1880
- width var(--media-popup-transition-timing-function) var(--menu-transition-duration);
1953
+ var(--popup-transition),
1954
+ width var(--popup-transition-timing-function) var(--menu-transition-duration),
1955
+ height var(--popup-transition-timing-function) var(--menu-transition-duration);
1881
1956
 
1882
- /* Don't transition width and height on open/close. */
1957
+ & > :not([data-submenu]) {
1958
+ translate: 0 0;
1959
+ transition:
1960
+ translate var(--menu-transition-duration) ease-out,
1961
+ filter var(--menu-transition-duration) ease-out;
1962
+ will-change: translate, filter;
1963
+ }
1964
+
1965
+ &[data-submenu-expanded="true"] > :not([data-submenu]) {
1966
+ filter: blur(8px);
1967
+ translate: -100% 0;
1968
+ }
1969
+
1970
+ /* WebKit can restart the covered-content transition while the
1971
+ anchor-positioned highlight remains active. */
1972
+ &[data-submenu-expanded] > :not([data-submenu])::before {
1973
+ display: none;
1974
+ }
1975
+
1976
+ /* Don't transition size on open/close. */
1883
1977
  &[data-starting-style],
1884
1978
  &[data-ending-style] {
1885
- transition: var(--media-popup-transition);
1979
+ transition: var(--popup-transition);
1886
1980
  }
1887
1981
  }
1888
1982
  }
1889
1983
 
1890
- /* ==========================================================================
1891
- Native Caption Track
1892
- ========================================================================== */
1893
-
1894
1984
  .media-default-skin {
1895
- --media-caption-track-duration: var(--media-controls-transition-duration);
1985
+ --media-caption-track-duration: var(--controls-transition-duration);
1896
1986
  --media-caption-track-delay: 25ms;
1897
1987
  --media-caption-track-y: calc(var(--spacing) * -2);
1898
1988
 
1899
1989
  &:has(.media-controls[data-visible]) {
1900
- --media-caption-track-y: calc(var(--spacing) * -22);
1901
- }
1902
-
1903
- @container media-root (width > 42rem) {
1904
- &:has(.media-controls[data-visible]) > * {
1905
- --media-caption-track-y: calc(var(--spacing) * -14);
1906
- }
1990
+ --media-caption-track-y: calc(var(--spacing) * -14);
1907
1991
  }
1908
1992
  }
1909
1993
 
@@ -1916,106 +2000,110 @@ export const Player = createPlayer({ features: videoFeatures });
1916
2000
  transition-delay: var(--media-caption-track-delay);
1917
2001
  }
1918
2002
 
1919
- /* ==========================================================================
1920
- Input Feedback
1921
- ========================================================================== */
1922
-
1923
- .media-default-skin .media-input-feedback {
2003
+ .media-default-skin .media-input-indicator-overlay {
1924
2004
  position: absolute;
1925
2005
  inset: 0;
1926
2006
  display: grid;
1927
2007
  grid-template-columns: 1fr 1fr 1fr;
1928
2008
  align-items: center;
1929
2009
  justify-items: center;
1930
- color: var(--media-color-primary, oklch(1 0 0));
2010
+ color: oklch(1 0 0);
1931
2011
  pointer-events: none;
1932
2012
  }
1933
2013
 
1934
- /* --- Feedback islands ------------------------------------------------------- */
1935
-
1936
- .media-default-skin .media-input-feedback-island {
1937
- --media-surface-background-color: oklch(0 0 0 / 0.25);
1938
- position: absolute;
1939
- top: calc(var(--spacing) * 3);
1940
- font-weight: 500;
1941
- color: inherit;
1942
- pointer-events: none;
1943
- border-radius: calc(Infinity * 1px);
1944
- transform-origin: top center;
1945
- transition-timing-function: ease-out;
1946
- transition-duration: 100ms;
2014
+ .media-default-skin {
2015
+ .media-volume-indicator,
2016
+ .media-status-indicator--state {
2017
+ --surface-background-color: oklch(0 0 0 / 0.25);
2018
+ position: absolute;
2019
+ top: calc(var(--spacing) * 3);
2020
+ font-weight: 500;
2021
+ color: inherit;
2022
+ pointer-events: none;
2023
+ border-radius: calc(Infinity * 1px);
2024
+ transform-origin: top center;
2025
+ transition-timing-function: ease-out;
2026
+ transition-duration: 100ms;
1947
2027
 
1948
- .media-input-feedback-island__content {
1949
- display: flex;
1950
- gap: calc(var(--spacing) * 2);
1951
- align-items: center;
1952
- justify-content: space-between;
1953
- width: 100%;
1954
- padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2.5);
2028
+ .media-volume-indicator__content,
2029
+ .media-status-indicator__content {
2030
+ display: flex;
2031
+ gap: calc(var(--spacing) * 2);
2032
+ align-items: center;
2033
+ justify-content: space-between;
2034
+ width: 100%;
2035
+ padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2.5);
1955
2036
 
1956
- /* Increase contrast of the content */
1957
- * {
1958
- mix-blend-mode: difference;
2037
+ * {
2038
+ mix-blend-mode: difference;
2039
+ }
1959
2040
  }
1960
- }
1961
2041
 
1962
- .media-icon {
1963
- display: none;
1964
- flex-shrink: 0;
1965
- }
2042
+ .media-icon {
2043
+ display: none;
2044
+ flex-shrink: 0;
2045
+ }
1966
2046
 
1967
- .media-input-feedback-island__value {
1968
- margin-left: auto;
1969
- }
2047
+ .media-volume-indicator__value,
2048
+ .media-status-indicator__value {
2049
+ margin-left: auto;
2050
+ }
1970
2051
 
1971
- @media (pointer: coarse) {
1972
- transition-property: scale, translate, opacity;
1973
- will-change: scale, translate, opacity;
1974
- }
2052
+ @media (pointer: coarse) {
2053
+ transition-property: scale, translate, opacity;
2054
+ will-change: scale, translate, opacity;
2055
+ }
1975
2056
 
1976
- @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
1977
- transition-property: scale, translate, filter, opacity;
1978
- will-change: scale, translate, filter, opacity;
1979
- }
2057
+ @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
2058
+ transition-property: scale, translate, filter, opacity;
2059
+ will-change: scale, translate, filter, opacity;
2060
+ }
1980
2061
 
1981
- @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
1982
- --media-surface-background-color: oklch(0 0 0);
1983
- }
2062
+ @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
2063
+ --surface-background-color: oklch(0 0 0);
2064
+ }
1984
2065
 
1985
- /* Default hidden state */
1986
- &[data-starting-style],
1987
- &[data-ending-style] {
1988
- opacity: 0;
1989
- transition-timing-function: ease-in;
1990
- transition-duration: 250ms;
2066
+ &[data-starting-style],
2067
+ &[data-ending-style] {
2068
+ opacity: 0;
2069
+ transition-timing-function: ease-in;
2070
+ transition-duration: 250ms;
1991
2071
 
1992
- @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
1993
- filter: blur(8px);
1994
- scale: 0.9;
2072
+ @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
2073
+ filter: blur(8px);
2074
+ scale: 0.9;
2075
+ }
1995
2076
  }
1996
2077
 
1997
- @media (prefers-reduced-motion: no-preference) {
1998
- &[data-ending-style] {
2078
+ &[data-ending-style] {
2079
+ @media (prefers-reduced-motion: no-preference) {
1999
2080
  translate: 0 -25%;
2000
2081
  }
2001
2082
  }
2002
2083
  }
2084
+
2085
+ .media-seek-indicator,
2086
+ .media-status-indicator--playback {
2087
+ display: grid;
2088
+ grid-row: 1;
2089
+ grid-column: 2;
2090
+ place-content: center;
2091
+ padding: calc(var(--spacing) * 4);
2092
+ text-align: center;
2093
+ }
2003
2094
  }
2004
2095
 
2005
- .media-default-skin .media-input-feedback-island--volume {
2096
+ .media-default-skin .media-volume-indicator {
2006
2097
  width: min(80%, calc(var(--spacing) * 48));
2098
+ transform: translateX(0);
2007
2099
 
2008
- .media-input-feedback-island__content {
2009
- --media-progress-fill: var(--media-volume-fill);
2010
- background-image: linear-gradient(
2011
- to right,
2012
- currentColor 0%,
2013
- currentColor var(--media-progress-fill),
2014
- transparent var(--media-progress-fill),
2015
- transparent 100%
2016
- );
2100
+ .media-volume-indicator__content {
2101
+ background-image: linear-gradient(currentColor, currentColor);
2102
+ background-repeat: no-repeat;
2103
+ background-position: left;
2104
+ background-size: var(--media-volume-fill, 0%) 100%;
2017
2105
  border-radius: inherit;
2018
- transition: --media-progress-fill 200ms linear;
2106
+ transition: background-size 200ms linear;
2019
2107
  }
2020
2108
 
2021
2109
  &[data-level="high"] .media-icon--volume-high,
@@ -2025,14 +2113,15 @@ export const Player = createPlayer({ features: videoFeatures });
2025
2113
  }
2026
2114
 
2027
2115
  @media (prefers-reduced-motion: no-preference) {
2028
- &[data-min],
2029
- &[data-max] {
2030
- animation: media-shake 300ms ease-in-out;
2116
+ &[data-min]:not([data-starting-style], [data-ending-style]),
2117
+ &[data-max]:not([data-starting-style], [data-ending-style]) {
2118
+ transform: translateX(0.25px);
2119
+ transition: transform 300ms linear(0, -24 20%, 16 40%, -8 60%, 4 80%, 1);
2031
2120
  }
2032
2121
  }
2033
2122
  }
2034
2123
 
2035
- .media-default-skin .media-input-feedback-island--status {
2124
+ .media-default-skin .media-status-indicator--state {
2036
2125
  &[data-status="captions-on"] .media-icon--captions-on,
2037
2126
  &[data-status="captions-off"] .media-icon--captions-off,
2038
2127
  &[data-status="fullscreen"] .media-icon--fullscreen-enter,
@@ -2043,49 +2132,72 @@ export const Player = createPlayer({ features: videoFeatures });
2043
2132
  }
2044
2133
  }
2045
2134
 
2046
- /* --- Bubble ---------------------------------------------------------------- */
2047
-
2048
- .media-default-skin .media-input-feedback-bubble {
2049
- display: grid;
2050
- grid-row: 1;
2051
- grid-column: 2;
2052
- place-content: center;
2053
- padding: calc(var(--spacing) * 4);
2054
- text-align: center;
2135
+ .media-default-skin .media-status-indicator--playback {
2136
+ background: oklch(0 0 0 / 0.35);
2137
+ border-radius: 100%;
2138
+ backdrop-filter: blur(8px);
2139
+ transition-timing-function: ease-out;
2140
+ transition-duration: 200ms;
2141
+ transition-property: opacity, scale;
2055
2142
 
2056
- /* Central bubble (play, pause) */
2057
- &:not([data-direction]) {
2058
- background: oklch(0 0 0 / 0.35);
2059
- border-radius: 100%;
2060
- backdrop-filter: blur(8px);
2143
+ .media-icon {
2144
+ grid-area: 1 / 1;
2145
+ width: calc(var(--media-icon-size) * 1.5);
2146
+ height: calc(var(--media-icon-size) * 1.5);
2147
+ opacity: 0;
2148
+ scale: 0;
2061
2149
  transition-timing-function: ease-out;
2062
- transition-duration: 200ms;
2150
+ transition-duration: 150ms;
2063
2151
  transition-property: opacity, scale;
2064
2152
 
2065
- &[data-starting-style],
2066
- &[data-ending-style] {
2067
- opacity: 0;
2068
- scale: 0.85;
2153
+ &.media-icon--play {
2154
+ translate: 1px 0;
2069
2155
  }
2156
+ }
2070
2157
 
2071
- &[data-ending-style] {
2072
- transition-timing-function: ease-in;
2073
- transition-duration: 100ms;
2158
+ &[data-status="pause"] .media-icon--pause,
2159
+ &[data-status="play"] .media-icon--play {
2160
+ opacity: 1;
2161
+ scale: 1;
2162
+ }
2163
+
2164
+ &[data-starting-style],
2165
+ &[data-ending-style] {
2166
+ opacity: 0;
2167
+ scale: 0.85;
2168
+ }
2169
+
2170
+ &[data-ending-style] {
2171
+ transition-timing-function: ease-in;
2172
+ transition-duration: 100ms;
2173
+ }
2174
+
2175
+ @media (prefers-reduced-motion: reduce) {
2176
+ transition-duration: 50ms;
2177
+ transition-property: opacity;
2178
+
2179
+ &[data-starting-style],
2180
+ &[data-ending-style],
2181
+ .media-icon {
2182
+ scale: 1;
2074
2183
  }
2075
2184
 
2076
- @media (prefers-reduced-motion: reduce) {
2185
+ .media-icon {
2077
2186
  transition-duration: 50ms;
2078
2187
  transition-property: opacity;
2079
2188
  }
2080
2189
  }
2190
+ }
2081
2191
 
2082
- /* Directional bubbles (seek) */
2083
- &[data-direction] {
2084
- gap: calc(var(--spacing) * 1);
2192
+ .media-default-skin .media-seek-indicator {
2193
+ gap: calc(var(--spacing) * 1);
2085
2194
 
2086
- @container media-root (width > 24rem) {
2087
- padding: calc(var(--spacing) * 6);
2088
- }
2195
+ .media-seek-indicator__value {
2196
+ font-variant-numeric: tabular-nums;
2197
+ }
2198
+
2199
+ @container media-root (width > 24rem) {
2200
+ padding: calc(var(--spacing) * 6);
2089
2201
  }
2090
2202
 
2091
2203
  &[data-direction="backward"] {
@@ -2098,21 +2210,10 @@ export const Player = createPlayer({ features: videoFeatures });
2098
2210
  justify-self: right;
2099
2211
  }
2100
2212
 
2101
- /* Icons */
2102
- .media-icon {
2103
- display: none;
2213
+ .media-icon--seek {
2214
+ display: block;
2104
2215
  width: calc(var(--media-icon-size) * 1.5);
2105
2216
  height: calc(var(--media-icon-size) * 1.5);
2106
-
2107
- &.media-icon--play {
2108
- translate: 1px 0;
2109
- }
2110
- }
2111
-
2112
- &[data-direction] .media-icon--seek,
2113
- &[data-status="pause"] .media-icon--pause,
2114
- &[data-status="play"] .media-icon--play {
2115
- display: block;
2116
2217
  }
2117
2218
 
2118
2219
  &[data-direction="backward"] .media-icon--seek {
@@ -2120,7 +2221,7 @@ export const Player = createPlayer({ features: videoFeatures });
2120
2221
  }
2121
2222
 
2122
2223
  @media (prefers-reduced-motion: no-preference) {
2123
- &[data-direction] .media-icon--seek {
2224
+ .media-icon--seek {
2124
2225
  transition-timing-function: ease-in-out;
2125
2226
  transition-duration: 200ms;
2126
2227
  transition-property: translate, opacity;
@@ -2134,6 +2235,7 @@ export const Player = createPlayer({ features: videoFeatures });
2134
2235
  &[data-direction="forward"][data-starting-style] .media-icon--seek {
2135
2236
  translate: -60% 0;
2136
2237
  }
2238
+
2137
2239
  &[data-direction="backward"][data-starting-style] .media-icon--seek {
2138
2240
  translate: 60% 0;
2139
2241
  }
@@ -2143,32 +2245,24 @@ export const Player = createPlayer({ features: videoFeatures });
2143
2245
  /* ==========================================================================
2144
2246
  Icon State Visibility for Video Skins
2145
2247
 
2146
- Data-attribute-driven visibility rules for multi-state icon buttons.
2147
- Uses :is() with both element selectors (for HTML custom element wrappers)
2148
- and class selectors (for React rendered SVG elements).
2248
+ Data-attribute-driven visibility rules for multi-state icon buttons shared
2249
+ by the HTML and React skins.
2149
2250
  ========================================================================== */
2150
2251
 
2151
2252
  /* --- All icons hidden by default --- */
2152
2253
 
2153
- .media-button--play .media-icon--restart,
2154
- .media-button--play .media-icon--play,
2155
- .media-button--play .media-icon--pause,
2156
- .media-button--mute .media-icon--volume-off,
2157
- .media-button--mute .media-icon--volume-low,
2158
- .media-button--mute .media-icon--volume-high,
2159
- .media-button--fullscreen .media-icon--fullscreen-enter,
2160
- .media-button--fullscreen .media-icon--fullscreen-exit,
2161
- .media-button--pip .media-icon--pip-enter,
2162
- .media-button--pip .media-icon--pip-exit,
2163
- .media-button--cast .media-icon--cast-enter,
2164
- .media-button--cast .media-icon--cast-exit,
2165
- .media-button--airplay .media-icon--airplay-enter,
2166
- .media-button--airplay .media-icon--airplay-exit,
2167
- .media-button--captions .media-icon--captions-off,
2168
- .media-button--captions .media-icon--captions-on {
2169
- display: none;
2254
+ .media-button--play .media-icon,
2255
+ .media-button--mute .media-icon,
2256
+ .media-button--fullscreen .media-icon,
2257
+ .media-button--pip .media-icon,
2258
+ .media-button--cast .media-icon,
2259
+ .media-button--airplay .media-icon,
2260
+ .media-button--captions .media-icon {
2170
2261
  opacity: 0;
2171
2262
  }
2263
+ .media-button--play .media-icon {
2264
+ scale: 0;
2265
+ }
2172
2266
 
2173
2267
  /* --- Active icon per state --- */
2174
2268
 
@@ -2205,8 +2299,8 @@ export const Player = createPlayer({ features: videoFeatures });
2205
2299
  .media-button--captions:not([data-active]) .media-icon--captions-off,
2206
2300
  /* Captions: active → captions on */
2207
2301
  .media-button--captions[data-active] .media-icon--captions-on {
2208
- display: block;
2209
2302
  opacity: 1;
2303
+ scale: 1;
2210
2304
  }
2211
2305
 
2212
2306
  /* --- Pause keyframe animations on inactive icons --- */
@@ -2220,106 +2314,68 @@ export const Player = createPlayer({ features: videoFeatures });
2220
2314
  --media-icon--airplay__triangle-animation: none;
2221
2315
  }
2222
2316
 
2223
- /* -------------------------------------------------------------------------- */
2224
- /* Global @keyframes for all video skins (CSS & Tailwind) */
2225
- /* -------------------------------------------------------------------------- */
2226
-
2227
- @keyframes media-shake {
2228
- 0%,
2229
- 100% {
2230
- translate: 0 0;
2231
- }
2232
- 20% {
2233
- translate: -6px 0;
2234
- }
2235
- 40% {
2236
- translate: 4px 0;
2237
- }
2238
- 60% {
2239
- translate: -2px 0;
2240
- }
2241
- 80% {
2242
- translate: 1px 0;
2317
+ @media (prefers-reduced-motion: reduce) {
2318
+ .media-button--airplay {
2319
+ --media-icon--airplay__fill-animation: none;
2320
+ --media-icon--airplay__triangle-animation: none;
2243
2321
  }
2244
2322
  }
2245
2323
 
2246
- /* -------------------------------------------------------------------------- */
2247
- /* Global @properties for all video skins (CSS & Tailwind) */
2248
- /* -------------------------------------------------------------------------- */
2249
2324
 
2250
- @property --media-progress-fill {
2251
- syntax: "<percentage>";
2252
- inherits: true;
2253
- initial-value: 0%;
2254
- }
2255
-
2256
-
2257
- /* ==========================================================================
2258
- Root
2259
- ========================================================================== */
2325
+ /* Video-specific container styles */
2260
2326
 
2261
2327
  .media-default-skin--video {
2262
- --media-spring-timing-function: linear(
2263
- 0,
2264
- 0.034 1.5%,
2265
- 0.763 9.7%,
2266
- 1.066 13.9%,
2267
- 1.198 19.9%,
2268
- 1.184 21.8%,
2269
- 0.963 37.5%,
2270
- 0.997 50.9%,
2271
- 1
2272
- );
2273
- --media-border-color: oklch(0 0 0 / 0.1);
2274
- --media-surface-background-color: oklch(1 0 0 / 0.1);
2275
- --media-surface-inner-border-color: oklch(1 0 0 / 0.1);
2276
- --media-surface-outer-border-color: oklch(0 0 0 / 0.1);
2277
- --media-surface-shadow-color: oklch(0 0 0 / 0.15);
2278
- --media-surface-backdrop-filter: blur(16px) saturate(1.5);
2328
+ --default-accent-color: oklch(1 0 0);
2329
+ --border-color: light-dark(oklch(0 0 0 / 0.1), oklch(1 0 0 / 0.15));
2330
+ --focus-ring-color: light-dark(oklch(0 0 0), oklch(1 0 0));
2331
+ --media-video-border-radius: var(--container-border-radius);
2279
2332
 
2280
- /* We have to create an alias so that the shadow DOM can inherit the custom property value */
2281
- --media-video-border-radius: var(--media-border-radius, 1.75rem);
2333
+ --surface-background-color: oklch(1 0 0 / 0.1);
2334
+ --surface-inner-border-color: oklch(1 0 0 / 0.1);
2335
+ --surface-outer-border-color: oklch(0 0 0 / 0.1);
2336
+ --surface-shadow-color: oklch(0 0 0 / 0.15);
2337
+ --surface-backdrop-filter: blur(16px) saturate(1.5);
2282
2338
 
2283
- --media-controls-transition-duration: 100ms;
2284
- --media-controls-transition-timing-function: ease-out;
2339
+ --controls-transition-duration: 100ms;
2340
+ --controls-transition-timing-function: ease-out;
2285
2341
 
2286
- --media-error-dialog-transition-duration: 350ms;
2287
- --media-error-dialog-transition-delay: 100ms;
2288
- --media-error-dialog-transition-timing-function: var(--media-spring-timing-function);
2342
+ --error-dialog-transition-duration: 350ms;
2343
+ --error-dialog-transition-delay: 100ms;
2344
+ --error-dialog-transition-timing-function: ease-out;
2289
2345
 
2290
- --media-popup-transition-duration: 100ms;
2291
- --media-popup-transition-timing-function: ease-out;
2346
+ --popup-transition-duration: 100ms;
2347
+ --popup-transition-timing-function: ease-out;
2292
2348
 
2293
2349
  overflow: clip;
2294
2350
  background: oklch(0 0 0);
2295
2351
 
2296
2352
  @media (prefers-reduced-motion: reduce) {
2297
- --media-error-dialog-transition-duration: 50ms;
2298
- --media-error-dialog-transition-delay: 0ms;
2299
- --media-error-dialog-transition-timing-function: ease-out;
2300
- --media-popup-transition-duration: 0ms;
2301
- }
2353
+ --error-dialog-transition-duration: 50ms;
2354
+ --error-dialog-transition-delay: 0ms;
2355
+ --popup-transition-duration: 0ms;
2302
2356
 
2303
- @media (prefers-color-scheme: dark) {
2304
- --media-border-color: oklch(1 0 0 / 0.15);
2357
+ .media-error__dialog {
2358
+ scale: 1;
2359
+ transition-property: opacity;
2360
+ }
2305
2361
  }
2306
2362
 
2307
2363
  @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
2308
- --media-surface-background-color: oklch(0 0 0);
2309
- --media-surface-inner-border-color: oklch(1 0 0 / 0.25);
2310
- --media-surface-outer-border-color: transparent;
2364
+ --surface-background-color: oklch(0 0 0);
2365
+ --surface-inner-border-color: oklch(1 0 0 / 0.25);
2366
+ --surface-outer-border-color: transparent;
2311
2367
  }
2312
2368
 
2313
2369
  &:has(.media-controls--root:not([data-visible])) {
2314
2370
  /* Slight delay to hide controls on non-touch devices after interaction */
2315
2371
  @media (pointer: fine) {
2316
- --media-controls-transition-duration: 300ms;
2372
+ --controls-transition-duration: 300ms;
2317
2373
  }
2318
2374
  @media (pointer: coarse) {
2319
- --media-controls-transition-duration: 150ms;
2375
+ --controls-transition-duration: 150ms;
2320
2376
  }
2321
2377
  @media (prefers-reduced-motion: reduce) {
2322
- --media-controls-transition-duration: 50ms;
2378
+ --controls-transition-duration: 50ms;
2323
2379
  }
2324
2380
  }
2325
2381
 
@@ -2331,11 +2387,11 @@ export const Player = createPlayer({ features: videoFeatures });
2331
2387
  pointer-events: none;
2332
2388
  content: "";
2333
2389
  border-radius: inherit;
2334
- box-shadow: inset 0 0 0 1px var(--media-border-color);
2390
+ box-shadow: inset 0 0 0 1px var(--border-color);
2335
2391
  }
2336
2392
 
2337
2393
  &:fullscreen {
2338
- --media-border-radius: 0;
2394
+ --container-border-radius: 0;
2339
2395
 
2340
2396
  &::after {
2341
2397
  display: none;
@@ -2353,9 +2409,7 @@ export const Player = createPlayer({ features: videoFeatures });
2353
2409
  }
2354
2410
  }
2355
2411
 
2356
- /* ==========================================================================
2357
- Error Dialog
2358
- ========================================================================== */
2412
+ /* Error Dialog */
2359
2413
 
2360
2414
  .media-default-skin--video .media-error {
2361
2415
  position: absolute;
@@ -2376,16 +2430,16 @@ export const Player = createPlayer({ features: videoFeatures });
2376
2430
  color: oklch(1 0 0);
2377
2431
  text-shadow: 0 1px 0 oklch(0 0 0 / 0.25);
2378
2432
  border-radius: calc(var(--spacing) * 7);
2379
- transition-delay: var(--media-error-dialog-transition-delay);
2380
- transition-timing-function: var(--media-error-dialog-transition-timing-function);
2381
- transition-duration: var(--media-error-dialog-transition-duration);
2433
+ transition-delay: var(--error-dialog-transition-delay);
2434
+ transition-timing-function: var(--error-dialog-transition-timing-function);
2435
+ transition-duration: var(--error-dialog-transition-duration);
2382
2436
  transition-property: opacity, scale;
2383
2437
  }
2384
2438
 
2385
2439
  .media-default-skin--video .media-error[data-starting-style] .media-error__dialog,
2386
2440
  .media-default-skin--video .media-error[data-ending-style] .media-error__dialog {
2387
2441
  opacity: 0;
2388
- scale: 0.5;
2442
+ scale: 0.95;
2389
2443
  }
2390
2444
  .media-default-skin--video .media-error[data-ending-style] .media-error__dialog {
2391
2445
  transition-delay: 0ms;
@@ -2403,9 +2457,7 @@ export const Player = createPlayer({ features: videoFeatures });
2403
2457
  font-size: var(--font-size-medium);
2404
2458
  }
2405
2459
 
2406
- /* ==========================================================================
2407
- Controls (hide/show behavior)
2408
- ========================================================================== */
2460
+ /* Controls (hide/show behavior) */
2409
2461
 
2410
2462
  .media-default-skin--video .media-controls--root {
2411
2463
  --inset-factor: 2;
@@ -2414,24 +2466,24 @@ export const Player = createPlayer({ features: videoFeatures });
2414
2466
 
2415
2467
  z-index: 10;
2416
2468
  display: contents;
2417
- color: var(--media-color-primary, oklch(1 0 0));
2418
- transition-timing-function: var(--media-controls-transition-timing-function);
2469
+ color: oklch(1 0 0);
2470
+ transition-timing-function: var(--controls-transition-timing-function);
2419
2471
  /* Speed up the entry transition */
2420
- transition-duration: calc(var(--media-controls-transition-duration) / 2);
2472
+ transition-duration: calc(var(--controls-transition-duration) / 2);
2421
2473
 
2422
- & .media-controls--primary,
2423
- & .media-controls--secondary {
2474
+ .media-controls--primary,
2475
+ .media-controls--secondary {
2424
2476
  position: absolute;
2425
2477
  z-index: 10;
2426
2478
  }
2427
2479
 
2428
- & .media-controls--primary {
2480
+ .media-controls--primary {
2429
2481
  inset-inline: var(--inset);
2430
2482
  bottom: var(--inset);
2431
2483
  transform-origin: bottom;
2432
2484
  }
2433
2485
 
2434
- & .media-controls--secondary {
2486
+ .media-controls--secondary {
2435
2487
  top: var(--inset);
2436
2488
  right: var(--inset);
2437
2489
  container-type: normal;
@@ -2439,8 +2491,8 @@ export const Player = createPlayer({ features: videoFeatures });
2439
2491
  }
2440
2492
 
2441
2493
  @container media-root (width < 32rem) {
2442
- & .media-controls--primary,
2443
- & .media-controls--secondary {
2494
+ .media-controls--primary,
2495
+ .media-controls--secondary {
2444
2496
  transition-timing-function: inherit;
2445
2497
  transition-duration: inherit;
2446
2498
 
@@ -2460,12 +2512,12 @@ export const Player = createPlayer({ features: videoFeatures });
2460
2512
  }
2461
2513
 
2462
2514
  &:not([data-visible]) {
2463
- & .media-controls--primary,
2464
- & .media-controls--secondary {
2515
+ .media-controls--primary,
2516
+ .media-controls--secondary {
2465
2517
  pointer-events: none;
2466
2518
  opacity: 0;
2467
2519
  scale: 0.95;
2468
- transition-duration: var(--media-controls-transition-duration);
2520
+ transition-duration: var(--controls-transition-duration);
2469
2521
 
2470
2522
  @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
2471
2523
  filter: blur(8px);
@@ -2476,13 +2528,13 @@ export const Player = createPlayer({ features: videoFeatures });
2476
2528
  }
2477
2529
  }
2478
2530
 
2479
- & .media-controls--primary {
2531
+ .media-controls--primary {
2480
2532
  @media (prefers-reduced-motion: no-preference) {
2481
2533
  translate: 0 4px;
2482
2534
  }
2483
2535
  }
2484
2536
 
2485
- & .media-controls--secondary {
2537
+ .media-controls--secondary {
2486
2538
  @media (prefers-reduced-motion: no-preference) {
2487
2539
  translate: 0 -4px;
2488
2540
  }
@@ -2497,8 +2549,8 @@ export const Player = createPlayer({ features: videoFeatures });
2497
2549
  display: flex;
2498
2550
  transform-origin: bottom;
2499
2551
 
2500
- & .media-controls--primary,
2501
- & .media-controls--secondary {
2552
+ .media-controls--primary,
2553
+ .media-controls--secondary {
2502
2554
  display: contents;
2503
2555
 
2504
2556
  &::after {
@@ -2510,7 +2562,7 @@ export const Player = createPlayer({ features: videoFeatures });
2510
2562
  pointer-events: none;
2511
2563
  opacity: 0;
2512
2564
  scale: 0.95;
2513
- transition-duration: var(--media-controls-transition-duration);
2565
+ transition-duration: var(--controls-transition-duration);
2514
2566
 
2515
2567
  @media (pointer: fine) and (prefers-reduced-motion: no-preference) {
2516
2568
  filter: blur(8px);
@@ -2526,7 +2578,7 @@ export const Player = createPlayer({ features: videoFeatures });
2526
2578
  }
2527
2579
  }
2528
2580
 
2529
- & .media-time-controls {
2581
+ .media-time-controls {
2530
2582
  flex: 1;
2531
2583
  padding-inline: calc(var(--spacing) * 3);
2532
2584
  }
@@ -2555,57 +2607,10 @@ export const Player = createPlayer({ features: videoFeatures });
2555
2607
  cursor: none;
2556
2608
  }
2557
2609
 
2558
- /* ==========================================================================
2559
- Sliders
2560
- ========================================================================== */
2610
+ /* Sliders */
2561
2611
 
2562
2612
  .media-default-skin--video .media-slider__track {
2563
2613
  background-color: oklch(1 0 0 / 0.2);
2564
- box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
2565
- }
2566
-
2567
- .media-default-skin--video .media-slider__thumbnail {
2568
- --max-width: calc(var(--spacing) * 44);
2569
- --max-height: calc(var(--spacing) * 32);
2570
- --padding: calc(var(--spacing) * -4.5);
2571
- /**
2572
- Inset is the difference between the container width and the slider (100%) width.
2573
- Divided by 2 as we render the time on both sides.
2574
- */
2575
- --inset: calc((100cqi - 100%) / 2);
2576
-
2577
- position: absolute;
2578
- bottom: calc(100% + calc(var(--spacing) * 4.8));
2579
- left: clamp(
2580
- calc(var(--max-width) / 2 + var(--padding) - var(--inset)),
2581
- var(--media-slider-pointer),
2582
- calc(100% - var(--max-width) / 2 - var(--padding) + var(--inset))
2583
- );
2584
- pointer-events: none;
2585
- opacity: 0;
2586
- filter: blur(8px);
2587
- transform-origin: bottom;
2588
- scale: 0.8;
2589
- translate: -50%;
2590
- transition-timing-function: ease-out;
2591
- transition-duration: 150ms;
2592
- transition-property: scale, opacity, filter;
2593
-
2594
- & .media-thumbnail__image {
2595
- max-width: var(--max-width);
2596
- max-height: var(--max-height);
2597
- }
2598
- }
2599
- .media-default-skin--video .media-slider[data-pointing] .media-slider__thumbnail:has([role="img"]:not([data-hidden])) {
2600
- opacity: 1;
2601
- filter: blur(0);
2602
- scale: 1;
2603
- }
2604
- .media-default-skin--video
2605
- .media-slider__thumbnail:has([role="img"]:not([data-hidden]))
2606
- + .media-slider__preview
2607
- .media-slider__value {
2608
- display: none;
2609
2614
  }
2610
2615
 
2611
2616
  ```
@@ -2614,7 +2619,7 @@ export const Player = createPlayer({ features: videoFeatures });
2614
2619
 
2615
2620
  Each skin is built with specific [features](./features.md) in mind. For example, a video skin renders fullscreen and picture-in-picture controls. An audio skin doesn’t.
2616
2621
 
2617
- You’ll find both a skin and the feature bundle it expects exported from the same path. We call these paths **presets**.
2622
+ You’ll find a preconfigured player, its typed hook, a skin, and the matching feature bundle exported from the same path. We call these paths **presets**.
2618
2623
 
2619
2624
  Import
2620
2625
 
@@ -2634,7 +2639,7 @@ Feature bundle
2634
2639
 
2635
2640
  Features
2636
2641
 
2637
- [playback](../reference/feature-playback.md), [playbackRate](../reference/feature-playback-rate.md), [quality](../reference/feature-quality.md), [audioTrack](../reference/feature-audio-track.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [fullscreen](../reference/feature-fullscreen.md), [pip](../reference/feature-pip.md), [remotePlayback](../reference/feature-remote-playback.md), [controls](../reference/feature-controls.md), [textTrack](../reference/feature-text-tracks.md), [error](../reference/feature-error.md)
2642
+ [playback](../reference/feature-playback.md), [playbackRate](../reference/feature-playback-rate.md), [quality](../reference/feature-quality.md), [audioTrack](../reference/feature-audio-track.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [fullscreen](../reference/feature-fullscreen.md), [pip](../reference/feature-pip.md), [remotePlayback](../reference/feature-remote-playback.md), [controls](../reference/feature-controls.md), [textTrack](../reference/feature-text-tracks.md), [error](../reference/feature-error.md), metadata
2638
2643
 
2639
2644
  Skins
2640
2645
 
@@ -2662,7 +2667,7 @@ Feature bundle
2662
2667
 
2663
2668
  Features
2664
2669
 
2665
- [playback](../reference/feature-playback.md), [playbackRate](../reference/feature-playback-rate.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [error](../reference/feature-error.md)
2670
+ [playback](../reference/feature-playback.md), [playbackRate](../reference/feature-playback-rate.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [error](../reference/feature-error.md), metadata
2666
2671
 
2667
2672
  Skins
2668
2673
 
@@ -2714,7 +2719,7 @@ Feature bundle
2714
2719
 
2715
2720
  Features
2716
2721
 
2717
- [playback](../reference/feature-playback.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [error](../reference/feature-error.md), [live](../reference/feature-live.md)
2722
+ [playback](../reference/feature-playback.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [error](../reference/feature-error.md), [live](../reference/feature-live.md), metadata
2718
2723
 
2719
2724
  Skins
2720
2725
 
@@ -2742,7 +2747,7 @@ Feature bundle
2742
2747
 
2743
2748
  Features
2744
2749
 
2745
- [playback](../reference/feature-playback.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [fullscreen](../reference/feature-fullscreen.md), [pip](../reference/feature-pip.md), [remotePlayback](../reference/feature-remote-playback.md), [controls](../reference/feature-controls.md), [textTrack](../reference/feature-text-tracks.md), [error](../reference/feature-error.md), [live](../reference/feature-live.md)
2750
+ [playback](../reference/feature-playback.md), [volume](../reference/feature-volume.md), [time](../reference/feature-time.md), [source](../reference/feature-source.md), [buffer](../reference/feature-buffer.md), [fullscreen](../reference/feature-fullscreen.md), [pip](../reference/feature-pip.md), [remotePlayback](../reference/feature-remote-playback.md), [controls](../reference/feature-controls.md), [textTrack](../reference/feature-text-tracks.md), [error](../reference/feature-error.md), [live](../reference/feature-live.md), metadata
2746
2751
 
2747
2752
  Skins
2748
2753