@videojs/html 10.2.0 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/dist/default/define/audio/compat-skin.css +72 -5
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +23 -5
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +63 -4
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +21 -5
  8. package/dist/default/define/audio/skin2.js +1 -1
  9. package/dist/default/define/extensions/google-analytics.js +6 -0
  10. package/dist/default/define/live-audio/compat-skin.css +54 -5
  11. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  12. package/dist/default/define/live-audio/neutral-skin.css +8 -4
  13. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  14. package/dist/default/define/live-audio/scaffold-skin.css +45 -4
  15. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  16. package/dist/default/define/live-audio/skin.css +6 -4
  17. package/dist/default/define/live-audio/skin2.js +1 -1
  18. package/dist/default/define/live-video/compat-skin.css +115 -13
  19. package/dist/default/define/live-video/compat-skin2.js +1 -1
  20. package/dist/default/define/live-video/neutral-skin.css +82 -14
  21. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  22. package/dist/default/define/live-video/scaffold-skin.css +95 -13
  23. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  24. package/dist/default/define/live-video/skin.css +96 -16
  25. package/dist/default/define/live-video/skin2.js +1 -1
  26. package/dist/default/define/media/dailymotion-video.js +11 -0
  27. package/dist/default/define/media/mixcloud-audio.js +11 -0
  28. package/dist/default/define/media/soundcloud-audio.js +11 -0
  29. package/dist/default/define/video/compat-skin.css +115 -13
  30. package/dist/default/define/video/compat-skin2.js +1 -1
  31. package/dist/default/define/video/neutral-skin.css +83 -14
  32. package/dist/default/define/video/neutral-skin2.js +1 -1
  33. package/dist/default/define/video/scaffold-skin.css +95 -13
  34. package/dist/default/define/video/scaffold-skin2.js +1 -1
  35. package/dist/default/define/video/skin.css +94 -16
  36. package/dist/default/define/video/skin2.js +1 -1
  37. package/dist/default/extensions/google-analytics/extension.js +75 -0
  38. package/dist/default/extensions/mux-data/extension.js +7 -2
  39. package/dist/default/internal/skins/compat-audio/skin.css +72 -5
  40. package/dist/default/internal/skins/compat-audio/template.js +1 -1
  41. package/dist/default/internal/skins/compat-live-audio/skin.css +54 -5
  42. package/dist/default/internal/skins/compat-live-video/skin.css +115 -13
  43. package/dist/default/internal/skins/compat-video/skin.css +115 -13
  44. package/dist/default/internal/skins/default-audio/skin.css +21 -5
  45. package/dist/default/internal/skins/default-live-audio/skin.css +6 -4
  46. package/dist/default/internal/skins/default-live-video/skin.css +96 -16
  47. package/dist/default/internal/skins/default-video/skin.css +94 -16
  48. package/dist/default/internal/skins/neutral-audio/skin.css +23 -5
  49. package/dist/default/internal/skins/neutral-live-audio/skin.css +8 -4
  50. package/dist/default/internal/skins/neutral-live-video/skin.css +82 -14
  51. package/dist/default/internal/skins/neutral-video/skin.css +83 -14
  52. package/dist/default/internal/skins/scaffold-audio/skin.css +63 -4
  53. package/dist/default/internal/skins/scaffold-audio/template.js +1 -1
  54. package/dist/default/internal/skins/scaffold-live-audio/skin.css +45 -4
  55. package/dist/default/internal/skins/scaffold-live-video/skin.css +95 -13
  56. package/dist/default/internal/skins/scaffold-video/skin.css +95 -13
  57. package/dist/default/media/dailymotion-video/adapter.js +31 -0
  58. package/dist/default/media/hls-background-video/adapter.js +7 -0
  59. package/dist/default/media/mixcloud-audio/adapter.js +16 -0
  60. package/dist/default/media/soundcloud-audio/adapter.js +16 -0
  61. package/dist/default/player/element.js +1 -5
  62. package/dist/default/presets/background/skin.js +2 -2
  63. package/dist/default/presets/skin.js +4 -3
  64. package/dist/default/ui/dialog/element.js +13 -1
  65. package/dist/default/ui/gesture/element.js +3 -0
  66. package/dist/default/ui/media-button-element.js +10 -1
  67. package/dist/default/ui/playback-rate-button/element.js +7 -2
  68. package/dist/default/ui/playback-rate-radio-group/element.js +10 -3
  69. package/dist/default/ui/radio-options/controller.js +18 -5
  70. package/dist/default/version.js +1 -1
  71. package/dist/dev/define/audio/compat-skin.css +72 -5
  72. package/dist/dev/define/audio/compat-skin2.js +1 -1
  73. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  74. package/dist/dev/define/audio/neutral-skin.css +23 -5
  75. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  76. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  77. package/dist/dev/define/audio/scaffold-skin.css +63 -4
  78. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  79. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  80. package/dist/dev/define/audio/skin.css +21 -5
  81. package/dist/dev/define/audio/skin2.js +1 -1
  82. package/dist/dev/define/audio/skin2.js.map +1 -1
  83. package/dist/dev/define/extensions/google-analytics.d.ts +11 -0
  84. package/dist/dev/define/extensions/google-analytics.js +8 -0
  85. package/dist/dev/define/extensions/google-analytics.js.map +1 -0
  86. package/dist/dev/define/live-audio/compat-skin.css +54 -5
  87. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  88. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  89. package/dist/dev/define/live-audio/neutral-skin.css +8 -4
  90. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  91. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  92. package/dist/dev/define/live-audio/scaffold-skin.css +45 -4
  93. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  94. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  95. package/dist/dev/define/live-audio/skin.css +6 -4
  96. package/dist/dev/define/live-audio/skin2.js +1 -1
  97. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  98. package/dist/dev/define/live-video/compat-skin.css +115 -13
  99. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  100. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  101. package/dist/dev/define/live-video/neutral-skin.css +82 -14
  102. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  103. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  104. package/dist/dev/define/live-video/scaffold-skin.css +95 -13
  105. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  106. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  107. package/dist/dev/define/live-video/skin.css +96 -16
  108. package/dist/dev/define/live-video/skin2.js +1 -1
  109. package/dist/dev/define/live-video/skin2.js.map +1 -1
  110. package/dist/dev/define/media/dailymotion-video.d.ts +15 -0
  111. package/dist/dev/define/media/dailymotion-video.js +13 -0
  112. package/dist/dev/define/media/dailymotion-video.js.map +1 -0
  113. package/dist/dev/define/media/mixcloud-audio.d.ts +15 -0
  114. package/dist/dev/define/media/mixcloud-audio.js +13 -0
  115. package/dist/dev/define/media/mixcloud-audio.js.map +1 -0
  116. package/dist/dev/define/media/soundcloud-audio.d.ts +15 -0
  117. package/dist/dev/define/media/soundcloud-audio.js +13 -0
  118. package/dist/dev/define/media/soundcloud-audio.js.map +1 -0
  119. package/dist/dev/define/video/compat-skin.css +115 -13
  120. package/dist/dev/define/video/compat-skin2.js +1 -1
  121. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  122. package/dist/dev/define/video/neutral-skin.css +83 -14
  123. package/dist/dev/define/video/neutral-skin2.js +1 -1
  124. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  125. package/dist/dev/define/video/scaffold-skin.css +95 -13
  126. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  127. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  128. package/dist/dev/define/video/skin.css +94 -16
  129. package/dist/dev/define/video/skin2.js +1 -1
  130. package/dist/dev/define/video/skin2.js.map +1 -1
  131. package/dist/dev/extensions/google-analytics/extension.d.ts +52 -0
  132. package/dist/dev/extensions/google-analytics/extension.js +77 -0
  133. package/dist/dev/extensions/google-analytics/extension.js.map +1 -0
  134. package/dist/dev/extensions/google-analytics/index.d.ts +2 -0
  135. package/dist/dev/extensions/mux-data/extension.d.ts +4 -1
  136. package/dist/dev/extensions/mux-data/extension.js +7 -2
  137. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  138. package/dist/dev/index.d.ts +3 -3
  139. package/dist/dev/internal/skins/compat-audio/skin.css +72 -5
  140. package/dist/dev/internal/skins/compat-audio/template.js +1 -1
  141. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  142. package/dist/dev/internal/skins/compat-live-audio/skin.css +54 -5
  143. package/dist/dev/internal/skins/compat-live-video/skin.css +115 -13
  144. package/dist/dev/internal/skins/compat-video/skin.css +115 -13
  145. package/dist/dev/internal/skins/default-audio/skin.css +21 -5
  146. package/dist/dev/internal/skins/default-live-audio/skin.css +6 -4
  147. package/dist/dev/internal/skins/default-live-video/skin.css +96 -16
  148. package/dist/dev/internal/skins/default-video/skin.css +94 -16
  149. package/dist/dev/internal/skins/neutral-audio/skin.css +23 -5
  150. package/dist/dev/internal/skins/neutral-live-audio/skin.css +8 -4
  151. package/dist/dev/internal/skins/neutral-live-video/skin.css +82 -14
  152. package/dist/dev/internal/skins/neutral-video/skin.css +83 -14
  153. package/dist/dev/internal/skins/scaffold-audio/skin.css +63 -4
  154. package/dist/dev/internal/skins/scaffold-audio/template.js +1 -1
  155. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -1
  156. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +45 -4
  157. package/dist/dev/internal/skins/scaffold-live-video/skin.css +95 -13
  158. package/dist/dev/internal/skins/scaffold-video/skin.css +95 -13
  159. package/dist/dev/media/dailymotion-video/adapter.d.ts +17 -0
  160. package/dist/dev/media/dailymotion-video/adapter.js +47 -0
  161. package/dist/dev/media/dailymotion-video/adapter.js.map +1 -0
  162. package/dist/dev/media/dailymotion-video/index.d.ts +2 -0
  163. package/dist/dev/media/hls-background-video/adapter.d.ts +6 -1
  164. package/dist/dev/media/hls-background-video/adapter.js +7 -0
  165. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  166. package/dist/dev/media/mixcloud-audio/adapter.d.ts +11 -0
  167. package/dist/dev/media/mixcloud-audio/adapter.js +52 -0
  168. package/dist/dev/media/mixcloud-audio/adapter.js.map +1 -0
  169. package/dist/dev/media/mixcloud-audio/index.d.ts +2 -0
  170. package/dist/dev/media/soundcloud-audio/adapter.d.ts +11 -0
  171. package/dist/dev/media/soundcloud-audio/adapter.js +53 -0
  172. package/dist/dev/media/soundcloud-audio/adapter.js.map +1 -0
  173. package/dist/dev/media/soundcloud-audio/index.d.ts +2 -0
  174. package/dist/dev/player/element.js +1 -5
  175. package/dist/dev/player/element.js.map +1 -1
  176. package/dist/dev/presets/background/skin.d.ts +2 -1
  177. package/dist/dev/presets/background/skin.js +2 -2
  178. package/dist/dev/presets/background/skin.js.map +1 -1
  179. package/dist/dev/presets/skin.d.ts +4 -3
  180. package/dist/dev/presets/skin.js +4 -3
  181. package/dist/dev/presets/skin.js.map +1 -1
  182. package/dist/dev/ui/dialog/element.js +13 -1
  183. package/dist/dev/ui/dialog/element.js.map +1 -1
  184. package/dist/dev/ui/gesture/element.js +3 -0
  185. package/dist/dev/ui/gesture/element.js.map +1 -1
  186. package/dist/dev/ui/media-button-element.d.ts +9 -0
  187. package/dist/dev/ui/media-button-element.js +10 -1
  188. package/dist/dev/ui/media-button-element.js.map +1 -1
  189. package/dist/dev/ui/play-button/element.d.ts +2 -0
  190. package/dist/dev/ui/playback-rate-button/element.d.ts +9 -1
  191. package/dist/dev/ui/playback-rate-button/element.js +7 -2
  192. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  193. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -0
  194. package/dist/dev/ui/playback-rate-radio-group/element.js +10 -3
  195. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  196. package/dist/dev/ui/radio-options/controller.js +18 -5
  197. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  198. package/dist/dev/version.js +1 -1
  199. package/docs/README.md +1 -1
  200. package/docs/guides/autoplay.md +1 -1
  201. package/docs/guides/browser-support.md +2 -0
  202. package/docs/guides/build-your-own-skin.md +3 -1
  203. package/docs/guides/cdn.md +10 -9
  204. package/docs/guides/content-security-policy.md +3 -0
  205. package/docs/guides/customize-skins.md +4 -2
  206. package/docs/guides/features.md +1 -1
  207. package/docs/guides/google-analytics.md +199 -0
  208. package/docs/guides/installation-cdn.md +4 -4
  209. package/docs/guides/installation-shadcn.md +3 -3
  210. package/docs/guides/installation-svelte.md +4 -4
  211. package/docs/guides/installation-vue.md +4 -4
  212. package/docs/guides/installation.md +4 -4
  213. package/docs/guides/internationalization.md +5 -5
  214. package/docs/guides/keyboard-shortcuts.md +1 -1
  215. package/docs/guides/llms.txt +2 -1
  216. package/docs/guides/media-sources.md +3 -0
  217. package/docs/guides/migrate-from-media-chrome.md +4 -4
  218. package/docs/guides/migrate-from-mux-player.md +9 -9
  219. package/docs/guides/migrate-from-plyr.md +8 -8
  220. package/docs/guides/migrate-from-video-js-8.md +8 -9
  221. package/docs/guides/migrate-from-vidstack.md +8 -8
  222. package/docs/guides/mux-data.md +22 -0
  223. package/docs/guides/presets.md +1 -1
  224. package/docs/guides/self-hosting.md +5 -5
  225. package/docs/guides/skins.md +16 -1
  226. package/docs/guides/ui-components.md +1 -1
  227. package/docs/llms.txt +10 -5
  228. package/docs/reference/api/feature-playback-rate.md +54 -3
  229. package/docs/reference/api/feature-playback.md +5 -1
  230. package/docs/reference/api/html-create-player.md +2 -2
  231. package/docs/reference/api/llms.txt +1 -1
  232. package/docs/reference/api/media-capabilities.md +1 -1
  233. package/docs/reference/api/player-store.md +6 -3
  234. package/docs/reference/api/preset-audio.md +13 -5
  235. package/docs/reference/api/preset-background.md +2 -2
  236. package/docs/reference/api/preset-live-audio.md +13 -5
  237. package/docs/reference/api/preset-live-video.md +13 -5
  238. package/docs/reference/api/preset-video.md +13 -5
  239. package/docs/reference/api/resolve-adapter-type.md +4 -1
  240. package/docs/reference/api/ui-element.md +2 -2
  241. package/docs/reference/components/alert-dialog.md +21 -16
  242. package/docs/reference/components/audio-compat-skin.md +8 -2
  243. package/docs/reference/components/audio-neutral-skin.md +2 -2
  244. package/docs/reference/components/audio-scaffold-skin.md +2 -2
  245. package/docs/reference/components/audio-skin.md +2 -2
  246. package/docs/reference/components/audio-track-radio-group.md +2 -2
  247. package/docs/reference/components/background-video-skin.md +1 -1
  248. package/docs/reference/components/background-video.md +1 -1
  249. package/docs/reference/components/buffering-indicator.md +2 -2
  250. package/docs/reference/components/captions-radio-group.md +2 -2
  251. package/docs/reference/components/cloudflare-video.md +1 -1
  252. package/docs/reference/components/dailymotion-video.md +192 -0
  253. package/docs/reference/components/dash-video.md +2 -1
  254. package/docs/reference/components/dialog.md +49 -22
  255. package/docs/reference/components/error-dialog.md +13 -10
  256. package/docs/reference/components/gesture.md +2 -2
  257. package/docs/reference/components/google-analytics.md +51 -0
  258. package/docs/reference/components/google-cast.md +1 -1
  259. package/docs/reference/components/hls-audio.md +1 -1
  260. package/docs/reference/components/hls-background-video.md +4 -1
  261. package/docs/reference/components/hls-video.md +1 -1
  262. package/docs/reference/components/hlsjs-video.md +3 -1
  263. package/docs/reference/components/hotkey.md +2 -2
  264. package/docs/reference/components/live-audio-compat-skin.md +8 -2
  265. package/docs/reference/components/live-audio-neutral-skin.md +2 -2
  266. package/docs/reference/components/live-audio-scaffold-skin.md +2 -2
  267. package/docs/reference/components/live-audio-skin.md +2 -2
  268. package/docs/reference/components/live-video-compat-skin.md +8 -2
  269. package/docs/reference/components/live-video-neutral-skin.md +2 -2
  270. package/docs/reference/components/live-video-scaffold-skin.md +2 -2
  271. package/docs/reference/components/live-video-skin.md +2 -2
  272. package/docs/reference/components/llms.txt +9 -5
  273. package/docs/reference/components/mixcloud-audio.md +203 -0
  274. package/docs/reference/components/mux-audio.md +3 -1
  275. package/docs/reference/components/mux-background-video.md +1 -1
  276. package/docs/reference/components/mux-data.md +20 -2
  277. package/docs/reference/components/mux-video.md +3 -1
  278. package/docs/reference/components/native-hls-video.md +2 -1
  279. package/docs/reference/components/play-button.md +7 -5
  280. package/docs/reference/components/playback-rate-button.md +26 -7
  281. package/docs/reference/components/playback-rate-radio-group.md +7 -4
  282. package/docs/reference/components/player.md +3 -3
  283. package/docs/reference/components/playerjs-video.md +1 -1
  284. package/docs/reference/components/quality-radio-group.md +2 -2
  285. package/docs/reference/components/shaka-video.md +2 -1
  286. package/docs/reference/components/soundcloud-audio.md +227 -0
  287. package/docs/reference/components/spotify-audio.md +2 -2
  288. package/docs/reference/components/tiktok-video.md +2 -2
  289. package/docs/reference/components/twitch-video.md +2 -3
  290. package/docs/reference/components/video-compat-skin.md +8 -2
  291. package/docs/reference/components/video-neutral-skin.md +2 -2
  292. package/docs/reference/components/video-scaffold-skin.md +2 -2
  293. package/docs/reference/components/video-skin.md +2 -2
  294. package/docs/reference/components/vimeo-video.md +2 -1
  295. package/docs/reference/components/wistia-video.md +1 -1
  296. package/docs/reference/components/youtube-video.md +2 -1
  297. package/package.json +60 -40
