@videojs/html 10.2.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/dist/default/define/audio/compat-skin.css +161 -41
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +73 -34
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +166 -42
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +72 -34
  8. package/dist/default/define/audio/skin2.js +1 -1
  9. package/dist/default/define/extensions/google-analytics.js +6 -0
  10. package/dist/default/define/live-audio/compat-skin.css +143 -41
  11. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  12. package/dist/default/define/live-audio/neutral-skin.css +56 -31
  13. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  14. package/dist/default/define/live-audio/scaffold-skin.css +148 -42
  15. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  16. package/dist/default/define/live-audio/skin.css +55 -31
  17. package/dist/default/define/live-audio/skin2.js +1 -1
  18. package/dist/default/define/live-video/compat-skin.css +234 -51
  19. package/dist/default/define/live-video/compat-skin2.js +1 -1
  20. package/dist/default/define/live-video/neutral-skin.css +300 -46
  21. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  22. package/dist/default/define/live-video/scaffold-skin.css +231 -53
  23. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  24. package/dist/default/define/live-video/skin.css +314 -49
  25. package/dist/default/define/live-video/skin2.js +1 -1
  26. package/dist/default/define/media/dailymotion-video.js +11 -0
  27. package/dist/default/define/media/mixcloud-audio.js +11 -0
  28. package/dist/default/define/media/soundcloud-audio.js +11 -0
  29. package/dist/default/define/ui/time-slider-markers.js +5 -0
  30. package/dist/default/define/video/compat-skin.css +242 -51
  31. package/dist/default/define/video/compat-skin2.js +1 -1
  32. package/dist/default/define/video/neutral-skin.css +382 -57
  33. package/dist/default/define/video/neutral-skin2.js +1 -1
  34. package/dist/default/define/video/scaffold-skin.css +240 -53
  35. package/dist/default/define/video/scaffold-skin2.js +1 -1
  36. package/dist/default/define/video/skin.css +415 -55
  37. package/dist/default/define/video/skin2.js +1 -1
  38. package/dist/default/extensions/google-analytics/extension.js +75 -0
  39. package/dist/default/extensions/mux-data/extension.js +7 -2
  40. package/dist/default/index.js +3 -1
  41. package/dist/default/internal/skins/compat-audio/skin.css +161 -41
  42. package/dist/default/internal/skins/compat-audio/template.js +1 -1
  43. package/dist/default/internal/skins/compat-live-audio/skin.css +143 -41
  44. package/dist/default/internal/skins/compat-live-video/skin.css +234 -51
  45. package/dist/default/internal/skins/compat-live-video/template.js +2 -0
  46. package/dist/default/internal/skins/compat-video/skin.css +242 -51
  47. package/dist/default/internal/skins/compat-video/template.js +2 -0
  48. package/dist/default/internal/skins/default-audio/skin.css +72 -34
  49. package/dist/default/internal/skins/default-live-audio/skin.css +55 -31
  50. package/dist/default/internal/skins/default-live-video/skin.css +314 -49
  51. package/dist/default/internal/skins/default-live-video/template.js +14 -0
  52. package/dist/default/internal/skins/default-video/register.js +3 -0
  53. package/dist/default/internal/skins/default-video/skin.css +415 -55
  54. package/dist/default/internal/skins/default-video/template.js +33 -5
  55. package/dist/default/internal/skins/neutral-audio/skin.css +73 -34
  56. package/dist/default/internal/skins/neutral-live-audio/skin.css +56 -31
  57. package/dist/default/internal/skins/neutral-live-video/skin.css +300 -46
  58. package/dist/default/internal/skins/neutral-live-video/template.js +14 -0
  59. package/dist/default/internal/skins/neutral-video/skin.css +382 -57
  60. package/dist/default/internal/skins/neutral-video/template.js +25 -11
  61. package/dist/default/internal/skins/scaffold-audio/skin.css +166 -42
  62. package/dist/default/internal/skins/scaffold-audio/template.js +1 -1
  63. package/dist/default/internal/skins/scaffold-live-audio/skin.css +148 -42
  64. package/dist/default/internal/skins/scaffold-live-video/skin.css +231 -53
  65. package/dist/default/internal/skins/scaffold-live-video/template.js +2 -0
  66. package/dist/default/internal/skins/scaffold-video/skin.css +240 -53
  67. package/dist/default/internal/skins/scaffold-video/template.js +3 -1
  68. package/dist/default/media/background-video/adapter.js +13 -35
  69. package/dist/default/media/background-video/base.js +95 -0
  70. package/dist/default/media/background-video/template.js +13 -20
  71. package/dist/default/media/dailymotion-video/adapter.js +31 -0
  72. package/dist/default/media/hls-background-video/adapter.js +23 -35
  73. package/dist/default/media/mixcloud-audio/adapter.js +16 -0
  74. package/dist/default/media/soundcloud-audio/adapter.js +16 -0
  75. package/dist/default/player/element.js +1 -5
  76. package/dist/default/presets/background/skin.js +2 -2
  77. package/dist/default/presets/skin.js +4 -3
  78. package/dist/default/ui/captions-radio-group/element.js +14 -1
  79. package/dist/default/ui/controls/element.js +6 -3
  80. package/dist/default/ui/dialog/element.js +13 -1
  81. package/dist/default/ui/gesture/element.js +3 -0
  82. package/dist/default/ui/media-button-element.js +10 -1
  83. package/dist/default/ui/playback-rate-button/element.js +7 -2
  84. package/dist/default/ui/playback-rate-radio-group/element.js +10 -3
  85. package/dist/default/ui/radio-options/controller.js +18 -5
  86. package/dist/default/ui/time-slider/markers.js +160 -0
  87. package/dist/default/version.js +1 -1
  88. package/dist/dev/define/audio/compat-skin.css +161 -41
  89. package/dist/dev/define/audio/compat-skin2.js +1 -1
  90. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  91. package/dist/dev/define/audio/neutral-skin.css +73 -34
  92. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  93. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  94. package/dist/dev/define/audio/scaffold-skin.css +166 -42
  95. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  96. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  97. package/dist/dev/define/audio/skin.css +72 -34
  98. package/dist/dev/define/audio/skin2.js +1 -1
  99. package/dist/dev/define/audio/skin2.js.map +1 -1
  100. package/dist/dev/define/extensions/google-analytics.d.ts +11 -0
  101. package/dist/dev/define/extensions/google-analytics.js +8 -0
  102. package/dist/dev/define/extensions/google-analytics.js.map +1 -0
  103. package/dist/dev/define/live-audio/compat-skin.css +143 -41
  104. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  105. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  106. package/dist/dev/define/live-audio/neutral-skin.css +56 -31
  107. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  108. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  109. package/dist/dev/define/live-audio/scaffold-skin.css +148 -42
  110. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  111. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  112. package/dist/dev/define/live-audio/skin.css +55 -31
  113. package/dist/dev/define/live-audio/skin2.js +1 -1
  114. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  115. package/dist/dev/define/live-video/compat-skin.css +234 -51
  116. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  117. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  118. package/dist/dev/define/live-video/neutral-skin.css +300 -46
  119. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  120. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  121. package/dist/dev/define/live-video/scaffold-skin.css +231 -53
  122. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  123. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  124. package/dist/dev/define/live-video/skin.css +314 -49
  125. package/dist/dev/define/live-video/skin2.js +1 -1
  126. package/dist/dev/define/live-video/skin2.js.map +1 -1
  127. package/dist/dev/define/media/dailymotion-video.d.ts +15 -0
  128. package/dist/dev/define/media/dailymotion-video.js +13 -0
  129. package/dist/dev/define/media/dailymotion-video.js.map +1 -0
  130. package/dist/dev/define/media/mixcloud-audio.d.ts +15 -0
  131. package/dist/dev/define/media/mixcloud-audio.js +13 -0
  132. package/dist/dev/define/media/mixcloud-audio.js.map +1 -0
  133. package/dist/dev/define/media/soundcloud-audio.d.ts +15 -0
  134. package/dist/dev/define/media/soundcloud-audio.js +13 -0
  135. package/dist/dev/define/media/soundcloud-audio.js.map +1 -0
  136. package/dist/dev/define/ui/time-slider-markers.d.ts +8 -0
  137. package/dist/dev/define/ui/time-slider-markers.js +7 -0
  138. package/dist/dev/define/ui/time-slider-markers.js.map +1 -0
  139. package/dist/dev/define/video/compat-skin.css +242 -51
  140. package/dist/dev/define/video/compat-skin2.js +1 -1
  141. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  142. package/dist/dev/define/video/neutral-skin.css +382 -57
  143. package/dist/dev/define/video/neutral-skin2.js +1 -1
  144. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  145. package/dist/dev/define/video/scaffold-skin.css +240 -53
  146. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  147. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  148. package/dist/dev/define/video/skin.css +415 -55
  149. package/dist/dev/define/video/skin2.js +1 -1
  150. package/dist/dev/define/video/skin2.js.map +1 -1
  151. package/dist/dev/extensions/google-analytics/extension.d.ts +52 -0
  152. package/dist/dev/extensions/google-analytics/extension.js +77 -0
  153. package/dist/dev/extensions/google-analytics/extension.js.map +1 -0
  154. package/dist/dev/extensions/google-analytics/index.d.ts +2 -0
  155. package/dist/dev/extensions/mux-data/extension.d.ts +4 -1
  156. package/dist/dev/extensions/mux-data/extension.js +7 -2
  157. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  158. package/dist/dev/index.d.ts +5 -4
  159. package/dist/dev/index.js +3 -1
  160. package/dist/dev/internal/skins/compat-audio/skin.css +161 -41
  161. package/dist/dev/internal/skins/compat-audio/template.js +1 -1
  162. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  163. package/dist/dev/internal/skins/compat-live-audio/skin.css +143 -41
  164. package/dist/dev/internal/skins/compat-live-video/skin.css +234 -51
  165. package/dist/dev/internal/skins/compat-live-video/template.js +2 -0
  166. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -1
  167. package/dist/dev/internal/skins/compat-video/skin.css +242 -51
  168. package/dist/dev/internal/skins/compat-video/template.js +2 -0
  169. package/dist/dev/internal/skins/compat-video/template.js.map +1 -1
  170. package/dist/dev/internal/skins/default-audio/skin.css +72 -34
  171. package/dist/dev/internal/skins/default-live-audio/skin.css +55 -31
  172. package/dist/dev/internal/skins/default-live-video/register.js.map +1 -1
  173. package/dist/dev/internal/skins/default-live-video/skin.css +314 -49
  174. package/dist/dev/internal/skins/default-live-video/template.js +14 -0
  175. package/dist/dev/internal/skins/default-live-video/template.js.map +1 -1
  176. package/dist/dev/internal/skins/default-video/register.d.ts +1 -0
  177. package/dist/dev/internal/skins/default-video/register.js +3 -0
  178. package/dist/dev/internal/skins/default-video/register.js.map +1 -1
  179. package/dist/dev/internal/skins/default-video/skin.css +415 -55
  180. package/dist/dev/internal/skins/default-video/template.js +33 -5
  181. package/dist/dev/internal/skins/default-video/template.js.map +1 -1
  182. package/dist/dev/internal/skins/neutral-audio/skin.css +73 -34
  183. package/dist/dev/internal/skins/neutral-live-audio/skin.css +56 -31
  184. package/dist/dev/internal/skins/neutral-live-video/register.js.map +1 -1
  185. package/dist/dev/internal/skins/neutral-live-video/skin.css +300 -46
  186. package/dist/dev/internal/skins/neutral-live-video/template.js +14 -0
  187. package/dist/dev/internal/skins/neutral-live-video/template.js.map +1 -1
  188. package/dist/dev/internal/skins/neutral-video/register.js.map +1 -1
  189. package/dist/dev/internal/skins/neutral-video/skin.css +382 -57
  190. package/dist/dev/internal/skins/neutral-video/template.js +25 -11
  191. package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
  192. package/dist/dev/internal/skins/scaffold-audio/skin.css +166 -42
  193. package/dist/dev/internal/skins/scaffold-audio/template.js +1 -1
  194. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -1
  195. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +148 -42
  196. package/dist/dev/internal/skins/scaffold-live-video/skin.css +231 -53
  197. package/dist/dev/internal/skins/scaffold-live-video/template.js +2 -0
  198. package/dist/dev/internal/skins/scaffold-live-video/template.js.map +1 -1
  199. package/dist/dev/internal/skins/scaffold-video/skin.css +240 -53
  200. package/dist/dev/internal/skins/scaffold-video/template.js +3 -1
  201. package/dist/dev/internal/skins/scaffold-video/template.js.map +1 -1
  202. package/dist/dev/media/background-video/adapter.d.ts +7 -13
  203. package/dist/dev/media/background-video/adapter.js +13 -35
  204. package/dist/dev/media/background-video/adapter.js.map +1 -1
  205. package/dist/dev/media/background-video/base.d.ts +44 -0
  206. package/dist/dev/media/background-video/base.js +97 -0
  207. package/dist/dev/media/background-video/base.js.map +1 -0
  208. package/dist/dev/media/background-video/template.d.ts +3 -0
  209. package/dist/dev/media/background-video/template.js +13 -20
  210. package/dist/dev/media/background-video/template.js.map +1 -1
  211. package/dist/dev/media/dailymotion-video/adapter.d.ts +17 -0
  212. package/dist/dev/media/dailymotion-video/adapter.js +47 -0
  213. package/dist/dev/media/dailymotion-video/adapter.js.map +1 -0
  214. package/dist/dev/media/dailymotion-video/index.d.ts +2 -0
  215. package/dist/dev/media/hls-background-video/adapter.d.ts +14 -19
  216. package/dist/dev/media/hls-background-video/adapter.js +23 -35
  217. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  218. package/dist/dev/media/mixcloud-audio/adapter.d.ts +11 -0
  219. package/dist/dev/media/mixcloud-audio/adapter.js +52 -0
  220. package/dist/dev/media/mixcloud-audio/adapter.js.map +1 -0
  221. package/dist/dev/media/mixcloud-audio/index.d.ts +2 -0
  222. package/dist/dev/media/soundcloud-audio/adapter.d.ts +11 -0
  223. package/dist/dev/media/soundcloud-audio/adapter.js +53 -0
  224. package/dist/dev/media/soundcloud-audio/adapter.js.map +1 -0
  225. package/dist/dev/media/soundcloud-audio/index.d.ts +2 -0
  226. package/dist/dev/player/element.js +1 -5
  227. package/dist/dev/player/element.js.map +1 -1
  228. package/dist/dev/presets/background/skin.d.ts +2 -1
  229. package/dist/dev/presets/background/skin.js +2 -2
  230. package/dist/dev/presets/background/skin.js.map +1 -1
  231. package/dist/dev/presets/skin.d.ts +4 -3
  232. package/dist/dev/presets/skin.js +4 -3
  233. package/dist/dev/presets/skin.js.map +1 -1
  234. package/dist/dev/ui/captions-button/element.d.ts +2 -0
  235. package/dist/dev/ui/captions-radio-group/element.d.ts +2 -1
  236. package/dist/dev/ui/captions-radio-group/element.js +14 -1
  237. package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
  238. package/dist/dev/ui/controls/element.d.ts +2 -2
  239. package/dist/dev/ui/controls/element.js +6 -3
  240. package/dist/dev/ui/controls/element.js.map +1 -1
  241. package/dist/dev/ui/dialog/element.js +13 -1
  242. package/dist/dev/ui/dialog/element.js.map +1 -1
  243. package/dist/dev/ui/gesture/element.js +3 -0
  244. package/dist/dev/ui/gesture/element.js.map +1 -1
  245. package/dist/dev/ui/media-button-element.d.ts +9 -0
  246. package/dist/dev/ui/media-button-element.js +10 -1
  247. package/dist/dev/ui/media-button-element.js.map +1 -1
  248. package/dist/dev/ui/play-button/element.d.ts +2 -0
  249. package/dist/dev/ui/playback-rate-button/element.d.ts +9 -1
  250. package/dist/dev/ui/playback-rate-button/element.js +7 -2
  251. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  252. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -0
  253. package/dist/dev/ui/playback-rate-radio-group/element.js +10 -3
  254. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  255. package/dist/dev/ui/radio-options/controller.js +18 -5
  256. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  257. package/dist/dev/ui/time-slider/markers.d.ts +48 -0
  258. package/dist/dev/ui/time-slider/markers.js +165 -0
  259. package/dist/dev/ui/time-slider/markers.js.map +1 -0
  260. package/dist/dev/version.js +1 -1
  261. package/docs/README.md +1 -1
  262. package/docs/guides/autoplay.md +2 -2
  263. package/docs/guides/background-video.md +2 -4
  264. package/docs/guides/browser-support.md +23 -15
  265. package/docs/guides/build-your-own-skin.md +3 -1
  266. package/docs/guides/cdn.md +10 -9
  267. package/docs/guides/content-security-policy.md +3 -0
  268. package/docs/guides/customize-skins.md +7 -2
  269. package/docs/guides/features.md +1 -1
  270. package/docs/guides/google-analytics.md +199 -0
  271. package/docs/guides/installation-cdn.md +4 -4
  272. package/docs/guides/installation-shadcn.md +3 -3
  273. package/docs/guides/installation-svelte.md +4 -4
  274. package/docs/guides/installation-vue.md +4 -4
  275. package/docs/guides/installation.md +4 -4
  276. package/docs/guides/internationalization.md +5 -5
  277. package/docs/guides/keyboard-shortcuts.md +11 -1
  278. package/docs/guides/llms.txt +3 -1
  279. package/docs/guides/media-sources.md +3 -0
  280. package/docs/guides/migrate-from-media-chrome.md +4 -4
  281. package/docs/guides/migrate-from-mux-player.md +9 -9
  282. package/docs/guides/migrate-from-plyr.md +8 -8
  283. package/docs/guides/migrate-from-video-js-8.md +8 -9
  284. package/docs/guides/migrate-from-vidstack.md +10 -10
  285. package/docs/guides/mux-data.md +22 -0
  286. package/docs/guides/presets.md +5 -5
  287. package/docs/guides/self-hosting.md +5 -5
  288. package/docs/guides/skins.md +21 -5
  289. package/docs/guides/timed-metadata.md +318 -0
  290. package/docs/guides/ui-components.md +1 -1
  291. package/docs/llms.txt +25 -6
  292. package/docs/reference/api/chapters-track.md +71 -0
  293. package/docs/reference/api/define-text-track.md +113 -0
  294. package/docs/reference/api/feature-playback-rate.md +54 -3
  295. package/docs/reference/api/feature-playback.md +5 -1
  296. package/docs/reference/api/feature-text-cues.md +133 -0
  297. package/docs/reference/api/feature-text-tracks.md +11 -5
  298. package/docs/reference/api/get-active-text-cues.md +69 -0
  299. package/docs/reference/api/get-text-cues.md +69 -0
  300. package/docs/reference/api/get-text-tracks.md +41 -0
  301. package/docs/reference/api/hls-metadata-track.md +48 -0
  302. package/docs/reference/api/html-create-player.md +2 -2
  303. package/docs/reference/api/llms.txt +13 -1
  304. package/docs/reference/api/media-capabilities.md +4 -4
  305. package/docs/reference/api/player-store.md +15 -7
  306. package/docs/reference/api/preset-audio.md +15 -5
  307. package/docs/reference/api/preset-background.md +2 -2
  308. package/docs/reference/api/preset-live-audio.md +15 -5
  309. package/docs/reference/api/preset-live-video.md +14 -5
  310. package/docs/reference/api/preset-video.md +14 -5
  311. package/docs/reference/api/resolve-adapter-type.md +4 -1
  312. package/docs/reference/api/ui-element.md +2 -2
  313. package/docs/reference/components/alert-dialog.md +21 -16
  314. package/docs/reference/components/audio-compat-skin.md +8 -2
  315. package/docs/reference/components/audio-neutral-skin.md +2 -2
  316. package/docs/reference/components/audio-scaffold-skin.md +2 -2
  317. package/docs/reference/components/audio-skin.md +2 -2
  318. package/docs/reference/components/audio-track-radio-group.md +2 -2
  319. package/docs/reference/components/audio.md +19 -1
  320. package/docs/reference/components/background-video-skin.md +1 -1
  321. package/docs/reference/components/background-video.md +26 -11
  322. package/docs/reference/components/buffering-indicator.md +2 -2
  323. package/docs/reference/components/captions-radio-group.md +3 -3
  324. package/docs/reference/components/cloudflare-video.md +1 -1
  325. package/docs/reference/components/controls.md +16 -3
  326. package/docs/reference/components/dailymotion-video.md +192 -0
  327. package/docs/reference/components/dash-video.md +20 -2
  328. package/docs/reference/components/dialog.md +49 -22
  329. package/docs/reference/components/error-dialog.md +13 -10
  330. package/docs/reference/components/gesture.md +2 -2
  331. package/docs/reference/components/google-analytics.md +51 -0
  332. package/docs/reference/components/google-cast.md +1 -1
  333. package/docs/reference/components/hls-audio.md +56 -2
  334. package/docs/reference/components/hls-background-video.md +25 -5
  335. package/docs/reference/components/hls-video.md +99 -7
  336. package/docs/reference/components/hlsjs-video.md +53 -12
  337. package/docs/reference/components/hotkey.md +2 -2
  338. package/docs/reference/components/live-audio-compat-skin.md +8 -2
  339. package/docs/reference/components/live-audio-neutral-skin.md +2 -2
  340. package/docs/reference/components/live-audio-scaffold-skin.md +2 -2
  341. package/docs/reference/components/live-audio-skin.md +2 -2
  342. package/docs/reference/components/live-video-compat-skin.md +12 -2
  343. package/docs/reference/components/live-video-neutral-skin.md +6 -2
  344. package/docs/reference/components/live-video-scaffold-skin.md +6 -2
  345. package/docs/reference/components/live-video-skin.md +6 -2
  346. package/docs/reference/components/llms.txt +10 -5
  347. package/docs/reference/components/mixcloud-audio.md +203 -0
  348. package/docs/reference/components/mux-audio.md +35 -2
  349. package/docs/reference/components/mux-background-video.md +1 -1
  350. package/docs/reference/components/mux-data.md +20 -2
  351. package/docs/reference/components/mux-video.md +18 -2
  352. package/docs/reference/components/native-hls-video.md +32 -2
  353. package/docs/reference/components/play-button.md +7 -5
  354. package/docs/reference/components/playback-rate-button.md +26 -7
  355. package/docs/reference/components/playback-rate-radio-group.md +7 -4
  356. package/docs/reference/components/player.md +3 -3
  357. package/docs/reference/components/playerjs-video.md +2 -2
  358. package/docs/reference/components/quality-radio-group.md +2 -2
  359. package/docs/reference/components/shaka-video.md +2 -2
  360. package/docs/reference/components/soundcloud-audio.md +227 -0
  361. package/docs/reference/components/spotify-audio.md +3 -3
  362. package/docs/reference/components/tiktok-video.md +3 -3
  363. package/docs/reference/components/time-slider-markers.md +194 -0
  364. package/docs/reference/components/time-slider.md +14 -0
  365. package/docs/reference/components/twitch-video.md +2 -3
  366. package/docs/reference/components/video-compat-skin.md +12 -2
  367. package/docs/reference/components/video-neutral-skin.md +6 -2
  368. package/docs/reference/components/video-scaffold-skin.md +6 -2
  369. package/docs/reference/components/video-skin.md +6 -2
  370. package/docs/reference/components/video.md +19 -1
  371. package/docs/reference/components/vimeo-video.md +1 -1
  372. package/docs/reference/components/wistia-video.md +1 -1
  373. package/docs/reference/components/youtube-video.md +1 -1
  374. package/package.json +60 -40
