@videojs/html 10.1.0 → 10.2.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 (229) hide show
  1. package/dist/default/define/audio/compat-skin.css +44 -60
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +2 -11
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +35 -52
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +0 -1
  8. package/dist/default/define/audio/skin2.js +1 -1
  9. package/dist/default/define/live-audio/compat-skin.css +44 -60
  10. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  11. package/dist/default/define/live-audio/neutral-skin.css +0 -1
  12. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  13. package/dist/default/define/live-audio/scaffold-skin.css +35 -52
  14. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  15. package/dist/default/define/live-audio/skin.css +0 -1
  16. package/dist/default/define/live-audio/skin2.js +1 -1
  17. package/dist/default/define/live-video/compat-skin.css +8 -8
  18. package/dist/default/define/live-video/compat-skin2.js +1 -1
  19. package/dist/default/define/live-video/scaffold-skin.css +12 -13
  20. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  21. package/dist/default/define/video/compat-skin.css +8 -8
  22. package/dist/default/define/video/compat-skin2.js +1 -1
  23. package/dist/default/define/video/neutral-skin.css +2 -10
  24. package/dist/default/define/video/neutral-skin2.js +1 -1
  25. package/dist/default/define/video/scaffold-skin.css +12 -13
  26. package/dist/default/define/video/scaffold-skin2.js +1 -1
  27. package/dist/default/extensions/mux-data/extension.js +1 -1
  28. package/dist/default/internal/skins/compat-audio/register.js +0 -10
  29. package/dist/default/internal/skins/compat-audio/skin.css +44 -60
  30. package/dist/default/internal/skins/compat-audio/template.js +14 -38
  31. package/dist/default/internal/skins/compat-live-audio/register.js +0 -10
  32. package/dist/default/internal/skins/compat-live-audio/skin.css +44 -60
  33. package/dist/default/internal/skins/compat-live-audio/template.js +2 -26
  34. package/dist/default/internal/skins/compat-live-video/skin.css +8 -8
  35. package/dist/default/internal/skins/compat-video/skin.css +8 -8
  36. package/dist/default/internal/skins/default-audio/skin.css +0 -1
  37. package/dist/default/internal/skins/default-live-audio/skin.css +0 -1
  38. package/dist/default/internal/skins/neutral-audio/skin.css +2 -11
  39. package/dist/default/internal/skins/neutral-audio/template.js +1 -1
  40. package/dist/default/internal/skins/neutral-live-audio/skin.css +0 -1
  41. package/dist/default/internal/skins/neutral-video/skin.css +2 -10
  42. package/dist/default/internal/skins/neutral-video/template.js +1 -1
  43. package/dist/default/internal/skins/scaffold-audio/register.js +0 -10
  44. package/dist/default/internal/skins/scaffold-audio/skin.css +35 -52
  45. package/dist/default/internal/skins/scaffold-audio/template.js +14 -38
  46. package/dist/default/internal/skins/scaffold-live-audio/register.js +0 -10
  47. package/dist/default/internal/skins/scaffold-live-audio/skin.css +35 -52
  48. package/dist/default/internal/skins/scaffold-live-audio/template.js +2 -26
  49. package/dist/default/internal/skins/scaffold-live-video/skin.css +12 -13
  50. package/dist/default/internal/skins/scaffold-video/skin.css +12 -13
  51. package/dist/default/media/hls-audio/adapter.js +1 -1
  52. package/dist/default/media/hls-background-video/adapter.js +1 -1
  53. package/dist/default/media/hls-video/adapter.js +1 -1
  54. package/dist/default/ui/slider/element.js +3 -1
  55. package/dist/default/ui/time-slider/element.js +19 -7
  56. package/dist/default/ui/volume-slider/element.js +3 -1
  57. package/dist/default/version.js +1 -1
  58. package/dist/dev/define/audio/compat-skin.css +44 -60
  59. package/dist/dev/define/audio/compat-skin2.js +1 -1
  60. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  61. package/dist/dev/define/audio/neutral-skin.css +2 -11
  62. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  63. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  64. package/dist/dev/define/audio/scaffold-skin.css +35 -52
  65. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  66. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  67. package/dist/dev/define/audio/skin.css +0 -1
  68. package/dist/dev/define/audio/skin2.js +1 -1
  69. package/dist/dev/define/audio/skin2.js.map +1 -1
  70. package/dist/dev/define/live-audio/compat-skin.css +44 -60
  71. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  72. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  73. package/dist/dev/define/live-audio/neutral-skin.css +0 -1
  74. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  75. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  76. package/dist/dev/define/live-audio/scaffold-skin.css +35 -52
  77. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  78. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  79. package/dist/dev/define/live-audio/skin.css +0 -1
  80. package/dist/dev/define/live-audio/skin2.js +1 -1
  81. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  82. package/dist/dev/define/live-video/compat-skin.css +8 -8
  83. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  84. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  85. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  86. package/dist/dev/define/live-video/scaffold-skin.css +12 -13
  87. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  88. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  89. package/dist/dev/define/live-video/skin2.js.map +1 -1
  90. package/dist/dev/define/video/compat-skin.css +8 -8
  91. package/dist/dev/define/video/compat-skin2.js +1 -1
  92. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  93. package/dist/dev/define/video/neutral-skin.css +2 -10
  94. package/dist/dev/define/video/neutral-skin2.js +1 -1
  95. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  96. package/dist/dev/define/video/scaffold-skin.css +12 -13
  97. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  98. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  99. package/dist/dev/extensions/mux-data/extension.d.ts +1 -1
  100. package/dist/dev/extensions/mux-data/extension.js +1 -1
  101. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  102. package/dist/dev/internal/skins/compat-audio/register.d.ts +3 -5
  103. package/dist/dev/internal/skins/compat-audio/register.js +0 -10
  104. package/dist/dev/internal/skins/compat-audio/register.js.map +1 -1
  105. package/dist/dev/internal/skins/compat-audio/skin.css +44 -60
  106. package/dist/dev/internal/skins/compat-audio/template.js +14 -38
  107. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  108. package/dist/dev/internal/skins/compat-live-audio/register.d.ts +0 -2
  109. package/dist/dev/internal/skins/compat-live-audio/register.js +0 -10
  110. package/dist/dev/internal/skins/compat-live-audio/register.js.map +1 -1
  111. package/dist/dev/internal/skins/compat-live-audio/skin.css +44 -60
  112. package/dist/dev/internal/skins/compat-live-audio/template.js +2 -26
  113. package/dist/dev/internal/skins/compat-live-audio/template.js.map +1 -1
  114. package/dist/dev/internal/skins/compat-live-video/register.d.ts +2 -2
  115. package/dist/dev/internal/skins/compat-live-video/skin.css +8 -8
  116. package/dist/dev/internal/skins/compat-video/register.d.ts +5 -5
  117. package/dist/dev/internal/skins/compat-video/skin.css +8 -8
  118. package/dist/dev/internal/skins/default-audio/register.d.ts +1 -1
  119. package/dist/dev/internal/skins/default-audio/skin.css +0 -1
  120. package/dist/dev/internal/skins/default-live-audio/skin.css +0 -1
  121. package/dist/dev/internal/skins/default-live-video/register.d.ts +2 -2
  122. package/dist/dev/internal/skins/default-video/register.d.ts +3 -3
  123. package/dist/dev/internal/skins/neutral-audio/register.d.ts +3 -3
  124. package/dist/dev/internal/skins/neutral-audio/skin.css +2 -11
  125. package/dist/dev/internal/skins/neutral-audio/template.js +1 -1
  126. package/dist/dev/internal/skins/neutral-audio/template.js.map +1 -1
  127. package/dist/dev/internal/skins/neutral-live-audio/skin.css +0 -1
  128. package/dist/dev/internal/skins/neutral-live-video/register.d.ts +2 -2
  129. package/dist/dev/internal/skins/neutral-video/register.d.ts +5 -5
  130. package/dist/dev/internal/skins/neutral-video/skin.css +2 -10
  131. package/dist/dev/internal/skins/neutral-video/template.js +1 -1
  132. package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
  133. package/dist/dev/internal/skins/scaffold-audio/register.d.ts +3 -5
  134. package/dist/dev/internal/skins/scaffold-audio/register.js +0 -10
  135. package/dist/dev/internal/skins/scaffold-audio/register.js.map +1 -1
  136. package/dist/dev/internal/skins/scaffold-audio/skin.css +35 -52
  137. package/dist/dev/internal/skins/scaffold-audio/template.js +14 -38
  138. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -1
  139. package/dist/dev/internal/skins/scaffold-live-audio/register.d.ts +0 -2
  140. package/dist/dev/internal/skins/scaffold-live-audio/register.js +0 -10
  141. package/dist/dev/internal/skins/scaffold-live-audio/register.js.map +1 -1
  142. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +35 -52
  143. package/dist/dev/internal/skins/scaffold-live-audio/template.js +2 -26
  144. package/dist/dev/internal/skins/scaffold-live-audio/template.js.map +1 -1
  145. package/dist/dev/internal/skins/scaffold-live-video/register.d.ts +2 -2
  146. package/dist/dev/internal/skins/scaffold-live-video/skin.css +12 -13
  147. package/dist/dev/internal/skins/scaffold-video/register.d.ts +5 -5
  148. package/dist/dev/internal/skins/scaffold-video/skin.css +12 -13
  149. package/dist/dev/media/hls-audio/adapter.d.ts +1 -1
  150. package/dist/dev/media/hls-audio/adapter.js +1 -1
  151. package/dist/dev/media/hls-audio/adapter.js.map +1 -1
  152. package/dist/dev/media/hls-background-video/adapter.d.ts +1 -1
  153. package/dist/dev/media/hls-background-video/adapter.js +1 -1
  154. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  155. package/dist/dev/media/hls-video/adapter.d.ts +1 -1
  156. package/dist/dev/media/hls-video/adapter.js +1 -1
  157. package/dist/dev/media/hls-video/adapter.js.map +1 -1
  158. package/dist/dev/ui/slider/element.js +3 -1
  159. package/dist/dev/ui/slider/element.js.map +1 -1
  160. package/dist/dev/ui/time-slider/element.js +19 -7
  161. package/dist/dev/ui/time-slider/element.js.map +1 -1
  162. package/dist/dev/ui/volume-slider/element.js +3 -1
  163. package/dist/dev/ui/volume-slider/element.js.map +1 -1
  164. package/dist/dev/version.js +1 -1
  165. package/docs/README.md +1 -1
  166. package/docs/guides/browser-support.md +11 -11
  167. package/docs/guides/build-your-own-skin.md +381 -0
  168. package/docs/guides/cdn.md +9 -9
  169. package/docs/guides/customize-skins.md +2 -1
  170. package/docs/guides/installation-cdn.md +2 -2
  171. package/docs/guides/installation-shadcn.md +1 -1
  172. package/docs/guides/installation-svelte.md +2 -2
  173. package/docs/guides/installation-vue.md +2 -2
  174. package/docs/guides/installation.md +2 -2
  175. package/docs/guides/internationalization.md +5 -5
  176. package/docs/guides/llms.txt +2 -1
  177. package/docs/guides/migrate-from-media-chrome.md +4 -4
  178. package/docs/guides/migrate-from-mux-player.md +6 -6
  179. package/docs/guides/migrate-from-plyr.md +7 -7
  180. package/docs/guides/migrate-from-video-js-8.md +7 -7
  181. package/docs/guides/migrate-from-vidstack.md +3 -3
  182. package/docs/guides/self-hosting.md +9 -6
  183. package/docs/guides/skins.md +1 -0
  184. package/docs/llms.txt +3 -2
  185. package/docs/reference/api/llms.txt +1 -1
  186. package/docs/reference/api/preset-audio.md +1 -1
  187. package/docs/reference/api/preset-background.md +1 -1
  188. package/docs/reference/api/preset-live-audio.md +1 -1
  189. package/docs/reference/api/preset-live-video.md +1 -1
  190. package/docs/reference/api/preset-video.md +1 -1
  191. package/docs/reference/components/audio-neutral-skin.md +1 -1
  192. package/docs/reference/components/audio-scaffold-skin.md +1 -1
  193. package/docs/reference/components/audio-skin.md +1 -1
  194. package/docs/reference/components/background-video-skin.md +1 -1
  195. package/docs/reference/components/background-video.md +1 -1
  196. package/docs/reference/components/cloudflare-video.md +1 -1
  197. package/docs/reference/components/dash-video.md +1 -1
  198. package/docs/reference/components/google-cast.md +1 -1
  199. package/docs/reference/components/hls-audio.md +2 -48
  200. package/docs/reference/components/hls-background-video.md +1 -1
  201. package/docs/reference/components/hls-video.md +2 -66
  202. package/docs/reference/components/hlsjs-video.md +1 -1
  203. package/docs/reference/components/live-audio-neutral-skin.md +1 -1
  204. package/docs/reference/components/live-audio-scaffold-skin.md +1 -1
  205. package/docs/reference/components/live-audio-skin.md +1 -1
  206. package/docs/reference/components/live-video-neutral-skin.md +1 -1
  207. package/docs/reference/components/live-video-scaffold-skin.md +1 -1
  208. package/docs/reference/components/live-video-skin.md +1 -1
  209. package/docs/reference/components/llms.txt +1 -1
  210. package/docs/reference/components/mux-audio.md +1 -1
  211. package/docs/reference/components/mux-background-video.md +1 -1
  212. package/docs/reference/components/mux-data.md +4 -2
  213. package/docs/reference/components/mux-video.md +1 -1
  214. package/docs/reference/components/native-hls-video.md +1 -1
  215. package/docs/reference/components/playerjs-video.md +1 -1
  216. package/docs/reference/components/shaka-video.md +1 -1
  217. package/docs/reference/components/slider.md +2 -0
  218. package/docs/reference/components/spotify-audio.md +1 -1
  219. package/docs/reference/components/tiktok-video.md +1 -1
  220. package/docs/reference/components/time-slider.md +7 -5
  221. package/docs/reference/components/twitch-video.md +1 -1
  222. package/docs/reference/components/video-neutral-skin.md +1 -1
  223. package/docs/reference/components/video-scaffold-skin.md +1 -1
  224. package/docs/reference/components/video-skin.md +1 -1
  225. package/docs/reference/components/vimeo-video.md +1 -1
  226. package/docs/reference/components/volume-slider.md +8 -6
  227. package/docs/reference/components/wistia-video.md +1 -1
  228. package/docs/reference/components/youtube-video.md +1 -1
  229. package/package.json +42 -43
