@videojs/html 10.0.0-rc.4 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/README.md +0 -2
  2. package/dist/default/define/audio/compat-skin.css +1923 -0
  3. package/dist/default/define/audio/compat-skin.js +6 -0
  4. package/dist/default/define/audio/compat-skin2.js +4 -0
  5. package/dist/default/define/audio/neutral-skin.css +1855 -0
  6. package/dist/default/define/audio/neutral-skin.js +6 -0
  7. package/dist/default/define/audio/neutral-skin2.js +4 -0
  8. package/dist/default/define/audio/{minimal-ui.js → neutral-ui.js} +1 -1
  9. package/dist/default/define/audio/skin.css +1220 -1411
  10. package/dist/default/define/audio/skin2.js +1 -1
  11. package/dist/default/define/background/skin.css +8 -19
  12. package/dist/default/define/global.css +5 -21
  13. package/dist/default/define/live-audio/compat-skin.css +1708 -0
  14. package/dist/default/define/live-audio/compat-skin.js +6 -0
  15. package/dist/default/define/live-audio/compat-skin2.js +4 -0
  16. package/dist/default/define/live-audio/neutral-skin.css +1270 -0
  17. package/dist/default/define/live-audio/neutral-skin.js +6 -0
  18. package/dist/default/define/live-audio/neutral-skin2.js +4 -0
  19. package/dist/default/define/live-audio/{minimal-ui.js → neutral-ui.js} +1 -1
  20. package/dist/default/define/live-audio/skin.css +849 -959
  21. package/dist/default/define/live-audio/skin2.js +1 -1
  22. package/dist/default/define/live-video/compat-skin.css +2251 -0
  23. package/dist/default/define/live-video/compat-skin.js +6 -0
  24. package/dist/default/define/live-video/compat-skin2.js +4 -0
  25. package/dist/default/define/live-video/neutral-skin.css +2101 -0
  26. package/dist/default/define/live-video/neutral-skin.js +6 -0
  27. package/dist/default/define/live-video/neutral-skin2.js +4 -0
  28. package/dist/default/define/live-video/{minimal-ui.js → neutral-ui.js} +1 -1
  29. package/dist/default/define/live-video/skin.css +1565 -1784
  30. package/dist/default/define/live-video/skin2.js +1 -1
  31. package/dist/default/define/media/dash-video.js +5 -1
  32. package/dist/default/define/media/shaka-video.js +1 -0
  33. package/dist/default/define/shadow.css +2 -12
  34. package/dist/default/define/video/compat-skin.css +2529 -0
  35. package/dist/default/define/video/compat-skin.js +6 -0
  36. package/dist/default/define/video/compat-skin2.js +4 -0
  37. package/dist/default/define/video/neutral-skin.css +2849 -0
  38. package/dist/default/define/video/neutral-skin.js +6 -0
  39. package/dist/default/define/video/neutral-skin2.js +4 -0
  40. package/dist/default/define/video/{minimal-ui.js → neutral-ui.js} +1 -1
  41. package/dist/default/define/video/skin.css +2046 -2454
  42. package/dist/default/define/video/skin2.js +1 -1
  43. package/dist/default/extensions/google-cast/extension.js +18 -17
  44. package/dist/default/extensions/mux-data/extension.js +24 -24
  45. package/dist/default/extensions/player-extension-element.js +49 -0
  46. package/dist/default/i18n/index.js +2 -2
  47. package/dist/default/i18n/locale.js +10 -2
  48. package/dist/default/i18n/provider-element.js +1 -0
  49. package/dist/default/i18n/provider-mixin.js +11 -9
  50. package/dist/default/i18n/render-text.js +5 -1
  51. package/dist/default/i18n/text/airplay.js +1 -0
  52. package/dist/default/i18n/text/buttons.js +1 -0
  53. package/dist/default/i18n/text/captions.js +1 -0
  54. package/dist/default/i18n/text/cast.js +1 -0
  55. package/dist/default/i18n/text/common.js +1 -0
  56. package/dist/default/i18n/text/container.js +1 -0
  57. package/dist/default/i18n/text/errors.js +1 -0
  58. package/dist/default/i18n/text/fullscreen.js +1 -0
  59. package/dist/default/i18n/text/live.js +1 -0
  60. package/dist/default/i18n/text/menu.js +1 -0
  61. package/dist/default/i18n/text/pip.js +1 -0
  62. package/dist/default/i18n/text/playback.js +1 -0
  63. package/dist/default/i18n/text/seek.js +1 -0
  64. package/dist/default/i18n/text/slider.js +1 -0
  65. package/dist/default/i18n/text/status.js +1 -0
  66. package/dist/default/i18n/text/time.js +1 -0
  67. package/dist/default/i18n/text/volume.js +1 -0
  68. package/dist/default/icons/compat/index.js +26 -0
  69. package/dist/default/icons/dist/element/compat/icons.js +30 -0
  70. package/dist/default/icons/dist/element/{minimal → compat}/index.js +2 -2
  71. package/dist/default/icons/dist/element/index.js +2 -1
  72. package/dist/default/icons/dist/element/{minimal → neutral}/icons.js +1 -1
  73. package/dist/default/icons/dist/element/neutral/index.js +8 -0
  74. package/dist/default/icons/dist/html/compat/airplay-enter.js +4 -0
  75. package/dist/default/icons/dist/html/compat/airplay-exit.js +4 -0
  76. package/dist/default/icons/dist/html/compat/captions-off.js +4 -0
  77. package/dist/default/icons/dist/html/compat/captions-on.js +4 -0
  78. package/dist/default/icons/dist/html/compat/cast-enter.js +4 -0
  79. package/dist/default/icons/dist/html/compat/cast-exit.js +4 -0
  80. package/dist/default/icons/dist/html/compat/check.js +4 -0
  81. package/dist/default/icons/dist/html/compat/chevron.js +4 -0
  82. package/dist/default/icons/dist/html/compat/fullscreen-enter.js +4 -0
  83. package/dist/default/icons/dist/html/compat/fullscreen-exit.js +4 -0
  84. package/dist/default/icons/dist/html/compat/gear.js +4 -0
  85. package/dist/default/icons/dist/html/compat/pause.js +4 -0
  86. package/dist/default/icons/dist/html/compat/pip-enter.js +4 -0
  87. package/dist/default/icons/dist/html/compat/pip-exit.js +4 -0
  88. package/dist/default/icons/dist/html/compat/play.js +4 -0
  89. package/dist/default/icons/dist/html/compat/quality.js +4 -0
  90. package/dist/default/icons/dist/html/compat/restart.js +4 -0
  91. package/dist/default/icons/dist/html/compat/seek.js +4 -0
  92. package/dist/default/icons/dist/html/compat/speech.js +4 -0
  93. package/dist/default/icons/dist/html/compat/speed.js +4 -0
  94. package/dist/default/icons/dist/html/{minimal → compat}/spinner.js +1 -1
  95. package/dist/default/icons/dist/html/compat/switches.js +4 -0
  96. package/dist/default/icons/dist/html/compat/volume-high.js +4 -0
  97. package/dist/default/icons/dist/html/compat/volume-low.js +4 -0
  98. package/dist/default/icons/dist/html/compat/volume-off.js +4 -0
  99. package/dist/default/icons/dist/html/{minimal → neutral}/airplay-enter.js +1 -1
  100. package/dist/default/icons/dist/html/{minimal → neutral}/airplay-exit.js +1 -1
  101. package/dist/default/icons/dist/html/{minimal → neutral}/captions-off.js +1 -1
  102. package/dist/default/icons/dist/html/{minimal → neutral}/captions-on.js +1 -1
  103. package/dist/default/icons/dist/html/{minimal → neutral}/cast-enter.js +1 -1
  104. package/dist/default/icons/dist/html/{minimal → neutral}/cast-exit.js +1 -1
  105. package/dist/default/icons/dist/html/{minimal → neutral}/check.js +1 -1
  106. package/dist/default/icons/dist/html/{minimal → neutral}/chevron.js +1 -1
  107. package/dist/default/icons/dist/html/{minimal → neutral}/fullscreen-enter.js +1 -1
  108. package/dist/default/icons/dist/html/{minimal → neutral}/fullscreen-exit.js +1 -1
  109. package/dist/default/icons/dist/html/{minimal → neutral}/gear.js +1 -1
  110. package/dist/default/icons/dist/html/{minimal → neutral}/pause.js +1 -1
  111. package/dist/default/icons/dist/html/{minimal → neutral}/pip-enter.js +1 -1
  112. package/dist/default/icons/dist/html/{minimal → neutral}/pip-exit.js +1 -1
  113. package/dist/default/icons/dist/html/{minimal → neutral}/play.js +1 -1
  114. package/dist/default/icons/dist/html/{minimal → neutral}/quality.js +1 -1
  115. package/dist/default/icons/dist/html/{minimal → neutral}/restart.js +1 -1
  116. package/dist/default/icons/dist/html/{minimal → neutral}/seek.js +1 -1
  117. package/dist/default/icons/dist/html/{minimal → neutral}/speech.js +1 -1
  118. package/dist/default/icons/dist/html/{minimal → neutral}/speed.js +1 -1
  119. package/dist/default/icons/dist/html/neutral/spinner.js +4 -0
  120. package/dist/default/icons/dist/html/{minimal → neutral}/switches.js +1 -1
  121. package/dist/default/icons/dist/html/{minimal → neutral}/volume-high.js +1 -1
  122. package/dist/default/icons/dist/html/{minimal → neutral}/volume-low.js +1 -1
  123. package/dist/default/icons/dist/html/{minimal → neutral}/volume-off.js +1 -1
  124. package/dist/default/icons/element/compat/index.js +1 -0
  125. package/dist/default/icons/element/neutral/index.js +1 -0
  126. package/dist/default/icons/neutral/index.js +26 -0
  127. package/dist/default/index.js +4 -3
  128. package/dist/default/internal/skins/compat-audio/register.js +70 -0
  129. package/dist/default/internal/skins/compat-audio/skin.css +1891 -0
  130. package/dist/default/internal/skins/compat-audio/template.js +215 -0
  131. package/dist/default/internal/skins/compat-live-audio/register.js +50 -0
  132. package/dist/default/internal/skins/compat-live-audio/skin.css +1676 -0
  133. package/dist/default/internal/skins/compat-live-audio/template.js +112 -0
  134. package/dist/default/internal/skins/compat-live-video/register.js +86 -0
  135. package/dist/default/internal/skins/compat-live-video/skin.css +2219 -0
  136. package/dist/default/internal/skins/compat-live-video/template.js +237 -0
  137. package/dist/default/internal/skins/compat-video/register.js +115 -0
  138. package/dist/default/internal/skins/compat-video/skin.css +2497 -0
  139. package/dist/default/internal/skins/compat-video/template.js +457 -0
  140. package/dist/default/internal/skins/default-audio/register.js +8 -8
  141. package/dist/default/internal/skins/default-audio/skin.css +1213 -1365
  142. package/dist/default/internal/skins/default-live-audio/register.js +4 -4
  143. package/dist/default/internal/skins/default-live-audio/skin.css +842 -913
  144. package/dist/default/internal/skins/default-live-video/register.js +8 -8
  145. package/dist/default/internal/skins/default-live-video/skin.css +1548 -1728
  146. package/dist/default/internal/skins/default-video/register.js +13 -13
  147. package/dist/default/internal/skins/default-video/skin.css +2034 -2403
  148. package/dist/default/internal/skins/{minimal-audio → neutral-audio}/register.js +20 -20
  149. package/dist/default/internal/skins/neutral-audio/skin.css +1823 -0
  150. package/dist/default/internal/skins/{minimal-audio → neutral-audio}/template.js +24 -24
  151. package/dist/default/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js +13 -13
  152. package/dist/default/internal/skins/neutral-live-audio/skin.css +1238 -0
  153. package/dist/default/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js +14 -14
  154. package/dist/default/internal/skins/{minimal-live-video → neutral-live-video}/register.js +28 -28
  155. package/dist/default/internal/skins/neutral-live-video/skin.css +2069 -0
  156. package/dist/default/internal/skins/{minimal-live-video → neutral-live-video}/template.js +47 -47
  157. package/dist/default/internal/skins/{minimal-video → neutral-video}/register.js +40 -40
  158. package/dist/default/internal/skins/neutral-video/skin.css +2817 -0
  159. package/dist/default/internal/skins/{minimal-video → neutral-video}/template.js +75 -75
  160. package/dist/default/player/context.js +9 -1
  161. package/dist/default/player/create-player.js +2 -1
  162. package/dist/default/player/element.js +47 -10
  163. package/dist/default/presets/audio/compat-skin.js +19 -0
  164. package/dist/default/presets/audio/index.js +3 -2
  165. package/dist/default/presets/audio/neutral-skin.js +19 -0
  166. package/dist/default/presets/live-audio/compat-skin.js +19 -0
  167. package/dist/default/presets/live-audio/index.js +3 -2
  168. package/dist/default/presets/live-audio/neutral-skin.js +19 -0
  169. package/dist/default/presets/live-video/compat-skin.js +19 -0
  170. package/dist/default/presets/live-video/index.js +3 -2
  171. package/dist/default/presets/live-video/neutral-skin.js +19 -0
  172. package/dist/default/presets/video/compat-skin.js +19 -0
  173. package/dist/default/presets/video/index.js +3 -2
  174. package/dist/default/presets/video/neutral-skin.js +19 -0
  175. package/dist/default/store/media-attach-mixin.js +2 -0
  176. package/dist/default/ui/airplay-button/element.js +1 -1
  177. package/dist/default/ui/buffering-indicator/element.js +4 -0
  178. package/dist/default/ui/dialog/context.js +1 -0
  179. package/dist/default/ui/dialog/element.js +4 -2
  180. package/dist/default/ui/media-button-element.js +7 -6
  181. package/dist/default/ui/media-ui-element.js +6 -1
  182. package/dist/default/ui/menu/context.js +2 -0
  183. package/dist/default/ui/play-button/element.js +1 -1
  184. package/dist/default/ui/playback-rate-button/element.js +4 -2
  185. package/dist/default/ui/popover/element.js +4 -2
  186. package/dist/default/ui/radio-group/context.js +1 -0
  187. package/dist/default/ui/seek-indicator/element.js +7 -1
  188. package/dist/default/ui/slider/context.js +1 -0
  189. package/dist/default/ui/status-indicator/element.js +14 -1
  190. package/dist/default/ui/text/element.js +1 -0
  191. package/dist/default/ui/thumbnail/element.js +3 -2
  192. package/dist/default/ui/tooltip/context.js +1 -0
  193. package/dist/default/ui/tooltip/element.js +4 -2
  194. package/dist/default/ui/volume-popover/element.js +1 -1
  195. package/dist/default/ui/volume-slider/element.js +1 -1
  196. package/dist/default/version.js +27 -0
  197. package/dist/dev/define/audio/compat-skin.css +1923 -0
  198. package/dist/dev/define/audio/compat-skin.d.ts +1 -0
  199. package/dist/dev/define/audio/compat-skin.js +8 -0
  200. package/dist/dev/define/audio/compat-skin.js.map +1 -0
  201. package/dist/dev/define/audio/compat-skin2.js +6 -0
  202. package/dist/dev/define/audio/compat-skin2.js.map +1 -0
  203. package/dist/dev/define/audio/neutral-skin.css +1855 -0
  204. package/dist/dev/define/audio/neutral-skin.d.ts +1 -0
  205. package/dist/dev/define/audio/neutral-skin.js +8 -0
  206. package/dist/dev/define/audio/neutral-skin.js.map +1 -0
  207. package/dist/dev/define/audio/neutral-skin2.js +6 -0
  208. package/dist/dev/define/audio/neutral-skin2.js.map +1 -0
  209. package/dist/dev/define/audio/{minimal-ui.js → neutral-ui.js} +2 -2
  210. package/dist/dev/define/audio/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  211. package/dist/dev/define/audio/skin.css +1220 -1411
  212. package/dist/dev/define/audio/skin2.js +1 -1
  213. package/dist/dev/define/audio/skin2.js.map +1 -1
  214. package/dist/dev/define/background/skin.css +8 -19
  215. package/dist/dev/define/global.css +5 -21
  216. package/dist/dev/define/live-audio/compat-skin.css +1708 -0
  217. package/dist/dev/define/live-audio/compat-skin.d.ts +1 -0
  218. package/dist/dev/define/live-audio/compat-skin.js +8 -0
  219. package/dist/dev/define/live-audio/compat-skin.js.map +1 -0
  220. package/dist/dev/define/live-audio/compat-skin2.js +6 -0
  221. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -0
  222. package/dist/dev/define/live-audio/neutral-skin.css +1270 -0
  223. package/dist/dev/define/live-audio/neutral-skin.d.ts +1 -0
  224. package/dist/dev/define/live-audio/neutral-skin.js +8 -0
  225. package/dist/dev/define/live-audio/neutral-skin.js.map +1 -0
  226. package/dist/dev/define/live-audio/neutral-skin2.js +6 -0
  227. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -0
  228. package/dist/dev/define/live-audio/{minimal-ui.js → neutral-ui.js} +2 -2
  229. package/dist/dev/define/live-audio/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  230. package/dist/dev/define/live-audio/skin.css +849 -959
  231. package/dist/dev/define/live-audio/skin2.js +1 -1
  232. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  233. package/dist/dev/define/live-video/compat-skin.css +2251 -0
  234. package/dist/dev/define/live-video/compat-skin.d.ts +1 -0
  235. package/dist/dev/define/live-video/compat-skin.js +8 -0
  236. package/dist/dev/define/live-video/compat-skin.js.map +1 -0
  237. package/dist/dev/define/live-video/compat-skin2.js +6 -0
  238. package/dist/dev/define/live-video/compat-skin2.js.map +1 -0
  239. package/dist/dev/define/live-video/neutral-skin.css +2101 -0
  240. package/dist/dev/define/live-video/neutral-skin.d.ts +1 -0
  241. package/dist/dev/define/live-video/neutral-skin.js +8 -0
  242. package/dist/dev/define/live-video/neutral-skin.js.map +1 -0
  243. package/dist/dev/define/live-video/neutral-skin2.js +6 -0
  244. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -0
  245. package/dist/dev/define/live-video/{minimal-ui.js → neutral-ui.js} +2 -2
  246. package/dist/dev/define/live-video/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  247. package/dist/dev/define/live-video/skin.css +1565 -1784
  248. package/dist/dev/define/live-video/skin2.js +1 -1
  249. package/dist/dev/define/live-video/skin2.js.map +1 -1
  250. package/dist/dev/define/media/background-video.d.ts +1 -2
  251. package/dist/dev/define/media/cloudflare-video.d.ts +3 -2
  252. package/dist/dev/define/media/cloudflare-video.js.map +1 -1
  253. package/dist/dev/define/media/dash-video.d.ts +8 -3
  254. package/dist/dev/define/media/dash-video.js +5 -1
  255. package/dist/dev/define/media/dash-video.js.map +1 -1
  256. package/dist/dev/define/media/hls-audio.d.ts +1 -2
  257. package/dist/dev/define/media/hls-background-video.d.ts +1 -2
  258. package/dist/dev/define/media/hls-video.d.ts +1 -2
  259. package/dist/dev/define/media/hlsjs-video.d.ts +3 -2
  260. package/dist/dev/define/media/hlsjs-video.js.map +1 -1
  261. package/dist/dev/define/media/mux-audio/hls-js.d.ts +3 -2
  262. package/dist/dev/define/media/mux-audio/hls-js.js.map +1 -1
  263. package/dist/dev/define/media/mux-audio/index.d.ts +2 -2
  264. package/dist/dev/define/media/mux-audio/spf.d.ts +3 -2
  265. package/dist/dev/define/media/mux-audio/spf.js.map +1 -1
  266. package/dist/dev/define/media/mux-background-video.d.ts +1 -2
  267. package/dist/dev/define/media/mux-video/hls-js.d.ts +3 -2
  268. package/dist/dev/define/media/mux-video/hls-js.js.map +1 -1
  269. package/dist/dev/define/media/mux-video/index.d.ts +2 -2
  270. package/dist/dev/define/media/mux-video/spf.d.ts +3 -2
  271. package/dist/dev/define/media/mux-video/spf.js.map +1 -1
  272. package/dist/dev/define/media/native-hls-video.d.ts +3 -2
  273. package/dist/dev/define/media/native-hls-video.js.map +1 -1
  274. package/dist/dev/define/media/shaka-video.d.ts +4 -2
  275. package/dist/dev/define/media/shaka-video.js +1 -0
  276. package/dist/dev/define/media/shaka-video.js.map +1 -1
  277. package/dist/dev/define/media/spotify-audio.d.ts +3 -2
  278. package/dist/dev/define/media/spotify-audio.js.map +1 -1
  279. package/dist/dev/define/media/tiktok-video.d.ts +3 -2
  280. package/dist/dev/define/media/tiktok-video.js.map +1 -1
  281. package/dist/dev/define/media/twitch-video.d.ts +3 -2
  282. package/dist/dev/define/media/twitch-video.js.map +1 -1
  283. package/dist/dev/define/media/vimeo-video.d.ts +3 -2
  284. package/dist/dev/define/media/vimeo-video.js.map +1 -1
  285. package/dist/dev/define/media/wistia-video.d.ts +3 -2
  286. package/dist/dev/define/media/wistia-video.js.map +1 -1
  287. package/dist/dev/define/media/youtube-video.d.ts +3 -2
  288. package/dist/dev/define/media/youtube-video.js.map +1 -1
  289. package/dist/dev/define/shadow.css +2 -12
  290. package/dist/dev/define/ui/menu-radio-group.d.ts +1 -0
  291. package/dist/dev/define/ui/menu.d.ts +1 -0
  292. package/dist/dev/define/ui/popover.d.ts +1 -0
  293. package/dist/dev/define/video/compat-skin.css +2529 -0
  294. package/dist/dev/define/video/compat-skin.d.ts +1 -0
  295. package/dist/dev/define/video/compat-skin.js +8 -0
  296. package/dist/dev/define/video/compat-skin.js.map +1 -0
  297. package/dist/dev/define/video/compat-skin2.js +6 -0
  298. package/dist/dev/define/video/compat-skin2.js.map +1 -0
  299. package/dist/dev/define/video/neutral-skin.css +2849 -0
  300. package/dist/dev/define/video/neutral-skin.d.ts +1 -0
  301. package/dist/dev/define/video/neutral-skin.js +8 -0
  302. package/dist/dev/define/video/neutral-skin.js.map +1 -0
  303. package/dist/dev/define/video/neutral-skin2.js +6 -0
  304. package/dist/dev/define/video/neutral-skin2.js.map +1 -0
  305. package/dist/dev/define/video/{minimal-ui.js → neutral-ui.js} +2 -2
  306. package/dist/dev/define/video/{minimal-ui.js.map → neutral-ui.js.map} +1 -1
  307. package/dist/dev/define/video/skin.css +2046 -2454
  308. package/dist/dev/define/video/skin2.js +1 -1
  309. package/dist/dev/define/video/skin2.js.map +1 -1
  310. package/dist/dev/extensions/google-cast/extension.d.ts +8 -7
  311. package/dist/dev/extensions/google-cast/extension.js +18 -17
  312. package/dist/dev/extensions/google-cast/extension.js.map +1 -1
  313. package/dist/dev/extensions/mux-data/extension.d.ts +6 -6
  314. package/dist/dev/extensions/mux-data/extension.js +24 -24
  315. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  316. package/dist/dev/extensions/player-extension-element.d.ts +30 -0
  317. package/dist/dev/extensions/player-extension-element.js +51 -0
  318. package/dist/dev/extensions/player-extension-element.js.map +1 -0
  319. package/dist/dev/i18n/context.d.ts +4 -5
  320. package/dist/dev/i18n/controller.d.ts +3 -4
  321. package/dist/dev/i18n/controller.js.map +1 -1
  322. package/dist/dev/i18n/create-i18n.d.ts +3 -4
  323. package/dist/dev/i18n/index.d.ts +2 -2
  324. package/dist/dev/i18n/index.js +2 -2
  325. package/dist/dev/i18n/locale.d.ts +12 -5
  326. package/dist/dev/i18n/locale.js +10 -2
  327. package/dist/dev/i18n/locale.js.map +1 -1
  328. package/dist/dev/i18n/provider-element.d.ts +4 -3
  329. package/dist/dev/i18n/provider-element.js +1 -0
  330. package/dist/dev/i18n/provider-element.js.map +1 -1
  331. package/dist/dev/i18n/provider-mixin.d.ts +1 -2
  332. package/dist/dev/i18n/provider-mixin.js +11 -9
  333. package/dist/dev/i18n/provider-mixin.js.map +1 -1
  334. package/dist/dev/i18n/render-text.d.ts +6 -3
  335. package/dist/dev/i18n/render-text.js +5 -1
  336. package/dist/dev/i18n/render-text.js.map +1 -1
  337. package/dist/dev/i18n/text/airplay.d.ts +1 -0
  338. package/dist/dev/i18n/text/airplay.js +1 -0
  339. package/dist/dev/i18n/text/buttons.d.ts +1 -0
  340. package/dist/dev/i18n/text/buttons.js +1 -0
  341. package/dist/dev/i18n/text/captions.d.ts +1 -0
  342. package/dist/dev/i18n/text/captions.js +1 -0
  343. package/dist/dev/i18n/text/cast.d.ts +1 -0
  344. package/dist/dev/i18n/text/cast.js +1 -0
  345. package/dist/dev/i18n/text/common.d.ts +1 -0
  346. package/dist/dev/i18n/text/common.js +1 -0
  347. package/dist/dev/i18n/text/container.d.ts +1 -0
  348. package/dist/dev/i18n/text/container.js +1 -0
  349. package/dist/dev/i18n/text/errors.d.ts +1 -0
  350. package/dist/dev/i18n/text/errors.js +1 -0
  351. package/dist/dev/i18n/text/fullscreen.d.ts +1 -0
  352. package/dist/dev/i18n/text/fullscreen.js +1 -0
  353. package/dist/dev/i18n/text/live.d.ts +1 -0
  354. package/dist/dev/i18n/text/live.js +1 -0
  355. package/dist/dev/i18n/text/menu.d.ts +1 -0
  356. package/dist/dev/i18n/text/menu.js +1 -0
  357. package/dist/dev/i18n/text/pip.d.ts +1 -0
  358. package/dist/dev/i18n/text/pip.js +1 -0
  359. package/dist/dev/i18n/text/playback.d.ts +1 -0
  360. package/dist/dev/i18n/text/playback.js +1 -0
  361. package/dist/dev/i18n/text/seek.d.ts +1 -0
  362. package/dist/dev/i18n/text/seek.js +1 -0
  363. package/dist/dev/i18n/text/slider.d.ts +1 -0
  364. package/dist/dev/i18n/text/slider.js +1 -0
  365. package/dist/dev/i18n/text/status.d.ts +1 -0
  366. package/dist/dev/i18n/text/status.js +1 -0
  367. package/dist/dev/i18n/text/time.d.ts +1 -0
  368. package/dist/dev/i18n/text/time.js +1 -0
  369. package/dist/dev/i18n/text/volume.d.ts +1 -0
  370. package/dist/dev/i18n/text/volume.js +1 -0
  371. package/dist/dev/i18n/text-mixin.d.ts +1 -2
  372. package/dist/dev/i18n/text-mixin.js.map +1 -1
  373. package/dist/dev/i18n/types.d.ts +2 -3
  374. package/dist/dev/icons/{minimal → compat}/index.d.ts +1 -1
  375. package/dist/dev/icons/compat/index.js +26 -0
  376. package/dist/dev/icons/dist/element/base.d.ts +1 -2
  377. package/dist/dev/icons/dist/element/base.js.map +1 -1
  378. package/dist/dev/icons/dist/element/compat/icons.js +32 -0
  379. package/dist/dev/icons/dist/element/compat/icons.js.map +1 -0
  380. package/dist/dev/icons/dist/element/{minimal → compat}/index.js +2 -2
  381. package/dist/dev/icons/dist/element/compat/index.js.map +1 -0
  382. package/dist/dev/icons/dist/element/index.js +2 -1
  383. package/dist/dev/icons/dist/element/index.js.map +1 -1
  384. package/dist/dev/icons/dist/element/{minimal → neutral}/icons.js +1 -1
  385. package/dist/dev/icons/dist/element/{minimal → neutral}/icons.js.map +1 -1
  386. package/dist/dev/icons/dist/element/neutral/index.d.ts +1 -0
  387. package/dist/dev/icons/dist/element/neutral/index.js +10 -0
  388. package/dist/dev/icons/dist/element/{minimal → neutral}/index.js.map +1 -1
  389. package/dist/dev/icons/dist/html/compat/airplay-enter.js +6 -0
  390. package/dist/dev/icons/dist/html/compat/airplay-enter.js.map +1 -0
  391. package/dist/dev/icons/dist/html/compat/airplay-exit.js +6 -0
  392. package/dist/dev/icons/dist/html/compat/airplay-exit.js.map +1 -0
  393. package/dist/dev/icons/dist/html/compat/captions-off.js +6 -0
  394. package/dist/dev/icons/dist/html/compat/captions-off.js.map +1 -0
  395. package/dist/dev/icons/dist/html/compat/captions-on.js +6 -0
  396. package/dist/dev/icons/dist/html/compat/captions-on.js.map +1 -0
  397. package/dist/dev/icons/dist/html/compat/cast-enter.js +6 -0
  398. package/dist/dev/icons/dist/html/compat/cast-enter.js.map +1 -0
  399. package/dist/dev/icons/dist/html/compat/cast-exit.js +6 -0
  400. package/dist/dev/icons/dist/html/compat/cast-exit.js.map +1 -0
  401. package/dist/dev/icons/dist/html/compat/check.js +6 -0
  402. package/dist/dev/icons/dist/html/compat/check.js.map +1 -0
  403. package/dist/dev/icons/dist/html/compat/chevron.js +6 -0
  404. package/dist/dev/icons/dist/html/compat/chevron.js.map +1 -0
  405. package/dist/dev/icons/dist/html/compat/fullscreen-enter.js +6 -0
  406. package/dist/dev/icons/dist/html/compat/fullscreen-enter.js.map +1 -0
  407. package/dist/dev/icons/dist/html/compat/fullscreen-exit.js +6 -0
  408. package/dist/dev/icons/dist/html/compat/fullscreen-exit.js.map +1 -0
  409. package/dist/dev/icons/dist/html/compat/gear.js +6 -0
  410. package/dist/dev/icons/dist/html/compat/gear.js.map +1 -0
  411. package/dist/dev/icons/dist/html/compat/index.d.ts +28 -0
  412. package/dist/dev/icons/dist/html/compat/pause.js +6 -0
  413. package/dist/dev/icons/dist/html/compat/pause.js.map +1 -0
  414. package/dist/dev/icons/dist/html/compat/pip-enter.js +6 -0
  415. package/dist/dev/icons/dist/html/compat/pip-enter.js.map +1 -0
  416. package/dist/dev/icons/dist/html/compat/pip-exit.js +6 -0
  417. package/dist/dev/icons/dist/html/compat/pip-exit.js.map +1 -0
  418. package/dist/dev/icons/dist/html/compat/play.js +6 -0
  419. package/dist/dev/icons/dist/html/compat/play.js.map +1 -0
  420. package/dist/dev/icons/dist/html/compat/quality.js +6 -0
  421. package/dist/dev/icons/dist/html/compat/quality.js.map +1 -0
  422. package/dist/dev/icons/dist/html/compat/restart.js +6 -0
  423. package/dist/dev/icons/dist/html/compat/restart.js.map +1 -0
  424. package/dist/dev/icons/dist/html/compat/seek.js +6 -0
  425. package/dist/dev/icons/dist/html/compat/seek.js.map +1 -0
  426. package/dist/dev/icons/dist/html/compat/speech.js +6 -0
  427. package/dist/dev/icons/dist/html/compat/speech.js.map +1 -0
  428. package/dist/dev/icons/dist/html/compat/speed.js +6 -0
  429. package/dist/dev/icons/dist/html/compat/speed.js.map +1 -0
  430. package/dist/dev/icons/dist/html/{minimal → compat}/spinner.js +1 -1
  431. package/dist/dev/icons/dist/html/compat/spinner.js.map +1 -0
  432. package/dist/dev/icons/dist/html/compat/switches.js +6 -0
  433. package/dist/dev/icons/dist/html/compat/switches.js.map +1 -0
  434. package/dist/dev/icons/dist/html/compat/volume-high.js +6 -0
  435. package/dist/dev/icons/dist/html/compat/volume-high.js.map +1 -0
  436. package/dist/dev/icons/dist/html/compat/volume-low.js +6 -0
  437. package/dist/dev/icons/dist/html/compat/volume-low.js.map +1 -0
  438. package/dist/dev/icons/dist/html/compat/volume-off.js +6 -0
  439. package/dist/dev/icons/dist/html/compat/volume-off.js.map +1 -0
  440. package/dist/dev/icons/dist/html/default/index.d.ts +25 -26
  441. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-enter.js +1 -1
  442. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-enter.js.map +1 -1
  443. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-exit.js +1 -1
  444. package/dist/dev/icons/dist/html/{minimal → neutral}/airplay-exit.js.map +1 -1
  445. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-off.js +1 -1
  446. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-off.js.map +1 -1
  447. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-on.js +1 -1
  448. package/dist/dev/icons/dist/html/{minimal → neutral}/captions-on.js.map +1 -1
  449. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-enter.js +1 -1
  450. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-enter.js.map +1 -1
  451. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-exit.js +1 -1
  452. package/dist/dev/icons/dist/html/{minimal → neutral}/cast-exit.js.map +1 -1
  453. package/dist/dev/icons/dist/html/{minimal → neutral}/check.js +1 -1
  454. package/dist/dev/icons/dist/html/{minimal → neutral}/check.js.map +1 -1
  455. package/dist/dev/icons/dist/html/{minimal → neutral}/chevron.js +1 -1
  456. package/dist/dev/icons/dist/html/{minimal → neutral}/chevron.js.map +1 -1
  457. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-enter.js +1 -1
  458. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-enter.js.map +1 -1
  459. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-exit.js +1 -1
  460. package/dist/dev/icons/dist/html/{minimal → neutral}/fullscreen-exit.js.map +1 -1
  461. package/dist/dev/icons/dist/html/{minimal → neutral}/gear.js +1 -1
  462. package/dist/dev/icons/dist/html/{minimal → neutral}/gear.js.map +1 -1
  463. package/dist/dev/icons/dist/html/neutral/index.d.ts +28 -0
  464. package/dist/dev/icons/dist/html/{minimal → neutral}/pause.js +1 -1
  465. package/dist/dev/icons/dist/html/{minimal → neutral}/pause.js.map +1 -1
  466. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-enter.js +1 -1
  467. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-enter.js.map +1 -1
  468. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-exit.js +1 -1
  469. package/dist/dev/icons/dist/html/{minimal → neutral}/pip-exit.js.map +1 -1
  470. package/dist/dev/icons/dist/html/{minimal → neutral}/play.js +1 -1
  471. package/dist/dev/icons/dist/html/{minimal → neutral}/play.js.map +1 -1
  472. package/dist/dev/icons/dist/html/{minimal → neutral}/quality.js +1 -1
  473. package/dist/dev/icons/dist/html/{minimal → neutral}/quality.js.map +1 -1
  474. package/dist/dev/icons/dist/html/{minimal → neutral}/restart.js +1 -1
  475. package/dist/dev/icons/dist/html/{minimal → neutral}/restart.js.map +1 -1
  476. package/dist/dev/icons/dist/html/{minimal → neutral}/seek.js +1 -1
  477. package/dist/dev/icons/dist/html/{minimal → neutral}/seek.js.map +1 -1
  478. package/dist/dev/icons/dist/html/{minimal → neutral}/speech.js +1 -1
  479. package/dist/dev/icons/dist/html/{minimal → neutral}/speech.js.map +1 -1
  480. package/dist/dev/icons/dist/html/{minimal → neutral}/speed.js +1 -1
  481. package/dist/dev/icons/dist/html/{minimal → neutral}/speed.js.map +1 -1
  482. package/dist/dev/icons/dist/html/neutral/spinner.js +6 -0
  483. package/dist/dev/icons/dist/html/{minimal → neutral}/spinner.js.map +1 -1
  484. package/dist/dev/icons/dist/html/{minimal → neutral}/switches.js +1 -1
  485. package/dist/dev/icons/dist/html/{minimal → neutral}/switches.js.map +1 -1
  486. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-high.js +1 -1
  487. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-high.js.map +1 -1
  488. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-low.js +1 -1
  489. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-low.js.map +1 -1
  490. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-off.js +1 -1
  491. package/dist/dev/icons/dist/html/{minimal → neutral}/volume-off.js.map +1 -1
  492. package/dist/dev/icons/element/compat/index.d.ts +1 -0
  493. package/dist/dev/icons/element/compat/index.js +1 -0
  494. package/dist/dev/icons/element/neutral/index.d.ts +1 -0
  495. package/dist/dev/icons/element/neutral/index.js +1 -0
  496. package/dist/dev/icons/element/register/index.d.ts +1 -2
  497. package/dist/dev/icons/neutral/index.d.ts +2 -0
  498. package/dist/dev/icons/neutral/index.js +26 -0
  499. package/dist/dev/index.d.ts +12 -7
  500. package/dist/dev/index.js +4 -3
  501. package/dist/dev/internal/skins/compat-audio/register.d.ts +43 -0
  502. package/dist/dev/internal/skins/compat-audio/register.js +72 -0
  503. package/dist/dev/internal/skins/compat-audio/register.js.map +1 -0
  504. package/dist/dev/internal/skins/compat-audio/skin.css +1891 -0
  505. package/dist/dev/internal/skins/compat-audio/template.js +217 -0
  506. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -0
  507. package/dist/dev/internal/skins/compat-live-audio/register.d.ts +27 -0
  508. package/dist/dev/internal/skins/compat-live-audio/register.js +52 -0
  509. package/dist/dev/internal/skins/compat-live-audio/register.js.map +1 -0
  510. package/dist/dev/internal/skins/compat-live-audio/skin.css +1676 -0
  511. package/dist/dev/internal/skins/compat-live-audio/template.js +114 -0
  512. package/dist/dev/internal/skins/compat-live-audio/template.js.map +1 -0
  513. package/dist/dev/internal/skins/compat-live-video/register.d.ts +45 -0
  514. package/dist/dev/internal/skins/compat-live-video/register.js +88 -0
  515. package/dist/dev/internal/skins/compat-live-video/register.js.map +1 -0
  516. package/dist/dev/internal/skins/compat-live-video/skin.css +2219 -0
  517. package/dist/dev/internal/skins/compat-live-video/template.js +239 -0
  518. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -0
  519. package/dist/dev/internal/skins/compat-video/register.d.ts +62 -0
  520. package/dist/dev/internal/skins/compat-video/register.js +117 -0
  521. package/dist/dev/internal/skins/compat-video/register.js.map +1 -0
  522. package/dist/dev/internal/skins/compat-video/skin.css +2497 -0
  523. package/dist/dev/internal/skins/compat-video/template.js +459 -0
  524. package/dist/dev/internal/skins/compat-video/template.js.map +1 -0
  525. package/dist/dev/internal/skins/default-audio/register.d.ts +12 -12
  526. package/dist/dev/internal/skins/default-audio/register.js +8 -8
  527. package/dist/dev/internal/skins/default-audio/skin.css +1213 -1365
  528. package/dist/dev/internal/skins/default-live-audio/register.d.ts +4 -4
  529. package/dist/dev/internal/skins/default-live-audio/register.js +4 -4
  530. package/dist/dev/internal/skins/default-live-audio/skin.css +842 -913
  531. package/dist/dev/internal/skins/default-live-video/register.d.ts +10 -10
  532. package/dist/dev/internal/skins/default-live-video/register.js +8 -8
  533. package/dist/dev/internal/skins/default-live-video/skin.css +1548 -1728
  534. package/dist/dev/internal/skins/default-video/register.d.ts +18 -18
  535. package/dist/dev/internal/skins/default-video/register.js +13 -13
  536. package/dist/dev/internal/skins/default-video/skin.css +2034 -2403
  537. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.d.ts +14 -14
  538. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.js +20 -20
  539. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/register.js.map +1 -1
  540. package/dist/dev/internal/skins/neutral-audio/skin.css +1823 -0
  541. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/template.js +24 -24
  542. package/dist/dev/internal/skins/{minimal-audio → neutral-audio}/template.js.map +1 -1
  543. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.d.ts +4 -4
  544. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js +13 -13
  545. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/register.js.map +1 -1
  546. package/dist/dev/internal/skins/neutral-live-audio/skin.css +1238 -0
  547. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js +14 -14
  548. package/dist/dev/internal/skins/{minimal-live-audio → neutral-live-audio}/template.js.map +1 -1
  549. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.d.ts +10 -10
  550. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.js +28 -28
  551. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/register.js.map +1 -1
  552. package/dist/dev/internal/skins/neutral-live-video/skin.css +2069 -0
  553. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/template.js +47 -47
  554. package/dist/dev/internal/skins/{minimal-live-video → neutral-live-video}/template.js.map +1 -1
  555. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.d.ts +20 -20
  556. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.js +40 -40
  557. package/dist/dev/internal/skins/{minimal-video → neutral-video}/register.js.map +1 -1
  558. package/dist/dev/internal/skins/neutral-video/skin.css +2817 -0
  559. package/dist/dev/internal/skins/{minimal-video → neutral-video}/template.js +75 -75
  560. package/dist/dev/internal/skins/{minimal-video → neutral-video}/template.js.map +1 -1
  561. package/dist/dev/media/background-video/adapter.d.ts +1 -2
  562. package/dist/dev/media/background-video/template.d.ts +1 -2
  563. package/dist/dev/media/cloudflare-video/adapter.d.ts +3 -15
  564. package/dist/dev/media/dash-video/adapter.d.ts +3 -15
  565. package/dist/dev/media/hls-audio/adapter.d.ts +3 -15
  566. package/dist/dev/media/hls-background-video/adapter.d.ts +8 -5
  567. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  568. package/dist/dev/media/hls-video/adapter.d.ts +3 -15
  569. package/dist/dev/media/hlsjs-video/adapter.d.ts +3 -15
  570. package/dist/dev/media/mux-audio/hls-js.d.ts +3 -15
  571. package/dist/dev/media/mux-audio/mixin.js.map +1 -1
  572. package/dist/dev/media/mux-audio/spf.d.ts +3 -15
  573. package/dist/dev/media/mux-video/hls-js.d.ts +3 -15
  574. package/dist/dev/media/mux-video/mixin.js.map +1 -1
  575. package/dist/dev/media/mux-video/spf.d.ts +3 -15
  576. package/dist/dev/media/native-hls-video/adapter.d.ts +3 -15
  577. package/dist/dev/media/shaka-video/adapter.d.ts +3 -15
  578. package/dist/dev/media/spotify-audio/adapter.d.ts +3 -15
  579. package/dist/dev/media/tiktok-video/adapter.d.ts +3 -15
  580. package/dist/dev/media/twitch-video/adapter.d.ts +3 -15
  581. package/dist/dev/media/vimeo-video/adapter.d.ts +3 -15
  582. package/dist/dev/media/wistia-video/adapter.d.ts +1 -2
  583. package/dist/dev/media/youtube-video/adapter.d.ts +3 -15
  584. package/dist/dev/player/context.d.ts +34 -15
  585. package/dist/dev/player/context.js +9 -1
  586. package/dist/dev/player/context.js.map +1 -1
  587. package/dist/dev/player/controller.d.ts +3 -4
  588. package/dist/dev/player/controller.js.map +1 -1
  589. package/dist/dev/player/create-player.d.ts +5 -6
  590. package/dist/dev/player/create-player.js +2 -1
  591. package/dist/dev/player/create-player.js.map +1 -1
  592. package/dist/dev/player/element.js +47 -10
  593. package/dist/dev/player/element.js.map +1 -1
  594. package/dist/dev/presets/audio/compat-skin.d.ts +15 -0
  595. package/dist/dev/presets/audio/compat-skin.js +21 -0
  596. package/dist/dev/presets/audio/compat-skin.js.map +1 -0
  597. package/dist/dev/presets/audio/index.d.ts +3 -2
  598. package/dist/dev/presets/audio/index.js +3 -2
  599. package/dist/dev/presets/audio/neutral-skin.d.ts +15 -0
  600. package/dist/dev/presets/audio/neutral-skin.js +21 -0
  601. package/dist/dev/presets/audio/neutral-skin.js.map +1 -0
  602. package/dist/dev/presets/audio/player.d.ts +2 -3
  603. package/dist/dev/presets/audio/skin.d.ts +2 -3
  604. package/dist/dev/presets/audio/skin.js.map +1 -1
  605. package/dist/dev/presets/background/player.d.ts +2 -3
  606. package/dist/dev/presets/background/skin.d.ts +1 -2
  607. package/dist/dev/presets/live-audio/compat-skin.d.ts +15 -0
  608. package/dist/dev/presets/live-audio/compat-skin.js +21 -0
  609. package/dist/dev/presets/live-audio/compat-skin.js.map +1 -0
  610. package/dist/dev/presets/live-audio/index.d.ts +3 -2
  611. package/dist/dev/presets/live-audio/index.js +3 -2
  612. package/dist/dev/presets/live-audio/neutral-skin.d.ts +15 -0
  613. package/dist/dev/presets/live-audio/neutral-skin.js +21 -0
  614. package/dist/dev/presets/live-audio/neutral-skin.js.map +1 -0
  615. package/dist/dev/presets/live-audio/player.d.ts +2 -3
  616. package/dist/dev/presets/live-audio/skin.d.ts +2 -3
  617. package/dist/dev/presets/live-audio/skin.js.map +1 -1
  618. package/dist/dev/presets/live-video/compat-skin.d.ts +15 -0
  619. package/dist/dev/presets/live-video/compat-skin.js +21 -0
  620. package/dist/dev/presets/live-video/compat-skin.js.map +1 -0
  621. package/dist/dev/presets/live-video/index.d.ts +3 -2
  622. package/dist/dev/presets/live-video/index.js +3 -2
  623. package/dist/dev/presets/live-video/neutral-skin.d.ts +15 -0
  624. package/dist/dev/presets/live-video/neutral-skin.js +21 -0
  625. package/dist/dev/presets/live-video/neutral-skin.js.map +1 -0
  626. package/dist/dev/presets/live-video/player.d.ts +2 -3
  627. package/dist/dev/presets/live-video/skin.d.ts +2 -3
  628. package/dist/dev/presets/live-video/skin.js.map +1 -1
  629. package/dist/dev/presets/skin.d.ts +1 -2
  630. package/dist/dev/presets/video/compat-skin.d.ts +15 -0
  631. package/dist/dev/presets/video/compat-skin.js +21 -0
  632. package/dist/dev/presets/video/compat-skin.js.map +1 -0
  633. package/dist/dev/presets/video/index.d.ts +3 -2
  634. package/dist/dev/presets/video/index.js +3 -2
  635. package/dist/dev/presets/video/neutral-skin.d.ts +15 -0
  636. package/dist/dev/presets/video/neutral-skin.js +21 -0
  637. package/dist/dev/presets/video/neutral-skin.js.map +1 -0
  638. package/dist/dev/presets/video/player.d.ts +2 -3
  639. package/dist/dev/presets/video/skin.d.ts +2 -3
  640. package/dist/dev/presets/video/skin.js.map +1 -1
  641. package/dist/dev/store/media-attach-mixin.d.ts +6 -4
  642. package/dist/dev/store/media-attach-mixin.js +2 -0
  643. package/dist/dev/store/media-attach-mixin.js.map +1 -1
  644. package/dist/dev/store/types.d.ts +2 -4
  645. package/dist/dev/ui/airplay-button/element.d.ts +4 -5
  646. package/dist/dev/ui/airplay-button/element.js +1 -1
  647. package/dist/dev/ui/airplay-button/element.js.map +1 -1
  648. package/dist/dev/ui/alert-dialog/element.d.ts +1 -2
  649. package/dist/dev/ui/audio-track-radio-group/element.d.ts +4 -5
  650. package/dist/dev/ui/audio-track-radio-group/element.js.map +1 -1
  651. package/dist/dev/ui/buffering-indicator/element.d.ts +2 -2
  652. package/dist/dev/ui/buffering-indicator/element.js +4 -0
  653. package/dist/dev/ui/buffering-indicator/element.js.map +1 -1
  654. package/dist/dev/ui/captions-button/element.d.ts +7 -10
  655. package/dist/dev/ui/captions-button/element.js.map +1 -1
  656. package/dist/dev/ui/captions-radio-group/element.d.ts +4 -5
  657. package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
  658. package/dist/dev/ui/cast-button/element.d.ts +3 -4
  659. package/dist/dev/ui/cast-button/element.js.map +1 -1
  660. package/dist/dev/ui/container/element.d.ts +1 -2
  661. package/dist/dev/ui/container/element.js.map +1 -1
  662. package/dist/dev/ui/context-part-element.d.ts +2 -3
  663. package/dist/dev/ui/context-part-element.js.map +1 -1
  664. package/dist/dev/ui/controls/backdrop.d.ts +1 -2
  665. package/dist/dev/ui/controls/content.d.ts +1 -2
  666. package/dist/dev/ui/controls/context.d.ts +1 -2
  667. package/dist/dev/ui/controls/element.d.ts +1 -2
  668. package/dist/dev/ui/controls/element.js.map +1 -1
  669. package/dist/dev/ui/controls/group.d.ts +1 -2
  670. package/dist/dev/ui/dialog/backdrop.d.ts +1 -2
  671. package/dist/dev/ui/dialog/close.d.ts +1 -2
  672. package/dist/dev/ui/dialog/close.js.map +1 -1
  673. package/dist/dev/ui/dialog/context.d.ts +4 -3
  674. package/dist/dev/ui/dialog/context.js +1 -0
  675. package/dist/dev/ui/dialog/context.js.map +1 -1
  676. package/dist/dev/ui/dialog/description.d.ts +1 -2
  677. package/dist/dev/ui/dialog/element.d.ts +5 -4
  678. package/dist/dev/ui/dialog/element.js +4 -2
  679. package/dist/dev/ui/dialog/element.js.map +1 -1
  680. package/dist/dev/ui/dialog/popup.d.ts +1 -2
  681. package/dist/dev/ui/dialog/popup.js.map +1 -1
  682. package/dist/dev/ui/dialog/title.d.ts +1 -2
  683. package/dist/dev/ui/error-dialog/element.d.ts +1 -2
  684. package/dist/dev/ui/error-dialog/element.js.map +1 -1
  685. package/dist/dev/ui/fullscreen-button/element.d.ts +3 -5
  686. package/dist/dev/ui/fullscreen-button/element.js.map +1 -1
  687. package/dist/dev/ui/gesture/element.d.ts +1 -2
  688. package/dist/dev/ui/gesture/element.js.map +1 -1
  689. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +2 -3
  690. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -1
  691. package/dist/dev/ui/hotkey/element.d.ts +1 -2
  692. package/dist/dev/ui/hotkey/element.js.map +1 -1
  693. package/dist/dev/ui/input-indicator/element.d.ts +5 -4
  694. package/dist/dev/ui/input-indicator/element.js.map +1 -1
  695. package/dist/dev/ui/input-indicator/live-indicator.d.ts +2 -3
  696. package/dist/dev/ui/input-indicator/live-indicator.js.map +1 -1
  697. package/dist/dev/ui/live-button/element.d.ts +4 -4
  698. package/dist/dev/ui/live-button/element.js.map +1 -1
  699. package/dist/dev/ui/media-button-element.d.ts +17 -8
  700. package/dist/dev/ui/media-button-element.js +7 -6
  701. package/dist/dev/ui/media-button-element.js.map +1 -1
  702. package/dist/dev/ui/media-ui-element.d.ts +15 -7
  703. package/dist/dev/ui/media-ui-element.js +6 -1
  704. package/dist/dev/ui/media-ui-element.js.map +1 -1
  705. package/dist/dev/ui/menu/checkbox-item.d.ts +1 -2
  706. package/dist/dev/ui/menu/checkbox-item.js.map +1 -1
  707. package/dist/dev/ui/menu/content.d.ts +1 -2
  708. package/dist/dev/ui/menu/content.js.map +1 -1
  709. package/dist/dev/ui/menu/context.d.ts +9 -5
  710. package/dist/dev/ui/menu/context.js +2 -0
  711. package/dist/dev/ui/menu/context.js.map +1 -1
  712. package/dist/dev/ui/menu/element.d.ts +1 -2
  713. package/dist/dev/ui/menu/element.js.map +1 -1
  714. package/dist/dev/ui/menu/group-controller.js.map +1 -1
  715. package/dist/dev/ui/menu/group-label.d.ts +1 -2
  716. package/dist/dev/ui/menu/group-label.js.map +1 -1
  717. package/dist/dev/ui/menu/group.d.ts +1 -2
  718. package/dist/dev/ui/menu/group.js.map +1 -1
  719. package/dist/dev/ui/menu/item-indicator.d.ts +1 -2
  720. package/dist/dev/ui/menu/item.d.ts +1 -2
  721. package/dist/dev/ui/menu/item.js.map +1 -1
  722. package/dist/dev/ui/menu/radio-group.d.ts +1 -2
  723. package/dist/dev/ui/menu/radio-group.js.map +1 -1
  724. package/dist/dev/ui/menu/radio-item.d.ts +1 -2
  725. package/dist/dev/ui/menu/radio-item.js.map +1 -1
  726. package/dist/dev/ui/menu/separator.d.ts +1 -2
  727. package/dist/dev/ui/mute-button/element.d.ts +3 -4
  728. package/dist/dev/ui/mute-button/element.js.map +1 -1
  729. package/dist/dev/ui/pip-button/element.d.ts +4 -6
  730. package/dist/dev/ui/pip-button/element.js.map +1 -1
  731. package/dist/dev/ui/play-button/element.d.ts +3 -5
  732. package/dist/dev/ui/play-button/element.js +1 -1
  733. package/dist/dev/ui/play-button/element.js.map +1 -1
  734. package/dist/dev/ui/playback-rate-button/element.d.ts +4 -5
  735. package/dist/dev/ui/playback-rate-button/element.js +4 -2
  736. package/dist/dev/ui/playback-rate-button/element.js.map +1 -1
  737. package/dist/dev/ui/playback-rate-radio-group/element.d.ts +4 -5
  738. package/dist/dev/ui/playback-rate-radio-group/element.js.map +1 -1
  739. package/dist/dev/ui/popover/element.d.ts +1 -2
  740. package/dist/dev/ui/popover/element.js +4 -2
  741. package/dist/dev/ui/popover/element.js.map +1 -1
  742. package/dist/dev/ui/position-controller.js.map +1 -1
  743. package/dist/dev/ui/poster/element.d.ts +1 -2
  744. package/dist/dev/ui/poster/element.js.map +1 -1
  745. package/dist/dev/ui/quality-radio-group/element.d.ts +4 -5
  746. package/dist/dev/ui/quality-radio-group/element.js.map +1 -1
  747. package/dist/dev/ui/radio-group/context.d.ts +4 -3
  748. package/dist/dev/ui/radio-group/context.js +1 -0
  749. package/dist/dev/ui/radio-group/context.js.map +1 -1
  750. package/dist/dev/ui/radio-group/element.d.ts +1 -2
  751. package/dist/dev/ui/radio-group/element.js.map +1 -1
  752. package/dist/dev/ui/radio-options/controller.js.map +1 -1
  753. package/dist/dev/ui/seek-button/element.d.ts +2 -3
  754. package/dist/dev/ui/seek-button/element.js.map +1 -1
  755. package/dist/dev/ui/seek-indicator/element.d.ts +3 -4
  756. package/dist/dev/ui/seek-indicator/element.js +7 -1
  757. package/dist/dev/ui/seek-indicator/element.js.map +1 -1
  758. package/dist/dev/ui/seek-indicator/value.d.ts +1 -2
  759. package/dist/dev/ui/slider/buffer.d.ts +1 -2
  760. package/dist/dev/ui/slider/context.d.ts +4 -3
  761. package/dist/dev/ui/slider/context.js +1 -0
  762. package/dist/dev/ui/slider/context.js.map +1 -1
  763. package/dist/dev/ui/slider/element.d.ts +1 -2
  764. package/dist/dev/ui/slider/element.js.map +1 -1
  765. package/dist/dev/ui/slider/events.d.ts +4 -3
  766. package/dist/dev/ui/slider/fill.d.ts +1 -2
  767. package/dist/dev/ui/slider/preview.d.ts +1 -2
  768. package/dist/dev/ui/slider/preview.js.map +1 -1
  769. package/dist/dev/ui/slider/thumb.d.ts +1 -2
  770. package/dist/dev/ui/slider/thumb.js.map +1 -1
  771. package/dist/dev/ui/slider/thumbnail.d.ts +1 -2
  772. package/dist/dev/ui/slider/thumbnail.js.map +1 -1
  773. package/dist/dev/ui/slider/track.d.ts +1 -2
  774. package/dist/dev/ui/slider/value.d.ts +1 -2
  775. package/dist/dev/ui/slider/value.js.map +1 -1
  776. package/dist/dev/ui/status-announcer/element.d.ts +1 -2
  777. package/dist/dev/ui/status-announcer/element.js.map +1 -1
  778. package/dist/dev/ui/status-indicator/element.d.ts +9 -4
  779. package/dist/dev/ui/status-indicator/element.js +14 -1
  780. package/dist/dev/ui/status-indicator/element.js.map +1 -1
  781. package/dist/dev/ui/status-indicator/value.d.ts +1 -2
  782. package/dist/dev/ui/text/element.d.ts +4 -3
  783. package/dist/dev/ui/text/element.js +1 -0
  784. package/dist/dev/ui/text/element.js.map +1 -1
  785. package/dist/dev/ui/thumbnail/element.d.ts +5 -6
  786. package/dist/dev/ui/thumbnail/element.js +3 -2
  787. package/dist/dev/ui/thumbnail/element.js.map +1 -1
  788. package/dist/dev/ui/time/element.d.ts +1 -2
  789. package/dist/dev/ui/time/element.js.map +1 -1
  790. package/dist/dev/ui/time/group.d.ts +1 -2
  791. package/dist/dev/ui/time/separator.d.ts +1 -2
  792. package/dist/dev/ui/time-slider/chapter-title.d.ts +1 -2
  793. package/dist/dev/ui/time-slider/chapter-title.js.map +1 -1
  794. package/dist/dev/ui/time-slider/chapters.d.ts +1 -2
  795. package/dist/dev/ui/time-slider/chapters.js.map +1 -1
  796. package/dist/dev/ui/time-slider/element.d.ts +1 -2
  797. package/dist/dev/ui/time-slider/element.js.map +1 -1
  798. package/dist/dev/ui/title/element.d.ts +1 -2
  799. package/dist/dev/ui/title/element.js.map +1 -1
  800. package/dist/dev/ui/tooltip/context.d.ts +2 -2
  801. package/dist/dev/ui/tooltip/context.js +1 -0
  802. package/dist/dev/ui/tooltip/context.js.map +1 -1
  803. package/dist/dev/ui/tooltip/element.d.ts +1 -2
  804. package/dist/dev/ui/tooltip/element.js +4 -2
  805. package/dist/dev/ui/tooltip/element.js.map +1 -1
  806. package/dist/dev/ui/tooltip/group.d.ts +1 -2
  807. package/dist/dev/ui/tooltip/group.js.map +1 -1
  808. package/dist/dev/ui/tooltip/label.d.ts +1 -2
  809. package/dist/dev/ui/tooltip/label.js.map +1 -1
  810. package/dist/dev/ui/tooltip/shortcut.d.ts +1 -2
  811. package/dist/dev/ui/ui-element.d.ts +3 -3
  812. package/dist/dev/ui/ui-element.js.map +1 -1
  813. package/dist/dev/ui/volume-indicator/element.d.ts +3 -4
  814. package/dist/dev/ui/volume-indicator/element.js.map +1 -1
  815. package/dist/dev/ui/volume-indicator/fill.d.ts +1 -2
  816. package/dist/dev/ui/volume-indicator/value.d.ts +1 -2
  817. package/dist/dev/ui/volume-popover/element.d.ts +1 -2
  818. package/dist/dev/ui/volume-popover/element.js +1 -1
  819. package/dist/dev/ui/volume-popover/element.js.map +1 -1
  820. package/dist/dev/ui/volume-slider/element.d.ts +1 -2
  821. package/dist/dev/ui/volume-slider/element.js +1 -1
  822. package/dist/dev/ui/volume-slider/element.js.map +1 -1
  823. package/dist/dev/version.d.ts +21 -0
  824. package/dist/dev/version.js +29 -0
  825. package/dist/dev/version.js.map +1 -0
  826. package/docs/README.md +1 -1
  827. package/docs/guides/autoplay.md +10 -21
  828. package/docs/guides/background-video.md +74 -7
  829. package/docs/guides/browser-support.md +48 -36
  830. package/docs/guides/build-your-own-component.md +5 -5
  831. package/docs/guides/captions.md +46 -6
  832. package/docs/guides/casting.md +24 -8
  833. package/docs/guides/cdn.md +11 -10
  834. package/docs/guides/content-security-policy.md +29 -5
  835. package/docs/guides/controls.md +25 -10
  836. package/docs/guides/customize-skins.md +2 -2
  837. package/docs/guides/features.md +3 -1
  838. package/docs/guides/fullscreen.md +35 -8
  839. package/docs/guides/installation-cdn.md +5 -9
  840. package/docs/guides/installation-shadcn.md +4 -8
  841. package/docs/guides/installation-svelte.md +5 -9
  842. package/docs/guides/installation-vue.md +5 -9
  843. package/docs/guides/installation.md +5 -9
  844. package/docs/guides/internationalization.md +37 -28
  845. package/docs/guides/keyboard-shortcuts.md +27 -15
  846. package/docs/guides/live-streams.md +51 -13
  847. package/docs/guides/llms.txt +7 -6
  848. package/docs/guides/media-sources.md +8 -5
  849. package/docs/guides/migrate-from-media-chrome.md +182 -51
  850. package/docs/guides/migrate-from-mux-player.md +191 -116
  851. package/docs/guides/migrate-from-plyr.md +171 -81
  852. package/docs/guides/migrate-from-video-js-8.md +255 -190
  853. package/docs/guides/migrate-from-vidstack.md +865 -0
  854. package/docs/guides/mux-data.md +23 -9
  855. package/docs/guides/picture-in-picture.md +22 -16
  856. package/docs/guides/playback-errors.md +10 -7
  857. package/docs/guides/poster.md +32 -11
  858. package/docs/guides/presets.md +15 -5
  859. package/docs/guides/quality.md +44 -5
  860. package/docs/guides/self-hosting.md +5 -5
  861. package/docs/guides/skins.md +6 -4
  862. package/docs/guides/thumbnails.md +24 -14
  863. package/docs/guides/ui-components.md +1 -1
  864. package/docs/guides/user-preferences.md +38 -15
  865. package/docs/guides/v10-roadmap.md +19 -54
  866. package/docs/llms.txt +46 -12
  867. package/docs/reference/api/create-i18n.md +3 -3
  868. package/docs/reference/api/create-translator.md +1 -1
  869. package/docs/reference/api/feature-audio-track.md +1 -1
  870. package/docs/reference/api/feature-controls.md +2 -2
  871. package/docs/reference/api/feature-fullscreen.md +1 -2
  872. package/docs/reference/api/feature-pip.md +3 -4
  873. package/docs/reference/api/feature-playback.md +2 -3
  874. package/docs/reference/api/feature-quality.md +2 -2
  875. package/docs/reference/api/feature-remote-playback.md +1 -1
  876. package/docs/reference/api/feature-source.md +2 -8
  877. package/docs/reference/api/feature-text-tracks.md +6 -8
  878. package/docs/reference/api/feature-volume.md +1 -1
  879. package/docs/reference/api/find-locale-keys.md +32 -0
  880. package/docs/reference/api/get-locale-key.md +32 -0
  881. package/docs/reference/api/html-create-player.md +24 -26
  882. package/docs/reference/api/i18n-controller.md +1 -1
  883. package/docs/reference/api/is-text.md +33 -0
  884. package/docs/reference/api/llms.txt +23 -2
  885. package/docs/reference/api/load-locale.md +36 -0
  886. package/docs/reference/api/media-capabilities.md +255 -0
  887. package/docs/reference/api/player-controller.md +39 -20
  888. package/docs/reference/api/player-store.md +112 -0
  889. package/docs/reference/api/preset-audio.md +116 -0
  890. package/docs/reference/api/preset-background.md +103 -0
  891. package/docs/reference/api/preset-live-audio.md +119 -0
  892. package/docs/reference/api/preset-live-video.md +124 -0
  893. package/docs/reference/api/preset-video.md +123 -0
  894. package/docs/reference/api/register-i18n.md +13 -0
  895. package/docs/reference/api/resolve-adapter-type.md +98 -0
  896. package/docs/reference/api/resolve-mime-type.md +48 -0
  897. package/docs/reference/api/resolve-translation.md +36 -0
  898. package/docs/reference/api/translate-text.md +56 -0
  899. package/docs/reference/api/translation-phrases.md +13 -0
  900. package/docs/reference/api/ui-element.md +296 -0
  901. package/docs/reference/components/audio-compat-skin.md +33 -0
  902. package/docs/reference/components/{audio-minimal-skin.md → audio-neutral-skin.md} +6 -6
  903. package/docs/reference/components/audio-skin.md +2 -2
  904. package/docs/reference/components/background-video-skin.md +1 -1
  905. package/docs/reference/components/background-video.md +1 -1
  906. package/docs/reference/components/captions-button.md +1 -1
  907. package/docs/reference/components/captions-radio-group.md +1 -1
  908. package/docs/reference/components/cloudflare-video.md +1 -1
  909. package/docs/reference/components/controls.md +2 -2
  910. package/docs/reference/components/dash-video.md +1 -1
  911. package/docs/reference/components/fullscreen-button.md +1 -1
  912. package/docs/reference/components/google-cast.md +4 -4
  913. package/docs/reference/components/hls-audio.md +1 -1
  914. package/docs/reference/components/hls-background-video.md +1 -1
  915. package/docs/reference/components/hls-video.md +1 -1
  916. package/docs/reference/components/hlsjs-video.md +2 -2
  917. package/docs/reference/components/icons.md +130 -0
  918. package/docs/reference/components/live-audio-compat-skin.md +35 -0
  919. package/docs/reference/components/{live-audio-minimal-skin.md → live-audio-neutral-skin.md} +6 -6
  920. package/docs/reference/components/live-audio-skin.md +2 -2
  921. package/docs/reference/components/live-video-compat-skin.md +41 -0
  922. package/docs/reference/components/{live-video-minimal-skin.md → live-video-neutral-skin.md} +6 -6
  923. package/docs/reference/components/live-video-skin.md +2 -2
  924. package/docs/reference/components/llms.txt +16 -6
  925. package/docs/reference/components/menu.md +7 -2
  926. package/docs/reference/components/mux-audio.md +2 -2
  927. package/docs/reference/components/mux-background-video.md +1 -1
  928. package/docs/reference/components/mux-data.md +4 -4
  929. package/docs/reference/components/mux-video.md +4 -4
  930. package/docs/reference/components/native-hls-video.md +1 -1
  931. package/docs/reference/components/pip-button.md +2 -2
  932. package/docs/reference/components/player.md +26 -2
  933. package/docs/reference/components/popover.md +6 -8
  934. package/docs/reference/components/shaka-video.md +1 -1
  935. package/docs/reference/components/spotify-audio.md +1 -1
  936. package/docs/reference/components/status-indicator.md +27 -4
  937. package/docs/reference/components/thumbnail.md +1 -1
  938. package/docs/reference/components/tiktok-video.md +1 -1
  939. package/docs/reference/components/twitch-video.md +1 -1
  940. package/docs/reference/components/video-compat-skin.md +45 -0
  941. package/docs/reference/components/{video-minimal-skin.md → video-neutral-skin.md} +6 -6
  942. package/docs/reference/components/video-skin.md +2 -2
  943. package/docs/reference/components/vimeo-video.md +1 -1
  944. package/docs/reference/components/wistia-video.md +1 -1
  945. package/docs/reference/components/youtube-video.md +1 -1
  946. package/package.json +54 -42
  947. package/dist/default/define/audio/minimal-skin.css +0 -2048
  948. package/dist/default/define/audio/minimal-skin.js +0 -6
  949. package/dist/default/define/audio/minimal-skin2.js +0 -4
  950. package/dist/default/define/live-audio/minimal-skin.css +0 -1378
  951. package/dist/default/define/live-audio/minimal-skin.js +0 -6
  952. package/dist/default/define/live-audio/minimal-skin2.js +0 -4
  953. package/dist/default/define/live-video/minimal-skin.css +0 -2311
  954. package/dist/default/define/live-video/minimal-skin.js +0 -6
  955. package/dist/default/define/live-video/minimal-skin2.js +0 -4
  956. package/dist/default/define/video/minimal-skin.css +0 -3232
  957. package/dist/default/define/video/minimal-skin.js +0 -6
  958. package/dist/default/define/video/minimal-skin2.js +0 -4
  959. package/dist/default/extensions/media-extension-element.js +0 -54
  960. package/dist/default/icons/element/minimal/index.js +0 -1
  961. package/dist/default/icons/minimal/index.js +0 -26
  962. package/dist/default/internal/skins/minimal-audio/skin.css +0 -1977
  963. package/dist/default/internal/skins/minimal-live-audio/skin.css +0 -1307
  964. package/dist/default/internal/skins/minimal-live-video/skin.css +0 -2240
  965. package/dist/default/internal/skins/minimal-video/skin.css +0 -3161
  966. package/dist/default/presets/audio/minimal-skin.js +0 -19
  967. package/dist/default/presets/live-audio/minimal-skin.js +0 -19
  968. package/dist/default/presets/live-video/minimal-skin.js +0 -19
  969. package/dist/default/presets/video/minimal-skin.js +0 -19
  970. package/dist/dev/define/audio/minimal-skin.css +0 -2048
  971. package/dist/dev/define/audio/minimal-skin.d.ts +0 -1
  972. package/dist/dev/define/audio/minimal-skin.js +0 -8
  973. package/dist/dev/define/audio/minimal-skin.js.map +0 -1
  974. package/dist/dev/define/audio/minimal-skin2.js +0 -6
  975. package/dist/dev/define/audio/minimal-skin2.js.map +0 -1
  976. package/dist/dev/define/live-audio/minimal-skin.css +0 -1378
  977. package/dist/dev/define/live-audio/minimal-skin.d.ts +0 -1
  978. package/dist/dev/define/live-audio/minimal-skin.js +0 -8
  979. package/dist/dev/define/live-audio/minimal-skin.js.map +0 -1
  980. package/dist/dev/define/live-audio/minimal-skin2.js +0 -6
  981. package/dist/dev/define/live-audio/minimal-skin2.js.map +0 -1
  982. package/dist/dev/define/live-video/minimal-skin.css +0 -2311
  983. package/dist/dev/define/live-video/minimal-skin.d.ts +0 -1
  984. package/dist/dev/define/live-video/minimal-skin.js +0 -8
  985. package/dist/dev/define/live-video/minimal-skin.js.map +0 -1
  986. package/dist/dev/define/live-video/minimal-skin2.js +0 -6
  987. package/dist/dev/define/live-video/minimal-skin2.js.map +0 -1
  988. package/dist/dev/define/video/minimal-skin.css +0 -3232
  989. package/dist/dev/define/video/minimal-skin.d.ts +0 -1
  990. package/dist/dev/define/video/minimal-skin.js +0 -8
  991. package/dist/dev/define/video/minimal-skin.js.map +0 -1
  992. package/dist/dev/define/video/minimal-skin2.js +0 -6
  993. package/dist/dev/define/video/minimal-skin2.js.map +0 -1
  994. package/dist/dev/extensions/media-extension-element.d.ts +0 -29
  995. package/dist/dev/extensions/media-extension-element.js +0 -56
  996. package/dist/dev/extensions/media-extension-element.js.map +0 -1
  997. package/dist/dev/icons/dist/html/minimal/index.d.ts +0 -29
  998. package/dist/dev/icons/element/minimal/index.d.ts +0 -1
  999. package/dist/dev/icons/element/minimal/index.js +0 -1
  1000. package/dist/dev/icons/minimal/index.js +0 -26
  1001. package/dist/dev/internal/skins/minimal-audio/skin.css +0 -1977
  1002. package/dist/dev/internal/skins/minimal-live-audio/skin.css +0 -1307
  1003. package/dist/dev/internal/skins/minimal-live-video/skin.css +0 -2240
  1004. package/dist/dev/internal/skins/minimal-video/skin.css +0 -3161
  1005. package/dist/dev/presets/audio/minimal-skin.d.ts +0 -16
  1006. package/dist/dev/presets/audio/minimal-skin.js +0 -21
  1007. package/dist/dev/presets/audio/minimal-skin.js.map +0 -1
  1008. package/dist/dev/presets/live-audio/minimal-skin.d.ts +0 -16
  1009. package/dist/dev/presets/live-audio/minimal-skin.js +0 -21
  1010. package/dist/dev/presets/live-audio/minimal-skin.js.map +0 -1
  1011. package/dist/dev/presets/live-video/minimal-skin.d.ts +0 -16
  1012. package/dist/dev/presets/live-video/minimal-skin.js +0 -21
  1013. package/dist/dev/presets/live-video/minimal-skin.js.map +0 -1
  1014. package/dist/dev/presets/video/minimal-skin.d.ts +0 -16
  1015. package/dist/dev/presets/video/minimal-skin.js +0 -21
  1016. package/dist/dev/presets/video/minimal-skin.js.map +0 -1
  1017. /package/dist/dev/define/audio/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1018. /package/dist/dev/define/live-audio/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1019. /package/dist/dev/define/live-video/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1020. /package/dist/dev/define/video/{minimal-ui.d.ts → neutral-ui.d.ts} +0 -0
  1021. /package/dist/dev/icons/dist/element/{minimal → compat}/index.d.ts +0 -0
