@videojs/html 10.2.0 → 10.3.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 (297) hide show
  1. package/dist/default/define/audio/compat-skin.css +72 -5
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +23 -5
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +63 -4
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +21 -5
  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 +54 -5
  11. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  12. package/dist/default/define/live-audio/neutral-skin.css +8 -4
  13. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  14. package/dist/default/define/live-audio/scaffold-skin.css +45 -4
  15. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  16. package/dist/default/define/live-audio/skin.css +6 -4
  17. package/dist/default/define/live-audio/skin2.js +1 -1
  18. package/dist/default/define/live-video/compat-skin.css +115 -13
  19. package/dist/default/define/live-video/compat-skin2.js +1 -1
  20. package/dist/default/define/live-video/neutral-skin.css +82 -14
  21. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  22. package/dist/default/define/live-video/scaffold-skin.css +95 -13
  23. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  24. package/dist/default/define/live-video/skin.css +96 -16
  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/video/compat-skin.css +115 -13
  30. package/dist/default/define/video/compat-skin2.js +1 -1
  31. package/dist/default/define/video/neutral-skin.css +83 -14
  32. package/dist/default/define/video/neutral-skin2.js +1 -1
  33. package/dist/default/define/video/scaffold-skin.css +95 -13
  34. package/dist/default/define/video/scaffold-skin2.js +1 -1
  35. package/dist/default/define/video/skin.css +94 -16
  36. package/dist/default/define/video/skin2.js +1 -1
  37. package/dist/default/extensions/google-analytics/extension.js +75 -0
  38. package/dist/default/extensions/mux-data/extension.js +7 -2
  39. package/dist/default/internal/skins/compat-audio/skin.css +72 -5
  40. package/dist/default/internal/skins/compat-audio/template.js +1 -1
  41. package/dist/default/internal/skins/compat-live-audio/skin.css +54 -5
  42. package/dist/default/internal/skins/compat-live-video/skin.css +115 -13
  43. package/dist/default/internal/skins/compat-video/skin.css +115 -13
  44. package/dist/default/internal/skins/default-audio/skin.css +21 -5
  45. package/dist/default/internal/skins/default-live-audio/skin.css +6 -4
  46. package/dist/default/internal/skins/default-live-video/skin.css +96 -16
  47. package/dist/default/internal/skins/default-video/skin.css +94 -16
  48. package/dist/default/internal/skins/neutral-audio/skin.css +23 -5
  49. package/dist/default/internal/skins/neutral-live-audio/skin.css +8 -4
  50. package/dist/default/internal/skins/neutral-live-video/skin.css +82 -14
  51. package/dist/default/internal/skins/neutral-video/skin.css +83 -14
  52. package/dist/default/internal/skins/scaffold-audio/skin.css +63 -4
  53. package/dist/default/internal/skins/scaffold-audio/template.js +1 -1
  54. package/dist/default/internal/skins/scaffold-live-audio/skin.css +45 -4
  55. package/dist/default/internal/skins/scaffold-live-video/skin.css +95 -13
  56. package/dist/default/internal/skins/scaffold-video/skin.css +95 -13
  57. package/dist/default/media/dailymotion-video/adapter.js +31 -0
  58. package/dist/default/media/hls-background-video/adapter.js +7 -0
  59. package/dist/default/media/mixcloud-audio/adapter.js +16 -0
  60. package/dist/default/media/soundcloud-audio/adapter.js +16 -0
  61. package/dist/default/player/element.js +1 -5
  62. package/dist/default/presets/background/skin.js +2 -2
  63. package/dist/default/presets/skin.js +4 -3
  64. package/dist/default/ui/dialog/element.js +13 -1
  65. package/dist/default/ui/gesture/element.js +3 -0
  66. package/dist/default/ui/media-button-element.js +10 -1
  67. package/dist/default/ui/playback-rate-button/element.js +7 -2
  68. package/dist/default/ui/playback-rate-radio-group/element.js +10 -3
  69. package/dist/default/ui/radio-options/controller.js +18 -5
  70. package/dist/default/version.js +1 -1
  71. package/dist/dev/define/audio/compat-skin.css +72 -5
  72. package/dist/dev/define/audio/compat-skin2.js +1 -1
  73. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  74. package/dist/dev/define/audio/neutral-skin.css +23 -5
  75. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  76. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  77. package/dist/dev/define/audio/scaffold-skin.css +63 -4
  78. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  79. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  80. package/dist/dev/define/audio/skin.css +21 -5
  81. package/dist/dev/define/audio/skin2.js +1 -1
  82. package/dist/dev/define/audio/skin2.js.map +1 -1
  83. package/dist/dev/define/extensions/google-analytics.d.ts +11 -0
  84. package/dist/dev/define/extensions/google-analytics.js +8 -0
  85. package/dist/dev/define/extensions/google-analytics.js.map +1 -0
  86. package/dist/dev/define/live-audio/compat-skin.css +54 -5
  87. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  88. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  89. package/dist/dev/define/live-audio/neutral-skin.css +8 -4
  90. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  91. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  92. package/dist/dev/define/live-audio/scaffold-skin.css +45 -4
  93. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  94. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  95. package/dist/dev/define/live-audio/skin.css +6 -4
  96. package/dist/dev/define/live-audio/skin2.js +1 -1
  97. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  98. package/dist/dev/define/live-video/compat-skin.css +115 -13
  99. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  100. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  101. package/dist/dev/define/live-video/neutral-skin.css +82 -14
  102. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  103. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  104. package/dist/dev/define/live-video/scaffold-skin.css +95 -13
  105. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  106. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  107. package/dist/dev/define/live-video/skin.css +96 -16
  108. package/dist/dev/define/live-video/skin2.js +1 -1
  109. package/dist/dev/define/live-video/skin2.js.map +1 -1
  110. package/dist/dev/define/media/dailymotion-video.d.ts +15 -0
  111. package/dist/dev/define/media/dailymotion-video.js +13 -0
  112. package/dist/dev/define/media/dailymotion-video.js.map +1 -0
  113. package/dist/dev/define/media/mixcloud-audio.d.ts +15 -0
  114. package/dist/dev/define/media/mixcloud-audio.js +13 -0
  115. package/dist/dev/define/media/mixcloud-audio.js.map +1 -0
  116. package/dist/dev/define/media/soundcloud-audio.d.ts +15 -0
  117. package/dist/dev/define/media/soundcloud-audio.js +13 -0
  118. package/dist/dev/define/media/soundcloud-audio.js.map +1 -0
  119. package/dist/dev/define/video/compat-skin.css +115 -13
  120. package/dist/dev/define/video/compat-skin2.js +1 -1
  121. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  122. package/dist/dev/define/video/neutral-skin.css +83 -14
  123. package/dist/dev/define/video/neutral-skin2.js +1 -1
  124. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  125. package/dist/dev/define/video/scaffold-skin.css +95 -13
  126. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  127. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  128. package/dist/dev/define/video/skin.css +94 -16
  129. package/dist/dev/define/video/skin2.js +1 -1
  130. package/dist/dev/define/video/skin2.js.map +1 -1
  131. package/dist/dev/extensions/google-analytics/extension.d.ts +52 -0
  132. package/dist/dev/extensions/google-analytics/extension.js +77 -0
  133. package/dist/dev/extensions/google-analytics/extension.js.map +1 -0
  134. package/dist/dev/extensions/google-analytics/index.d.ts +2 -0
  135. package/dist/dev/extensions/mux-data/extension.d.ts +4 -1
  136. package/dist/dev/extensions/mux-data/extension.js +7 -2
  137. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  138. package/dist/dev/index.d.ts +3 -3
  139. package/dist/dev/internal/skins/compat-audio/skin.css +72 -5
  140. package/dist/dev/internal/skins/compat-audio/template.js +1 -1
  141. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  142. package/dist/dev/internal/skins/compat-live-audio/skin.css +54 -5
  143. package/dist/dev/internal/skins/compat-live-video/skin.css +115 -13
  144. package/dist/dev/internal/skins/compat-video/skin.css +115 -13
  145. package/dist/dev/internal/skins/default-audio/skin.css +21 -5
  146. package/dist/dev/internal/skins/default-live-audio/skin.css +6 -4
  147. package/dist/dev/internal/skins/default-live-video/skin.css +96 -16
  148. package/dist/dev/internal/skins/default-video/skin.css +94 -16
  149. package/dist/dev/internal/skins/neutral-audio/skin.css +23 -5
  150. package/dist/dev/internal/skins/neutral-live-audio/skin.css +8 -4
  151. package/dist/dev/internal/skins/neutral-live-video/skin.css +82 -14
  152. package/dist/dev/internal/skins/neutral-video/skin.css +83 -14
  153. package/dist/dev/internal/skins/scaffold-audio/skin.css +63 -4
  154. package/dist/dev/internal/skins/scaffold-audio/template.js +1 -1
  155. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -1
  156. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +45 -4
  157. package/dist/dev/internal/skins/scaffold-live-video/skin.css +95 -13
  158. package/dist/dev/internal/skins/scaffold-video/skin.css +95 -13
  159. package/dist/dev/media/dailymotion-video/adapter.d.ts +17 -0
  160. package/dist/dev/media/dailymotion-video/adapter.js +47 -0
  161. package/dist/dev/media/dailymotion-video/adapter.js.map +1 -0
  162. package/dist/dev/media/dailymotion-video/index.d.ts +2 -0
  163. package/dist/dev/media/hls-background-video/adapter.d.ts +6 -1
  164. package/dist/dev/media/hls-background-video/adapter.js +7 -0
  165. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  166. package/dist/dev/media/mixcloud-audio/adapter.d.ts +11 -0
  167. package/dist/dev/media/mixcloud-audio/adapter.js +52 -0
  168. package/dist/dev/media/mixcloud-audio/adapter.js.map +1 -0
  169. package/dist/dev/media/mixcloud-audio/index.d.ts +2 -0
  170. package/dist/dev/media/soundcloud-audio/adapter.d.ts +11 -0
  171. package/dist/dev/media/soundcloud-audio/adapter.js +53 -0
  172. package/dist/dev/media/soundcloud-audio/adapter.js.map +1 -0
  173. package/dist/dev/media/soundcloud-audio/index.d.ts +2 -0
  174. package/dist/dev/player/element.js +1 -5
  175. package/dist/dev/player/element.js.map +1 -1
  176. package/dist/dev/presets/background/skin.d.ts +2 -1
  177. package/dist/dev/presets/background/skin.js +2 -2
  178. package/dist/dev/presets/background/skin.js.map +1 -1
  179. package/dist/dev/presets/skin.d.ts +4 -3
  180. package/dist/dev/presets/skin.js +4 -3
  181. package/dist/dev/presets/skin.js.map +1 -1
  182. package/dist/dev/ui/dialog/element.js +13 -1
  183. package/dist/dev/ui/dialog/element.js.map +1 -1
  184. package/dist/dev/ui/gesture/element.js +3 -0
  185. package/dist/dev/ui/gesture/element.js.map +1 -1
  186. package/dist/dev/ui/media-button-element.d.ts +9 -0
  187. package/dist/dev/ui/media-button-element.js +10 -1
  188. package/dist/dev/ui/media-button-element.js.map +1 -1
  189. package/dist/dev/ui/play-button/element.d.ts +2 -0
  190. package/dist/dev/ui/playback-rate-button/element.d.ts +9 -1
  191. package/dist/dev/ui/playback-rate-button/element.js +7 -2
  192. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  193. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -0
  194. package/dist/dev/ui/playback-rate-radio-group/element.js +10 -3
  195. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  196. package/dist/dev/ui/radio-options/controller.js +18 -5
  197. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  198. package/dist/dev/version.js +1 -1
  199. package/docs/README.md +1 -1
  200. package/docs/guides/autoplay.md +1 -1
  201. package/docs/guides/browser-support.md +2 -0
  202. package/docs/guides/build-your-own-skin.md +3 -1
  203. package/docs/guides/cdn.md +10 -9
  204. package/docs/guides/content-security-policy.md +3 -0
  205. package/docs/guides/customize-skins.md +4 -2
  206. package/docs/guides/features.md +1 -1
  207. package/docs/guides/google-analytics.md +199 -0
  208. package/docs/guides/installation-cdn.md +4 -4
  209. package/docs/guides/installation-shadcn.md +3 -3
  210. package/docs/guides/installation-svelte.md +4 -4
  211. package/docs/guides/installation-vue.md +4 -4
  212. package/docs/guides/installation.md +4 -4
  213. package/docs/guides/internationalization.md +5 -5
  214. package/docs/guides/keyboard-shortcuts.md +1 -1
  215. package/docs/guides/llms.txt +2 -1
  216. package/docs/guides/media-sources.md +3 -0
  217. package/docs/guides/migrate-from-media-chrome.md +4 -4
  218. package/docs/guides/migrate-from-mux-player.md +9 -9
  219. package/docs/guides/migrate-from-plyr.md +8 -8
  220. package/docs/guides/migrate-from-video-js-8.md +8 -9
  221. package/docs/guides/migrate-from-vidstack.md +8 -8
  222. package/docs/guides/mux-data.md +22 -0
  223. package/docs/guides/presets.md +1 -1
  224. package/docs/guides/self-hosting.md +5 -5
  225. package/docs/guides/skins.md +16 -1
  226. package/docs/guides/ui-components.md +1 -1
  227. package/docs/llms.txt +10 -5
  228. package/docs/reference/api/feature-playback-rate.md +54 -3
  229. package/docs/reference/api/feature-playback.md +5 -1
  230. package/docs/reference/api/html-create-player.md +2 -2
  231. package/docs/reference/api/llms.txt +1 -1
  232. package/docs/reference/api/media-capabilities.md +1 -1
  233. package/docs/reference/api/player-store.md +6 -3
  234. package/docs/reference/api/preset-audio.md +13 -5
  235. package/docs/reference/api/preset-background.md +2 -2
  236. package/docs/reference/api/preset-live-audio.md +13 -5
  237. package/docs/reference/api/preset-live-video.md +13 -5
  238. package/docs/reference/api/preset-video.md +13 -5
  239. package/docs/reference/api/resolve-adapter-type.md +4 -1
  240. package/docs/reference/api/ui-element.md +2 -2
  241. package/docs/reference/components/alert-dialog.md +21 -16
  242. package/docs/reference/components/audio-compat-skin.md +8 -2
  243. package/docs/reference/components/audio-neutral-skin.md +2 -2
  244. package/docs/reference/components/audio-scaffold-skin.md +2 -2
  245. package/docs/reference/components/audio-skin.md +2 -2
  246. package/docs/reference/components/audio-track-radio-group.md +2 -2
  247. package/docs/reference/components/background-video-skin.md +1 -1
  248. package/docs/reference/components/background-video.md +1 -1
  249. package/docs/reference/components/buffering-indicator.md +2 -2
  250. package/docs/reference/components/captions-radio-group.md +2 -2
  251. package/docs/reference/components/cloudflare-video.md +1 -1
  252. package/docs/reference/components/dailymotion-video.md +192 -0
  253. package/docs/reference/components/dash-video.md +2 -1
  254. package/docs/reference/components/dialog.md +49 -22
  255. package/docs/reference/components/error-dialog.md +13 -10
  256. package/docs/reference/components/gesture.md +2 -2
  257. package/docs/reference/components/google-analytics.md +51 -0
  258. package/docs/reference/components/google-cast.md +1 -1
  259. package/docs/reference/components/hls-audio.md +1 -1
  260. package/docs/reference/components/hls-background-video.md +4 -1
  261. package/docs/reference/components/hls-video.md +1 -1
  262. package/docs/reference/components/hlsjs-video.md +3 -1
  263. package/docs/reference/components/hotkey.md +2 -2
  264. package/docs/reference/components/live-audio-compat-skin.md +8 -2
  265. package/docs/reference/components/live-audio-neutral-skin.md +2 -2
  266. package/docs/reference/components/live-audio-scaffold-skin.md +2 -2
  267. package/docs/reference/components/live-audio-skin.md +2 -2
  268. package/docs/reference/components/live-video-compat-skin.md +8 -2
  269. package/docs/reference/components/live-video-neutral-skin.md +2 -2
  270. package/docs/reference/components/live-video-scaffold-skin.md +2 -2
  271. package/docs/reference/components/live-video-skin.md +2 -2
  272. package/docs/reference/components/llms.txt +9 -5
  273. package/docs/reference/components/mixcloud-audio.md +203 -0
  274. package/docs/reference/components/mux-audio.md +3 -1
  275. package/docs/reference/components/mux-background-video.md +1 -1
  276. package/docs/reference/components/mux-data.md +20 -2
  277. package/docs/reference/components/mux-video.md +3 -1
  278. package/docs/reference/components/native-hls-video.md +2 -1
  279. package/docs/reference/components/play-button.md +7 -5
  280. package/docs/reference/components/playback-rate-button.md +26 -7
  281. package/docs/reference/components/playback-rate-radio-group.md +7 -4
  282. package/docs/reference/components/player.md +3 -3
  283. package/docs/reference/components/playerjs-video.md +1 -1
  284. package/docs/reference/components/quality-radio-group.md +2 -2
  285. package/docs/reference/components/shaka-video.md +2 -1
  286. package/docs/reference/components/soundcloud-audio.md +227 -0
  287. package/docs/reference/components/spotify-audio.md +2 -2
  288. package/docs/reference/components/tiktok-video.md +2 -2
  289. package/docs/reference/components/twitch-video.md +2 -3
  290. package/docs/reference/components/video-compat-skin.md +8 -2
  291. package/docs/reference/components/video-neutral-skin.md +2 -2
  292. package/docs/reference/components/video-scaffold-skin.md +2 -2
  293. package/docs/reference/components/video-skin.md +2 -2
  294. package/docs/reference/components/vimeo-video.md +2 -1
  295. package/docs/reference/components/wistia-video.md +1 -1
  296. package/docs/reference/components/youtube-video.md +2 -1
  297. package/package.json +60 -40