@@ -223,6 +223,10 @@
223
223
  display: none;
224
224
  }
225
225
 
226
+ :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-dialog-backdrop[data-scope="document"] {
227
+ position: fixed;
228
+ }
229
+
226
230
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-dialog-close {
227
231
  height: calc(var(--media-spacing) * 8);
228
232
  width: auto;
@@ -268,6 +272,11 @@
268
272
  outline-color: var(--media-ring);
269
273
  }
270
274
 
275
+ :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-dialog-popup[data-scope="document"] {
276
+ max-height: calc(100dvh - var(--media-spacing) * 8);
277
+ position: fixed;
278
+ }
279
+
271
280
  @media (forced-colors: active) {
272
281
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-dialog-popup {
273
282
  border: 1px solid canvastext;
@@ -394,6 +403,18 @@
394
403
  overflow: hidden;
395
404
  }
396
405
 
406
+ .media-poster > slot::slotted(img) {
407
+ object-fit: var(--media-object-fit, contain);
408
+ object-position: var(--media-object-position, center);
409
+ width: 100%;
410
+ display: block;
411
+ height: 100% !important;
412
+ }
413
+
414
+ .media-poster > slot::slotted(img:not([src]):not([srcset])) {
415
+ visibility: hidden;
416
+ }
417
+
397
418
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-poster {
398
419
  width: 100%;
399
420
  height: 100%;
@@ -565,8 +586,13 @@
565
586
  }
566
587
 
567
588
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-tooltip-shortcut {
589
+ text-align: center;
590
+ min-width: 1.5em;
568
591
  font-family: inherit;
569
592
  font-size: calc(var(--media-spacing) * 2.75);
593
+ background-color: oklab(100% 0 5.96046e-8 / .1);
594
+ padding: .1em;
595
+ line-height: 1.25;
570
596
  }
571
597
 
572
598
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-button-icon {
@@ -623,6 +649,10 @@
623
649
  outline: 2px solid;
624
650
  }
625
651
 
652
+ :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-menu-radio-item[data-custom] {
653
+ font-style: italic;
654
+ }
655
+
626
656
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-menu-radio-item[data-highlighted] {
627
657
  background-color: var(--media-button-highlight);
628
658
  }
@@ -1545,7 +1575,7 @@
1545
1575
 
1546
1576
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .video-controls-backdrop {
1547
1577
  pointer-events: none;
1548
- background-color: #0006;
1578
+ background-image: linear-gradient(to top, #00000080, #0000 40% 60%, #0006);
1549
1579
  position: absolute;
1550
1580
  inset: 0;
1551
1581
  }
@@ -1563,6 +1593,9 @@
1563
1593
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-container, :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]).media-container {
1564
1594
  border-radius: var(--media-video-border-radius);
1565
1595
  width: 100%;
1596
+ min-width: 0;
1597
+ height: 100%;
1598
+ min-height: 0;
1566
1599
  font-family: var(--media-font-family, inherit);
1567
1600
  font-size: calc(var(--media-spacing) * 3.25);
1568
1601
  color: var(--media-foreground);
@@ -1582,9 +1615,19 @@
1582
1615
  }