@@ -7,7 +7,7 @@ import { PropertyValues } from "@videojs/element";
7
7
  *
8
8
  * @fires checked-change - Fired when the checked state changes.
9
9
  */
10
- declare class MenuCheckboxItemElement extends UIElement {
10
+ export declare class MenuCheckboxItemElement extends UIElement {
11
11
  #private;
12
12
  static readonly tagName = "media-menu-checkbox-item";
13
13
  static properties: {
@@ -25,5 +25,4 @@ declare class MenuCheckboxItemElement extends UIElement {
25
25
  protected update(_changed: PropertyValues): void;
26
26
  }
27
27
  //#endregion
28
- export { MenuCheckboxItemElement };
29
28
  //# sourceMappingURL=checkbox-item.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-item.js","names":["#ctx","#disconnect","#registered","#cleanupRegistration"],"sources":["../../../../src/ui/menu/checkbox-item.ts"],"sourcesContent":["import { applyElementProps } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuContext } from './context';\n\n/**\n * Menu item that toggles `checked` when activated and leaves the menu open. The element itself takes\n * `role=\"menuitemcheckbox\"`.\n *\n * @fires checked-change - Fired when the checked state changes.\n */\nexport class MenuCheckboxItemElement extends UIElement {\n static readonly tagName = 'media-menu-checkbox-item';\n\n static override properties = {\n checked: { type: Boolean },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'checked' | 'disabled'>;\n\n checked = false;\n disabled = false;\n\n readonly #ctx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registered = false;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n this.#registered = false;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n this.#registered = false;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx || !this.#disconnect) return;\n\n if (!this.#registered) {\n this.#registered = true;\n\n this.#cleanupRegistration = ctx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: () => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.disabled) return;\n\n this.checked = !this.checked;\n this.dispatchEvent(new CustomEvent('checked-change', { detail: { checked: this.checked }, bubbles: true }));\n },\n onPointerenter: () => {\n const currentCtx = this.#ctx.value;\n\n if (!this.disabled) currentCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n applyElementProps(this, {\n role: 'menuitemcheckbox',\n 'aria-checked': String(this.checked),\n 'aria-disabled': this.disabled ? 'true' : undefined,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,0BAAb,cAA6C,UAAU;;;EAQ3C,KAAA,UAAA;EACC,KAAA,WAAA;EAEK,KAAA,OAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAE7C,KAAA,cAAA;EACxB,KAAA,cAAA;EAC8B,KAAA,uBAAA;;;EAdlB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,SAAS,EAAE,MAAM,QAAQ;GACzB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAKC,cAAc,IAAI,gBAAgB;EACvC,KAAKC,cAAc;CACrB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKC,uBAAuB;EAC5B,KAAKA,uBAAuB;EAC5B,KAAKF,aAAa,MAAM;EACxB,KAAKA,cAAc;EACnB,KAAKC,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,MAAM,KAAKF,KAAK;EACtB,IAAI,CAAC,OAAO,CAAC,KAAKC,aAAa;EAE/B,IAAI,CAAC,KAAKC,aAAa;GACrB,KAAKA,cAAc;GAEnB,KAAKC,uBAAuB,IAAI,KAAK,aAAa,IAAI;GAEtD,kBACE,MACA;IACE,eAAe;KAEb,IAAI,CADe,KAAKH,KAAK,SACV,KAAK,UAAU;KAElC,KAAK,UAAU,CAAC,KAAK;KACrB,KAAK,cAAc,IAAI,YAAY,kBAAkB;MAAE,QAAQ,EAAE,SAAS,KAAK,QAAQ;MAAG,SAAS;KAAK,CAAC,CAAC;IAC5G;IACA,sBAAsB;KACpB,MAAM,aAAa,KAAKA,KAAK;KAE7B,IAAI,CAAC,KAAK,UAAU,YAAY,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IACtF;GACF,GACA,EAAE,QAAQ,KAAKC,YAAY,OAAO,CACpC;EACF;EAEA,kBAAkB,MAAM;GACtB,MAAM;GACN,gBAAgB,OAAO,KAAK,OAAO;GACnC,iBAAiB,KAAK,WAAW,SAAS,KAAA;EAC5C,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"checkbox-item.js","names":[],"sources":["../../../../src/ui/menu/checkbox-item.ts"],"sourcesContent":["import { applyElementProps } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuContext } from './context';\n\n/**\n * Menu item that toggles `checked` when activated and leaves the menu open. The element itself takes\n * `role=\"menuitemcheckbox\"`.\n *\n * @fires checked-change - Fired when the checked state changes.\n */\nexport class MenuCheckboxItemElement extends UIElement {\n static readonly tagName = 'media-menu-checkbox-item';\n\n static override properties = {\n checked: { type: Boolean },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'checked' | 'disabled'>;\n\n checked = false;\n disabled = false;\n\n readonly #ctx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registered = false;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n this.#registered = false;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n this.#registered = false;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx || !this.#disconnect) return;\n\n if (!this.#registered) {\n this.#registered = true;\n\n this.#cleanupRegistration = ctx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: () => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.disabled) return;\n\n this.checked = !this.checked;\n this.dispatchEvent(new CustomEvent('checked-change', { detail: { checked: this.checked }, bubbles: true }));\n },\n onPointerenter: () => {\n const currentCtx = this.#ctx.value;\n\n if (!this.disabled) currentCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n applyElementProps(this, {\n role: 'menuitemcheckbox',\n 'aria-checked': String(this.checked),\n 'aria-disabled': this.disabled ? 'true' : undefined,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,0BAAb,cAA6C,UAAU;;;EAQ3C,KAAA,UAAA;EACC,KAAA,WAAA;EAEK,KAAA,OAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAE7C,KAAA,cAAA;EACxB,KAAA,cAAA;EAC8B,KAAA,uBAAA;;;EAdlB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,SAAS,EAAE,MAAM,QAAQ;GACzB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,cAAc,IAAI,gBAAgB;EACvC,KAAK,cAAc;CACrB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;EAC5B,KAAK,aAAa,MAAM;EACxB,KAAK,cAAc;EACnB,KAAK,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,CAAC,OAAO,CAAC,KAAK,aAAa;EAE/B,IAAI,CAAC,KAAK,aAAa;GACrB,KAAK,cAAc;GAEnB,KAAK,uBAAuB,IAAI,KAAK,aAAa,IAAI;GAEtD,kBACE,MACA;IACE,eAAe;KAEb,IAAI,CADe,KAAK,KAAK,SACV,KAAK,UAAU;KAElC,KAAK,UAAU,CAAC,KAAK;KACrB,KAAK,cAAc,IAAI,YAAY,kBAAkB;MAAE,QAAQ,EAAE,SAAS,KAAK,QAAQ;MAAG,SAAS;KAAK,CAAC,CAAC;IAC5G;IACA,sBAAsB;KACpB,MAAM,aAAa,KAAK,KAAK;KAE7B,IAAI,CAAC,KAAK,UAAU,YAAY,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IACtF;GACF,GACA,EAAE,QAAQ,KAAK,YAAY,OAAO,CACpC;EACF;EAEA,kBAAkB,MAAM;GACtB,MAAM;GACN,gBAAgB,OAAO,KAAK,OAAO;GACnC,iBAAiB,KAAK,WAAW,SAAS,KAAA;EAC5C,CAAC;CACH;AACF"}
@@ -4,7 +4,7 @@ import { MenuOpenChangeReason } from "@videojs/core/dom";
4
4
  import { PropertyValues } from "@videojs/element";
5
5
  //#region src/ui/menu/content.d.ts
6
6
  /** One accessible menu page. Root and nested pages are sibling children of `<media-menu>`. */
7
- declare class MenuContentElement extends UIElement {
7
+ export declare class MenuContentElement extends UIElement {
8
8
  #private;
9
9
  static readonly tagName = "media-menu-content";
10
10
  static properties: {
@@ -27,5 +27,4 @@ declare class MenuContentElement extends UIElement {
27
27
  protected update(changed: PropertyValues): void;
28
28
  }
29
29
  //#endregion
30
- export { MenuContentElement };
31
30
  //# sourceMappingURL=content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","names":["#menu","#parentMenu","#optionStates","#optionState","#syncOptionState","#findTrigger","#optionParent","#optionSource","#root","#provider","#core","#generatedId","#context","#normalizing","#disconnect","#handleKeyDown","#handleFocusOut","#cleanupMenu","#ownsMenu","#rootMenu","#setupMenu","#setOptionParent","#wasActive","#setOptionState","#normalize","#cleanupParentRegistration","#cleanupRegistration","#clearOptionState","#stateTrigger","#triggerWasDisabled","#triggerWasHidden"],"sources":["../../../../src/ui/menu/content.ts"],"sourcesContent":["import { MenuContentDataAttrs, MenuCore, type MenuOptionState, resolveMenuOptionState } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createTransition,\n isMenuNavigationKey,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n type UIKeyboardEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { type MenuContextValue, menuContext } from './context';\nlet idCounter = 0;\n\n/** One accessible menu page. Root and nested pages are sibling children of `<media-menu>`. */\nexport class MenuContentElement extends UIElement {\n static readonly tagName = 'media-menu-content';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n } satisfies PropertyDeclarationMap<'open' | 'defaultOpen'>;\n\n open = false;\n defaultOpen = false;\n\n readonly #root = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #core = new MenuCore();\n readonly #generatedId = `vjs-menu-content-${idCounter++}`;\n #context: MenuContextValue | null = null;\n #menu: MenuApi | null = null;\n #parentMenu: MenuApi | null = null;\n #rootMenu: MenuApi | null = null;\n #ownsMenu = false;\n #disconnect: AbortController | null = null;\n #cleanupRegistration: (() => void) | null = null;\n #cleanupParentRegistration: (() => void) | null = null;\n readonly #optionStates = new Map<symbol, MenuOptionState>();\n readonly #optionSource = Symbol('menu');\n #optionState: MenuOptionState | null = null;\n #optionParent: MenuContextValue | null = null;\n #stateTrigger: HTMLElement | null = null;\n #triggerWasDisabled = false;\n #triggerWasHidden = false;\n #wasActive = false;\n #normalizing = false;\n\n get context(): MenuContextValue | null {\n return this.#context;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.#normalizing) return;\n\n this.#disconnect = new AbortController();\n applyElementProps(\n this,\n { onKeyDown: this.#handleKeyDown, onFocusOut: this.#handleFocusOut },\n { signal: this.#disconnect.signal }\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n if (this.#normalizing) return;\n\n this.#cleanupMenu();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n if (this.#ownsMenu && this.#menu && changed.has('open')) this.#menu.syncOpen(this.open);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n const root = this.#root.value ?? null;\n if (!root) return;\n\n if (!this.id) this.id = this.#generatedId;\n\n const trigger = this.#findTrigger();\n const parentContent = trigger?.closest<MenuContentElement>(MenuContentElement.tagName) ?? null;\n\n if (parentContent && !parentContent.context) {\n this.hidden = true;\n requestAnimationFrame(() => this.requestUpdate());\n return;\n }\n\n const parentMenu = parentContent?.context?.menu ?? null;\n const isSubmenu = parentMenu !== null;\n\n if (root.menu !== this.#rootMenu || parentMenu !== this.#parentMenu) {\n this.#cleanupMenu();\n this.#rootMenu = root.menu;\n this.#parentMenu = parentMenu;\n this.#setupMenu(root, parentMenu);\n }\n\n this.#setOptionParent(parentContent?.context ?? root);\n\n const menu = this.#menu;\n if (!menu) return;\n\n const input = menu.input.current;\n\n this.#core.setInput({ ...input, isSubmenu });\n const state = this.#core.getState();\n const active = !isSubmenu || state.open || state.status === 'ending';\n\n applyElementProps(this, {\n ...this.#core.getContentAttrs(),\n hidden: !active,\n });\n applyStateDataAttrs(this, state, MenuContentDataAttrs);\n\n if (trigger) {\n menu.setTriggerElement(trigger);\n applyElementProps(trigger, this.#core.getTriggerAttrs(state, active ? this.id : undefined));\n this.#syncOptionState(trigger);\n }\n\n if (isSubmenu && active && !this.#wasActive) menu.highlightInitialItem({ preventScroll: true });\n\n this.#wasActive = active;\n\n this.#context = {\n core: this.#core,\n menu,\n popup: root.popup,\n state,\n setOptionState: this.#setOptionState,\n };\n this.#provider.setValue(this.#context);\n root.popup.sync();\n this.#normalize();\n }\n\n #setupMenu(root: MenuContextValue, parentMenu: MenuApi | null): void {\n const isSubmenu = parentMenu !== null;\n\n if (isSubmenu) {\n this.#ownsMenu = true;\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => true,\n closeOnOutsideClick: () => false,\n });\n this.#menu.setPopupElement(this);\n this.#cleanupParentRegistration = parentMenu.registerSubmenu(this.#menu);\n const signal = this.#disconnect?.signal;\n\n if (signal) this.#menu.input.subscribe(() => this.requestUpdate(), { signal });\n\n this.#menu.syncOpen(this.open);\n } else {\n this.#ownsMenu = false;\n this.#menu = root.menu;\n }\n\n this.#cleanupRegistration = root.popup.registerContent({\n menu: this.#menu,\n parent: parentMenu,\n element: this,\n });\n }\n\n #cleanupMenu(): void {\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#cleanupParentRegistration?.();\n this.#cleanupParentRegistration = null;\n this.#setOptionParent(null);\n this.#clearOptionState();\n this.#optionStates.clear();\n this.#optionState = null;\n\n if (this.#ownsMenu) this.#menu?.destroy();\n\n this.#menu = null;\n this.#context = null;\n this.#rootMenu = null;\n this.#parentMenu = null;\n this.#ownsMenu = false;\n this.#wasActive = false;\n }\n\n #findTrigger(): HTMLElement | null {\n if (!this.id) return null;\n\n const root = this.getRootNode() as Document | ShadowRoot;\n\n return (\n [...root.querySelectorAll<HTMLElement>('[commandfor], media-menu-item')].find(\n (element) =>\n element.getAttribute('commandfor') === this.id ||\n (element as HTMLElement & { commandfor?: string }).commandfor === this.id\n ) ?? null\n );\n }\n\n /** Keep every page as a direct popup child, including authored nested pages. */\n #normalize(): void {\n const popup = this.closest('media-menu');\n if (!popup || this.parentElement === popup) return;\n\n this.#normalizing = true;\n popup.append(this);\n this.#normalizing = false;\n }\n\n #handleKeyDown = (event: UIKeyboardEvent): void => {\n const isNavigationKey = isMenuNavigationKey(event);\n const defaultPrevented = event.defaultPrevented;\n\n this.#menu?.contentProps.onKeyDown(event);\n\n if (this.#parentMenu && (event.key === 'ArrowLeft' || event.key === 'Escape') && !defaultPrevented) {\n event.preventDefault();\n this.#menu?.close('escape');\n }\n\n if (event.key !== 'Escape' && isNavigationKey) event.stopPropagation();\n };\n\n #handleFocusOut = (event: FocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #setOptionState = (source: symbol, optionState: MenuOptionState | null): void => {\n const previous = this.#optionStates.get(source);\n if (optionState && isSameOptionState(previous, optionState)) return;\n\n if (!optionState && !previous) return;\n\n if (optionState) this.#optionStates.set(source, optionState);\n else this.#optionStates.delete(source);\n\n this.#optionState = resolveMenuOptionState(this.#optionStates.values());\n\n if ((this.#optionState?.disabled || this.#optionState?.hidden) && this.open && this.#parentMenu) {\n this.close('imperative-action');\n }\n\n this.#syncOptionState(this.#findTrigger());\n this.#optionParent?.setOptionState(this.#optionSource, this.#optionState);\n };\n\n #setOptionParent(parent: MenuContextValue | null): void {\n if (parent?.menu === this.#optionParent?.menu) {\n this.#optionParent = parent;\n return;\n }\n\n this.#optionParent?.setOptionState(this.#optionSource, null);\n this.#optionParent = parent;\n this.#optionParent?.setOptionState(this.#optionSource, this.#optionState);\n }\n\n #syncOptionState(trigger: HTMLElement | null): void {\n if (trigger !== this.#stateTrigger) {\n this.#clearOptionState();\n this.#stateTrigger = trigger;\n this.#triggerWasDisabled = trigger ? isTriggerExplicitlyDisabled(trigger) : false;\n this.#triggerWasHidden = trigger?.hidden === true;\n }\n\n if (!trigger) return;\n\n const disabled = this.#optionState?.disabled || this.#triggerWasDisabled;\n\n applyElementProps(trigger, {\n disabled: disabled || undefined,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'data-availability': this.#optionState?.availability,\n hidden: this.#triggerWasHidden || this.#optionState?.hidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value && value.textContent !== this.#optionState?.value) value.textContent = this.#optionState?.value ?? '';\n }\n\n #clearOptionState(): void {\n const trigger = this.#stateTrigger;\n if (!trigger) return;\n\n applyElementProps(trigger, {\n disabled: this.#triggerWasDisabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled ? 'true' : undefined,\n 'data-availability': undefined,\n hidden: this.#triggerWasHidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value?.textContent) value.textContent = '';\n\n this.#stateTrigger = null;\n this.#triggerWasDisabled = false;\n this.#triggerWasHidden = false;\n }\n}\n\nfunction isSameOptionState(a: MenuOptionState | undefined, b: MenuOptionState): boolean {\n return (\n a?.value === b.value && a.disabled === b.disabled && a.hidden === b.hidden && a.availability === b.availability\n );\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"content.js","names":[],"sources":["../../../../src/ui/menu/content.ts"],"sourcesContent":["import { MenuContentDataAttrs, MenuCore, type MenuOptionState, resolveMenuOptionState } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createTransition,\n isMenuNavigationKey,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n type UIKeyboardEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { type MenuContextValue, menuContext } from './context';\nlet idCounter = 0;\n\n/** One accessible menu page. Root and nested pages are sibling children of `<media-menu>`. */\nexport class MenuContentElement extends UIElement {\n static readonly tagName = 'media-menu-content';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n } satisfies PropertyDeclarationMap<'open' | 'defaultOpen'>;\n\n open = false;\n defaultOpen = false;\n\n readonly #root = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #core = new MenuCore();\n readonly #generatedId = `vjs-menu-content-${idCounter++}`;\n #context: MenuContextValue | null = null;\n #menu: MenuApi | null = null;\n #parentMenu: MenuApi | null = null;\n #rootMenu: MenuApi | null = null;\n #ownsMenu = false;\n #disconnect: AbortController | null = null;\n #cleanupRegistration: (() => void) | null = null;\n #cleanupParentRegistration: (() => void) | null = null;\n readonly #optionStates = new Map<symbol, MenuOptionState>();\n readonly #optionSource = Symbol('menu');\n #optionState: MenuOptionState | null = null;\n #optionParent: MenuContextValue | null = null;\n #stateTrigger: HTMLElement | null = null;\n #triggerWasDisabled = false;\n #triggerWasHidden = false;\n #wasActive = false;\n #normalizing = false;\n\n get context(): MenuContextValue | null {\n return this.#context;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.#normalizing) return;\n\n this.#disconnect = new AbortController();\n applyElementProps(\n this,\n { onKeyDown: this.#handleKeyDown, onFocusOut: this.#handleFocusOut },\n { signal: this.#disconnect.signal }\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n if (this.#normalizing) return;\n\n this.#cleanupMenu();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n if (this.#ownsMenu && this.#menu && changed.has('open')) this.#menu.syncOpen(this.open);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n const root = this.#root.value ?? null;\n if (!root) return;\n\n if (!this.id) this.id = this.#generatedId;\n\n const trigger = this.#findTrigger();\n const parentContent = trigger?.closest<MenuContentElement>(MenuContentElement.tagName) ?? null;\n\n if (parentContent && !parentContent.context) {\n this.hidden = true;\n requestAnimationFrame(() => this.requestUpdate());\n return;\n }\n\n const parentMenu = parentContent?.context?.menu ?? null;\n const isSubmenu = parentMenu !== null;\n\n if (root.menu !== this.#rootMenu || parentMenu !== this.#parentMenu) {\n this.#cleanupMenu();\n this.#rootMenu = root.menu;\n this.#parentMenu = parentMenu;\n this.#setupMenu(root, parentMenu);\n }\n\n this.#setOptionParent(parentContent?.context ?? root);\n\n const menu = this.#menu;\n if (!menu) return;\n\n const input = menu.input.current;\n\n this.#core.setInput({ ...input, isSubmenu });\n const state = this.#core.getState();\n const active = !isSubmenu || state.open || state.status === 'ending';\n\n applyElementProps(this, {\n ...this.#core.getContentAttrs(),\n hidden: !active,\n });\n applyStateDataAttrs(this, state, MenuContentDataAttrs);\n\n if (trigger) {\n menu.setTriggerElement(trigger);\n applyElementProps(trigger, this.#core.getTriggerAttrs(state, active ? this.id : undefined));\n this.#syncOptionState(trigger);\n }\n\n if (isSubmenu && active && !this.#wasActive) menu.highlightInitialItem({ preventScroll: true });\n\n this.#wasActive = active;\n\n this.#context = {\n core: this.#core,\n menu,\n popup: root.popup,\n state,\n setOptionState: this.#setOptionState,\n };\n this.#provider.setValue(this.#context);\n root.popup.sync();\n this.#normalize();\n }\n\n #setupMenu(root: MenuContextValue, parentMenu: MenuApi | null): void {\n const isSubmenu = parentMenu !== null;\n\n if (isSubmenu) {\n this.#ownsMenu = true;\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => true,\n closeOnOutsideClick: () => false,\n });\n this.#menu.setPopupElement(this);\n this.#cleanupParentRegistration = parentMenu.registerSubmenu(this.#menu);\n const signal = this.#disconnect?.signal;\n\n if (signal) this.#menu.input.subscribe(() => this.requestUpdate(), { signal });\n\n this.#menu.syncOpen(this.open);\n } else {\n this.#ownsMenu = false;\n this.#menu = root.menu;\n }\n\n this.#cleanupRegistration = root.popup.registerContent({\n menu: this.#menu,\n parent: parentMenu,\n element: this,\n });\n }\n\n #cleanupMenu(): void {\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#cleanupParentRegistration?.();\n this.#cleanupParentRegistration = null;\n this.#setOptionParent(null);\n this.#clearOptionState();\n this.#optionStates.clear();\n this.#optionState = null;\n\n if (this.#ownsMenu) this.#menu?.destroy();\n\n this.#menu = null;\n this.#context = null;\n this.#rootMenu = null;\n this.#parentMenu = null;\n this.#ownsMenu = false;\n this.#wasActive = false;\n }\n\n #findTrigger(): HTMLElement | null {\n if (!this.id) return null;\n\n const root = this.getRootNode() as Document | ShadowRoot;\n\n return (\n [...root.querySelectorAll<HTMLElement>('[commandfor], media-menu-item')].find(\n (element) =>\n element.getAttribute('commandfor') === this.id ||\n (element as HTMLElement & { commandfor?: string }).commandfor === this.id\n ) ?? null\n );\n }\n\n /** Keep every page as a direct popup child, including authored nested pages. */\n #normalize(): void {\n const popup = this.closest('media-menu');\n if (!popup || this.parentElement === popup) return;\n\n this.#normalizing = true;\n popup.append(this);\n this.#normalizing = false;\n }\n\n #handleKeyDown = (event: UIKeyboardEvent): void => {\n const isNavigationKey = isMenuNavigationKey(event);\n const defaultPrevented = event.defaultPrevented;\n\n this.#menu?.contentProps.onKeyDown(event);\n\n if (this.#parentMenu && (event.key === 'ArrowLeft' || event.key === 'Escape') && !defaultPrevented) {\n event.preventDefault();\n this.#menu?.close('escape');\n }\n\n if (event.key !== 'Escape' && isNavigationKey) event.stopPropagation();\n };\n\n #handleFocusOut = (event: FocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #setOptionState = (source: symbol, optionState: MenuOptionState | null): void => {\n const previous = this.#optionStates.get(source);\n if (optionState && isSameOptionState(previous, optionState)) return;\n\n if (!optionState && !previous) return;\n\n if (optionState) this.#optionStates.set(source, optionState);\n else this.#optionStates.delete(source);\n\n this.#optionState = resolveMenuOptionState(this.#optionStates.values());\n\n if ((this.#optionState?.disabled || this.#optionState?.hidden) && this.open && this.#parentMenu) {\n this.close('imperative-action');\n }\n\n this.#syncOptionState(this.#findTrigger());\n this.#optionParent?.setOptionState(this.#optionSource, this.#optionState);\n };\n\n #setOptionParent(parent: MenuContextValue | null): void {\n if (parent?.menu === this.#optionParent?.menu) {\n this.#optionParent = parent;\n return;\n }\n\n this.#optionParent?.setOptionState(this.#optionSource, null);\n this.#optionParent = parent;\n this.#optionParent?.setOptionState(this.#optionSource, this.#optionState);\n }\n\n #syncOptionState(trigger: HTMLElement | null): void {\n if (trigger !== this.#stateTrigger) {\n this.#clearOptionState();\n this.#stateTrigger = trigger;\n this.#triggerWasDisabled = trigger ? isTriggerExplicitlyDisabled(trigger) : false;\n this.#triggerWasHidden = trigger?.hidden === true;\n }\n\n if (!trigger) return;\n\n const disabled = this.#optionState?.disabled || this.#triggerWasDisabled;\n\n applyElementProps(trigger, {\n disabled: disabled || undefined,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'data-availability': this.#optionState?.availability,\n hidden: this.#triggerWasHidden || this.#optionState?.hidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value && value.textContent !== this.#optionState?.value) value.textContent = this.#optionState?.value ?? '';\n }\n\n #clearOptionState(): void {\n const trigger = this.#stateTrigger;\n if (!trigger) return;\n\n applyElementProps(trigger, {\n disabled: this.#triggerWasDisabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled ? 'true' : undefined,\n 'data-availability': undefined,\n hidden: this.#triggerWasHidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value?.textContent) value.textContent = '';\n\n this.#stateTrigger = null;\n this.#triggerWasDisabled = false;\n this.#triggerWasHidden = false;\n }\n}\n\nfunction isSameOptionState(a: MenuOptionState | undefined, b: MenuOptionState): boolean {\n return (\n a?.value === b.value && a.disabled === b.disabled && a.hidden === b.hidden && a.availability === b.availability\n );\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
@@ -2,7 +2,8 @@ import { RadioGroupContextValue, radioGroupContext } from "../radio-group/contex
2
2
  import { MenuCore, MenuOptionState, MenuState } from "@videojs/core";
3
3
  import { MenuApi, MenuPopupApi } from "@videojs/core/dom";
4
4
  //#region src/ui/menu/context.d.ts
5
- interface MenuContextValue {
5
+ export interface MenuContextValue {
6
+ /** @internal The menu core that owns this menu; parts read `state` instead. */
6
7
  core: MenuCore;
7
8
  menu: MenuApi;
8
9
  popup: MenuPopupApi;
@@ -10,15 +11,18 @@ interface MenuContextValue {
10
11
  /** Publish option state to this menu and its parent trigger. */
11
12
  setOptionState: (source: symbol, state: MenuOptionState | null) => void;
12
13
  }
13
- interface MenuGroupContextValue {
14
+ /** @internal */
15
+ export interface MenuGroupContextValue {
14
16
  registerLabel: (id: string) => () => void;
15
17
  }
16
- declare const menuContext: {
18
+ /** @internal */
19
+ export declare const menuContext: {
17
20
  __context__: MenuContextValue;
18
21
  };
19
- declare const menuGroupContext: {
22
+ /** @internal */
23
+ export declare const menuGroupContext: {
20
24
  __context__: MenuGroupContextValue;
21
25
  };
22
26
  //#endregion
23
- export { MenuContextValue, MenuGroupContextValue, type RadioGroupContextValue as MenuRadioGroupContextValue, menuContext, menuGroupContext, radioGroupContext as menuRadioGroupContext };
27
+ export { type RadioGroupContextValue as MenuRadioGroupContextValue, radioGroupContext as menuRadioGroupContext };
24
28
  //# sourceMappingURL=context.d.ts.map
@@ -3,7 +3,9 @@ import { createContext } from "@videojs/element/context";
3
3
  //#region src/ui/menu/context.ts
4
4
  const MENU_CONTEXT_KEY = Symbol("@videojs/menu");
5
5
  const MENU_GROUP_CONTEXT_KEY = Symbol("@videojs/menu-group");
6
+ /** @internal */
6
7
  const menuContext = createContext(MENU_CONTEXT_KEY);
8
+ /** @internal */
7
9
  const menuGroupContext = createContext(MENU_GROUP_CONTEXT_KEY);
8
10
  //#endregion
9
11
  export { menuContext, menuGroupContext, radioGroupContext as menuRadioGroupContext };
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/menu/context.ts"],"sourcesContent":["import type { MenuCore, MenuOptionState, MenuState } from '@videojs/core';\nimport type { MenuApi, MenuPopupApi } from '@videojs/core/dom';\nimport { createContext } from '@videojs/element/context';\n\nexport interface MenuContextValue {\n core: MenuCore;\n menu: MenuApi;\n popup: MenuPopupApi;\n state: MenuState;\n /** Publish option state to this menu and its parent trigger. */\n setOptionState: (source: symbol, state: MenuOptionState | null) => void;\n}\n\nexport interface MenuGroupContextValue {\n registerLabel: (id: string) => () => void;\n}\n\nconst MENU_CONTEXT_KEY = Symbol('@videojs/menu');\nconst MENU_GROUP_CONTEXT_KEY = Symbol('@videojs/menu-group');\n\nexport const menuContext = createContext<MenuContextValue>(MENU_CONTEXT_KEY);\nexport const menuGroupContext = createContext<MenuGroupContextValue>(MENU_GROUP_CONTEXT_KEY);\n\nexport {\n type RadioGroupContextValue as MenuRadioGroupContextValue,\n radioGroupContext as menuRadioGroupContext,\n} from '../radio-group/context';\n"],"mappings":";;;AAiBA,MAAM,mBAAmB,OAAO,eAAe;AAC/C,MAAM,yBAAyB,OAAO,qBAAqB;AAE3D,MAAa,cAAc,cAAgC,gBAAgB;AAC3E,MAAa,mBAAmB,cAAqC,sBAAsB"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/menu/context.ts"],"sourcesContent":["import type { MenuCore, MenuOptionState, MenuState } from '@videojs/core';\nimport type { MenuApi, MenuPopupApi } from '@videojs/core/dom';\nimport { createContext } from '@videojs/element/context';\n\nexport interface MenuContextValue {\n /** @internal The menu core that owns this menu; parts read `state` instead. */\n core: MenuCore;\n menu: MenuApi;\n popup: MenuPopupApi;\n state: MenuState;\n /** Publish option state to this menu and its parent trigger. */\n setOptionState: (source: symbol, state: MenuOptionState | null) => void;\n}\n\n/** @internal */\nexport interface MenuGroupContextValue {\n registerLabel: (id: string) => () => void;\n}\n\nconst MENU_CONTEXT_KEY = Symbol('@videojs/menu');\nconst MENU_GROUP_CONTEXT_KEY = Symbol('@videojs/menu-group');\n\n/** @internal */\nexport const menuContext = createContext<MenuContextValue>(MENU_CONTEXT_KEY);\n/** @internal */\nexport const menuGroupContext = createContext<MenuGroupContextValue>(MENU_GROUP_CONTEXT_KEY);\n\nexport {\n type RadioGroupContextValue as MenuRadioGroupContextValue,\n radioGroupContext as menuRadioGroupContext,\n} from '../radio-group/context';\n"],"mappings":";;;AAmBA,MAAM,mBAAmB,OAAO,eAAe;AAC/C,MAAM,yBAAyB,OAAO,qBAAqB;;AAG3D,MAAa,cAAc,cAAgC,gBAAgB;;AAE3E,MAAa,mBAAmB,cAAqC,sBAAsB"}
@@ -7,7 +7,7 @@ import { PropertyValues } from "@videojs/element";
7
7
  *
8
8
  * @fires open-change - Fired before the menu's open state changes. Cancel the event to prevent the change.
9
9
  */
10
- declare class MenuElement extends UIElement {
10
+ export declare class MenuElement extends UIElement {
11
11
  #private;
12
12
  static readonly tagName: string;
13
13
  static properties: {
@@ -53,5 +53,4 @@ declare class MenuElement extends UIElement {
53
53
  protected update(changed: PropertyValues): void;
54
54
  }
55
55
  //#endregion
56
- export { MenuElement };
57
56
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":["#menu","#optionStates","#optionState","#syncOptionState","#currentTrigger","#core","#provider","#position","#controlsState","#containerCtx","#popupGroupCtx","#popup","#disconnect","#handleFocusOut","#snapshot","#releaseControlsVisibilityLock","#cleanupTrigger","#releaseControlsLock","#syncTrigger","#setOptionState","#triggerWasDisabled","#triggerWasHidden","#triggerAbort"],"sources":["../../../../src/ui/menu/element.ts"],"sourcesContent":["import {\n MenuCore,\n type MenuInput,\n type MenuOptionState,\n MenuPopupDataAttrs,\n POPUP_HOST_ATTR,\n resolveMenuOptionState,\n} from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createMenuPopup,\n createTransition,\n getRootPositionOptions,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n type MenuPopupApi,\n MenuPositioningCSSVars,\n type PositioningBoundary,\n selectControls,\n type UIFocusEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { PositionController } from '../position-controller';\nimport { UIElement } from '../ui-element';\nimport { menuContext } from './context';\n\n/**\n * Root menu state and positioned popup. Content pages are direct children.\n *\n * @fires open-change - Fired before the menu's open state changes. Cancel the event to prevent the change.\n */\nexport class MenuElement extends UIElement {\n static readonly tagName: string = 'media-menu';\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 closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<\n 'open' | 'defaultOpen' | 'side' | 'align' | 'closeOnEscape' | 'closeOnOutsideClick' | 'boundary'\n >;\n\n open = MenuCore.defaultProps.open;\n defaultOpen = MenuCore.defaultProps.defaultOpen;\n side = MenuCore.defaultProps.side;\n align = MenuCore.defaultProps.align;\n closeOnEscape = MenuCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = MenuCore.defaultProps.closeOnOutsideClick;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new MenuCore();\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #position = new PositionController(this);\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n #menu: MenuApi | null = null;\n #popup: MenuPopupApi | null = null;\n #snapshot: SnapshotController<MenuInput> | null = null;\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n #triggerWasDisabled = false;\n #triggerWasHidden = false;\n #releaseControlsLock: (() => void) | null = null;\n readonly #optionStates = new Map<symbol, MenuOptionState>();\n #optionState: MenuOptionState | null = null;\n\n get menu(): MenuApi | null {\n return this.#menu;\n }\n\n get popup(): MenuPopupApi | null {\n return this.#popup;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n this.#disconnect = new AbortController();\n this.#popup = createMenuPopup();\n this.#popup.setElement(this);\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n group: () => this.#popupGroupCtx.value,\n });\n this.#menu.setPopupElement(this);\n\n applyElementProps(this, { onFocusOut: this.#handleFocusOut }, { signal: this.#disconnect.signal });\n\n if (this.#snapshot) this.#snapshot.track(this.#menu.input);\n else this.#snapshot = new SnapshotController(this, this.#menu.input);\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n super.disconnectedCallback();\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#popup?.destroy();\n this.#popup = null;\n this.#menu?.destroy();\n this.#menu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n this.#core.setProps({\n open: this.open,\n defaultOpen: this.defaultOpen,\n side: this.side,\n align: this.align,\n closeOnEscape: this.closeOnEscape,\n closeOnOutsideClick: this.closeOnOutsideClick,\n });\n\n if (this.#menu && changed.has('open')) this.#menu.syncOpen(this.open);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n if (!this.#menu || !this.#popup) return;\n\n const input = this.#menu.input.current;\n\n this.#core.setInput({ ...input, isSubmenu: false });\n const state = this.#core.getState();\n\n if (state.open) this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n else this.#releaseControlsVisibilityLock();\n\n const triggerElement = this.#position.findTrigger();\n\n this.#syncTrigger(triggerElement);\n applyElementProps(this, this.#core.getPopupAttrs());\n applyStateDataAttrs(this, state, MenuPopupDataAttrs);\n\n if (state.open) tryShowPopover(this);\n else tryHidePopover(this);\n\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.#menu.contentElement?.id));\n this.#syncOptionState(this.#currentTrigger);\n }\n\n if (!state.open) {\n this.#position.cleanup();\n } else {\n this.#popup.sync();\n const positionOptions = getRootPositionOptions(state.side, state.align);\n\n if (positionOptions && this.#currentTrigger) {\n this.#position.sync({\n anchorName: this.id,\n position: positionOptions,\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n cssVars: MenuPositioningCSSVars,\n trackResize: false,\n onSideChange: (side) => this.setAttribute(MenuPopupDataAttrs.side, side),\n });\n }\n }\n\n this.#provider.setValue({\n core: this.#core,\n menu: this.#menu,\n popup: this.#popup,\n state,\n setOptionState: this.#setOptionState,\n });\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n #handleFocusOut = (event: UIFocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #syncTrigger(triggerElement: HTMLElement | null): void {\n if (triggerElement === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerElement;\n this.#triggerWasDisabled = triggerElement ? isTriggerExplicitlyDisabled(triggerElement) : false;\n this.#triggerWasHidden = triggerElement?.hidden === true;\n this.#menu?.setTriggerElement(triggerElement);\n\n if (triggerElement && this.#menu) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerElement, this.#menu.triggerProps, { signal: this.#triggerAbort.signal });\n this.#syncOptionState(triggerElement);\n }\n }\n\n #setOptionState = (source: symbol, optionState: MenuOptionState | null): void => {\n const previous = this.#optionStates.get(source);\n if (optionState && isSameOptionState(previous, optionState)) return;\n\n if (!optionState && !previous) return;\n\n if (optionState) this.#optionStates.set(source, optionState);\n else this.#optionStates.delete(source);\n\n this.#optionState = resolveMenuOptionState(this.#optionStates.values());\n\n if ((this.#optionState?.disabled || this.#optionState?.hidden) && this.open) this.close('imperative-action');\n\n this.#syncOptionState(this.#currentTrigger);\n };\n\n #syncOptionState(trigger: HTMLElement | null): void {\n if (!trigger) return;\n\n applyElementProps(trigger, {\n disabled: this.#triggerWasDisabled || this.#optionState?.disabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled || this.#optionState?.disabled ? 'true' : undefined,\n 'data-availability': this.#optionState?.availability,\n hidden: this.#triggerWasHidden || this.#optionState?.hidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value && value.textContent !== this.#optionState?.value) value.textContent = this.#optionState?.value ?? '';\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 disabled: this.#triggerWasDisabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled ? 'true' : undefined,\n 'data-availability': undefined,\n hidden: this.#triggerWasHidden || undefined,\n });\n const value = this.#currentTrigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value?.textContent) value.textContent = '';\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n this.#triggerWasDisabled = false;\n this.#triggerWasHidden = false;\n }\n}\n\nfunction isSameOptionState(a: MenuOptionState | undefined, b: MenuOptionState): boolean {\n return (\n a?.value === b.value && a.disabled === b.disabled && a.hidden === b.hidden && a.availability === b.availability\n );\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/menu/element.ts"],"sourcesContent":["import {\n MenuCore,\n type MenuInput,\n type MenuOptionState,\n MenuPopupDataAttrs,\n POPUP_HOST_ATTR,\n resolveMenuOptionState,\n} from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createMenuPopup,\n createTransition,\n getRootPositionOptions,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n type MenuPopupApi,\n MenuPositioningCSSVars,\n type PositioningBoundary,\n selectControls,\n type UIFocusEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { PositionController } from '../position-controller';\nimport { UIElement } from '../ui-element';\nimport { menuContext } from './context';\n\n/**\n * Root menu state and positioned popup. Content pages are direct children.\n *\n * @fires open-change - Fired before the menu's open state changes. Cancel the event to prevent the change.\n */\nexport class MenuElement extends UIElement {\n static readonly tagName: string = 'media-menu';\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 closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<\n 'open' | 'defaultOpen' | 'side' | 'align' | 'closeOnEscape' | 'closeOnOutsideClick' | 'boundary'\n >;\n\n open = MenuCore.defaultProps.open;\n defaultOpen = MenuCore.defaultProps.defaultOpen;\n side = MenuCore.defaultProps.side;\n align = MenuCore.defaultProps.align;\n closeOnEscape = MenuCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = MenuCore.defaultProps.closeOnOutsideClick;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new MenuCore();\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #position = new PositionController(this);\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n #menu: MenuApi | null = null;\n #popup: MenuPopupApi | null = null;\n #snapshot: SnapshotController<MenuInput> | null = null;\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n #triggerWasDisabled = false;\n #triggerWasHidden = false;\n #releaseControlsLock: (() => void) | null = null;\n readonly #optionStates = new Map<symbol, MenuOptionState>();\n #optionState: MenuOptionState | null = null;\n\n get menu(): MenuApi | null {\n return this.#menu;\n }\n\n get popup(): MenuPopupApi | null {\n return this.#popup;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n this.#disconnect = new AbortController();\n this.#popup = createMenuPopup();\n this.#popup.setElement(this);\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n group: () => this.#popupGroupCtx.value,\n });\n this.#menu.setPopupElement(this);\n\n applyElementProps(this, { onFocusOut: this.#handleFocusOut }, { signal: this.#disconnect.signal });\n\n if (this.#snapshot) this.#snapshot.track(this.#menu.input);\n else this.#snapshot = new SnapshotController(this, this.#menu.input);\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n super.disconnectedCallback();\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#popup?.destroy();\n this.#popup = null;\n this.#menu?.destroy();\n this.#menu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n this.#core.setProps({\n open: this.open,\n defaultOpen: this.defaultOpen,\n side: this.side,\n align: this.align,\n closeOnEscape: this.closeOnEscape,\n closeOnOutsideClick: this.closeOnOutsideClick,\n });\n\n if (this.#menu && changed.has('open')) this.#menu.syncOpen(this.open);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n if (!this.#menu || !this.#popup) return;\n\n const input = this.#menu.input.current;\n\n this.#core.setInput({ ...input, isSubmenu: false });\n const state = this.#core.getState();\n\n if (state.open) this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n else this.#releaseControlsVisibilityLock();\n\n const triggerElement = this.#position.findTrigger();\n\n this.#syncTrigger(triggerElement);\n applyElementProps(this, this.#core.getPopupAttrs());\n applyStateDataAttrs(this, state, MenuPopupDataAttrs);\n\n if (state.open) tryShowPopover(this);\n else tryHidePopover(this);\n\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.#menu.contentElement?.id));\n this.#syncOptionState(this.#currentTrigger);\n }\n\n if (!state.open) {\n this.#position.cleanup();\n } else {\n this.#popup.sync();\n const positionOptions = getRootPositionOptions(state.side, state.align);\n\n if (positionOptions && this.#currentTrigger) {\n this.#position.sync({\n anchorName: this.id,\n position: positionOptions,\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n cssVars: MenuPositioningCSSVars,\n trackResize: false,\n onSideChange: (side) => this.setAttribute(MenuPopupDataAttrs.side, side),\n });\n }\n }\n\n this.#provider.setValue({\n core: this.#core,\n menu: this.#menu,\n popup: this.#popup,\n state,\n setOptionState: this.#setOptionState,\n });\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n #handleFocusOut = (event: UIFocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #syncTrigger(triggerElement: HTMLElement | null): void {\n if (triggerElement === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerElement;\n this.#triggerWasDisabled = triggerElement ? isTriggerExplicitlyDisabled(triggerElement) : false;\n this.#triggerWasHidden = triggerElement?.hidden === true;\n this.#menu?.setTriggerElement(triggerElement);\n\n if (triggerElement && this.#menu) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerElement, this.#menu.triggerProps, { signal: this.#triggerAbort.signal });\n this.#syncOptionState(triggerElement);\n }\n }\n\n #setOptionState = (source: symbol, optionState: MenuOptionState | null): void => {\n const previous = this.#optionStates.get(source);\n if (optionState && isSameOptionState(previous, optionState)) return;\n\n if (!optionState && !previous) return;\n\n if (optionState) this.#optionStates.set(source, optionState);\n else this.#optionStates.delete(source);\n\n this.#optionState = resolveMenuOptionState(this.#optionStates.values());\n\n if ((this.#optionState?.disabled || this.#optionState?.hidden) && this.open) this.close('imperative-action');\n\n this.#syncOptionState(this.#currentTrigger);\n };\n\n #syncOptionState(trigger: HTMLElement | null): void {\n if (!trigger) return;\n\n applyElementProps(trigger, {\n disabled: this.#triggerWasDisabled || this.#optionState?.disabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled || this.#optionState?.disabled ? 'true' : undefined,\n 'data-availability': this.#optionState?.availability,\n hidden: this.#triggerWasHidden || this.#optionState?.hidden || undefined,\n });\n const value = trigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value && value.textContent !== this.#optionState?.value) value.textContent = this.#optionState?.value ?? '';\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 disabled: this.#triggerWasDisabled || undefined,\n 'aria-disabled': this.#triggerWasDisabled ? 'true' : undefined,\n 'data-availability': undefined,\n hidden: this.#triggerWasHidden || undefined,\n });\n const value = this.#currentTrigger.querySelector<HTMLElement>('[data-part~=\"value\"], [data-part~=\"hint\"]');\n\n if (value?.textContent) value.textContent = '';\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n this.#triggerWasDisabled = false;\n this.#triggerWasHidden = false;\n }\n}\n\nfunction isSameOptionState(a: MenuOptionState | undefined, b: MenuOptionState): boolean {\n return (\n a?.value === b.value && a.disabled === b.disabled && a.hidden === b.hidden && a.availability === b.availability\n );\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"group-controller.js","names":["#host","#provider","#contextValue","#registerLabel","#appliedLabelId","#labelId"],"sources":["../../../../src/ui/menu/group-controller.ts"],"sourcesContent":["import { applyElementProps } from '@videojs/core/dom';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport type { UIElement } from '../ui-element';\nimport { menuGroupContext } from './context';\n\ninterface MenuGroupHost extends UIElement {\n requestUpdate(): void;\n}\n\nexport class MenuGroupController {\n readonly #host: MenuGroupHost;\n readonly #provider: ContextProvider<typeof menuGroupContext, MenuGroupHost>;\n readonly #contextValue = {\n registerLabel: (id: string) => this.#registerLabel(id),\n };\n\n #labelId: string | undefined;\n #appliedLabelId: string | undefined;\n\n constructor(host: MenuGroupHost) {\n this.#host = host;\n this.#provider = new ContextProvider(host, {\n context: menuGroupContext,\n initialValue: this.#contextValue,\n });\n }\n\n applyProps(): void {\n const currentLabelledBy = this.#host.getAttribute('aria-labelledby') ?? undefined;\n const hasExplicitLabelledBy = currentLabelledBy !== undefined && currentLabelledBy !== this.#appliedLabelId;\n const hasExplicitLabel = this.#host.hasAttribute('aria-label') || hasExplicitLabelledBy;\n\n if (hasExplicitLabel) {\n if (this.#appliedLabelId && currentLabelledBy === this.#appliedLabelId) {\n this.#host.removeAttribute('aria-labelledby');\n }\n\n this.#appliedLabelId = undefined;\n applyElementProps(this.#host, { role: 'group' });\n return;\n }\n\n this.#appliedLabelId = this.#labelId;\n applyElementProps(this.#host, {\n role: 'group',\n 'aria-labelledby': this.#labelId,\n });\n }\n\n #registerLabel(id: string): () => void {\n this.#labelId = id;\n this.#provider.setValue(this.#contextValue);\n this.#host.requestUpdate();\n\n return () => {\n if (this.#labelId !== id) return;\n\n this.#labelId = undefined;\n this.#host.requestUpdate();\n };\n }\n}\n"],"mappings":";;;;AAUA,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA,gBAAyB,EACvB,gBAAgB,OAAe,KAAKG,eAAe,EAAE,EACvD;CAEA;CACA;CAEA,YAAY,MAAqB;EAC/B,KAAKH,QAAQ;EACb,KAAKC,YAAY,IAAI,gBAAgB,MAAM;GACzC,SAAS;GACT,cAAc,KAAKC;EACrB,CAAC;CACH;CAEA,aAAmB;EACjB,MAAM,oBAAoB,KAAKF,MAAM,aAAa,iBAAiB,KAAK,KAAA;EACxE,MAAM,wBAAwB,sBAAsB,KAAA,KAAa,sBAAsB,KAAKI;EAG5F,IAFyB,KAAKJ,MAAM,aAAa,YAAY,KAAK,uBAE5C;GACpB,IAAI,KAAKI,mBAAmB,sBAAsB,KAAKA,iBACrD,KAAKJ,MAAM,gBAAgB,iBAAiB;GAG9C,KAAKI,kBAAkB,KAAA;GACvB,kBAAkB,KAAKJ,OAAO,EAAE,MAAM,QAAQ,CAAC;GAC/C;EACF;EAEA,KAAKI,kBAAkB,KAAKC;EAC5B,kBAAkB,KAAKL,OAAO;GAC5B,MAAM;GACN,mBAAmB,KAAKK;EAC1B,CAAC;CACH;CAEA,eAAe,IAAwB;EACrC,KAAKA,WAAW;EAChB,KAAKJ,UAAU,SAAS,KAAKC,aAAa;EAC1C,KAAKF,MAAM,cAAc;EAEzB,aAAa;GACX,IAAI,KAAKK,aAAa,IAAI;GAE1B,KAAKA,WAAW,KAAA;GAChB,KAAKL,MAAM,cAAc;EAC3B;CACF;AACF"}
1
+ {"version":3,"file":"group-controller.js","names":[],"sources":["../../../../src/ui/menu/group-controller.ts"],"sourcesContent":["import { applyElementProps } from '@videojs/core/dom';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport type { UIElement } from '../ui-element';\nimport { menuGroupContext } from './context';\n\ninterface MenuGroupHost extends UIElement {\n requestUpdate(): void;\n}\n\nexport class MenuGroupController {\n readonly #host: MenuGroupHost;\n readonly #provider: ContextProvider<typeof menuGroupContext, MenuGroupHost>;\n readonly #contextValue = {\n registerLabel: (id: string) => this.#registerLabel(id),\n };\n\n #labelId: string | undefined;\n #appliedLabelId: string | undefined;\n\n constructor(host: MenuGroupHost) {\n this.#host = host;\n this.#provider = new ContextProvider(host, {\n context: menuGroupContext,\n initialValue: this.#contextValue,\n });\n }\n\n applyProps(): void {\n const currentLabelledBy = this.#host.getAttribute('aria-labelledby') ?? undefined;\n const hasExplicitLabelledBy = currentLabelledBy !== undefined && currentLabelledBy !== this.#appliedLabelId;\n const hasExplicitLabel = this.#host.hasAttribute('aria-label') || hasExplicitLabelledBy;\n\n if (hasExplicitLabel) {\n if (this.#appliedLabelId && currentLabelledBy === this.#appliedLabelId) {\n this.#host.removeAttribute('aria-labelledby');\n }\n\n this.#appliedLabelId = undefined;\n applyElementProps(this.#host, { role: 'group' });\n return;\n }\n\n this.#appliedLabelId = this.#labelId;\n applyElementProps(this.#host, {\n role: 'group',\n 'aria-labelledby': this.#labelId,\n });\n }\n\n #registerLabel(id: string): () => void {\n this.#labelId = id;\n this.#provider.setValue(this.#contextValue);\n this.#host.requestUpdate();\n\n return () => {\n if (this.#labelId !== id) return;\n\n this.#labelId = undefined;\n this.#host.requestUpdate();\n };\n }\n}\n"],"mappings":";;;;AAUA,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA,gBAAyB,EACvB,gBAAgB,OAAe,KAAK,eAAe,EAAE,EACvD;CAEA;CACA;CAEA,YAAY,MAAqB;EAC/B,KAAK,QAAQ;EACb,KAAK,YAAY,IAAI,gBAAgB,MAAM;GACzC,SAAS;GACT,cAAc,KAAK;EACrB,CAAC;CACH;CAEA,aAAmB;EACjB,MAAM,oBAAoB,KAAK,MAAM,aAAa,iBAAiB,KAAK,KAAA;EACxE,MAAM,wBAAwB,sBAAsB,KAAA,KAAa,sBAAsB,KAAK;EAG5F,IAFyB,KAAK,MAAM,aAAa,YAAY,KAAK,uBAE5C;GACpB,IAAI,KAAK,mBAAmB,sBAAsB,KAAK,iBACrD,KAAK,MAAM,gBAAgB,iBAAiB;GAG9C,KAAK,kBAAkB,KAAA;GACvB,kBAAkB,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;GAC/C;EACF;EAEA,KAAK,kBAAkB,KAAK;EAC5B,kBAAkB,KAAK,OAAO;GAC5B,MAAM;GACN,mBAAmB,KAAK;EAC1B,CAAC;CACH;CAEA,eAAe,IAAwB;EACrC,KAAK,WAAW;EAChB,KAAK,UAAU,SAAS,KAAK,aAAa;EAC1C,KAAK,MAAM,cAAc;EAEzB,aAAa;GACX,IAAI,KAAK,aAAa,IAAI;GAE1B,KAAK,WAAW,KAAA;GAChB,KAAK,MAAM,cAAc;EAC3B;CACF;AACF"}
@@ -2,12 +2,11 @@ import { UIElement } from "../ui-element.js";
2
2
  import { PropertyValues } from "@videojs/element";
3
3
  //#region src/ui/menu/group-label.d.ts
4
4
  /** Non-interactive label that names its enclosing `<media-menu-group>` or `<media-menu-radio-group>`. */
5
- declare class MenuGroupLabelElement extends UIElement {
5
+ export declare class MenuGroupLabelElement extends UIElement {
6
6
  #private;
7
7
  static readonly tagName = "media-menu-group-label";
8
8
  disconnectedCallback(): void;
9
9
  protected update(_changed: PropertyValues): void;
10
10
  }
11
11
  //#endregion
12
- export { MenuGroupLabelElement };
13
12
  //# sourceMappingURL=group-label.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-label.js","names":["#groupCtx","#generatedId","#cleanupRegistration","#registeredId","#registerLabel"],"sources":["../../../../src/ui/menu/group-label.ts"],"sourcesContent":["import type { PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuGroupContext } from './context';\n\nlet idCounter = 0;\n\n/** Non-interactive label that names its enclosing `<media-menu-group>` or `<media-menu-radio-group>`. */\nexport class MenuGroupLabelElement extends UIElement {\n static readonly tagName = 'media-menu-group-label';\n\n readonly #groupCtx = new ContextConsumer(this, { context: menuGroupContext, subscribe: true });\n readonly #generatedId = `vjs-menu-group-label-${idCounter++}`;\n\n #cleanupRegistration: (() => void) | null = null;\n #registeredId: string | null = null;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredId = null;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.id) {\n this.id = this.#generatedId;\n }\n\n this.#registerLabel();\n }\n\n #registerLabel(): void {\n const groupCtx = this.#groupCtx.value;\n\n if (!groupCtx) {\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredId = null;\n return;\n }\n\n if (this.#registeredId === this.id) return;\n\n this.#cleanupRegistration?.();\n this.#registeredId = this.id;\n this.#cleanupRegistration = groupCtx.registerLabel(this.id);\n }\n}\n"],"mappings":";;;;AAMA,IAAI,YAAY;;AAGhB,IAAa,wBAAb,cAA2C,UAAU;;EACzB,KAAA,UAAA;;CAE1B,YAAqB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAkB,WAAW;CAAK,CAAC;CAC7F,eAAwB,wBAAwB;CAEhD,uBAA4C;CAC5C,gBAA+B;CAE/B,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKE,uBAAuB;EAC5B,KAAKA,uBAAuB;EAC5B,KAAKC,gBAAgB;CACvB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,IAAI,CAAC,KAAK,IACR,KAAK,KAAK,KAAKF;EAGjB,KAAKG,eAAe;CACtB;CAEA,iBAAuB;EACrB,MAAM,WAAW,KAAKJ,UAAU;EAEhC,IAAI,CAAC,UAAU;GACb,KAAKE,uBAAuB;GAC5B,KAAKA,uBAAuB;GAC5B,KAAKC,gBAAgB;GACrB;EACF;EAEA,IAAI,KAAKA,kBAAkB,KAAK,IAAI;EAEpC,KAAKD,uBAAuB;EAC5B,KAAKC,gBAAgB,KAAK;EAC1B,KAAKD,uBAAuB,SAAS,cAAc,KAAK,EAAE;CAC5D;AACF"}
1
+ {"version":3,"file":"group-label.js","names":[],"sources":["../../../../src/ui/menu/group-label.ts"],"sourcesContent":["import type { PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuGroupContext } from './context';\n\nlet idCounter = 0;\n\n/** Non-interactive label that names its enclosing `<media-menu-group>` or `<media-menu-radio-group>`. */\nexport class MenuGroupLabelElement extends UIElement {\n static readonly tagName = 'media-menu-group-label';\n\n readonly #groupCtx = new ContextConsumer(this, { context: menuGroupContext, subscribe: true });\n readonly #generatedId = `vjs-menu-group-label-${idCounter++}`;\n\n #cleanupRegistration: (() => void) | null = null;\n #registeredId: string | null = null;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredId = null;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.id) {\n this.id = this.#generatedId;\n }\n\n this.#registerLabel();\n }\n\n #registerLabel(): void {\n const groupCtx = this.#groupCtx.value;\n\n if (!groupCtx) {\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredId = null;\n return;\n }\n\n if (this.#registeredId === this.id) return;\n\n this.#cleanupRegistration?.();\n this.#registeredId = this.id;\n this.#cleanupRegistration = groupCtx.registerLabel(this.id);\n }\n}\n"],"mappings":";;;;AAMA,IAAI,YAAY;;AAGhB,IAAa,wBAAb,cAA2C,UAAU;;EACzB,KAAA,UAAA;;CAE1B,YAAqB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAkB,WAAW;CAAK,CAAC;CAC7F,eAAwB,wBAAwB;CAEhD,uBAA4C;CAC5C,gBAA+B;CAE/B,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;EAC5B,KAAK,gBAAgB;CACvB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,IAAI,CAAC,KAAK,IACR,KAAK,KAAK,KAAK;EAGjB,KAAK,eAAe;CACtB;CAEA,iBAAuB;EACrB,MAAM,WAAW,KAAK,UAAU;EAEhC,IAAI,CAAC,UAAU;GACb,KAAK,uBAAuB;GAC5B,KAAK,uBAAuB;GAC5B,KAAK,gBAAgB;GACrB;EACF;EAEA,IAAI,KAAK,kBAAkB,KAAK,IAAI;EAEpC,KAAK,uBAAuB;EAC5B,KAAK,gBAAgB,KAAK;EAC1B,KAAK,uBAAuB,SAAS,cAAc,KAAK,EAAE;CAC5D;AACF"}
@@ -5,11 +5,10 @@ import { PropertyValues } from "@videojs/element";
5
5
  * Groups related menu items; the element itself takes `role="group"`. A `<media-menu-group-label>` child names the
6
6
  * group unless it already has an `aria-label` or `aria-labelledby`.
7
7
  */
8
- declare class MenuGroupElement extends UIElement {
8
+ export declare class MenuGroupElement extends UIElement {
9
9
  #private;
10
10
  static readonly tagName = "media-menu-group";
11
11
  protected update(_changed: PropertyValues): void;
12
12
  }
13
13
  //#endregion
14
- export { MenuGroupElement };
15
14
  //# sourceMappingURL=group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"group.js","names":["#group"],"sources":["../../../../src/ui/menu/group.ts"],"sourcesContent":["import type { PropertyValues } from '@videojs/element';\n\nimport { UIElement } from '../ui-element';\nimport { MenuGroupController } from './group-controller';\n\n/**\n * Groups related menu items; the element itself takes `role=\"group\"`. A `<media-menu-group-label>` child names the\n * group unless it already has an `aria-label` or `aria-labelledby`.\n */\nexport class MenuGroupElement extends UIElement {\n static readonly tagName = 'media-menu-group';\n\n readonly #group = new MenuGroupController(this);\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n this.#group.applyProps();\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,mBAAb,cAAsC,UAAU;;EACpB,KAAA,UAAA;;CAE1B,SAAkB,IAAI,oBAAoB,IAAI;CAE9C,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,KAAKA,OAAO,WAAW;CACzB;AACF"}
1
+ {"version":3,"file":"group.js","names":[],"sources":["../../../../src/ui/menu/group.ts"],"sourcesContent":["import type { PropertyValues } from '@videojs/element';\n\nimport { UIElement } from '../ui-element';\nimport { MenuGroupController } from './group-controller';\n\n/**\n * Groups related menu items; the element itself takes `role=\"group\"`. A `<media-menu-group-label>` child names the\n * group unless it already has an `aria-label` or `aria-labelledby`.\n */\nexport class MenuGroupElement extends UIElement {\n static readonly tagName = 'media-menu-group';\n\n readonly #group = new MenuGroupController(this);\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n this.#group.applyProps();\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,mBAAb,cAAsC,UAAU;;EACpB,KAAA,UAAA;;CAE1B,SAAkB,IAAI,oBAAoB,IAAI;CAE9C,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,KAAK,OAAO,WAAW;CACzB;AACF"}
@@ -5,7 +5,7 @@ import { PropertyValues } from "@videojs/element";
5
5
  * Decorative checked-state mark inside a menu item, hidden from assistive technology. It stays `hidden` unless
6
6
  * `checked` or `force-mount` is set; option radio groups set `checked` on the indicators in the items they generate.
7
7
  */
8
- declare class MenuItemIndicatorElement extends UIElement {
8
+ export declare class MenuItemIndicatorElement extends UIElement {
9
9
  static readonly tagName = "media-menu-item-indicator";
10
10
  static properties: {
11
11
  checked: {
@@ -21,5 +21,4 @@ declare class MenuItemIndicatorElement extends UIElement {
21
21
  protected update(_changed: PropertyValues): void;
22
22
  }
23
23
  //#endregion
24
- export { MenuItemIndicatorElement };
25
24
  //# sourceMappingURL=item-indicator.d.ts.map
@@ -5,7 +5,7 @@ import { PropertyValues } from "@videojs/element";
5
5
  * Menu action; the element itself takes `role="menuitem"`. Activation fires a cancelable `select` event and then closes
6
6
  * the menu, unless `commandfor` names a nested `<media-menu-content>` page to open instead.
7
7
  */
8
- declare class MenuItemElement extends UIElement {
8
+ export declare class MenuItemElement extends UIElement {
9
9
  #private;
10
10
  static readonly tagName = "media-menu-item";
11
11
  static properties: {
@@ -24,5 +24,4 @@ declare class MenuItemElement extends UIElement {
24
24
  protected update(_changed: PropertyValues): void;
25
25
  }
26
26
  //#endregion
27
- export { MenuItemElement };
28
27
  //# sourceMappingURL=item.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"item.js","names":["#ctx","#disconnect","#cleanupRegistration","#registeredMenu","#isDisabled","#openSubmenu"],"sources":["../../../../src/ui/menu/item.ts"],"sourcesContent":["import { applyElementProps, completeMenuItemSelection } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { type MenuContextValue, menuContext } from './context';\n\n/**\n * Menu action; the element itself takes `role=\"menuitem\"`. Activation fires a cancelable `select` event and then closes\n * the menu, unless `commandfor` names a nested `<media-menu-content>` page to open instead.\n */\nexport class MenuItemElement extends UIElement {\n static readonly tagName = 'media-menu-item';\n\n static override properties = {\n disabled: { type: Boolean },\n commandfor: { type: String },\n } satisfies PropertyDeclarationMap<'disabled' | 'commandfor'>;\n\n disabled = false;\n /** ID of a nested `<media-menu-content>` page to open when activated. */\n commandfor: string | undefined = undefined;\n readonly #ctx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registeredMenu: MenuContextValue['menu'] | null = null;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredMenu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx || !this.#disconnect) return;\n\n if (this.#registeredMenu !== ctx.menu) {\n this.#cleanupRegistration?.();\n this.#registeredMenu = ctx.menu;\n this.#cleanupRegistration = ctx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: (event: MouseEvent) => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.#isDisabled()) return;\n\n const target = this.commandfor;\n\n if (target) {\n this.#openSubmenu(target);\n } else {\n const select = new CustomEvent('select', { bubbles: true, cancelable: true });\n\n if (!this.dispatchEvent(select)) {\n event.preventDefault();\n return;\n }\n\n completeMenuItemSelection(currentCtx.menu);\n }\n\n event.preventDefault();\n },\n onKeyDown: (event: KeyboardEvent) => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.#isDisabled() || event.key !== 'ArrowRight') return;\n\n const target = this.commandfor;\n if (!target) return;\n\n this.#openSubmenu(target);\n event.preventDefault();\n },\n onPointerenter: () => {\n const currentCtx = this.#ctx.value;\n\n if (!this.#isDisabled()) currentCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n const hasSubmenu = Boolean(this.commandfor);\n\n applyElementProps(this, {\n role: 'menuitem',\n 'aria-disabled': this.#isDisabled() ? 'true' : undefined,\n ...(hasSubmenu && {\n 'aria-haspopup': 'menu',\n 'aria-expanded': 'false',\n 'data-has-submenu': '',\n }),\n });\n }\n\n #openSubmenu(id: string): void {\n const root = this.getRootNode() as Document | ShadowRoot;\n const submenu = root.querySelector<HTMLElement>(`#${CSS.escape(id)}`) as HTMLElement & {\n openMenu?: (reason?: 'click') => void;\n };\n\n submenu?.openMenu?.('click');\n }\n\n #isDisabled(): boolean {\n return this.disabled || this.getAttribute('aria-disabled') === 'true';\n }\n}\n"],"mappings":";;;;;;;;;AAWA,IAAa,kBAAb,cAAqC,UAAU;;;EAQlC,KAAA,WAAA;EAEsB,KAAA,aAAA,KAAA;EACjB,KAAA,OAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAE7C,KAAA,cAAA;EACa,KAAA,kBAAA;EACP,KAAA,uBAAA;;;EAdlB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,UAAU,EAAE,MAAM,QAAQ;GAC1B,YAAY,EAAE,MAAM,OAAO;EAC7B;;CAKA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAKC,cAAc,IAAI,gBAAgB;CACzC;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKC,uBAAuB;EAC5B,KAAKA,uBAAuB;EAC5B,KAAKC,kBAAkB;EACvB,KAAKF,aAAa,MAAM;EACxB,KAAKA,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,MAAM,KAAKD,KAAK;EACtB,IAAI,CAAC,OAAO,CAAC,KAAKC,aAAa;EAE/B,IAAI,KAAKE,oBAAoB,IAAI,MAAM;GACrC,KAAKD,uBAAuB;GAC5B,KAAKC,kBAAkB,IAAI;GAC3B,KAAKD,uBAAuB,IAAI,KAAK,aAAa,IAAI;GAEtD,kBACE,MACA;IACE,UAAU,UAAsB;KAC9B,MAAM,aAAa,KAAKF,KAAK;KAC7B,IAAI,CAAC,cAAc,KAAKI,YAAY,GAAG;KAEvC,MAAM,SAAS,KAAK;KAEpB,IAAI,QACF,KAAKC,aAAa,MAAM;UACnB;MACL,MAAM,SAAS,IAAI,YAAY,UAAU;OAAE,SAAS;OAAM,YAAY;MAAK,CAAC;MAE5E,IAAI,CAAC,KAAK,cAAc,MAAM,GAAG;OAC/B,MAAM,eAAe;OACrB;MACF;MAEA,0BAA0B,WAAW,IAAI;KAC3C;KAEA,MAAM,eAAe;IACvB;IACA,YAAY,UAAyB;KAEnC,IAAI,CADe,KAAKL,KAAK,SACV,KAAKI,YAAY,KAAK,MAAM,QAAQ,cAAc;KAErE,MAAM,SAAS,KAAK;KACpB,IAAI,CAAC,QAAQ;KAEb,KAAKC,aAAa,MAAM;KACxB,MAAM,eAAe;IACvB;IACA,sBAAsB;KACpB,MAAM,aAAa,KAAKL,KAAK;KAE7B,IAAI,CAAC,KAAKI,YAAY,GAAG,YAAY,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IAC3F;GACF,GACA,EAAE,QAAQ,KAAKH,YAAY,OAAO,CACpC;EACF;EAEA,MAAM,aAAa,QAAQ,KAAK,UAAU;EAE1C,kBAAkB,MAAM;GACtB,MAAM;GACN,iBAAiB,KAAKG,YAAY,IAAI,SAAS,KAAA;GAC/C,GAAI,cAAc;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;GACtB;EACF,CAAC;CACH;CAEA,aAAa,IAAkB;EAM7B,KALkB,YACC,CAAC,CAAC,cAA2B,IAAI,IAAI,OAAO,EAAE,GAI3D,CAAC,EAAE,WAAW,OAAO;CAC7B;CAEA,cAAuB;EACrB,OAAO,KAAK,YAAY,KAAK,aAAa,eAAe,MAAM;CACjE;AACF"}
1
+ {"version":3,"file":"item.js","names":[],"sources":["../../../../src/ui/menu/item.ts"],"sourcesContent":["import { applyElementProps, completeMenuItemSelection } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { type MenuContextValue, menuContext } from './context';\n\n/**\n * Menu action; the element itself takes `role=\"menuitem\"`. Activation fires a cancelable `select` event and then closes\n * the menu, unless `commandfor` names a nested `<media-menu-content>` page to open instead.\n */\nexport class MenuItemElement extends UIElement {\n static readonly tagName = 'media-menu-item';\n\n static override properties = {\n disabled: { type: Boolean },\n commandfor: { type: String },\n } satisfies PropertyDeclarationMap<'disabled' | 'commandfor'>;\n\n disabled = false;\n /** ID of a nested `<media-menu-content>` page to open when activated. */\n commandfor: string | undefined = undefined;\n readonly #ctx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registeredMenu: MenuContextValue['menu'] | null = null;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#registeredMenu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx || !this.#disconnect) return;\n\n if (this.#registeredMenu !== ctx.menu) {\n this.#cleanupRegistration?.();\n this.#registeredMenu = ctx.menu;\n this.#cleanupRegistration = ctx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: (event: MouseEvent) => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.#isDisabled()) return;\n\n const target = this.commandfor;\n\n if (target) {\n this.#openSubmenu(target);\n } else {\n const select = new CustomEvent('select', { bubbles: true, cancelable: true });\n\n if (!this.dispatchEvent(select)) {\n event.preventDefault();\n return;\n }\n\n completeMenuItemSelection(currentCtx.menu);\n }\n\n event.preventDefault();\n },\n onKeyDown: (event: KeyboardEvent) => {\n const currentCtx = this.#ctx.value;\n if (!currentCtx || this.#isDisabled() || event.key !== 'ArrowRight') return;\n\n const target = this.commandfor;\n if (!target) return;\n\n this.#openSubmenu(target);\n event.preventDefault();\n },\n onPointerenter: () => {\n const currentCtx = this.#ctx.value;\n\n if (!this.#isDisabled()) currentCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n const hasSubmenu = Boolean(this.commandfor);\n\n applyElementProps(this, {\n role: 'menuitem',\n 'aria-disabled': this.#isDisabled() ? 'true' : undefined,\n ...(hasSubmenu && {\n 'aria-haspopup': 'menu',\n 'aria-expanded': 'false',\n 'data-has-submenu': '',\n }),\n });\n }\n\n #openSubmenu(id: string): void {\n const root = this.getRootNode() as Document | ShadowRoot;\n const submenu = root.querySelector<HTMLElement>(`#${CSS.escape(id)}`) as HTMLElement & {\n openMenu?: (reason?: 'click') => void;\n };\n\n submenu?.openMenu?.('click');\n }\n\n #isDisabled(): boolean {\n return this.disabled || this.getAttribute('aria-disabled') === 'true';\n }\n}\n"],"mappings":";;;;;;;;;AAWA,IAAa,kBAAb,cAAqC,UAAU;;;EAQlC,KAAA,WAAA;EAEsB,KAAA,aAAA,KAAA;EACjB,KAAA,OAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAE7C,KAAA,cAAA;EACa,KAAA,kBAAA;EACP,KAAA,uBAAA;;;EAdlB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,UAAU,EAAE,MAAM,QAAQ;GAC1B,YAAY,EAAE,MAAM,OAAO;EAC7B;;CAKA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,cAAc,IAAI,gBAAgB;CACzC;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;EAC5B,KAAK,kBAAkB;EACvB,KAAK,aAAa,MAAM;EACxB,KAAK,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,CAAC,OAAO,CAAC,KAAK,aAAa;EAE/B,IAAI,KAAK,oBAAoB,IAAI,MAAM;GACrC,KAAK,uBAAuB;GAC5B,KAAK,kBAAkB,IAAI;GAC3B,KAAK,uBAAuB,IAAI,KAAK,aAAa,IAAI;GAEtD,kBACE,MACA;IACE,UAAU,UAAsB;KAC9B,MAAM,aAAa,KAAK,KAAK;KAC7B,IAAI,CAAC,cAAc,KAAK,YAAY,GAAG;KAEvC,MAAM,SAAS,KAAK;KAEpB,IAAI,QACF,KAAK,aAAa,MAAM;UACnB;MACL,MAAM,SAAS,IAAI,YAAY,UAAU;OAAE,SAAS;OAAM,YAAY;MAAK,CAAC;MAE5E,IAAI,CAAC,KAAK,cAAc,MAAM,GAAG;OAC/B,MAAM,eAAe;OACrB;MACF;MAEA,0BAA0B,WAAW,IAAI;KAC3C;KAEA,MAAM,eAAe;IACvB;IACA,YAAY,UAAyB;KAEnC,IAAI,CADe,KAAK,KAAK,SACV,KAAK,YAAY,KAAK,MAAM,QAAQ,cAAc;KAErE,MAAM,SAAS,KAAK;KACpB,IAAI,CAAC,QAAQ;KAEb,KAAK,aAAa,MAAM;KACxB,MAAM,eAAe;IACvB;IACA,sBAAsB;KACpB,MAAM,aAAa,KAAK,KAAK;KAE7B,IAAI,CAAC,KAAK,YAAY,GAAG,YAAY,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IAC3F;GACF,GACA,EAAE,QAAQ,KAAK,YAAY,OAAO,CACpC;EACF;EAEA,MAAM,aAAa,QAAQ,KAAK,UAAU;EAE1C,kBAAkB,MAAM;GACtB,MAAM;GACN,iBAAiB,KAAK,YAAY,IAAI,SAAS,KAAA;GAC/C,GAAI,cAAc;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;GACtB;EACF,CAAC;CACH;CAEA,aAAa,IAAkB;EAM7B,KALkB,YACC,CAAC,CAAC,cAA2B,IAAI,IAAI,OAAO,EAAE,GAI3D,CAAC,EAAE,WAAW,OAAO;CAC7B;CAEA,cAAuB;EACrB,OAAO,KAAK,YAAY,KAAK,aAAa,eAAe,MAAM;CACjE;AACF"}
@@ -4,7 +4,7 @@ import { MenuOptionState } from "@videojs/core";
4
4
  import { PropertyValues } from "@videojs/element";
5
5
  //#region src/ui/menu/radio-group.d.ts
6
6
  /** Group of mutually exclusive `<media-menu-radio-item>` children; the element itself takes `role="group"`. */
7
- declare class MenuRadioGroupElement extends RadioGroupElement {
7
+ export declare class MenuRadioGroupElement extends RadioGroupElement {
8
8
  #private;
9
9
  static readonly tagName: string;
10
10
  disconnectedCallback(): void;
@@ -15,5 +15,4 @@ declare class MenuRadioGroupElement extends RadioGroupElement {
15
15
  protected publishMenuOptionState(disabled: boolean, hidden: boolean, availability: MenuOptionState['availability']): void;
16
16
  }
17
17
  //#endregion
18
- export { MenuRadioGroupElement };
19
18
  //# sourceMappingURL=radio-group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"radio-group.js","names":["#group","#menu","#optionSource","#clearMenuOptionState","#ariaLabel","#optionMenu","#setOptionState"],"sources":["../../../../src/ui/menu/radio-group.ts"],"sourcesContent":["import type { MenuOptionState } from '@videojs/core';\nimport type { PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { findElementChild } from '@videojs/utils/dom';\n\nimport { RadioGroupElement } from '../radio-group/element';\nimport { type MenuContextValue, menuContext } from './context';\nimport { MenuGroupController } from './group-controller';\nimport { MenuRadioItemElement } from './radio-item';\n\n/** Group of mutually exclusive `<media-menu-radio-item>` children; the element itself takes `role=\"group\"`. */\nexport class MenuRadioGroupElement extends RadioGroupElement {\n static readonly tagName: string = 'media-menu-radio-group';\n\n readonly #group = new MenuGroupController(this);\n readonly #menu = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #optionSource = Symbol('menu-option');\n #ariaLabel: string | null = null;\n #optionMenu: MenuContextValue['menu'] | null = null;\n #setOptionState: MenuContextValue['setOptionState'] | null = null;\n\n override disconnectedCallback(): void {\n this.#clearMenuOptionState();\n super.disconnectedCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n this.#group.applyProps();\n }\n\n protected setItemLabel(item: MenuRadioItemElement, label: string): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n } else {\n item.textContent = label;\n }\n }\n\n /** Applies a generated fallback without replacing an author-provided accessible name. */\n protected applyDefaultAriaLabel(label: string): void {\n if (this.hasAttribute('aria-labelledby')) return;\n\n const current = this.getAttribute('aria-label');\n if (current !== null && current !== this.#ariaLabel) return;\n\n this.#ariaLabel = label;\n this.setAttribute('aria-label', label);\n }\n\n protected publishMenuOptionState(\n disabled: boolean,\n hidden: boolean,\n availability: MenuOptionState['availability']\n ): void {\n const context = this.#menu.value ?? null;\n\n if (context?.menu !== this.#optionMenu) {\n this.#clearMenuOptionState();\n this.#optionMenu = context?.menu ?? null;\n this.#setOptionState = context?.setOptionState ?? null;\n }\n\n if (!this.#setOptionState) return;\n\n const selectedItem = findElementChild(\n this,\n (item): item is MenuRadioItemElement => item instanceof MenuRadioItemElement && item.value === this.value\n );\n const label = selectedItem?.querySelector<HTMLElement>('[data-part~=\"label\"]')?.textContent;\n const value = label ?? selectedItem?.textContent?.trim() ?? '';\n\n this.#setOptionState(this.#optionSource, { value, disabled, hidden, availability });\n }\n\n #clearMenuOptionState(): void {\n this.#setOptionState?.(this.#optionSource, null);\n this.#optionMenu = null;\n this.#setOptionState = null;\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,wBAAb,cAA2C,kBAAkB;;EACzB,KAAA,UAAA;;CAElC,SAAkB,IAAI,oBAAoB,IAAI;CAC9C,QAAiB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAa,WAAW;CAAK,CAAC;CACpF,gBAAyB,OAAO,aAAa;CAC7C,aAA4B;CAC5B,cAA+C;CAC/C,kBAA6D;CAE7D,uBAAsC;EACpC,KAAKG,sBAAsB;EAC3B,MAAM,qBAAqB;CAC7B;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,KAAKH,OAAO,WAAW;CACzB;CAEA,aAAuB,MAA4B,OAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;OAExB,KAAK,cAAc;CAEvB;;CAGA,sBAAgC,OAAqB;EACnD,IAAI,KAAK,aAAa,iBAAiB,GAAG;EAE1C,MAAM,UAAU,KAAK,aAAa,YAAY;EAC9C,IAAI,YAAY,QAAQ,YAAY,KAAKI,YAAY;EAErD,KAAKA,aAAa;EAClB,KAAK,aAAa,cAAc,KAAK;CACvC;CAEA,uBACE,UACA,QACA,cACM;EACN,MAAM,UAAU,KAAKH,MAAM,SAAS;EAEpC,IAAI,SAAS,SAAS,KAAKI,aAAa;GACtC,KAAKF,sBAAsB;GAC3B,KAAKE,cAAc,SAAS,QAAQ;GACpC,KAAKC,kBAAkB,SAAS,kBAAkB;EACpD;EAEA,IAAI,CAAC,KAAKA,iBAAiB;EAE3B,MAAM,eAAe,iBACnB,OACC,SAAuC,gBAAgB,wBAAwB,KAAK,UAAU,KAAK,KACtG;EAEA,MAAM,QADQ,cAAc,cAA2B,wBAAsB,CAAC,EAAE,eACzD,cAAc,aAAa,KAAK,KAAK;EAE5D,KAAKA,gBAAgB,KAAKJ,eAAe;GAAE;GAAO;GAAU;GAAQ;EAAa,CAAC;CACpF;CAEA,wBAA8B;EAC5B,KAAKI,kBAAkB,KAAKJ,eAAe,IAAI;EAC/C,KAAKG,cAAc;EACnB,KAAKC,kBAAkB;CACzB;AACF"}
1
+ {"version":3,"file":"radio-group.js","names":[],"sources":["../../../../src/ui/menu/radio-group.ts"],"sourcesContent":["import type { MenuOptionState } from '@videojs/core';\nimport type { PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { findElementChild } from '@videojs/utils/dom';\n\nimport { RadioGroupElement } from '../radio-group/element';\nimport { type MenuContextValue, menuContext } from './context';\nimport { MenuGroupController } from './group-controller';\nimport { MenuRadioItemElement } from './radio-item';\n\n/** Group of mutually exclusive `<media-menu-radio-item>` children; the element itself takes `role=\"group\"`. */\nexport class MenuRadioGroupElement extends RadioGroupElement {\n static readonly tagName: string = 'media-menu-radio-group';\n\n readonly #group = new MenuGroupController(this);\n readonly #menu = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #optionSource = Symbol('menu-option');\n #ariaLabel: string | null = null;\n #optionMenu: MenuContextValue['menu'] | null = null;\n #setOptionState: MenuContextValue['setOptionState'] | null = null;\n\n override disconnectedCallback(): void {\n this.#clearMenuOptionState();\n super.disconnectedCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n this.#group.applyProps();\n }\n\n protected setItemLabel(item: MenuRadioItemElement, label: string): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n } else {\n item.textContent = label;\n }\n }\n\n /** Applies a generated fallback without replacing an author-provided accessible name. */\n protected applyDefaultAriaLabel(label: string): void {\n if (this.hasAttribute('aria-labelledby')) return;\n\n const current = this.getAttribute('aria-label');\n if (current !== null && current !== this.#ariaLabel) return;\n\n this.#ariaLabel = label;\n this.setAttribute('aria-label', label);\n }\n\n protected publishMenuOptionState(\n disabled: boolean,\n hidden: boolean,\n availability: MenuOptionState['availability']\n ): void {\n const context = this.#menu.value ?? null;\n\n if (context?.menu !== this.#optionMenu) {\n this.#clearMenuOptionState();\n this.#optionMenu = context?.menu ?? null;\n this.#setOptionState = context?.setOptionState ?? null;\n }\n\n if (!this.#setOptionState) return;\n\n const selectedItem = findElementChild(\n this,\n (item): item is MenuRadioItemElement => item instanceof MenuRadioItemElement && item.value === this.value\n );\n const label = selectedItem?.querySelector<HTMLElement>('[data-part~=\"label\"]')?.textContent;\n const value = label ?? selectedItem?.textContent?.trim() ?? '';\n\n this.#setOptionState(this.#optionSource, { value, disabled, hidden, availability });\n }\n\n #clearMenuOptionState(): void {\n this.#setOptionState?.(this.#optionSource, null);\n this.#optionMenu = null;\n this.#setOptionState = null;\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,wBAAb,cAA2C,kBAAkB;;EACzB,KAAA,UAAA;;CAElC,SAAkB,IAAI,oBAAoB,IAAI;CAC9C,QAAiB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAa,WAAW;CAAK,CAAC;CACpF,gBAAyB,OAAO,aAAa;CAC7C,aAA4B;CAC5B,cAA+C;CAC/C,kBAA6D;CAE7D,uBAAsC;EACpC,KAAK,sBAAsB;EAC3B,MAAM,qBAAqB;CAC7B;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,KAAK,OAAO,WAAW;CACzB;CAEA,aAAuB,MAA4B,OAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;OAExB,KAAK,cAAc;CAEvB;;CAGA,sBAAgC,OAAqB;EACnD,IAAI,KAAK,aAAa,iBAAiB,GAAG;EAE1C,MAAM,UAAU,KAAK,aAAa,YAAY;EAC9C,IAAI,YAAY,QAAQ,YAAY,KAAK,YAAY;EAErD,KAAK,aAAa;EAClB,KAAK,aAAa,cAAc,KAAK;CACvC;CAEA,uBACE,UACA,QACA,cACM;EACN,MAAM,UAAU,KAAK,MAAM,SAAS;EAEpC,IAAI,SAAS,SAAS,KAAK,aAAa;GACtC,KAAK,sBAAsB;GAC3B,KAAK,cAAc,SAAS,QAAQ;GACpC,KAAK,kBAAkB,SAAS,kBAAkB;EACpD;EAEA,IAAI,CAAC,KAAK,iBAAiB;EAE3B,MAAM,eAAe,iBACnB,OACC,SAAuC,gBAAgB,wBAAwB,KAAK,UAAU,KAAK,KACtG;EAEA,MAAM,QADQ,cAAc,cAA2B,wBAAsB,CAAC,EAAE,eACzD,cAAc,aAAa,KAAK,KAAK;EAE5D,KAAK,gBAAgB,KAAK,eAAe;GAAE;GAAO;GAAU;GAAQ;EAAa,CAAC;CACpF;CAEA,wBAA8B;EAC5B,KAAK,kBAAkB,KAAK,eAAe,IAAI;EAC/C,KAAK,cAAc;EACnB,KAAK,kBAAkB;CACzB;AACF"}
@@ -5,7 +5,7 @@ import { PropertyValues } from "@videojs/element";
5
5
  * Menu item that selects its `value` in the enclosing `<media-menu-radio-group>` and closes the menu. The element
6
6
  * itself takes `role="menuitemradio"`, checked while its value matches the group's.
7
7
  */
8
- declare class MenuRadioItemElement extends UIElement {
8
+ export declare class MenuRadioItemElement extends UIElement {
9
9
  #private;
10
10
  static readonly tagName = "media-menu-radio-item";
11
11
  static properties: {
@@ -23,5 +23,4 @@ declare class MenuRadioItemElement extends UIElement {
23
23
  protected update(_changed: PropertyValues): void;
24
24
  }
25
25
  //#endregion
26
- export { MenuRadioItemElement };
27
26
  //# sourceMappingURL=radio-item.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"radio-item.js","names":["menuRadioGroupContext","#menuCtx","#groupCtx","#disconnect","#registered","#cleanupRegistration"],"sources":["../../../../src/ui/menu/radio-item.ts"],"sourcesContent":["import { applyElementProps, completeMenuItemSelection } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuContext, menuRadioGroupContext } from './context';\n\n/**\n * Menu item that selects its `value` in the enclosing `<media-menu-radio-group>` and closes the menu. The element\n * itself takes `role=\"menuitemradio\"`, checked while its value matches the group's.\n */\nexport class MenuRadioItemElement extends UIElement {\n static readonly tagName = 'media-menu-radio-item';\n\n static override properties = {\n value: { type: String },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n value = '';\n disabled = false;\n\n readonly #menuCtx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #groupCtx = new ContextConsumer(this, { context: menuRadioGroupContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registered = false;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n this.#registered = false;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n this.#registered = false;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const menuCtx = this.#menuCtx.value;\n const groupCtx = this.#groupCtx.value;\n if (!menuCtx || !groupCtx || !this.#disconnect) return;\n\n if (!this.#registered) {\n this.#registered = true;\n\n this.#cleanupRegistration = menuCtx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: () => {\n const currentMenuCtx = this.#menuCtx.value;\n const currentGroupCtx = this.#groupCtx.value;\n if (!currentMenuCtx || !currentGroupCtx || this.disabled) return;\n\n currentGroupCtx.onValueChange(this.value);\n completeMenuItemSelection(currentMenuCtx.menu);\n },\n onPointerenter: () => {\n const currentMenuCtx = this.#menuCtx.value;\n\n if (!this.disabled) currentMenuCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n const checked = groupCtx.value === this.value;\n\n applyElementProps(this, {\n role: 'menuitemradio',\n 'aria-checked': String(checked),\n 'aria-disabled': this.disabled ? 'true' : undefined,\n });\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,uBAAb,cAA0C,UAAU;;;EAQ1C,KAAA,QAAA;EACG,KAAA,WAAA;EAES,KAAA,WAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAClE,KAAA,YAAA,IAAI,gBAAgB,MAAM;GAAE,SAASA;GAAuB,WAAW;EAAK,CAAC;EAE5D,KAAA,cAAA;EACxB,KAAA,cAAA;EAC8B,KAAA,uBAAA;;;EAflB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,OAAO,EAAE,MAAM,OAAO;GACtB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CACA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAKG,cAAc,IAAI,gBAAgB;EACvC,KAAKC,cAAc;CACrB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKC,uBAAuB;EAC5B,KAAKA,uBAAuB;EAC5B,KAAKF,aAAa,MAAM;EACxB,KAAKA,cAAc;EACnB,KAAKC,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,UAAU,KAAKH,SAAS;EAC9B,MAAM,WAAW,KAAKC,UAAU;EAChC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAKC,aAAa;EAEhD,IAAI,CAAC,KAAKC,aAAa;GACrB,KAAKA,cAAc;GAEnB,KAAKC,uBAAuB,QAAQ,KAAK,aAAa,IAAI;GAE1D,kBACE,MACA;IACE,eAAe;KACb,MAAM,iBAAiB,KAAKJ,SAAS;KACrC,MAAM,kBAAkB,KAAKC,UAAU;KACvC,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,KAAK,UAAU;KAE1D,gBAAgB,cAAc,KAAK,KAAK;KACxC,0BAA0B,eAAe,IAAI;IAC/C;IACA,sBAAsB;KACpB,MAAM,iBAAiB,KAAKD,SAAS;KAErC,IAAI,CAAC,KAAK,UAAU,gBAAgB,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IAC1F;GACF,GACA,EAAE,QAAQ,KAAKE,YAAY,OAAO,CACpC;EACF;EAEA,MAAM,UAAU,SAAS,UAAU,KAAK;EAExC,kBAAkB,MAAM;GACtB,MAAM;GACN,gBAAgB,OAAO,OAAO;GAC9B,iBAAiB,KAAK,WAAW,SAAS,KAAA;EAC5C,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"radio-item.js","names":["menuRadioGroupContext"],"sources":["../../../../src/ui/menu/radio-item.ts"],"sourcesContent":["import { applyElementProps, completeMenuItemSelection } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { UIElement } from '../ui-element';\nimport { menuContext, menuRadioGroupContext } from './context';\n\n/**\n * Menu item that selects its `value` in the enclosing `<media-menu-radio-group>` and closes the menu. The element\n * itself takes `role=\"menuitemradio\"`, checked while its value matches the group's.\n */\nexport class MenuRadioItemElement extends UIElement {\n static readonly tagName = 'media-menu-radio-item';\n\n static override properties = {\n value: { type: String },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n value = '';\n disabled = false;\n\n readonly #menuCtx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n readonly #groupCtx = new ContextConsumer(this, { context: menuRadioGroupContext, subscribe: true });\n\n #disconnect: AbortController | null = null;\n #registered = false;\n #cleanupRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n this.#registered = false;\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupRegistration?.();\n this.#cleanupRegistration = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n this.#registered = false;\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const menuCtx = this.#menuCtx.value;\n const groupCtx = this.#groupCtx.value;\n if (!menuCtx || !groupCtx || !this.#disconnect) return;\n\n if (!this.#registered) {\n this.#registered = true;\n\n this.#cleanupRegistration = menuCtx.menu.registerItem(this);\n\n applyElementProps(\n this,\n {\n onClick: () => {\n const currentMenuCtx = this.#menuCtx.value;\n const currentGroupCtx = this.#groupCtx.value;\n if (!currentMenuCtx || !currentGroupCtx || this.disabled) return;\n\n currentGroupCtx.onValueChange(this.value);\n completeMenuItemSelection(currentMenuCtx.menu);\n },\n onPointerenter: () => {\n const currentMenuCtx = this.#menuCtx.value;\n\n if (!this.disabled) currentMenuCtx?.menu.highlight(this, { focus: false, pointer: true });\n },\n },\n { signal: this.#disconnect.signal }\n );\n }\n\n const checked = groupCtx.value === this.value;\n\n applyElementProps(this, {\n role: 'menuitemradio',\n 'aria-checked': String(checked),\n 'aria-disabled': this.disabled ? 'true' : undefined,\n });\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,uBAAb,cAA0C,UAAU;;;EAQ1C,KAAA,QAAA;EACG,KAAA,WAAA;EAES,KAAA,WAAA,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAa,WAAW;EAAK,CAAC;EAClE,KAAA,YAAA,IAAI,gBAAgB,MAAM;GAAE,SAASA;GAAuB,WAAW;EAAK,CAAC;EAE5D,KAAA,cAAA;EACxB,KAAA,cAAA;EAC8B,KAAA,uBAAA;;;EAflB,KAAA,UAAA;;;EAEG,KAAA,aAAA;GAC3B,OAAO,EAAE,MAAM,OAAO;GACtB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CACA;CAEA;CACA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,cAAc,IAAI,gBAAgB;EACvC,KAAK,cAAc;CACrB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;EAC5B,KAAK,aAAa,MAAM;EACxB,KAAK,cAAc;EACnB,KAAK,cAAc;CACrB;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,UAAU,KAAK,SAAS;EAC9B,MAAM,WAAW,KAAK,UAAU;EAChC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,aAAa;EAEhD,IAAI,CAAC,KAAK,aAAa;GACrB,KAAK,cAAc;GAEnB,KAAK,uBAAuB,QAAQ,KAAK,aAAa,IAAI;GAE1D,kBACE,MACA;IACE,eAAe;KACb,MAAM,iBAAiB,KAAK,SAAS;KACrC,MAAM,kBAAkB,KAAK,UAAU;KACvC,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,KAAK,UAAU;KAE1D,gBAAgB,cAAc,KAAK,KAAK;KACxC,0BAA0B,eAAe,IAAI;IAC/C;IACA,sBAAsB;KACpB,MAAM,iBAAiB,KAAK,SAAS;KAErC,IAAI,CAAC,KAAK,UAAU,gBAAgB,KAAK,UAAU,MAAM;MAAE,OAAO;MAAO,SAAS;KAAK,CAAC;IAC1F;GACF,GACA,EAAE,QAAQ,KAAK,YAAY,OAAO,CACpC;EACF;EAEA,MAAM,UAAU,SAAS,UAAU,KAAK;EAExC,kBAAkB,MAAM;GACtB,MAAM;GACN,gBAAgB,OAAO,OAAO;GAC9B,iBAAiB,KAAK,WAAW,SAAS,KAAA;EAC5C,CAAC;CACH;AACF"}
@@ -2,10 +2,9 @@ import { UIElement } from "../ui-element.js";
2
2
  import { PropertyValues } from "@videojs/element";
3
3
  //#region src/ui/menu/separator.d.ts
4
4
  /** Visual divider between groups of menu items; the element itself takes `role="separator"`. */
5
- declare class MenuSeparatorElement extends UIElement {
5
+ export declare class MenuSeparatorElement extends UIElement {
6
6
  static readonly tagName = "media-menu-separator";
7
7
  protected update(_changed: PropertyValues): void;
8
8
  }
9
9
  //#endregion
10
- export { MenuSeparatorElement };
11
10
  //# sourceMappingURL=separator.d.ts.map
@@ -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 { MuteButtonCore } from "@videojs/core";
4
+ import { MuteButtonCore, MuteButtonState } from "@videojs/core";
5
5
  import { MediaVolumeState } from "@videojs/media";
6
6
  //#region src/ui/mute-button/element.d.ts
7
- declare class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {
7
+ export declare class MuteButtonElement extends MediaButtonElement<MuteButtonState, MediaVolumeState> {
8
8
  static readonly tagName = "media-mute-button";
9
9
  protected readonly core: MuteButtonCore;
10
10
  protected readonly stateAttrMap: {
@@ -19,11 +19,10 @@ declare class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {
19
19
  volumeAvailability: import("@videojs/media").MediaFeatureAvailability;
20
20
  mutedAvailability: import("@videojs/media").MediaFeatureAvailability;
21
21
  setVolume: (volume: number) => number;
22
- toggleMuted: () => boolean;
22
+ setMuted: (muted: boolean) => boolean;
23
23
  } | undefined>;
24
24
  protected readonly hotkeyAction = "toggleMuted";
25
25
  protected activate(state: MediaVolumeState): void;
26
26
  }
27
27
  //#endregion
28
- export { MuteButtonElement };
29
28
  //# sourceMappingURL=element.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/mute-button/element.ts"],"sourcesContent":["import { MuteButtonCore, MuteButtonDataAttrs } from '@videojs/core';\nimport { selectVolume } from '@videojs/core/dom';\nimport type { MediaVolumeState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class MuteButtonElement extends MediaButtonElement<MuteButtonCore> {\n static readonly tagName = 'media-mute-button';\n\n protected readonly core = new MuteButtonCore();\n protected readonly stateAttrMap = MuteButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectVolume);\n protected override readonly hotkeyAction = 'toggleMuted';\n\n protected activate(state: MediaVolumeState): 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,YAAY;EAC3C,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAA+B;EAChD,KAAK,KAAK,OAAO,KAAK;CACxB;AACF"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/mute-button/element.ts"],"sourcesContent":["import { MuteButtonCore, MuteButtonDataAttrs, type MuteButtonState } from '@videojs/core';\nimport { selectVolume } from '@videojs/core/dom';\nimport type { MediaVolumeState } from '@videojs/media';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { MediaButtonElement } from '../media-button-element';\n\nexport class MuteButtonElement extends MediaButtonElement<MuteButtonState, MediaVolumeState> {\n static readonly tagName = 'media-mute-button';\n\n protected readonly core = new MuteButtonCore();\n protected readonly stateAttrMap = MuteButtonDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectVolume);\n protected override readonly hotkeyAction = 'toggleMuted';\n\n protected activate(state: MediaVolumeState): void {\n this.core.toggle(state);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,oBAAb,cAAuC,mBAAsD;;;EAGjE,KAAA,OAAA,IAAI,eAAe;EACX,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,YAAY;EAC3C,KAAA,eAAA;;;EALjB,KAAA,UAAA;;CAO1B,SAAmB,OAA+B;EAChD,KAAK,KAAK,OAAO,KAAK;CACxB;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 { PiPButtonCore } from "@videojs/core";
4
+ import { PiPButtonCore, PiPButtonState } from "@videojs/core";
5
5
  import { MediaPictureInPictureState } from "@videojs/media";
6
6
  //#region src/ui/pip-button/element.d.ts
7
- declare class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {
7
+ export declare class PiPButtonElement extends MediaButtonElement<PiPButtonState, MediaPictureInPictureState> {
8
8
  static readonly tagName = "media-pip-button";
9
9
  protected readonly core: PiPButtonCore;
10
10
  protected readonly stateAttrMap: {
@@ -14,15 +14,13 @@ declare class PiPButtonElement extends MediaButtonElement<PiPButtonCore> {
14
14
  readonly hidden: 'data-hidden';
15
15
  };
16
16
  protected readonly mediaState: PlayerController<index_d_exports.AnyPlayerStore, {
17
- pip: boolean;
18
- pipAvailability: import("@videojs/media").MediaFeatureAvailability;
17
+ isPictureInPicture: boolean;
18
+ pictureInPictureAvailability: import("@videojs/media").MediaFeatureAvailability;
19
19
  requestPictureInPicture: () => Promise<void>;
20
20
  exitPictureInPicture: () => Promise<void>;
21
- togglePictureInPicture: () => Promise<void>;
22
21
  } | undefined>;
23
22
  protected readonly hotkeyAction = "togglePictureInPicture";
24
23
  protected activate(state: MediaPictureInPictureState): Promise<void>;
25
24
  }
26
25
  //#endregion
27
- export { PiPButtonElement };
28
26
  //# sourceMappingURL=element.d.ts.map