@@ -199,8 +199,8 @@ import '@videojs/html/i18n/locales/ja/register';
199
199
  CDN locale modules call `registerI18n` on import. Pin every URL to the same version:
200
200
 
201
201
  ```html
202
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/locales/es.js"></script>
203
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
202
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/locales/es.js"></script>
203
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
204
204
  ```
205
205
 
206
206
  Use the same pinned version for your locale pack, `i18n.js`, and player script. Copies loaded in the same window share a registry; matching versions keeps their translation keys and APIs compatible. Import the full locale pack before partial overrides, and register before the player loads to translate the first render:
@@ -208,15 +208,15 @@ Use the same pinned version for your locale pack, `i18n.js`, and player script.
208
208
  **my-locale.js**
209
209
 
210
210
  ```js
211
- import 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/locales/es.js';
212
- import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/i18n.js';
211
+ import 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/locales/es.js';
212
+ import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/i18n.js';
213
213
 
214
214
  registerI18n('es', { buttons: { play: 'Reproducir', pause: 'Pausa' } });
215
215
  ```
216
216
 
217
217
  ```html
218
218
  <script type="module" src="/my-locale.js"></script>
219
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
219
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
220
220
  ```
221
221
 
222
222
  ### Switch locale at runtime
@@ -39,7 +39,7 @@ Declare shortcuts with `<media-hotkey>` and gestures with `<media-gesture>` insi
39
39
 