1583
1616
 
1584
1617
  :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]) .media-video, :where(.media-skin[data-theme="scaffold"][data-preset="live-video"]).media-video {
1585
- aspect-ratio: 16 / 9;
1586
1618
  background-color: #000;
1587
1619
  }
1620
+
1621
+ .media-container > slot::slotted(video), :scope.media-container > slot::slotted(video) {
1622
+ border-radius: inherit;
1623
+ object-fit: var(--media-object-fit, contain);
1624
+ object-position: var(--media-object-position, center);
1625
+ width: 100%;
1626
+ max-width: 100%;
1627
+ margin: 0;
1628
+ display: block;
1629
+ height: 100% !important;
1630
+ }
1588
1631
  }
1589
1632
 
1590
1633
  @layer utilities;
@@ -1602,7 +1645,7 @@
1602
1645
  --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1603
1646
  --media-accent-foreground: var(--media-accent-text-color, currentColor);
1604
1647
  --media-muted: oklch(100% 0 0 / .15);
1605
- --media-muted-foreground: oklch(100% 0 0 / .65);
1648
+ --media-muted-foreground: color-mix(in oklab, var(--media-foreground) 65%, transparent);
1606
1649
  --media-border: oklch(0% 0 0 / .1);
1607
1650
  --media-ring: oklch(100% 0 0);
