@videojs/html 10.0.0-rc.4 → 10.0.0-rc.5

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 (1020) hide show
  1. package/dist/default/define/audio/compat-skin.css +1923 -0
  2. package/dist/default/define/audio/compat-skin.js +6 -0
  3. package/dist/default/define/audio/compat-skin2.js +4 -0
  4. package/dist/default/define/audio/neutral-skin.css +1855 -0
  5. package/dist/default/define/audio/neutral-skin.js +6 -0
  6. package/dist/default/define/audio/neutral-skin2.js +4 -0
  7. package/dist/default/define/audio/{minimal-ui.js → neutral-ui.js} +1 -1
  8. package/dist/default/define/audio/skin.css +1220 -1411
  9. package/dist/default/define/audio/skin2.js +1 -1
  10. package/dist/default/define/background/skin.css +8 -19
  11. package/dist/default/define/global.css +5 -21
  12. package/dist/default/define/live-audio/compat-skin.css +1708 -0
  13. package/dist/default/define/live-audio/compat-skin.js +6 -0
  14. package/dist/default/define/live-audio/compat-skin2.js +4 -0
  15. package/dist/default/define/live-audio/neutral-skin.css +1270 -0
  16. package/dist/default/define/live-audio/neutral-skin.js +6 -0
  17. package/dist/default/define/live-audio/neutral-skin2.js +4 -0
  18. package/dist/default/define/live-audio/{minimal-ui.js → neutral-ui.js} +1 -1
  19. package/dist/default/define/live-audio/skin.css +849 -959
  20. package/dist/default/define/live-audio/skin2.js +1 -1
  21. package/dist/default/define/live-video/compat-skin.css +2251 -0
  22. package/dist/default/define/live-video/compat-skin.js +6 -0
  23. package/dist/default/define/live-video/compat-skin2.js +4 -0
  24. package/dist/default/define/live-video/neutral-skin.css +2101 -0
  25. package/dist/default/define/live-video/neutral-skin.js +6 -0
  26. package/dist/default/define/live-video/neutral-skin2.js +4 -0
  27. package/dist/default/define/live-video/{minimal-ui.js → neutral-ui.js} +1 -1
  28. package/dist/default/define/live-video/skin.css +1565 -1784
  29. package/dist/default/define/live-video/skin2.js +1 -1
  30. package/dist/default/define/media/dash-video.js +5 -1
  31. package/dist/default/define/media/shaka-video.js +1 -0
  32. package/dist/default/define/shadow.css +2 -12
  33. package/dist/default/define/video/compat-skin.css +2529 -0
  34. package/dist/default/define/video/compat-skin.js +6 -0
  35. package/dist/default/define/video/compat-skin2.js +4 -0
  36. package/dist/default/define/video/neutral-skin.css +2849 -0
  37. package/dist/default/define/video/neutral-skin.js +6 -0
  38. package/dist/default/define/video/neutral-skin2.js +4 -0
  39. package/dist/default/define/video/{minimal-ui.js → neutral-ui.js} +1 -1
  40. package/dist/default/define/video/skin.css +2046 -2454
  41. package/dist/default/define/video/skin2.js +1 -1
  42. package/dist/default/extensions/google-cast/extension.js +18 -17
  43. package/dist/default/extensions/mux-data/extension.js +24 -24
  44. package/dist/default/extensions/player-extension-element.js +49 -0
  45. package/dist/default/i18n/index.js +2 -2
  46. package/dist/default/i18n/locale.js +10 -2
  47. package/dist/default/i18n/provider-element.js +1 -0
  48. package/dist/default/i18n/provider-mixin.js +11 -9
  49. package/dist/default/i18n/render-text.js +5 -1
  50. package/dist/default/i18n/text/airplay.js +1 -0
  51. package/dist/default/i18n/text/buttons.js +1 -0
  52. package/dist/default/i18n/text/captions.js +1 -0
  53. package/dist/default/i18n/text/cast.js +1 -0
  54. package/dist/default/i18n/text/common.js +1 -0
  55. package/dist/default/i18n/text/container.js +1 -0
  56. package/dist/default/i18n/text/errors.js +1 -0
  57. package/dist/default/i18n/text/fullscreen.js +1 -0
  58. package/dist/default/i18n/text/live.js +1 -0
  59. package/dist/default/i18n/text/menu.js +1 -0
  60. package/dist/default/i18n/text/pip.js +1 -0
  61. package/dist/default/i18n/text/playback.js +1 -0
  62. package/dist/default/i18n/text/seek.js +1 -0
  63. package/dist/default/i18n/text/slider.js +1 -0
  64. package/dist/default/i18n/text/status.js +1 -0
  65. package/dist/default/i18n/text/time.js +1 -0
  66. package/dist/default/i18n/text/volume.js +1 -0
  67. package/dist/default/icons/compat/index.js +26 -0
  68. package/dist/default/icons/dist/element/compat/icons.js +30 -0
  69. package/dist/default/icons/dist/element/{minimal → compat}/index.js +2 -2
  70. package/dist/default/icons/dist/element/index.js +2 -1
  71. package/dist/default/icons/dist/element/{minimal → neutral}/icons.js +1 -1
  72. package/dist/default/icons/dist/element/neutral/index.js +8 -0
  73. package/dist/default/icons/dist/html/compat/airplay-enter.js +4 -0
  74. package/dist/default/icons/dist/html/compat/airplay-exit.js +4 -0
  75. package/dist/default/icons/dist/html/compat/captions-off.js +4 -0
  76. package/dist/default/icons/dist/html/compat/captions-on.js +4 -0
  77. package/dist/default/icons/dist/html/compat/cast-enter.js +4 -0
  78. package/dist/default/icons/dist/html/compat/cast-exit.js +4 -0
  79. package/dist/default/icons/dist/html/compat/check.js +4 -0
  80. package/dist/default/icons/dist/html/compat/chevron.js +4 -0
  81. package/dist/default/icons/dist/html/compat/fullscreen-enter.js +4 -0
  82. package/dist/default/icons/dist/html/compat/fullscreen-exit.js +4 -0
  83. package/dist/default/icons/dist/html/compat/gear.js +4 -0
  84. package/dist/default/icons/dist/html/compat/pause.js +4 -0
  85. package/dist/default/icons/dist/html/compat/pip-enter.js +4 -0
  86. package/dist/default/icons/dist/html/compat/pip-exit.js +4 -0
  87. package/dist/default/icons/dist/html/compat/play.js +4 -0
  88. package/dist/default/icons/dist/html/compat/quality.js +4 -0
  89. package/dist/default/icons/dist/html/compat/restart.js +4 -0
  90. package/dist/default/icons/dist/html/compat/seek.js +4 -0
  91. package/dist/default/icons/dist/html/compat/speech.js +4 -0
  92. package/dist/default/icons/dist/html/compat/speed.js +4 -0
  93. package/dist/default/icons/dist/html/{minimal → compat}/spinner.js +1 -1
  94. package/dist/default/icons/dist/html/compat/switches.js +4 -0
  95. package/dist/default/icons/dist/html/compat/volume-high.js +4 -0
  96. package/dist/default/icons/dist/html/compat/volume-low.js +4 -0
  97. package/dist/default/icons/dist/html/compat/volume-off.js +4 -0
  98. package/dist/default/icons/dist/html/{minimal → neutral}/airplay-enter.js +1 -1
  99. package/dist/default/icons/dist/html/{minimal → neutral}/airplay-exit.js +1 -1
  100. package/dist/default/icons/dist/html/{minimal → neutral}/captions-off.js +1 -1
  101. package/dist/default/icons/dist/html/{minimal → neutral}/captions-on.js +1 -1
  102. package/dist/default/icons/dist/html/{minimal → neutral}/cast-enter.js +1 -1
  103. package/dist/default/icons/dist/html/{minimal → neutral}/cast-exit.js +1 -1
  104. package/dist/default/icons/dist/html/{minimal → neutral}/check.js +1 -1
  105. package/dist/default/icons/dist/html/{minimal → neutral}/chevron.js +1 -1
  106. package/dist/default/icons/dist/html/{minimal → neutral}/fullscreen-enter.js +1 -1
  107. package/dist/default/icons/dist/html/{minimal → neutral}/fullscreen-exit.js +1 -1
  108. package/dist/default/icons/dist/html/{minimal → neutral}/gear.js +1 -1
  109. package/dist/default/icons/dist/html/{minimal → neutral}/pause.js +1 -1
  110. package/dist/default/icons/dist/html/{minimal → neutral}/pip-enter.js +1 -1
  111. package/dist/default/icons/dist/html/{minimal → neutral}/pip-exit.js +1 -1
  112. package/dist/default/icons/dist/html/{minimal → neutral}/play.js +1 -1
  113. package/dist/default/icons/dist/html/{minimal → neutral}/quality.js +1 -1
  114. package/dist/default/icons/dist/html/{minimal → neutral}/restart.js +1 -1
  115. package/dist/default/icons/dist/html/{minimal → neutral}/seek.js +1 -1
  116. package/dist/default/icons/dist/html/{minimal → neutral}/speech.js +1 -1
  117. package/dist/default/icons/dist/html/{minimal → neutral}/speed.js +1 -1
  118. package/dist/default/icons/dist/html/neutral/spinner.js +4 -0
  119. package/dist/default/icons/dist/html/{minimal → neutral}/switches.js +1 -1
  120. package/dist/default/icons/dist/html/{minimal → neutral}/volume-high.js +1 -1
  121. package/dist/default/icons/dist/html/{minimal → neutral}/volume-low.js +1 -1
  122. package/dist/default/icons/dist/html/{minimal → neutral}/volume-off.js +1 -1
  123. package/dist/default/icons/element/compat/index.js +1 -0
  124. package/dist/default/icons/element/neutral/index.js +1 -0
  125. package/dist/default/icons/neutral/index.js +26 -0
  126. package/dist/default/index.js +4 -3
  127. package/dist/default/internal/skins/compat-audio/register.js +70 -0
  128. package/dist/default/internal/skins/compat-audio/skin.css +1891 -0
  129. package/dist/default/internal/skins/compat-audio/template.js +215 -0
  130. package/dist/default/internal/skins/compat-live-audio/register.js +50 -0
  131. package/dist/default/internal/skins/compat-live-audio/skin.css +1676 -0
  132. package/dist/default/internal/skins/compat-live-audio/template.js +112 -0
  133. package/dist/default/internal/skins/compat-live-video/register.js +86 -0
  134. package/dist/default/internal/skins/compat-live-video/skin.css +2219 -0
  135. package/dist/default/internal/skins/compat-live-video/template.js +237 -0
  136. package/dist/default/internal/skins/compat-video/register.js +115 -0
  137. package/dist/default/internal/skins/compat-video/skin.css +2497 -0
  138. package/dist/default/internal/skins/compat-video/template.js +457 -0
  139. package/dist/default/internal/skins/default-audio/register.js +8 -8
  140. package/dist/default/internal/skins/default-audio/skin.css +1213 -1365
  141. package/dist/default/internal/skins/default-live-audio/register.js +4 -4
  142. package/dist/default/internal/skins/default-live-audio/skin.css +842 -913
  143. package/dist/default/internal/skins/default-live-video/register.js +8 -8
  144. package/dist/default/internal/skins/default-live-video/skin.css +1548 -1728
  145. package/dist/default/internal/skins/default-video/register.js +13 -13
  146. package/dist/default/internal/skins/default-video/skin.css +2034 -2403
  147. package/dist/default/internal/skins/{minimal-audio → neutral-audio}/register.js +20 -20
  148. package/dist/default/internal/skins/neutral-audio/skin.css +1823 -0
  149. package/dist/default/internal/skins/{minimal-audio → neutral-audio}/template.js +24 -24
  150. package/dist/default/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js +13 -13
  151. package/dist/default/internal/skins/neutral-live-audio/skin.css +1238 -0
  152. package/dist/default/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js +14 -14
  153. package/dist/default/internal/skins/{minimal-live-video → neutral-live-video}/register.js +28 -28
  154. package/dist/default/internal/skins/neutral-live-video/skin.css +2069 -0
  155. package/dist/default/internal/skins/{minimal-live-video → neutral-live-video}/template.js +47 -47
  156. package/dist/default/internal/skins/{minimal-video → neutral-video}/register.js +40 -40
  157. package/dist/default/internal/skins/neutral-video/skin.css +2817 -0
  158. package/dist/default/internal/skins/{minimal-video → neutral-video}/template.js +75 -75
  159. package/dist/default/player/context.js +9 -1
  160. package/dist/default/player/create-player.js +2 -1
  161. package/dist/default/player/element.js +47 -10
  162. package/dist/default/presets/audio/compat-skin.js +19 -0
  163. package/dist/default/presets/audio/index.js +3 -2
  164. package/dist/default/presets/audio/neutral-skin.js +19 -0
  165. package/dist/default/presets/live-audio/compat-skin.js +19 -0
  166. package/dist/default/presets/live-audio/index.js +3 -2
  167. package/dist/default/presets/live-audio/neutral-skin.js +19 -0
  168. package/dist/default/presets/live-video/compat-skin.js +19 -0
  169. package/dist/default/presets/live-video/index.js +3 -2
  170. package/dist/default/presets/live-video/neutral-skin.js +19 -0
  171. package/dist/default/presets/video/compat-skin.js +19 -0
  172. package/dist/default/presets/video/index.js +3 -2
  173. package/dist/default/presets/video/neutral-skin.js +19 -0
  174. package/dist/default/store/media-attach-mixin.js +2 -0
  175. package/dist/default/ui/airplay-button/element.js +1 -1
  176. package/dist/default/ui/buffering-indicator/element.js +4 -0
  177. package/dist/default/ui/dialog/context.js +1 -0
  178. package/dist/default/ui/dialog/element.js +4 -2
  179. package/dist/default/ui/media-button-element.js +7 -6
  180. package/dist/default/ui/media-ui-element.js +6 -1
  181. package/dist/default/ui/menu/context.js +2 -0
  182. package/dist/default/ui/play-button/element.js +1 -1
  183. package/dist/default/ui/playback-rate-button/element.js +4 -2
  184. package/dist/default/ui/popover/element.js +4 -2
  185. package/dist/default/ui/radio-group/context.js +1 -0
  186. package/dist/default/ui/seek-indicator/element.js +7 -1
  187. package/dist/default/ui/slider/context.js +1 -0
  188. package/dist/default/ui/status-indicator/element.js +14 -1
  189. package/dist/default/ui/text/element.js +1 -0
  190. package/dist/default/ui/thumbnail/element.js +3 -2
  191. package/dist/default/ui/tooltip/context.js +1 -0
  192. package/dist/default/ui/tooltip/element.js +4 -2
  193. package/dist/default/ui/volume-popover/element.js +1 -1
  194. package/dist/default/ui/volume-slider/element.js +1 -1
  195. package/dist/default/version.js +27 -0
  196. package/dist/dev/define/audio/compat-skin.css +1923 -0
  197. package/dist/dev/define/audio/compat-skin.d.ts +1 -0
  198. package/dist/dev/define/audio/compat-skin.js +8 -0
  199. package/dist/dev/define/audio/compat-skin.js.map +1 -0
  200. package/dist/dev/define/audio/compat-skin2.js +6 -0
  201. package/dist/dev/define/audio/compat-skin2.js.map +1 -0
  202. package/dist/dev/define/audio/neutral-skin.css +1855 -0
  203. package/dist/dev/define/audio/neutral-skin.d.ts +1 -0
  204. package/dist/dev/define/audio/neutral-skin.js +8 -0
  205. package/dist/dev/define/audio/neutral-skin.js.map +1 -0
  206. package/dist/dev/define/audio/neutral-skin2.js +6 -0
  207. package/dist/dev/define/audio/neutral-skin2.js.map +1 -0
  208. package/dist/dev/define/audio/{minimal-ui.js → neutral-ui.js} +2 -2
  209. package/dist/dev/define/audio/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  210. package/dist/dev/define/audio/skin.css +1220 -1411
  211. package/dist/dev/define/audio/skin2.js +1 -1
  212. package/dist/dev/define/audio/skin2.js.map +1 -1
  213. package/dist/dev/define/background/skin.css +8 -19
  214. package/dist/dev/define/global.css +5 -21
  215. package/dist/dev/define/live-audio/compat-skin.css +1708 -0
  216. package/dist/dev/define/live-audio/compat-skin.d.ts +1 -0
  217. package/dist/dev/define/live-audio/compat-skin.js +8 -0
  218. package/dist/dev/define/live-audio/compat-skin.js.map +1 -0
  219. package/dist/dev/define/live-audio/compat-skin2.js +6 -0
  220. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -0
  221. package/dist/dev/define/live-audio/neutral-skin.css +1270 -0
  222. package/dist/dev/define/live-audio/neutral-skin.d.ts +1 -0
  223. package/dist/dev/define/live-audio/neutral-skin.js +8 -0
  224. package/dist/dev/define/live-audio/neutral-skin.js.map +1 -0
  225. package/dist/dev/define/live-audio/neutral-skin2.js +6 -0
  226. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -0
  227. package/dist/dev/define/live-audio/{minimal-ui.js → neutral-ui.js} +2 -2
  228. package/dist/dev/define/live-audio/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  229. package/dist/dev/define/live-audio/skin.css +849 -959
  230. package/dist/dev/define/live-audio/skin2.js +1 -1
  231. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  232. package/dist/dev/define/live-video/compat-skin.css +2251 -0
  233. package/dist/dev/define/live-video/compat-skin.d.ts +1 -0
  234. package/dist/dev/define/live-video/compat-skin.js +8 -0
  235. package/dist/dev/define/live-video/compat-skin.js.map +1 -0
  236. package/dist/dev/define/live-video/compat-skin2.js +6 -0
  237. package/dist/dev/define/live-video/compat-skin2.js.map +1 -0
  238. package/dist/dev/define/live-video/neutral-skin.css +2101 -0
  239. package/dist/dev/define/live-video/neutral-skin.d.ts +1 -0
  240. package/dist/dev/define/live-video/neutral-skin.js +8 -0
  241. package/dist/dev/define/live-video/neutral-skin.js.map +1 -0
  242. package/dist/dev/define/live-video/neutral-skin2.js +6 -0
  243. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -0
  244. package/dist/dev/define/live-video/{minimal-ui.js → neutral-ui.js} +2 -2
  245. package/dist/dev/define/live-video/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  246. package/dist/dev/define/live-video/skin.css +1565 -1784
  247. package/dist/dev/define/live-video/skin2.js +1 -1
  248. package/dist/dev/define/live-video/skin2.js.map +1 -1
  249. package/dist/dev/define/media/background-video.d.ts +1 -2
  250. package/dist/dev/define/media/cloudflare-video.d.ts +3 -2
  251. package/dist/dev/define/media/cloudflare-video.js.map +1 -1
  252. package/dist/dev/define/media/dash-video.d.ts +8 -3
  253. package/dist/dev/define/media/dash-video.js +5 -1
  254. package/dist/dev/define/media/dash-video.js.map +1 -1
  255. package/dist/dev/define/media/hls-audio.d.ts +1 -2
  256. package/dist/dev/define/media/hls-background-video.d.ts +1 -2
  257. package/dist/dev/define/media/hls-video.d.ts +1 -2
  258. package/dist/dev/define/media/hlsjs-video.d.ts +3 -2
  259. package/dist/dev/define/media/hlsjs-video.js.map +1 -1
  260. package/dist/dev/define/media/mux-audio/hls-js.d.ts +3 -2
  261. package/dist/dev/define/media/mux-audio/hls-js.js.map +1 -1
  262. package/dist/dev/define/media/mux-audio/index.d.ts +2 -2
  263. package/dist/dev/define/media/mux-audio/spf.d.ts +3 -2
  264. package/dist/dev/define/media/mux-audio/spf.js.map +1 -1
  265. package/dist/dev/define/media/mux-background-video.d.ts +1 -2
  266. package/dist/dev/define/media/mux-video/hls-js.d.ts +3 -2
  267. package/dist/dev/define/media/mux-video/hls-js.js.map +1 -1
  268. package/dist/dev/define/media/mux-video/index.d.ts +2 -2
  269. package/dist/dev/define/media/mux-video/spf.d.ts +3 -2
  270. package/dist/dev/define/media/mux-video/spf.js.map +1 -1
  271. package/dist/dev/define/media/native-hls-video.d.ts +3 -2
  272. package/dist/dev/define/media/native-hls-video.js.map +1 -1
  273. package/dist/dev/define/media/shaka-video.d.ts +4 -2
  274. package/dist/dev/define/media/shaka-video.js +1 -0
  275. package/dist/dev/define/media/shaka-video.js.map +1 -1
  276. package/dist/dev/define/media/spotify-audio.d.ts +3 -2
  277. package/dist/dev/define/media/spotify-audio.js.map +1 -1
  278. package/dist/dev/define/media/tiktok-video.d.ts +3 -2
  279. package/dist/dev/define/media/tiktok-video.js.map +1 -1
  280. package/dist/dev/define/media/twitch-video.d.ts +3 -2
  281. package/dist/dev/define/media/twitch-video.js.map +1 -1
  282. package/dist/dev/define/media/vimeo-video.d.ts +3 -2
  283. package/dist/dev/define/media/vimeo-video.js.map +1 -1
  284. package/dist/dev/define/media/wistia-video.d.ts +3 -2
  285. package/dist/dev/define/media/wistia-video.js.map +1 -1
  286. package/dist/dev/define/media/youtube-video.d.ts +3 -2
  287. package/dist/dev/define/media/youtube-video.js.map +1 -1
  288. package/dist/dev/define/shadow.css +2 -12
  289. package/dist/dev/define/ui/menu-radio-group.d.ts +1 -0
  290. package/dist/dev/define/ui/menu.d.ts +1 -0
  291. package/dist/dev/define/ui/popover.d.ts +1 -0
  292. package/dist/dev/define/video/compat-skin.css +2529 -0
  293. package/dist/dev/define/video/compat-skin.d.ts +1 -0
  294. package/dist/dev/define/video/compat-skin.js +8 -0
  295. package/dist/dev/define/video/compat-skin.js.map +1 -0
  296. package/dist/dev/define/video/compat-skin2.js +6 -0
  297. package/dist/dev/define/video/compat-skin2.js.map +1 -0
  298. package/dist/dev/define/video/neutral-skin.css +2849 -0
  299. package/dist/dev/define/video/neutral-skin.d.ts +1 -0
  300. package/dist/dev/define/video/neutral-skin.js +8 -0
  301. package/dist/dev/define/video/neutral-skin.js.map +1 -0
  302. package/dist/dev/define/video/neutral-skin2.js +6 -0
  303. package/dist/dev/define/video/neutral-skin2.js.map +1 -0
  304. package/dist/dev/define/video/{minimal-ui.js → neutral-ui.js} +2 -2
  305. package/dist/dev/define/video/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  306. package/dist/dev/define/video/skin.css +2046 -2454
  307. package/dist/dev/define/video/skin2.js +1 -1
  308. package/dist/dev/define/video/skin2.js.map +1 -1
  309. package/dist/dev/extensions/google-cast/extension.d.ts +8 -7
  310. package/dist/dev/extensions/google-cast/extension.js +18 -17
  311. package/dist/dev/extensions/google-cast/extension.js.map +1 -1
  312. package/dist/dev/extensions/mux-data/extension.d.ts +6 -6
  313. package/dist/dev/extensions/mux-data/extension.js +24 -24
  314. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  315. package/dist/dev/extensions/player-extension-element.d.ts +30 -0
  316. package/dist/dev/extensions/player-extension-element.js +51 -0
  317. package/dist/dev/extensions/player-extension-element.js.map +1 -0
  318. package/dist/dev/i18n/context.d.ts +4 -5
  319. package/dist/dev/i18n/controller.d.ts +3 -4
  320. package/dist/dev/i18n/controller.js.map +1 -1
  321. package/dist/dev/i18n/create-i18n.d.ts +3 -4
  322. package/dist/dev/i18n/index.d.ts +2 -2
  323. package/dist/dev/i18n/index.js +2 -2
  324. package/dist/dev/i18n/locale.d.ts +12 -5
  325. package/dist/dev/i18n/locale.js +10 -2
  326. package/dist/dev/i18n/locale.js.map +1 -1
  327. package/dist/dev/i18n/provider-element.d.ts +4 -3
  328. package/dist/dev/i18n/provider-element.js +1 -0
  329. package/dist/dev/i18n/provider-element.js.map +1 -1
  330. package/dist/dev/i18n/provider-mixin.d.ts +1 -2
  331. package/dist/dev/i18n/provider-mixin.js +11 -9
  332. package/dist/dev/i18n/provider-mixin.js.map +1 -1
  333. package/dist/dev/i18n/render-text.d.ts +6 -3
  334. package/dist/dev/i18n/render-text.js +5 -1
  335. package/dist/dev/i18n/render-text.js.map +1 -1
  336. package/dist/dev/i18n/text/airplay.d.ts +1 -0
  337. package/dist/dev/i18n/text/airplay.js +1 -0
  338. package/dist/dev/i18n/text/buttons.d.ts +1 -0
  339. package/dist/dev/i18n/text/buttons.js +1 -0
  340. package/dist/dev/i18n/text/captions.d.ts +1 -0
  341. package/dist/dev/i18n/text/captions.js +1 -0
  342. package/dist/dev/i18n/text/cast.d.ts +1 -0
  343. package/dist/dev/i18n/text/cast.js +1 -0
  344. package/dist/dev/i18n/text/common.d.ts +1 -0
  345. package/dist/dev/i18n/text/common.js +1 -0
  346. package/dist/dev/i18n/text/container.d.ts +1 -0
  347. package/dist/dev/i18n/text/container.js +1 -0
  348. package/dist/dev/i18n/text/errors.d.ts +1 -0
  349. package/dist/dev/i18n/text/errors.js +1 -0
  350. package/dist/dev/i18n/text/fullscreen.d.ts +1 -0
  351. package/dist/dev/i18n/text/fullscreen.js +1 -0
  352. package/dist/dev/i18n/text/live.d.ts +1 -0
  353. package/dist/dev/i18n/text/live.js +1 -0
  354. package/dist/dev/i18n/text/menu.d.ts +1 -0
  355. package/dist/dev/i18n/text/menu.js +1 -0
  356. package/dist/dev/i18n/text/pip.d.ts +1 -0
  357. package/dist/dev/i18n/text/pip.js +1 -0
  358. package/dist/dev/i18n/text/playback.d.ts +1 -0
  359. package/dist/dev/i18n/text/playback.js +1 -0
  360. package/dist/dev/i18n/text/seek.d.ts +1 -0
  361. package/dist/dev/i18n/text/seek.js +1 -0
  362. package/dist/dev/i18n/text/slider.d.ts +1 -0
  363. package/dist/dev/i18n/text/slider.js +1 -0
  364. package/dist/dev/i18n/text/status.d.ts +1 -0
  365. package/dist/dev/i18n/text/status.js +1 -0
  366. package/dist/dev/i18n/text/time.d.ts +1 -0
  367. package/dist/dev/i18n/text/time.js +1 -0
  368. package/dist/dev/i18n/text/volume.d.ts +1 -0
  369. package/dist/dev/i18n/text/volume.js +1 -0
  370. package/dist/dev/i18n/text-mixin.d.ts +1 -2
  371. package/dist/dev/i18n/text-mixin.js.map +1 -1
  372. package/dist/dev/i18n/types.d.ts +2 -3
  373. package/dist/dev/icons/{minimal → compat}/index.d.ts +1 -1
  374. package/dist/dev/icons/compat/index.js +26 -0
  375. package/dist/dev/icons/dist/element/base.d.ts +1 -2
  376. package/dist/dev/icons/dist/element/base.js.map +1 -1
  377. package/dist/dev/icons/dist/element/compat/icons.js +32 -0
  378. package/dist/dev/icons/dist/element/compat/icons.js.map +1 -0
  379. package/dist/dev/icons/dist/element/{minimal → compat}/index.js +2 -2
  380. package/dist/dev/icons/dist/element/compat/index.js.map +1 -0
  381. package/dist/dev/icons/dist/element/index.js +2 -1
  382. package/dist/dev/icons/dist/element/index.js.map +1 -1
  383. package/dist/dev/icons/dist/element/{minimal → neutral}/icons.js +1 -1
  384. package/dist/dev/icons/dist/element/{minimal → neutral}/icons.js.map +1 -1
  385. package/dist/dev/icons/dist/element/neutral/index.d.ts +1 -0
  386. package/dist/dev/icons/dist/element/neutral/index.js +10 -0
  387. package/dist/dev/icons/dist/element/{minimal → neutral}/index.js.map +1 -1
  388. package/dist/dev/icons/dist/html/compat/airplay-enter.js +6 -0
  389. package/dist/dev/icons/dist/html/compat/airplay-enter.js.map +1 -0
  390. package/dist/dev/icons/dist/html/compat/airplay-exit.js +6 -0
  391. package/dist/dev/icons/dist/html/compat/airplay-exit.js.map +1 -0
  392. package/dist/dev/icons/dist/html/compat/captions-off.js +6 -0
  393. package/dist/dev/icons/dist/html/compat/captions-off.js.map +1 -0
  394. package/dist/dev/icons/dist/html/compat/captions-on.js +6 -0
  395. package/dist/dev/icons/dist/html/compat/captions-on.js.map +1 -0
  396. package/dist/dev/icons/dist/html/compat/cast-enter.js +6 -0
  397. package/dist/dev/icons/dist/html/compat/cast-enter.js.map +1 -0
  398. package/dist/dev/icons/dist/html/compat/cast-exit.js +6 -0
  399. package/dist/dev/icons/dist/html/compat/cast-exit.js.map +1 -0
  400. package/dist/dev/icons/dist/html/compat/check.js +6 -0
  401. package/dist/dev/icons/dist/html/compat/check.js.map +1 -0
  402. package/dist/dev/icons/dist/html/compat/chevron.js +6 -0
  403. package/dist/dev/icons/dist/html/compat/chevron.js.map +1 -0
  404. package/dist/dev/icons/dist/html/compat/fullscreen-enter.js +6 -0
  405. package/dist/dev/icons/dist/html/compat/fullscreen-enter.js.map +1 -0
  406. package/dist/dev/icons/dist/html/compat/fullscreen-exit.js +6 -0
  407. package/dist/dev/icons/dist/html/compat/fullscreen-exit.js.map +1 -0
  408. package/dist/dev/icons/dist/html/compat/gear.js +6 -0
  409. package/dist/dev/icons/dist/html/compat/gear.js.map +1 -0
  410. package/dist/dev/icons/dist/html/compat/index.d.ts +28 -0
  411. package/dist/dev/icons/dist/html/compat/pause.js +6 -0
  412. package/dist/dev/icons/dist/html/compat/pause.js.map +1 -0
  413. package/dist/dev/icons/dist/html/compat/pip-enter.js +6 -0
  414. package/dist/dev/icons/dist/html/compat/pip-enter.js.map +1 -0
  415. package/dist/dev/icons/dist/html/compat/pip-exit.js +6 -0
  416. package/dist/dev/icons/dist/html/compat/pip-exit.js.map +1 -0
  417. package/dist/dev/icons/dist/html/compat/play.js +6 -0
  418. package/dist/dev/icons/dist/html/compat/play.js.map +1 -0
  419. package/dist/dev/icons/dist/html/compat/quality.js +6 -0
  420. package/dist/dev/icons/dist/html/compat/quality.js.map +1 -0
  421. package/dist/dev/icons/dist/html/compat/restart.js +6 -0
  422. package/dist/dev/icons/dist/html/compat/restart.js.map +1 -0
  423. package/dist/dev/icons/dist/html/compat/seek.js +6 -0
  424. package/dist/dev/icons/dist/html/compat/seek.js.map +1 -0
  425. package/dist/dev/icons/dist/html/compat/speech.js +6 -0
  426. package/dist/dev/icons/dist/html/compat/speech.js.map +1 -0
  427. package/dist/dev/icons/dist/html/compat/speed.js +6 -0
  428. package/dist/dev/icons/dist/html/compat/speed.js.map +1 -0
  429. package/dist/dev/icons/dist/html/{minimal → compat}/spinner.js +1 -1
  430. package/dist/dev/icons/dist/html/compat/spinner.js.map +1 -0
  431. package/dist/dev/icons/dist/html/compat/switches.js +6 -0
  432. package/dist/dev/icons/dist/html/compat/switches.js.map +1 -0
  433. package/dist/dev/icons/dist/html/compat/volume-high.js +6 -0
  434. package/dist/dev/icons/dist/html/compat/volume-high.js.map +1 -0
  435. package/dist/dev/icons/dist/html/compat/volume-low.js +6 -0
  436. package/dist/dev/icons/dist/html/compat/volume-low.js.map +1 -0
  437. package/dist/dev/icons/dist/html/compat/volume-off.js +6 -0
  438. package/dist/dev/icons/dist/html/compat/volume-off.js.map +1 -0
  439. package/dist/dev/icons/dist/html/default/index.d.ts +25 -26
  440. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-enter.js +1 -1
  441. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-enter.js.map +1 -1
  442. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-exit.js +1 -1
  443. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-exit.js.map +1 -1
  444. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-off.js +1 -1
  445. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-off.js.map +1 -1
  446. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-on.js +1 -1
  447. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-on.js.map +1 -1
  448. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-enter.js +1 -1
  449. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-enter.js.map +1 -1
  450. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-exit.js +1 -1
  451. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-exit.js.map +1 -1
  452. package/dist/dev/icons/dist/html/{minimal → neutral}/check.js +1 -1
  453. package/dist/dev/icons/dist/html/{minimal → neutral}/check.js.map +1 -1
  454. package/dist/dev/icons/dist/html/{minimal → neutral}/chevron.js +1 -1
  455. package/dist/dev/icons/dist/html/{minimal → neutral}/chevron.js.map +1 -1
  456. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-enter.js +1 -1
  457. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-enter.js.map +1 -1
  458. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-exit.js +1 -1
  459. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-exit.js.map +1 -1
  460. package/dist/dev/icons/dist/html/{minimal → neutral}/gear.js +1 -1
  461. package/dist/dev/icons/dist/html/{minimal → neutral}/gear.js.map +1 -1
  462. package/dist/dev/icons/dist/html/neutral/index.d.ts +28 -0
  463. package/dist/dev/icons/dist/html/{minimal → neutral}/pause.js +1 -1
  464. package/dist/dev/icons/dist/html/{minimal → neutral}/pause.js.map +1 -1
  465. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-enter.js +1 -1
  466. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-enter.js.map +1 -1
  467. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-exit.js +1 -1
  468. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-exit.js.map +1 -1
  469. package/dist/dev/icons/dist/html/{minimal → neutral}/play.js +1 -1
  470. package/dist/dev/icons/dist/html/{minimal → neutral}/play.js.map +1 -1
  471. package/dist/dev/icons/dist/html/{minimal → neutral}/quality.js +1 -1
  472. package/dist/dev/icons/dist/html/{minimal → neutral}/quality.js.map +1 -1
  473. package/dist/dev/icons/dist/html/{minimal → neutral}/restart.js +1 -1
  474. package/dist/dev/icons/dist/html/{minimal → neutral}/restart.js.map +1 -1
  475. package/dist/dev/icons/dist/html/{minimal → neutral}/seek.js +1 -1
  476. package/dist/dev/icons/dist/html/{minimal → neutral}/seek.js.map +1 -1
  477. package/dist/dev/icons/dist/html/{minimal → neutral}/speech.js +1 -1
  478. package/dist/dev/icons/dist/html/{minimal → neutral}/speech.js.map +1 -1
  479. package/dist/dev/icons/dist/html/{minimal → neutral}/speed.js +1 -1
  480. package/dist/dev/icons/dist/html/{minimal → neutral}/speed.js.map +1 -1
  481. package/dist/dev/icons/dist/html/neutral/spinner.js +6 -0
  482. package/dist/dev/icons/dist/html/{minimal → neutral}/spinner.js.map +1 -1
  483. package/dist/dev/icons/dist/html/{minimal → neutral}/switches.js +1 -1
  484. package/dist/dev/icons/dist/html/{minimal → neutral}/switches.js.map +1 -1
  485. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-high.js +1 -1
  486. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-high.js.map +1 -1
  487. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-low.js +1 -1
  488. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-low.js.map +1 -1
  489. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-off.js +1 -1
  490. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-off.js.map +1 -1
  491. package/dist/dev/icons/element/compat/index.d.ts +1 -0
  492. package/dist/dev/icons/element/compat/index.js +1 -0
  493. package/dist/dev/icons/element/neutral/index.d.ts +1 -0
  494. package/dist/dev/icons/element/neutral/index.js +1 -0
  495. package/dist/dev/icons/element/register/index.d.ts +1 -2
  496. package/dist/dev/icons/neutral/index.d.ts +2 -0
  497. package/dist/dev/icons/neutral/index.js +26 -0
  498. package/dist/dev/index.d.ts +12 -7
  499. package/dist/dev/index.js +4 -3
  500. package/dist/dev/internal/skins/compat-audio/register.d.ts +43 -0
  501. package/dist/dev/internal/skins/compat-audio/register.js +72 -0
  502. package/dist/dev/internal/skins/compat-audio/register.js.map +1 -0
  503. package/dist/dev/internal/skins/compat-audio/skin.css +1891 -0
  504. package/dist/dev/internal/skins/compat-audio/template.js +217 -0
  505. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -0
  506. package/dist/dev/internal/skins/compat-live-audio/register.d.ts +27 -0
  507. package/dist/dev/internal/skins/compat-live-audio/register.js +52 -0
  508. package/dist/dev/internal/skins/compat-live-audio/register.js.map +1 -0
  509. package/dist/dev/internal/skins/compat-live-audio/skin.css +1676 -0
  510. package/dist/dev/internal/skins/compat-live-audio/template.js +114 -0
  511. package/dist/dev/internal/skins/compat-live-audio/template.js.map +1 -0
  512. package/dist/dev/internal/skins/compat-live-video/register.d.ts +45 -0
  513. package/dist/dev/internal/skins/compat-live-video/register.js +88 -0
  514. package/dist/dev/internal/skins/compat-live-video/register.js.map +1 -0
  515. package/dist/dev/internal/skins/compat-live-video/skin.css +2219 -0
  516. package/dist/dev/internal/skins/compat-live-video/template.js +239 -0
  517. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -0
  518. package/dist/dev/internal/skins/compat-video/register.d.ts +62 -0
  519. package/dist/dev/internal/skins/compat-video/register.js +117 -0
  520. package/dist/dev/internal/skins/compat-video/register.js.map +1 -0
  521. package/dist/dev/internal/skins/compat-video/skin.css +2497 -0
  522. package/dist/dev/internal/skins/compat-video/template.js +459 -0
  523. package/dist/dev/internal/skins/compat-video/template.js.map +1 -0
  524. package/dist/dev/internal/skins/default-audio/register.d.ts +12 -12
  525. package/dist/dev/internal/skins/default-audio/register.js +8 -8
  526. package/dist/dev/internal/skins/default-audio/skin.css +1213 -1365
  527. package/dist/dev/internal/skins/default-live-audio/register.d.ts +4 -4
  528. package/dist/dev/internal/skins/default-live-audio/register.js +4 -4
  529. package/dist/dev/internal/skins/default-live-audio/skin.css +842 -913
  530. package/dist/dev/internal/skins/default-live-video/register.d.ts +10 -10
  531. package/dist/dev/internal/skins/default-live-video/register.js +8 -8
  532. package/dist/dev/internal/skins/default-live-video/skin.css +1548 -1728
  533. package/dist/dev/internal/skins/default-video/register.d.ts +18 -18
  534. package/dist/dev/internal/skins/default-video/register.js +13 -13
  535. package/dist/dev/internal/skins/default-video/skin.css +2034 -2403
  536. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.d.ts +14 -14
  537. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.js +20 -20
  538. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.js.map +1 -1
  539. package/dist/dev/internal/skins/neutral-audio/skin.css +1823 -0
  540. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/template.js +24 -24
  541. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/template.js.map +1 -1
  542. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.d.ts +4 -4
  543. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js +13 -13
  544. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js.map +1 -1
  545. package/dist/dev/internal/skins/neutral-live-audio/skin.css +1238 -0
  546. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js +14 -14
  547. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js.map +1 -1
  548. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.d.ts +10 -10
  549. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.js +28 -28
  550. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.js.map +1 -1
  551. package/dist/dev/internal/skins/neutral-live-video/skin.css +2069 -0
  552. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/template.js +47 -47
  553. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/template.js.map +1 -1
  554. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.d.ts +20 -20
  555. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.js +40 -40
  556. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.js.map +1 -1
  557. package/dist/dev/internal/skins/neutral-video/skin.css +2817 -0
  558. package/dist/dev/internal/skins/{minimal-video → neutral-video}/template.js +75 -75
  559. package/dist/dev/internal/skins/{minimal-video → neutral-video}/template.js.map +1 -1
  560. package/dist/dev/media/background-video/adapter.d.ts +1 -2
  561. package/dist/dev/media/background-video/template.d.ts +1 -2
  562. package/dist/dev/media/cloudflare-video/adapter.d.ts +3 -15
  563. package/dist/dev/media/dash-video/adapter.d.ts +3 -15
  564. package/dist/dev/media/hls-audio/adapter.d.ts +3 -15
  565. package/dist/dev/media/hls-background-video/adapter.d.ts +8 -5
  566. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  567. package/dist/dev/media/hls-video/adapter.d.ts +3 -15
  568. package/dist/dev/media/hlsjs-video/adapter.d.ts +3 -15
  569. package/dist/dev/media/mux-audio/hls-js.d.ts +3 -15
  570. package/dist/dev/media/mux-audio/mixin.js.map +1 -1
  571. package/dist/dev/media/mux-audio/spf.d.ts +3 -15
  572. package/dist/dev/media/mux-video/hls-js.d.ts +3 -15
  573. package/dist/dev/media/mux-video/mixin.js.map +1 -1
  574. package/dist/dev/media/mux-video/spf.d.ts +3 -15
  575. package/dist/dev/media/native-hls-video/adapter.d.ts +3 -15
  576. package/dist/dev/media/shaka-video/adapter.d.ts +3 -15
  577. package/dist/dev/media/spotify-audio/adapter.d.ts +3 -15
  578. package/dist/dev/media/tiktok-video/adapter.d.ts +3 -15
  579. package/dist/dev/media/twitch-video/adapter.d.ts +3 -15
  580. package/dist/dev/media/vimeo-video/adapter.d.ts +3 -15
  581. package/dist/dev/media/wistia-video/adapter.d.ts +1 -2
  582. package/dist/dev/media/youtube-video/adapter.d.ts +3 -15
  583. package/dist/dev/player/context.d.ts +34 -15
  584. package/dist/dev/player/context.js +9 -1
  585. package/dist/dev/player/context.js.map +1 -1
  586. package/dist/dev/player/controller.d.ts +3 -4
  587. package/dist/dev/player/controller.js.map +1 -1
  588. package/dist/dev/player/create-player.d.ts +5 -6
  589. package/dist/dev/player/create-player.js +2 -1
  590. package/dist/dev/player/create-player.js.map +1 -1
  591. package/dist/dev/player/element.js +47 -10
  592. package/dist/dev/player/element.js.map +1 -1
  593. package/dist/dev/presets/audio/compat-skin.d.ts +15 -0
  594. package/dist/dev/presets/audio/compat-skin.js +21 -0
  595. package/dist/dev/presets/audio/compat-skin.js.map +1 -0
  596. package/dist/dev/presets/audio/index.d.ts +3 -2
  597. package/dist/dev/presets/audio/index.js +3 -2
  598. package/dist/dev/presets/audio/neutral-skin.d.ts +15 -0
  599. package/dist/dev/presets/audio/neutral-skin.js +21 -0
  600. package/dist/dev/presets/audio/neutral-skin.js.map +1 -0
  601. package/dist/dev/presets/audio/player.d.ts +2 -3
  602. package/dist/dev/presets/audio/skin.d.ts +2 -3
  603. package/dist/dev/presets/audio/skin.js.map +1 -1
  604. package/dist/dev/presets/background/player.d.ts +2 -3
  605. package/dist/dev/presets/background/skin.d.ts +1 -2
  606. package/dist/dev/presets/live-audio/compat-skin.d.ts +15 -0
  607. package/dist/dev/presets/live-audio/compat-skin.js +21 -0
  608. package/dist/dev/presets/live-audio/compat-skin.js.map +1 -0
  609. package/dist/dev/presets/live-audio/index.d.ts +3 -2
  610. package/dist/dev/presets/live-audio/index.js +3 -2
  611. package/dist/dev/presets/live-audio/neutral-skin.d.ts +15 -0
  612. package/dist/dev/presets/live-audio/neutral-skin.js +21 -0
  613. package/dist/dev/presets/live-audio/neutral-skin.js.map +1 -0
  614. package/dist/dev/presets/live-audio/player.d.ts +2 -3
  615. package/dist/dev/presets/live-audio/skin.d.ts +2 -3
  616. package/dist/dev/presets/live-audio/skin.js.map +1 -1
  617. package/dist/dev/presets/live-video/compat-skin.d.ts +15 -0
  618. package/dist/dev/presets/live-video/compat-skin.js +21 -0
  619. package/dist/dev/presets/live-video/compat-skin.js.map +1 -0
  620. package/dist/dev/presets/live-video/index.d.ts +3 -2
  621. package/dist/dev/presets/live-video/index.js +3 -2
  622. package/dist/dev/presets/live-video/neutral-skin.d.ts +15 -0
  623. package/dist/dev/presets/live-video/neutral-skin.js +21 -0
  624. package/dist/dev/presets/live-video/neutral-skin.js.map +1 -0
  625. package/dist/dev/presets/live-video/player.d.ts +2 -3
  626. package/dist/dev/presets/live-video/skin.d.ts +2 -3
  627. package/dist/dev/presets/live-video/skin.js.map +1 -1
  628. package/dist/dev/presets/skin.d.ts +1 -2
  629. package/dist/dev/presets/video/compat-skin.d.ts +15 -0
  630. package/dist/dev/presets/video/compat-skin.js +21 -0
  631. package/dist/dev/presets/video/compat-skin.js.map +1 -0
  632. package/dist/dev/presets/video/index.d.ts +3 -2
  633. package/dist/dev/presets/video/index.js +3 -2
  634. package/dist/dev/presets/video/neutral-skin.d.ts +15 -0
  635. package/dist/dev/presets/video/neutral-skin.js +21 -0
  636. package/dist/dev/presets/video/neutral-skin.js.map +1 -0
  637. package/dist/dev/presets/video/player.d.ts +2 -3
  638. package/dist/dev/presets/video/skin.d.ts +2 -3
  639. package/dist/dev/presets/video/skin.js.map +1 -1
  640. package/dist/dev/store/media-attach-mixin.d.ts +6 -4
  641. package/dist/dev/store/media-attach-mixin.js +2 -0
  642. package/dist/dev/store/media-attach-mixin.js.map +1 -1
  643. package/dist/dev/store/types.d.ts +2 -4
  644. package/dist/dev/ui/airplay-button/element.d.ts +4 -5
  645. package/dist/dev/ui/airplay-button/element.js +1 -1
  646. package/dist/dev/ui/airplay-button/element.js.map +1 -1
  647. package/dist/dev/ui/alert-dialog/element.d.ts +1 -2
  648. package/dist/dev/ui/audio-track-radio-group/element.d.ts +4 -5
  649. package/dist/dev/ui/audio-track-radio-group/element.js.map +1 -1
  650. package/dist/dev/ui/buffering-indicator/element.d.ts +2 -2
  651. package/dist/dev/ui/buffering-indicator/element.js +4 -0
  652. package/dist/dev/ui/buffering-indicator/element.js.map +1 -1
  653. package/dist/dev/ui/captions-button/element.d.ts +7 -10
  654. package/dist/dev/ui/captions-button/element.js.map +1 -1
  655. package/dist/dev/ui/captions-radio-group/element.d.ts +4 -5
  656. package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
  657. package/dist/dev/ui/cast-button/element.d.ts +3 -4
  658. package/dist/dev/ui/cast-button/element.js.map +1 -1
  659. package/dist/dev/ui/container/element.d.ts +1 -2
  660. package/dist/dev/ui/container/element.js.map +1 -1
  661. package/dist/dev/ui/context-part-element.d.ts +2 -3
  662. package/dist/dev/ui/context-part-element.js.map +1 -1
  663. package/dist/dev/ui/controls/backdrop.d.ts +1 -2
  664. package/dist/dev/ui/controls/content.d.ts +1 -2
  665. package/dist/dev/ui/controls/context.d.ts +1 -2
  666. package/dist/dev/ui/controls/element.d.ts +1 -2
  667. package/dist/dev/ui/controls/element.js.map +1 -1
  668. package/dist/dev/ui/controls/group.d.ts +1 -2
  669. package/dist/dev/ui/dialog/backdrop.d.ts +1 -2
  670. package/dist/dev/ui/dialog/close.d.ts +1 -2
  671. package/dist/dev/ui/dialog/close.js.map +1 -1
  672. package/dist/dev/ui/dialog/context.d.ts +4 -3
  673. package/dist/dev/ui/dialog/context.js +1 -0
  674. package/dist/dev/ui/dialog/context.js.map +1 -1
  675. package/dist/dev/ui/dialog/description.d.ts +1 -2
  676. package/dist/dev/ui/dialog/element.d.ts +5 -4
  677. package/dist/dev/ui/dialog/element.js +4 -2
  678. package/dist/dev/ui/dialog/element.js.map +1 -1
  679. package/dist/dev/ui/dialog/popup.d.ts +1 -2
  680. package/dist/dev/ui/dialog/popup.js.map +1 -1
  681. package/dist/dev/ui/dialog/title.d.ts +1 -2
  682. package/dist/dev/ui/error-dialog/element.d.ts +1 -2
  683. package/dist/dev/ui/error-dialog/element.js.map +1 -1
  684. package/dist/dev/ui/fullscreen-button/element.d.ts +3 -5
  685. package/dist/dev/ui/fullscreen-button/element.js.map +1 -1
  686. package/dist/dev/ui/gesture/element.d.ts +1 -2
  687. package/dist/dev/ui/gesture/element.js.map +1 -1
  688. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +2 -3
  689. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -1
  690. package/dist/dev/ui/hotkey/element.d.ts +1 -2
  691. package/dist/dev/ui/hotkey/element.js.map +1 -1
  692. package/dist/dev/ui/input-indicator/element.d.ts +5 -4
  693. package/dist/dev/ui/input-indicator/element.js.map +1 -1
  694. package/dist/dev/ui/input-indicator/live-indicator.d.ts +2 -3
  695. package/dist/dev/ui/input-indicator/live-indicator.js.map +1 -1
  696. package/dist/dev/ui/live-button/element.d.ts +4 -4
  697. package/dist/dev/ui/live-button/element.js.map +1 -1
  698. package/dist/dev/ui/media-button-element.d.ts +17 -8
  699. package/dist/dev/ui/media-button-element.js +7 -6
  700. package/dist/dev/ui/media-button-element.js.map +1 -1
  701. package/dist/dev/ui/media-ui-element.d.ts +15 -7
  702. package/dist/dev/ui/media-ui-element.js +6 -1
  703. package/dist/dev/ui/media-ui-element.js.map +1 -1
  704. package/dist/dev/ui/menu/checkbox-item.d.ts +1 -2
  705. package/dist/dev/ui/menu/checkbox-item.js.map +1 -1
  706. package/dist/dev/ui/menu/content.d.ts +1 -2
  707. package/dist/dev/ui/menu/content.js.map +1 -1
  708. package/dist/dev/ui/menu/context.d.ts +9 -5
  709. package/dist/dev/ui/menu/context.js +2 -0
  710. package/dist/dev/ui/menu/context.js.map +1 -1
  711. package/dist/dev/ui/menu/element.d.ts +1 -2
  712. package/dist/dev/ui/menu/element.js.map +1 -1
  713. package/dist/dev/ui/menu/group-controller.js.map +1 -1
  714. package/dist/dev/ui/menu/group-label.d.ts +1 -2
  715. package/dist/dev/ui/menu/group-label.js.map +1 -1
  716. package/dist/dev/ui/menu/group.d.ts +1 -2
  717. package/dist/dev/ui/menu/group.js.map +1 -1
  718. package/dist/dev/ui/menu/item-indicator.d.ts +1 -2
  719. package/dist/dev/ui/menu/item.d.ts +1 -2
  720. package/dist/dev/ui/menu/item.js.map +1 -1
  721. package/dist/dev/ui/menu/radio-group.d.ts +1 -2
  722. package/dist/dev/ui/menu/radio-group.js.map +1 -1
  723. package/dist/dev/ui/menu/radio-item.d.ts +1 -2
  724. package/dist/dev/ui/menu/radio-item.js.map +1 -1
  725. package/dist/dev/ui/menu/separator.d.ts +1 -2
  726. package/dist/dev/ui/mute-button/element.d.ts +3 -4
  727. package/dist/dev/ui/mute-button/element.js.map +1 -1
  728. package/dist/dev/ui/pip-button/element.d.ts +4 -6
  729. package/dist/dev/ui/pip-button/element.js.map +1 -1
  730. package/dist/dev/ui/play-button/element.d.ts +3 -5
  731. package/dist/dev/ui/play-button/element.js +1 -1
  732. package/dist/dev/ui/play-button/element.js.map +1 -1
  733. package/dist/dev/ui/playback-rate-button/element.d.ts +4 -5
  734. package/dist/dev/ui/playback-rate-button/element.js +4 -2
  735. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  736. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -5
  737. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  738. package/dist/dev/ui/popover/element.d.ts +1 -2
  739. package/dist/dev/ui/popover/element.js +4 -2
  740. package/dist/dev/ui/popover/element.js.map +1 -1
  741. package/dist/dev/ui/position-controller.js.map +1 -1
  742. package/dist/dev/ui/poster/element.d.ts +1 -2
  743. package/dist/dev/ui/poster/element.js.map +1 -1
  744. package/dist/dev/ui/quality-radio-group/element.d.ts +4 -5
  745. package/dist/dev/ui/quality-radio-group/element.js.map +1 -1
  746. package/dist/dev/ui/radio-group/context.d.ts +4 -3
  747. package/dist/dev/ui/radio-group/context.js +1 -0
  748. package/dist/dev/ui/radio-group/context.js.map +1 -1
  749. package/dist/dev/ui/radio-group/element.d.ts +1 -2
  750. package/dist/dev/ui/radio-group/element.js.map +1 -1
  751. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  752. package/dist/dev/ui/seek-button/element.d.ts +2 -3
  753. package/dist/dev/ui/seek-button/element.js.map +1 -1
  754. package/dist/dev/ui/seek-indicator/element.d.ts +3 -4
  755. package/dist/dev/ui/seek-indicator/element.js +7 -1
  756. package/dist/dev/ui/seek-indicator/element.js.map +1 -1
  757. package/dist/dev/ui/seek-indicator/value.d.ts +1 -2
  758. package/dist/dev/ui/slider/buffer.d.ts +1 -2
  759. package/dist/dev/ui/slider/context.d.ts +4 -3
  760. package/dist/dev/ui/slider/context.js +1 -0
  761. package/dist/dev/ui/slider/context.js.map +1 -1
  762. package/dist/dev/ui/slider/element.d.ts +1 -2
  763. package/dist/dev/ui/slider/element.js.map +1 -1
  764. package/dist/dev/ui/slider/events.d.ts +4 -3
  765. package/dist/dev/ui/slider/fill.d.ts +1 -2
  766. package/dist/dev/ui/slider/preview.d.ts +1 -2
  767. package/dist/dev/ui/slider/preview.js.map +1 -1
  768. package/dist/dev/ui/slider/thumb.d.ts +1 -2
  769. package/dist/dev/ui/slider/thumb.js.map +1 -1
  770. package/dist/dev/ui/slider/thumbnail.d.ts +1 -2
  771. package/dist/dev/ui/slider/thumbnail.js.map +1 -1
  772. package/dist/dev/ui/slider/track.d.ts +1 -2
  773. package/dist/dev/ui/slider/value.d.ts +1 -2
  774. package/dist/dev/ui/slider/value.js.map +1 -1
  775. package/dist/dev/ui/status-announcer/element.d.ts +1 -2
  776. package/dist/dev/ui/status-announcer/element.js.map +1 -1
  777. package/dist/dev/ui/status-indicator/element.d.ts +9 -4
  778. package/dist/dev/ui/status-indicator/element.js +14 -1
  779. package/dist/dev/ui/status-indicator/element.js.map +1 -1
  780. package/dist/dev/ui/status-indicator/value.d.ts +1 -2
  781. package/dist/dev/ui/text/element.d.ts +4 -3
  782. package/dist/dev/ui/text/element.js +1 -0
  783. package/dist/dev/ui/text/element.js.map +1 -1
  784. package/dist/dev/ui/thumbnail/element.d.ts +5 -6
  785. package/dist/dev/ui/thumbnail/element.js +3 -2
  786. package/dist/dev/ui/thumbnail/element.js.map +1 -1
  787. package/dist/dev/ui/time/element.d.ts +1 -2
  788. package/dist/dev/ui/time/element.js.map +1 -1
  789. package/dist/dev/ui/time/group.d.ts +1 -2
  790. package/dist/dev/ui/time/separator.d.ts +1 -2
  791. package/dist/dev/ui/time-slider/chapter-title.d.ts +1 -2
  792. package/dist/dev/ui/time-slider/chapter-title.js.map +1 -1
  793. package/dist/dev/ui/time-slider/chapters.d.ts +1 -2
  794. package/dist/dev/ui/time-slider/chapters.js.map +1 -1
  795. package/dist/dev/ui/time-slider/element.d.ts +1 -2
  796. package/dist/dev/ui/time-slider/element.js.map +1 -1
  797. package/dist/dev/ui/title/element.d.ts +1 -2
  798. package/dist/dev/ui/title/element.js.map +1 -1
  799. package/dist/dev/ui/tooltip/context.d.ts +2 -2
  800. package/dist/dev/ui/tooltip/context.js +1 -0
  801. package/dist/dev/ui/tooltip/context.js.map +1 -1
  802. package/dist/dev/ui/tooltip/element.d.ts +1 -2
  803. package/dist/dev/ui/tooltip/element.js +4 -2
  804. package/dist/dev/ui/tooltip/element.js.map +1 -1
  805. package/dist/dev/ui/tooltip/group.d.ts +1 -2
  806. package/dist/dev/ui/tooltip/group.js.map +1 -1
  807. package/dist/dev/ui/tooltip/label.d.ts +1 -2
  808. package/dist/dev/ui/tooltip/label.js.map +1 -1
  809. package/dist/dev/ui/tooltip/shortcut.d.ts +1 -2
  810. package/dist/dev/ui/ui-element.d.ts +3 -3
  811. package/dist/dev/ui/ui-element.js.map +1 -1
  812. package/dist/dev/ui/volume-indicator/element.d.ts +3 -4
  813. package/dist/dev/ui/volume-indicator/element.js.map +1 -1
  814. package/dist/dev/ui/volume-indicator/fill.d.ts +1 -2
  815. package/dist/dev/ui/volume-indicator/value.d.ts +1 -2
  816. package/dist/dev/ui/volume-popover/element.d.ts +1 -2
  817. package/dist/dev/ui/volume-popover/element.js +1 -1
  818. package/dist/dev/ui/volume-popover/element.js.map +1 -1
  819. package/dist/dev/ui/volume-slider/element.d.ts +1 -2
  820. package/dist/dev/ui/volume-slider/element.js +1 -1
  821. package/dist/dev/ui/volume-slider/element.js.map +1 -1
  822. package/dist/dev/version.d.ts +21 -0
  823. package/dist/dev/version.js +29 -0
  824. package/dist/dev/version.js.map +1 -0
  825. package/docs/README.md +1 -1
  826. package/docs/guides/autoplay.md +10 -21
  827. package/docs/guides/background-video.md +74 -7
  828. package/docs/guides/browser-support.md +48 -36
  829. package/docs/guides/build-your-own-component.md +5 -5
  830. package/docs/guides/captions.md +46 -6
  831. package/docs/guides/casting.md +24 -8
  832. package/docs/guides/cdn.md +11 -10
  833. package/docs/guides/content-security-policy.md +29 -5
  834. package/docs/guides/controls.md +25 -10
  835. package/docs/guides/customize-skins.md +2 -2
  836. package/docs/guides/features.md +3 -1
  837. package/docs/guides/fullscreen.md +35 -8
  838. package/docs/guides/installation-cdn.md +5 -5
  839. package/docs/guides/installation-shadcn.md +4 -4
  840. package/docs/guides/installation-svelte.md +5 -5
  841. package/docs/guides/installation-vue.md +5 -5
  842. package/docs/guides/installation.md +5 -5
  843. package/docs/guides/internationalization.md +37 -28
  844. package/docs/guides/keyboard-shortcuts.md +27 -15
  845. package/docs/guides/live-streams.md +51 -13
  846. package/docs/guides/llms.txt +6 -5
  847. package/docs/guides/media-sources.md +8 -5
  848. package/docs/guides/migrate-from-media-chrome.md +182 -51
  849. package/docs/guides/migrate-from-mux-player.md +191 -116
  850. package/docs/guides/migrate-from-plyr.md +171 -81
  851. package/docs/guides/migrate-from-video-js-8.md +255 -190
  852. package/docs/guides/migrate-from-vidstack.md +865 -0
  853. package/docs/guides/mux-data.md +23 -9
  854. package/docs/guides/picture-in-picture.md +22 -16
  855. package/docs/guides/playback-errors.md +10 -7
  856. package/docs/guides/poster.md +32 -11
  857. package/docs/guides/presets.md +15 -5
  858. package/docs/guides/quality.md +44 -5
  859. package/docs/guides/self-hosting.md +5 -5
  860. package/docs/guides/skins.md +6 -4
  861. package/docs/guides/thumbnails.md +24 -14
  862. package/docs/guides/ui-components.md +1 -1
  863. package/docs/guides/user-preferences.md +38 -15
  864. package/docs/guides/v10-roadmap.md +1 -1
  865. package/docs/llms.txt +45 -11
  866. package/docs/reference/api/create-i18n.md +3 -3
  867. package/docs/reference/api/create-translator.md +1 -1
  868. package/docs/reference/api/feature-audio-track.md +1 -1
  869. package/docs/reference/api/feature-controls.md +2 -2
  870. package/docs/reference/api/feature-fullscreen.md +1 -2
  871. package/docs/reference/api/feature-pip.md +3 -4
  872. package/docs/reference/api/feature-playback.md +2 -3
  873. package/docs/reference/api/feature-quality.md +2 -2
  874. package/docs/reference/api/feature-remote-playback.md +1 -1
  875. package/docs/reference/api/feature-source.md +2 -8
  876. package/docs/reference/api/feature-text-tracks.md +6 -8
  877. package/docs/reference/api/feature-volume.md +1 -1
  878. package/docs/reference/api/find-locale-keys.md +32 -0
  879. package/docs/reference/api/get-locale-key.md +32 -0
  880. package/docs/reference/api/html-create-player.md +24 -26
  881. package/docs/reference/api/i18n-controller.md +1 -1
  882. package/docs/reference/api/is-text.md +33 -0
  883. package/docs/reference/api/llms.txt +23 -2
  884. package/docs/reference/api/load-locale.md +36 -0
  885. package/docs/reference/api/media-capabilities.md +255 -0
  886. package/docs/reference/api/player-controller.md +39 -20
  887. package/docs/reference/api/player-store.md +112 -0
  888. package/docs/reference/api/preset-audio.md +116 -0
  889. package/docs/reference/api/preset-background.md +103 -0
  890. package/docs/reference/api/preset-live-audio.md +119 -0
  891. package/docs/reference/api/preset-live-video.md +124 -0
  892. package/docs/reference/api/preset-video.md +123 -0
  893. package/docs/reference/api/register-i18n.md +13 -0
  894. package/docs/reference/api/resolve-adapter-type.md +98 -0
  895. package/docs/reference/api/resolve-mime-type.md +48 -0
  896. package/docs/reference/api/resolve-translation.md +36 -0
  897. package/docs/reference/api/translate-text.md +56 -0
  898. package/docs/reference/api/translation-phrases.md +13 -0
  899. package/docs/reference/api/ui-element.md +296 -0
  900. package/docs/reference/components/audio-compat-skin.md +33 -0
  901. package/docs/reference/components/{audio-minimal-skin.md → audio-neutral-skin.md} +6 -6
  902. package/docs/reference/components/audio-skin.md +2 -2
  903. package/docs/reference/components/background-video-skin.md +1 -1
  904. package/docs/reference/components/background-video.md +1 -1
  905. package/docs/reference/components/captions-button.md +1 -1
  906. package/docs/reference/components/captions-radio-group.md +1 -1
  907. package/docs/reference/components/cloudflare-video.md +1 -1
  908. package/docs/reference/components/controls.md +2 -2
  909. package/docs/reference/components/dash-video.md +1 -1
  910. package/docs/reference/components/fullscreen-button.md +1 -1
  911. package/docs/reference/components/google-cast.md +4 -4
  912. package/docs/reference/components/hls-audio.md +1 -1
  913. package/docs/reference/components/hls-background-video.md +1 -1
  914. package/docs/reference/components/hls-video.md +1 -1
  915. package/docs/reference/components/hlsjs-video.md +2 -2
  916. package/docs/reference/components/icons.md +130 -0
  917. package/docs/reference/components/live-audio-compat-skin.md +35 -0
  918. package/docs/reference/components/{live-audio-minimal-skin.md → live-audio-neutral-skin.md} +6 -6
  919. package/docs/reference/components/live-audio-skin.md +2 -2
  920. package/docs/reference/components/live-video-compat-skin.md +41 -0
  921. package/docs/reference/components/{live-video-minimal-skin.md → live-video-neutral-skin.md} +6 -6
  922. package/docs/reference/components/live-video-skin.md +2 -2
  923. package/docs/reference/components/llms.txt +16 -6
  924. package/docs/reference/components/menu.md +7 -2
  925. package/docs/reference/components/mux-audio.md +2 -2
  926. package/docs/reference/components/mux-background-video.md +1 -1
  927. package/docs/reference/components/mux-data.md +4 -4
  928. package/docs/reference/components/mux-video.md +4 -4
  929. package/docs/reference/components/native-hls-video.md +1 -1
  930. package/docs/reference/components/pip-button.md +2 -2
  931. package/docs/reference/components/player.md +26 -2
  932. package/docs/reference/components/popover.md +6 -8
  933. package/docs/reference/components/shaka-video.md +1 -1
  934. package/docs/reference/components/spotify-audio.md +1 -1
  935. package/docs/reference/components/status-indicator.md +27 -4
  936. package/docs/reference/components/thumbnail.md +1 -1
  937. package/docs/reference/components/tiktok-video.md +1 -1
  938. package/docs/reference/components/twitch-video.md +1 -1
  939. package/docs/reference/components/video-compat-skin.md +45 -0
  940. package/docs/reference/components/{video-minimal-skin.md → video-neutral-skin.md} +6 -6
  941. package/docs/reference/components/video-skin.md +2 -2
  942. package/docs/reference/components/vimeo-video.md +1 -1
  943. package/docs/reference/components/wistia-video.md +1 -1
  944. package/docs/reference/components/youtube-video.md +1 -1
  945. package/package.json +54 -42
  946. package/dist/default/define/audio/minimal-skin.css +0 -2048
  947. package/dist/default/define/audio/minimal-skin.js +0 -6
  948. package/dist/default/define/audio/minimal-skin2.js +0 -4
  949. package/dist/default/define/live-audio/minimal-skin.css +0 -1378
  950. package/dist/default/define/live-audio/minimal-skin.js +0 -6
  951. package/dist/default/define/live-audio/minimal-skin2.js +0 -4
  952. package/dist/default/define/live-video/minimal-skin.css +0 -2311
  953. package/dist/default/define/live-video/minimal-skin.js +0 -6
  954. package/dist/default/define/live-video/minimal-skin2.js +0 -4
  955. package/dist/default/define/video/minimal-skin.css +0 -3232
  956. package/dist/default/define/video/minimal-skin.js +0 -6
  957. package/dist/default/define/video/minimal-skin2.js +0 -4
  958. package/dist/default/extensions/media-extension-element.js +0 -54
  959. package/dist/default/icons/element/minimal/index.js +0 -1
  960. package/dist/default/icons/minimal/index.js +0 -26
  961. package/dist/default/internal/skins/minimal-audio/skin.css +0 -1977
  962. package/dist/default/internal/skins/minimal-live-audio/skin.css +0 -1307
  963. package/dist/default/internal/skins/minimal-live-video/skin.css +0 -2240
  964. package/dist/default/internal/skins/minimal-video/skin.css +0 -3161
  965. package/dist/default/presets/audio/minimal-skin.js +0 -19
  966. package/dist/default/presets/live-audio/minimal-skin.js +0 -19
  967. package/dist/default/presets/live-video/minimal-skin.js +0 -19
  968. package/dist/default/presets/video/minimal-skin.js +0 -19
  969. package/dist/dev/define/audio/minimal-skin.css +0 -2048
  970. package/dist/dev/define/audio/minimal-skin.d.ts +0 -1
  971. package/dist/dev/define/audio/minimal-skin.js +0 -8
  972. package/dist/dev/define/audio/minimal-skin.js.map +0 -1
  973. package/dist/dev/define/audio/minimal-skin2.js +0 -6
  974. package/dist/dev/define/audio/minimal-skin2.js.map +0 -1
  975. package/dist/dev/define/live-audio/minimal-skin.css +0 -1378
  976. package/dist/dev/define/live-audio/minimal-skin.d.ts +0 -1
  977. package/dist/dev/define/live-audio/minimal-skin.js +0 -8
  978. package/dist/dev/define/live-audio/minimal-skin.js.map +0 -1
  979. package/dist/dev/define/live-audio/minimal-skin2.js +0 -6
  980. package/dist/dev/define/live-audio/minimal-skin2.js.map +0 -1
  981. package/dist/dev/define/live-video/minimal-skin.css +0 -2311
  982. package/dist/dev/define/live-video/minimal-skin.d.ts +0 -1
  983. package/dist/dev/define/live-video/minimal-skin.js +0 -8
  984. package/dist/dev/define/live-video/minimal-skin.js.map +0 -1
  985. package/dist/dev/define/live-video/minimal-skin2.js +0 -6
  986. package/dist/dev/define/live-video/minimal-skin2.js.map +0 -1
  987. package/dist/dev/define/video/minimal-skin.css +0 -3232
  988. package/dist/dev/define/video/minimal-skin.d.ts +0 -1
  989. package/dist/dev/define/video/minimal-skin.js +0 -8
  990. package/dist/dev/define/video/minimal-skin.js.map +0 -1
  991. package/dist/dev/define/video/minimal-skin2.js +0 -6
  992. package/dist/dev/define/video/minimal-skin2.js.map +0 -1
  993. package/dist/dev/extensions/media-extension-element.d.ts +0 -29
  994. package/dist/dev/extensions/media-extension-element.js +0 -56
  995. package/dist/dev/extensions/media-extension-element.js.map +0 -1
  996. package/dist/dev/icons/dist/html/minimal/index.d.ts +0 -29
  997. package/dist/dev/icons/element/minimal/index.d.ts +0 -1
  998. package/dist/dev/icons/element/minimal/index.js +0 -1
  999. package/dist/dev/icons/minimal/index.js +0 -26
  1000. package/dist/dev/internal/skins/minimal-audio/skin.css +0 -1977
  1001. package/dist/dev/internal/skins/minimal-live-audio/skin.css +0 -1307
  1002. package/dist/dev/internal/skins/minimal-live-video/skin.css +0 -2240
  1003. package/dist/dev/internal/skins/minimal-video/skin.css +0 -3161
  1004. package/dist/dev/presets/audio/minimal-skin.d.ts +0 -16
  1005. package/dist/dev/presets/audio/minimal-skin.js +0 -21
  1006. package/dist/dev/presets/audio/minimal-skin.js.map +0 -1
  1007. package/dist/dev/presets/live-audio/minimal-skin.d.ts +0 -16
  1008. package/dist/dev/presets/live-audio/minimal-skin.js +0 -21
  1009. package/dist/dev/presets/live-audio/minimal-skin.js.map +0 -1
  1010. package/dist/dev/presets/live-video/minimal-skin.d.ts +0 -16
  1011. package/dist/dev/presets/live-video/minimal-skin.js +0 -21
  1012. package/dist/dev/presets/live-video/minimal-skin.js.map +0 -1
  1013. package/dist/dev/presets/video/minimal-skin.d.ts +0 -16
  1014. package/dist/dev/presets/video/minimal-skin.js +0 -21
  1015. package/dist/dev/presets/video/minimal-skin.js.map +0 -1
  1016. /package/dist/dev/define/audio/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1017. /package/dist/dev/define/live-audio/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1018. /package/dist/dev/define/live-video/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1019. /package/dist/dev/define/video/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1020. /package/dist/dev/icons/dist/element/{minimal → compat}/index.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/pip-button/element.ts"],"sourcesContent":["import { PiPButtonCore, PiPButtonDataAttrs } from '@videojs/core';\nimport { selectPiP } from '@videojs/core/dom';\nimport type { MediaPictureInPictureState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {\n static readonly tagName = 'media-pip-button';\n\n protected readonly core = new PiPButtonCore();\n protected readonly stateAttrMap = PiPButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPiP);\n protected override readonly hotkeyAction = 'togglePictureInPicture';\n\n protected activate(state: MediaPictureInPictureState): Promise<void> {\n return this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,mBAAb,cAAsC,mBAAkC;;;EAG5C,KAAA,OAAA,IAAI,cAAc;EACV,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,SAAS;EACxC,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAAkD;EACnE,OAAO,KAAK,KAAK,OAAO,KAAK;CAC/B;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/pip-button/element.ts"],"sourcesContent":["import { PiPButtonCore, PiPButtonDataAttrs, type PiPButtonState } from '@videojs/core';\nimport { selectPiP } from '@videojs/core/dom';\nimport type { MediaPictureInPictureState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PiPButtonElement extends MediaButtonElement<PiPButtonState, MediaPictureInPictureState> {\n static readonly tagName = 'media-pip-button';\n\n protected readonly core = new PiPButtonCore();\n protected readonly stateAttrMap = PiPButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPiP);\n protected override readonly hotkeyAction = 'togglePictureInPicture';\n\n protected activate(state: MediaPictureInPictureState): Promise<void> {\n return this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,mBAAb,cAAsC,mBAA+D;;;EAGzE,KAAA,OAAA,IAAI,cAAc;EACV,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,SAAS;EACxC,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAAkD;EACnE,OAAO,KAAK,KAAK,OAAO,KAAK;CAC/B;AACF"}
@@ -1,10 +1,10 @@
1
1
  import { PlayerController } from "../../player/controller.js";
2
2
  import { MediaButtonElement } from "../media-button-element.js";
3
3
  import { index_d_exports } from "../../index.js";
4
- import { PlayButtonCore } from "@videojs/core";
4
+ import { PlayButtonCore, PlayButtonState } from "@videojs/core";
5
5
  import { MediaPlaybackState } from "@videojs/media";
6
6
  //#region src/ui/play-button/element.d.ts
7
- declare class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {
7
+ export declare class PlayButtonElement extends MediaButtonElement<PlayButtonState, MediaPlaybackState> {
8
8
  static readonly tagName = "media-play-button";
9
9
  protected readonly core: PlayButtonCore;
10
10
  protected readonly stateAttrMap: {
@@ -19,11 +19,9 @@ declare class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {
19
19
  waiting: boolean;
20
20
  play: () => Promise<void>;
21
21
  pause: () => void;
22
- togglePaused: () => boolean;
23
22
  } | undefined>;
24
23
  protected readonly hotkeyAction = "togglePaused";
25
- protected activate(state: MediaPlaybackState): void;
24
+ protected activate(state: MediaPlaybackState): Promise<void>;
26
25
  }
27
26
  //#endregion
28
- export { PlayButtonElement };
29
27
  //# sourceMappingURL=element.d.ts.map
@@ -16,7 +16,7 @@ var PlayButtonElement = class extends MediaButtonElement {
16
16
  this.tagName = "media-play-button";
17
17
  }
18
18
  activate(state) {
19
- this.core.toggle(state);
19
+ return this.core.toggle(state);
20
20
  }
21
21
  };
22
22
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/play-button/element.ts"],"sourcesContent":["import { PlayButtonCore, PlayButtonDataAttrs } from '@videojs/core';\nimport { selectPlayback } from '@videojs/core/dom';\nimport type { MediaPlaybackState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlayButtonElement extends MediaButtonElement<PlayButtonCore> {\n static readonly tagName = 'media-play-button';\n\n protected readonly core = new PlayButtonCore();\n protected readonly stateAttrMap = PlayButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlayback);\n protected override readonly hotkeyAction = 'togglePaused';\n\n protected activate(state: MediaPlaybackState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,oBAAb,cAAuC,mBAAmC;;;EAG9C,KAAA,OAAA,IAAI,eAAe;EACX,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,cAAc;EAC7C,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAAiC;EAClD,KAAK,KAAK,OAAO,KAAK;CACxB;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/play-button/element.ts"],"sourcesContent":["import { PlayButtonCore, PlayButtonDataAttrs, type PlayButtonState } from '@videojs/core';\nimport { selectPlayback } from '@videojs/core/dom';\nimport type { MediaPlaybackState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlayButtonElement extends MediaButtonElement<PlayButtonState, MediaPlaybackState> {\n static readonly tagName = 'media-play-button';\n\n protected readonly core = new PlayButtonCore();\n protected readonly stateAttrMap = PlayButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlayback);\n protected override readonly hotkeyAction = 'togglePaused';\n\n protected activate(state: MediaPlaybackState): Promise<void> {\n return this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,oBAAb,cAAuC,mBAAwD;;;EAGnE,KAAA,OAAA,IAAI,eAAe;EACX,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,cAAc;EAC7C,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAA0C;EAC3D,OAAO,KAAK,KAAK,OAAO,KAAK;CAC/B;AACF"}
@@ -1,12 +1,12 @@
1
1
  import { PlayerController } from "../../player/controller.js";
2
2
  import { MediaButtonElement } from "../media-button-element.js";
3
3
  import { index_d_exports } from "../../index.js";
4
- import { PlaybackRateButtonCore } from "@videojs/core";
4
+ import { PlaybackRateButtonCore, PlaybackRateButtonState } from "@videojs/core";
5
5
  import { UIEvent } from "@videojs/core/dom";
6
6
  import { PropertyValues } from "@videojs/element";
7
7
  import { MediaPlaybackRateState } from "@videojs/media";
8
8
  //#region src/ui/playback-rate-button/element.d.ts
9
- declare class PlaybackRateButtonElement extends MediaButtonElement<PlaybackRateButtonCore> {
9
+ export declare class PlaybackRateButtonElement extends MediaButtonElement<PlaybackRateButtonState, MediaPlaybackRateState> {
10
10
  static readonly tagName = "media-playback-rate-button";
11
11
  static properties: {
12
12
  label: {
@@ -35,9 +35,8 @@ declare class PlaybackRateButtonElement extends MediaButtonElement<PlaybackRateB
35
35
  protected willUpdate(changed: PropertyValues): void;
36
36
  protected update(changed: PropertyValues): void;
37
37
  }
38
- declare namespace PlaybackRateButtonElement {
39
- type State = PlaybackRateButtonCore.State;
38
+ export declare namespace PlaybackRateButtonElement {
39
+ type State = PlaybackRateButtonState;
40
40
  }
41
41
  //#endregion
42
- export { PlaybackRateButtonElement };
43
42
  //# sourceMappingURL=element.d.ts.map
@@ -38,8 +38,10 @@ var PlaybackRateButtonElement = class extends MediaButtonElement {
38
38
  }
39
39
  willUpdate(changed) {
40
40
  super.willUpdate(changed);
41
- if (changed.has("commandfor")) if (this.commandfor) this.setAttribute("commandfor", this.commandfor);
42
- else this.removeAttribute("commandfor");
41
+ if (changed.has("commandfor")) {
42
+ if (this.commandfor) this.setAttribute("commandfor", this.commandfor);
43
+ else this.removeAttribute("commandfor");
44
+ }
43
45
  }
44
46
  update(changed) {
45
47
  super.update(changed);
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/playback-rate-button/element.ts"],"sourcesContent":["import { PlaybackRateButtonCore, PlaybackRateButtonDataAttrs } from '@videojs/core';\nimport { applyElementProps, selectPlaybackRate, type UIEvent } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { MediaPlaybackRateState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlaybackRateButtonElement extends MediaButtonElement<PlaybackRateButtonCore> {\n static readonly tagName = 'media-playback-rate-button';\n\n static override properties = {\n label: { type: String },\n disabled: { type: Boolean },\n commandfor: { type: String },\n } satisfies PropertyDeclarationMap<'label' | 'disabled' | 'commandfor'>;\n\n commandfor: string | undefined = undefined;\n\n protected readonly core = new PlaybackRateButtonCore();\n protected readonly stateAttrMap = PlaybackRateButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n protected override readonly hotkeyAction = 'speedUp';\n\n protected activate(state: MediaPlaybackRateState, event?: UIEvent): void {\n if (this.commandfor) {\n if (event instanceof KeyboardEvent) {\n // Custom elements do not synthesize a click from keyboard activation.\n // Dispatch one so the linked menu follows its normal open lifecycle.\n this.click();\n }\n\n return;\n }\n\n this.core.cycle(state);\n }\n\n protected override getIsButtonDisabled(): boolean {\n const media = this.mediaState.value;\n\n if (super.getIsButtonDisabled()) return true;\n\n if (this.commandfor && media && media.playbackRates.length === 0) return true;\n\n return false;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (changed.has('commandfor')) {\n if (this.commandfor) {\n this.setAttribute('commandfor', this.commandfor);\n } else {\n this.removeAttribute('commandfor');\n }\n }\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const media = this.mediaState.value;\n if (!media || !this.commandfor) return;\n\n applyElementProps(this, {\n 'aria-disabled': this.getIsButtonDisabled() ? 'true' : undefined,\n });\n }\n}\n\nexport namespace PlaybackRateButtonElement {\n export type State = PlaybackRateButtonCore.State;\n}\n"],"mappings":";;;;;;AASA,IAAa,4BAAb,cAA+C,mBAA2C;;;EASvD,KAAA,aAAA,KAAA;EAEP,KAAA,OAAA,IAAI,uBAAuB;EACnB,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,kBAAkB;EACjD,KAAA,eAAA;;;EAbjB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,OAAO,EAAE,MAAM,OAAO;GACtB,UAAU,EAAE,MAAM,QAAQ;GAC1B,YAAY,EAAE,MAAM,OAAO;EAC7B;;CASA,SAAmB,OAA+B,OAAuB;EACvE,IAAI,KAAK,YAAY;GACnB,IAAI,iBAAiB,eAGnB,KAAK,MAAM;GAGb;EACF;EAEA,KAAK,KAAK,MAAM,KAAK;CACvB;CAEA,sBAAkD;EAChD,MAAM,QAAQ,KAAK,WAAW;EAE9B,IAAI,MAAM,oBAAoB,GAAG,OAAO;EAExC,IAAI,KAAK,cAAc,SAAS,MAAM,cAAc,WAAW,GAAG,OAAO;EAEzE,OAAO;CACT;CAEA,WAA8B,SAA+B;EAC3D,MAAM,WAAW,OAAO;EAExB,IAAI,QAAQ,IAAI,YAAY,GAC1B,IAAI,KAAK,YACP,KAAK,aAAa,cAAc,KAAK,UAAU;OAE/C,KAAK,gBAAgB,YAAY;CAGvC;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAGpB,IAAI,CADU,KAAK,WAAW,SAChB,CAAC,KAAK,YAAY;EAEhC,kBAAkB,MAAM,EACtB,iBAAiB,KAAK,oBAAoB,IAAI,SAAS,KAAA,EACzD,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/playback-rate-button/element.ts"],"sourcesContent":["import { PlaybackRateButtonCore, PlaybackRateButtonDataAttrs, type PlaybackRateButtonState } from '@videojs/core';\nimport { applyElementProps, selectPlaybackRate, type UIEvent } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { MediaPlaybackRateState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class PlaybackRateButtonElement extends MediaButtonElement<PlaybackRateButtonState, MediaPlaybackRateState> {\n static readonly tagName = 'media-playback-rate-button';\n\n static override properties = {\n label: { type: String },\n disabled: { type: Boolean },\n commandfor: { type: String },\n } satisfies PropertyDeclarationMap<'label' | 'disabled' | 'commandfor'>;\n\n commandfor: string | undefined = undefined;\n\n protected readonly core = new PlaybackRateButtonCore();\n protected readonly stateAttrMap = PlaybackRateButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n protected override readonly hotkeyAction = 'speedUp';\n\n protected activate(state: MediaPlaybackRateState, event?: UIEvent): void {\n if (this.commandfor) {\n if (event instanceof KeyboardEvent) {\n // Custom elements do not synthesize a click from keyboard activation.\n // Dispatch one so the linked menu follows its normal open lifecycle.\n this.click();\n }\n\n return;\n }\n\n this.core.cycle(state);\n }\n\n protected override getIsButtonDisabled(): boolean {\n const media = this.mediaState.value;\n\n if (super.getIsButtonDisabled()) return true;\n\n if (this.commandfor && media && media.playbackRates.length === 0) return true;\n\n return false;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (changed.has('commandfor')) {\n if (this.commandfor) {\n this.setAttribute('commandfor', this.commandfor);\n } else {\n this.removeAttribute('commandfor');\n }\n }\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const media = this.mediaState.value;\n if (!media || !this.commandfor) return;\n\n applyElementProps(this, {\n 'aria-disabled': this.getIsButtonDisabled() ? 'true' : undefined,\n });\n }\n}\n\nexport namespace PlaybackRateButtonElement {\n export type State = PlaybackRateButtonState;\n}\n"],"mappings":";;;;;;AASA,IAAa,4BAAb,cAA+C,mBAAoE;;;EAShF,KAAA,aAAA,KAAA;EAEP,KAAA,OAAA,IAAI,uBAAuB;EACnB,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,kBAAkB;EACjD,KAAA,eAAA;;;EAbjB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,OAAO,EAAE,MAAM,OAAO;GACtB,UAAU,EAAE,MAAM,QAAQ;GAC1B,YAAY,EAAE,MAAM,OAAO;EAC7B;;CASA,SAAmB,OAA+B,OAAuB;EACvE,IAAI,KAAK,YAAY;GACnB,IAAI,iBAAiB,eAGnB,KAAK,MAAM;GAGb;EACF;EAEA,KAAK,KAAK,MAAM,KAAK;CACvB;CAEA,sBAAkD;EAChD,MAAM,QAAQ,KAAK,WAAW;EAE9B,IAAI,MAAM,oBAAoB,GAAG,OAAO;EAExC,IAAI,KAAK,cAAc,SAAS,MAAM,cAAc,WAAW,GAAG,OAAO;EAEzE,OAAO;CACT;CAEA,WAA8B,SAA+B;EAC3D,MAAM,WAAW,OAAO;EAExB,IAAI,QAAQ,IAAI,YAAY,GAAG;GAC7B,IAAI,KAAK,YACP,KAAK,aAAa,cAAc,KAAK,UAAU;QAE/C,KAAK,gBAAgB,YAAY;EAErC;CACF;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAGpB,IAAI,CADU,KAAK,WAAW,SAChB,CAAC,KAAK,YAAY;EAEhC,kBAAkB,MAAM,EACtB,iBAAiB,KAAK,oBAAoB,IAAI,SAAS,KAAA,EACzD,CAAC;CACH;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { MenuRadioGroupElement } from "../menu/radio-group.js";
2
- import { PlaybackRateRadioGroupCore } from "@videojs/core";
2
+ import { PlaybackRateRadioGroupState } from "@videojs/core";
3
3
  import { PropertyValues } from "@videojs/element";
4
4
  //#region src/ui/playback-rate-radio-group/element.d.ts
5
5
  /**
@@ -7,7 +7,7 @@ import { PropertyValues } from "@videojs/element";
7
7
  * and availability with an enclosing menu. An optional `<template>` holding one `<media-menu-radio-item>` customizes
8
8
  * each generated item.
9
9
  */
10
- declare class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {
10
+ export declare class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {
11
11
  #private;
12
12
  static readonly tagName = "media-playback-rate-radio-group";
13
13
  static properties: {
@@ -23,9 +23,8 @@ declare class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {
23
23
  connectedCallback(): void;
24
24
  protected update(changed: PropertyValues): void;
25
25
  }
26
- declare namespace PlaybackRateRadioGroupElement {
27
- type State = PlaybackRateRadioGroupCore.State;
26
+ export declare namespace PlaybackRateRadioGroupElement {
27
+ type State = PlaybackRateRadioGroupState;
28
28
  }
29
29
  //#endregion
30
- export { PlaybackRateRadioGroupElement };
31
30
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/playback-rate-radio-group/element.ts"],"sourcesContent":["import {\n PlaybackRateRadioGroupCore,\n PlaybackRateRadioGroupDataAttrs,\n type PlaybackRateRadioGroupOption,\n} from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectPlaybackRate } from '@videojs/core/dom';\nimport { translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MenuRadioGroupElement } from '../menu/radio-group';\nimport { RadioOptionsController } from '../radio-options/controller';\n\n/**\n * Menu radio group that generates a `<media-menu-radio-item>` per available playback rate and shares the selected label\n * and availability with an enclosing menu. An optional `<template>` holding one `<media-menu-radio-item>` customizes\n * each generated item.\n */\nexport class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-playback-rate-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n disabled = false;\n formatRate = PlaybackRateRadioGroupCore.defaultProps.formatRate;\n\n readonly #core = new PlaybackRateRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n readonly #options = new RadioOptionsController<PlaybackRateRadioGroupOption>(this, {\n setItemAttributes: (item, option) => item.setAttribute('data-rate', option.value),\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: PlaybackRateRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRate: this.formatRate, disabled: this.disabled });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(\n translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state))\n );\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuOptionState(state.disabled, state.hidden, state.availability);\n } else {\n this.publishMenuOptionState(true, true, 'unsupported');\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, PlaybackRateRadioGroupDataAttrs);\n }\n}\n\nexport namespace PlaybackRateRadioGroupElement {\n export type State = PlaybackRateRadioGroupCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,IAAa,gCAAb,cAAmD,sBAAsB;;;EAQ5D,KAAA,WAAA;EACE,KAAA,aAAA,2BAA2B,aAAa;EAEpC,KAAA,QAAA,IAAI,2BAA2B;EAC/B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,kBAAkB;EAC/D,KAAA,WAAA,IAAI,uBAAqD,MAAM;GACjF,oBAAoB,MAAM,WAAW,KAAK,aAAa,aAAa,OAAO,KAAK;GAChF,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAKA,YAAY;IAE/B,IAAI,OAAO,KAAKC,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EApBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CACA;CACA;CACA;CASA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,IAAI,KAAK,WAAW;EAEpB,IAAe,CAAC,KAAKD,YAAY,SAAS,KAAKA,YAAY,aACzD,kBAAkB,KAAK,WAAW,KAAKA,YAAY,WAAW;CAElE;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAKA,YAAY;EAC/B,IAAI,QAAiD;EAErD,IAAI,OAAO;GACT,KAAKC,MAAM,SAAS;IAAE,YAAY,KAAK;IAAY,UAAU,KAAK;GAAS,CAAC;GAC5E,KAAKA,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAKA,MAAM,SAAS;GAE5B,KAAK,sBACH,cAAc,KAAKA,MAAM,SAAS,KAAK,GAAG,KAAKC,MAAM,OAAO,KAAKD,MAAM,eAAe,KAAK,CAAC,CAC9F;GACA,KAAKE,SAAS,KAAK,OAAO,KAAKD,MAAM,OAAO,KAAKA,MAAM,MAAM;GAC7D,KAAK,uBAAuB,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY;EAC9E,OACE,KAAK,uBAAuB,MAAM,MAAM,aAAa;EAGvD,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,+BAA+B;CAC7E;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/playback-rate-radio-group/element.ts"],"sourcesContent":["import {\n PlaybackRateRadioGroupCore,\n PlaybackRateRadioGroupDataAttrs,\n type PlaybackRateRadioGroupOption,\n type PlaybackRateRadioGroupState,\n} from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectPlaybackRate } from '@videojs/core/dom';\nimport { translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MenuRadioGroupElement } from '../menu/radio-group';\nimport { RadioOptionsController } from '../radio-options/controller';\n\n/**\n * Menu radio group that generates a `<media-menu-radio-item>` per available playback rate and shares the selected label\n * and availability with an enclosing menu. An optional `<template>` holding one `<media-menu-radio-item>` customizes\n * each generated item.\n */\nexport class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-playback-rate-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n disabled = false;\n formatRate = PlaybackRateRadioGroupCore.defaultProps.formatRate;\n\n readonly #core = new PlaybackRateRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n readonly #options = new RadioOptionsController<PlaybackRateRadioGroupOption>(this, {\n setItemAttributes: (item, option) => item.setAttribute('data-rate', option.value),\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: PlaybackRateRadioGroupState | null = null;\n\n if (media) {\n this.#core.setProps({ formatRate: this.formatRate, disabled: this.disabled });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(\n translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state))\n );\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuOptionState(state.disabled, state.hidden, state.availability);\n } else {\n this.publishMenuOptionState(true, true, 'unsupported');\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, PlaybackRateRadioGroupDataAttrs);\n }\n}\n\nexport namespace PlaybackRateRadioGroupElement {\n export type State = PlaybackRateRadioGroupState;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,IAAa,gCAAb,cAAmD,sBAAsB;;;EAQ5D,KAAA,WAAA;EACE,KAAA,aAAA,2BAA2B,aAAa;EAEpC,KAAA,QAAA,IAAI,2BAA2B;EAC/B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,kBAAkB;EAC/D,KAAA,WAAA,IAAI,uBAAqD,MAAM;GACjF,oBAAoB,MAAM,WAAW,KAAK,aAAa,aAAa,OAAO,KAAK;GAChF,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAK,YAAY;IAE/B,IAAI,OAAO,KAAK,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EApBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CACA;CACA;CACA;CASA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,IAAI,KAAK,WAAW;EAEpB,IAAe,CAAC,KAAK,YAAY,SAAS,KAAK,YAAY,aACzD,kBAAkB,KAAK,WAAW,KAAK,YAAY,WAAW;CAElE;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,QAA4C;EAEhD,IAAI,OAAO;GACT,KAAK,MAAM,SAAS;IAAE,YAAY,KAAK;IAAY,UAAU,KAAK;GAAS,CAAC;GAC5E,KAAK,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAK,MAAM,SAAS;GAE5B,KAAK,sBACH,cAAc,KAAK,MAAM,SAAS,KAAK,GAAG,KAAK,MAAM,OAAO,KAAK,MAAM,eAAe,KAAK,CAAC,CAC9F;GACA,KAAK,SAAS,KAAK,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM;GAC7D,KAAK,uBAAuB,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY;EAC9E,OACE,KAAK,uBAAuB,MAAM,MAAM,aAAa;EAGvD,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,+BAA+B;CAC7E;AACF"}
@@ -4,7 +4,7 @@ import { PopoverOpenChangeReason, PositioningBoundary } from "@videojs/core/dom"
4
4
  import { PropertyValues } from "@videojs/element";
5
5
  //#region src/ui/popover/element.d.ts
6
6
  /** @fires open-change - Fired when the popover's open state changes. */
7
- declare class PopoverElement extends UIElement {
7
+ export declare class PopoverElement extends UIElement {
8
8
  #private;
9
9
  static readonly tagName: string;
10
10
  static properties: {
@@ -68,5 +68,4 @@ declare class PopoverElement extends UIElement {
68
68
  protected update(_changed: PropertyValues): void;
69
69
  }
70
70
  //#endregion
71
- export { PopoverElement };
72
71
  //# sourceMappingURL=element.d.ts.map
@@ -129,8 +129,10 @@ var PopoverElement = class extends UIElement {
129
129
  this.#core.setProps(this);
130
130
  if (this.#popover && changed.has("open")) {
131
131
  const { active: interactionOpen } = this.#popover.input.current;
132
- if (this.open !== interactionOpen) if (this.open) this.#popover.open();
133
- else this.#popover.close();
132
+ if (this.open !== interactionOpen) {
133
+ if (this.open) this.#popover.open();
134
+ else this.#popover.close();
135
+ }
134
136
  }
135
137
  }
136
138
  update(_changed) {
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#core","#containerCtx","#popupGroupCtx","#position","#disconnect","#popover","#snapshot","#cleanupTrigger","#currentTrigger","#syncTrigger","#triggerAbort"],"sources":["../../../../src/ui/popover/element.ts"],"sourcesContent":["import { POPUP_HOST_ATTR, PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n type PopoverApi,\n type PopoverChangeDetails,\n type PopoverOpenChangeReason,\n type PositioningBoundary,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { containerContext } from '../../player/context';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { PositionController } from '../position-controller';\nimport { UIElement } from '../ui-element';\n\n/** @fires open-change - Fired when the popover's open state changes. */\nexport class PopoverElement extends UIElement {\n static readonly tagName: string = 'media-popover';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<keyof PopoverCore.Props | 'boundary'>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new PopoverCore();\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n readonly #position = new PositionController(this);\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n\n this.#disconnect = new AbortController();\n\n this.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n group: () => this.#popupGroupCtx.value,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#popover?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\n }\n\n close(reason: PopoverOpenChangeReason = 'imperative-action'): void {\n this.#popover?.close(reason);\n }\n\n protected get triggerElement(): HTMLElement | null {\n return this.#currentTrigger;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.#popover) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#position.findTrigger();\n\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#popover.input.current;\n\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, PopoverDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply trigger ARIA to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#position.cleanup();\n return;\n }\n\n this.#position.sync({\n anchorName: this.id,\n position: { side: state.side, align: state.align },\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n onSideChange: (side) => this.setAttribute(PopoverDataAttrs.side, side),\n });\n }\n\n // --- Trigger management ---\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,iBAAb,cAAoC,UAAU;;;EAiBrC,KAAA,OAAA,YAAY,aAAa;EAClB,KAAA,cAAA,YAAY,aAAa;EAChC,KAAA,OAAA,YAAY,aAAa;EACxB,KAAA,QAAA,YAAY,aAAa;EACF,KAAA,QAAA,YAAY,aAAa;EACxC,KAAA,gBAAA,YAAY,aAAa;EACnB,KAAA,sBAAA,YAAY,aAAa;EACjC,KAAA,cAAA,YAAY,aAAa;EAC/B,KAAA,QAAA,YAAY,aAAa;EACpB,KAAA,aAAA,YAAY,aAAa;EACN,KAAA,WAAA;EAEf,KAAA,QAAA,IAAI,YAAY;EACR,KAAA,gBAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAkB,WAAW;EAAK,CAAC;EACvE,KAAA,iBAAA,IAAI,gBAAgB,MAAM,EAAE,SAAS,kBAAkB,CAAC;EAC7D,KAAA,YAAA,IAAI,mBAAmB,IAAI;EAClB,KAAA,WAAA;EACuB,KAAA,YAAA;EAGf,KAAA,cAAA;EACE,KAAA,gBAAA;EACF,KAAA,kBAAA;;;EAtCJ,KAAA,UAAA;;;EAEL,KAAA,aAAA;GAC3B,MAAM,EAAE,MAAM,QAAQ;GACtB,aAAa;IAAE,MAAM;IAAS,WAAW;GAAe;GACxD,MAAM,EAAE,MAAM,OAAO;GACrB,OAAO,EAAE,MAAM,OAAO;GACtB,OAAO,EAAE,MAAM,QAAQ;GACvB,eAAe;IAAE,MAAM;IAAS,WAAW;GAAkB;GAC7D,qBAAqB;IAAE,MAAM;IAAS,WAAW;GAAyB;GAC1E,aAAa;IAAE,MAAM;IAAS,WAAW;GAAgB;GACzD,OAAO,EAAE,MAAM,OAAO;GACtB,YAAY;IAAE,MAAM;IAAQ,WAAW;GAAc;GACrD,UAAU,EAAE,MAAM,OAAO;EAC3B;;CAcA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,IAAI,KAAK,WAAW;EAEpB,KAAK,aAAa,iBAAiB,EAAE;EAErC,KAAKI,cAAc,IAAI,gBAAgB;EAEvC,KAAKC,WAAW,cAAc;GAC5B,YAAY,iBAAiB;GAC7B,eAAe,UAAmB,YAAkC;IAClE,KAAK,OAAO;IACZ,KAAK,cAAc,IAAI,YAAY,eAAe,EAAE,QAAQ;KAAE,MAAM;KAAU,GAAG;IAAQ,EAAE,CAAC,CAAC;GAC/F;GACA,qBAAqB,KAAK;GAC1B,2BAA2B,KAAK;GAChC,mBAAmB,KAAK;GACxB,aAAa,KAAK;GAClB,kBAAkB,KAAK;GACvB,aAAa,KAAKH,eAAe;EACnC,CAAC;EAGD,KAAKG,SAAS,gBAAgB,IAAI;EAGlC,kBAAkB,MAAM,KAAKA,SAAS,YAAY,EAAE,QAAQ,KAAKD,YAAY,OAAO,CAAC;EAKrF,IAAI,KAAKE,WACP,KAAKA,UAAU,MAAM,KAAKD,SAAS,KAAK;OAExC,KAAKC,YAAY,IAAI,mBAAmB,MAAM,KAAKD,SAAS,KAAK;CAErE;CAEA,aAAgC,SAA+B;EAC7D,MAAM,aAAa,OAAO;EAI1B,IAAI,KAAK,eAAe,CAAC,KAAK,MAC5B,KAAKA,UAAU,KAAK;CAExB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKD,aAAa,MAAM;EACxB,KAAKA,cAAc;CACrB;CAEA,kBAAiC;EAC/B,KAAKG,gBAAgB;EACrB,KAAKF,UAAU,QAAQ;EACvB,MAAM,gBAAgB;CACxB;CAEA,MAAM,SAAkC,qBAA2B;EACjE,KAAKA,UAAU,MAAM,MAAM;CAC7B;CAEA,IAAc,iBAAqC;EACjD,OAAO,KAAKG;CACd;CAEA,WAA8B,SAA+B;EAC3D,MAAM,WAAW,OAAO;EACxB,KAAKR,MAAM,SAAS,IAAI;EAGxB,IAAI,KAAKK,YAAY,QAAQ,IAAI,MAAM,GAAG;GACxC,MAAM,EAAE,QAAQ,oBAAoB,KAAKA,SAAS,MAAM;GAExD,IAAI,KAAK,SAAS,iBAChB,IAAI,KAAK,MACP,KAAKA,SAAS,KAAK;QAEnB,KAAKA,SAAS,MAAM;EAG1B;CACF;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,IAAI,CAAC,KAAKA,UAAU;EAGpB,MAAM,YAAY,KAAKF,UAAU,YAAY;EAE7C,KAAKM,aAAa,SAAS;EAG3B,MAAM,QAAQ,KAAKJ,SAAS,MAAM;EAElC,KAAKL,MAAM,SAAS,KAAK;EACzB,MAAM,QAAQ,KAAKA,MAAM,SAAS;EAGlC,kBAAkB,MAAM,KAAKA,MAAM,cAAc,KAAK,CAAC;EACvD,oBAAoB,MAAM,OAAO,gBAAgB;EAIjD,IAAI,MAAM,MACR,eAAe,IAAI;OAEnB,eAAe,IAAI;EAIrB,IAAI,KAAKQ,iBACP,kBAAkB,KAAKA,iBAAiB,KAAKR,MAAM,gBAAgB,OAAO,KAAK,EAAE,CAAC;EAIpF,IAAI,CAAC,MAAM,MAAM;GACf,KAAKG,UAAU,QAAQ;GACvB;EACF;EAEA,KAAKA,UAAU,KAAK;GAClB,YAAY,KAAK;GACjB,UAAU;IAAE,MAAM,MAAM;IAAM,OAAO,MAAM;GAAM;GACjD,SAAS,KAAKK;GACd,UAAU,KAAK;GACf,WAAW,KAAKP,cAAc,OAAO,aAAa;GAClD,eAAe,SAAS,KAAK,aAAa,iBAAiB,MAAM,IAAI;EACvE,CAAC;CACH;CAIA,aAAa,WAAqC;EAChD,IAAI,cAAc,KAAKO,iBAAiB;EAExC,KAAKL,UAAU,QAAQ;EACvB,KAAKI,gBAAgB;EACrB,KAAKC,kBAAkB;EACvB,KAAKH,UAAU,kBAAkB,SAAS;EAE1C,IAAI,aAAa,KAAKA,UAAU;GAC9B,KAAKK,gBAAgB,IAAI,gBAAgB;GACzC,kBAAkB,WAAW,KAAKL,SAAS,cAAc,EAAE,QAAQ,KAAKK,cAAc,OAAO,CAAC;EAChG;CACF;CAEA,kBAAwB;EACtB,IAAI,KAAKF,iBACP,kBAAkB,KAAKA,iBAAiB;GACtC,iBAAiB,KAAA;GACjB,iBAAiB,KAAA;GACjB,iBAAiB,KAAA;EACnB,CAAC;EAGH,KAAKE,eAAe,MAAM;EAC1B,KAAKA,gBAAgB;EACrB,KAAKF,kBAAkB;CACzB;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/popover/element.ts"],"sourcesContent":["import { POPUP_HOST_ATTR, PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n type PopoverApi,\n type PopoverChangeDetails,\n type PopoverOpenChangeReason,\n type PositioningBoundary,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { containerContext } from '../../player/context';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { PositionController } from '../position-controller';\nimport { UIElement } from '../ui-element';\n\n/** @fires open-change - Fired when the popover's open state changes. */\nexport class PopoverElement extends UIElement {\n static readonly tagName: string = 'media-popover';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<keyof PopoverProps>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new PopoverCore();\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n readonly #position = new PositionController(this);\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n\n this.#disconnect = new AbortController();\n\n this.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n group: () => this.#popupGroupCtx.value,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#popover?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\n }\n\n close(reason: PopoverOpenChangeReason = 'imperative-action'): void {\n this.#popover?.close(reason);\n }\n\n protected get triggerElement(): HTMLElement | null {\n return this.#currentTrigger;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.#popover) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#position.findTrigger();\n\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#popover.input.current;\n\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, PopoverDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply trigger ARIA to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#position.cleanup();\n return;\n }\n\n this.#position.sync({\n anchorName: this.id,\n position: { side: state.side, align: state.align },\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n onSideChange: (side) => this.setAttribute(PopoverDataAttrs.side, side),\n });\n }\n\n // --- Trigger management ---\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"position-controller.js","names":["#host","#positioner","#releaseImplicitBinding","#implicitBinding"],"sources":["../../../src/ui/position-controller.ts"],"sourcesContent":["import { PopupPositioner, type PopupPositionerOptions } from '@videojs/core/dom';\nimport type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\n\nexport type PositionControllerHost = ReactiveControllerHost & HTMLElement;\n\nexport type PositionControllerOptions = Omit<PopupPositionerOptions, 'popup'>;\n\nlet popupId = 0;\n\ninterface ImplicitTriggerBinding {\n id: string;\n trigger: HTMLElement;\n}\n\n/** Connects a popup element to the shared positioning lifecycle. */\nexport class PositionController implements ReactiveController {\n readonly #host: PositionControllerHost;\n readonly #positioner = new PopupPositioner();\n #implicitBinding: ImplicitTriggerBinding | null = null;\n\n constructor(host: PositionControllerHost) {\n this.#host = host;\n host.addController(this);\n }\n\n /** Discover an explicit trigger by ID or one linked via `commandfor`. */\n findTrigger(trigger?: string): HTMLElement | null {\n const root = this.#host.getRootNode();\n\n if (root.nodeType !== Node.DOCUMENT_NODE && root.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.#releaseImplicitBinding();\n return null;\n }\n\n const scopedRoot = root as Document | DocumentFragment;\n\n if (trigger) {\n this.#releaseImplicitBinding();\n return scopedRoot.getElementById(trigger);\n }\n\n if (this.#implicitBinding) {\n const { id, trigger: boundTrigger } = this.#implicitBinding;\n\n if (\n this.#host.id === id &&\n boundTrigger.getAttribute('commandfor') === id &&\n this.#host.previousElementSibling === boundTrigger\n ) {\n return boundTrigger;\n }\n\n this.#releaseImplicitBinding();\n }\n\n if (this.#host.id) {\n return scopedRoot.querySelector<HTMLElement>(`[commandfor=\"${this.#host.id}\"]`);\n }\n\n const adjacent = this.#host.previousElementSibling;\n\n if (!(adjacent instanceof HTMLElement)) {\n if (__DEV__) {\n console.warn(\n `[${this.#host.localName}] No trigger was found. Place the popup immediately after its trigger or link them explicitly.`\n );\n }\n\n return null;\n }\n\n const claimedTarget = adjacent.getAttribute('commandfor');\n\n if (claimedTarget) {\n if (__DEV__) {\n console.warn(\n `[${this.#host.localName}] The adjacent trigger already targets \\`${claimedTarget}\\`; link this popup explicitly.`\n );\n }\n\n return null;\n }\n\n const id = nextPopupId(scopedRoot);\n\n this.#host.id = id;\n adjacent.setAttribute('commandfor', id);\n this.#implicitBinding = { id, trigger: adjacent };\n return adjacent;\n }\n\n sync(options: PositionControllerOptions): void {\n this.#positioner.sync({ ...options, popup: this.#host });\n }\n\n cleanup(): void {\n this.#positioner.cleanup();\n }\n\n hostDisconnected(): void {\n this.cleanup();\n this.#releaseImplicitBinding();\n }\n\n hostDestroyed(): void {\n this.cleanup();\n this.#releaseImplicitBinding();\n }\n\n #releaseImplicitBinding(): void {\n const binding = this.#implicitBinding;\n if (!binding) return;\n\n if (binding.trigger.getAttribute('commandfor') === binding.id) {\n binding.trigger.removeAttribute('commandfor');\n }\n\n if (this.#host.id === binding.id) {\n this.#host.removeAttribute('id');\n }\n\n this.#implicitBinding = null;\n }\n}\n\nfunction nextPopupId(root: Document | DocumentFragment): string {\n let id: string;\n\n do id = `vjs-popup-${++popupId}`;\n while (root.getElementById(id));\n\n return id;\n}\n"],"mappings":";;AAOA,IAAI,UAAU;;AAQd,IAAa,qBAAb,MAA8D;CAC5D;CACA,cAAuB,IAAI,gBAAgB;CAC3C,mBAAkD;CAElD,YAAY,MAA8B;EACxC,KAAKA,QAAQ;EACb,KAAK,cAAc,IAAI;CACzB;;CAGA,YAAY,SAAsC;EAChD,MAAM,OAAO,KAAKA,MAAM,YAAY;EAEpC,IAAI,KAAK,aAAa,KAAK,iBAAiB,KAAK,aAAa,KAAK,wBAAwB;GACzF,KAAKE,wBAAwB;GAC7B,OAAO;EACT;EAEA,MAAM,aAAa;EAEnB,IAAI,SAAS;GACX,KAAKA,wBAAwB;GAC7B,OAAO,WAAW,eAAe,OAAO;EAC1C;EAEA,IAAI,KAAKC,kBAAkB;GACzB,MAAM,EAAE,IAAI,SAAS,iBAAiB,KAAKA;GAE3C,IACE,KAAKH,MAAM,OAAO,MAClB,aAAa,aAAa,YAAY,MAAM,MAC5C,KAAKA,MAAM,2BAA2B,cAEtC,OAAO;GAGT,KAAKE,wBAAwB;EAC/B;EAEA,IAAI,KAAKF,MAAM,IACb,OAAO,WAAW,cAA2B,gBAAgB,KAAKA,MAAM,GAAG,GAAG;EAGhF,MAAM,WAAW,KAAKA,MAAM;EAE5B,IAAI,EAAE,oBAAoB,cAAc;GAEpC,QAAQ,KACN,IAAI,KAAKA,MAAM,UAAU,+FAC3B;GAGF,OAAO;EACT;EAEA,MAAM,gBAAgB,SAAS,aAAa,YAAY;EAExD,IAAI,eAAe;GAEf,QAAQ,KACN,IAAI,KAAKA,MAAM,UAAU,2CAA2C,cAAc,gCACpF;GAGF,OAAO;EACT;EAEA,MAAM,KAAK,YAAY,UAAU;EAEjC,KAAKA,MAAM,KAAK;EAChB,SAAS,aAAa,cAAc,EAAE;EACtC,KAAKG,mBAAmB;GAAE;GAAI,SAAS;EAAS;EAChD,OAAO;CACT;CAEA,KAAK,SAA0C;EAC7C,KAAKF,YAAY,KAAK;GAAE,GAAG;GAAS,OAAO,KAAKD;EAAM,CAAC;CACzD;CAEA,UAAgB;EACd,KAAKC,YAAY,QAAQ;CAC3B;CAEA,mBAAyB;EACvB,KAAK,QAAQ;EACb,KAAKC,wBAAwB;CAC/B;CAEA,gBAAsB;EACpB,KAAK,QAAQ;EACb,KAAKA,wBAAwB;CAC/B;CAEA,0BAAgC;EAC9B,MAAM,UAAU,KAAKC;EACrB,IAAI,CAAC,SAAS;EAEd,IAAI,QAAQ,QAAQ,aAAa,YAAY,MAAM,QAAQ,IACzD,QAAQ,QAAQ,gBAAgB,YAAY;EAG9C,IAAI,KAAKH,MAAM,OAAO,QAAQ,IAC5B,KAAKA,MAAM,gBAAgB,IAAI;EAGjC,KAAKG,mBAAmB;CAC1B;AACF;AAEA,SAAS,YAAY,MAA2C;CAC9D,IAAI;CAEJ;EAAG,KAAK,aAAa,EAAE;QAChB,KAAK,eAAe,EAAE;CAE7B,OAAO;AACT"}
1
+ {"version":3,"file":"position-controller.js","names":[],"sources":["../../../src/ui/position-controller.ts"],"sourcesContent":["import { PopupPositioner, type PopupPositionerOptions } from '@videojs/core/dom';\nimport type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\n\nexport type PositionControllerHost = ReactiveControllerHost & HTMLElement;\n\nexport type PositionControllerOptions = Omit<PopupPositionerOptions, 'popup'>;\n\nlet popupId = 0;\n\ninterface ImplicitTriggerBinding {\n id: string;\n trigger: HTMLElement;\n}\n\n/** Connects a popup element to the shared positioning lifecycle. */\nexport class PositionController implements ReactiveController {\n readonly #host: PositionControllerHost;\n readonly #positioner = new PopupPositioner();\n #implicitBinding: ImplicitTriggerBinding | null = null;\n\n constructor(host: PositionControllerHost) {\n this.#host = host;\n host.addController(this);\n }\n\n /** Discover an explicit trigger by ID or one linked via `commandfor`. */\n findTrigger(trigger?: string): HTMLElement | null {\n const root = this.#host.getRootNode();\n\n if (root.nodeType !== Node.DOCUMENT_NODE && root.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.#releaseImplicitBinding();\n return null;\n }\n\n const scopedRoot = root as Document | DocumentFragment;\n\n if (trigger) {\n this.#releaseImplicitBinding();\n return scopedRoot.getElementById(trigger);\n }\n\n if (this.#implicitBinding) {\n const { id, trigger: boundTrigger } = this.#implicitBinding;\n\n if (\n this.#host.id === id &&\n boundTrigger.getAttribute('commandfor') === id &&\n this.#host.previousElementSibling === boundTrigger\n ) {\n return boundTrigger;\n }\n\n this.#releaseImplicitBinding();\n }\n\n if (this.#host.id) {\n return scopedRoot.querySelector<HTMLElement>(`[commandfor=\"${this.#host.id}\"]`);\n }\n\n const adjacent = this.#host.previousElementSibling;\n\n if (!(adjacent instanceof HTMLElement)) {\n if (__DEV__) {\n console.warn(\n `[${this.#host.localName}] No trigger was found. Place the popup immediately after its trigger or link them explicitly.`\n );\n }\n\n return null;\n }\n\n const claimedTarget = adjacent.getAttribute('commandfor');\n\n if (claimedTarget) {\n if (__DEV__) {\n console.warn(\n `[${this.#host.localName}] The adjacent trigger already targets \\`${claimedTarget}\\`; link this popup explicitly.`\n );\n }\n\n return null;\n }\n\n const id = nextPopupId(scopedRoot);\n\n this.#host.id = id;\n adjacent.setAttribute('commandfor', id);\n this.#implicitBinding = { id, trigger: adjacent };\n return adjacent;\n }\n\n sync(options: PositionControllerOptions): void {\n this.#positioner.sync({ ...options, popup: this.#host });\n }\n\n cleanup(): void {\n this.#positioner.cleanup();\n }\n\n hostDisconnected(): void {\n this.cleanup();\n this.#releaseImplicitBinding();\n }\n\n hostDestroyed(): void {\n this.cleanup();\n this.#releaseImplicitBinding();\n }\n\n #releaseImplicitBinding(): void {\n const binding = this.#implicitBinding;\n if (!binding) return;\n\n if (binding.trigger.getAttribute('commandfor') === binding.id) {\n binding.trigger.removeAttribute('commandfor');\n }\n\n if (this.#host.id === binding.id) {\n this.#host.removeAttribute('id');\n }\n\n this.#implicitBinding = null;\n }\n}\n\nfunction nextPopupId(root: Document | DocumentFragment): string {\n let id: string;\n\n do id = `vjs-popup-${++popupId}`;\n while (root.getElementById(id));\n\n return id;\n}\n"],"mappings":";;AAOA,IAAI,UAAU;;AAQd,IAAa,qBAAb,MAA8D;CAC5D;CACA,cAAuB,IAAI,gBAAgB;CAC3C,mBAAkD;CAElD,YAAY,MAA8B;EACxC,KAAK,QAAQ;EACb,KAAK,cAAc,IAAI;CACzB;;CAGA,YAAY,SAAsC;EAChD,MAAM,OAAO,KAAK,MAAM,YAAY;EAEpC,IAAI,KAAK,aAAa,KAAK,iBAAiB,KAAK,aAAa,KAAK,wBAAwB;GACzF,KAAK,wBAAwB;GAC7B,OAAO;EACT;EAEA,MAAM,aAAa;EAEnB,IAAI,SAAS;GACX,KAAK,wBAAwB;GAC7B,OAAO,WAAW,eAAe,OAAO;EAC1C;EAEA,IAAI,KAAK,kBAAkB;GACzB,MAAM,EAAE,IAAI,SAAS,iBAAiB,KAAK;GAE3C,IACE,KAAK,MAAM,OAAO,MAClB,aAAa,aAAa,YAAY,MAAM,MAC5C,KAAK,MAAM,2BAA2B,cAEtC,OAAO;GAGT,KAAK,wBAAwB;EAC/B;EAEA,IAAI,KAAK,MAAM,IACb,OAAO,WAAW,cAA2B,gBAAgB,KAAK,MAAM,GAAG,GAAG;EAGhF,MAAM,WAAW,KAAK,MAAM;EAE5B,IAAI,EAAE,oBAAoB,cAAc;GAEpC,QAAQ,KACN,IAAI,KAAK,MAAM,UAAU,+FAC3B;GAGF,OAAO;EACT;EAEA,MAAM,gBAAgB,SAAS,aAAa,YAAY;EAExD,IAAI,eAAe;GAEf,QAAQ,KACN,IAAI,KAAK,MAAM,UAAU,2CAA2C,cAAc,gCACpF;GAGF,OAAO;EACT;EAEA,MAAM,KAAK,YAAY,UAAU;EAEjC,KAAK,MAAM,KAAK;EAChB,SAAS,aAAa,cAAc,EAAE;EACtC,KAAK,mBAAmB;GAAE;GAAI,SAAS;EAAS;EAChD,OAAO;CACT;CAEA,KAAK,SAA0C;EAC7C,KAAK,YAAY,KAAK;GAAE,GAAG;GAAS,OAAO,KAAK;EAAM,CAAC;CACzD;CAEA,UAAgB;EACd,KAAK,YAAY,QAAQ;CAC3B;CAEA,mBAAyB;EACvB,KAAK,QAAQ;EACb,KAAK,wBAAwB;CAC/B;CAEA,gBAAsB;EACpB,KAAK,QAAQ;EACb,KAAK,wBAAwB;CAC/B;CAEA,0BAAgC;EAC9B,MAAM,UAAU,KAAK;EACrB,IAAI,CAAC,SAAS;EAEd,IAAI,QAAQ,QAAQ,aAAa,YAAY,MAAM,QAAQ,IACzD,QAAQ,QAAQ,gBAAgB,YAAY;EAG9C,IAAI,KAAK,MAAM,OAAO,QAAQ,IAC5B,KAAK,MAAM,gBAAgB,IAAI;EAGjC,KAAK,mBAAmB;CAC1B;AACF;AAEA,SAAS,YAAY,MAA2C;CAC9D,IAAI;CAEJ;EAAG,KAAK,aAAa,EAAE;QAChB,KAAK,eAAe,EAAE;CAE7B,OAAO;AACT"}
@@ -12,7 +12,7 @@ import { PropertyValues } from "@videojs/element";
12
12
  * it: `<media-poster><img alt="Keynote speaker"></media-poster>`. Inside a skin, an `<img slot="poster">` of yours
13
13
  * replaces the one the skin carries.
14
14
  */
15
- declare class PosterElement extends UIElement {
15
+ export declare class PosterElement extends UIElement {
16
16
  #private;
17
17
  static readonly tagName = "media-poster";
18
18
  constructor();
@@ -21,5 +21,4 @@ declare class PosterElement extends UIElement {
21
21
  protected update(changed: PropertyValues): void;
22
22
  }
23
23
  //#endregion
24
- export { PosterElement };
25
24
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#core","#shadow","#fallback","#children","#playback","#metadata","#disconnect","#adopt","#loadState","#image","#imageLoadState","#applySource","#owned","#imageEvents"],"sources":["../../../../src/ui/poster/element.ts"],"sourcesContent":["import { PosterCore, PosterDataAttrs, type PosterImageLoadState } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectMetadata, selectPlayback } from '@videojs/core/dom';\nimport type { PropertyValues } from '@videojs/element';\nimport { findComposedElement, isHTMLImageElement } from '@videojs/utils/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { UIElement } from '../ui-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: block;\n}\nimg {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n}\nimg:not([src]) {\n visibility: hidden;\n}`;\n\n/**\n * Whether anything already points this image somewhere, which answers both whether the author owns the source and\n * whether there is a download to wait for. A `<source>` counts: inside a `<picture>` it can win over the `src`.\n */\nfunction hasSource(img: HTMLImageElement): boolean {\n if (img.hasAttribute('src') || img.hasAttribute('srcset')) return true;\n\n const parent = img.parentElement;\n\n return parent?.localName === 'picture' && parent.querySelector('source') !== null;\n}\n\n/**\n * Whether `complete` on this image describes a request. It is also true for one that omits both `src` and `srcset`,\n * whatever a parent `<picture>` is fetching on its behalf, so only an image sourced from its own attributes can be\n * read.\n */\nfunction hasOwnSource(img: HTMLImageElement): boolean {\n return !!img.getAttribute('src') || img.hasAttribute('srcset');\n}\n\n/**\n * The image the element draws when none is supplied, reachable from outside as `::part(image)`. Decorative by default,\n * like the one each skin carries: a resolved URL says nothing about what it depicts.\n */\nfunction createFallbackImage(): HTMLImageElement {\n const img = document.createElement('img');\n\n img.alt = '';\n img.setAttribute('part', 'image');\n img.setAttribute('decoding', 'async');\n\n return img;\n}\n\n/** How the current source is faring. */\ntype ImageLoadState = 'pending' | 'loaded' | 'error';\n\n/**\n * `<media-poster>` — sets `src` on a poster image it does not own.\n *\n * The image is a child, as in `<picture>`, but sourcing runs the other way around: `<picture>` treats the `src` on its\n * `<img>` as the fallback, while here an image with no source of its own is the one this element fills in. Give the\n * child a `src`, a `srcset`, or `<source>` candidates and it is yours, left alone.\n *\n * Left empty, the element draws an image of its own in its shadow root. Supply one as a child to describe it or wrap\n * it: `<media-poster><img alt=\"Keynote speaker\"></media-poster>`. Inside a skin, an `<img slot=\"poster\">` of yours\n * replaces the one the skin carries.\n */\nexport class PosterElement extends UIElement {\n static readonly tagName = 'media-poster';\n\n readonly #core = new PosterCore();\n readonly #shadow = this.attachShadow({ mode: 'open' });\n readonly #fallback = createFallbackImage();\n readonly #children = new MutationObserver(() => this.requestUpdate());\n\n readonly #playback = new PlayerController(this, playerContext, selectPlayback);\n readonly #metadata = new PlayerController(this, playerContext, selectMetadata);\n\n #image: HTMLImageElement | null = null;\n /** Whether `#image` had no source of its own when it became active. */\n #owned = false;\n #imageLoadState: ImageLoadState = 'pending';\n\n #imageEvents: AbortController | null = null;\n #disconnect: AbortController | null = null;\n\n constructor() {\n super();\n\n const style = document.createElement('style');\n\n style.textContent = SHADOW_CSS;\n this.#shadow.append(style, document.createElement('slot'), this.#fallback);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const { signal } = this.#disconnect;\n\n // Two ways the image can change: a skin's forwarding slot fills or empties,\n // which bubbles here, or a child is added or removed, which announces nothing.\n this.addEventListener('slotchange', () => this.requestUpdate(), { signal });\n this.#children.observe(this, { childList: true, subtree: true });\n\n if (__DEV__ && !this.#playback.value) {\n logMissingFeature(this.localName, this.#playback.displayName ?? 'playback');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.#adopt(null);\n this.#children.disconnect();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n get #loadState(): PosterImageLoadState {\n if (!this.#image || !hasSource(this.#image)) return 'none';\n\n return this.#imageLoadState === 'pending' ? 'loading' : this.#imageLoadState;\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const playback = this.#playback.value;\n if (!playback) return;\n\n // `metadata` is optional: without it nothing resolves a URL, and this stays\n // a visibility wrapper around whatever the author supplied.\n this.#core.setMedia({\n started: playback.started,\n poster: this.#metadata.value?.poster ?? '',\n });\n\n const { src } = this.#core.getState();\n\n // A skin forwards its own `<slot name=\"poster\">` in, so the image may sit a slot or two down inside a `<picture>`.\n this.#adopt(findComposedElement(this, isHTMLImageElement) ?? this.#fallback);\n this.#applySource(src);\n\n this.#core.setImageLoadState(this.#loadState);\n applyStateDataAttrs(this, this.#core.getState(), PosterDataAttrs);\n }\n\n /**\n * Ownership is settled once, when an image becomes active: after the first fill the `src` we set would itself look\n * authored. Re-slot an image with a source to hand it back, the way React decides a field is controlled at mount.\n */\n #adopt(next: HTMLImageElement | null): void {\n if (next === this.#image) return;\n\n // An image that steps aside keeps downloading whatever we pointed it at.\n if (this.#owned) this.#image?.removeAttribute('src');\n\n this.#imageEvents?.abort();\n this.#imageEvents = null;\n\n this.#image = next;\n this.#owned = next !== null && !hasSource(next);\n this.#imageLoadState = 'pending';\n\n // The fallback only occupies the shadow root while it is the active image,\n // so a supplied image never sits beside a hidden one.\n if (next === this.#fallback) this.#shadow.append(this.#fallback);\n else if (next) this.#fallback.remove();\n\n if (!next) return;\n\n // An image that finished before we started listening never fires again, so\n // its load state has to be read off it. Decoded pixels stand on their own;\n // the absence of them only means failure once `complete` can be trusted.\n if (next.naturalWidth > 0) this.#imageLoadState = 'loaded';\n else if (next.complete && hasOwnSource(next)) this.#imageLoadState = 'error';\n\n this.#imageEvents = new AbortController();\n const { signal } = this.#imageEvents;\n const settle = (loadState: ImageLoadState) => () => {\n this.#imageLoadState = loadState;\n this.requestUpdate();\n };\n\n next.addEventListener('load', settle('loaded'), { signal });\n next.addEventListener('error', settle('error'), { signal });\n }\n\n #applySource(src: string): void {\n const img = this.#image;\n if (!img || !this.#owned) return;\n\n if (!src) {\n this.#imageLoadState = 'pending';\n img.removeAttribute('src');\n } else if (img.getAttribute('src') !== src) {\n // Reset before the write, not after: how the last source fared says\n // nothing about this one, and the write itself can settle it.\n this.#imageLoadState = 'pending';\n img.setAttribute('src', src);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/poster/element.ts"],"sourcesContent":["import { PosterCore, PosterDataAttrs, type PosterImageLoadState } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectMetadata, selectPlayback } from '@videojs/core/dom';\nimport type { PropertyValues } from '@videojs/element';\nimport { findComposedElement, isHTMLImageElement } from '@videojs/utils/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { UIElement } from '../ui-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: block;\n}\nimg {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n}\nimg:not([src]) {\n visibility: hidden;\n}`;\n\n/**\n * Whether anything already points this image somewhere, which answers both whether the author owns the source and\n * whether there is a download to wait for. A `<source>` counts: inside a `<picture>` it can win over the `src`.\n */\nfunction hasSource(img: HTMLImageElement): boolean {\n if (img.hasAttribute('src') || img.hasAttribute('srcset')) return true;\n\n const parent = img.parentElement;\n\n return parent?.localName === 'picture' && parent.querySelector('source') !== null;\n}\n\n/**\n * Whether `complete` on this image describes a request. It is also true for one that omits both `src` and `srcset`,\n * whatever a parent `<picture>` is fetching on its behalf, so only an image sourced from its own attributes can be\n * read.\n */\nfunction hasOwnSource(img: HTMLImageElement): boolean {\n return !!img.getAttribute('src') || img.hasAttribute('srcset');\n}\n\n/**\n * The image the element draws when none is supplied, reachable from outside as `::part(image)`. Decorative by default,\n * like the one each skin carries: a resolved URL says nothing about what it depicts.\n */\nfunction createFallbackImage(): HTMLImageElement {\n const img = document.createElement('img');\n\n img.alt = '';\n img.setAttribute('part', 'image');\n img.setAttribute('decoding', 'async');\n\n return img;\n}\n\n/** How the current source is faring. */\ntype ImageLoadState = 'pending' | 'loaded' | 'error';\n\n/**\n * `<media-poster>` — sets `src` on a poster image it does not own.\n *\n * The image is a child, as in `<picture>`, but sourcing runs the other way around: `<picture>` treats the `src` on its\n * `<img>` as the fallback, while here an image with no source of its own is the one this element fills in. Give the\n * child a `src`, a `srcset`, or `<source>` candidates and it is yours, left alone.\n *\n * Left empty, the element draws an image of its own in its shadow root. Supply one as a child to describe it or wrap\n * it: `<media-poster><img alt=\"Keynote speaker\"></media-poster>`. Inside a skin, an `<img slot=\"poster\">` of yours\n * replaces the one the skin carries.\n */\nexport class PosterElement extends UIElement {\n static readonly tagName = 'media-poster';\n\n readonly #core = new PosterCore();\n readonly #shadow = this.attachShadow({ mode: 'open' });\n readonly #fallback = createFallbackImage();\n readonly #children = new MutationObserver(() => this.requestUpdate());\n\n readonly #playback = new PlayerController(this, playerContext, selectPlayback);\n readonly #metadata = new PlayerController(this, playerContext, selectMetadata);\n\n #image: HTMLImageElement | null = null;\n /** Whether `#image` had no source of its own when it became active. */\n #owned = false;\n #imageLoadState: ImageLoadState = 'pending';\n\n #imageEvents: AbortController | null = null;\n #disconnect: AbortController | null = null;\n\n constructor() {\n super();\n\n const style = document.createElement('style');\n\n style.textContent = SHADOW_CSS;\n this.#shadow.append(style, document.createElement('slot'), this.#fallback);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const { signal } = this.#disconnect;\n\n // Two ways the image can change: a skin's forwarding slot fills or empties,\n // which bubbles here, or a child is added or removed, which announces nothing.\n this.addEventListener('slotchange', () => this.requestUpdate(), { signal });\n this.#children.observe(this, { childList: true, subtree: true });\n\n if (__DEV__ && !this.#playback.value) {\n logMissingFeature(this.localName, this.#playback.displayName ?? 'playback');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.#adopt(null);\n this.#children.disconnect();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n get #loadState(): PosterImageLoadState {\n if (!this.#image || !hasSource(this.#image)) return 'none';\n\n return this.#imageLoadState === 'pending' ? 'loading' : this.#imageLoadState;\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const playback = this.#playback.value;\n if (!playback) return;\n\n // `metadata` is optional: without it nothing resolves a URL, and this stays\n // a visibility wrapper around whatever the author supplied.\n this.#core.setMedia({\n started: playback.started,\n poster: this.#metadata.value?.poster ?? '',\n });\n\n const { src } = this.#core.getState();\n\n // A skin forwards its own `<slot name=\"poster\">` in, so the image may sit a slot or two down inside a `<picture>`.\n this.#adopt(findComposedElement(this, isHTMLImageElement) ?? this.#fallback);\n this.#applySource(src);\n\n this.#core.setImageLoadState(this.#loadState);\n applyStateDataAttrs(this, this.#core.getState(), PosterDataAttrs);\n }\n\n /**\n * Ownership is settled once, when an image becomes active: after the first fill the `src` we set would itself look\n * authored. Re-slot an image with a source to hand it back, the way React decides a field is controlled at mount.\n */\n #adopt(next: HTMLImageElement | null): void {\n if (next === this.#image) return;\n\n // An image that steps aside keeps downloading whatever we pointed it at.\n if (this.#owned) this.#image?.removeAttribute('src');\n\n this.#imageEvents?.abort();\n this.#imageEvents = null;\n\n this.#image = next;\n this.#owned = next !== null && !hasSource(next);\n this.#imageLoadState = 'pending';\n\n // The fallback only occupies the shadow root while it is the active image,\n // so a supplied image never sits beside a hidden one.\n if (next === this.#fallback) this.#shadow.append(this.#fallback);\n else if (next) this.#fallback.remove();\n\n if (!next) return;\n\n // An image that finished before we started listening never fires again, so\n // its load state has to be read off it. Decoded pixels stand on their own;\n // the absence of them only means failure once `complete` can be trusted.\n if (next.naturalWidth > 0) this.#imageLoadState = 'loaded';\n else if (next.complete && hasOwnSource(next)) this.#imageLoadState = 'error';\n\n this.#imageEvents = new AbortController();\n const { signal } = this.#imageEvents;\n const settle = (loadState: ImageLoadState) => () => {\n this.#imageLoadState = loadState;\n this.requestUpdate();\n };\n\n next.addEventListener('load', settle('loaded'), { signal });\n next.addEventListener('error', settle('error'), { signal });\n }\n\n #applySource(src: string): void {\n const img = this.#image;\n if (!img || !this.#owned) return;\n\n if (!src) {\n this.#imageLoadState = 'pending';\n img.removeAttribute('src');\n } else if (img.getAttribute('src') !== src) {\n // Reset before the write, not after: how the last source fared says\n // nothing about this one, and the write itself can settle it.\n this.#imageLoadState = 'pending';\n img.setAttribute('src', src);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { MenuRadioGroupElement } from "../menu/radio-group.js";
2
- import { QualityRadioGroupCore } from "@videojs/core";
2
+ import { QualityRadioGroupState } from "@videojs/core";
3
3
  import { PropertyValues } from "@videojs/element";
4
4
  import { Text } from "@videojs/core/i18n";
5
5
  //#region src/ui/quality-radio-group/element.d.ts
@@ -9,7 +9,7 @@ import { Text } from "@videojs/core/i18n";
9
9
  * `<media-menu-radio-item>` customizes each generated item; its `data-part` `label`, `tier`, and `badge` descendants
10
10
  * receive the rendition's text.
11
11
  */
12
- declare class QualityRadioGroupElement extends MenuRadioGroupElement {
12
+ export declare class QualityRadioGroupElement extends MenuRadioGroupElement {
13
13
  #private;
14
14
  static readonly tagName = "media-quality-radio-group";
15
15
  static properties: {
@@ -29,9 +29,8 @@ declare class QualityRadioGroupElement extends MenuRadioGroupElement {
29
29
  connectedCallback(): void;
30
30
  protected update(changed: PropertyValues): void;
31
31
  }
32
- declare namespace QualityRadioGroupElement {
33
- type State = QualityRadioGroupCore.State;
32
+ export declare namespace QualityRadioGroupElement {
33
+ type State = QualityRadioGroupState;
34
34
  }
35
35
  //#endregion
36
- export { QualityRadioGroupElement };
37
36
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#setContent","#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/quality-radio-group/element.ts"],"sourcesContent":["import { QualityRadioGroupCore, QualityRadioGroupDataAttrs, type QualityRadioGroupOption } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectQuality } from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MenuRadioGroupElement } from '../menu/radio-group';\nimport type { MenuRadioItemElement } from '../menu/radio-item';\nimport { RadioOptionsController } from '../radio-options/controller';\n\n/**\n * Menu radio group that generates an Auto `<media-menu-radio-item>` plus one per video rendition, and shares the\n * selected label and availability with an enclosing menu. An optional `<template>` holding one\n * `<media-menu-radio-item>` customizes each generated item; its `data-part` `label`, `tier`, and `badge` descendants\n * receive the rendition's text.\n */\nexport class QualityRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-quality-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n label: { type: String },\n } satisfies PropertyDeclarationMap<'value' | 'label' | 'disabled'>;\n\n disabled = false;\n label: Text | string = '';\n formatRendition = QualityRadioGroupCore.defaultProps.formatRendition;\n\n readonly #core = new QualityRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectQuality);\n readonly #options = new RadioOptionsController<QualityRadioGroupOption>(this, {\n renderItem: (item, label, option) => this.#setContent(item, label, option.tier, option.badge),\n setItemAttributes: (item, option) => item.setAttribute('data-rendition', option.value),\n getOptionCacheKey: (option) => `${option.tier ?? ''}:${option.badge ?? ''}`,\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: QualityRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRendition: this.formatRendition, disabled: this.disabled, label: this.label });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value));\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuOptionState(state.disabled, state.hidden, state.availability);\n } else {\n this.publishMenuOptionState(true, true, 'unsupported');\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, QualityRadioGroupDataAttrs);\n }\n\n #setContent(item: MenuRadioItemElement, label: string, tier: string | undefined, badge: string | undefined): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n const tierPart = item.querySelector<HTMLElement>('[data-part~=\"tier\"]');\n const badgePart = item.querySelector<HTMLElement>('[data-part~=\"badge\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n }\n\n if (tierPart) {\n tierPart.textContent = tier ?? '';\n tierPart.hidden = !tier;\n }\n\n if (badgePart) {\n badgePart.textContent = badge ?? '';\n badgePart.hidden = !badge;\n }\n\n if (!labelPart && !tierPart && !badgePart) {\n item.textContent = [label, tier, badge].filter(Boolean).join(' ');\n }\n }\n}\n\nexport namespace QualityRadioGroupElement {\n export type State = QualityRadioGroupCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,2BAAb,cAA8C,sBAAsB;;;EASvD,KAAA,WAAA;EACY,KAAA,QAAA;EACL,KAAA,kBAAA,sBAAsB,aAAa;EAEpC,KAAA,QAAA,IAAI,sBAAsB;EAC1B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,aAAa;EAC1D,KAAA,WAAA,IAAI,uBAAgD,MAAM;GAC5E,aAAa,MAAM,OAAO,WAAW,KAAKA,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK;GAC5F,oBAAoB,MAAM,WAAW,KAAK,aAAa,kBAAkB,OAAO,KAAK;GACrF,oBAAoB,WAAW,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO,SAAS;GACvE,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAKC,YAAY;IAE/B,IAAI,OAAO,KAAKC,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EAxBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;GAC1B,OAAO,EAAE,MAAM,OAAO;EACxB;;CAMA;CACA;CACA;CACA;CAWA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,IAAI,KAAK,WAAW;EAEpB,IAAe,CAAC,KAAKD,YAAY,SAAS,KAAKA,YAAY,aACzD,kBAAkB,KAAK,WAAW,KAAKA,YAAY,WAAW;CAElE;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAKA,YAAY;EAC/B,IAAI,QAA4C;EAEhD,IAAI,OAAO;GACT,KAAKC,MAAM,SAAS;IAAE,iBAAiB,KAAK;IAAiB,UAAU,KAAK;IAAU,OAAO,KAAK;GAAM,CAAC;GACzG,KAAKA,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAKA,MAAM,SAAS;GAE5B,KAAK,sBAAsB,cAAc,KAAKA,MAAM,SAAS,KAAK,GAAG,KAAKC,MAAM,KAAK,CAAC;GACtF,KAAKC,SAAS,KAAK,OAAO,KAAKD,MAAM,OAAO,KAAKA,MAAM,MAAM;GAC7D,KAAK,uBAAuB,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY;EAC9E,OACE,KAAK,uBAAuB,MAAM,MAAM,aAAa;EAGvD,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,0BAA0B;CACxE;CAEA,YAAY,MAA4B,OAAe,MAA0B,OAAiC;EAChH,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EACxE,MAAM,WAAW,KAAK,cAA2B,uBAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;EAG1B,IAAI,UAAU;GACZ,SAAS,cAAc,QAAQ;GAC/B,SAAS,SAAS,CAAC;EACrB;EAEA,IAAI,WAAW;GACb,UAAU,cAAc,SAAS;GACjC,UAAU,SAAS,CAAC;EACtB;EAEA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAC9B,KAAK,cAAc;GAAC;GAAO;GAAM;EAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEpE;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/quality-radio-group/element.ts"],"sourcesContent":["import {\n QualityRadioGroupCore,\n QualityRadioGroupDataAttrs,\n type QualityRadioGroupOption,\n type QualityRadioGroupState,\n} from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectQuality } from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MenuRadioGroupElement } from '../menu/radio-group';\nimport type { MenuRadioItemElement } from '../menu/radio-item';\nimport { RadioOptionsController } from '../radio-options/controller';\n\n/**\n * Menu radio group that generates an Auto `<media-menu-radio-item>` plus one per video rendition, and shares the\n * selected label and availability with an enclosing menu. An optional `<template>` holding one\n * `<media-menu-radio-item>` customizes each generated item; its `data-part` `label`, `tier`, and `badge` descendants\n * receive the rendition's text.\n */\nexport class QualityRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-quality-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n label: { type: String },\n } satisfies PropertyDeclarationMap<'value' | 'label' | 'disabled'>;\n\n disabled = false;\n label: Text | string = '';\n formatRendition = QualityRadioGroupCore.defaultProps.formatRendition;\n\n readonly #core = new QualityRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectQuality);\n readonly #options = new RadioOptionsController<QualityRadioGroupOption>(this, {\n renderItem: (item, label, option) => this.#setContent(item, label, option.tier, option.badge),\n setItemAttributes: (item, option) => item.setAttribute('data-rendition', option.value),\n getOptionCacheKey: (option) => `${option.tier ?? ''}:${option.badge ?? ''}`,\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: QualityRadioGroupState | null = null;\n\n if (media) {\n this.#core.setProps({ formatRendition: this.formatRendition, disabled: this.disabled, label: this.label });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value));\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuOptionState(state.disabled, state.hidden, state.availability);\n } else {\n this.publishMenuOptionState(true, true, 'unsupported');\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, QualityRadioGroupDataAttrs);\n }\n\n #setContent(item: MenuRadioItemElement, label: string, tier: string | undefined, badge: string | undefined): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n const tierPart = item.querySelector<HTMLElement>('[data-part~=\"tier\"]');\n const badgePart = item.querySelector<HTMLElement>('[data-part~=\"badge\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n }\n\n if (tierPart) {\n tierPart.textContent = tier ?? '';\n tierPart.hidden = !tier;\n }\n\n if (badgePart) {\n badgePart.textContent = badge ?? '';\n badgePart.hidden = !badge;\n }\n\n if (!labelPart && !tierPart && !badgePart) {\n item.textContent = [label, tier, badge].filter(Boolean).join(' ');\n }\n }\n}\n\nexport namespace QualityRadioGroupElement {\n export type State = QualityRadioGroupState;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAwBA,IAAa,2BAAb,cAA8C,sBAAsB;;;EASvD,KAAA,WAAA;EACY,KAAA,QAAA;EACL,KAAA,kBAAA,sBAAsB,aAAa;EAEpC,KAAA,QAAA,IAAI,sBAAsB;EAC1B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,aAAa;EAC1D,KAAA,WAAA,IAAI,uBAAgD,MAAM;GAC5E,aAAa,MAAM,OAAO,WAAW,KAAK,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK;GAC5F,oBAAoB,MAAM,WAAW,KAAK,aAAa,kBAAkB,OAAO,KAAK;GACrF,oBAAoB,WAAW,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO,SAAS;GACvE,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAK,YAAY;IAE/B,IAAI,OAAO,KAAK,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EAxBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;GAC1B,OAAO,EAAE,MAAM,OAAO;EACxB;;CAMA;CACA;CACA;CACA;CAWA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,IAAI,KAAK,WAAW;EAEpB,IAAe,CAAC,KAAK,YAAY,SAAS,KAAK,YAAY,aACzD,kBAAkB,KAAK,WAAW,KAAK,YAAY,WAAW;CAElE;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,QAAuC;EAE3C,IAAI,OAAO;GACT,KAAK,MAAM,SAAS;IAAE,iBAAiB,KAAK;IAAiB,UAAU,KAAK;IAAU,OAAO,KAAK;GAAM,CAAC;GACzG,KAAK,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAK,MAAM,SAAS;GAE5B,KAAK,sBAAsB,cAAc,KAAK,MAAM,SAAS,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC;GACtF,KAAK,SAAS,KAAK,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM;GAC7D,KAAK,uBAAuB,MAAM,UAAU,MAAM,QAAQ,MAAM,YAAY;EAC9E,OACE,KAAK,uBAAuB,MAAM,MAAM,aAAa;EAGvD,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,0BAA0B;CACxE;CAEA,YAAY,MAA4B,OAAe,MAA0B,OAAiC;EAChH,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EACxE,MAAM,WAAW,KAAK,cAA2B,uBAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;EAG1B,IAAI,UAAU;GACZ,SAAS,cAAc,QAAQ;GAC/B,SAAS,SAAS,CAAC;EACrB;EAEA,IAAI,WAAW;GACb,UAAU,cAAc,SAAS;GACjC,UAAU,SAAS,CAAC;EACtB;EAEA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAC9B,KAAK,cAAc;GAAC;GAAO;GAAM;EAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEpE;AACF"}
@@ -1,11 +1,12 @@
1
1
  //#region src/ui/radio-group/context.d.ts
2
- interface RadioGroupContextValue {
2
+ /** @internal */
3
+ export interface RadioGroupContextValue {
3
4
  value: string;
4
5
  onValueChange: (value: string) => void;
5
6
  }
6
- declare const radioGroupContext: {
7
+ /** @internal */
8
+ export declare const radioGroupContext: {
7
9
  __context__: RadioGroupContextValue;
8
10
  };
9
11
  //#endregion
10
- export { RadioGroupContextValue, radioGroupContext };
11
12
  //# sourceMappingURL=context.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import { createContext } from "@videojs/element/context";
2
+ /** @internal */
2
3
  const radioGroupContext = createContext(Symbol("@videojs/radio-group"));
3
4
  //#endregion
4
5
  export { radioGroupContext };
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/radio-group/context.ts"],"sourcesContent":["import { createContext } from '@videojs/element/context';\n\nexport interface RadioGroupContextValue {\n value: string;\n onValueChange: (value: string) => void;\n}\n\nconst RADIO_GROUP_CONTEXT_KEY = Symbol('@videojs/radio-group');\n\nexport const radioGroupContext = createContext<RadioGroupContextValue>(RADIO_GROUP_CONTEXT_KEY);\n"],"mappings":";AASA,MAAa,oBAAoB,cAFD,OAAO,sBAEgC,CAAuB"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/radio-group/context.ts"],"sourcesContent":["import { createContext } from '@videojs/element/context';\n\n/** @internal */\nexport interface RadioGroupContextValue {\n value: string;\n onValueChange: (value: string) => void;\n}\n\nconst RADIO_GROUP_CONTEXT_KEY = Symbol('@videojs/radio-group');\n\n/** @internal */\nexport const radioGroupContext = createContext<RadioGroupContextValue>(RADIO_GROUP_CONTEXT_KEY);\n"],"mappings":";;AAWA,MAAa,oBAAoB,cAHD,OAAO,sBAGgC,CAAuB"}
@@ -2,7 +2,7 @@ import { UIElement } from "../ui-element.js";
2
2
  import { PropertyValues } from "@videojs/element";
3
3
  //#region src/ui/radio-group/element.d.ts
4
4
  /** @fires value-change - Fired when the selected value changes. */
5
- declare class RadioGroupElement extends UIElement {
5
+ export declare class RadioGroupElement extends UIElement {
6
6
  #private;
7
7
  static properties: {
8
8
  value: {
@@ -13,5 +13,4 @@ declare class RadioGroupElement extends UIElement {
13
13
  protected update(changed: PropertyValues): void;
14
14
  }
15
15
  //#endregion
16
- export { RadioGroupElement };
17
16
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#provider"],"sources":["../../../../src/ui/radio-group/element.ts"],"sourcesContent":["import type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { radioGroupContext } from './context';\n\n/** @fires value-change - Fired when the selected value changes. */\nexport class RadioGroupElement extends UIElement {\n static override properties = {\n value: { type: String },\n } satisfies PropertyDeclarationMap<'value'>;\n\n value = '';\n\n readonly #provider = new ContextProvider(this, { context: radioGroupContext });\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n this.#provider.setValue({\n value: this.value,\n onValueChange: (next: string) => {\n this.value = next;\n this.dispatchEvent(new CustomEvent('value-change', { detail: { value: next }, bubbles: true }));\n },\n });\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,oBAAb,cAAuC,UAAU;;;EAKvC,KAAA,QAAA;EAEa,KAAA,YAAA,IAAI,gBAAgB,MAAM,EAAE,SAAS,kBAAkB,CAAC;;;EANhD,KAAA,aAAA,EAC3B,OAAO,EAAE,MAAM,OAAO,EACxB;;CAIA;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,KAAKA,UAAU,SAAS;GACtB,OAAO,KAAK;GACZ,gBAAgB,SAAiB;IAC/B,KAAK,QAAQ;IACb,KAAK,cAAc,IAAI,YAAY,gBAAgB;KAAE,QAAQ,EAAE,OAAO,KAAK;KAAG,SAAS;IAAK,CAAC,CAAC;GAChG;EACF,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/radio-group/element.ts"],"sourcesContent":["import type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { radioGroupContext } from './context';\n\n/** @fires value-change - Fired when the selected value changes. */\nexport class RadioGroupElement extends UIElement {\n static override properties = {\n value: { type: String },\n } satisfies PropertyDeclarationMap<'value'>;\n\n value = '';\n\n readonly #provider = new ContextProvider(this, { context: radioGroupContext });\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n this.#provider.setValue({\n value: this.value,\n onValueChange: (next: string) => {\n this.value = next;\n this.dispatchEvent(new CustomEvent('value-change', { detail: { value: next }, bubbles: true }));\n },\n });\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,oBAAb,cAAuC,UAAU;;;EAKvC,KAAA,QAAA;EAEa,KAAA,YAAA,IAAI,gBAAgB,MAAM,EAAE,SAAS,kBAAkB,CAAC;;;EANhD,KAAA,aAAA,EAC3B,OAAO,EAAE,MAAM,OAAO,EACxB;;CAIA;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,KAAK,UAAU,SAAS;GACtB,OAAO,KAAK;GACZ,gBAAgB,SAAiB;IAC/B,KAAK,QAAQ;IACb,KAAK,cAAc,IAAI,YAAY,gBAAgB;KAAE,QAAQ,EAAE,OAAO,KAAK;KAAG,SAAS;IAAK,CAAC,CAAC;GAChG;EACF,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","names":["#host","#config","#disconnect","#handleValueChange","#contentKey","#translator","#setItemLabel"],"sources":["../../../../src/ui/radio-options/controller.ts"],"sourcesContent":["import type { RadioOption, RadioOptionsState } from '@videojs/core';\nimport { applyElementProps } from '@videojs/core/dom';\nimport { type Translator, translateText } from '@videojs/core/i18n';\nimport type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\nimport { cloneTemplateRoot, getTemplateElement, getTemplateRoot } from '@videojs/utils/dom';\n\nimport { cacheKey } from '../../i18n/cache-key';\nimport { MenuItemIndicatorElement } from '../menu/item-indicator';\nimport { MenuRadioItemElement } from '../menu/radio-item';\n\nexport type RadioOptionsControllerHost = ReactiveControllerHost &\n HTMLElement & {\n value: string;\n };\n\nexport interface RadioOptionsControllerConfig<Option extends RadioOption> {\n renderItem?: ((item: MenuRadioItemElement, label: string, option: Option) => void) | undefined;\n setItemAttributes?: ((item: MenuRadioItemElement, option: Option) => void) | undefined;\n getOptionCacheKey?: ((option: Option) => string) | undefined;\n onValueChange: (value: string) => void;\n}\n\n/** Renders normalized options into menu radio items and manages their interaction lifecycle. */\nexport class RadioOptionsController<Option extends RadioOption> implements ReactiveController {\n readonly #host: RadioOptionsControllerHost;\n readonly #config: RadioOptionsControllerConfig<Option>;\n\n #contentKey = '';\n #translator: Translator | null = null;\n #disconnect: AbortController | null = null;\n\n constructor(host: RadioOptionsControllerHost, config: RadioOptionsControllerConfig<Option>) {\n this.#host = host;\n this.#config = config;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#disconnect = new AbortController();\n this.#host.addEventListener('value-change', this.#handleValueChange, { signal: this.#disconnect.signal });\n }\n\n hostDisconnected(): void {\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n hostDestroyed(): void {\n this.hostDisconnected();\n }\n\n sync(state: RadioOptionsState<Option>, translator: Translator, locale: string): void {\n this.#host.value = state.value;\n applyElementProps(this.#host, {\n 'aria-disabled': state.disabled ? 'true' : undefined,\n hidden: state.hidden ? '' : undefined,\n });\n\n const template = getTemplateElement(this.#host);\n const templateRoot = template ? getTemplateRoot(template) : null;\n const itemRoot = templateRoot?.localName === MenuRadioItemElement.tagName ? templateRoot : null;\n\n const contentKey = `${state.options\n .map(\n (option) =>\n `${option.value}:${cacheKey(option.label, option.labelParams)}:${this.#config.getOptionCacheKey?.(option) ?? ''}`\n )\n .join('|')}::${locale}::${template?.innerHTML ?? ''}`;\n\n if (contentKey !== this.#contentKey || translator !== this.#translator) {\n this.#contentKey = contentKey;\n this.#translator = translator;\n\n for (const child of [...this.#host.children]) {\n if (child === template) continue;\n\n child.remove();\n }\n\n const items = state.options.map((option) => {\n const item = itemRoot\n ? (cloneTemplateRoot(itemRoot, this.#host.ownerDocument) as MenuRadioItemElement)\n : (this.#host.ownerDocument.createElement(MenuRadioItemElement.tagName) as MenuRadioItemElement);\n\n item.value = option.value;\n this.#config.setItemAttributes?.(item, option);\n const label = translateText(option.label, translator, option.labelParams);\n\n if (this.#config.renderItem) this.#config.renderItem(item, label, option);\n else this.#setItemLabel(item, label);\n\n return item;\n });\n\n this.#host.append(...items);\n }\n\n const optionsByValue = new Map(state.options.map((option) => [option.value, option]));\n\n for (const item of this.#host.querySelectorAll<MenuRadioItemElement>(MenuRadioItemElement.tagName)) {\n const checked = item.value === state.value;\n const option = optionsByValue.get(item.value);\n\n item.disabled = state.disabled || option?.disabled === true;\n\n for (const indicator of item.querySelectorAll<MenuItemIndicatorElement>(MenuItemIndicatorElement.tagName)) {\n indicator.checked = checked;\n }\n }\n }\n\n #handleValueChange = (event: Event): void => {\n if (event.target !== this.#host) return;\n\n const { value } = (event as CustomEvent<{ value: string }>).detail;\n\n this.#config.onValueChange(value);\n };\n\n #setItemLabel(item: MenuRadioItemElement, label: string): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n\n if (labelPart) labelPart.textContent = label;\n else item.textContent = label;\n }\n}\n"],"mappings":";;;;;;;;AAuBA,IAAa,yBAAb,MAA8F;CAC5F;CACA;CAEA,cAAc;CACd,cAAiC;CACjC,cAAsC;CAEtC,YAAY,MAAkC,QAA8C;EAC1F,KAAKA,QAAQ;EACb,KAAKC,UAAU;EACf,KAAK,cAAc,IAAI;CACzB;CAEA,gBAAsB;EACpB,KAAKC,cAAc,IAAI,gBAAgB;EACvC,KAAKF,MAAM,iBAAiB,gBAAgB,KAAKG,oBAAoB,EAAE,QAAQ,KAAKD,YAAY,OAAO,CAAC;CAC1G;CAEA,mBAAyB;EACvB,KAAKA,aAAa,MAAM;EACxB,KAAKA,cAAc;CACrB;CAEA,gBAAsB;EACpB,KAAK,iBAAiB;CACxB;CAEA,KAAK,OAAkC,YAAwB,QAAsB;EACnF,KAAKF,MAAM,QAAQ,MAAM;EACzB,kBAAkB,KAAKA,OAAO;GAC5B,iBAAiB,MAAM,WAAW,SAAS,KAAA;GAC3C,QAAQ,MAAM,SAAS,KAAK,KAAA;EAC9B,CAAC;EAED,MAAM,WAAW,mBAAmB,KAAKA,KAAK;EAC9C,MAAM,eAAe,WAAW,gBAAgB,QAAQ,IAAI;EAC5D,MAAM,WAAW,cAAc,cAAc,qBAAqB,UAAU,eAAe;EAE3F,MAAM,aAAa,GAAG,MAAM,QACzB,KACE,WACC,GAAG,OAAO,MAAM,GAAG,SAAS,OAAO,OAAO,OAAO,WAAW,EAAE,GAAG,KAAKC,QAAQ,oBAAoB,MAAM,KAAK,IACjH,CAAC,CACA,KAAK,GAAG,EAAE,IAAI,OAAO,IAAI,UAAU,aAAa;EAEnD,IAAI,eAAe,KAAKG,eAAe,eAAe,KAAKC,aAAa;GACtE,KAAKD,cAAc;GACnB,KAAKC,cAAc;GAEnB,KAAK,MAAM,SAAS,CAAC,GAAG,KAAKL,MAAM,QAAQ,GAAG;IAC5C,IAAI,UAAU,UAAU;IAExB,MAAM,OAAO;GACf;GAEA,MAAM,QAAQ,MAAM,QAAQ,KAAK,WAAW;IAC1C,MAAM,OAAO,WACR,kBAAkB,UAAU,KAAKA,MAAM,aAAa,IACpD,KAAKA,MAAM,cAAc,cAAc,qBAAqB,OAAO;IAExE,KAAK,QAAQ,OAAO;IACpB,KAAKC,QAAQ,oBAAoB,MAAM,MAAM;IAC7C,MAAM,QAAQ,cAAc,OAAO,OAAO,YAAY,OAAO,WAAW;IAExE,IAAI,KAAKA,QAAQ,YAAY,KAAKA,QAAQ,WAAW,MAAM,OAAO,MAAM;SACnE,KAAKK,cAAc,MAAM,KAAK;IAEnC,OAAO;GACT,CAAC;GAED,KAAKN,MAAM,OAAO,GAAG,KAAK;EAC5B;EAEA,MAAM,iBAAiB,IAAI,IAAI,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC;EAEpF,KAAK,MAAM,QAAQ,KAAKA,MAAM,iBAAuC,qBAAqB,OAAO,GAAG;GAClG,MAAM,UAAU,KAAK,UAAU,MAAM;GACrC,MAAM,SAAS,eAAe,IAAI,KAAK,KAAK;GAE5C,KAAK,WAAW,MAAM,YAAY,QAAQ,aAAa;GAEvD,KAAK,MAAM,aAAa,KAAK,iBAA2C,yBAAyB,OAAO,GACtG,UAAU,UAAU;EAExB;CACF;CAEA,sBAAsB,UAAuB;EAC3C,IAAI,MAAM,WAAW,KAAKA,OAAO;EAEjC,MAAM,EAAE,UAAW,MAAyC;EAE5D,KAAKC,QAAQ,cAAc,KAAK;CAClC;CAEA,cAAc,MAA4B,OAAqB;EAC7D,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WAAW,UAAU,cAAc;OAClC,KAAK,cAAc;CAC1B;AACF"}
1
+ {"version":3,"file":"controller.js","names":[],"sources":["../../../../src/ui/radio-options/controller.ts"],"sourcesContent":["import type { RadioOption, RadioOptionsState } from '@videojs/core';\nimport { applyElementProps } from '@videojs/core/dom';\nimport { type Translator, translateText } from '@videojs/core/i18n';\nimport type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\nimport { cloneTemplateRoot, getTemplateElement, getTemplateRoot } from '@videojs/utils/dom';\n\nimport { cacheKey } from '../../i18n/cache-key';\nimport { MenuItemIndicatorElement } from '../menu/item-indicator';\nimport { MenuRadioItemElement } from '../menu/radio-item';\n\nexport type RadioOptionsControllerHost = ReactiveControllerHost &\n HTMLElement & {\n value: string;\n };\n\nexport interface RadioOptionsControllerConfig<Option extends RadioOption> {\n renderItem?: ((item: MenuRadioItemElement, label: string, option: Option) => void) | undefined;\n setItemAttributes?: ((item: MenuRadioItemElement, option: Option) => void) | undefined;\n getOptionCacheKey?: ((option: Option) => string) | undefined;\n onValueChange: (value: string) => void;\n}\n\n/** Renders normalized options into menu radio items and manages their interaction lifecycle. */\nexport class RadioOptionsController<Option extends RadioOption> implements ReactiveController {\n readonly #host: RadioOptionsControllerHost;\n readonly #config: RadioOptionsControllerConfig<Option>;\n\n #contentKey = '';\n #translator: Translator | null = null;\n #disconnect: AbortController | null = null;\n\n constructor(host: RadioOptionsControllerHost, config: RadioOptionsControllerConfig<Option>) {\n this.#host = host;\n this.#config = config;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#disconnect = new AbortController();\n this.#host.addEventListener('value-change', this.#handleValueChange, { signal: this.#disconnect.signal });\n }\n\n hostDisconnected(): void {\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n hostDestroyed(): void {\n this.hostDisconnected();\n }\n\n sync(state: RadioOptionsState<Option>, translator: Translator, locale: string): void {\n this.#host.value = state.value;\n applyElementProps(this.#host, {\n 'aria-disabled': state.disabled ? 'true' : undefined,\n hidden: state.hidden ? '' : undefined,\n });\n\n const template = getTemplateElement(this.#host);\n const templateRoot = template ? getTemplateRoot(template) : null;\n const itemRoot = templateRoot?.localName === MenuRadioItemElement.tagName ? templateRoot : null;\n\n const contentKey = `${state.options\n .map(\n (option) =>\n `${option.value}:${cacheKey(option.label, option.labelParams)}:${this.#config.getOptionCacheKey?.(option) ?? ''}`\n )\n .join('|')}::${locale}::${template?.innerHTML ?? ''}`;\n\n if (contentKey !== this.#contentKey || translator !== this.#translator) {\n this.#contentKey = contentKey;\n this.#translator = translator;\n\n for (const child of [...this.#host.children]) {\n if (child === template) continue;\n\n child.remove();\n }\n\n const items = state.options.map((option) => {\n const item = itemRoot\n ? (cloneTemplateRoot(itemRoot, this.#host.ownerDocument) as MenuRadioItemElement)\n : (this.#host.ownerDocument.createElement(MenuRadioItemElement.tagName) as MenuRadioItemElement);\n\n item.value = option.value;\n this.#config.setItemAttributes?.(item, option);\n const label = translateText(option.label, translator, option.labelParams);\n\n if (this.#config.renderItem) this.#config.renderItem(item, label, option);\n else this.#setItemLabel(item, label);\n\n return item;\n });\n\n this.#host.append(...items);\n }\n\n const optionsByValue = new Map(state.options.map((option) => [option.value, option]));\n\n for (const item of this.#host.querySelectorAll<MenuRadioItemElement>(MenuRadioItemElement.tagName)) {\n const checked = item.value === state.value;\n const option = optionsByValue.get(item.value);\n\n item.disabled = state.disabled || option?.disabled === true;\n\n for (const indicator of item.querySelectorAll<MenuItemIndicatorElement>(MenuItemIndicatorElement.tagName)) {\n indicator.checked = checked;\n }\n }\n }\n\n #handleValueChange = (event: Event): void => {\n if (event.target !== this.#host) return;\n\n const { value } = (event as CustomEvent<{ value: string }>).detail;\n\n this.#config.onValueChange(value);\n };\n\n #setItemLabel(item: MenuRadioItemElement, label: string): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n\n if (labelPart) labelPart.textContent = label;\n else item.textContent = label;\n }\n}\n"],"mappings":";;;;;;;;AAuBA,IAAa,yBAAb,MAA8F;CAC5F;CACA;CAEA,cAAc;CACd,cAAiC;CACjC,cAAsC;CAEtC,YAAY,MAAkC,QAA8C;EAC1F,KAAK,QAAQ;EACb,KAAK,UAAU;EACf,KAAK,cAAc,IAAI;CACzB;CAEA,gBAAsB;EACpB,KAAK,cAAc,IAAI,gBAAgB;EACvC,KAAK,MAAM,iBAAiB,gBAAgB,KAAK,oBAAoB,EAAE,QAAQ,KAAK,YAAY,OAAO,CAAC;CAC1G;CAEA,mBAAyB;EACvB,KAAK,aAAa,MAAM;EACxB,KAAK,cAAc;CACrB;CAEA,gBAAsB;EACpB,KAAK,iBAAiB;CACxB;CAEA,KAAK,OAAkC,YAAwB,QAAsB;EACnF,KAAK,MAAM,QAAQ,MAAM;EACzB,kBAAkB,KAAK,OAAO;GAC5B,iBAAiB,MAAM,WAAW,SAAS,KAAA;GAC3C,QAAQ,MAAM,SAAS,KAAK,KAAA;EAC9B,CAAC;EAED,MAAM,WAAW,mBAAmB,KAAK,KAAK;EAC9C,MAAM,eAAe,WAAW,gBAAgB,QAAQ,IAAI;EAC5D,MAAM,WAAW,cAAc,cAAc,qBAAqB,UAAU,eAAe;EAE3F,MAAM,aAAa,GAAG,MAAM,QACzB,KACE,WACC,GAAG,OAAO,MAAM,GAAG,SAAS,OAAO,OAAO,OAAO,WAAW,EAAE,GAAG,KAAK,QAAQ,oBAAoB,MAAM,KAAK,IACjH,CAAC,CACA,KAAK,GAAG,EAAE,IAAI,OAAO,IAAI,UAAU,aAAa;EAEnD,IAAI,eAAe,KAAK,eAAe,eAAe,KAAK,aAAa;GACtE,KAAK,cAAc;GACnB,KAAK,cAAc;GAEnB,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,MAAM,QAAQ,GAAG;IAC5C,IAAI,UAAU,UAAU;IAExB,MAAM,OAAO;GACf;GAEA,MAAM,QAAQ,MAAM,QAAQ,KAAK,WAAW;IAC1C,MAAM,OAAO,WACR,kBAAkB,UAAU,KAAK,MAAM,aAAa,IACpD,KAAK,MAAM,cAAc,cAAc,qBAAqB,OAAO;IAExE,KAAK,QAAQ,OAAO;IACpB,KAAK,QAAQ,oBAAoB,MAAM,MAAM;IAC7C,MAAM,QAAQ,cAAc,OAAO,OAAO,YAAY,OAAO,WAAW;IAExE,IAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,WAAW,MAAM,OAAO,MAAM;SACnE,KAAK,cAAc,MAAM,KAAK;IAEnC,OAAO;GACT,CAAC;GAED,KAAK,MAAM,OAAO,GAAG,KAAK;EAC5B;EAEA,MAAM,iBAAiB,IAAI,IAAI,MAAM,QAAQ,KAAK,WAAW,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC;EAEpF,KAAK,MAAM,QAAQ,KAAK,MAAM,iBAAuC,qBAAqB,OAAO,GAAG;GAClG,MAAM,UAAU,KAAK,UAAU,MAAM;GACrC,MAAM,SAAS,eAAe,IAAI,KAAK,KAAK;GAE5C,KAAK,WAAW,MAAM,YAAY,QAAQ,aAAa;GAEvD,KAAK,MAAM,aAAa,KAAK,iBAA2C,yBAAyB,OAAO,GACtG,UAAU,UAAU;EAExB;CACF;CAEA,sBAAsB,UAAuB;EAC3C,IAAI,MAAM,WAAW,KAAK,OAAO;EAEjC,MAAM,EAAE,UAAW,MAAyC;EAE5D,KAAK,QAAQ,cAAc,KAAK;CAClC;CAEA,cAAc,MAA4B,OAAqB;EAC7D,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WAAW,UAAU,cAAc;OAClC,KAAK,cAAc;CAC1B;AACF"}
@@ -1,11 +1,11 @@
1
1
  import { PlayerController } from "../../player/controller.js";
2
2
  import { MediaButtonElement } from "../media-button-element.js";
3
3
  import { index_d_exports } from "../../index.js";
4
- import { SeekButtonCore } from "@videojs/core";
4
+ import { SeekButtonCore, SeekButtonState } from "@videojs/core";
5
5
  import { PropertyDeclarationMap } from "@videojs/element";
6
6
  import { MediaTimeState } from "@videojs/media";
7
7
  //#region src/ui/seek-button/element.d.ts
8
- declare class SeekButtonElement extends MediaButtonElement<SeekButtonCore> {
8
+ export declare class SeekButtonElement extends MediaButtonElement<SeekButtonState, MediaTimeState> {
9
9
  static readonly tagName = "media-seek-button";
10
10
  static properties: PropertyDeclarationMap;
11
11
  seconds: number;
@@ -25,5 +25,4 @@ declare class SeekButtonElement extends MediaButtonElement<SeekButtonCore> {
25
25
  protected activate(state: MediaTimeState): void;
26
26
  }
27
27
  //#endregion
28
- export { SeekButtonElement };
29
28
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/seek-button/element.ts"],"sourcesContent":["import { SeekButtonCore, SeekButtonDataAttrs } from '@videojs/core';\nimport { selectTime } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap } from '@videojs/element';\nimport type { MediaTimeState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class SeekButtonElement extends MediaButtonElement<SeekButtonCore> {\n static readonly tagName = 'media-seek-button';\n\n static override properties: PropertyDeclarationMap = {\n ...MediaButtonElement.properties,\n seconds: { type: Number },\n };\n\n seconds = SeekButtonCore.defaultProps.seconds;\n\n protected readonly core = new SeekButtonCore();\n protected readonly stateAttrMap = SeekButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectTime);\n protected override readonly hotkeyAction = 'seekStep';\n\n protected override get hotkeyValue(): number | undefined {\n return this.seconds;\n }\n\n protected activate(state: MediaTimeState): void {\n this.core.seek(state);\n }\n}\n"],"mappings":";;;;;;AASA,IAAa,oBAAb,cAAuC,mBAAmC;;;EAQ9D,KAAA,UAAA,eAAe,aAAa;EAEZ,KAAA,OAAA,IAAI,eAAe;EACX,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,UAAU;EACzC,KAAA,eAAA;;;EAZjB,KAAA,UAAA;;;EAE2B,KAAA,aAAA;GACnD,GAAG,mBAAmB;GACtB,SAAS,EAAE,MAAM,OAAO;EAC1B;;CASA,IAAuB,cAAkC;EACvD,OAAO,KAAK;CACd;CAEA,SAAmB,OAA6B;EAC9C,KAAK,KAAK,KAAK,KAAK;CACtB;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/seek-button/element.ts"],"sourcesContent":["import { SeekButtonCore, SeekButtonDataAttrs, type SeekButtonState } from '@videojs/core';\nimport { selectTime } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap } from '@videojs/element';\nimport type { MediaTimeState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class SeekButtonElement extends MediaButtonElement<SeekButtonState, MediaTimeState> {\n static readonly tagName = 'media-seek-button';\n\n static override properties: PropertyDeclarationMap = {\n ...MediaButtonElement.properties,\n seconds: { type: Number },\n };\n\n seconds = SeekButtonCore.defaultProps.seconds;\n\n protected readonly core = new SeekButtonCore();\n protected readonly stateAttrMap = SeekButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectTime);\n protected override readonly hotkeyAction = 'seekStep';\n\n protected override get hotkeyValue(): number | undefined {\n return this.seconds;\n }\n\n protected activate(state: MediaTimeState): void {\n this.core.seek(state);\n }\n}\n"],"mappings":";;;;;;AASA,IAAa,oBAAb,cAAuC,mBAAoD;;;EAQ/E,KAAA,UAAA,eAAe,aAAa;EAEZ,KAAA,OAAA,IAAI,eAAe;EACX,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,UAAU;EACzC,KAAA,eAAA;;;EAZjB,KAAA,UAAA;;;EAE2B,KAAA,aAAA;GACnD,GAAG,mBAAmB;GACtB,SAAS,EAAE,MAAM,OAAO;EAC1B;;CASA,IAAuB,cAAkC;EACvD,OAAO,KAAK;CACd;CAEA,SAAmB,OAA6B;EAC9C,KAAK,KAAK,KAAK,KAAK;CACtB;AACF"}
@@ -1,9 +1,9 @@
1
1
  import { LiveIndicator } from "../input-indicator/live-indicator.js";
2
2
  import { InputIndicatorElement } from "../input-indicator/element.js";
3
3
  import { index_d_exports } from "../../index.js";
4
- import { SeekIndicatorCore } from "@videojs/core";
4
+ import { SeekIndicatorCore, SeekIndicatorState } from "@videojs/core";
5
5
  //#region src/ui/seek-indicator/element.d.ts
6
- declare class SeekIndicatorElement extends InputIndicatorElement<SeekIndicatorCore.State> {
6
+ export declare class SeekIndicatorElement extends InputIndicatorElement<SeekIndicatorState> {
7
7
  #private;
8
8
  static readonly tagName = "media-seek-indicator";
9
9
  static properties: {
@@ -15,9 +15,8 @@ declare class SeekIndicatorElement extends InputIndicatorElement<SeekIndicatorCo
15
15
  closeDelay: number | undefined;
16
16
  protected get core(): SeekIndicatorCore;
17
17
  protected get transition(): index_d_exports.TransitionApi;
18
- protected get liveIndicator(): LiveIndicator<import("@videojs/core").SeekIndicatorState>;
18
+ protected get liveIndicator(): LiveIndicator<SeekIndicatorState>;
19
19
  protected syncCoreProps(): void;
20
20
  }
21
21
  //#endregion
22
- export { SeekIndicatorElement };
23
22
  //# sourceMappingURL=element.d.ts.map