40
40
  ## How it works
41
41
 
42
- - `<media-hotkey>` binds keys to player actions: `togglePaused`, `toggleMuted`, `toggleFullscreen`, `toggleSubtitles`, `togglePictureInPicture`, `seekStep`, `volumeStep`, `seekToPercent`, `speedUp`, and `speedDown`. `seekStep` and `volumeStep` use a default step unless you pass a custom `value`. These input actions call the feature actions your components use; for example, `toggleFullscreen` chooses `requestFullscreen` or `exitFullscreen` based on `isFullscreen`.
42
+ - `<media-hotkey>` binds keys to player actions: `togglePaused`, `toggleMuted`, `toggleFullscreen`, `toggleSubtitles`, `togglePictureInPicture`, `seekStep`, `volumeStep`, `seekToPercent`, `speedUp`, and `speedDown`. `seekStep` and `volumeStep` use a default step unless you pass a custom `value`. `speedUp` and `speedDown` move through the player’s playback rates, or step by `value` when you pass one. These input actions call the feature actions your components use; for example, `toggleFullscreen` chooses `requestFullscreen` or `exitFullscreen` based on `isFullscreen`.
43
43
  - `<media-gesture>` binds `tap` and `doubletap` to the same actions. Gestures also support `toggleControls`; `seekToPercent` is available only to hotkeys. Scope each binding with `pointer` (`mouse` or `touch`) and `region` (`left`, `center`, `right`). For example, a double tap on the left can rewind while a double tap on the right skips forward.
44
44
  - `<media-status-announcer>` announces action results to screen readers. The input indicator components show brief on-screen feedback, such as volume level or captions on and off, the way native players do. The packaged skins include both.
45
45
 
@@ -1,6 +1,6 @@
1
1
  # Video.js v10 — HTML Guides
2
2
 
3
- > Installation, migration, concepts, playback guides, customization, and tooling for Video.js. Bundled with `@videojs/html` v10.2.0. Links are relative paths to files in this directory.
3
+ > Installation, migration, concepts, playback guides, customization, and tooling for Video.js. Bundled with `@videojs/html` v10.3.0. Links are relative paths to files in this directory.
4
4
 
5
5
  ## Getting Started
6
6
 
@@ -68,6 +68,7 @@ Guides for one player capability each: the recommended setup, how it works, brow
68
68
  - [Remember user preferences](./user-preferences.md): Save volume and caption preferences, restore them after loading, and adapt the pattern for quality selection.
69
69
  - [Add a background video](./background-video.md): Add an accessible background video from an MP4, WebM, HLS, or Mux source
70
70
  - [Internationalize the player](./internationalization.md): Translate player labels and announcements: shipped locale packs, custom translations, runtime switching, and server rendering.
71
+ - [Track video telemetry with Google Analytics 4](./google-analytics.md): Track video engagement, progress milestones, and playback interactions by adding the Google Analytics extension to a player
71
72
  - [Monitor playback with Mux Data](./mux-data.md): Measure startup time, rebuffering, failures, and watch time by adding the Mux Data extension to a player
72
73
 
73
74
  ## Migrate