1608
1651
  --media-backdrop: oklch(0% 0 0);
@@ -1615,9 +1658,9 @@
1615
1658
  --media-shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - .5) * .5), .15));
1616
1659
  --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1617
1660
  --media-text-shadow-dialog: 0 1px 0 #00000040;
1618
- --media-backdrop-filter-surface: blur(16px) saturate(110%);
1661
+ --media-backdrop-filter-surface: blur(16px) saturate(125%);
1619
1662
  --media-backdrop-filter-indicator: blur(8px);
1620
- --media-backdrop-filter-dialog: blur(16px) saturate(110%);
1663
+ --media-backdrop-filter-dialog: blur(16px) saturate(125%);
1621
1664
  --media-control-corner-shape: round;
1622
1665
  --media-control-radius: 99px;
1623
1666
  --media-control-size: calc(var(--media-spacing) * 9);
@@ -1717,10 +1760,20 @@
1717
1760
  @layer base.preset {
1718
1761
  .media-skin:is([data-preset="video"], [data-preset="live-video"]) {
1719
1762
  --media-frame-border: var(--media-border-color, #0000001a);
1763
+ --media-controls-gradient-height: max(40%, calc(var(--media-spacing) * 40));
1764
+ --media-controls-bottom-gradient-height: max(50%, calc(var(--media-spacing) * 60));
1720
1765
  --media-controls-gradient: linear-gradient(to top,
1721
- color-mix(in oklab, var(--media-backdrop) 40%, transparent),
1722
- color-mix(in oklab, var(--media-backdrop) 20%, transparent),
1723
- color-mix(in oklab, var(--media-backdrop) 50%, transparent));
1766
+ color-mix(in oklab, var(--media-backdrop) 60%, transparent),
1767
+ color-mix(in oklab, var(--media-backdrop) 50.7%, transparent) 25%,
1768
+ color-mix(in oklab, var(--media-backdrop) 30%, transparent) 50%,
1769
+ color-mix(in oklab, var(--media-backdrop) 9.3%, transparent) 75%,
1770
+ transparent);
1771
+ --media-controls-top-gradient: linear-gradient(to bottom,
1772
+ color-mix(in oklab, var(--media-backdrop) 55%, transparent),
1773
+ color-mix(in oklab, var(--media-backdrop) 46.48%, transparent) 25%,
1774
+ color-mix(in oklab, var(--media-backdrop) 27.5%, transparent) 50%,
1775
+ color-mix(in oklab, var(--media-backdrop) 8.53%, transparent) 75%,
1776
+ transparent);
1724
1777
  --media-caption-controls-y: calc(var(--media-spacing) * -16);
1725
1778
  --media-slider-preview-offset: calc(var(--media-spacing) * 9);
1726
1779
  --media-thumbnail-gradient: linear-gradient(to top,
@@ -1732,9 +1785,17 @@
1732
1785
  @supports (color: oklch(from red l c h)) and (background-image: linear-gradient(in oklab, red, red)) {
1733
1786
  .media-skin:is([data-preset="video"], [data-preset="live-video"]) {
1734
1787
  --media-controls-gradient: linear-gradient(to top in oklab,
1735
- oklch(from var(--media-backdrop) l c h / .4),
1736
- oklch(from var(--media-backdrop) l c h / .2),
1737
- oklch(from var(--media-backdrop) l c h / .5));
1788
+ oklch(from var(--media-backdrop) l c h / .6),
1789
+ oklch(from var(--media-backdrop) l c h / .507) 25%,
1790
+ oklch(from var(--media-backdrop) l c h / .3) 50%,
1791
+ oklch(from var(--media-backdrop) l c h / .093) 75%,
1792
+ transparent);
1793
+ --media-controls-top-gradient: linear-gradient(to bottom in oklab,
1794
+ oklch(from var(--media-backdrop) l c h / .55),
1795
+ oklch(from var(--media-backdrop) l c h / .4647) 25%,
1796
+ oklch(from var(--media-backdrop) l c h / .275) 50%,
1797
+ oklch(from var(--media-backdrop) l c h / .0853) 75%,
1798
+ transparent);
1738
1799
  }
1739
1800
  }
1740
1801
 
@@ -1749,9 +1810,20 @@
1749
1810
 
1750
1811
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="neutral"] {
1751
1812
  --media-frame-border: var(--media-border-color, #00000026);
1813
+ --media-controls-gradient-height: 40%;
1814
+ --media-controls-bottom-gradient-height: 40%;
1752
1815
  --media-controls-gradient: linear-gradient(to top,
1753
1816
  color-mix(in oklab, var(--media-backdrop) 50%, transparent),
1754
- color-mix(in oklab, var(--media-backdrop) 20%, transparent));
1817
+ color-mix(in oklab, var(--media-backdrop) 42.2%, transparent) 25%,
1818
+ color-mix(in oklab, var(--media-backdrop) 25%, transparent) 50%,
1819
+ color-mix(in oklab, var(--media-backdrop) 7.8%, transparent) 75%,
1820
+ transparent);
1821
+ --media-controls-top-gradient: linear-gradient(to bottom,
1822
+ color-mix(in oklab, var(--media-backdrop) 50%, transparent),
1823
+ color-mix(in oklab, var(--media-backdrop) 42.2%, transparent) 25%,
1824
+ color-mix(in oklab, var(--media-backdrop) 25%, transparent) 50%,
1825
+ color-mix(in oklab, var(--media-backdrop) 7.8%, transparent) 75%,
1826
+ transparent);
1755
1827
  --media-indicator-gradient: linear-gradient(to bottom,
1756
1828
  color-mix(in oklab, var(--media-backdrop) 35%, transparent),
1757
1829
  color-mix(in oklab, var(--media-backdrop) 20%, transparent) calc(var(--media-spacing) * 12),
@@ -1761,6 +1833,7 @@
1761
1833
  }
1762
1834
 
1763
1835
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="compat"] {
1836
+ --media-controls-gradient: linear-gradient(to top, #00000080, transparent 40% 60%, #0006);
1764
1837
  --media-caption-controls-y: calc(var(--media-spacing) * -18);
1765
1838
  }
1766
1839
 
@@ -1772,7 +1845,16 @@
1772
1845
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="neutral"] {
1773
1846
  --media-controls-gradient: linear-gradient(to top in oklab,
1774
1847
  oklch(from var(--media-backdrop) l c h / .5),
1775
- oklch(from var(--media-backdrop) l c h / .2));
1848
+ oklch(from var(--media-backdrop) l c h / .422) 25%,
1849
+ oklch(from var(--media-backdrop) l c h / .25) 50%,
1850
+ oklch(from var(--media-backdrop) l c h / .078) 75%,
1851
+ transparent);
1852
+ --media-controls-top-gradient: linear-gradient(to bottom in oklab,
1853
+ oklch(from var(--media-backdrop) l c h / .5),
1854
+ oklch(from var(--media-backdrop) l c h / .422) 25%,
1855
+ oklch(from var(--media-backdrop) l c h / .25) 50%,
1856
+ oklch(from var(--media-backdrop) l c h / .078) 75%,
1857
+ transparent);
1776
1858
  }
