@videojs/html 10.2.0 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/dist/default/define/audio/compat-skin.css +161 -41
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +73 -34
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +166 -42
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +72 -34
  8. package/dist/default/define/audio/skin2.js +1 -1
  9. package/dist/default/define/extensions/google-analytics.js +6 -0
  10. package/dist/default/define/live-audio/compat-skin.css +143 -41
  11. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  12. package/dist/default/define/live-audio/neutral-skin.css +56 -31
  13. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  14. package/dist/default/define/live-audio/scaffold-skin.css +148 -42
  15. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  16. package/dist/default/define/live-audio/skin.css +55 -31
  17. package/dist/default/define/live-audio/skin2.js +1 -1
  18. package/dist/default/define/live-video/compat-skin.css +234 -51
  19. package/dist/default/define/live-video/compat-skin2.js +1 -1
  20. package/dist/default/define/live-video/neutral-skin.css +300 -46
  21. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  22. package/dist/default/define/live-video/scaffold-skin.css +231 -53
  23. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  24. package/dist/default/define/live-video/skin.css +314 -49
  25. package/dist/default/define/live-video/skin2.js +1 -1
  26. package/dist/default/define/media/dailymotion-video.js +11 -0
  27. package/dist/default/define/media/mixcloud-audio.js +11 -0
  28. package/dist/default/define/media/soundcloud-audio.js +11 -0
  29. package/dist/default/define/ui/time-slider-markers.js +5 -0
  30. package/dist/default/define/video/compat-skin.css +242 -51
  31. package/dist/default/define/video/compat-skin2.js +1 -1
  32. package/dist/default/define/video/neutral-skin.css +382 -57
  33. package/dist/default/define/video/neutral-skin2.js +1 -1
  34. package/dist/default/define/video/scaffold-skin.css +240 -53
  35. package/dist/default/define/video/scaffold-skin2.js +1 -1
  36. package/dist/default/define/video/skin.css +415 -55
  37. package/dist/default/define/video/skin2.js +1 -1
  38. package/dist/default/extensions/google-analytics/extension.js +75 -0
  39. package/dist/default/extensions/mux-data/extension.js +7 -2
  40. package/dist/default/index.js +3 -1
  41. package/dist/default/internal/skins/compat-audio/skin.css +161 -41
  42. package/dist/default/internal/skins/compat-audio/template.js +1 -1
  43. package/dist/default/internal/skins/compat-live-audio/skin.css +143 -41
  44. package/dist/default/internal/skins/compat-live-video/skin.css +234 -51
  45. package/dist/default/internal/skins/compat-live-video/template.js +2 -0
  46. package/dist/default/internal/skins/compat-video/skin.css +242 -51
  47. package/dist/default/internal/skins/compat-video/template.js +2 -0
  48. package/dist/default/internal/skins/default-audio/skin.css +72 -34
  49. package/dist/default/internal/skins/default-live-audio/skin.css +55 -31
  50. package/dist/default/internal/skins/default-live-video/skin.css +314 -49
  51. package/dist/default/internal/skins/default-live-video/template.js +14 -0
  52. package/dist/default/internal/skins/default-video/register.js +3 -0
  53. package/dist/default/internal/skins/default-video/skin.css +415 -55
  54. package/dist/default/internal/skins/default-video/template.js +33 -5
  55. package/dist/default/internal/skins/neutral-audio/skin.css +73 -34
  56. package/dist/default/internal/skins/neutral-live-audio/skin.css +56 -31
  57. package/dist/default/internal/skins/neutral-live-video/skin.css +300 -46
  58. package/dist/default/internal/skins/neutral-live-video/template.js +14 -0
  59. package/dist/default/internal/skins/neutral-video/skin.css +382 -57
  60. package/dist/default/internal/skins/neutral-video/template.js +25 -11
  61. package/dist/default/internal/skins/scaffold-audio/skin.css +166 -42
  62. package/dist/default/internal/skins/scaffold-audio/template.js +1 -1
  63. package/dist/default/internal/skins/scaffold-live-audio/skin.css +148 -42
  64. package/dist/default/internal/skins/scaffold-live-video/skin.css +231 -53
  65. package/dist/default/internal/skins/scaffold-live-video/template.js +2 -0
  66. package/dist/default/internal/skins/scaffold-video/skin.css +240 -53
  67. package/dist/default/internal/skins/scaffold-video/template.js +3 -1
  68. package/dist/default/media/background-video/adapter.js +13 -35
  69. package/dist/default/media/background-video/base.js +95 -0
  70. package/dist/default/media/background-video/template.js +13 -20
  71. package/dist/default/media/dailymotion-video/adapter.js +31 -0
  72. package/dist/default/media/hls-background-video/adapter.js +23 -35
  73. package/dist/default/media/mixcloud-audio/adapter.js +16 -0
  74. package/dist/default/media/soundcloud-audio/adapter.js +16 -0
  75. package/dist/default/player/element.js +1 -5
  76. package/dist/default/presets/background/skin.js +2 -2
  77. package/dist/default/presets/skin.js +4 -3
  78. package/dist/default/ui/captions-radio-group/element.js +14 -1
  79. package/dist/default/ui/controls/element.js +6 -3
  80. package/dist/default/ui/dialog/element.js +13 -1
  81. package/dist/default/ui/gesture/element.js +3 -0
  82. package/dist/default/ui/media-button-element.js +10 -1
  83. package/dist/default/ui/playback-rate-button/element.js +7 -2
  84. package/dist/default/ui/playback-rate-radio-group/element.js +10 -3
  85. package/dist/default/ui/radio-options/controller.js +18 -5
  86. package/dist/default/ui/time-slider/markers.js +160 -0
  87. package/dist/default/version.js +1 -1
  88. package/dist/dev/define/audio/compat-skin.css +161 -41
  89. package/dist/dev/define/audio/compat-skin2.js +1 -1
  90. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  91. package/dist/dev/define/audio/neutral-skin.css +73 -34
  92. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  93. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  94. package/dist/dev/define/audio/scaffold-skin.css +166 -42
  95. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  96. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  97. package/dist/dev/define/audio/skin.css +72 -34
  98. package/dist/dev/define/audio/skin2.js +1 -1
  99. package/dist/dev/define/audio/skin2.js.map +1 -1
  100. package/dist/dev/define/extensions/google-analytics.d.ts +11 -0
  101. package/dist/dev/define/extensions/google-analytics.js +8 -0
  102. package/dist/dev/define/extensions/google-analytics.js.map +1 -0
  103. package/dist/dev/define/live-audio/compat-skin.css +143 -41
  104. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  105. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  106. package/dist/dev/define/live-audio/neutral-skin.css +56 -31
  107. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  108. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  109. package/dist/dev/define/live-audio/scaffold-skin.css +148 -42
  110. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  111. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  112. package/dist/dev/define/live-audio/skin.css +55 -31
  113. package/dist/dev/define/live-audio/skin2.js +1 -1
  114. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  115. package/dist/dev/define/live-video/compat-skin.css +234 -51
  116. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  117. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  118. package/dist/dev/define/live-video/neutral-skin.css +300 -46
  119. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  120. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  121. package/dist/dev/define/live-video/scaffold-skin.css +231 -53
  122. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  123. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  124. package/dist/dev/define/live-video/skin.css +314 -49
  125. package/dist/dev/define/live-video/skin2.js +1 -1
  126. package/dist/dev/define/live-video/skin2.js.map +1 -1
  127. package/dist/dev/define/media/dailymotion-video.d.ts +15 -0
  128. package/dist/dev/define/media/dailymotion-video.js +13 -0
  129. package/dist/dev/define/media/dailymotion-video.js.map +1 -0
  130. package/dist/dev/define/media/mixcloud-audio.d.ts +15 -0
  131. package/dist/dev/define/media/mixcloud-audio.js +13 -0
  132. package/dist/dev/define/media/mixcloud-audio.js.map +1 -0
  133. package/dist/dev/define/media/soundcloud-audio.d.ts +15 -0
  134. package/dist/dev/define/media/soundcloud-audio.js +13 -0
  135. package/dist/dev/define/media/soundcloud-audio.js.map +1 -0
  136. package/dist/dev/define/ui/time-slider-markers.d.ts +8 -0
  137. package/dist/dev/define/ui/time-slider-markers.js +7 -0
  138. package/dist/dev/define/ui/time-slider-markers.js.map +1 -0
  139. package/dist/dev/define/video/compat-skin.css +242 -51
  140. package/dist/dev/define/video/compat-skin2.js +1 -1
  141. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  142. package/dist/dev/define/video/neutral-skin.css +382 -57
  143. package/dist/dev/define/video/neutral-skin2.js +1 -1
  144. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  145. package/dist/dev/define/video/scaffold-skin.css +240 -53
  146. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  147. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  148. package/dist/dev/define/video/skin.css +415 -55
  149. package/dist/dev/define/video/skin2.js +1 -1
  150. package/dist/dev/define/video/skin2.js.map +1 -1
  151. package/dist/dev/extensions/google-analytics/extension.d.ts +52 -0
  152. package/dist/dev/extensions/google-analytics/extension.js +77 -0
  153. package/dist/dev/extensions/google-analytics/extension.js.map +1 -0
  154. package/dist/dev/extensions/google-analytics/index.d.ts +2 -0
  155. package/dist/dev/extensions/mux-data/extension.d.ts +4 -1
  156. package/dist/dev/extensions/mux-data/extension.js +7 -2
  157. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  158. package/dist/dev/index.d.ts +5 -4
  159. package/dist/dev/index.js +3 -1
  160. package/dist/dev/internal/skins/compat-audio/skin.css +161 -41
  161. package/dist/dev/internal/skins/compat-audio/template.js +1 -1
  162. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  163. package/dist/dev/internal/skins/compat-live-audio/skin.css +143 -41
  164. package/dist/dev/internal/skins/compat-live-video/skin.css +234 -51
  165. package/dist/dev/internal/skins/compat-live-video/template.js +2 -0
  166. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -1
  167. package/dist/dev/internal/skins/compat-video/skin.css +242 -51
  168. package/dist/dev/internal/skins/compat-video/template.js +2 -0
  169. package/dist/dev/internal/skins/compat-video/template.js.map +1 -1
  170. package/dist/dev/internal/skins/default-audio/skin.css +72 -34
  171. package/dist/dev/internal/skins/default-live-audio/skin.css +55 -31
  172. package/dist/dev/internal/skins/default-live-video/register.js.map +1 -1
  173. package/dist/dev/internal/skins/default-live-video/skin.css +314 -49
  174. package/dist/dev/internal/skins/default-live-video/template.js +14 -0
  175. package/dist/dev/internal/skins/default-live-video/template.js.map +1 -1
  176. package/dist/dev/internal/skins/default-video/register.d.ts +1 -0
  177. package/dist/dev/internal/skins/default-video/register.js +3 -0
  178. package/dist/dev/internal/skins/default-video/register.js.map +1 -1
  179. package/dist/dev/internal/skins/default-video/skin.css +415 -55
  180. package/dist/dev/internal/skins/default-video/template.js +33 -5
  181. package/dist/dev/internal/skins/default-video/template.js.map +1 -1
  182. package/dist/dev/internal/skins/neutral-audio/skin.css +73 -34
  183. package/dist/dev/internal/skins/neutral-live-audio/skin.css +56 -31
  184. package/dist/dev/internal/skins/neutral-live-video/register.js.map +1 -1
  185. package/dist/dev/internal/skins/neutral-live-video/skin.css +300 -46
  186. package/dist/dev/internal/skins/neutral-live-video/template.js +14 -0
  187. package/dist/dev/internal/skins/neutral-live-video/template.js.map +1 -1
  188. package/dist/dev/internal/skins/neutral-video/register.js.map +1 -1
  189. package/dist/dev/internal/skins/neutral-video/skin.css +382 -57
  190. package/dist/dev/internal/skins/neutral-video/template.js +25 -11
  191. package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
  192. package/dist/dev/internal/skins/scaffold-audio/skin.css +166 -42
  193. package/dist/dev/internal/skins/scaffold-audio/template.js +1 -1
  194. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -1
  195. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +148 -42
  196. package/dist/dev/internal/skins/scaffold-live-video/skin.css +231 -53
  197. package/dist/dev/internal/skins/scaffold-live-video/template.js +2 -0
  198. package/dist/dev/internal/skins/scaffold-live-video/template.js.map +1 -1
  199. package/dist/dev/internal/skins/scaffold-video/skin.css +240 -53
  200. package/dist/dev/internal/skins/scaffold-video/template.js +3 -1
  201. package/dist/dev/internal/skins/scaffold-video/template.js.map +1 -1
  202. package/dist/dev/media/background-video/adapter.d.ts +7 -13
  203. package/dist/dev/media/background-video/adapter.js +13 -35
  204. package/dist/dev/media/background-video/adapter.js.map +1 -1
  205. package/dist/dev/media/background-video/base.d.ts +44 -0
  206. package/dist/dev/media/background-video/base.js +97 -0
  207. package/dist/dev/media/background-video/base.js.map +1 -0
  208. package/dist/dev/media/background-video/template.d.ts +3 -0
  209. package/dist/dev/media/background-video/template.js +13 -20
  210. package/dist/dev/media/background-video/template.js.map +1 -1
  211. package/dist/dev/media/dailymotion-video/adapter.d.ts +17 -0
  212. package/dist/dev/media/dailymotion-video/adapter.js +47 -0
  213. package/dist/dev/media/dailymotion-video/adapter.js.map +1 -0
  214. package/dist/dev/media/dailymotion-video/index.d.ts +2 -0
  215. package/dist/dev/media/hls-background-video/adapter.d.ts +14 -19
  216. package/dist/dev/media/hls-background-video/adapter.js +23 -35
  217. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  218. package/dist/dev/media/mixcloud-audio/adapter.d.ts +11 -0
  219. package/dist/dev/media/mixcloud-audio/adapter.js +52 -0
  220. package/dist/dev/media/mixcloud-audio/adapter.js.map +1 -0
  221. package/dist/dev/media/mixcloud-audio/index.d.ts +2 -0
  222. package/dist/dev/media/soundcloud-audio/adapter.d.ts +11 -0
  223. package/dist/dev/media/soundcloud-audio/adapter.js +53 -0
  224. package/dist/dev/media/soundcloud-audio/adapter.js.map +1 -0
  225. package/dist/dev/media/soundcloud-audio/index.d.ts +2 -0
  226. package/dist/dev/player/element.js +1 -5
  227. package/dist/dev/player/element.js.map +1 -1
  228. package/dist/dev/presets/background/skin.d.ts +2 -1
  229. package/dist/dev/presets/background/skin.js +2 -2
  230. package/dist/dev/presets/background/skin.js.map +1 -1
  231. package/dist/dev/presets/skin.d.ts +4 -3
  232. package/dist/dev/presets/skin.js +4 -3
  233. package/dist/dev/presets/skin.js.map +1 -1
  234. package/dist/dev/ui/captions-button/element.d.ts +2 -0
  235. package/dist/dev/ui/captions-radio-group/element.d.ts +2 -1
  236. package/dist/dev/ui/captions-radio-group/element.js +14 -1
  237. package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
  238. package/dist/dev/ui/controls/element.d.ts +2 -2
  239. package/dist/dev/ui/controls/element.js +6 -3
  240. package/dist/dev/ui/controls/element.js.map +1 -1
  241. package/dist/dev/ui/dialog/element.js +13 -1
  242. package/dist/dev/ui/dialog/element.js.map +1 -1
  243. package/dist/dev/ui/gesture/element.js +3 -0
  244. package/dist/dev/ui/gesture/element.js.map +1 -1
  245. package/dist/dev/ui/media-button-element.d.ts +9 -0
  246. package/dist/dev/ui/media-button-element.js +10 -1
  247. package/dist/dev/ui/media-button-element.js.map +1 -1
  248. package/dist/dev/ui/play-button/element.d.ts +2 -0
  249. package/dist/dev/ui/playback-rate-button/element.d.ts +9 -1
  250. package/dist/dev/ui/playback-rate-button/element.js +7 -2
  251. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  252. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -0
  253. package/dist/dev/ui/playback-rate-radio-group/element.js +10 -3
  254. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  255. package/dist/dev/ui/radio-options/controller.js +18 -5
  256. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  257. package/dist/dev/ui/time-slider/markers.d.ts +48 -0
  258. package/dist/dev/ui/time-slider/markers.js +165 -0
  259. package/dist/dev/ui/time-slider/markers.js.map +1 -0
  260. package/dist/dev/version.js +1 -1
  261. package/docs/README.md +1 -1
  262. package/docs/guides/autoplay.md +2 -2
  263. package/docs/guides/background-video.md +2 -4
  264. package/docs/guides/browser-support.md +23 -15
  265. package/docs/guides/build-your-own-skin.md +3 -1
  266. package/docs/guides/cdn.md +10 -9
  267. package/docs/guides/content-security-policy.md +3 -0
  268. package/docs/guides/customize-skins.md +7 -2
  269. package/docs/guides/features.md +1 -1
  270. package/docs/guides/google-analytics.md +199 -0
  271. package/docs/guides/installation-cdn.md +4 -4
  272. package/docs/guides/installation-shadcn.md +3 -3
  273. package/docs/guides/installation-svelte.md +4 -4
  274. package/docs/guides/installation-vue.md +4 -4
  275. package/docs/guides/installation.md +4 -4
  276. package/docs/guides/internationalization.md +5 -5
  277. package/docs/guides/keyboard-shortcuts.md +11 -1
  278. package/docs/guides/llms.txt +3 -1
  279. package/docs/guides/media-sources.md +3 -0
  280. package/docs/guides/migrate-from-media-chrome.md +4 -4
  281. package/docs/guides/migrate-from-mux-player.md +9 -9
  282. package/docs/guides/migrate-from-plyr.md +8 -8
  283. package/docs/guides/migrate-from-video-js-8.md +8 -9
  284. package/docs/guides/migrate-from-vidstack.md +10 -10
  285. package/docs/guides/mux-data.md +22 -0
  286. package/docs/guides/presets.md +5 -5
  287. package/docs/guides/self-hosting.md +5 -5
  288. package/docs/guides/skins.md +21 -5
  289. package/docs/guides/timed-metadata.md +318 -0
  290. package/docs/guides/ui-components.md +1 -1
  291. package/docs/llms.txt +25 -6
  292. package/docs/reference/api/chapters-track.md +71 -0
  293. package/docs/reference/api/define-text-track.md +113 -0
  294. package/docs/reference/api/feature-playback-rate.md +54 -3
  295. package/docs/reference/api/feature-playback.md +5 -1
  296. package/docs/reference/api/feature-text-cues.md +133 -0
  297. package/docs/reference/api/feature-text-tracks.md +11 -5
  298. package/docs/reference/api/get-active-text-cues.md +69 -0
  299. package/docs/reference/api/get-text-cues.md +69 -0
  300. package/docs/reference/api/get-text-tracks.md +41 -0
  301. package/docs/reference/api/hls-metadata-track.md +48 -0
  302. package/docs/reference/api/html-create-player.md +2 -2
  303. package/docs/reference/api/llms.txt +13 -1
  304. package/docs/reference/api/media-capabilities.md +4 -4
  305. package/docs/reference/api/player-store.md +15 -7
  306. package/docs/reference/api/preset-audio.md +15 -5
  307. package/docs/reference/api/preset-background.md +2 -2
  308. package/docs/reference/api/preset-live-audio.md +15 -5
  309. package/docs/reference/api/preset-live-video.md +14 -5
  310. package/docs/reference/api/preset-video.md +14 -5
  311. package/docs/reference/api/resolve-adapter-type.md +4 -1
  312. package/docs/reference/api/ui-element.md +2 -2
  313. package/docs/reference/components/alert-dialog.md +21 -16
  314. package/docs/reference/components/audio-compat-skin.md +8 -2
  315. package/docs/reference/components/audio-neutral-skin.md +2 -2
  316. package/docs/reference/components/audio-scaffold-skin.md +2 -2
  317. package/docs/reference/components/audio-skin.md +2 -2
  318. package/docs/reference/components/audio-track-radio-group.md +2 -2
  319. package/docs/reference/components/audio.md +19 -1
  320. package/docs/reference/components/background-video-skin.md +1 -1
  321. package/docs/reference/components/background-video.md +26 -11
  322. package/docs/reference/components/buffering-indicator.md +2 -2
  323. package/docs/reference/components/captions-radio-group.md +3 -3
  324. package/docs/reference/components/cloudflare-video.md +1 -1
  325. package/docs/reference/components/controls.md +16 -3
  326. package/docs/reference/components/dailymotion-video.md +192 -0
  327. package/docs/reference/components/dash-video.md +20 -2
  328. package/docs/reference/components/dialog.md +49 -22
  329. package/docs/reference/components/error-dialog.md +13 -10
  330. package/docs/reference/components/gesture.md +2 -2
  331. package/docs/reference/components/google-analytics.md +51 -0
  332. package/docs/reference/components/google-cast.md +1 -1
  333. package/docs/reference/components/hls-audio.md +56 -2
  334. package/docs/reference/components/hls-background-video.md +25 -5
  335. package/docs/reference/components/hls-video.md +99 -7
  336. package/docs/reference/components/hlsjs-video.md +53 -12
  337. package/docs/reference/components/hotkey.md +2 -2
  338. package/docs/reference/components/live-audio-compat-skin.md +8 -2
  339. package/docs/reference/components/live-audio-neutral-skin.md +2 -2
  340. package/docs/reference/components/live-audio-scaffold-skin.md +2 -2
  341. package/docs/reference/components/live-audio-skin.md +2 -2
  342. package/docs/reference/components/live-video-compat-skin.md +12 -2
  343. package/docs/reference/components/live-video-neutral-skin.md +6 -2
  344. package/docs/reference/components/live-video-scaffold-skin.md +6 -2
  345. package/docs/reference/components/live-video-skin.md +6 -2
  346. package/docs/reference/components/llms.txt +10 -5
  347. package/docs/reference/components/mixcloud-audio.md +203 -0
  348. package/docs/reference/components/mux-audio.md +35 -2
  349. package/docs/reference/components/mux-background-video.md +1 -1
  350. package/docs/reference/components/mux-data.md +20 -2
  351. package/docs/reference/components/mux-video.md +18 -2
  352. package/docs/reference/components/native-hls-video.md +32 -2
  353. package/docs/reference/components/play-button.md +7 -5
  354. package/docs/reference/components/playback-rate-button.md +26 -7
  355. package/docs/reference/components/playback-rate-radio-group.md +7 -4
  356. package/docs/reference/components/player.md +3 -3
  357. package/docs/reference/components/playerjs-video.md +2 -2
  358. package/docs/reference/components/quality-radio-group.md +2 -2
  359. package/docs/reference/components/shaka-video.md +2 -2
  360. package/docs/reference/components/soundcloud-audio.md +227 -0
  361. package/docs/reference/components/spotify-audio.md +3 -3
  362. package/docs/reference/components/tiktok-video.md +3 -3
  363. package/docs/reference/components/time-slider-markers.md +194 -0
  364. package/docs/reference/components/time-slider.md +14 -0
  365. package/docs/reference/components/twitch-video.md +2 -3
  366. package/docs/reference/components/video-compat-skin.md +12 -2
  367. package/docs/reference/components/video-neutral-skin.md +6 -2
  368. package/docs/reference/components/video-scaffold-skin.md +6 -2
  369. package/docs/reference/components/video-skin.md +6 -2
  370. package/docs/reference/components/video.md +19 -1
  371. package/docs/reference/components/vimeo-video.md +1 -1
  372. package/docs/reference/components/wistia-video.md +1 -1
  373. package/docs/reference/components/youtube-video.md +1 -1
  374. package/package.json +60 -40
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","names":[],"sources":["../../../../../src/internal/skins/scaffold-video/template.ts"],"sourcesContent":["import { createTemplate } from '@videojs/utils/dom';\n\n/** Static template rendered from the finalized VJSC module graph. */\nexport const template =\n createTemplate(/* html */ `<media-container class=\"media-skin media-container media-video\" data-theme=\"scaffold\" data-preset=\"video\">\n<slot>\n</slot>\n<media-poster class=\"media-poster\">\n<slot name=\"poster\">\n<img alt=\"\" decoding=\"async\" class=\"media-poster-image\">\n</slot>\n</media-poster>\n<media-error-dialog>\n<media-dialog-backdrop class=\"media-dialog-backdrop\">\n</media-dialog-backdrop>\n<media-dialog-popup class=\"media-dialog-popup\">\n<media-dialog-title class=\"media-dialog-title\">\n</media-dialog-title>\n<media-dialog-description class=\"media-dialog-description\">\n</media-dialog-description>\n<media-dialog-close class=\"media-button media-dialog-close\">\n</media-dialog-close>\n</media-dialog-popup>\n</media-error-dialog>\n<media-controls>\n<media-controls-backdrop class=\"video-controls-backdrop\">\n</media-controls-backdrop>\n<media-controls-group class=\"media-buffering-indicator-controls\">\n<media-buffering-indicator class=\"media-buffering-indicator media-buffering-indicator-backdrop\">\n<media-icon family=\"scaffold\" name=\"spinner\" class=\"media-buffering-indicator-spinner-icon\">\n</media-icon>\n</media-buffering-indicator>\n</media-controls-group>\n<media-controls-content class=\"video-controls-content\">\n<media-tooltip-group>\n<media-controls-group class=\"video-controls-top\">\n<media-title class=\"media-title\">\n</media-title>\n<media-airplay-button class=\"media-button media-airplay-button\" id=\"vjs-HNl1fwKe-0-trigger\">\n<media-icon family=\"scaffold\" name=\"airplay-enter\" class=\"media-button-icon media-airplay-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"airplay-exit\" class=\"media-button-icon media-airplay-button-exit-icon\">\n</media-icon>\n</media-airplay-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-cast-button class=\"media-button media-cast-button\" id=\"vjs-HNl1fwKe-0-2-trigger\">\n<media-icon family=\"scaffold\" name=\"cast-enter\" class=\"media-button-icon media-cast-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"cast-exit\" class=\"media-button-icon media-cast-button-exit-icon\">\n</media-icon>\n</media-cast-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-2-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-pip-button class=\"media-button media-pip-button\" id=\"vjs-HNl1fwKe-0-3-trigger\">\n<media-icon family=\"scaffold\" name=\"pip-enter\" class=\"media-button-icon media-pip-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-exit\" class=\"media-button-icon media-pip-button-exit-icon\">\n</media-icon>\n</media-pip-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-3-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-fullscreen-button class=\"media-button media-fullscreen-button\" id=\"vjs-HNl1fwKe-0-4-trigger\">\n<media-icon family=\"scaffold\" name=\"fullscreen-enter\" class=\"media-button-icon media-fullscreen-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-exit\" class=\"media-button-icon media-fullscreen-button-exit-icon\">\n</media-icon>\n</media-fullscreen-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-4-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n</media-controls-group>\n<media-buffering-indicator class=\"video-controls-buffering\">\n<media-controls-group class=\"video-controls-center\">\n<media-seek-button seconds=\"-10\" class=\"media-button video-controls-center-button video-controls-center-seek\" id=\"vjs-HNl1fwKe-0-5-trigger\">\n<div class=\"media-seek-button-content\">\n<media-icon family=\"scaffold\" name=\"seek\" class=\"media-button-icon media-seek-button-backward-icon video-controls-center-seek-icon\">\n</media-icon>\n<span class=\"media-seek-button-label media-seek-button-backward-label\">10</span>\n</div>\n</media-seek-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-5-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-play-button class=\"media-button media-play-button video-controls-center-button video-controls-center-play\" id=\"vjs-HNl1fwKe-0-6-trigger\">\n<media-icon family=\"scaffold\" name=\"restart\" class=\"media-button-icon-base media-play-button-restart-icon video-controls-center-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"play\" class=\"media-button-icon-base media-play-button-play-icon video-controls-center-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pause\" class=\"media-button-icon-base media-play-button-pause-icon video-controls-center-play-icon\">\n</media-icon>\n</media-play-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-6-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-seek-button seconds=\"10\" class=\"media-button video-controls-center-button video-controls-center-seek\" id=\"vjs-HNl1fwKe-0-7-trigger\">\n<div class=\"media-seek-button-content\">\n<media-icon family=\"scaffold\" name=\"seek\" class=\"media-button-icon video-controls-center-seek-icon\">\n</media-icon>\n<span class=\"media-seek-button-label media-seek-button-forward-label\">10</span>\n</div>\n</media-seek-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-7-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n</media-controls-group>\n</media-buffering-indicator>\n<div class=\"video-controls-bottom video-controls-video-bottom\">\n<div class=\"video-controls-slider-row\">\n<media-time-slider class=\"media-time-slider\" thumb-alignment=\"edge\">\n<media-time-slider-chapters class=\"media-time-slider-chapters\">\n<template>\n<div class=\"media-time-slider-chapter\">\n<media-slider-track class=\"media-time-slider-track\">\n<media-slider-buffer class=\"media-time-slider-buffer\">\n</media-slider-buffer>\n<media-slider-fill class=\"media-time-slider-fill\">\n</media-slider-fill>\n</media-slider-track>\n</div>\n</template>\n</media-time-slider-chapters>\n<media-slider-thumb class=\"media-time-slider-thumb\">\n</media-slider-thumb>\n<media-slider-preview class=\"media-time-slider-preview\">\n<media-slider-thumbnail class=\"media-slider-thumbnail\">\n<img alt=\"\" aria-hidden=\"true\" decoding=\"async\" class=\"media-slider-thumbnail-image\">\n</media-slider-thumbnail>\n<div class=\"media-time-slider-preview-meta\">\n<div class=\"media-time-slider-preview-label\">\n<media-slider-value class=\"media-time-slider-value\" type=\"pointer\">\n</media-slider-value>\n<media-time-slider-chapter-title class=\"media-time-slider-chapter-title\">\n</media-time-slider-chapter-title>\n</div>\n</div>\n</media-slider-preview>\n</media-time-slider>\n</div>\n<media-controls-group class=\"video-controls-row\">\n<media-controls-group class=\"video-controls-group video-controls-start\">\n<media-play-button class=\"media-button media-play-button\" id=\"vjs-HNl1fwKe-0-8-trigger\">\n<media-icon family=\"scaffold\" name=\"restart\" class=\"media-button-icon-base media-play-button-restart-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"play\" class=\"media-button-icon-base media-play-button-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pause\" class=\"media-button-icon-base media-play-button-pause-icon\">\n</media-icon>\n</media-play-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-8-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-mute-button commandfor=\"vjs-a5-df5XX-0-popup\" class=\"media-button media-mute-button\" id=\"vjs-HNl1fwKe-0-9-trigger\">\n<media-icon family=\"scaffold\" name=\"volume-off\" class=\"media-button-icon media-mute-button-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-high\" class=\"media-button-icon media-mute-button-high-icon\">\n</media-icon>\n</media-mute-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-9-trigger\" delay=\"0\" disabled side=\"top\" sticky class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-volume-popover open-on-hover delay=\"200\" close-delay=\"100\" side=\"top\" class=\"media-popup media-popup-safe-area media-volume-popover-popup\" id=\"vjs-a5-df5XX-0-popup\">\n<media-volume-slider class=\"media-volume-slider\" orientation=\"vertical\" thumb-alignment=\"edge\">\n<media-slider-track class=\"media-volume-slider-track\">\n<media-slider-fill class=\"media-volume-slider-fill\">\n</media-slider-fill>\n</media-slider-track>\n<media-slider-thumb class=\"media-volume-slider-thumb\">\n</media-slider-thumb>\n</media-volume-slider>\n</media-volume-popover>\n<media-time-group class=\"media-time-group\">\n<media-time class=\"media-time-toggle\" type=\"current\" toggle>\n</media-time>\n<media-time class=\"media-time-current-value\" type=\"current\">\n</media-time>\n<media-time-separator class=\"media-time-separator\">\n</media-time-separator>\n<media-time class=\"media-time-duration-value\" type=\"duration\">\n</media-time>\n</media-time-group>\n</media-controls-group>\n<media-controls-group class=\"video-controls-group\">\n<media-captions-button class=\"media-button media-captions-button\" id=\"vjs-HNl1fwKe-0-10-trigger\">\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-button-icon media-captions-button-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"captions-on\" class=\"media-button-icon media-captions-button-on-icon\">\n</media-icon>\n</media-captions-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-10-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<button commandfor=\"vjs-dexOLs_f-h-popup\" class=\"media-button\" id=\"vjs-HNl1fwKe-0-11-trigger\">\n<media-icon family=\"scaffold\" name=\"gear\" class=\"media-button-icon\">\n</media-icon>\n<media-text class=\"media-settings-button-label\" token=\"menu.settings\">Settings</media-text>\n</button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-11-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-text token=\"menu.settings\">Settings</media-text>\n</media-tooltip>\n<media-menu side=\"top\" align=\"center\" class=\"media-popup media-popup-safe-area media-menu-popup\" id=\"vjs-dexOLs_f-h-popup\">\n<media-menu-content class=\"media-menu-content\">\n<media-menu-item commandfor=\"vjs-dexOLs_f-1-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"switches\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.quality\">Quality</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-1-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.quality\">Quality</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-quality-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span>\n<span data-part=\"label\">\n</span>\n<sup data-part=\"tier\" class=\"media-menu-tier\">\n</sup>\n</span>\n<span data-part=\"badge\" class=\"media-menu-badge\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-quality-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-5-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"speech\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.audio\">Audio</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-5-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.audio\">Audio</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-audio-track-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-audio-track-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-9-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"speed\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.speed\">Speed</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-9-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.speed\">Speed</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-playback-rate-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-playback-rate-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-d-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.captions\">Captions</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-d-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.captions\">Captions</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-captions-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-captions-radio-group>\n</media-menu-content>\n</media-menu-content>\n</media-menu>\n</media-controls-group>\n</media-controls-group>\n</div>\n</media-tooltip-group>\n</media-controls-content>\n</media-controls>\n<media-hotkey keys=\"Space\" action=\"togglePaused\">\n</media-hotkey>\n<media-hotkey keys=\"k\" action=\"togglePaused\">\n</media-hotkey>\n<media-hotkey keys=\"m\" action=\"toggleMuted\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowRight\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowLeft\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"l\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"j\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowUp\" action=\"volumeStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowDown\" action=\"volumeStep\">\n</media-hotkey>\n<media-hotkey keys=\"0-9\" action=\"seekToPercent\">\n</media-hotkey>\n<media-hotkey keys=\"Home\" action=\"seekToPercent\" value=\"0\">\n</media-hotkey>\n<media-hotkey keys=\"End\" action=\"seekToPercent\" value=\"100\">\n</media-hotkey>\n<media-hotkey keys=\"&gt;\" action=\"speedUp\">\n</media-hotkey>\n<media-hotkey keys=\"&lt;\" action=\"speedDown\">\n</media-hotkey>\n<media-hotkey keys=\"f\" action=\"toggleFullscreen\">\n</media-hotkey>\n<media-hotkey keys=\"c\" action=\"toggleSubtitles\">\n</media-hotkey>\n<media-hotkey keys=\"i\" action=\"togglePictureInPicture\">\n</media-hotkey>\n<media-gesture type=\"tap\" action=\"togglePaused\" pointer=\"mouse\" region=\"center\">\n</media-gesture>\n<media-gesture type=\"tap\" action=\"toggleControls\" pointer=\"touch\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"seekStep\" region=\"left\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"toggleFullscreen\" region=\"center\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"seekStep\" region=\"right\">\n</media-gesture>\n<media-status-announcer class=\"media-status-announcer\">\n</media-status-announcer>\n<div aria-hidden=\"true\" class=\"media-indicator-group\">\n<media-volume-indicator class=\"media-indicator media-volume-indicator\">\n<media-volume-indicator-fill class=\"media-volume-indicator-fill\">\n<media-icon family=\"scaffold\" name=\"volume-high\" class=\"media-volume-indicator-icon media-volume-indicator-high-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-low\" class=\"media-volume-indicator-icon media-volume-indicator-low-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-off\" class=\"media-volume-indicator-icon media-volume-indicator-off-icon\">\n</media-icon>\n<media-volume-indicator-value class=\"media-volume-indicator-value\">\n</media-volume-indicator-value>\n</media-volume-indicator-fill>\n</media-volume-indicator>\n<media-status-indicator actions=\"toggleSubtitles,toggleFullscreen,togglePictureInPicture\" class=\"media-indicator media-status-indicator\">\n<media-icon family=\"scaffold\" name=\"captions-on\" class=\"media-status-indicator-icon media-status-indicator-captions-on-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-status-indicator-icon media-status-indicator-captions-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-enter\" class=\"media-status-indicator-icon media-status-indicator-fullscreen-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-exit\" class=\"media-status-indicator-icon media-status-indicator-fullscreen-exit-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-enter\" class=\"media-status-indicator-icon media-status-indicator-pip-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-exit\" class=\"media-status-indicator-icon media-status-indicator-pip-exit-icon\">\n</media-icon>\n<media-status-indicator-value>\n</media-status-indicator-value>\n</media-status-indicator>\n<media-seek-indicator class=\"media-indicator media-seek-indicator\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-seek-indicator-icon\">\n</media-icon>\n<media-seek-indicator-value class=\"media-seek-indicator-value\">\n</media-seek-indicator-value>\n</media-seek-indicator>\n</div>\n</media-container>`);\n"],"mappings":";;;AAGA,MAAa,WACX,eAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAucT"}
1
+ {"version":3,"file":"template.js","names":[],"sources":["../../../../../src/internal/skins/scaffold-video/template.ts"],"sourcesContent":["import { createTemplate } from '@videojs/utils/dom';\n\n/** Static template rendered from the finalized VJSC module graph. */\nexport const template =\n createTemplate(/* html */ `<media-container class=\"media-skin media-container media-video\" data-theme=\"scaffold\" data-preset=\"video\">\n<slot>\n</slot>\n<media-poster class=\"media-poster\">\n<slot name=\"poster\">\n<img alt=\"\" decoding=\"async\" class=\"media-poster-image\">\n</slot>\n</media-poster>\n<media-error-dialog>\n<media-dialog-backdrop class=\"media-dialog-backdrop\">\n</media-dialog-backdrop>\n<media-dialog-popup class=\"media-dialog-popup\">\n<media-dialog-title class=\"media-dialog-title\">\n</media-dialog-title>\n<media-dialog-description class=\"media-dialog-description\">\n</media-dialog-description>\n<media-dialog-close class=\"media-button media-dialog-close\">\n</media-dialog-close>\n</media-dialog-popup>\n</media-error-dialog>\n<media-controls>\n<media-controls-backdrop class=\"video-controls-backdrop\">\n</media-controls-backdrop>\n<media-controls-group class=\"media-buffering-indicator-controls\">\n<media-buffering-indicator class=\"media-buffering-indicator media-buffering-indicator-backdrop\">\n<media-icon family=\"scaffold\" name=\"spinner\" class=\"media-buffering-indicator-spinner-icon\">\n</media-icon>\n</media-buffering-indicator>\n</media-controls-group>\n<media-controls-content class=\"video-controls-content\">\n<media-tooltip-group>\n<media-controls-group class=\"video-controls-top\">\n<media-title class=\"media-title\">\n</media-title>\n<media-airplay-button class=\"media-button media-airplay-button\" id=\"vjs-HNl1fwKe-0-trigger\">\n<media-icon family=\"scaffold\" name=\"airplay-enter\" class=\"media-button-icon media-airplay-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"airplay-exit\" class=\"media-button-icon media-airplay-button-exit-icon\">\n</media-icon>\n</media-airplay-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-cast-button class=\"media-button media-cast-button\" id=\"vjs-HNl1fwKe-0-2-trigger\">\n<media-icon family=\"scaffold\" name=\"cast-enter\" class=\"media-button-icon media-cast-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"cast-exit\" class=\"media-button-icon media-cast-button-exit-icon\">\n</media-icon>\n</media-cast-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-2-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-pip-button class=\"media-button media-pip-button\" id=\"vjs-HNl1fwKe-0-3-trigger\">\n<media-icon family=\"scaffold\" name=\"pip-enter\" class=\"media-button-icon media-pip-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-exit\" class=\"media-button-icon media-pip-button-exit-icon\">\n</media-icon>\n</media-pip-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-3-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-fullscreen-button class=\"media-button media-fullscreen-button\" id=\"vjs-HNl1fwKe-0-4-trigger\">\n<media-icon family=\"scaffold\" name=\"fullscreen-enter\" class=\"media-button-icon media-fullscreen-button-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-exit\" class=\"media-button-icon media-fullscreen-button-exit-icon\">\n</media-icon>\n</media-fullscreen-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-4-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup media-tooltip-screen-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n</media-controls-group>\n<media-buffering-indicator class=\"video-controls-buffering\">\n<media-controls-group class=\"video-controls-center\">\n<media-seek-button seconds=\"-10\" class=\"media-button video-controls-center-button video-controls-center-seek\" id=\"vjs-HNl1fwKe-0-5-trigger\">\n<div class=\"media-seek-button-content\">\n<media-icon family=\"scaffold\" name=\"seek\" class=\"media-button-icon media-seek-button-backward-icon video-controls-center-seek-icon\">\n</media-icon>\n<span class=\"media-seek-button-label media-seek-button-backward-label\">10</span>\n</div>\n</media-seek-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-5-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-play-button class=\"media-button media-play-button video-controls-center-button video-controls-center-play\" id=\"vjs-HNl1fwKe-0-6-trigger\">\n<media-icon family=\"scaffold\" name=\"restart\" class=\"media-button-icon-base media-play-button-restart-icon video-controls-center-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"play\" class=\"media-button-icon-base media-play-button-play-icon video-controls-center-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pause\" class=\"media-button-icon-base media-play-button-pause-icon video-controls-center-play-icon\">\n</media-icon>\n</media-play-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-6-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-seek-button seconds=\"10\" class=\"media-button video-controls-center-button video-controls-center-seek\" id=\"vjs-HNl1fwKe-0-7-trigger\">\n<div class=\"media-seek-button-content\">\n<media-icon family=\"scaffold\" name=\"seek\" class=\"media-button-icon video-controls-center-seek-icon\">\n</media-icon>\n<span class=\"media-seek-button-label media-seek-button-forward-label\">10</span>\n</div>\n</media-seek-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-7-trigger\" disabled side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n</media-controls-group>\n</media-buffering-indicator>\n<div class=\"video-controls-bottom video-controls-video-bottom\">\n<div class=\"video-controls-slider-row\">\n<media-time-slider class=\"media-time-slider\" thumb-alignment=\"edge\">\n<media-time-slider-chapters class=\"media-time-slider-chapters\">\n<template>\n<div class=\"media-time-slider-chapter\">\n<media-slider-track class=\"media-time-slider-track\">\n<media-slider-buffer class=\"media-time-slider-buffer\">\n</media-slider-buffer>\n<media-slider-fill class=\"media-time-slider-fill\">\n</media-slider-fill>\n</media-slider-track>\n</div>\n</template>\n</media-time-slider-chapters>\n<media-slider-thumb class=\"media-time-slider-thumb\">\n</media-slider-thumb>\n<media-slider-preview class=\"media-time-slider-preview\">\n<media-slider-thumbnail class=\"media-slider-thumbnail\">\n<img alt=\"\" aria-hidden=\"true\" decoding=\"async\" class=\"media-slider-thumbnail-image\">\n</media-slider-thumbnail>\n<div class=\"media-time-slider-preview-meta\">\n<div class=\"media-time-slider-preview-label\">\n<media-slider-value class=\"media-time-slider-value\" type=\"pointer\">\n</media-slider-value>\n<media-time-slider-chapter-title class=\"media-time-slider-chapter-title\">\n</media-time-slider-chapter-title>\n</div>\n</div>\n</media-slider-preview>\n</media-time-slider>\n</div>\n<media-controls-group class=\"video-controls-row\">\n<media-controls-group class=\"video-controls-group video-controls-start\">\n<media-play-button class=\"media-button media-play-button\" id=\"vjs-HNl1fwKe-0-8-trigger\">\n<media-icon family=\"scaffold\" name=\"restart\" class=\"media-button-icon-base media-play-button-restart-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"play\" class=\"media-button-icon-base media-play-button-play-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pause\" class=\"media-button-icon-base media-play-button-pause-icon\">\n</media-icon>\n</media-play-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-8-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-mute-button commandfor=\"vjs-a5-df5XX-0-popup\" class=\"media-button media-mute-button\" id=\"vjs-HNl1fwKe-0-9-trigger\">\n<media-icon family=\"scaffold\" name=\"volume-off\" class=\"media-button-icon media-mute-button-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-high\" class=\"media-button-icon media-mute-button-high-icon\">\n</media-icon>\n</media-mute-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-9-trigger\" delay=\"0\" disabled side=\"top\" sticky class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<media-volume-popover open-on-hover delay=\"200\" close-delay=\"100\" side=\"top\" class=\"media-popup media-popup-safe-area media-volume-popover-popup\" id=\"vjs-a5-df5XX-0-popup\">\n<media-volume-slider class=\"media-volume-slider\" orientation=\"vertical\" thumb-alignment=\"edge\">\n<media-slider-track class=\"media-volume-slider-track\">\n<media-slider-fill class=\"media-volume-slider-fill\">\n</media-slider-fill>\n</media-slider-track>\n<media-slider-thumb class=\"media-volume-slider-thumb\">\n</media-slider-thumb>\n</media-volume-slider>\n</media-volume-popover>\n<media-time-group class=\"media-time-group\">\n<media-time class=\"media-time-toggle\" type=\"current\" toggle>\n</media-time>\n<media-time class=\"media-time-current-value\" type=\"current\">\n</media-time>\n<media-time-separator class=\"media-time-separator\">\n</media-time-separator>\n<media-time class=\"media-time-duration-value\" type=\"duration\">\n</media-time>\n</media-time-group>\n</media-controls-group>\n<media-controls-group class=\"video-controls-group\">\n<media-captions-button class=\"media-button media-captions-button\" id=\"vjs-HNl1fwKe-0-10-trigger\">\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-button-icon media-captions-button-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"captions-on\" class=\"media-button-icon media-captions-button-on-icon\">\n</media-icon>\n</media-captions-button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-10-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-tooltip-label>\n</media-tooltip-label>\n<media-tooltip-shortcut class=\"media-tooltip-shortcut\">\n</media-tooltip-shortcut>\n</media-tooltip>\n<button commandfor=\"vjs-dexOLs_f-h-popup\" class=\"media-button media-settings-button\" id=\"vjs-HNl1fwKe-0-11-trigger\">\n<media-icon family=\"scaffold\" name=\"gear\" class=\"media-button-icon\">\n</media-icon>\n<media-text class=\"media-settings-button-label\" token=\"menu.settings\">Settings</media-text>\n</button>\n<media-tooltip trigger=\"vjs-HNl1fwKe-0-11-trigger\" side=\"top\" class=\"media-popup media-popup-safe-area media-tooltip-popup\">\n<media-text token=\"menu.settings\">Settings</media-text>\n</media-tooltip>\n<media-menu side=\"top\" align=\"center\" class=\"media-popup media-popup-safe-area media-menu-popup\" id=\"vjs-dexOLs_f-h-popup\">\n<media-menu-content class=\"media-menu-content\">\n<media-menu-item commandfor=\"vjs-dexOLs_f-1-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"switches\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.quality\">Quality</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-1-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.quality\">Quality</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-quality-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span>\n<span data-part=\"label\">\n</span>\n<sup data-part=\"tier\" class=\"media-menu-tier\">\n</sup>\n</span>\n<span data-part=\"badge\" class=\"media-menu-badge\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-quality-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-5-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"speech\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.audio\">Audio</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-5-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.audio\">Audio</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-audio-track-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-audio-track-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-9-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"speed\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.speed\">Speed</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-9-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.speed\">Speed</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-playback-rate-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-playback-rate-radio-group>\n</media-menu-content>\n<media-menu-item commandfor=\"vjs-dexOLs_f-d-content\" class=\"media-menu-item\">\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-menu-trigger-icon\">\n</media-icon>\n<media-text token=\"menu.captions\">Captions</media-text>\n<span class=\"media-menu-hint\">\n<span data-part=\"value\" class=\"media-menu-hint-label\">\n</span>\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-forward-chevron\">\n</media-icon>\n</span>\n</media-menu-item>\n<media-menu-content class=\"media-menu-content\" id=\"vjs-dexOLs_f-d-content\">\n<media-menu-item class=\"media-menu-back-item\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-menu-back-chevron\">\n</media-icon>\n<media-text token=\"menu.captions\">Captions</media-text>\n</media-menu-item>\n<media-menu-separator class=\"media-menu-separator\">\n</media-menu-separator>\n<media-captions-radio-group class=\"media-menu-radio-group\">\n<template>\n<media-menu-radio-item class=\"media-menu-radio-item\">\n<span data-part=\"label\">\n</span>\n<span data-part=\"badge\" class=\"media-menu-badge\">\n</span>\n<media-menu-item-indicator force-mount class=\"media-menu-indicator\">\n<media-icon family=\"scaffold\" name=\"check\" class=\"media-menu-radio-icon\">\n</media-icon>\n</media-menu-item-indicator>\n</media-menu-radio-item>\n</template>\n</media-captions-radio-group>\n</media-menu-content>\n</media-menu-content>\n</media-menu>\n</media-controls-group>\n</media-controls-group>\n</div>\n</media-tooltip-group>\n</media-controls-content>\n</media-controls>\n<media-hotkey keys=\"Space\" action=\"togglePaused\">\n</media-hotkey>\n<media-hotkey keys=\"k\" action=\"togglePaused\">\n</media-hotkey>\n<media-hotkey keys=\"m\" action=\"toggleMuted\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowRight\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowLeft\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"l\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"j\" action=\"seekStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowUp\" action=\"volumeStep\">\n</media-hotkey>\n<media-hotkey keys=\"ArrowDown\" action=\"volumeStep\">\n</media-hotkey>\n<media-hotkey keys=\"0-9\" action=\"seekToPercent\">\n</media-hotkey>\n<media-hotkey keys=\"Home\" action=\"seekToPercent\" value=\"0\">\n</media-hotkey>\n<media-hotkey keys=\"End\" action=\"seekToPercent\" value=\"100\">\n</media-hotkey>\n<media-hotkey keys=\"&gt;\" action=\"speedUp\">\n</media-hotkey>\n<media-hotkey keys=\"&lt;\" action=\"speedDown\">\n</media-hotkey>\n<media-hotkey keys=\"f\" action=\"toggleFullscreen\">\n</media-hotkey>\n<media-hotkey keys=\"c\" action=\"toggleSubtitles\">\n</media-hotkey>\n<media-hotkey keys=\"i\" action=\"togglePictureInPicture\">\n</media-hotkey>\n<media-gesture type=\"tap\" action=\"togglePaused\" pointer=\"mouse\" region=\"center\">\n</media-gesture>\n<media-gesture type=\"tap\" action=\"toggleControls\" pointer=\"touch\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"seekStep\" region=\"left\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"toggleFullscreen\" region=\"center\">\n</media-gesture>\n<media-gesture type=\"doubletap\" action=\"seekStep\" region=\"right\">\n</media-gesture>\n<media-status-announcer class=\"media-status-announcer\">\n</media-status-announcer>\n<div aria-hidden=\"true\" class=\"media-indicator-group\">\n<media-volume-indicator class=\"media-indicator media-volume-indicator\">\n<media-volume-indicator-fill class=\"media-volume-indicator-fill\">\n<media-icon family=\"scaffold\" name=\"volume-high\" class=\"media-volume-indicator-icon media-volume-indicator-high-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-low\" class=\"media-volume-indicator-icon media-volume-indicator-low-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"volume-off\" class=\"media-volume-indicator-icon media-volume-indicator-off-icon\">\n</media-icon>\n<media-volume-indicator-value class=\"media-volume-indicator-value\">\n</media-volume-indicator-value>\n</media-volume-indicator-fill>\n</media-volume-indicator>\n<media-status-indicator actions=\"toggleSubtitles,toggleFullscreen,togglePictureInPicture\" class=\"media-indicator media-status-indicator\">\n<media-icon family=\"scaffold\" name=\"captions-on\" class=\"media-status-indicator-icon media-status-indicator-captions-on-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"captions-off\" class=\"media-status-indicator-icon media-status-indicator-captions-off-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-enter\" class=\"media-status-indicator-icon media-status-indicator-fullscreen-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"fullscreen-exit\" class=\"media-status-indicator-icon media-status-indicator-fullscreen-exit-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-enter\" class=\"media-status-indicator-icon media-status-indicator-pip-enter-icon\">\n</media-icon>\n<media-icon family=\"scaffold\" name=\"pip-exit\" class=\"media-status-indicator-icon media-status-indicator-pip-exit-icon\">\n</media-icon>\n<media-status-indicator-value>\n</media-status-indicator-value>\n</media-status-indicator>\n<media-seek-indicator class=\"media-indicator media-seek-indicator\">\n<media-icon family=\"scaffold\" name=\"chevron\" class=\"media-seek-indicator-icon\">\n</media-icon>\n<media-seek-indicator-value class=\"media-seek-indicator-value\">\n</media-seek-indicator-value>\n</media-seek-indicator>\n</div>\n</media-container>`);\n"],"mappings":";;;AAGA,MAAa,WACX,eAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAycT"}
@@ -1,20 +1,14 @@
1
- import { getTemplateHTML } from "./template.js";
1
+ import { BackgroundVideoBase } from "./base.js";
2
2
  import { Media } from "@videojs/media/dom";