@@ -88,9 +88,12 @@ Engine options live under `source.engine`, **namespaced by engine**. Each key th
88
88
  | `engine.vimeo` | [`<vimeo-video>`](../reference/components/vimeo-video.md) | [Vimeo embed parameters](https://developer.vimeo.com/player/sdk/embed) |
89
89
  | `engine.youtube` | [`<youtube-video>`](../reference/components/youtube-video.md) | [YouTube player parameters](https://developer.chrome.com/docs/youtube/iframe_api_reference#Parameters) |
90
90
  | `engine.cloudflare` | [`<cloudflare-video>`](../reference/components/cloudflare-video.md) | [Stream player parameters](https://developers.cloudflare.com/stream/viewing-videos/using-the-stream-player/) |
91
+ | `engine.soundcloud` | [`<soundcloud-audio>`](../reference/components/soundcloud-audio.md) | [SoundCloud Widget parameters](https://developers.soundcloud.com/docs/api/html5-widget#parameters) |
92
+ | `engine.mixcloud` | [`<mixcloud-audio>`](../reference/components/mixcloud-audio.md) | [Mixcloud Widget options](https://www.mixcloud.com/developers/widget/) |
91
93
  | `engine.spotify` | [`<spotify-audio>`](../reference/components/spotify-audio.md) | [Spotify embed options](https://developer.spotify.com/documentation/embeds) |
92
94
  | `engine.tiktok` | [`<tiktok-video>`](../reference/components/tiktok-video.md) | [TikTok player parameters](https://developers.tiktok.com/doc/embed-player) |
93
95
  | `engine.twitch` | [`<twitch-video>`](../reference/components/twitch-video.md) | [Twitch embed parameters](https://dev.twitch.tv/docs/embed/video-and-clips/) |
96
+ | `engine.dailymotion` | [`<dailymotion-video>`](../reference/components/dailymotion-video.md) | a Player ID and [Dailymotion runtime parameters](https://developers.dailymotion.com/reference/web-sdk-player-runtime-parameters) |
94
97
  | `engine.playerJs` | [`<playerjs-video>`](../reference/components/playerjs-video.md) | URL parameters for whichever service serves the embed |
95
98
 
96
99
  Naming the engine rather than using one generic key matters where an element has more than one to choose from. `<hlsjs-video>` plays through hls.js or through the browser depending on the platform and `preferPlayback`, and only one of them runs — so a single source can describe both paths without either engine reading the other’s options.
@@ -46,14 +46,14 @@ Before loading Video.js HTML, remove every Media Chrome import and CDN script fr
46
46
  For a page without a bundler, load the CDN video preset. It registers the player, the UI elements and icons used in the controller example below, and the `<media-i18n>` element:
47
47
 
48
48
  ```html
49
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
49
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
50
50
  ```
51
51
 
52
52
  Some elements in the mapping table below need separate bundles. If you use any of these elements, also load its bundle:
53
53
 
54
- - `media-seek-button`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/seek-button.js`
55
- - `media-playback-rate-button`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/playback-rate-button.js`
56
- - `media-thumbnail`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/thumbnail.js`
54
+ - `media-seek-button`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/ui/seek-button.js`
55
+ - `media-playback-rate-button`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/ui/playback-rate-button.js`
56
+ - `media-thumbnail`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/ui/thumbnail.js`
57
57
 
58
58
  Load each with `<script type="module" src="…"></script>`. See [CDN](./cdn.md) for individual component bundles.
59
59
 
@@ -68,9 +68,9 @@ The examples keep a playback ID, analytics metadata, and a poster from two secon
68
68
  From the CDN, load the video [preset](./presets.md), the Mux media, and analytics:
69
69
 
70
70
  ```html
71
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
72
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/mux-video.js"></script>
73
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/extensions/mux-data.js"></script>
71
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
72
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/mux-video.js"></script>
73
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/extensions/mux-data.js"></script>
74
74
 
75
75
  <video-player content-title="Test VOD">
76
76
  <video-skin style="aspect-ratio: 16 / 9">
@@ -288,7 +288,7 @@ Choose the smallest customization that meets your existing UI requirements: a pa
288
288
 
289
289
  ### Level 1: pick a skin
290
290
 
291
- Video.js has three packaged skins. The Default skin groups settings in a menu. The Neutral skin has a compact layout like a classic player control bar. The Compat skin uses plain surfaces and basic controls for broader browser support. All three bring controls, tooltips, captions, keyboard shortcuts, touch gestures, and a settings menu that appears when there’s something to put in it. See [Skins](./skins.md).
291
+ Video.js has four packaged skins. The Default skin groups settings in a menu. The Neutral skin has a compact layout like a classic player control bar. The Compat skin has plain, unbranded surfaces with large play and seek buttons in the center. The Scaffold skin has Compat’s controls with minimal styling, as a starting point for your own design. All four bring controls, tooltips, captions, keyboard shortcuts, touch gestures, and a settings menu that appears when there’s something to put in it. See [Choose a skin](./skins.md#choose-a-skin).
292
292
 
293
293
  ### Level 2: restyle it
294
294
 
@@ -421,8 +421,8 @@ Mux Player switches to live controls automatically. In Video.js, choose the live
421
421
  Register the live preset and Mux media. From the CDN:
422
422
 
423
423
  ```html
424
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/live-video.js"></script>
425
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/mux-video.js"></script>
424
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/live-video.js"></script>
425
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/mux-video.js"></script>
426
426
 
427
427
  <live-video-player>
428
428
  <live-video-skin>
@@ -452,7 +452,7 @@ Use [`createPlayer`](../reference/api/html-create-player.md) to build a player e
452
452
  The live skin already includes a live button. If you build your own controls, use that same component and style it to match your app. It keeps track of whether playback is live and returns viewers to the newest available point in the stream.
453
453
 
454
454
  ```html
455
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/live-button.js"></script>
455
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/ui/live-button.js"></script>
456
456
 
457
457
  <media-live-button class="station-live-button">On air</media-live-button>
458
458
  ```
@@ -502,7 +502,7 @@ The video skins include a settings menu with the available quality, audio-track,
502
502
  | Quality | [Quality radio group](../reference/components/quality-radio-group.md) | Lets a viewer pick the video quality. Use `source.playback.maxResolution` to cap the stream’s available resolution; it does not force playback at that resolution. |
503
503
  | Audio tracks | [Audio track radio group](../reference/components/audio-track-radio-group.md) | For multi-language audio. |
504
504
  | Captions | [Captions radio group](../reference/components/captions-radio-group.md) | Rendered by the browser. |
505
- | Speed | [Playback rate radio group](../reference/components/playback-rate-radio-group.md) | The rates are a fixed set — `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, `2` — and you can’t choose your own yet ([#1404](https://github.com/videojs/v10/issues/1404)). |
505
+ | Speed | [Playback rate radio group](../reference/components/playback-rate-radio-group.md) | The rates default to `0.5` through `2` in steps of `0.25`. Set `defaultPlaybackRates` on the player, or `rates` on the radio group, to choose your own; see the [playback rate feature](../reference/api/feature-playback-rate.md). |
506
506
 
507
507
  When enabling captions without a previous selection in this player instance, `toggleSubtitles()` prefers a track matching `navigator.language`, then falls back to the first available caption or subtitle track. For an authored track that should show on load, add `default`. See [Show captions and subtitles](./captions.md).
508
508
 
@@ -575,7 +575,7 @@ Video.js has no Program Date Time (PDT) helpers such as `getStartDate()` or `cur
575
575
 
576
576
  Check these limitations against your required features:
577
577
 
578
- - The two packaged skins do not reproduce Mux Player’s themes, and there is no runtime theme switch. Plan skin customization when preserving a theme such as `classic`.
578
+ - The packaged skins do not reproduce Mux Player’s themes, and there is no runtime theme switch. Plan skin customization when preserving a theme such as `classic`.
579
579
  - Lazy loading (`loading="viewport|page"`) has no equivalent.
580
580
  - The controls auto-hide delay isn’t configurable ([#1728](https://github.com/videojs/v10/issues/1728)). For always-visible controls, set `visibility="always"` on the controls component in a custom layout or installed skin source.
581
581
  - Player preferences such as volume, captions language, speed, and quality are not persisted automatically ([#944](https://github.com/videojs/v10/issues/944)). Mux users can set `source.playback.defaultSubtitlesLang` so the HLS playlist sets the default subtitle language. For application-managed persistence, follow [Remember user preferences](./user-preferences.md).
@@ -72,7 +72,7 @@ The Neutral skin is the closest built-in starting point for this migration.
72
72
  For an HTML page without a bundler, load the CDN preset:
73
73
 
74
74
  ```html
75
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video-neutral.js"></script>
75
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video-neutral.js"></script>
76
76
 
77
77
  <video-player poster="/path/to/poster.jpg">
78
78
  <video-neutral-skin style="aspect-ratio: 16 / 9">
@@ -119,7 +119,7 @@ The SPF [HLS video](../reference/components/hls-video.md) component is an altern
119
119
  Replace `<video>` with `<hlsjs-video>`. If you’re using the CDN, add an additional script:
120
120
 
121
121
  ```html
122
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/hlsjs-video.js"></script>
122
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/hlsjs-video.js"></script>
123
123
  ```
124
124
 
125
125
  For a bundler installation, install the adapter package and add the media import:
@@ -141,7 +141,7 @@ Use the DASH media component for an unprotected DASH source. For DRM-protected D
141
141
  Replace `<video>` with `<dash-video>`. If you’re using the CDN, add an additional script:
142
142
 
143
143
  ```html
144
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/dash-video.js"></script>
144
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/dash-video.js"></script>
145
145
  ```
146
146
 
147
147
  For a package-manager installation, install the DASH adapter package and add the media import:
@@ -163,7 +163,7 @@ Use the Vimeo media component for your existing Vimeo source.
163
163
  Replace `<video>` with `<vimeo-video>`. For a CDN installation, add the media script:
164
164
 
165
165
  ```html
166
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/vimeo-video.js"></script>
166
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/vimeo-video.js"></script>
167
167
  ```
168
168
 
169
169
  For a bundler installation, install the adapter package and add the module import:
@@ -185,7 +185,7 @@ Use the YouTube media component for your existing YouTube source.
185
185
  Replace `<video>` with `<youtube-video>`. For a CDN installation, add the media script:
186
186
 
187
187
  ```html
188
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/youtube-video.js"></script>
188
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/youtube-video.js"></script>
189
189
  ```
190
190
 
191
191
  For a bundler installation, install the adapter package and add the module import:
@@ -216,7 +216,7 @@ To select a locale, wrap the player in `<media-i18n>` and set `lang` to your loc
216
216
 
217
217
  ```html
218
218
  <script type="module">
219
- import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/i18n.js';
219
+ import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/i18n.js';
220
220
 
221
221
  registerI18n('en', {
222
222
  buttons: {
@@ -229,7 +229,7 @@ To select a locale, wrap the player in `<media-i18n>` and set `lang` to your loc
229
229
  });
230
230
  </script>
231
231
 
232
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video-neutral.js"></script>
232
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video-neutral.js"></script>
233
233
 
234
234
  <video-player>
235
235
  <video-neutral-skin>
@@ -370,7 +370,7 @@ For changes to controls, layout, or icons, add the skin source to your project.
370
370
 
371
371
  - Plyr’s `ads` option has no built-in equivalent.
372
372
  - Plyr’s `storage` option has no built-in equivalent for persisted volume, captions language, muted state, speed, or quality. Player setting persistence is tracked in [#944](https://github.com/videojs/v10/issues/944). For application-managed persistence, follow [Remember user preferences](./user-preferences.md).
373
- - Playback rates are fixed at `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, and `2`. Plyr’s `speed.options` has no equivalent yet ([#1404](https://github.com/videojs/v10/issues/1404)).
373
+ - Plyr’s `speed.options` maps to `defaultPlaybackRates` on the player. See the [playback rate feature](../reference/api/feature-playback-rate.md).
374
374
  - Plyr’s full-window fullscreen fallback has no matching Video.js feature. Test fullscreen on your supported browsers; see [Browser support](./browser-support.md).
375
375
  - Plain MP4 source arrays with `size` metadata do not automatically create a quality menu. Use Mux, HLS, or DASH for adaptive quality when possible.
376
376
  - Preset skins segment the time slider and show chapter titles when the media includes a default `<track kind="chapters">`. Cue points are not implemented yet; see [#1442](https://github.com/videojs/v10/issues/1442).
@@ -65,7 +65,7 @@ Here’s a standard v8 setup: one file, captions, a poster, and the default skin
65
65
  Load the video [preset](./presets.md) from the CDN and put your media inside its skin:
66
66
 
67
67
  ```html
68
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
68
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
69
69
 
70
70
  <video-player poster="/poster.jpg">
71
71
  <video-skin style="aspect-ratio: 16 / 9">
@@ -185,7 +185,7 @@ These options need a migration decision. Each row links to the relevant guidance
185
185
  | `languages`, `language`, `videojs.addLanguage` | [Languages](#languages) |
186
186
  | `liveui`, `liveTracker` | [Live and audio-only](#live-and-audio-only) |
187
187
  | `audioOnlyMode`, `audioPosterMode` | [Live and audio-only](#live-and-audio-only) |
188
- | `playbackRates` | not configurable yet ([#1404](https://github.com/videojs/v10/issues/1404)) |
188
+ | `playbackRates` | `defaultPlaybackRates` on the player, or `rates` on a single control. See the [playback rate feature](../reference/api/feature-playback-rate.md) |
189
189
  | `textTrackSettings` | no equivalent; see [Known gaps](#known-gaps) |
190
190
  | `spatialNavigation` | no equivalent; see [Known gaps](#known-gaps) |
191
191
  | `inactivityTimeout` | delay not configurable yet ([#1728](https://github.com/videojs/v10/issues/1728)); `inactivityTimeout: 0` maps to `visibility="always"` on the controls component |
@@ -230,7 +230,7 @@ SPF and native HLS are included as dependencies of the HTML and React packages.
230
230
  For hls.js video from the CDN:
231
231
 
232
232
  ```html
233
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/hlsjs-video.js"></script>
233
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/hlsjs-video.js"></script>
234
234
  ```
235
235
 
236
236
  With a package manager, install the adapter and import its HTML registration:
@@ -323,7 +323,7 @@ Move license URLs from v8’s `keySystems` configuration to `source.drm`, keyed
323
323
 
324
324
  The examples configure Widevine. Replace both URL placeholders and add every key system your supported browsers need.
325
325
 
326
- With a bundler, install `@videojs/shaka-video` and import `@videojs/html/media/shaka-video`. From the CDN, load `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/shaka-video.js` in a `<script type="module">` tag. Then replace the media component inside your player’s skin with:
326
+ With a bundler, install `@videojs/shaka-video` and import `@videojs/html/media/shaka-video`. From the CDN, load `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/shaka-video.js` in a `<script type="module">` tag. Then replace the media component inside your player’s skin with:
327
327
 
328
328
  ```html
329
329
  <shaka-video id="protected-media"></shaka-video>
@@ -446,7 +446,7 @@ For a CDN page, register string overrides in a module script:
446
446
 
447
447
  ```html
448
448
  <script type="module">
449
- import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/i18n.js';
449
+ import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/i18n.js';
450
450
 
451
451
  registerI18n('en', {
452
452
  buttons: { play: 'Start video', pause: 'Pause video' },
@@ -466,8 +466,8 @@ Replace `liveui` or `audioOnlyMode` with the matching live or audio [preset](./p
466
466
  Load the live preset and the hls.js media component:
467
467
 
468
468
  ```html
469
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/live-video.js"></script>
470
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/hlsjs-video.js"></script>
469
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/live-video.js"></script>
470
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/hlsjs-video.js"></script>
471
471
 
472
472
  <live-video-player>
473
473
  <live-video-skin>
@@ -520,7 +520,6 @@ Check these limitations against your required features:
520
520
  - **No ads support.** v8’s IMA and ad-plugin ecosystem has no v10 equivalent. If your player depends on ads, resolve that requirement before replacing it.
521
521
  - **No playlist support.** No `videojs-playlist` equivalent.
522
522
  - **No plugin system**, by design. Budget for rebuilding UI plugins as components. See [Plugins](#plugins).
523
- - Playback rates are a fixed set — `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, `2` — so v8’s `playbackRates` has no equivalent yet ([#1404](https://github.com/videojs/v10/issues/1404)).
524
523
  - No text-track settings dialog equivalent to v8’s `textTrackSettings`. You can still style browser-rendered cues with `::cue`; see [Show captions and subtitles](./captions.md).
525
524
  - No spatial navigation. v8’s `spatialNavigation` for TV and D-pad remotes has no equivalent.
526
525
  - Player preferences such as volume, captions language, speed, and quality are not persisted automatically ([#944](https://github.com/videojs/v10/issues/944)). For application-managed persistence, follow [Remember user preferences](./user-preferences.md).
@@ -529,7 +528,7 @@ Check these limitations against your required features:
529
528
  - The controls auto-hide delay isn’t configurable, so arbitrary `inactivityTimeout` values have no equivalent ([#1728](https://github.com/videojs/v10/issues/1728)). For `inactivityTimeout: 0`, set `visibility="always"` on the controls component in a custom layout or installed skin source.
530
529
  - No full-window fullscreen fallback. Test fullscreen on your supported browsers; see [Browser support](./browser-support.md).
531
530
  - Multiple `<source>` elements with `size` metadata don’t become a quality menu. Use HLS or DASH for adaptive quality.
532
- - The Default, Neutral, and Compat skins are available. Runtime theme switching is not supported.
531
+ - The Default, Neutral, Compat, and Scaffold skins are available. Runtime theme switching is not supported.
533
532
  - Native controls are not automatically removed when custom controls load ([#1160](https://github.com/videojs/v10/issues/1160)).
534
533
  - Debug mode has no equivalent yet ([#1406](https://github.com/videojs/v10/issues/1406)).
535
534
 
@@ -154,7 +154,7 @@ What changed:
154
154
  Load the bundle as a module script. From the CDN, the video preset is one script:
155
155
 
156
156
  ```html
157
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
157
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/video.js"></script>
158
158
  ```
159
159
 
160
160
  Pin every Video.js CDN URL on a page to the same version; see [CDN](./cdn.md).
@@ -214,7 +214,7 @@ Remove `controls` yourself: Video.js doesn’t turn native controls off when a s
214
214
  | `live-edge-tolerance`, `min-live-dvr-window` | No equivalent ([#1730](https://github.com/videojs/v10/issues/1730)) |
215
215
  | `artist`, `artwork` | No equivalent; Video.js doesn’t set Media Session metadata ([#3042](https://github.com/videojs/v10/issues/3042)) |
216
216
  | `log-level` | No equivalent ([#1406](https://github.com/videojs/v10/issues/1406)); development builds print warnings |
217
- | `keep-alive` | `keep-alive` on each element you move. See [Element lifecycle](#element-lifecycle) |
217
+ | `keep-alive` | `keep-alive` on the player and on its media component. See [Element lifecycle](#element-lifecycle) |
218
218
 
219
219
  Vidstack queued `paused`, `volume`, and the other playback props until the media could play. Video.js doesn’t queue: most actions fail until the player has attached to its media, `seek()` included, which only waits for metadata once attached. Call them from event handlers.
220
220
 
@@ -233,7 +233,7 @@ Vidstack’s `<media-provider>` read `src`, guessed a type from the extension or
233
233
  | Vimeo | [`<vimeo-video>`](../reference/components/vimeo-video.md) | `@videojs/vimeo-video` |
234
234
  | Remotion | No equivalent ([#3053](https://github.com/videojs/v10/issues/3053)) | |
235
235
 
236
- Register each media component with `import '@videojs/html/media/<name>'`, or load `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/<name>.js` from the CDN, where the engine is already bundled.
236
+ Register each media component with `import '@videojs/html/media/<name>'`, or load `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.3.0/media/<name>.js` from the CDN, where the engine is already bundled.
237
237
 
238
238
  ### HLS and DASH
239
239
 
@@ -336,7 +336,7 @@ async function load(src) {
336
336
 
337
337
  Each media module loads with `import()`, so the page only downloads the engine its source needs, the way Vidstack’s provider loaders did. A plain `<video>` needs no module. When the media changes, the player detaches from the old one, resets its state, and attaches to the new one; the skin follows.
338
338
 
339
- `resolveAdapterType` recognizes the URLs and shorthands Vidstack’s providers did, plus Wistia, Mux, Cloudflare Stream, Spotify, TikTok, and Twitch, and returns `null` for anything else. Vidstack sent a `HEAD` request when a URL had no file extension; pass the MIME type as the second argument instead. The result names a kind of source, not an engine: `hls` covers every HLS media, so choose one yourself.
339
+ `resolveAdapterType` recognizes the URLs and shorthands Vidstack’s providers did, plus Wistia, Mux, Cloudflare Stream, Spotify, SoundCloud, Mixcloud, TikTok, and Twitch, and returns `null` for anything else. Vidstack sent a `HEAD` request when a URL had no file extension; pass the MIME type as the second argument instead. The result names a kind of source, not an engine: `hls` covers every HLS media, so choose one yourself.
340
340
 
341
341
  For a single source, change the media’s `src` or `source` instead. The same media swaps the URL without being replaced.
342
342
 
@@ -372,7 +372,7 @@ Packaged skins take almost no props. Most layout props either move somewhere els
372
372
  | `color-scheme` | CSS `color-scheme`; see [Color scheme](#color-scheme) |
373
373
  | `small-when` | Container queries built into the skin; see [Responsive layouts](#responsive-layouts) |
374
374
  | `seek-step` | 10 seconds in the skin’s hotkeys and gestures; edit skin source to change it |
375
- | `playback-rates` | A fixed list: `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, `2` ([#1404](https://github.com/videojs/v10/issues/1404)) |
375
+ | `playback-rates` | `default-playback-rates`, or `rates` on a single control. See the [playback rate feature](../reference/api/feature-playback-rate.md) |
376
376
  | `no-gestures`, `no-keyboard-animations`, `disable-time-slider`, `menu-group` | Edit skin source |
377
377
  | `hide-quality-bitrate` | Bitrate shows only to tell apart renditions of the same size |
378
378
  | `no-modal`, `menu-container` | Not needed. Menus render in the browser’s top layer |
@@ -392,7 +392,7 @@ Vidstack customization climbed from layout props, through CSS variables and slot
392
392
 
393
393
  #### Level 1: pick a skin
394
394
 
395
- Choose Default, Neutral, or Compat for video, audio, live video, or live audio. See [Skins](./skins.md).
395
+ Choose Default, Neutral, Compat, or Scaffold for video, audio, live video, or live audio. See [Choose a skin](./skins.md#choose-a-skin).
396
396
 
397
397
  #### Level 2: restyle it
398
398
 
@@ -813,7 +813,7 @@ In Angular, add `CUSTOM_ELEMENTS_SCHEMA` to the `schemas` of the component that
813
813
 
814
814
  ## Element lifecycle
815
815
 
816
- Vidstack elements destroyed themselves when they were removed from the page and not put back within a frame, unless they carried `keep-alive`, which the player passed down to its children. Video.js keeps the attribute but doesn’t pass it down: set it on each element you plan to move. When you’re done with them, call `destroy()` on the player and UI elements, and `adapter.destroy()` on media components. Packaged skins don’t pass it to their controls either ([#3036](https://github.com/videojs/v10/issues/3036)), so move a player that uses one synchronously. See the player’s [lifecycle](../reference/components/player.md#lifecycle).
816
+ Vidstack elements destroyed themselves when they were removed from the page and not put back within a frame, unless they carried `keep-alive`, which the player passed down to its children. Video.js passes it from the player to the UI elements inside it, including a packaged skin’s controls, but not to media components: set `keep-alive` on the media component too. When you’re done, call `destroy()` on the player, which also destroys the UI elements inside it, and `adapter.destroy()` on media components. See the player’s [lifecycle](../reference/components/player.md#lifecycle).
817
817
 
818
818
  ## Behavior changes to check
819
819
 
@@ -840,7 +840,7 @@ Ordered roughly by how likely each is to block a Vidstack migration. Follow [Vid
840
840
  - **Nothing persists** between visits: volume, captions, language, rate, quality, or position ([#944](https://github.com/videojs/v10/issues/944)).
841
841
  - **No caption style settings** ([#1437](https://github.com/videojs/v10/issues/1437)), no custom caption renderer ([#3038](https://github.com/videojs/v10/issues/3038)), and WebVTT only: no SRT, SSA/ASS, or JSON captions ([#3037](https://github.com/videojs/v10/issues/3037)). Audio players don’t show captions ([#3039](https://github.com/videojs/v10/issues/3039)).
842
842
  - **No chapters menu** or chapter title outside the time slider ([#1873](https://github.com/videojs/v10/issues/1873)), and no dedicated API for chapters from code ([#1268](https://github.com/videojs/v10/issues/1268)). Cue points and markers aren’t implemented ([#1442](https://github.com/videojs/v10/issues/1442)).
843
- - **Fixed playback rates**: `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, `2` ([#1404](https://github.com/videojs/v10/issues/1404)). No speed or quality sliders ([#3052](https://github.com/videojs/v10/issues/3052)).
843
+ - **No speed or quality sliders** ([#3052](https://github.com/videojs/v10/issues/3052)).
844
844
  - **No audio gain or boost** ([#1135](https://github.com/videojs/v10/issues/1135)).
845
845
  - **No load strategies.** Vidstack’s media and poster loading strategies and `startLoading()` have no equivalent ([#3043](https://github.com/videojs/v10/issues/3043)), and embeds don’t preconnect ([#1433](https://github.com/videojs/v10/issues/1433)).
846
846
  - **No clipping.** Vidstack’s clip start and end times have no equivalent ([#3040](https://github.com/videojs/v10/issues/3040)).
@@ -64,6 +64,28 @@ How much the extension reports depends on the engine playing the stream. All med
64
64
 
65
65
  The `video_id` it reports is the Mux playback ID for streams served from `stream.mux.com`, and the source URL otherwise. Each view also gets a generated `view_session_id`. Override either through `metadata`.
66
66
 
67
+ ## Name the player
68
+
69
+ Each view reports a player software name of `videojs-html-<engine>`, with the Video.js version as the player software version, so you can compare views by engine in Mux Data. For example, a stream played by hls.js reports `videojs-html-hlsjs`.
70
+
71
+ | Engine | Played by |
72
+ | --- | --- |
73
+ | `hlsjs` | [hls.js](https://github.com/video-dev/hls.js/) |
74
+ | `spf-hls-video` | The Video.js SPF engine for video, used by HLS video and the SPF flavor of Mux video |
75
+ | `spf-hls-audio` | The audio-only SPF engine, used by HLS audio and the SPF flavor of Mux audio |
76
+ | `spf-hls-background-video` | The SPF engine for background video |
77
+ | `shaka` | [Shaka Player](https://github.com/shaka-project/shaka-player) |
78
+ | `dashjs` | [dash.js](https://github.com/Dash-Industry-Forum/dash.js) |
79
+ | `browser` | The browser itself, like native HLS in Safari or an MP4 file |
80
+
81
+ The name follows the engine that’s playing, so a source change that switches engines updates the name for the current view.
82
+
83
+ To report your own name instead, set the player software name. It takes precedence over the default:
84
+
85
+ ```html
86
+ <mux-data player-software-name="my-player" player-software-version="2.4.0"></mux-data>
87
+ ```
88
+
67
89
  ## Describe the view
68
90
 
69
91
  Pass Mux Data [metadata](https://www.mux.com/docs/guides/make-your-data-actionable-with-metadata?utm_source=videojs&utm_campaign=vjs10&utm_content=docs-content) to label views with your own titles, viewer IDs, and custom dimensions. `metadata` takes an object. In HTML, set it as a JavaScript property:
@@ -26,7 +26,7 @@ For example, the `@videojs/html/background` preset includes a media component wi
26
26
 
27
27
  The default presets are `/video` and `/audio`. These cover the baseline controls you’d expect from the HTML `<video>` and `<audio>` tags. Beyond the defaults, presets target more specific use cases — the `/background` preset, for example, needs layout but not controls. Over time we’ll add more: short-form players, podcast players, TV streaming players, and others.
28
28
 
29
- The video, audio, live video, and live audio presets also export Compat skins. For example, React exports `CompatVideoSkin` with `@videojs/react/video/compat-skin.css`; HTML registers `<video-compat-skin>` through `@videojs/html/video/compat-skin`.
29
+ The video, audio, live video, and live audio presets each export four skins: Default, Neutral, Compat, and Scaffold. For example, React exports `ScaffoldVideoSkin` with `@videojs/react/video/scaffold-skin.css`; HTML registers `<video-scaffold-skin>` through `@videojs/html/video/scaffold-skin`. See [Choose a skin](./skins.md#choose-a-skin) to compare them.
30
30
 
31
31
  | Import | Description | Details |
32
32
  | --- | --- | --- |
@@ -43,7 +43,7 @@ Bundle a single file when you already build your front end. Download the release
43
43
  Unpack it into whatever your server treats as static files:
44
44
 
45
45
  ```bash
46
- VIDEOJS_VERSION=10.2.0
46
+ VIDEOJS_VERSION=10.3.0
47
47
  curl -fLO "https://github.com/videojs/video.js/releases/download/@videojs/cdn@${VIDEOJS_VERSION}/videojs-cdn-${VIDEOJS_VERSION}.zip"
48
48
  unzip "videojs-cdn-${VIDEOJS_VERSION}.zip" -d public/
49
49
  ```
@@ -51,7 +51,7 @@ unzip "videojs-cdn-${VIDEOJS_VERSION}.zip" -d public/
51
51
  Then point a script tag at the player you want:
52
52
 
53
53
  ```html
54
- <script type="module" src="/videojs-cdn-10.2.0/video.js"></script>
54
+ <script type="module" src="/videojs-cdn-10.3.0/video.js"></script>
55
55
  ```
56
56
 
57
57
  The archive holds the same production bundles the CDN serves, minus sourcemaps and development builds. Every path inside it is relative, so it runs from any origin with no outbound requests. `SHA256SUMS` on the release verifies the download.
@@ -67,20 +67,20 @@ For Composer-based projects such as Drupal, declare the archive as a package:
67
67
  "type": "package",
68
68
  "package": {
69
69
  "name": "videojs/cdn",
70
- "version": "10.2.0",
70
+ "version": "10.3.0",
71
71
  "type": "drupal-library",
72
72
  "extra": {
73
73
  "installer-name": "videojs-cdn"
74
74
  },
75
75
  "dist": {
76
76
  "type": "zip",
77
- "url": "https://github.com/videojs/video.js/releases/download/@videojs/cdn@10.2.0/videojs-cdn-10.2.0.zip"
77
+ "url": "https://github.com/videojs/video.js/releases/download/@videojs/cdn@10.3.0/videojs-cdn-10.3.0.zip"
78
78
  }
79
79
  }
80
80
  }
81
81
  ],
82
82
  "require": {
83
- "videojs/cdn": "10.2.0"
83
+ "videojs/cdn": "10.3.0"
84
84
  }
85
85
  }
86
86
  ```
@@ -8,7 +8,22 @@ Packaged player designs that include both UI components and their styles.
8
8
 
9
9
  A skin wraps the media component and provides the player’s complete interface. It combines a specific set of UI components with the styles that arrange and present them.
10
10
 
11
- The video, audio, live video, and live audio presets each provide Default, Neutral, Compat, and Scaffold skins. Compat uses plain surfaces and basic controls, with broader browser compatibility as its design goal. Scaffold uses minimal styling as a starting point for a custom skin; its appearance is intended to be replaced.
11
+ ## Choose a skin
12
+
13
+ The video, audio, live video, and live audio presets each provide four skins: Default, Neutral, Compat, and Scaffold. Compare them on three questions: which features you need, how much of the design you want to bring, and how consistently the player should look across browsers.
14
+
15
+ | | Default | Neutral | Compat | Scaffold |
16
+ | --- | --- | --- | --- | --- |
17
+ | Features | Complete | Same as Default | The same core controls in a simpler layout | Same as Compat |
18
+ | Styling | Opinionated and distinctly Video.js | Opinionated and easy to brand | Unbranded, a polished step above native controls | Unbranded and minimal, a foundation to restyle |
19
+ | Browser compatibility | Uses newer visual effects where browsers support them | Same as Default | Avoids newer visual effects, so it looks consistent across browsers | Same as Compat |
20
+
21
+ - **Default** is our design, with frosted surfaces and a modern look. Choose it when you want the player to look like Video.js.
22
+ - **Neutral** has the same controls in a lighter design, closer to a classic control bar. Choose it to apply your brand to a finished design: set your accent color, font, and corner radius through [CSS custom properties](./customize-skins.md#set-the-skins-styles).
23
+ - **Compat** has plain, unbranded surfaces. Choose it when the player should blend into content pages, such as an encyclopedia article. It avoids backdrop blur, anchor-positioned menu highlights, and squircle corners, which some browsers render differently or skip.
24
+ - **Scaffold** has Compat’s controls with minimal styling: square corners, no shadows or blur, your page’s font, and no transitions. Choose it as the foundation for your own design, when you plan to restyle the whole player rather than brand a finished one.
25
+
26
+ All four skins support the same [browsers](./browser-support.md), keyboard shortcuts, and gestures. To build your own design instead, add Scaffold’s [source](#skin-source-in-your-project) to your project, start from another skin’s source, or build a [custom interface](#custom-interface).
12
27
 
13
28
  ## Packaged skins and skin source
14
29
 
@@ -39,7 +39,7 @@ import '@videojs/html/icons/element';
39
39
 
40
40
  ### Style components with state
41
41
 
42
- Components add `data-*` attributes to describe their current state. For example, a play button adds `data-paused` while the media is paused. Use those attributes in CSS:
42
+ Components add `data-*` attributes to describe their current state. For example, a play button adds `data-paused` while the media is paused, except while autoplay is pending, when the button shows pause. Use those attributes in CSS:
43
43
 
44
44
  ```css
45
45
  .my-play-button .pause-icon {
package/docs/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # Video.js v10 — HTML Documentation
2
2
 
3
- > Bundled with `@videojs/html` v10.2.0. Links are relative paths to files in this directory.
3
+ > Bundled with `@videojs/html` v10.3.0. Links are relative paths to files in this directory.
4
4
 
5
5
  > Install the [Video.js skill](https://github.com/videojs/skills) to help AI coding agents find version-matched pages from this index.
6
6
 
@@ -82,6 +82,7 @@ Guides for one player capability each: the recommended setup, how it works, brow
82
82
  - [Remember user preferences](./guides/user-preferences.md): Save volume and caption preferences, restore them after loading, and adapt the pattern for quality selection.
83
83
  - [Add a background video](./guides/background-video.md): Add an accessible background video from an MP4, WebM, HLS, or Mux source
84
84
  - [Internationalize the player](./guides/internationalization.md): Translate player labels and announcements: shipped locale packs, custom translations, runtime switching, and server rendering.
85
+ - [Track video telemetry with Google Analytics 4](./guides/google-analytics.md): Track video engagement, progress milestones, and playback interactions by adding the Google Analytics extension to a player
85
86
  - [Monitor playback with Mux Data](./guides/mux-data.md): Measure startup time, rebuffering, failures, and watch time by adding the Mux Data extension to a player
86
87
 
87
88
  ### Migrate
@@ -115,19 +116,19 @@ API reference for the packaged skins each preset ships.
115
116
 
116
117
  - [video-skin](./reference/components/video-skin.md): The video preset's default skin with the modern, frosted look
117
118
  - [video-neutral-skin](./reference/components/video-neutral-skin.md): The video preset's visually lighter skin, closer to a classic control bar
118
- - [video-compat-skin](./reference/components/video-compat-skin.md): A video skin designed for broader browser compatibility
119
+ - [video-compat-skin](./reference/components/video-compat-skin.md): The video preset's plain, unbranded skin, a polished step above native controls
119
120
  - [video-scaffold-skin](./reference/components/video-scaffold-skin.md): A video skin with minimal styling for custom skins
120
121
  - [audio-skin](./reference/components/audio-skin.md): The audio preset's default skin with the modern, frosted look
121
122
  - [audio-neutral-skin](./reference/components/audio-neutral-skin.md): The audio preset's visually lighter skin, closer to a classic control bar
122
- - [audio-compat-skin](./reference/components/audio-compat-skin.md): An audio skin designed for broader browser compatibility
123
+ - [audio-compat-skin](./reference/components/audio-compat-skin.md): The audio preset's plain, unbranded skin, a polished step above native controls
123
124
  - [audio-scaffold-skin](./reference/components/audio-scaffold-skin.md): An audio skin with minimal styling for custom skins
124
125
  - [live-video-skin](./reference/components/live-video-skin.md): The live video preset's default skin, which swaps time controls for a Live button
125
126
  - [live-video-neutral-skin](./reference/components/live-video-neutral-skin.md): The live video preset's visually lighter skin, closer to a classic control bar
126
- - [live-video-compat-skin](./reference/components/live-video-compat-skin.md): A live video skin designed for broader browser compatibility
127
+ - [live-video-compat-skin](./reference/components/live-video-compat-skin.md): The live video preset's plain, unbranded skin, a polished step above native controls
127
128
  - [live-video-scaffold-skin](./reference/components/live-video-scaffold-skin.md): A live video skin with minimal styling for custom skins
128
129
  - [live-audio-skin](./reference/components/live-audio-skin.md): The live audio preset's default skin, which swaps time controls for a Live button
129
130
  - [live-audio-neutral-skin](./reference/components/live-audio-neutral-skin.md): The live audio preset's visually lighter skin, closer to a classic control bar
130
- - [live-audio-compat-skin](./reference/components/live-audio-compat-skin.md): A live audio skin designed for broader browser compatibility
131
+ - [live-audio-compat-skin](./reference/components/live-audio-compat-skin.md): The live audio preset's plain, unbranded skin, a polished step above native controls
131
132
  - [live-audio-scaffold-skin](./reference/components/live-audio-scaffold-skin.md): A live audio skin with minimal styling for custom skins
132
133
  - [background-video-skin](./reference/components/background-video-skin.md): The background preset's chrome-less skin for ambient video
133
134
 
@@ -138,17 +139,20 @@ API reference for media components that handle streaming protocols and playback.
138
139
  - [audio](./reference/components/audio.md): Native audio playback that can provide media to a Video.js player
139
140
  - [background-video](./reference/components/background-video.md): Decorative background video element with automatic muting and looping
140
141
  - [cloudflare-video](./reference/components/cloudflare-video.md): Video component that plays Cloudflare Stream videos through the Stream player
142
+ - [dailymotion-video](./reference/components/dailymotion-video.md): Video component that plays Dailymotion videos through a Dailymotion player configuration
141
143
  - [dash-video](./reference/components/dash-video.md): DASH video element powered by dash.js for adaptive bitrate streaming
142
144
  - [hls-audio](./reference/components/hls-audio.md): Audio-only HLS element that plays the audio rendition of an HLS stream
143
145
  - [hls-background-video](./reference/components/hls-background-video.md): HLS background video without controls, audio, captions, or adaptive quality
144
146
  - [hls-video](./reference/components/hls-video.md): Lightweight HLS video element with minimal bundle size
145
147
  - [hlsjs-video](./reference/components/hlsjs-video.md): HLS video element powered by hls.js for adaptive bitrate streaming
148
+ - [mixcloud-audio](./reference/components/mixcloud-audio.md): Audio component that plays Mixcloud shows through the Mixcloud Widget
146
149
  - [mux-audio](./reference/components/mux-audio.md): Audio element for Mux-hosted HLS streams
147
150
  - [mux-background-video](./reference/components/mux-background-video.md): Mux-specific name for the HLS background video component
148
151
  - [mux-video](./reference/components/mux-video.md): Video element for Mux-hosted HLS streams
149
152
  - [native-hls-video](./reference/components/native-hls-video.md): HLS video element using the browser's built-in HLS support
150
153
  - [playerjs-video](./reference/components/playerjs-video.md): Video component that plays any embed implementing the player.js protocol, such as Mux Player, Gumlet, FrameRate, Livid, Bunny Stream, and Streamable
151
154
  - [shaka-video](./reference/components/shaka-video.md): Video element powered by Shaka Player for DASH, HLS, and progressive playback with DRM
155
+ - [soundcloud-audio](./reference/components/soundcloud-audio.md): Audio component that plays SoundCloud tracks and sets through the SoundCloud Widget
152
156
  - [spotify-audio](./reference/components/spotify-audio.md): Audio component that plays Spotify tracks, episodes, playlists, and shows through the Spotify embed
153
157
  - [tiktok-video](./reference/components/tiktok-video.md): Video component that plays TikTok videos through the TikTok embed player
154
158
  - [twitch-video](./reference/components/twitch-video.md): Video component that plays Twitch videos and live channels through the Twitch embed player
@@ -161,6 +165,7 @@ API reference for media components that handle streaming protocols and playback.
161
165
 
162
166
  API reference for extensions that connect external services to the player.
163
167
 
168
+ - [google-analytics](./reference/components/google-analytics.md): Options for the Google Analytics 4 extension that tracks video engagement and playback events
164
169
  - [google-cast](./reference/components/google-cast.md): Options for the Google Cast extension that configures the receiver and load request
165
170
  - [mux-data](./reference/components/mux-data.md): Options for the Mux Data extension that monitors playback quality
166
171