1777
1859
  }
1778
1860
 
@@ -223,6 +223,10 @@
223
223
  display: none;
224
224
  }
225
225
 
226
+ :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-dialog-backdrop[data-scope="document"] {
227
+ position: fixed;
228
+ }
229
+
226
230
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-dialog-close {
227
231
  height: calc(var(--media-spacing) * 8);
228
232
  width: auto;
@@ -268,6 +272,11 @@
268
272
  outline-color: var(--media-ring);
269
273
  }
270
274
 
275
+ :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-dialog-popup[data-scope="document"] {
276
+ max-height: calc(100dvh - var(--media-spacing) * 8);
277
+ position: fixed;
278
+ }
279
+
271
280
  @media (forced-colors: active) {
272
281
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-dialog-popup {
273
282
  border: 1px solid canvastext;
@@ -431,6 +440,18 @@
431
440
  overflow: hidden;
432
441
  }
433
442
 
443
+ .media-poster > slot::slotted(img) {
444
+ object-fit: var(--media-object-fit, contain);
445
+ object-position: var(--media-object-position, center);
446
+ width: 100%;
447
+ display: block;
448
+ height: 100% !important;
449
+ }
450
+
451
+ .media-poster > slot::slotted(img:not([src]):not([srcset])) {
452
+ visibility: hidden;
453
+ }
454
+
434
455
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-poster {
435
456
  width: 100%;
436
457
  height: 100%;
@@ -602,8 +623,13 @@
602
623
  }
603
624
 
604
625
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-tooltip-shortcut {
626
+ text-align: center;
627
+ min-width: 1.5em;
605
628
  font-family: inherit;
606
629
  font-size: calc(var(--media-spacing) * 2.75);
630
+ background-color: oklab(100% 0 5.96046e-8 / .1);
631
+ padding: .1em;
632
+ line-height: 1.25;
607
633
  }
608
634
 
609
635
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-button-icon {
@@ -676,6 +702,10 @@
676
702
  outline: 2px solid;
677
703
  }
678
704
 
705
+ :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-menu-radio-item[data-custom] {
706
+ font-style: italic;
707
+ }
708
+
679
709
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-menu-radio-item[data-highlighted] {
680
710
  background-color: var(--media-button-highlight);
681
711
  }
@@ -1768,7 +1798,7 @@
1768
1798
 
1769
1799
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .video-controls-backdrop {
1770
1800
  pointer-events: none;
1771
- background-color: #0006;
1801
+ background-image: linear-gradient(to top, #00000080, #0000 40% 60%, #0006);
1772
1802
  position: absolute;
1773
1803
  inset: 0;
1774
1804
  }
@@ -1803,6 +1833,9 @@
1803
1833
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-container, :where(.media-skin[data-theme="scaffold"][data-preset="video"]).media-container {
1804
1834
  border-radius: var(--media-video-border-radius);
1805
1835
  width: 100%;
1836
+ min-width: 0;
1837
+ height: 100%;
1838
+ min-height: 0;
1806
1839
  font-family: var(--media-font-family, inherit);
1807
1840
  font-size: calc(var(--media-spacing) * 3.25);
1808
1841
  color: var(--media-foreground);
@@ -1822,9 +1855,19 @@
1822
1855
  }
1823
1856
 
1824
1857
  :where(.media-skin[data-theme="scaffold"][data-preset="video"]) .media-video, :where(.media-skin[data-theme="scaffold"][data-preset="video"]).media-video {
1825
- aspect-ratio: 16 / 9;
1826
1858
  background-color: #000;
1827
1859
  }
1860
+
1861
+ .media-container > slot::slotted(video), :scope.media-container > slot::slotted(video) {
1862
+ border-radius: inherit;
1863
+ object-fit: var(--media-object-fit, contain);
1864
+ object-position: var(--media-object-position, center);
1865
+ width: 100%;
1866
+ max-width: 100%;
1867
+ margin: 0;
1868
+ display: block;
1869
+ height: 100% !important;
1870
+ }
1828
1871
  }
1829
1872
 
1830
1873
  @layer utilities;
@@ -1842,7 +1885,7 @@
1842
1885
  --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1843
1886
  --media-accent-foreground: var(--media-accent-text-color, currentColor);
1844
1887
  --media-muted: oklch(100% 0 0 / .15);
1845
- --media-muted-foreground: oklch(100% 0 0 / .65);
1888
+ --media-muted-foreground: color-mix(in oklab, var(--media-foreground) 65%, transparent);
1846
1889
  --media-border: oklch(0% 0 0 / .1);
1847
1890
  --media-ring: oklch(100% 0 0);
1848
1891
  --media-backdrop: oklch(0% 0 0);
@@ -1855,9 +1898,9 @@
1855
1898
  --media-shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - .5) * .5), .15));