3
3
  //#region src/media/background-video/adapter.d.ts
4
- declare const BackgroundVideo_base: {
5
- new (): HTMLElement;
6
- prototype: HTMLElement;
7
- };
8
- export declare class BackgroundVideo extends BackgroundVideo_base {
9
- static shadowRootOptions: {
10
- mode: ShadowRootMode;
11
- };
12
- static getTemplateHTML: typeof getTemplateHTML;
13
- static get observedAttributes(): string[];
4
+ export declare class BackgroundVideo extends BackgroundVideoBase {
14
5
  constructor();
15
6
  getMediaTarget(): Media | null;
16
- attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void;
17
- get target(): HTMLVideoElement | null;
7
+ /** URL of a video the browser can play directly. Assigning a new one restarts playback. */
8
+ get src(): string;
9
+ set src(value: string);
10
+ /** The inner video's `MediaError`, or `null`. */
11
+ get error(): MediaError | null;
18
12
  }
19
13
  //#endregion
20
14
  //# sourceMappingURL=adapter.d.ts.map
@@ -1,46 +1,24 @@
1
- import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
- import { getTemplateHTML } from "./template.js";
3
- import { namedNodeMapToObject } from "@videojs/utils/dom";
1
+ import { BackgroundVideoBase } from "./base.js";
4
2
  //#region src/media/background-video/adapter.ts
5
- const HTMLElementBase = globalThis.HTMLElement ?? class {};
6
- var BackgroundVideo = class extends MediaAttachMixin(HTMLElementBase) {
7
- static {
8
- this.shadowRootOptions = { mode: "open" };
9
- }
10
- static {
11
- this.getTemplateHTML = getTemplateHTML;
12
- }
13
- static get observedAttributes() {
14
- return ["src"];
15
- }
3
+ var BackgroundVideo = class extends BackgroundVideoBase {
16
4
  constructor() {
17
5
  super();
18
- if (!this.shadowRoot) {
19
- this.attachShadow(this.constructor.shadowRootOptions);
20
- const attrs = {
21
- ...namedNodeMapToObject(this.attributes),
22
- ...!this.hasAttribute("nomuted") && { muted: "" },
23
- ...!this.hasAttribute("noloop") && { loop: "" },
24
- ...!this.hasAttribute("noautoplay") && { autoplay: "" },
25
- playsinline: "",
26
- disableremoteplayback: "",
27
- disablepictureinpicture: ""
28
- };
29
- this.shadowRoot.innerHTML = getTemplateHTML(attrs);
30
- }
31
- this.target.muted = !this.hasAttribute("nomuted");
6
+ this.target?.addEventListener("error", () => this.dispatchEvent(new Event("error")));
32
7
  }
33
8
  getMediaTarget() {
34
9
  return this.target;
35
10
  }
36
- attributeChangedCallback(attrName, oldValue, newValue) {
37
- if (attrName === "src" && oldValue !== newValue) this.target.src = newValue ?? "";
11
+ /** URL of a video the browser can play directly. Assigning a new one restarts playback. */
12
+ get src() {
13
+ return this.target?.src ?? "";
14
+ }
15
+ set src(value) {
16
+ const target = this.target;
17
+ if (target) target.src = value;
38
18
  }
39
- get target() {
40
- const slotted = this.querySelector(":scope > [slot=media]");
41
- if (slotted instanceof HTMLVideoElement) return slotted;
42
- const video = this.querySelector("video") ?? this.shadowRoot?.querySelector("video");
43
- return video instanceof HTMLVideoElement ? video : null;
19
+ /** The inner video's `MediaError`, or `null`. */
20
+ get error() {
21
+ return this.target?.error ?? null;
44
22
  }
45
23
  };
46
24
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","names":[],"sources":["../../../../src/media/background-video/adapter.ts"],"sourcesContent":["import type { Media } from '@videojs/media/dom';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\n\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\nimport { getTemplateHTML } from './template';\n\nconst HTMLElementBase = globalThis.HTMLElement ?? class {};\n\n// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API.\nexport class BackgroundVideo extends MediaAttachMixin(HTMLElementBase) {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n static get observedAttributes() {\n return ['src'];\n }\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // Get around this by setting the muted property manually.\n this.target!.muted = !this.hasAttribute('nomuted');\n }\n\n // Register the inner <video> (not `this`) with the provider.\n getMediaTarget(): Media | null {\n return this.target;\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName === 'src' && oldValue !== newValue) {\n this.target!.src = newValue ?? '';\n }\n }\n\n get target(): HTMLVideoElement | null {\n const slotted = this.querySelector(':scope > [slot=media]');\n if (slotted instanceof HTMLVideoElement) return slotted;\n\n const video = this.querySelector('video') ?? this.shadowRoot?.querySelector('video');\n\n return video instanceof HTMLVideoElement ? video : null;\n }\n}\n"],"mappings":";;;;AAMA,MAAM,kBAAkB,WAAW,eAAe,MAAM,CAAC;AAGzD,IAAa,kBAAb,cAAqC,iBAAiB,eAAe,CAAC,CAAC;;EAC1C,KAAA,oBAAA,EAAE,MAAM,OAAyB;;;EACnC,KAAA,kBAAA;;CACzB,WAAW,qBAAqB;EAC9B,OAAO,CAAC,KAAK;CACf;CAEA,cAAc;EACZ,MAAM;EAEN,IAAI,CAAC,KAAK,YAAY;GACpB,KAAK,aAAc,KAAK,YAAuC,iBAAiB;GAEhF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,UAAU;IACvC,GAAI,CAAC,KAAK,aAAa,SAAS,KAAK,EAAE,OAAO,GAAG;IACjD,GAAI,CAAC,KAAK,aAAa,QAAQ,KAAK,EAAE,MAAM,GAAG;IAC/C,GAAI,CAAC,KAAK,aAAa,YAAY,KAAK,EAAE,UAAU,GAAG;IACvD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;GAC3B;GAEA,KAAK,WAAY,YAAY,gBAAgB,KAAK;EACpD;EAKA,KAAK,OAAQ,QAAQ,CAAC,KAAK,aAAa,SAAS;CACnD;CAGA,iBAA+B;EAC7B,OAAO,KAAK;CACd;CAEA,yBAAyB,UAAkB,UAAyB,UAA+B;EACjG,IAAI,aAAa,SAAS,aAAa,UACrC,KAAK,OAAQ,MAAM,YAAY;CAEnC;CAEA,IAAI,SAAkC;EACpC,MAAM,UAAU,KAAK,cAAc,uBAAuB;EAC1D,IAAI,mBAAmB,kBAAkB,OAAO;EAEhD,MAAM,QAAQ,KAAK,cAAc,OAAO,KAAK,KAAK,YAAY,cAAc,OAAO;EAEnF,OAAO,iBAAiB,mBAAmB,QAAQ;CACrD;AACF"}
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../src/media/background-video/adapter.ts"],"sourcesContent":["import type { Media } from '@videojs/media/dom';\n\nimport { BackgroundVideoBase } from './base';\n\n// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API.\nexport class BackgroundVideo extends BackgroundVideoBase {\n constructor() {\n super();\n\n // `error` doesn't cross the shadow boundary, so re-fire it from the host,\n // matching `<hls-background-video>`.\n this.target?.addEventListener('error', () => this.dispatchEvent(new Event('error')));\n }\n\n // Register the inner <video> (not `this`) with the provider.\n getMediaTarget(): Media | null {\n return this.target;\n }\n\n /** URL of a video the browser can play directly. Assigning a new one restarts playback. */\n override get src(): string {\n return this.target?.src ?? '';\n }\n\n override set src(value: string) {\n const target = this.target;\n\n if (target) target.src = value;\n }\n\n /** The inner video's `MediaError`, or `null`. */\n get error(): MediaError | null {\n return this.target?.error ?? null;\n }\n}\n"],"mappings":";;AAKA,IAAa,kBAAb,cAAqC,oBAAoB;CACvD,cAAc;EACZ,MAAM;EAIN,KAAK,QAAQ,iBAAiB,eAAe,KAAK,cAAc,IAAI,MAAM,OAAO,CAAC,CAAC;CACrF;CAGA,iBAA+B;EAC7B,OAAO,KAAK;CACd;;CAGA,IAAa,MAAc;EACzB,OAAO,KAAK,QAAQ,OAAO;CAC7B;CAEA,IAAa,IAAI,OAAe;EAC9B,MAAM,SAAS,KAAK;EAEpB,IAAI,QAAQ,OAAO,MAAM;CAC3B;;CAGA,IAAI,QAA2B;EAC7B,OAAO,KAAK,QAAQ,SAAS;CAC/B;AACF"}
@@ -0,0 +1,44 @@
1
+ import { getTemplateHTML } from "./template.js";
2
+ //#region src/media/background-video/base.d.ts
3
+ interface LifecycleElement extends HTMLElement {
4
+ connectedCallback?(): void;
5
+ disconnectedCallback?(): void;
6
+ adoptedCallback?(): void;
7
+ attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;
8
+ }
9
+ declare const MediaAttachBase: new () => LifecycleElement;
10
+ declare const PLAYBACK_DEFAULTS: readonly ['muted', 'loop', 'autoplay'];
11
+ /** A playback default an element can let authors turn off with a `no*` attribute. */
12
+ export type BackgroundVideoOptOut = (typeof PLAYBACK_DEFAULTS)[number];
13
+ /**
14
+ * The shadow setup, `src` wiring, and `target` that `<background-video>` and `<hls-background-video>` share. Each
15
+ * subclass supplies its own `src` and declares which playback defaults authors may opt out of.
16
+ *
17
+ * @internal
18
+ */
19
+ export declare abstract class BackgroundVideoBase extends MediaAttachBase {
20
+ #private;
21
+ static shadowRootOptions: {
22
+ mode: ShadowRootMode;
23
+ };
24
+ static getTemplateHTML: typeof getTemplateHTML;
25
+ /** Defaults that a matching `no*` attribute turns off. Every other default is fixed on. */
26
+ static optOuts: readonly BackgroundVideoOptOut[];
27
+ /** Host attributes copied onto the inner video at creation and mirrored as they change. */
28
+ static passthroughAttributes: readonly string[];
29
+ static get observedAttributes(): string[];
30
+ constructor();
31
+ /**
32
+ * Writes muted, loop, and autoplay onto the inner video as properties. The template's attributes only cover markup
33
+ * parsed with its attributes in place; an element created by script gets its `no*` attributes afterwards, and neither
34
+ * Chrome nor Firefox honor a `muted` attribute set after `document.createElement`.
35
+ */
36
+ protected syncPlaybackDefaults(): void;
37
+ abstract get src(): string;
38
+ abstract set src(value: string);
39
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
40
+ /** The inner `<video>` in the shadow root: what plays, and what `play()` / `pause()` belong on. */
41
+ get target(): HTMLVideoElement | null;
42
+ }
43
+ //#endregion
44
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1,97 @@
1
+ import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
+ import { getTemplateHTML, getTemplateVideo } from "./template.js";
3
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
4
+ import { pick } from "@videojs/utils/object";
5
+ //#region src/media/background-video/base.ts
6
+ const HTMLElementBase = globalThis.HTMLElement ?? class {};
7
+ const MediaAttachBase = MediaAttachMixin(HTMLElementBase);
8
+ const PLAYBACK_DEFAULTS = [
9
+ "muted",
10
+ "loop",
11
+ "autoplay"
12
+ ];
13
+ /**
14
+ * The shadow setup, `src` wiring, and `target` that `<background-video>` and `<hls-background-video>` share. Each
15
+ * subclass supplies its own `src` and declares which playback defaults authors may opt out of.
16
+ *
17
+ * @internal
18
+ */
19
+ var BackgroundVideoBase = class extends MediaAttachBase {
20
+ static {
21
+ this.shadowRootOptions = { mode: "open" };
22
+ }
23
+ static {
24
+ this.getTemplateHTML = getTemplateHTML;
25
+ }
26
+ static {
27
+ this.optOuts = [
28
+ "muted",
29
+ "loop",
30
+ "autoplay"
31
+ ];
32
+ }
33
+ static {
34
+ this.passthroughAttributes = [
35
+ "controls",
36
+ "controlslist",
37
+ "crossorigin",
38
+ "preload"
39
+ ];
40
+ }
41
+ static get observedAttributes() {
42
+ return [
43
+ "src",
44
+ ...this.optOuts,
45
+ ...this.optOuts.map((name) => `no${name}`),
46
+ ...this.passthroughAttributes
47
+ ];
48
+ }
49
+ constructor() {
50
+ super();
51
+ const ctor = this.constructor;
52
+ if (!this.shadowRoot) {
53
+ const attrs = {
54
+ ...pick(namedNodeMapToObject(this.attributes), ctor.passthroughAttributes),
55
+ playsinline: "",
56
+ disableremoteplayback: "",
57
+ disablepictureinpicture: ""
58
+ };
59
+ for (const name of PLAYBACK_DEFAULTS) if (this.#isDefaultOn(name)) attrs[name] = "";
60
+ this.attachShadow(ctor.shadowRootOptions);
61
+ this.shadowRoot.innerHTML = ctor.getTemplateHTML(attrs);
62
+ }
63
+ this.syncPlaybackDefaults();
64
+ }
65
+ /**
66
+ * Writes muted, loop, and autoplay onto the inner video as properties. The template's attributes only cover markup
67
+ * parsed with its attributes in place; an element created by script gets its `no*` attributes afterwards, and neither
68
+ * Chrome nor Firefox honor a `muted` attribute set after `document.createElement`.
69
+ */
70
+ syncPlaybackDefaults() {
71
+ const target = this.target;
72
+ if (!target) return;
73
+ for (const name of PLAYBACK_DEFAULTS) target[name] = this.#isDefaultOn(name);
74
+ }
75
+ /** On unless its `no*` attribute is set and allowed; an explicit attribute such as `muted` wins over its opt-out. */
76
+ #isDefaultOn(name) {
77
+ const { optOuts } = this.constructor;
78
+ return this.hasAttribute(name) || !optOuts.includes(name) || !this.hasAttribute(`no${name}`);
79
+ }
80
+ attributeChangedCallback(name, oldValue, newValue) {
81
+ if (oldValue === newValue) return;
82
+ const { passthroughAttributes } = this.constructor;
83
+ if (name === "src") this.src = newValue ?? "";
84
+ else if (passthroughAttributes.includes(name)) {
85
+ if (newValue === null) this.target?.removeAttribute(name);
86
+ else this.target?.setAttribute(name, newValue);
87
+ } else this.syncPlaybackDefaults();
88
+ }
89
+ /** The inner `<video>` in the shadow root: what plays, and what `play()` / `pause()` belong on. */
90
+ get target() {
91
+ return getTemplateVideo(this.shadowRoot);
92
+ }
93
+ };
94
+ //#endregion
95
+ export { BackgroundVideoBase };
96
+
97
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../../../src/media/background-video/base.ts"],"sourcesContent":["import { namedNodeMapToObject } from '@videojs/utils/dom';\nimport { pick } from '@videojs/utils/object';\n\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\nimport { getTemplateHTML, getTemplateVideo } from './template';\n\nconst HTMLElementBase = globalThis.HTMLElement ?? class {};\n\n// `MediaAttachMixin` is typed as returning its base, so its lifecycle callbacks\n// aren't visible for `super` to reach. Method syntax lets subclasses override them.\ninterface LifecycleElement extends HTMLElement {\n connectedCallback?(): void;\n disconnectedCallback?(): void;\n adoptedCallback?(): void;\n attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\nconst MediaAttachBase = MediaAttachMixin(HTMLElementBase) as unknown as new () => LifecycleElement;\n\nconst PLAYBACK_DEFAULTS = ['muted', 'loop', 'autoplay'] as const;\n\n/** A playback default an element can let authors turn off with a `no*` attribute. */\nexport type BackgroundVideoOptOut = (typeof PLAYBACK_DEFAULTS)[number];\n\n/**\n * The shadow setup, `src` wiring, and `target` that `<background-video>` and `<hls-background-video>` share. Each\n * subclass supplies its own `src` and declares which playback defaults authors may opt out of.\n *\n * @internal\n */\nexport abstract class BackgroundVideoBase extends MediaAttachBase {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n /** Defaults that a matching `no*` attribute turns off. Every other default is fixed on. */\n static optOuts: readonly BackgroundVideoOptOut[] = ['muted', 'loop', 'autoplay'];\n /** Host attributes copied onto the inner video at creation and mirrored as they change. */\n static passthroughAttributes: readonly string[] = ['controls', 'controlslist', 'crossorigin', 'preload'];\n\n static get observedAttributes(): string[] {\n return ['src', ...this.optOuts, ...this.optOuts.map((name) => `no${name}`), ...this.passthroughAttributes];\n }\n\n constructor() {\n super();\n\n const ctor = this.constructor as typeof BackgroundVideoBase;\n\n if (!this.shadowRoot) {\n const attrs: Record<string, string> = {\n ...pick(namedNodeMapToObject(this.attributes), ctor.passthroughAttributes),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n for (const name of PLAYBACK_DEFAULTS) {\n if (this.#isDefaultOn(name)) attrs[name] = '';\n }\n\n this.attachShadow(ctor.shadowRootOptions);\n this.shadowRoot!.innerHTML = ctor.getTemplateHTML(attrs);\n }\n\n this.syncPlaybackDefaults();\n }\n\n /**\n * Writes muted, loop, and autoplay onto the inner video as properties. The template's attributes only cover markup\n * parsed with its attributes in place; an element created by script gets its `no*` attributes afterwards, and neither\n * Chrome nor Firefox honor a `muted` attribute set after `document.createElement`.\n */\n protected syncPlaybackDefaults(): void {\n const target = this.target;\n if (!target) return;\n\n for (const name of PLAYBACK_DEFAULTS) target[name] = this.#isDefaultOn(name);\n }\n\n /** On unless its `no*` attribute is set and allowed; an explicit attribute such as `muted` wins over its opt-out. */\n #isDefaultOn(name: BackgroundVideoOptOut): boolean {\n const { optOuts } = this.constructor as typeof BackgroundVideoBase;\n\n return this.hasAttribute(name) || !optOuts.includes(name) || !this.hasAttribute(`no${name}`);\n }\n\n abstract get src(): string;\n abstract set src(value: string);\n\n override attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const { passthroughAttributes } = this.constructor as typeof BackgroundVideoBase;\n\n if (name === 'src') {\n this.src = newValue ?? '';\n } else if (passthroughAttributes.includes(name)) {\n if (newValue === null) this.target?.removeAttribute(name);\n else this.target?.setAttribute(name, newValue);\n } else {\n this.syncPlaybackDefaults();\n }\n }\n\n /** The inner `<video>` in the shadow root: what plays, and what `play()` / `pause()` belong on. */\n get target(): HTMLVideoElement | null {\n return getTemplateVideo(this.shadowRoot);\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,kBAAkB,WAAW,eAAe,MAAM,CAAC;AAWzD,MAAM,kBAAkB,iBAAiB,eAAe;AAExD,MAAM,oBAAoB;CAAC;CAAS;CAAQ;AAAU;;;;;;;AAWtD,IAAsB,sBAAtB,cAAkD,gBAAgB;;EACrC,KAAA,oBAAA,EAAE,MAAM,OAAyB;;;EACnC,KAAA,kBAAA;;;EAE0B,KAAA,UAAA;GAAC;GAAS;GAAQ;EAAU;;;EAE7B,KAAA,wBAAA;GAAC;GAAY;GAAgB;GAAe;EAAS;;CAEvG,WAAW,qBAA+B;EACxC,OAAO;GAAC;GAAO,GAAG,KAAK;GAAS,GAAG,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM;GAAG,GAAG,KAAK;EAAqB;CAC3G;CAEA,cAAc;EACZ,MAAM;EAEN,MAAM,OAAO,KAAK;EAElB,IAAI,CAAC,KAAK,YAAY;GACpB,MAAM,QAAgC;IACpC,GAAG,KAAK,qBAAqB,KAAK,UAAU,GAAG,KAAK,qBAAqB;IACzE,aAAa;IACb,uBAAuB;IACvB,yBAAyB;GAC3B;GAEA,KAAK,MAAM,QAAQ,mBACjB,IAAI,KAAK,aAAa,IAAI,GAAG,MAAM,QAAQ;GAG7C,KAAK,aAAa,KAAK,iBAAiB;GACxC,KAAK,WAAY,YAAY,KAAK,gBAAgB,KAAK;EACzD;EAEA,KAAK,qBAAqB;CAC5B;;;;;;CAOA,uBAAuC;EACrC,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,QAAQ;EAEb,KAAK,MAAM,QAAQ,mBAAmB,OAAO,QAAQ,KAAK,aAAa,IAAI;CAC7E;;CAGA,aAAa,MAAsC;EACjD,MAAM,EAAE,YAAY,KAAK;EAEzB,OAAO,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,SAAS,IAAI,KAAK,CAAC,KAAK,aAAa,KAAK,MAAM;CAC7F;CAKA,yBAAkC,MAAc,UAAyB,UAA+B;EACtG,IAAI,aAAa,UAAU;EAE3B,MAAM,EAAE,0BAA0B,KAAK;EAEvC,IAAI,SAAS,OACX,KAAK,MAAM,YAAY;OAClB,IAAI,sBAAsB,SAAS,IAAI,GAAG;GAC/C,IAAI,aAAa,MAAM,KAAK,QAAQ,gBAAgB,IAAI;QACnD,KAAK,QAAQ,aAAa,MAAM,QAAQ;EAC/C,OACE,KAAK,qBAAqB;CAE9B;;CAGA,IAAI,SAAkC;EACpC,OAAO,iBAAiB,KAAK,UAAU;CACzC;AACF"}
@@ -3,6 +3,9 @@
3
3
  * The shadow template both background-video elements render: a `<slot>` for a placeholder image, and a `<video>`
4
4
  * stretched over the host.
5
5
  *
6
+ * `attrs` go onto the `<video>` as given; each element decides which of its own attributes to forward. `src` is never
7
+ * among them, since serializing it would start a native load before an engine could take it.
8
+ *
6
9
  * Shared so the two can't drift in presentation. `object-fit` and `object-position` are the only styling hooks — a
7
10
  * background video has no controls to theme.
8
11
  */
@@ -1,27 +1,12 @@
1
1
  import { serializeAttributes } from "@videojs/utils/dom";
2
- import { pick } from "@videojs/utils/object";
3
2
  //#region src/media/background-video/template.ts
4
3
  /**
5
- * Attributes forwarded to the inner `<video>`. `src` is deliberately not one of them: each element decides what to do
6
- * with it, whether that is assigning the inner video or handing it to a playback engine, and serializing it into the
7
- * template would start a native load either way.
8
- */
9
- const VideoAttributes = [
10
- "autoplay",
11
- "controls",
12
- "controlslist",
13
- "crossorigin",
14
- "disablepictureinpicture",
15
- "disableremoteplayback",
16
- "loop",
17
- "muted",
18
- "playsinline",
19
- "preload"
20
- ];
21
- /**
22
4
  * The shadow template both background-video elements render: a `<slot>` for a placeholder image, and a `<video>`
23
5
  * stretched over the host.
24
6
  *
7
+ * `attrs` go onto the `<video>` as given; each element decides which of its own attributes to forward. `src` is never
8
+ * among them, since serializing it would start a native load before an engine could take it.
9
+ *
25
10
  * Shared so the two can't drift in presentation. `object-fit` and `object-position` are the only styling hooks — a
26
11
  * background video has no controls to theme.
27
12
  */
@@ -42,10 +27,18 @@ function getTemplateHTML(attrs) {
42
27
  }
43
28
  </style>
44
29
  <slot></slot>
45
- <video${serializeAttributes(pick(attrs, [...VideoAttributes]))}></video>
30
+ <video${serializeAttributes(attrs)}></video>
46
31
  `;
47
32
  }
33
+ /**
34
+ * The `<video>` from `getTemplateHTML`. Always the shadow one: the template has no slot that would render a light-DOM
35
+ * `<video>`, so anything found there is either the placeholder or not displayed at all.
36
+ */
37
+ function getTemplateVideo(shadowRoot) {
38
+ const video = shadowRoot?.querySelector("video");
39
+ return video instanceof HTMLVideoElement ? video : null;
40
+ }
48
41
  //#endregion
49
- export { VideoAttributes, getTemplateHTML };
42
+ export { getTemplateHTML, getTemplateVideo };
50
43
 
51
44
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","names":[],"sources":["../../../../src/media/background-video/template.ts"],"sourcesContent":["import { serializeAttributes } from '@videojs/utils/dom';\nimport { pick } from '@videojs/utils/object';\n\n/**\n * Attributes forwarded to the inner `<video>`. `src` is deliberately not one of them: each element decides what to do\n * with it, whether that is assigning the inner video or handing it to a playback engine, and serializing it into the\n * template would start a native load either way.\n */\nexport const VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\n/**\n * The shadow template both background-video elements render: a `<slot>` for a placeholder image, and a `<video>`\n * stretched over the host.\n *\n * Shared so the two can't drift in presentation. `object-fit` and `object-position` are the only styling hooks — a\n * background video has no controls to theme.\n */\nexport function getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, inherit);\n object-position: var(--media-object-position, 50% 50%);\n }\n </style>\n <slot></slot>\n <video${serializeAttributes(pick(attrs, [...VideoAttributes]))}></video>\n `;\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;AASA,SAAgB,gBAAgB,OAA+B;CAC7D,OAAgB;;;;;;;;;;;;;;;;YAgBN,oBAAoB,KAAK,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE;;AAEnE"}
1
+ {"version":3,"file":"template.js","names":[],"sources":["../../../../src/media/background-video/template.ts"],"sourcesContent":["import { serializeAttributes } from '@videojs/utils/dom';\n\n/**\n * The shadow template both background-video elements render: a `<slot>` for a placeholder image, and a `<video>`\n * stretched over the host.\n *\n * `attrs` go onto the `<video>` as given; each element decides which of its own attributes to forward. `src` is never\n * among them, since serializing it would start a native load before an engine could take it.\n *\n * Shared so the two can't drift in presentation. `object-fit` and `object-position` are the only styling hooks — a\n * background video has no controls to theme.\n */\nexport function getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, inherit);\n object-position: var(--media-object-position, 50% 50%);\n }\n </style>\n <slot></slot>\n <video${serializeAttributes(attrs)}></video>\n `;\n}\n\n/**\n * The `<video>` from `getTemplateHTML`. Always the shadow one: the template has no slot that would render a light-DOM\n * `<video>`, so anything found there is either the placeholder or not displayed at all.\n */\nexport function getTemplateVideo(shadowRoot: ShadowRoot | null): HTMLVideoElement | null {\n const video = shadowRoot?.querySelector('video');\n\n return video instanceof HTMLVideoElement ? video : null;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,gBAAgB,OAA+B;CAC7D,OAAgB;;;;;;;;;;;;;;;;YAgBN,oBAAoB,KAAK,EAAE;;AAEvC;;;;;AAMA,SAAgB,iBAAiB,YAAwD;CACvF,MAAM,QAAQ,YAAY,cAAc,OAAO;CAE/C,OAAO,iBAAiB,mBAAmB,QAAQ;AACrD"}
@@ -0,0 +1,17 @@
1
+ import { CustomMediaConstructor } from "../../index.js";
2
+ import { DailymotionAdapter } from "@videojs/dailymotion-video";
3
+ //#region src/media/dailymotion-video/adapter.d.ts
4
+ interface DailymotionCustomMediaElement {
5
+ connectedCallback?(): void;
6
+ }
7
+ declare const DailymotionCustomMediaElement_base: CustomMediaConstructor<typeof DailymotionAdapter>;
8
+ declare class DailymotionCustomMediaElement extends DailymotionCustomMediaElement_base {
9
+ static getTemplateHTML: () => string;
10
+ }
11
+ declare const DailymotionVideo_base: typeof DailymotionCustomMediaElement;
12
+ export declare class DailymotionVideo extends DailymotionVideo_base {
13
+ constructor();
14
+ connectedCallback(): void;
15
+ }
16
+ //#endregion
17
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1,47 @@
1
+ import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
+ import { CustomMediaElement } from "@videojs/media/dom";
3
+ import { DailymotionAdapter } from "@videojs/dailymotion-video";
4
+ //#region src/media/dailymotion-video/adapter.ts
5
+ var DailymotionCustomMediaElement = class extends CustomMediaElement("iframe", DailymotionAdapter) {
6
+ static {
7
+ this.getTemplateHTML = () => `
8
+ <style>
9
+ :host {
10
+ display: inline-block;
11
+ min-width: 300px;
12
+ min-height: 150px;
13
+ position: relative;
14
+ }
15
+ ::slotted([slot=media]) {
16
+ position: absolute;
17
+ inset: 0;
18
+ }
19
+ </style>
20
+ <slot name="media"></slot>
21
+ `;
22
+ }
23
+ };
24
+ var DailymotionVideo = class extends MediaAttachMixin(DailymotionCustomMediaElement) {
25
+ constructor() {
26
+ super();
27
+ this.adapter.addEventListener("volumechange", () => {
28
+ const { muted } = this.adapter;
29
+ if (this.hasAttribute("muted") !== muted) this.toggleAttribute("muted", muted);
30
+ });
31
+ }
32
+ connectedCallback() {
33
+ super.connectedCallback?.();
34
+ const existing = this.querySelector(":scope > [slot=media]");
35
+ if (existing) {
36
+ if (this.adapter.src && !existing.hasChildNodes() && !this.adapter.error) this.adapter.load();
37
+ return;
38
+ }
39
+ const container = document.createElement("div");
40
+ container.slot = "media";
41
+ this.append(container);
42
+ }
43
+ };
44
+ //#endregion
45
+ export { DailymotionVideo };
46
+
47
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../src/media/dailymotion-video/adapter.ts"],"sourcesContent":["import { DailymotionAdapter } from '@videojs/dailymotion-video';\nimport { CustomMediaElement } from '@videojs/media/dom';\n\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\n// `CustomMediaElement` implements `connectedCallback` but doesn't type it; declared so `super` can reach it.\ninterface DailymotionCustomMediaElement {\n connectedCallback?(): void;\n}\n\n// The target is a container the SDK builds its iframe in. `'iframe'` still tells `CustomMediaElement` it hosts an\n// embed: no attributes are mirrored onto the target, and the host is marked as a cross-origin frame. Unlike the other\n// embed hosts, it never keeps the player out of hit-testing: Dailymotion's terms forbid blocking any part of its player.\nclass DailymotionCustomMediaElement extends CustomMediaElement('iframe', DailymotionAdapter) {\n static override getTemplateHTML = (): string => /*html*/ `\n <style>\n :host {\n display: inline-block;\n min-width: 300px;\n min-height: 150px;\n position: relative;\n }\n ::slotted([slot=media]) {\n position: absolute;\n inset: 0;\n }\n </style>\n <slot name=\"media\"></slot>\n `;\n}\n\nexport class DailymotionVideo extends MediaAttachMixin(DailymotionCustomMediaElement) {\n constructor() {\n super();\n\n // Dailymotion can mute the player on its own (a browser's muted autoplay, a click on its own mute button). Writes\n // to `muted` go through the `muted` attribute, so it follows the player, or a later unmute would find nothing to\n // change. The attribute change sets the same value back, which the adapter ignores.\n this.adapter.addEventListener('volumechange', () => {\n const { muted } = this.adapter;\n\n if (this.hasAttribute('muted') !== muted) this.toggleAttribute('muted', muted);\n });\n }\n\n override connectedCallback(): void {\n super.connectedCallback?.();\n\n // The SDK finds the container by id from the document, so it lives in the light DOM, slotted as `media` to become\n // the adapter's target. Added here because a constructor may not add children.\n const existing = this.querySelector(':scope > [slot=media]');\n\n if (existing) {\n // Attached before the host was in the page, the container stayed empty; load the source now.\n if (this.adapter.src && !existing.hasChildNodes() && !this.adapter.error) this.adapter.load();\n\n return;\n }\n\n const container = document.createElement('div');\n\n container.slot = 'media';\n this.append(container);\n }\n}\n"],"mappings":";;;;AAaA,IAAM,gCAAN,cAA4C,mBAAmB,UAAU,kBAAkB,CAAC,CAAC;;EAClC,KAAA,wBAAA;;;;;;;;;;;;;;;;AAe3D;AAEA,IAAa,mBAAb,cAAsC,iBAAiB,6BAA6B,CAAC,CAAC;CACpF,cAAc;EACZ,MAAM;EAKN,KAAK,QAAQ,iBAAiB,sBAAsB;GAClD,MAAM,EAAE,UAAU,KAAK;GAEvB,IAAI,KAAK,aAAa,OAAO,MAAM,OAAO,KAAK,gBAAgB,SAAS,KAAK;EAC/E,CAAC;CACH;CAEA,oBAAmC;EACjC,MAAM,oBAAoB;EAI1B,MAAM,WAAW,KAAK,cAAc,uBAAuB;EAE3D,IAAI,UAAU;GAEZ,IAAI,KAAK,QAAQ,OAAO,CAAC,SAAS,cAAc,KAAK,CAAC,KAAK,QAAQ,OAAO,KAAK,QAAQ,KAAK;GAE5F;EACF;EAEA,MAAM,YAAY,SAAS,cAAc,KAAK;EAE9C,UAAU,OAAO;EACjB,KAAK,OAAO,SAAS;CACvB;AACF"}
@@ -0,0 +1,2 @@
1
+ import { DailymotionVideo } from "./adapter.js";
2
+ export { DailymotionVideo };
@@ -1,14 +1,7 @@
1
- import { getTemplateHTML } from "../background-video/template.js";
1
+ import { BackgroundVideoBase, BackgroundVideoOptOut } from "../background-video/base.js";
2
2
  import { Media } from "@videojs/media/dom";
3
- import { HlsVideoMediaError } from "@videojs/spf/adapters/hls-background-video";
3
+ import { HlsBackgroundVideoAdapter, HlsVideoMediaError } from "@videojs/spf/adapters/hls-background-video";
4
4
  //#region src/media/hls-background-video/adapter.d.ts
5
- interface LifecycleElement extends HTMLElement {
6
- connectedCallback?(): void;
7
- disconnectedCallback?(): void;
8
- adoptedCallback?(): void;
9
- attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;
10
- }
11
- declare const HlsBackgroundVideoBase: new () => LifecycleElement;
12
5
  /**
13
6
  * A muted, looping, chrome-less video over the SPF background-video engine.
14
7
  *
@@ -20,8 +13,9 @@ declare const HlsBackgroundVideoBase: new () => LifecycleElement;
20
13
  * package, whose `audio`, `debug`, `preload`, and `max-resolution` attributes are all deliberately absent. Capping
21
14
  * which rendition is fetched is a delivery param on the URL — `?max_resolution=720p` on a Mux stream, for one — which
22
15
  * keeps the renditions it excludes out of the manifest rather than merely unpicked; `preload` would have nothing to
23
- * say, since the engine loads from the moment it has a source. And unlike `<background-video>` there are no `nomuted` /
24
- * `noloop` / `noautoplay` opt-outs: those three are what this element is for, so the adapter fixes them on at attach.
16
+ * say, since the engine loads from the moment it has a source. Muted is fixed on: the engine drops audio, so there is
17
+ * nothing to unmute. `noloop` and `noautoplay` opt out as on `<background-video>`, so a page can play the video once,
18
+ * or hold it until it has checked the motion preference.
25
19
  *
26
20
  * Takes no structured `source` — `src` is an HLS URL, as the package it replaces required. Mux playback-ID identity,
27
21
  * poster, and storyboard belong to `<mux-video>`; none of them mean anything without controls to hang them on.
@@ -43,19 +37,20 @@ declare const HlsBackgroundVideoBase: new () => LifecycleElement;
43
37
  * `<mux-background-video>` is this element under the name the package it replaces used. Same class, so the tag is a
44
38
  * naming choice and nothing more.
45
39
  */
46
- export declare class HlsBackgroundVideo extends HlsBackgroundVideoBase {
40
+ export declare class HlsBackgroundVideo extends BackgroundVideoBase {
47
41
  #private;
48
- static shadowRootOptions: {
49
- mode: ShadowRootMode;
50
- };
51
- static getTemplateHTML: typeof getTemplateHTML;
52
- static get observedAttributes(): string[];
42
+ static optOuts: readonly BackgroundVideoOptOut[];
43
+ static passthroughAttributes: readonly string[];
53
44
  constructor();
54
45
  /** Register the Media (not the inner `<video>`) with the provider. */
55
46
  getMediaTarget(): Media | null;
47
+ /**
48
+ * The Media driving the inner `<video>`, matching `adapter` on `CustomMediaElement`. Call `adapter.destroy()` to
49
+ * release the engine after `keep-alive` kept it running past removal.
50
+ */
51
+ get adapter(): HlsBackgroundVideoAdapter;
56
52
  disconnectedCallback(): void;
57
- attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
58
- /** The inner `<video>` the engine renders into. */
53
+ /** Same element as `target`. */
59
54
  get video(): HTMLVideoElement | null;
60
55
  /**
61
56
  * What made the current source unplayable, or `null`. An SVTA code rather than a `MediaError` one — 99001 where this