@@ -0,0 +1,381 @@
1
+ # Build your own skin
2
+
3
+ Create a skin project, preview it locally, and compose your own player interface from Video.js UI components
4
+
5
+ A skin is the player interface: markup that arranges Video.js UI components inside the player, plus the styles that give it a look. The components handle playback state, keyboard support, and accessibility, so building your own skin is mostly a layout and design job. [Skins](./skins.md) explains how skins fit into Video.js.
6
+
7
+ If a packaged skin is already close to what you want, [Customize skins](./customize-skins.md) is less work.
8
+
9
+ ## Create a skin project
10
+
11
+ The quickest way to start is a standalone skin project:
12
+
13
+ **npm**
14
+
15
+ ```bash
16
+ npx @videojs/cli skin create
17
+ ```
18
+
19
+ **pnpm**
20
+
21
+ ```bash
22
+ pnpm dlx @videojs/cli skin create
23
+ ```
24
+
25
+ **yarn**
26
+
27
+ ```bash
28
+ npx @videojs/cli skin create --package-manager yarn
29
+ ```
30
+
31
+ **bun**
32
+
33
+ ```bash
34
+ bunx @videojs/cli skin create
35
+ ```
36
+
37
+ The command asks for a name, a framework (React or HTML), a styling approach (Tailwind or CSS), a starting skin, and a preset (video, audio, live video, or live audio). The starting skin defaults to [Scaffold](../reference/components/video-scaffold-skin.md): every control wired up, with minimal styling and no transitions, so there’s little to undo.
38
+
39
+ The project goes in a folder named after the skin, so a skin called “My Skin” goes in `my-skin`. Open it and start the preview:
40
+
41
+ **npm**
42
+
43
+ ```bash
44
+ cd my-skin
45
+ npm run dev
46
+ ```
47
+
48
+ **pnpm**
49
+
50
+ ```bash
51
+ cd my-skin
52
+ pnpm dev
53
+ ```
54
+
55
+ **yarn**
56
+
57
+ ```bash
58
+ cd my-skin
59
+ yarn dev
60
+ ```
61
+
62
+ **bun**
63
+
64
+ ```bash
65
+ cd my-skin
66
+ bun dev
67
+ ```
68
+
69
+ The project has two parts:
70
+
71
+ - **`src/`** holds the skin and nothing else. Edit it however you like, including its markup, class names, theme tokens, and stylesheets.
72
+ - **`apps/preview/`** is a workbench that plays your skin. Use it to try different player sizes and aspect ratios, light and dark color schemes, right-to-left text, every built-in language, and playback settings such as autoplay and loop.
73
+
74
+ When you want to share it, deploy the workbench to Vercel, Netlify, or Cloudflare Pages:
75
+
76
+ **npm**
77
+
78
+ ```bash
79
+ npm run deploy
80
+ ```
81
+
82
+ **pnpm**
83
+
84
+ ```bash
85
+ pnpm run deploy
86
+ ```
87
+
88
+ **yarn**
89
+
90
+ ```bash
91
+ yarn run deploy
92
+ ```
93
+
94
+ **bun**
95
+
96
+ ```bash
97
+ bun run deploy
98
+ ```
99
+
100
+ Add the host’s name to skip the question, as in `npm run deploy vercel`. With pnpm, keep the `run`, since `pnpm deploy` is a built-in pnpm command. When the skin is done, move `src/` into your app.
101
+
102
+ ### Build it with a coding agent
103
+
104
+ If you work with a coding agent, such as Claude Code, Codex, or Cursor, it can do all of this for you. Install the Video.js skills, which include a skill for building skins:
105
+
106
+ ```bash
107
+ npx @videojs/cli agents skills
108
+ ```
109
+
110
+ Then ask your agent something like “Help me design my own Video.js skin for our podcast player.” It asks for the same choices as the command, creates the project, starts the workbench, and agrees a design with you before styling. It can also match an existing player’s look from a screenshot or a link, then checks its work against the reference and for accessibility before handing back. [Build with AI](./build-with-ai.md) covers installing the skills in each agent.
111
+
112
+ ## Other starting points
113
+
114
+ - **Inside an existing app.** Add a skin’s source with [Install with Shadcn](./installation-shadcn.md) and pick **Scaffold** as the skin.
115
+ - **From nothing.** Put a [Container](../reference/components/player-container.md) inside your player and add the components you want, as in the example below.
116
+
117
+ No path requires Scaffold’s structure, its theme tokens, or any particular CSS approach.
118
+
119
+ ## A minimal skin
120
+
121
+ This example shows how a skin fits together without Scaffold’s extra parts. It has a play button, a timeline, the current time, mute, fullscreen, keyboard shortcuts, screen reader announcements, and an error dialog. The player provides state, the Container is the skin’s root, and the media element goes inside the Container next to the controls.
122
+
123
+ **index.html**
124
+
125
+ ```html
126
+ <script type="module">
127
+ import '@videojs/html/video/player';
128
+ import '@videojs/html/ui/container';
129
+ import '@videojs/html/ui/controls';
130
+ import '@videojs/html/ui/controls-content';
131
+ import '@videojs/html/ui/controls-group';
132
+ import '@videojs/html/ui/play-button';
133
+ import '@videojs/html/ui/time-slider';
134
+ import '@videojs/html/ui/slider-track';
135
+ import '@videojs/html/ui/slider-buffer';
136
+ import '@videojs/html/ui/slider-fill';
137
+ import '@videojs/html/ui/slider-thumb';
138
+ import '@videojs/html/ui/time';
139
+ import '@videojs/html/ui/mute-button';
140
+ import '@videojs/html/ui/fullscreen-button';
141
+ import '@videojs/html/ui/hotkey';
142
+ import '@videojs/html/ui/status-announcer';
143
+ import '@videojs/html/ui/error-dialog';
144
+ import '@videojs/html/ui/dialog-popup';
145
+ import '@videojs/html/ui/dialog-title';
146
+ import '@videojs/html/ui/dialog-description';
147
+ import '@videojs/html/ui/dialog-close';
148
+ </script>
149
+
150
+ <video-player>
151
+ <media-container class="video-skin">
152
+ <video src="video.mp4" playsinline></video>
153
+
154
+ <media-controls>
155
+ <media-controls-content class="video-skin-controls">
156
+ <media-time-slider class="video-skin-time-slider">
157
+ <media-slider-track class="video-skin-track">
158
+ <media-slider-buffer class="video-skin-buffer"></media-slider-buffer>
159
+ <media-slider-fill class="video-skin-fill"></media-slider-fill>
160
+ </media-slider-track>
161
+ <media-slider-thumb class="video-skin-thumb"></media-slider-thumb>
162
+ </media-time-slider>
163
+
164
+ <media-controls-group class="video-skin-controls-group" aria-label="Playback controls">
165
+ <media-play-button class="video-skin-play">
166
+ <span class="show-when-paused">Play</span>
167
+ <span class="show-when-playing">Pause</span>
168
+ </media-play-button>
169
+ <media-time type="current"></media-time>
170
+ <media-mute-button class="video-skin-mute">
171
+ <span class="show-when-muted">Unmute</span>
172
+ <span class="show-when-unmuted">Mute</span>
173
+ </media-mute-button>
174
+ <media-fullscreen-button class="video-skin-fullscreen">
175
+ <span class="show-when-fullscreen">Exit fullscreen</span>
176
+ <span class="show-when-not-fullscreen">Fullscreen</span>
177
+ </media-fullscreen-button>
178
+ </media-controls-group>
179
+ </media-controls-content>
180
+ </media-controls>
181
+
182
+ <media-hotkey keys="Space" action="togglePaused"></media-hotkey>
183
+ <media-hotkey keys="m" action="toggleMuted"></media-hotkey>
184
+ <media-hotkey keys="f" action="toggleFullscreen"></media-hotkey>
185
+ <media-hotkey keys="ArrowLeft" action="seekStep" value="-5"></media-hotkey>
186
+ <media-hotkey keys="ArrowRight" action="seekStep" value="5"></media-hotkey>
187
+
188
+ <media-status-announcer></media-status-announcer>
189
+
190
+ <media-error-dialog>
191
+ <media-dialog-popup class="video-skin-error">
192
+ <media-dialog-title></media-dialog-title>
193
+ <media-dialog-description></media-dialog-description>
194
+ <media-dialog-close></media-dialog-close>
195
+ </media-dialog-popup>
196
+ </media-error-dialog>
197
+ </media-container>
198
+ </video-player>
199
+ ```
200
+
201
+ The `@videojs/html/video/player` import registers `<video-player>` with the video features, which hold the state these controls need. Some controls, such as Cast or Quality, depend on features that not every preset includes. Each control’s reference page names the feature it needs.
202
+
203
+ This CSS places the controls over the video, hides them when the viewer is idle, draws the timeline, and keeps the error dialog hidden until playback fails:
204
+
205
+ **video-skin.css**
206
+
207
+ ```css
208
+ .video-skin {
209
+ position: relative;
210
+ display: block;
211
+ }
212
+
213
+ .video-skin video {
214
+ display: block;
215
+ width: 100%;
216
+ }
217
+
218
+ .video-skin-controls {
219
+ position: absolute;
220
+ inset: auto 0 0;
221
+ padding: 12px;
222
+ background: linear-gradient(to top, rgb(0 0 0 / 0.7), transparent);
223
+ color: white;
224
+ transition: opacity 0.25s;
225
+ }
226
+
227
+ /* Keep controls visible while something inside them has keyboard focus. */
228
+ .video-skin-controls:not([data-visible]):not(:has(:focus-visible)) {
229
+ opacity: 0;
230
+ }
231
+
232
+ .video-skin-controls-group {
233
+ display: flex;
234
+ gap: 8px;
235
+ align-items: center;
236
+ }
237
+
238
+ /* The slider sets its progress as CSS custom properties. */
239
+ .video-skin-time-slider {
240
+ position: relative;
241
+ display: flex;
242
+ align-items: center;
243
+ height: 20px;
244
+ cursor: pointer;
245
+ }
246
+
247
+ .video-skin-track {
248
+ position: relative;
249
+ width: 100%;
250
+ height: 4px;
251
+ background: rgb(255 255 255 / 0.3);
252
+ border-radius: 9999px;
253
+ }
254
+
255
+ .video-skin-buffer,
256
+ .video-skin-fill {
257
+ position: absolute;
258
+ top: 0;
259
+ bottom: 0;
260
+ left: 0;
261
+ border-radius: inherit;
262
+ }
263
+
264
+ .video-skin-buffer {
265
+ width: var(--media-slider-buffer);
266
+ background: rgb(255 255 255 / 0.4);
267
+ }
268
+
269
+ .video-skin-fill {
270
+ width: var(--media-slider-fill);
271
+ background: white;
272
+ }
273
+
274
+ .video-skin-thumb {
275
+ position: absolute;
276
+ left: var(--media-slider-fill);
277
+ width: 12px;
278
+ height: 12px;
279
+ background: white;
280
+ border-radius: 50%;
281
+ translate: -50% 0;
282
+ }
283
+
284
+ .video-skin-error {
285
+ position: absolute;
286
+ inset: 0;
287
+ display: grid;
288
+ gap: 12px;
289
+ place-content: center;
290
+ padding: 24px;
291
+ background: rgb(0 0 0 / 0.85);
292
+ color: white;
293
+ text-align: center;
294
+ }
295
+
296
+ .video-skin-error:not([data-open]) {
297
+ display: none;
298
+ }
299
+ ```
300
+
301
+ Each button in the HTML example holds a label for every state. Show only the one that matches:
302
+
303
+ **video-skin.css**
304
+
305
+ ```css
306
+ .video-skin-play:not([data-paused]) .show-when-paused,
307
+ .video-skin-play[data-paused] .show-when-playing,
308
+ .video-skin-mute:not([data-muted]) .show-when-muted,
309
+ .video-skin-mute[data-muted] .show-when-unmuted,
310
+ .video-skin-fullscreen:not([data-fullscreen]) .show-when-fullscreen,
311
+ .video-skin-fullscreen[data-fullscreen] .show-when-not-fullscreen {
312
+ display: none;
313
+ }
314
+ ```
315
+
316
+ From here, add the components your design needs.
317
+
318
+ ## Pick the components
319
+
320
+ Each skin is made of the same building blocks. Use the ones your design needs; their reference pages cover props, state, data attributes, and examples.
321
+
322
+ | Purpose | Components |
323
+ | --- | --- |
324
+ | Player surface, fullscreen and activity target | [Container](../reference/components/player-container.md) |
325
+ | Show and hide controls with user activity | [Controls](../reference/components/controls.md) |
326
+ | Playback buttons | [Play button](../reference/components/play-button.md), [Seek button](../reference/components/seek-button.md), [Mute button](../reference/components/mute-button.md), [Playback rate button](../reference/components/playback-rate-button.md), [Live button](../reference/components/live-button.md) |
327
+ | Screen and device buttons | [Fullscreen button](../reference/components/fullscreen-button.md), [Picture-in-picture button](../reference/components/pip-button.md), [AirPlay button](../reference/components/airplay-button.md), [Cast button](../reference/components/cast-button.md), [Captions button](../reference/components/captions-button.md) |
328
+ | Timeline and volume | [Time slider](../reference/components/time-slider.md), [Volume slider](../reference/components/volume-slider.md), [Volume popover](../reference/components/volume-popover.md), [Thumbnail](../reference/components/thumbnail.md), [Time](../reference/components/time.md) |
329
+ | Menus and popups | [Menu](../reference/components/menu.md), [Popover](../reference/components/popover.md), [Tooltip](../reference/components/tooltip.md), and the radio groups for [captions](../reference/components/captions-radio-group.md), [quality](../reference/components/quality-radio-group.md), [playback rate](../reference/components/playback-rate-radio-group.md), and [audio tracks](../reference/components/audio-track-radio-group.md) |
330
+ | Media details and loading | [Title](../reference/components/title.md), [Poster](../reference/components/poster.md), [Buffering indicator](../reference/components/buffering-indicator.md) |
331
+ | Feedback after an action | [Seek indicator](../reference/components/seek-indicator.md), [Volume indicator](../reference/components/volume-indicator.md), [Status indicator](../reference/components/status-indicator.md) |
332
+ | Errors | [Error dialog](../reference/components/error-dialog.md) |
333
+ | Keyboard, gestures, and announcements | [Hotkey](../reference/components/hotkey.md), [Gesture](../reference/components/gesture.md), [Status announcer](../reference/components/status-announcer.md) |
334
+ | Icons | [Icons](../reference/components/icons.md) |
335
+
336
+ Some of these are easy to leave out by accident because they have little or no visible UI. Include the error dialog, keyboard shortcuts, and status announcer unless you replace them with your own.
337
+
338
+ Import the registration for every element you use, including the parts of compound components. Each reference page lists its imports.
339
+
340
+ To build a control Video.js doesn’t provide, follow [Build your own UI component](./build-your-own-component.md).
341
+
342
+ ## Style it your way
343
+
344
+ The components bring no visual styles. You add the icons, text, and CSS. They describe their state with `data-*` attributes, such as `data-paused` on the play button, so you can style them with plain CSS, Tailwind, or anything else. [UI components](./ui-components.md) explains how. [Automatically show and hide controls](./controls.md) covers the controls’ visibility states.
345
+
346
+ Lay out controls in source order that matches their visual order, so keyboard focus follows the layout.
347
+
348
+ A player’s controls sit over a moving picture, in a frame whose size you don’t control, so a few design questions come up in every skin:
349
+
350
+ - **Surfaces over video.** Borders, shadows, and translucent backgrounds look different over every frame. [Shapes and surfaces](https://videojs.org/blog/videojs-v10-skin-design#shapes-and-surfaces) and [Letting the content influence the color](https://videojs.org/blog/videojs-v10-skin-design#letting-the-content-influence-the-color) cover how our skins handle them.
351
+ - **Readable controls.** Seek tracks need a visible target, icons need optical alignment, and time displays need fixed-width digits. See [Controls and typography](https://videojs.org/blog/videojs-v10-skin-design#controls-and-typography).
352
+ - **Motion.** Menus should open from the control that opened them and respond when they’re closed mid-transition. See [Motion and transitions](https://videojs.org/blog/videojs-v10-skin-design#motion-and-transitions).
353
+ - **Small players.** Captions, settings, picture-in-picture, and Cast all compete for space at narrow widths. See [Fitting the available space](https://videojs.org/blog/videojs-v10-skin-design#fitting-the-available-space).
354
+ - **Custom colors.** An accent color someone else picks still needs contrast against its text and the video. See [Customization and contrast](https://videojs.org/blog/videojs-v10-skin-design#customization-and-contrast).
355
+
356
+ [Design inspiration behind the Video.js v10 skins](https://videojs.org/blog/videojs-v10-skin-design) covers the thinking behind our own skins in full.
357
+
358
+ ## Support the public CSS properties
359
+
360
+ If the skin is only for your own site, you can skip this.
361
+
362
+ If you want to offer it as a Video.js skin, support the same CSS custom properties as the packaged skins, such as `--media-accent-color` and `--media-border-radius`. People can then restyle your skin the same way they restyle ours. [Set the skin’s styles](./customize-skins.md#set-the-skins-styles) lists them. We’re still working out how to accept community skins into Video.js.
363
+
364
+ ## Test it
365
+
366
+ Check the finished skin with real media, at the narrowest player size you support:
367
+
368
+ - Play, pause, seek, change volume, open every menu, and enter fullscreen.
369
+ - Use only a keyboard, then only touch. Focus stays visible and follows the layout, and controls hide when idle.
370
+ - Check loading, errors, ended playback, captions, and controls the browser doesn’t support.
371
+ - Check text and icon contrast over bright and dark footage, with forced colors, and with reduced motion.
372
+
373
+ [Accessibility](./accessibility.md) covers these checks in more detail.
374
+
375
+ ## Related pages
376
+
377
+ ### Guides
378
+
379
+ - [Skins](./skins.md): Packaged player designs that include both UI components and their styles.
380
+ - [Customize skins](./customize-skins.md): Style a packaged Video.js skin or add its source to change controls, layout, styles, and interactions
381
+ - [Build your own UI component](./build-your-own-component.md): Create custom player controls that read state, dispatch actions, and stay accessible.
@@ -36,8 +36,8 @@ A skin bundle registers every UI element its skin is built from. Any element the
36
36
  Each [UI element](./ui-components.md) is its own bundle under `ui/`, for markup that a skin bundle does not already cover: a player-only bundle, [skin source](./customize-skins.md#style-skin-source) that adds a component the packaged skin lacks, or a [dialog](../reference/components/dialog.md) your page opens beside a packaged skin.
37
37
 
38
38
  ```html
39
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video-player.js"></script>
40
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/ui/play-button.js"></script>
39
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video-player.js"></script>
40
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/play-button.js"></script>
41
41
  ```
42
42
 
43
43
  Each path mirrors its npm subpath: `ui/play-button.js` registers the element that `@videojs/html/ui/play-button` does. Compound components list one bundle per part in their reference page’s Import section, and all of the bundles share chunks with the player.
@@ -47,8 +47,8 @@ Each path mirrors its npm subpath: `ui/play-button.js` registers the element tha
47
47
  The default presets play through the browser’s own `<video>` and `<audio>`. Every other [media component](./media-sources.md) is its own bundle under `media/`, loaded beside the player bundle:
48
48
 
49
49
  ```html
50
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video.js"></script>
51
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/media/hlsjs-video.js"></script>
50
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
51
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/hlsjs-video.js"></script>
52
52
  ```
53
53
 
54
54
  Each path mirrors its npm subpath. Elements with more than one playback engine keep the extra flavors in a directory named for the element, such as `media/mux-video/spf.js`. Load one flavor per page: every flavor claims the same tag name, and the first registration wins.
@@ -58,9 +58,9 @@ Each path mirrors its npm subpath. Elements with more than one playback engine k
58
58
  Each [extension](./architecture.md) is its own bundle under `extensions/`, loaded beside the player and media bundles:
59
59
 
60
60
  ```html
61
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video.js"></script>
62
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/media/mux-video.js"></script>
63
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/extensions/mux-data.js"></script>
61
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
62
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/media/mux-video.js"></script>
63
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/extensions/mux-data.js"></script>
64
64
  ```
65
65
 
66
66
  As with media, each path mirrors its npm subpath: `extensions/mux-data.js` registers the element that `@videojs/html/extensions/mux-data` does.
@@ -70,8 +70,8 @@ As with media, each path mirrors its npm subpath: `extensions/mux-data.js` regis
70
70
  English ships inside the skin bundles. Each other locale is a bundle under `locales/` that registers its translations on import. Load it before the player script to avoid a flash of English:
71
71
 
72
72
  ```html
73
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/locales/es.js"></script>
74
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video.js"></script>
73
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/locales/es.js"></script>
74
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
75
75
  ```
76
76
 
77
77
  One bundle exists per locale pack, plus bare-language aliases such as `pt`. For custom strings, see [Internationalize the player](./internationalization.md).
@@ -127,7 +127,7 @@ Installed files belong to your project, so an update replaces your local copy. C
127
127
  npx shadcn@latest add @videojs/video --overwrite
128
128
  ```
129
129
 
130
- To understand how skins fit into Video.js, read [Skins](./skins.md). To create a control instead of editing one, follow [Build your own component](./build-your-own-component.md).
130
+ To understand how skins fit into Video.js, read [Skins](./skins.md). To design a new interface from a minimal starting point, follow [Build your own skin](./build-your-own-skin.md). To create a control instead of editing one, follow [Build your own component](./build-your-own-component.md).
131
131
 
132
132
  ## Related pages
133
133
 
@@ -138,4 +138,5 @@ To understand how skins fit into Video.js, read [Skins](./skins.md). To create a
138
138
  ### Guides
139
139
 
140
140
  - [Skins](./skins.md): Packaged player designs that include both UI components and their styles.
141
+ - [Build your own skin](./build-your-own-skin.md): Create a skin project, preview it locally, and compose your own player interface from Video.js UI components
141
142
  - [Build your own UI component](./build-your-own-component.md): Create custom player controls that read state, dispatch actions, and stay accessible.
@@ -89,7 +89,7 @@ Defaulted options: project, preset, skin, source-url, media, extensions, templat
89
89
  ## Reproduce or change these instructions
90
90
 
91
91
  ```sh
92
- npx @videojs/cli@10.1.0 agents init --method cdn --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --template none
92
+ npx @videojs/cli@10.2.0 agents init --method cdn --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --template none
93
93
  ```
94
94
 
95
95
  ## Load Video.js
@@ -101,7 +101,7 @@ Add these module scripts to the page head. Module scripts are deferred, so they
101
101
  _Merge this into the page `<head>`._
102
102
 
103
103
  ```html
104
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video.js"></script>
104
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
105
105
  ```
106
106
 
107
107
  ## Add your player
@@ -94,7 +94,7 @@ Defaulted options: project, preset, skin, source-url, media, extensions, templat
94
94
  ## Reproduce or change these instructions
95
95
 
96
96
  ```sh
97
- npx @videojs/cli@10.1.0 agents init --method shadcn --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite --styling css
97
+ npx @videojs/cli@10.2.0 agents init --method shadcn --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite --styling css
98
98
  ```
99
99
 
100
100
  ## Configure app aliases
@@ -90,13 +90,13 @@ Defaulted options: project, preset, skin, source-url, media, extensions, templat
90
90
  ## Reproduce or change these instructions
91
91
 
92
92
  ```sh
93
- npx @videojs/cli@10.1.0 agents init --method packaged --framework svelte --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
93
+ npx @videojs/cli@10.2.0 agents init --method packaged --framework svelte --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
94
94
  ```
95
95
 
96
96
  ## Install the packages
97
97
 
98
98
  ```bash
99
- pnpm add @videojs/html@10.1.0
99
+ pnpm add @videojs/html@10.2.0
100
100
  ```
101
101
 
102
102
  ## Add your player
@@ -90,13 +90,13 @@ Defaulted options: project, preset, skin, source-url, media, extensions, templat
90
90
  ## Reproduce or change these instructions
91
91
 
92
92
  ```sh
93
- npx @videojs/cli@10.1.0 agents init --method packaged --framework vue --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
93
+ npx @videojs/cli@10.2.0 agents init --method packaged --framework vue --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
94
94
  ```
95
95
 
96
96
  ## Install the packages
97
97
 
98
98
  ```bash
99
- pnpm add @videojs/html@10.1.0
99
+ pnpm add @videojs/html@10.2.0
100
100
  ```
101
101
 
102
102
  ## Register custom elements
@@ -92,13 +92,13 @@ Defaulted options: project, preset, skin, source-url, media, extensions, templat
92
92
  ## Reproduce or change these instructions
93
93
 
94
94
  ```sh
95
- npx @videojs/cli@10.1.0 agents init --method packaged --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
95
+ npx @videojs/cli@10.2.0 agents init --method packaged --framework html --project existing --preset video --skin default --media html5-video --extensions none --source-url https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4 --package-manager pnpm --template vite
96
96
  ```
97
97
 
98
98
  ## Install the packages
99
99
 
100
100
  ```bash
101
- pnpm add @videojs/html@10.1.0
101
+ pnpm add @videojs/html@10.2.0
102
102
  ```
103
103
 
104
104
  ## Add your player
@@ -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.1.0/locales/es.js"></script>
203
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/video.js"></script>
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>
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.1.0/locales/es.js';
212
- import { registerI18n } from 'https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/i18n.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';
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.1.0/video.js"></script>
219
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/video.js"></script>
220
220
  ```
221
221
 
222
222
  ### Switch locale at runtime
@@ -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.1.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.2.0. Links are relative paths to files in this directory.
4
4
 
5
5
  ## Getting Started
6
6
 
@@ -14,6 +14,7 @@ Install Video.js, customize a skin, understand its main pieces, check browser an
14
14
  - [Build your own UI component](./build-your-own-component.md): Create custom player controls that read state, dispatch actions, and stay accessible.
15
15
  - [Architecture](./architecture.md): How Video.js players are structured — state, UI, media, and extensions
16
16
  - [Customize skins](./customize-skins.md): Style a packaged Video.js skin or add its source to change controls, layout, styles, and interactions
17
+ - [Build your own skin](./build-your-own-skin.md): Create a skin project, preview it locally, and compose your own player interface from Video.js UI components
17
18
  - [Why Video.js?](./why-videojs.md): The open-source video player for React and HTML. Lightweight, accessible components built for performance and streaming.
18
19
  - [Browser support](./browser-support.md): Browsers and rendering environments supported by Video.js 10, and how the packaged skins reach them
19
20
  - [Build with AI](./build-with-ai.md): Install the Video.js skill and give AI coding agents version-matched docs for building and migrating players
@@ -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.1.0/video.js"></script>
49
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.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.1.0/ui/seek-button.js`
55
- - `media-playback-rate-button`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/ui/playback-rate-button.js`
56
- - `media-thumbnail`: `https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/ui/thumbnail.js`
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`
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.1.0/video.js"></script>
72
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/media/mux-video.js"></script>
73
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/extensions/mux-data.js"></script>
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>
74
74
 
75
75
  <video-player content-title="Test VOD">
76
76
  <video-skin style="aspect-ratio: 16 / 9">
@@ -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.1.0/live-video.js"></script>
425
- <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.1.0/media/mux-video.js"></script>
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>
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.1.0/ui/live-button.js"></script>
455
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.2.0/ui/live-button.js"></script>
456
456
 
457
457
  <media-live-button class="station-live-button">On air</media-live-button>
458
458
  ```