1856
1899
  --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1857
1900
  --media-text-shadow-dialog: 0 1px 0 #00000040;
1858
- --media-backdrop-filter-surface: blur(16px) saturate(110%);
1901
+ --media-backdrop-filter-surface: blur(16px) saturate(125%);
1859
1902
  --media-backdrop-filter-indicator: blur(8px);
1860
- --media-backdrop-filter-dialog: blur(16px) saturate(110%);
1903
+ --media-backdrop-filter-dialog: blur(16px) saturate(125%);
1861
1904
  --media-control-corner-shape: round;
1862
1905
  --media-control-radius: 99px;
1863
1906
  --media-control-size: calc(var(--media-spacing) * 9);
@@ -1957,10 +2000,20 @@
1957
2000
  @layer base.preset {
1958
2001
  .media-skin:is([data-preset="video"], [data-preset="live-video"]) {
1959
2002
  --media-frame-border: var(--media-border-color, #0000001a);
2003
+ --media-controls-gradient-height: max(40%, calc(var(--media-spacing) * 40));
2004
+ --media-controls-bottom-gradient-height: max(50%, calc(var(--media-spacing) * 60));
1960
2005
  --media-controls-gradient: linear-gradient(to top,
1961
- color-mix(in oklab, var(--media-backdrop) 40%, transparent),
1962
- color-mix(in oklab, var(--media-backdrop) 20%, transparent),
1963
- color-mix(in oklab, var(--media-backdrop) 50%, transparent));
2006
+ color-mix(in oklab, var(--media-backdrop) 60%, transparent),
2007
+ color-mix(in oklab, var(--media-backdrop) 50.7%, transparent) 25%,
2008
+ color-mix(in oklab, var(--media-backdrop) 30%, transparent) 50%,
2009
+ color-mix(in oklab, var(--media-backdrop) 9.3%, transparent) 75%,
2010
+ transparent);
2011
+ --media-controls-top-gradient: linear-gradient(to bottom,
2012
+ color-mix(in oklab, var(--media-backdrop) 55%, transparent),
2013
+ color-mix(in oklab, var(--media-backdrop) 46.48%, transparent) 25%,
2014
+ color-mix(in oklab, var(--media-backdrop) 27.5%, transparent) 50%,
2015
+ color-mix(in oklab, var(--media-backdrop) 8.53%, transparent) 75%,
2016
+ transparent);
1964
2017
  --media-caption-controls-y: calc(var(--media-spacing) * -16);
1965
2018
  --media-slider-preview-offset: calc(var(--media-spacing) * 9);
1966
2019
  --media-thumbnail-gradient: linear-gradient(to top,
@@ -1972,9 +2025,17 @@
1972
2025
  @supports (color: oklch(from red l c h)) and (background-image: linear-gradient(in oklab, red, red)) {
1973
2026
  .media-skin:is([data-preset="video"], [data-preset="live-video"]) {
1974
2027
  --media-controls-gradient: linear-gradient(to top in oklab,
1975
- oklch(from var(--media-backdrop) l c h / .4),
1976
- oklch(from var(--media-backdrop) l c h / .2),
1977
- oklch(from var(--media-backdrop) l c h / .5));
2028
+ oklch(from var(--media-backdrop) l c h / .6),
2029
+ oklch(from var(--media-backdrop) l c h / .507) 25%,
2030
+ oklch(from var(--media-backdrop) l c h / .3) 50%,
2031
+ oklch(from var(--media-backdrop) l c h / .093) 75%,
2032
+ transparent);
2033
+ --media-controls-top-gradient: linear-gradient(to bottom in oklab,
2034
+ oklch(from var(--media-backdrop) l c h / .55),
2035
+ oklch(from var(--media-backdrop) l c h / .4647) 25%,
2036
+ oklch(from var(--media-backdrop) l c h / .275) 50%,
2037
+ oklch(from var(--media-backdrop) l c h / .0853) 75%,
2038
+ transparent);
1978
2039
  }
1979
2040
  }
1980
2041
 
@@ -1989,9 +2050,20 @@
1989
2050
 
1990
2051
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="neutral"] {
1991
2052
  --media-frame-border: var(--media-border-color, #00000026);
2053
+ --media-controls-gradient-height: 40%;
2054
+ --media-controls-bottom-gradient-height: 40%;
1992
2055
  --media-controls-gradient: linear-gradient(to top,
1993
2056
  color-mix(in oklab, var(--media-backdrop) 50%, transparent),
1994
- color-mix(in oklab, var(--media-backdrop) 20%, transparent));
2057
+ color-mix(in oklab, var(--media-backdrop) 42.2%, transparent) 25%,
2058
+ color-mix(in oklab, var(--media-backdrop) 25%, transparent) 50%,
2059
+ color-mix(in oklab, var(--media-backdrop) 7.8%, transparent) 75%,
2060
+ transparent);
2061
+ --media-controls-top-gradient: linear-gradient(to bottom,
2062
+ color-mix(in oklab, var(--media-backdrop) 50%, transparent),
2063
+ color-mix(in oklab, var(--media-backdrop) 42.2%, transparent) 25%,
2064
+ color-mix(in oklab, var(--media-backdrop) 25%, transparent) 50%,
2065
+ color-mix(in oklab, var(--media-backdrop) 7.8%, transparent) 75%,
2066
+ transparent);
1995
2067
  --media-indicator-gradient: linear-gradient(to bottom,
1996
2068
  color-mix(in oklab, var(--media-backdrop) 35%, transparent),
1997
2069
  color-mix(in oklab, var(--media-backdrop) 20%, transparent) calc(var(--media-spacing) * 12),
@@ -2001,6 +2073,7 @@
2001
2073
  }
2002
2074
 
2003
2075
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="compat"] {
2076
+ --media-controls-gradient: linear-gradient(to top, #00000080, transparent 40% 60%, #0006);
2004
2077
  --media-caption-controls-y: calc(var(--media-spacing) * -18);
2005
2078
  }
2006
2079
 
@@ -2012,7 +2085,16 @@
2012
2085
  .media-skin:is([data-preset="video"], [data-preset="live-video"])[data-theme="neutral"] {
2013
2086
  --media-controls-gradient: linear-gradient(to top in oklab,
2014
2087
  oklch(from var(--media-backdrop) l c h / .5),
2015
- oklch(from var(--media-backdrop) l c h / .2));
2088
+ oklch(from var(--media-backdrop) l c h / .422) 25%,
2089
+ oklch(from var(--media-backdrop) l c h / .25) 50%,
2090
+ oklch(from var(--media-backdrop) l c h / .078) 75%,
2091
+ transparent);
2092
+ --media-controls-top-gradient: linear-gradient(to bottom in oklab,
2093
+ oklch(from var(--media-backdrop) l c h / .5),
2094
+ oklch(from var(--media-backdrop) l c h / .422) 25%,
2095
+ oklch(from var(--media-backdrop) l c h / .25) 50%,
2096
+ oklch(from var(--media-backdrop) l c h / .078) 75%,
2097
+ transparent);
2016
2098
  }
2017
2099
  }