@@ -4,6 +4,7 @@ import { MenuItemIndicatorElement } from "../menu/item-indicator.js";
4
4
  import { applyElementProps } from "@videojs/core/dom";
5
5
  import { translateText } from "@videojs/core/i18n";
6
6
  import { cloneTemplateRoot, getTemplateElement, getTemplateRoot } from "@videojs/utils/dom";
7
+ import { isUndefined } from "@videojs/utils/predicate";
7
8
  //#region src/ui/radio-options/controller.ts
8
9
  /** Renders normalized options into menu radio items and manages their interaction lifecycle. */
9
10
  var RadioOptionsController = class {
@@ -37,14 +38,12 @@ var RadioOptionsController = class {
37
38
  const template = getTemplateElement(this.#host);
38
39
  const templateRoot = template ? getTemplateRoot(template) : null;
39
40
  const itemRoot = templateRoot?.localName === MenuRadioItemElement.tagName ? templateRoot : null;
40
- const contentKey = `${state.options.map((option) => `${option.value}:${cacheKey(option.label, option.labelParams)}:${this.#config.getOptionCacheKey?.(option) ?? ""}`).join("|")}::${locale}::${template?.innerHTML ?? ""}`;
41
+ const contentKey = `${state.options.map((option) => `${option.value}:${cacheKey(option.label, option.labelParams)}:${cacheKey(option.ariaLabel ?? "", option.ariaLabelParams)}:${this.#config.getOptionCacheKey?.(option) ?? ""}`).join("|")}::${locale}::${template?.innerHTML ?? ""}`;
41
42
  if (contentKey !== this.#contentKey || translator !== this.#translator) {
42
43
  this.#contentKey = contentKey;
43
44
  this.#translator = translator;
44
- for (const child of [...this.#host.children]) {
45
- if (child === template) continue;
46
- child.remove();
47
- }
45
+ const staleChildren = [...this.#host.children].filter((child) => child !== template);
46
+ const focusedValue = this.#getFocusedItem()?.value;
48
47
  const items = state.options.map((option) => {
49
48
  const item = itemRoot ? cloneTemplateRoot(itemRoot, this.#host.ownerDocument) : this.#host.ownerDocument.createElement(MenuRadioItemElement.tagName);
50
49
  item.value = option.value;
@@ -52,9 +51,19 @@ var RadioOptionsController = class {
52
51
  const label = translateText(option.label, translator, option.labelParams);
53
52
  if (this.#config.renderItem) this.#config.renderItem(item, label, option);
54
53
  else this.#setItemLabel(item, label);
54
+ if (!isUndefined(option.ariaLabel)) item.setAttribute("aria-label", translateText(option.ariaLabel, translator, option.ariaLabelParams));
55
55
  return item;
56
56
  });
57
57
  this.#host.append(...items);
58
+ const removeStale = () => {
59
+ for (const child of staleChildren) child.remove();
60
+ };
61
+ const replacement = isUndefined(focusedValue) ? void 0 : items.find((item) => item.value === focusedValue) ?? items.find((item) => item.value === state.value);
62
+ if (replacement) replacement.updateComplete.then(() => {
63
+ replacement.focus();
64
+ removeStale();
65
+ });
66
+ else removeStale();
58
67
  }
59
68
  const optionsByValue = new Map(state.options.map((option) => [option.value, option]));
60
69
  for (const item of this.#host.querySelectorAll(MenuRadioItemElement.tagName)) {
@@ -69,6 +78,10 @@ var RadioOptionsController = class {
69
78
  const { value } = event.detail;
70
79
  this.#config.onValueChange(value);
71
80
  };
81
+ #getFocusedItem() {
82
+ const active = this.#host.getRootNode().activeElement;
83
+ return active instanceof MenuRadioItemElement && active.parentElement === this.#host ? active : null;
84
+ }
72
85
  #setItemLabel(item, label) {
73
86
  const labelPart = item.querySelector("[data-part~=\"label\"]");
74
87
  if (labelPart) labelPart.textContent = label;
@@ -0,0 +1,160 @@
1
+ import { playerContext } from "../../player/context.js";
2
+ import { PlayerController } from "../../player/controller.js";
3
+ import { UIElement } from "../ui-element.js";
4
+ import { sliderContext } from "../slider/context.js";
5
+ import { TimeSliderMarkerCSSVars, TimeSliderMarkerDataAttrs, TimeSliderMarkersCore, getActiveTextCues, getTextCues } from "@videojs/core";
6
+ import { applyStateDataAttrs, selectBuffer, selectTextCues, selectTime } from "@videojs/core/dom";
7
+ import { getTimeRangeEnd } from "@videojs/media";
8
+ import { ContextConsumer } from "@videojs/element/context";
9
+ import { cloneTemplateRoot, getTemplateElement, getTemplateRoot } from "@videojs/utils/dom";
10
+ import { isNil } from "@videojs/utils/predicate";
11
+ //#region src/ui/time-slider/markers.ts
12
+ /**
13
+ * Draws a marker on the time slider for each cue on the text tracks a filter matches, such as ad breaks. Pick tracks
14
+ * with the `kind`, `label`, and `language` attributes, or with the `filter` property; with neither, nothing is drawn.
15
+ * The store reads the matching tracks while the element is connected, so tracks it doesn't read by default work too.
16
+ *
17
+ * Each marker clones the light-DOM template, which must contain exactly one HTML root element, or is a `<div>` without
18
+ * one. Markers are decorative: the slider's own value is what assistive technology reads.
19
+ */
20
+ var TimeSliderMarkersElement = class extends UIElement {
21
+ static {
22
+ this.tagName = "media-time-slider-markers";
23
+ }
24
+ static {
25
+ this.properties = {
26
+ kind: { type: String },
27
+ label: { type: String },
28
+ language: { type: String }
29
+ };
30
+ }
31
+ #core = new TimeSliderMarkersCore();
32
+ #slider = new ContextConsumer(this, {
33
+ context: sliderContext,
34
+ subscribe: true
35
+ });
36
+ #textCues = new PlayerController(this, playerContext, selectTextCues);
37
+ #time = new PlayerController(this, playerContext, selectTime);
38
+ #buffer = new PlayerController(this, playerContext, selectBuffer);
39
+ #rendered = /* @__PURE__ */ new Map();
40
+ #filter;
41
+ #attributeFilter;
42
+ #watching = null;
43
+ #templateRoot = null;
44
+ #templateChecked = false;
45
+ /**
46
+ * Picks the tracks whose cues are drawn: a filter object, a function, or a track definition. Takes priority over the
47
+ * `kind`, `label`, and `language` attributes. Set as a JavaScript property; it has no attribute.
48
+ */
49
+ get filter() {
50
+ return this.#filter;
51
+ }
52
+ set filter(value) {
53
+ this.#filter = value;
54
+ this.requestUpdate();
55
+ }
56
+ connectedCallback() {
57
+ super.connectedCallback();
58
+ this.setAttribute("aria-hidden", "true");
59
+ }
60
+ disconnectedCallback() {
61
+ this.#unwatch();
62
+ super.disconnectedCallback();
63
+ }
64
+ destroyCallback() {
65
+ this.#unwatch();
66
+ super.destroyCallback();
67
+ }
68
+ willUpdate(changed) {
69
+ super.willUpdate(changed);
70
+ if (changed.has("kind") || changed.has("label") || changed.has("language")) this.#attributeFilter = this.#getAttributeFilter();
71
+ this.#watch(this.#getFilter());
72
+ }
73
+ update(changed) {
74
+ super.update(changed);
75
+ const slider = this.#slider.value;
76
+ const templateRoot = this.#getTemplateRoot();
77
+ if (!slider) return;
78
+ applyStateDataAttrs(this, slider.state, slider.stateAttrMap);
79
+ const filter = this.#getFilter();
80
+ const textCues = this.#textCues.value;
81
+ const time = this.#time.value;
82
+ const max = getTimeRangeEnd({
83
+ duration: time?.duration ?? 0,
84
+ seekable: this.#buffer.value?.seekable ?? []
85
+ });
86
+ const markers = filter && textCues ? this.#core.getMarkers({
87
+ cues: getTextCues(textCues, filter),
88
+ activeCues: getActiveTextCues(textCues, filter),
89
+ min: 0,
90
+ max,
91
+ orientation: slider.state.orientation
92
+ }) : [];
93
+ const next = /* @__PURE__ */ new Map();
94
+ for (const marker of markers) {
95
+ const root = this.#rendered.get(marker.key) ?? this.#createMarker(templateRoot);
96
+ root.style.setProperty(TimeSliderMarkerCSSVars.start, marker.startPercent);
97
+ root.style.setProperty(TimeSliderMarkerCSSVars.end, marker.endPercent);
98
+ root.style.setProperty(TimeSliderMarkerCSSVars.width, marker.width ?? marker.height ?? "0%");
99
+ applyStateDataAttrs(root, slider.state, slider.stateAttrMap);
100
+ applyStateDataAttrs(root, marker, TimeSliderMarkerDataAttrs);
101
+ next.set(marker.key, root);
102
+ }
103
+ for (const [key, root] of this.#rendered) if (!next.has(key)) root.remove();
104
+ let before = null;
105
+ for (const root of [...next.values()].reverse()) {
106
+ if (root.parentNode !== this || root.nextSibling !== before) this.insertBefore(root, before);
107
+ before = root;
108
+ }
109
+ this.#rendered.clear();
110
+ for (const [key, rendered] of next) this.#rendered.set(key, rendered);
111
+ }
112
+ #getFilter() {
113
+ return this.#filter ?? this.#attributeFilter;
114
+ }
115
+ /** A filter from the attributes that are present, or none when no attribute is. */
116
+ #getAttributeFilter() {
117
+ const { kind, label, language } = this;
118
+ if (isNil(kind) && isNil(label) && isNil(language)) return void 0;
119
+ return {
120
+ kind: kind ?? void 0,
121
+ label: label ?? void 0,
122
+ language: language ?? void 0
123
+ };
124
+ }
125
+ /** Ask the store to read the tracks the filter matches while the element is connected. */
126
+ #watch(filter) {
127
+ const watch = this.isConnected ? this.#textCues.value?.watchTextCues : void 0;
128
+ if (this.#watching?.watch === watch && this.#watching?.filter === filter) return;
129
+ this.#unwatch();
130
+ if (watch && filter) this.#watching = {
131
+ watch,
132
+ filter,
133
+ stop: watch(filter)
134
+ };
135
+ }
136
+ #unwatch() {
137
+ this.#watching?.stop();
138
+ this.#watching = null;
139
+ }
140
+ #createMarker(templateRoot) {
141
+ return templateRoot ? cloneTemplateRoot(templateRoot, this.ownerDocument) : this.ownerDocument.createElement("div");
142
+ }
143
+ /** The template's root, found once; until there is a template, other content is cleared and markers are `<div>`s. */
144
+ #getTemplateRoot() {
145
+ if (this.#templateChecked) return this.#templateRoot;
146
+ const template = getTemplateElement(this);
147
+ const rendered = new Set(this.#rendered.values());
148
+ for (const node of [...this.childNodes]) if (node !== template && !rendered.has(node)) node.remove();
149
+ if (!template) return null;
150
+ this.#templateChecked = true;
151
+ for (const node of rendered) node.remove();
152
+ this.#rendered.clear();
153
+ const root = getTemplateRoot(template);
154
+ if (root?.namespaceURI !== "http://www.w3.org/1999/xhtml") return null;
155
+ this.#templateRoot = root;
156
+ return this.#templateRoot;
157
+ }
158
+ };
159
+ //#endregion
160
+ export { TimeSliderMarkersElement };
@@ -1,7 +1,7 @@
1
1
  //#region src/version.ts
2
2
  const readVersion = () => {
3
3
  try {
4
- return "10.2.0";
4
+ return "10.4.0";
5
5
  } catch {}
6
6
  return "UNKNOWN";
7
7
  };
@@ -226,7 +226,11 @@ media-container video::-webkit-media-text-track-container {
226
226
 
227
227
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-backdrop {
228
228
  z-index: 40;
229
+ transition-property: opacity;
230
+ transition-duration: .15s;
231
+ transition-duration: var(--media-duration-slower);
229
232
  background-color: #000000bf;
233
+ transition-timing-function: cubic-bezier(0, 0, .2, 1);
230
234
  position: absolute;
231
235
  inset: 0;
232
236
  }
@@ -235,6 +239,18 @@ media-container video::-webkit-media-text-track-container {
235
239
  display: none;
236
240
  }
237
241
 
242
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-backdrop[data-ending-style] {
243
+ transition-duration: var(--media-duration);
244
+ }
245
+
246
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-backdrop[data-scope="document"] {
247
+ position: fixed;
248
+ }
249
+
250
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-backdrop:is([data-starting-style], [data-ending-style]) {
251
+ opacity: 0;
252
+ }
253
+
238
254
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-close {
239
255
  height: calc(var(--media-spacing) * 8);
240
256
  width: auto;
@@ -259,8 +275,12 @@ media-container video::-webkit-media-text-track-container {
259
275
  background-color: var(--media-popover);
260
276
  padding: calc(var(--media-spacing) * 5);
261
277
  color: var(--media-popover-foreground);
278
+ transition-property: opacity, scale;
279
+ transition-duration: .15s;
280
+ transition-duration: var(--media-duration-slower);
262
281
  border-radius: .5rem;
263
282
  outline-style: none;
283
+ transition-timing-function: cubic-bezier(0, 0, .2, 1);
264
284
  display: grid;
265
285
  position: absolute;
266
286
  top: 50%;
@@ -280,6 +300,15 @@ media-container video::-webkit-media-text-track-container {
280
300
  outline-color: var(--media-ring);
281
301
  }
282
302
 
303
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-popup[data-ending-style] {
304
+ transition-duration: var(--media-duration);
305
+ }
306
+
307
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-popup[data-scope="document"] {
308
+ max-height: calc(100dvh - 2rem);
309
+ position: fixed;
310
+ }
311
+
283
312
  @media (forced-colors: active) {
284
313
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-popup {
285
314
  border: 1px solid canvastext;
@@ -292,6 +321,11 @@ media-container video::-webkit-media-text-track-container {
292
321
  }
293
322
  }
294
323
 
324
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-popup:is([data-starting-style], [data-ending-style]) {
325
+ scale: var(--media-hidden-popup-scale) var(--media-hidden-popup-scale);
326
+ opacity: 0;
327
+ }
328
+
295
329
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-dialog-title {
296
330
  font-size: 1.125rem;
297
331
  font-weight: 700;
@@ -934,11 +968,15 @@ media-container video::-webkit-media-text-track-container {
934
968
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-backdrop {
935
969
  pointer-events: none;
936
970
  z-index: 10;
937
- background-image: linear-gradient(to top, #000000b3, #0003, #00000080);
971
+ background-image: var(--media-controls-gradient);
938
972
  position: absolute;
939
973
  inset: 0;
940
974
  }
941
975
 
976
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-backdrop:not([data-started]) {
977
+ visibility: var(--media-controls-before-start, hidden);
978
+ }
979
+
942
980
  :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-buffering):not([data-visible]) .video-controls-backdrop:not([data-visible]) {
943
981
  display: none;
944
982
  }
@@ -1007,7 +1045,7 @@ media-container video::-webkit-media-text-track-container {
1007
1045
  transition-duration: .15s;
1008
1046
  transition-duration: var(--media-duration-instant);
1009
1047
  transition-timing-function: cubic-bezier(0, 0, .2, 1);
1010
- display: none;
1048
+ display: flex;
1011
1049
  position: absolute;
1012
1050
  top: 50%;
1013
1051
  left: 50%;
@@ -1053,24 +1091,18 @@ media-container video::-webkit-media-text-track-container {
1053
1091
  }
1054
1092
  }
1055
1093
 
1056
- @container media-root (width >= 22.5rem) {
1057
- :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center {
1058
- display: flex;
1059
- }
1060
- }
1061
-
1062
1094
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button {
1063
1095
  background-color: #0006 !important;
1064
1096
  }
1065
1097
 
1066
1098
  @media (hover: hover) {
1067
1099
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button:hover {
1068
- background-color: #000000d9 !important;
1100
+ background-color: #0009 !important;
1069
1101
  }
1070
1102
  }
1071
1103
 
1072
1104
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button:focus-visible, :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button[aria-expanded="true"] {
1073
- background-color: #000000d9 !important;
1105
+ background-color: #0009 !important;
1074
1106
  }
1075
1107
 
1076
1108
  @media (forced-colors: active) {
@@ -1110,11 +1142,25 @@ media-container video::-webkit-media-text-track-container {
1110
1142
  height: calc(var(--media-spacing) * 14.5) !important;
1111
1143
  }
1112
1144
 
1145
+ @container media-root (width < 22.5rem) {
1146
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play {
1147
+ width: calc(var(--media-spacing) * 10) !important;
1148
+ height: calc(var(--media-spacing) * 10) !important;
1149
+ }
1150
+ }
1151
+
1113
1152
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play-icon {
1114
1153
  width: calc(var(--media-spacing) * 7) !important;
1115
1154
  height: calc(var(--media-spacing) * 7) !important;
1116
1155
  }
1117
1156
 
1157
+ @container media-root (width < 22.5rem) {
1158
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play-icon {
1159
+ width: calc(var(--media-spacing) * 5) !important;
1160
+ height: calc(var(--media-spacing) * 5) !important;
1161
+ }
1162
+ }
1163
+
1118
1164
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content {
1119
1165
  pointer-events: none;
1120
1166
  z-index: 30;
@@ -1161,6 +1207,10 @@ media-container video::-webkit-media-text-track-container {
1161
1207
  position: absolute;
1162
1208
  }
1163
1209
 
1210
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-top:not([data-started]) {
1211
+ visibility: var(--media-controls-before-start, hidden);
1212
+ }
1213
+
1164
1214
  :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-visible]) .video-controls-top {
1165
1215
  pointer-events: none;
1166
1216
  opacity: 0;
@@ -1215,6 +1265,16 @@ media-container video::-webkit-media-text-track-container {
1215
1265
  }
1216
1266
  }
1217
1267
 
1268
+ @container not style(--media-controls-before-start: visible) {
1269
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-top:not([data-started]) {
1270
+ opacity: 0;
1271
+ }
1272
+ }
1273
+
1274
+ :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-started]) .video-controls-video-bottom {
1275
+ visibility: var(--media-controls-before-start, hidden);
1276
+ }
1277
+
1218
1278
  @media (forced-colors: active) {
1219
1279
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-video-bottom {
1220
1280
  padding-inline: calc(var(--media-spacing) * 2);
@@ -1225,6 +1285,12 @@ media-container video::-webkit-media-text-track-container {
1225
1285
  }
1226
1286
  }
1227
1287
 
1288
+ @container not style(--media-controls-before-start: visible) {
1289
+ :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-started]) .video-controls-video-bottom {
1290
+ opacity: 0;
1291
+ }
1292
+ }
1293
+
1228
1294
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-time-current-value {
1229
1295
  display: none;
1230
1296
  }
@@ -1358,6 +1424,10 @@ media-container video::-webkit-media-text-track-container {
1358
1424
  outline: 2px solid;
1359
1425
  }
1360
1426
 
1427
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-menu-radio-item[data-custom] {
1428
+ font-style: italic;
1429
+ }
1430
+
1361
1431
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-menu-radio-item[data-highlighted] {
1362
1432
  background-color: var(--media-button-highlight);
1363
1433
  }
@@ -1380,6 +1450,20 @@ media-container video::-webkit-media-text-track-container {
1380
1450
  font-variant-numeric: tabular-nums;
1381
1451
  }
1382
1452
 
1453
+ @supports not (text-fit: shrink) {
1454
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-playback-rate-button {
1455
+ font-size: min(1em, calc(4em / (var(--media-playback-rate-length, 3) + 1)));
1456
+ }
1457
+ }
1458
+
1459
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-playback-rate-button-label {
1460
+ text-align: center;
1461
+ white-space: nowrap;
1462
+ text-fit: shrink;
1463
+ width: 80%;
1464
+ min-width: 0;
1465
+ }
1466
+
1383
1467
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-menu-content {
1384
1468
  overscroll-behavior: none;
1385
1469
  max-height: 100%;
@@ -1540,7 +1624,6 @@ media-container video::-webkit-media-text-track-container {
1540
1624
  }
1541
1625
 
1542
1626
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-audio, :where(.media-skin[data-theme="compat"][data-preset="audio"]).media-audio {
1543
- aspect-ratio: auto;
1544
1627
  background-color: var(--media-background);
1545
1628
  box-shadow: 0 0 #0000,
1546
1629
  0 0 #0000,
@@ -1553,6 +1636,9 @@ media-container video::-webkit-media-text-track-container {
1553
1636
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-container, :where(.media-skin[data-theme="compat"][data-preset="audio"]).media-container {
1554
1637
  border-radius: var(--media-video-border-radius);
1555
1638
  width: 100%;
1639
+ min-width: 0;
1640
+ height: 100%;
1641
+ min-height: 0;
1556
1642
  font-family: var(--media-font-family, "Inter Variable", Inter, ui-sans-serif, system-ui, sans-serif);
1557
1643
  font-size: calc(var(--media-spacing) * 3.25);
1558
1644
  color: var(--media-foreground);
@@ -1582,45 +1668,56 @@ media-container video::-webkit-media-text-track-container {
1582
1668
  outline-style: solid;
1583
1669
  outline-color: var(--media-ring);
1584
1670
  }
1671
+
1672
+ .media-container > slot::slotted(video), :scope.media-container > slot::slotted(video) {
1673
+ border-radius: inherit;
1674
+ object-fit: var(--media-object-fit, contain);
1675
+ object-position: var(--media-object-position, center);
1676
+ width: 100%;
1677
+ max-width: 100%;
1678
+ margin: 0;
1679
+ display: block;
1680
+ height: 100% !important;
1681
+ }
1585
1682
  }
1586
1683
 
1587
1684
  @layer utilities;
1588
1685
 
1589
1686
  @layer base.theme {
1590
1687
  .media-skin {
1591
- --media-background: oklch(0% 0 0);
1592
- --media-foreground: oklch(100% 0 0);
1593
- --media-controls: oklch(0% 0 0 / .35);
1688
+ --media-background: #000;
1689
+ --media-foreground: #fff;
1690
+ --media-controls: #00000059;
1594
1691
  --media-controls-foreground: var(--media-foreground);
1595
- --media-popover: oklch(100% 0 0 / .1);
1692
+ --media-popover: #ffffff1a;
1596
1693
  --media-popover-foreground: var(--media-foreground);
1597
1694
  --media-primary: var(--media-accent-color, var(--media-default-accent-color));
1598
1695
  --media-primary-foreground: var(--media-accent-text-color, var(--media-default-accent-text-color));
1599
- --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1696
+ --media-accent: var(--media-accent-color, #ffffff1a);
1600
1697
  --media-accent-foreground: var(--media-accent-text-color, currentColor);
1601
- --media-muted: oklch(100% 0 0 / .15);
1602
- --media-muted-foreground: oklch(100% 0 0 / .65);
1603
- --media-border: oklch(0% 0 0 / .1);
1604
- --media-ring: oklch(100% 0 0);
1605
- --media-backdrop: oklch(0% 0 0);
1606
- --media-live-color: oklch(65% .22 27);
1607
- --media-shadow-surface: 0 1px 3px 0 oklch(0% 0 0 / .15), 0 1px 2px -1px oklch(0% 0 0 / .15);
1698
+ --media-muted: #ffffff26;
1699
+ --media-muted-foreground: #ffffffa6;
1700
+ --media-border: #0000001a;
1701
+ --media-ring: #fff;
1702
+ --media-backdrop: #000;
1703
+ --media-live-color: #f9423d;
1704
+ --media-shadow-surface: 0 1px 3px 0 #00000026, 0 1px 2px -1px #00000026;
1608
1705
  --media-shadow-surface-inset: inset 0 1px 0 0 #ffffff1a, inset 0 0 0 1px #ffffff0d;
1609
1706
  --media-shadow-thumb: 0 0 0 1px #0000001a, 0 1px 3px 0 #00000059, 0 1px 2px -1px #00000059;
1610
1707
  --media-shadow-tooltip: 0 0 0 1px var(--media-border), var(--media-shadow-surface);
1611
- --media-shadow-separator: 0 1px 0 0 oklch(100% 0 0 / .075);
1708
+ --media-shadow-separator: 0 1px 0 0 #ffffff13;
1612
1709
  --media-shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - .5) * .5), .15));
1613
- --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1710
+ --media-shadow-subtle-current-color: transparent;
1614
1711
  --media-text-shadow-dialog: 0 1px 0 #00000040;
1615
- --media-backdrop-filter-surface: blur(16px) saturate(110%);
1712
+ --media-backdrop-filter-surface: blur(16px) saturate(125%);
1616
1713
  --media-backdrop-filter-indicator: blur(8px);
1617
- --media-backdrop-filter-dialog: blur(16px) saturate(110%);
1714
+ --media-backdrop-filter-dialog: blur(16px) saturate(125%);
1618
1715
  --media-control-corner-shape: round;
1619
1716
  --media-control-radius: 99px;
1620
1717
  --media-control-size: calc(var(--media-spacing) * 9);
1621
1718
  --media-controls-radius: var(--media-control-radius);
1622
- --media-default-accent-color: oklch(100% 0 0);
1623
- --media-default-accent-text-color: oklch(0% 0 0);
1719
+ --media-default-accent-color: #fff;
1720
+ --media-default-accent-text-color: #000;
1624
1721
  --media-duration-instant: 50ms;
1625
1722
  --media-duration-fast: .1s;
1626
1723
  --media-duration: .15s;
@@ -1657,16 +1754,31 @@ media-container video::-webkit-media-text-track-container {
1657
1754
  --media-slider-preview-label-offset: calc(var(--media-spacing) * 10.5);
1658
1755
  --media-video-border-radius: var(--media-border-radius, 28px);
1659
1756
  --media-scale: 1;
1660
- --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 30%, transparent);
1757
+ --media-scrollbar-thumb-color: #80808080;
1661
1758
  --media-spacing: calc(var(--media-scale-unit, 16px) * var(--media-scale) / 4);
1662
1759
  scrollbar-color: var(--media-scrollbar-thumb-color) transparent;
1663
1760
  scrollbar-width: thin;
1664
1761
  }
1665
1762
 
1763
+ @supports (color: color-mix(in oklab, red, red)) {
1764
+ .media-skin {
1765
+ --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1766
+ --media-muted-foreground: color-mix(in oklab, var(--media-foreground) 65%, transparent);
1767
+ --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1768
+ --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 30%, transparent);
1769
+ }
1770
+ }
1771
+
1772
+ @supports (color: oklch(0 0 0)) {
1773
+ .media-skin {
1774
+ --media-live-color: oklch(65% .22 27);
1775
+ }
1776
+ }
1777
+
1666
1778
  @supports (color: contrast-color(red)) {
1667
1779
  .media-skin {
1668
1780
  --media-primary-foreground: var(--media-accent-text-color, contrast-color(var(--media-primary)));
1669
- --media-accent-foreground: var(--media-accent-text-color, contrast-color(var(--media-accent-color, var(--media-internal-accent-text-fallback, oklch(0% 0 0)))));
1781
+ --media-accent-foreground: var(--media-accent-text-color, contrast-color(var(--media-accent-color, var(--media-internal-accent-text-fallback, #000))));
1670
1782
  }
1671
1783
  }
1672
1784
 
@@ -1713,19 +1825,20 @@ media-container video::-webkit-media-text-track-container {
1713
1825
 
1714
1826
  @layer base.preset {
1715
1827
  .media-skin:is([data-preset="audio"], [data-preset="live-audio"]) {
1716
- --media-background: oklch(100% 0 0);
1717
- --media-foreground: oklch(0% 0 0);
1718
- --media-controls: oklch(100% 0 0 / .5);
1828
+ --media-background: #fff;
1829
+ --media-foreground: #000;
1830
+ --media-controls: #ffffff80;
1719
1831
  --media-controls-foreground: var(--media-foreground);
1720
1832
  --media-popover: var(--media-controls);
1721
1833
  --media-popover-foreground: var(--media-foreground);
1722
- --media-surface-border: oklch(0% 0 0 / .05);
1834
+ --media-muted: #0000001a;
1835
+ --media-surface-border: #0000000d;
1723
1836
  --media-primary: var(--media-accent-color, var(--media-foreground));
1724
- --media-border: oklch(0% 0 0 / .1);
1837
+ --media-border: #0000001a;
1725
1838
  --media-ring: var(--media-foreground);
1726
- --media-default-accent-color: oklch(0% 0 0);
1727
- --media-default-accent-text-color: oklch(100% 0 0);
1728
- --media-internal-accent-text-fallback: oklch(100% 0 0);
1839
+ --media-default-accent-color: #000;
1840
+ --media-default-accent-text-color: #fff;
1841
+ --media-internal-accent-text-fallback: #fff;
1729
1842
  --media-popover-boundary-offset: calc(var(--media-spacing) * 2);
1730
1843
  --media-popover-side-offset: calc(var(--media-spacing) * 3);
1731
1844
  --media-slider-preview-label-offset: calc(var(--media-spacing) * 10);
@@ -1737,6 +1850,7 @@ media-container video::-webkit-media-text-track-container {
1737
1850
  --media-foreground: light-dark(oklch(0% 0 0), oklch(100% 0 0));
1738
1851
  --media-controls: light-dark(oklch(100% 0 0 / .5), oklch(0% 0 0 / .4));
1739
1852
  --media-border: light-dark(oklch(0% 0 0 / .1), oklch(100% 0 0 / .1));
1853
+ --media-muted: light-dark(oklch(0% 0 0 / .1), oklch(100% 0 0 / .1));
1740
1854
  --media-default-accent-color: light-dark(oklch(0% 0 0), oklch(100% 0 0));
1741
1855
  --media-default-accent-text-color: light-dark(oklch(100% 0 0), oklch(0% 0 0));
1742
1856
  --media-internal-accent-text-fallback: light-dark(oklch(100% 0 0), oklch(0% 0 0));
@@ -1753,7 +1867,7 @@ media-container video::-webkit-media-text-track-container {
1753
1867
  @media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
1754
1868
  .media-skin:is([data-preset="audio"], [data-preset="live-audio"]) {
1755
1869
  --media-controls: var(--media-background);
1756
- --media-surface-border: oklch(0% 0 0 / .05);
1870
+ --media-surface-border: #0000000d;
1757
1871
  }
1758
1872
 
1759
1873
  @supports (color: light-dark(red, red)) {
@@ -1921,7 +2035,7 @@ media-container video::-webkit-media-text-track-container {
1921
2035
  @media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
1922
2036
  .media-skin {
1923
2037
  --media-popover: var(--media-background);
1924
- --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 80%, transparent);
2038
+ --media-scrollbar-thumb-color: currentColor;
1925
2039
  --media-backdrop-filter-surface: none;
1926
2040
  --media-backdrop-filter-indicator: none;
1927
2041
  --media-backdrop-filter-dialog: none;
@@ -1929,6 +2043,12 @@ media-container video::-webkit-media-text-track-container {
1929
2043
  scrollbar-width: auto;
1930
2044
  }
1931
2045
 
2046
+ @supports (color: color-mix(in oklab, red, red)) {
2047
+ .media-skin {
2048
+ --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 80%, transparent);
2049
+ }
2050
+ }
2051
+
1932
2052
  @supports (color: oklch(from currentColor l c h)) {
1933
2053
  .media-skin {
1934
2054
  --media-scrollbar-thumb-color: oklch(from currentColor l c h / .8);