2018
2100
 
@@ -0,0 +1,31 @@
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 = () => `<style> :host { display: inline-block; min-width: 300px; min-height: 150px; position: relative; } ::slotted([slot=media]) { position: absolute; inset: 0; } </style><slot name="media"></slot>`;
8
+ }
9
+ };
10
+ var DailymotionVideo = class extends MediaAttachMixin(DailymotionCustomMediaElement) {
11
+ constructor() {
12
+ super();
13
+ this.adapter.addEventListener("volumechange", () => {
14
+ const { muted } = this.adapter;
15
+ if (this.hasAttribute("muted") !== muted) this.toggleAttribute("muted", muted);
16
+ });
17
+ }
18
+ connectedCallback() {
19
+ super.connectedCallback?.();
20
+ const existing = this.querySelector(":scope > [slot=media]");
21
+ if (existing) {
22
+ if (this.adapter.src && !existing.hasChildNodes() && !this.adapter.error) this.adapter.load();
23
+ return;
24
+ }
25
+ const container = document.createElement("div");
26
+ container.slot = "media";
27
+ this.append(container);
28
+ }
29
+ };
30
+ //#endregion
31
+ export { DailymotionVideo };
@@ -73,6 +73,13 @@ var HlsBackgroundVideo = class extends HlsBackgroundVideoBase {
73
73
  getMediaTarget() {
74
74
  return this.#media;
75
75
  }
76
+ /**
77
+ * The Media driving the inner `<video>`, matching `adapter` on `CustomMediaElement`. Call `adapter.destroy()` to
78
+ * release the engine after `keep-alive` kept it running past removal.
79
+ */
80
+ get adapter() {
81
+ return this.#media;
82
+ }
76
83
  disconnectedCallback() {
77
84
  super.disconnectedCallback?.();
78
85
  if (this.hasAttribute("keep-alive")) return;
@@ -0,0 +1,16 @@
1
+ import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
+ import { CustomMediaElement } from "@videojs/media/dom";
3
+ import { escapeHtml } from "@videojs/utils/string";
4
+ import { MixcloudAdapter, buildMixcloudIframeSrc } from "@videojs/mixcloud-audio";
5
+ //#region src/media/mixcloud-audio/adapter.ts
6
+ var MixcloudCustomMediaElement = class extends CustomMediaElement("iframe", MixcloudAdapter) {
7
+ static {
8
+ this.getTemplateHTML = (attrs) => {
9
+ const initialSrc = buildMixcloudIframeSrc(attrs.src ?? "");
10
+ return `<style> :host { display: block; position: relative; height: 120px; } iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; } /* * The widget is Mixcloud's own chrome, so without controls it is a * transport and nothing else. Hidden rather than merely inert, and * important so a consumer's own display rule cannot put it back on * screen. An iframe in a hidden subtree still loads and plays its src. */ :host(:not([controls])) { display: none !important; } </style><iframe part="iframe" title="Mixcloud audio player" ${initialSrc ? ` src="${escapeHtml(initialSrc)}"` : ""} allow="autoplay; encrypted-media" frameborder="0" width="100%" height="100%" referrerpolicy="${escapeHtml(attrs.referrerpolicy ?? "")}" ></iframe>`;
11
+ };
12
+ }
13
+ };
14
+ var MixcloudAudio = class extends MediaAttachMixin(MixcloudCustomMediaElement) {};
15
+ //#endregion
16
+ export { MixcloudAudio };
@@ -0,0 +1,16 @@
1
+ import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
+ import { CustomMediaElement } from "@videojs/media/dom";
3
+ import { escapeHtml } from "@videojs/utils/string";
4
+ import { SoundCloudAdapter, buildSoundCloudIframeSrc } from "@videojs/soundcloud-audio";
5
+ //#region src/media/soundcloud-audio/adapter.ts
6
+ var SoundCloudCustomMediaElement = class extends CustomMediaElement("iframe", SoundCloudAdapter) {
7
+ static {
8
+ this.getTemplateHTML = (attrs) => {
9
+ const initialSrc = buildSoundCloudIframeSrc(attrs.src ?? "");
10
+ return `<style> :host { display: block; position: relative; height: 166px; } iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; } /* * The widget is SoundCloud's own chrome, so without controls it is a * transport and nothing else. Hidden rather than merely inert, and * important so a consumer's own display rule cannot put it back on * screen. An iframe in a hidden subtree still loads and plays its src. */ :host(:not([controls])) { display: none !important; } </style><iframe part="iframe" title="SoundCloud audio player" ${initialSrc ? ` src="${escapeHtml(initialSrc)}"` : ""} allow="autoplay; encrypted-media" scrolling="no" frameborder="0" width="100%" height="100%" referrerpolicy="${escapeHtml(attrs.referrerpolicy ?? "")}" ></iframe>`;
11
+ };
12
+ }
13
+ };
14
+ var SoundCloudAudio = class extends MediaAttachMixin(SoundCloudCustomMediaElement) {};
15
+ //#endregion
16
+ export { SoundCloudAudio };
@@ -1,6 +1,6 @@
1
1
  import { UIElement } from "../ui/ui-element.js";
2
2
  import { PlayerExtensionCoordinator, setPlayerConfigValue } from "@videojs/core/dom";
3
- import { ContextProvider, ContextRoot } from "@videojs/element/context";
3
+ import { ContextProvider } from "@videojs/element/context";
4
4
  import { camelCase, kebabCase } from "@videojs/utils/string";
5
5
  import { isNull } from "@videojs/utils/predicate";
6
6
  //#region src/player/element.ts
@@ -27,7 +27,6 @@ function createPlayerElement(options) {
27
27
  };
28
28
  }
29
29
  #store = options.factory();
30
- #contextRoot = new ContextRoot();
31
30
  #configuredStore = null;
32
31
  #detach = null;
33
32
  #connected = false;
@@ -94,7 +93,6 @@ function createPlayerElement(options) {
94
93
  }
95
94
  connectedCallback() {
96
95
  this.#connected = true;
97
- this.#contextRoot.attach(this);
98
96
  super.connectedCallback();
99
97
  this.#syncInitialConfig();
100
98
  this.#playerProvider.setValue(this.store);
@@ -111,13 +109,11 @@ function createPlayerElement(options) {
111
109
  }
112
110
  disconnectedCallback() {
113
111
  this.#connected = false;
114
- this.#contextRoot.detach(this);
115
112
  this.#observer.disconnect();
116
113
  this.#detachStore();
117
114
  super.disconnectedCallback();
118
115
  }
119
116
  destroyCallback() {
120
- this.#contextRoot.detach(this);
121
117
  this.#observer.disconnect();
122
118
  this.#detachStore();
123
119
  this.#extensions.destroy();
@@ -1,5 +1,5 @@
1
1
  import skin_default from "../../define/background/skin2.js";
2
- import { ReactiveElement } from "@videojs/element";
2
+ import { DestroyMixin, ReactiveElement } from "@videojs/element";
3
3
  import { ensureGlobalStyle } from "@videojs/utils/dom";
4
4
  //#region src/presets/background/skin.ts
5
5
  const STYLES_ID = "__media-background-styles";
@@ -12,7 +12,7 @@ function getTemplateHTML() {
12
12
  </media-container>
13
13
  `;
14
14
  }
15
- var BackgroundVideoSkinElement = class BackgroundVideoSkinElement extends ReactiveElement {
15
+ var BackgroundVideoSkinElement = class BackgroundVideoSkinElement extends DestroyMixin(ReactiveElement) {
16
16
  static {
17
17
  this.tagName = "background-video-skin";
18
18
  }
@@ -1,15 +1,16 @@
1
+ import { UIElement } from "../ui/ui-element.js";
1
2
  import global_default from "../define/global.js";
2
3
  import shadow_default from "../define/shadow.js";
3
- import { ReactiveElement } from "@videojs/element";
4
4
  import { applyShadowStyles, createShadowStyle, ensureGlobalStyle, renderTemplate } from "@videojs/utils/dom";
5
5
  //#region src/presets/skin.ts
6
6
  const STYLES_ID = "__media-styles";
7
7
  const shadowSheet = createShadowStyle(shadow_default);
8
8
  /**
9
9
  * Base element for skin definitions. Attaches a shadow root, clones `static template` into it, and applies shared +
10
- * per-skin styles via `adoptedStyleSheets` (or `<style>` fallback).
10
+ * per-skin styles via `adoptedStyleSheets` (or `<style>` fallback). Destroying it also destroys the controls in its
11
+ * shadow root.
11
12
  */
12
- var SkinElement = class extends ReactiveElement {
13
+ var SkinElement = class extends UIElement {
13
14
  static {
14
15
  this.shadowRootOptions = { mode: "open" };
15
16
  }
@@ -1,9 +1,10 @@
1
+ import { containerContext } from "../../player/context.js";
1
2
  import { UIElement } from "../ui-element.js";
2
3
  import { PositionController } from "../position-controller.js";
3
4
  import { dialogContext } from "./context.js";
4
5
  import { DialogCore, DialogDataAttrs } from "@videojs/core";
5
6
  import { applyElementProps, applyStateDataAttrs, createDialog, createTransition } from "@videojs/core/dom";
6
- import { ContextProvider } from "@videojs/element/context";
7
+ import { ContextConsumer, ContextProvider } from "@videojs/element/context";
7
8
  import { SnapshotController } from "@videojs/store/html";
8
9
  //#region src/ui/dialog/element.ts
9
10
  let idCounter = 0;
@@ -25,12 +26,14 @@ var DialogElementBase = class extends UIElement {
25
26
  #stateAttrMap;
26
27
  #provider;
27
28
  #position;
29
+ #container;
28
30
  #popupId;
29
31
  #titleId;
30
32
  #descriptionId;
31
33
  #bindTrigger;
32
34
  #dialog;
33
35
  #snapshot;
36
+ #modalitySnapshot;
34
37
  #triggerAbort;
35
38
  #triggerElement;
36
39
  constructor({ core = new DialogCore(), stateAttrMap = DialogDataAttrs, idPrefix = "dialog", bindTrigger = true } = {}) {
@@ -40,8 +43,13 @@ var DialogElementBase = class extends UIElement {
40
43
  this.closeOnEscape = DialogCore.defaultProps.closeOnEscape;
41
44
  this.#provider = new ContextProvider(this, { context: dialogContext });
42
45
  this.#position = new PositionController(this);
46
+ this.#container = new ContextConsumer(this, {
47
+ context: containerContext,
48
+ subscribe: true
49
+ });
43
50
  this.#dialog = null;
44
51
  this.#snapshot = null;
52
+ this.#modalitySnapshot = null;
45
53
  this.#triggerAbort = null;
46
54
  this.#triggerElement = null;
47
55
  this.#core = core;
@@ -69,6 +77,8 @@ var DialogElementBase = class extends UIElement {
69
77
  });
70
78
  if (this.#snapshot) this.#snapshot.track(this.#dialog.input);
71
79
  else this.#snapshot = new SnapshotController(this, this.#dialog.input);
80
+ if (this.#modalitySnapshot) this.#modalitySnapshot.track(this.#dialog.modality);
81
+ else this.#modalitySnapshot = new SnapshotController(this, this.#dialog.modality);
72
82
  }
73
83
  firstUpdated(changed) {
74
84
  super.firstUpdated(changed);
@@ -86,6 +96,7 @@ var DialogElementBase = class extends UIElement {
86
96
  willUpdate(changed) {
87
97
  super.willUpdate(changed);
88
98
  this.#core.setProps(this);
99
+ this.#dialog?.setInteractionRoot(this.#container.value?.container ?? null);
89
100
  if (this.#dialog && changed.has("open")) {
90
101
  const { active: inputOpen } = this.#dialog.input.current;
91
102
  if (this.open !== inputOpen) {
@@ -101,6 +112,7 @@ var DialogElementBase = class extends UIElement {
101
112
  this.#syncTrigger(triggerElement);
102
113
  const input = this.#dialog.input.current;
103
114
  this.#core.setInput(input);
115
+ this.#core.setDocumentModal(this.#dialog.modality.current.documentModal);
104
116
  const state = this.#core.getState();
105
117
  applyStateDataAttrs(this, state, this.#stateAttrMap);
106
118
  if (this.#triggerElement) applyElementProps(this.#triggerElement, this.#core.getTriggerAttrs(state, this.#popupId));