@videojs/html 10.0.0-beta.23 → 10.0.0-beta.24

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 (1129) hide show
  1. package/README.md +6 -0
  2. package/cdn/audio-minimal-ui.dev.js +2 -1
  3. package/cdn/audio-minimal-ui.js +1 -1
  4. package/cdn/audio-minimal.dev.js +22 -18
  5. package/cdn/audio-minimal.dev.js.map +1 -1
  6. package/cdn/audio-minimal.js +1 -1
  7. package/cdn/audio-minimal.js.map +1 -1
  8. package/cdn/audio-ui.dev.js +2 -1
  9. package/cdn/audio-ui.js +1 -1
  10. package/cdn/audio.dev.js +22 -17
  11. package/cdn/audio.dev.js.map +1 -1
  12. package/cdn/audio.js +1 -1
  13. package/cdn/audio.js.map +1 -1
  14. package/cdn/background.dev.js +4 -4
  15. package/cdn/background.dev.js.map +1 -1
  16. package/cdn/background.js +1 -1
  17. package/cdn/background.js.map +1 -1
  18. package/cdn/base-CaXY3kMA.js +66 -0
  19. package/cdn/base-CaXY3kMA.js.map +1 -0
  20. package/cdn/base-JIGv_MlJ.js +2 -0
  21. package/cdn/base-JIGv_MlJ.js.map +1 -0
  22. package/cdn/compounds-CJ9NGNJr.js +8 -0
  23. package/cdn/compounds-CJ9NGNJr.js.map +1 -0
  24. package/cdn/{compounds-BHHGcL_P.js → compounds-DxdDY3jr.js} +2753 -500
  25. package/cdn/compounds-DxdDY3jr.js.map +1 -0
  26. package/cdn/create-player-B2W5yr5I.js +7 -0
  27. package/cdn/create-player-B2W5yr5I.js.map +1 -0
  28. package/cdn/{create-player-B-gVAMdr.js → create-player-_WED6HtK.js} +92 -12
  29. package/cdn/create-player-_WED6HtK.js.map +1 -0
  30. package/cdn/default-BtA2xVd7.js +33 -0
  31. package/cdn/default-BtA2xVd7.js.map +1 -0
  32. package/cdn/default-Ci15Ic2n.js +2 -0
  33. package/cdn/default-Ci15Ic2n.js.map +1 -0
  34. package/cdn/default-Ciudg7Lh.js +32 -0
  35. package/cdn/default-Ciudg7Lh.js.map +1 -0
  36. package/cdn/default-CmbctS5n.js +2 -0
  37. package/cdn/default-CmbctS5n.js.map +1 -0
  38. package/cdn/{hls-DEP0AzDp.js → hls-CoCXCB8b.js} +3 -3
  39. package/cdn/hls-CoCXCB8b.js.map +1 -0
  40. package/cdn/{hls-DR-Xxpxv.js → hls-DjqAxSvY.js} +84 -9
  41. package/cdn/hls-DjqAxSvY.js.map +1 -0
  42. package/cdn/{hotkey-element-oEdY8YLl.js → hotkey-element-89VAnCrc.js} +27 -38
  43. package/cdn/hotkey-element-89VAnCrc.js.map +1 -0
  44. package/cdn/hotkey-element-CmUxzW-C.js +2 -0
  45. package/cdn/hotkey-element-CmUxzW-C.js.map +1 -0
  46. package/cdn/live-button-element-BMneBAzX.js +208 -0
  47. package/cdn/live-button-element-BMneBAzX.js.map +1 -0
  48. package/cdn/live-button-element-CPEl1qK3.js +2 -0
  49. package/cdn/live-button-element-CPEl1qK3.js.map +1 -0
  50. package/cdn/live-video-minimal.dev.js +86 -8
  51. package/cdn/live-video-minimal.dev.js.map +1 -1
  52. package/cdn/live-video-minimal.js +1 -1
  53. package/cdn/live-video-minimal.js.map +1 -1
  54. package/cdn/live-video.dev.js +69 -5
  55. package/cdn/live-video.dev.js.map +1 -1
  56. package/cdn/live-video.js +1 -1
  57. package/cdn/live-video.js.map +1 -1
  58. package/cdn/media/dash-video.dev.js +3 -3
  59. package/cdn/media/dash-video.js +1 -1
  60. package/cdn/media/hls-video.dev.js +4 -4
  61. package/cdn/media/hls-video.js +1 -1
  62. package/cdn/media/mux-audio.dev.js +4 -4
  63. package/cdn/media/mux-audio.js +1 -1
  64. package/cdn/media/mux-video.dev.js +4 -4
  65. package/cdn/media/mux-video.js +1 -1
  66. package/cdn/media/native-hls-video.dev.js +4 -4
  67. package/cdn/media/native-hls-video.js +1 -1
  68. package/cdn/media/simple-hls-video.dev.js +3602 -2636
  69. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  70. package/cdn/media/simple-hls-video.js +7 -7
  71. package/cdn/media/simple-hls-video.js.map +1 -1
  72. package/cdn/{media-attach-mixin-DuquRhAk.js → media-attach-mixin-0gzahJxP.js} +2 -2
  73. package/cdn/{media-attach-mixin-DuquRhAk.js.map → media-attach-mixin-0gzahJxP.js.map} +1 -1
  74. package/cdn/{media-attach-mixin-pV8deGiO.js → media-attach-mixin-C1KQy-y8.js} +2 -2
  75. package/cdn/{media-attach-mixin-pV8deGiO.js.map → media-attach-mixin-C1KQy-y8.js.map} +1 -1
  76. package/cdn/minimal-BGKTRgLy.js +2 -0
  77. package/cdn/minimal-BGKTRgLy.js.map +1 -0
  78. package/cdn/minimal-BY8ZmNCh.js +33 -0
  79. package/cdn/minimal-BY8ZmNCh.js.map +1 -0
  80. package/cdn/minimal-D-o7FGL2.js +2 -0
  81. package/cdn/minimal-D-o7FGL2.js.map +1 -0
  82. package/cdn/minimal-b3s_qClU.js +32 -0
  83. package/cdn/minimal-b3s_qClU.js.map +1 -0
  84. package/cdn/minimal-ui-B0PWg1gR.js +2 -0
  85. package/cdn/minimal-ui-B0PWg1gR.js.map +1 -0
  86. package/cdn/minimal-ui-B6AtFmJO.js +2 -0
  87. package/cdn/minimal-ui-B6AtFmJO.js.map +1 -0
  88. package/cdn/minimal-ui-BjQUqQ_m.js +26 -0
  89. package/cdn/minimal-ui-BjQUqQ_m.js.map +1 -0
  90. package/cdn/minimal-ui-C2NRTvWx.js +38 -0
  91. package/cdn/minimal-ui-C2NRTvWx.js.map +1 -0
  92. package/cdn/{mux-DH3Kxyot.js → mux-CJn4lTbv.js} +3 -3
  93. package/cdn/{mux-DH3Kxyot.js.map → mux-CJn4lTbv.js.map} +1 -1
  94. package/cdn/{mux-D5M5HL6A.js → mux-wKbnuUQu.js} +3 -3
  95. package/cdn/{mux-D5M5HL6A.js.map → mux-wKbnuUQu.js.map} +1 -1
  96. package/cdn/{native-hls-DN_aWn2z.js → native-hls-1-isweaY.js} +2 -2
  97. package/cdn/{native-hls-DN_aWn2z.js.map → native-hls-1-isweaY.js.map} +1 -1
  98. package/cdn/{native-hls-ak4v9DN6.js → native-hls-D4f2-E9D.js} +2 -2
  99. package/cdn/{native-hls-ak4v9DN6.js.map → native-hls-D4f2-E9D.js.map} +1 -1
  100. package/cdn/playback-rate-button-element-Ck7CCs0t.js +2 -0
  101. package/cdn/playback-rate-button-element-Ck7CCs0t.js.map +1 -0
  102. package/cdn/playback-rate-button-element-DN78puhg.js +79 -0
  103. package/cdn/playback-rate-button-element-DN78puhg.js.map +1 -0
  104. package/cdn/player-9_6BPhTP.js +16 -0
  105. package/cdn/player-9_6BPhTP.js.map +1 -0
  106. package/cdn/player-C6DIXZpP.js +16 -0
  107. package/cdn/player-C6DIXZpP.js.map +1 -0
  108. package/cdn/{player-D468sScc.js → player-ClV0UtoS.js} +3 -3
  109. package/cdn/{player-D468sScc.js.map → player-ClV0UtoS.js.map} +1 -1
  110. package/cdn/player-D7lHFQo6.js +2 -0
  111. package/cdn/player-D7lHFQo6.js.map +1 -0
  112. package/cdn/player-DzqwkiTI.js +2 -0
  113. package/cdn/{player-CtegNw3g.js.map → player-DzqwkiTI.js.map} +1 -1
  114. package/cdn/player-_4EjFnET.js +2 -0
  115. package/cdn/player-_4EjFnET.js.map +1 -0
  116. package/cdn/poster-element-DmfmTRCV.js +2 -0
  117. package/cdn/poster-element-DmfmTRCV.js.map +1 -0
  118. package/cdn/{player-C_6YjMl7.js → poster-element-IdY3MYJj.js} +6 -17
  119. package/cdn/poster-element-IdY3MYJj.js.map +1 -0
  120. package/cdn/{predicate-BOcV_HDG.js → predicate-Dqd8wbW6.js} +5 -2
  121. package/cdn/predicate-Dqd8wbW6.js.map +1 -0
  122. package/cdn/{predicate-Cad5WV4q.js → predicate-Dxl3IuYh.js} +2 -2
  123. package/cdn/predicate-Dxl3IuYh.js.map +1 -0
  124. package/cdn/seek-button-element-BkC8xrVR.js +394 -0
  125. package/cdn/seek-button-element-BkC8xrVR.js.map +1 -0
  126. package/cdn/seek-button-element-C0uAXebE.js +2 -0
  127. package/cdn/seek-button-element-C0uAXebE.js.map +1 -0
  128. package/cdn/skin-element-D0TDGWJH.js +2 -0
  129. package/cdn/skin-element-D0TDGWJH.js.map +1 -0
  130. package/cdn/skin-element-mgqcAutZ.js +55 -0
  131. package/cdn/skin-element-mgqcAutZ.js.map +1 -0
  132. package/cdn/ui-BH0azXYN.js +2 -0
  133. package/cdn/ui-BH0azXYN.js.map +1 -0
  134. package/cdn/ui-B_E6hb1k.js +33 -0
  135. package/cdn/ui-B_E6hb1k.js.map +1 -0
  136. package/cdn/ui-ByhUcpaY.js +2 -0
  137. package/cdn/ui-ByhUcpaY.js.map +1 -0
  138. package/cdn/ui-DG0AlJbU.js +42 -0
  139. package/cdn/ui-DG0AlJbU.js.map +1 -0
  140. package/cdn/{video-host-BR_2vUZH.js → video-host-BU9t26fe.js} +3 -3
  141. package/cdn/{video-host-BR_2vUZH.js.map → video-host-BU9t26fe.js.map} +1 -1
  142. package/cdn/{video-host-Bkh2OyyP.js → video-host-CvYvXa8l.js} +2 -2
  143. package/cdn/{video-host-Bkh2OyyP.js.map → video-host-CvYvXa8l.js.map} +1 -1
  144. package/cdn/video-minimal-ui.dev.js +2 -1
  145. package/cdn/video-minimal-ui.js +1 -1
  146. package/cdn/video-minimal.dev.js +83 -18
  147. package/cdn/video-minimal.dev.js.map +1 -1
  148. package/cdn/video-minimal.js +1 -1
  149. package/cdn/video-minimal.js.map +1 -1
  150. package/cdn/video-ui.dev.js +2 -1
  151. package/cdn/video-ui.js +1 -1
  152. package/cdn/video.dev.js +56 -15
  153. package/cdn/video.dev.js.map +1 -1
  154. package/cdn/video.js +1 -1
  155. package/cdn/video.js.map +1 -1
  156. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  157. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  158. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  159. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  160. package/dist/default/_virtual/inline-css_src/define/background/skin.js +1 -1
  161. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -1
  162. package/dist/default/_virtual/inline-css_src/define/global.js +6 -0
  163. package/dist/default/_virtual/inline-css_src/define/global.js.map +1 -0
  164. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  165. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  166. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  167. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  168. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  169. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  170. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  171. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  172. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  173. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  174. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  175. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  176. package/dist/default/define/audio/minimal-skin.css +225 -107
  177. package/dist/default/define/audio/minimal-skin.js +1 -1
  178. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  179. package/dist/default/define/audio/minimal-skin.tailwind.js +3 -2
  180. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  181. package/dist/default/define/audio/minimal-ui.js +8 -3
  182. package/dist/default/define/audio/minimal-ui.js.map +1 -1
  183. package/dist/default/define/audio/skin.css +251 -107
  184. package/dist/default/define/audio/skin.js +1 -1
  185. package/dist/default/define/audio/skin.js.map +1 -1
  186. package/dist/default/define/audio/skin.tailwind.js +2 -1
  187. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  188. package/dist/default/define/audio/ui.js +10 -1
  189. package/dist/default/define/audio/ui.js.map +1 -1
  190. package/dist/default/define/background/skin.css +4 -2
  191. package/dist/default/define/{base.css → global.css} +12 -8
  192. package/dist/default/define/live-audio/minimal-skin.css +225 -107
  193. package/dist/default/define/live-audio/minimal-skin.js +2 -2
  194. package/dist/default/define/live-audio/minimal-skin.js.map +1 -1
  195. package/dist/default/define/live-audio/minimal-skin.tailwind.js +2 -2
  196. package/dist/default/define/live-audio/minimal-skin.tailwind.js.map +1 -1
  197. package/dist/default/define/live-audio/minimal-ui.js +26 -0
  198. package/dist/default/define/live-audio/minimal-ui.js.map +1 -0
  199. package/dist/default/define/live-audio/player.js +18 -0
  200. package/dist/default/define/live-audio/player.js.map +1 -0
  201. package/dist/default/define/live-audio/skin.css +251 -107
  202. package/dist/default/define/live-audio/skin.js +2 -2
  203. package/dist/default/define/live-audio/skin.js.map +1 -1
  204. package/dist/default/define/live-audio/skin.tailwind.js +2 -2
  205. package/dist/default/define/live-audio/skin.tailwind.js.map +1 -1
  206. package/dist/default/define/live-audio/ui.js +30 -0
  207. package/dist/default/define/live-audio/ui.js.map +1 -0
  208. package/dist/default/define/live-video/minimal-skin.css +569 -146
  209. package/dist/default/define/live-video/minimal-skin.js +2 -2
  210. package/dist/default/define/live-video/minimal-skin.js.map +1 -1
  211. package/dist/default/define/live-video/minimal-skin.tailwind.js +3 -2
  212. package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
  213. package/dist/default/define/live-video/minimal-ui.js +44 -0
  214. package/dist/default/define/live-video/minimal-ui.js.map +1 -0
  215. package/dist/default/define/live-video/player.js +18 -0
  216. package/dist/default/define/live-video/player.js.map +1 -0
  217. package/dist/default/define/live-video/skin.css +579 -144
  218. package/dist/default/define/live-video/skin.js +2 -2
  219. package/dist/default/define/live-video/skin.js.map +1 -1
  220. package/dist/default/define/live-video/skin.tailwind.js +3 -3
  221. package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
  222. package/dist/default/define/live-video/ui.js +44 -0
  223. package/dist/default/define/live-video/ui.js.map +1 -0
  224. package/dist/default/define/shared.css +4 -0
  225. package/dist/default/define/skin-element.js +2 -2
  226. package/dist/default/define/skin-element.js.map +1 -1
  227. package/dist/default/define/tailwind.css +66 -0
  228. package/dist/default/define/ui/compounds.js +43 -1
  229. package/dist/default/define/ui/compounds.js.map +1 -1
  230. package/dist/default/define/ui/menu.js +6 -0
  231. package/dist/default/define/ui/menu.js.map +1 -0
  232. package/dist/default/define/ui/playback-rate-menu.js +13 -0
  233. package/dist/default/define/ui/playback-rate-menu.js.map +1 -0
  234. package/dist/default/define/ui/seek-indicator-value.js +7 -0
  235. package/dist/default/define/ui/seek-indicator-value.js.map +1 -0
  236. package/dist/default/define/ui/seek-indicator.js +9 -0
  237. package/dist/default/define/ui/seek-indicator.js.map +1 -0
  238. package/dist/default/define/ui/status-announcer.js +7 -0
  239. package/dist/default/define/ui/status-announcer.js.map +1 -0
  240. package/dist/default/define/ui/status-indicator-value.js +7 -0
  241. package/dist/default/define/ui/status-indicator-value.js.map +1 -0
  242. package/dist/default/define/ui/status-indicator.js +9 -0
  243. package/dist/default/define/ui/status-indicator.js.map +1 -0
  244. package/dist/default/define/ui/volume-indicator-fill.js +7 -0
  245. package/dist/default/define/ui/volume-indicator-fill.js.map +1 -0
  246. package/dist/default/define/ui/volume-indicator-value.js +7 -0
  247. package/dist/default/define/ui/volume-indicator-value.js.map +1 -0
  248. package/dist/default/define/ui/volume-indicator.js +11 -0
  249. package/dist/default/define/ui/volume-indicator.js.map +1 -0
  250. package/dist/default/define/video/minimal-skin.css +569 -146
  251. package/dist/default/define/video/minimal-skin.js +1 -1
  252. package/dist/default/define/video/minimal-skin.js.map +1 -1
  253. package/dist/default/define/video/minimal-skin.tailwind.js +4 -2
  254. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  255. package/dist/default/define/video/minimal-ui.js +13 -3
  256. package/dist/default/define/video/minimal-ui.js.map +1 -1
  257. package/dist/default/define/video/skin.css +579 -144
  258. package/dist/default/define/video/skin.js +1 -1
  259. package/dist/default/define/video/skin.js.map +1 -1
  260. package/dist/default/define/video/skin.tailwind.js +3 -2
  261. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  262. package/dist/default/define/video/ui.js +11 -1
  263. package/dist/default/define/video/ui.js.map +1 -1
  264. package/dist/default/icons/default/index.js +19 -0
  265. package/dist/default/icons/dist/element/base.js +66 -0
  266. package/dist/default/icons/dist/element/base.js.map +1 -0
  267. package/dist/default/icons/dist/element/default/icons.js +25 -0
  268. package/dist/default/icons/dist/element/default/icons.js.map +1 -0
  269. package/dist/default/icons/dist/element/default/index.js +10 -0
  270. package/dist/default/icons/dist/element/default/index.js.map +1 -0
  271. package/dist/default/icons/dist/element/index.js +11 -0
  272. package/dist/default/icons/dist/element/index.js.map +1 -0
  273. package/dist/default/icons/dist/element/minimal/icons.js +25 -0
  274. package/dist/default/icons/dist/element/minimal/icons.js.map +1 -0
  275. package/dist/default/icons/dist/element/minimal/index.js +10 -0
  276. package/dist/default/icons/dist/element/minimal/index.js.map +1 -0
  277. package/dist/default/icons/dist/html/default/captions-off.js +6 -0
  278. package/dist/default/icons/dist/html/default/captions-off.js.map +1 -0
  279. package/dist/default/icons/dist/html/default/captions-on.js +6 -0
  280. package/dist/default/icons/dist/html/default/captions-on.js.map +1 -0
  281. package/dist/default/icons/dist/html/default/cast-enter.js +6 -0
  282. package/dist/default/icons/dist/html/default/cast-enter.js.map +1 -0
  283. package/dist/default/icons/dist/html/default/cast-exit.js +6 -0
  284. package/dist/default/icons/dist/html/default/cast-exit.js.map +1 -0
  285. package/dist/default/icons/dist/html/default/check.js +6 -0
  286. package/dist/default/icons/dist/html/default/check.js.map +1 -0
  287. package/dist/default/icons/dist/html/default/chevron.js +6 -0
  288. package/dist/default/icons/dist/html/default/chevron.js.map +1 -0
  289. package/dist/default/icons/dist/html/default/fullscreen-enter.js +6 -0
  290. package/dist/default/icons/dist/html/default/fullscreen-enter.js.map +1 -0
  291. package/dist/default/icons/dist/html/default/fullscreen-exit.js +6 -0
  292. package/dist/default/icons/dist/html/default/fullscreen-exit.js.map +1 -0
  293. package/dist/default/icons/dist/html/default/pause.js +6 -0
  294. package/dist/default/icons/dist/html/default/pause.js.map +1 -0
  295. package/dist/default/icons/dist/html/default/pip-enter.js +6 -0
  296. package/dist/default/icons/dist/html/default/pip-enter.js.map +1 -0
  297. package/dist/default/icons/dist/html/default/pip-exit.js +6 -0
  298. package/dist/default/icons/dist/html/default/pip-exit.js.map +1 -0
  299. package/dist/default/icons/dist/html/default/play.js +6 -0
  300. package/dist/default/icons/dist/html/default/play.js.map +1 -0
  301. package/dist/default/icons/dist/html/default/restart.js +6 -0
  302. package/dist/default/icons/dist/html/default/restart.js.map +1 -0
  303. package/dist/default/icons/dist/html/default/seek.js +6 -0
  304. package/dist/default/icons/dist/html/default/seek.js.map +1 -0
  305. package/dist/default/icons/dist/html/default/spinner.js +6 -0
  306. package/dist/default/icons/dist/html/default/spinner.js.map +1 -0
  307. package/dist/default/icons/dist/html/default/volume-high.js +6 -0
  308. package/dist/default/icons/dist/html/default/volume-high.js.map +1 -0
  309. package/dist/default/icons/dist/html/default/volume-low.js +6 -0
  310. package/dist/default/icons/dist/html/default/volume-low.js.map +1 -0
  311. package/dist/default/icons/dist/html/default/volume-off.js +6 -0
  312. package/dist/default/icons/dist/html/default/volume-off.js.map +1 -0
  313. package/dist/default/icons/dist/html/minimal/captions-off.js +6 -0
  314. package/dist/default/icons/dist/html/minimal/captions-off.js.map +1 -0
  315. package/dist/default/icons/dist/html/minimal/captions-on.js +6 -0
  316. package/dist/default/icons/dist/html/minimal/captions-on.js.map +1 -0
  317. package/dist/default/icons/dist/html/minimal/cast-enter.js +6 -0
  318. package/dist/default/icons/dist/html/minimal/cast-enter.js.map +1 -0
  319. package/dist/default/icons/dist/html/minimal/cast-exit.js +6 -0
  320. package/dist/default/icons/dist/html/minimal/cast-exit.js.map +1 -0
  321. package/dist/default/icons/dist/html/minimal/check.js +6 -0
  322. package/dist/default/icons/dist/html/minimal/check.js.map +1 -0
  323. package/dist/default/icons/dist/html/minimal/chevron.js +6 -0
  324. package/dist/default/icons/dist/html/minimal/chevron.js.map +1 -0
  325. package/dist/default/icons/dist/html/minimal/fullscreen-enter.js +6 -0
  326. package/dist/default/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
  327. package/dist/default/icons/dist/html/minimal/fullscreen-exit.js +6 -0
  328. package/dist/default/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
  329. package/dist/default/icons/dist/html/minimal/pause.js +6 -0
  330. package/dist/default/icons/dist/html/minimal/pause.js.map +1 -0
  331. package/dist/default/icons/dist/html/minimal/pip-enter.js +6 -0
  332. package/dist/default/icons/dist/html/minimal/pip-enter.js.map +1 -0
  333. package/dist/default/icons/dist/html/minimal/pip-exit.js +6 -0
  334. package/dist/default/icons/dist/html/minimal/pip-exit.js.map +1 -0
  335. package/dist/default/icons/dist/html/minimal/play.js +6 -0
  336. package/dist/default/icons/dist/html/minimal/play.js.map +1 -0
  337. package/dist/default/icons/dist/html/minimal/restart.js +6 -0
  338. package/dist/default/icons/dist/html/minimal/restart.js.map +1 -0
  339. package/dist/default/icons/dist/html/minimal/seek.js +6 -0
  340. package/dist/default/icons/dist/html/minimal/seek.js.map +1 -0
  341. package/dist/default/icons/dist/html/minimal/spinner.js +6 -0
  342. package/dist/default/icons/dist/html/minimal/spinner.js.map +1 -0
  343. package/dist/default/icons/dist/html/minimal/volume-high.js +6 -0
  344. package/dist/default/icons/dist/html/minimal/volume-high.js.map +1 -0
  345. package/dist/default/icons/dist/html/minimal/volume-low.js +6 -0
  346. package/dist/default/icons/dist/html/minimal/volume-low.js.map +1 -0
  347. package/dist/default/icons/dist/html/minimal/volume-off.js +6 -0
  348. package/dist/default/icons/dist/html/minimal/volume-off.js.map +1 -0
  349. package/dist/default/icons/dist/render/default/index.js +17 -15
  350. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  351. package/dist/default/icons/dist/render/minimal/index.js +17 -15
  352. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  353. package/dist/default/icons/element/default/index.js +1 -0
  354. package/dist/default/icons/element/index.js +1 -0
  355. package/dist/default/icons/element/minimal/index.js +1 -0
  356. package/dist/default/icons/index.js +19 -0
  357. package/dist/default/icons/minimal/index.js +19 -0
  358. package/dist/default/index.js +25 -1
  359. package/dist/default/player/context.js.map +1 -1
  360. package/dist/default/presets/live-audio.js +2 -1
  361. package/dist/default/presets/live-video.js +2 -1
  362. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +3 -2
  363. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  364. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  365. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  366. package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -2
  367. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  368. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +1 -1
  369. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  370. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -1
  371. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  372. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
  373. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
  374. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +12 -0
  375. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
  376. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  377. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  378. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +1 -1
  379. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -1
  380. package/dist/default/skins/dist/default/default/tailwind/components/reset.js +7 -0
  381. package/dist/default/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
  382. package/dist/default/skins/dist/default/default/tailwind/components/root.js +2 -1
  383. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  384. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +1 -1
  385. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  386. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +13 -4
  387. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  388. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
  389. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  390. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  391. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  392. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +3 -2
  393. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  394. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  395. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  396. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  397. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  398. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
  399. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
  400. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
  401. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
  402. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +1 -1
  403. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -1
  404. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +1 -1
  405. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -1
  406. package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
  407. package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
  408. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +2 -1
  409. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  410. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  411. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  412. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -4
  413. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  414. package/dist/default/store/provider-mixin.js +8 -3
  415. package/dist/default/store/provider-mixin.js.map +1 -1
  416. package/dist/default/ui/controls/controls-element.js +13 -1
  417. package/dist/default/ui/controls/controls-element.js.map +1 -1
  418. package/dist/default/ui/gesture/gesture-element.js +2 -1
  419. package/dist/default/ui/gesture/gesture-element.js.map +1 -1
  420. package/dist/default/ui/hotkey/hotkey-element.js +1 -0
  421. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
  422. package/dist/default/ui/input-indicators/input-indicator-element.js +110 -0
  423. package/dist/default/ui/input-indicators/input-indicator-element.js.map +1 -0
  424. package/dist/default/ui/input-indicators/live-indicator.js +32 -0
  425. package/dist/default/ui/input-indicators/live-indicator.js.map +1 -0
  426. package/dist/default/ui/live-button/live-button-element.js +97 -0
  427. package/dist/default/ui/live-button/live-button-element.js.map +1 -0
  428. package/dist/default/ui/menu/context.js +10 -0
  429. package/dist/default/ui/menu/context.js.map +1 -0
  430. package/dist/default/ui/menu/menu-back-element.js +57 -0
  431. package/dist/default/ui/menu/menu-back-element.js.map +1 -0
  432. package/dist/default/ui/menu/menu-checkbox-item-element.js +78 -0
  433. package/dist/default/ui/menu/menu-checkbox-item-element.js.map +1 -0
  434. package/dist/default/ui/menu/menu-element.js +285 -0
  435. package/dist/default/ui/menu/menu-element.js.map +1 -0
  436. package/dist/default/ui/menu/menu-group-element.js +35 -0
  437. package/dist/default/ui/menu/menu-group-element.js.map +1 -0
  438. package/dist/default/ui/menu/menu-item-element.js +96 -0
  439. package/dist/default/ui/menu/menu-item-element.js.map +1 -0
  440. package/dist/default/ui/menu/menu-item-indicator-element.js +34 -0
  441. package/dist/default/ui/menu/menu-item-indicator-element.js.map +1 -0
  442. package/dist/default/ui/menu/menu-label-element.js +20 -0
  443. package/dist/default/ui/menu/menu-label-element.js.map +1 -0
  444. package/dist/default/ui/menu/menu-radio-group-element.js +51 -0
  445. package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -0
  446. package/dist/default/ui/menu/menu-radio-item-element.js +84 -0
  447. package/dist/default/ui/menu/menu-radio-item-element.js.map +1 -0
  448. package/dist/default/ui/menu/menu-separator-element.js +24 -0
  449. package/dist/default/ui/menu/menu-separator-element.js.map +1 -0
  450. package/dist/default/ui/menu/menu-view-element.js +16 -0
  451. package/dist/default/ui/menu/menu-view-element.js.map +1 -0
  452. package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js +47 -0
  453. package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
  454. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +85 -0
  455. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
  456. package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js +113 -0
  457. package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
  458. package/dist/default/ui/popover/popover-element.js +30 -9
  459. package/dist/default/ui/popover/popover-element.js.map +1 -1
  460. package/dist/default/ui/position-controller.js +11 -6
  461. package/dist/default/ui/position-controller.js.map +1 -1
  462. package/dist/default/ui/seek-indicator/seek-indicator-element.js +44 -0
  463. package/dist/default/ui/seek-indicator/seek-indicator-element.js.map +1 -0
  464. package/dist/default/ui/seek-indicator/seek-indicator-value-element.js +11 -0
  465. package/dist/default/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
  466. package/dist/default/ui/status-announcer/status-announcer-element.js +70 -0
  467. package/dist/default/ui/status-announcer/status-announcer-element.js.map +1 -0
  468. package/dist/default/ui/status-indicator/status-indicator-element.js +53 -0
  469. package/dist/default/ui/status-indicator/status-indicator-element.js.map +1 -0
  470. package/dist/default/ui/status-indicator/status-indicator-value-element.js +11 -0
  471. package/dist/default/ui/status-indicator/status-indicator-value-element.js.map +1 -0
  472. package/dist/default/ui/tooltip/tooltip-element.js +27 -8
  473. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  474. package/dist/default/ui/volume-indicator/volume-indicator-element.js +46 -0
  475. package/dist/default/ui/volume-indicator/volume-indicator-element.js.map +1 -0
  476. package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
  477. package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
  478. package/dist/default/ui/volume-indicator/volume-indicator-value-element.js +11 -0
  479. package/dist/default/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
  480. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  481. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  482. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  483. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  484. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +1 -1
  485. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -1
  486. package/dist/dev/_virtual/inline-css_src/define/global.js +6 -0
  487. package/dist/dev/_virtual/inline-css_src/define/global.js.map +1 -0
  488. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
  489. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
  490. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
  491. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
  492. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
  493. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
  494. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
  495. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
  496. package/dist/dev/_virtual/inline-css_src/define/shared.js +1 -1
  497. package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -1
  498. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  499. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  500. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  501. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  502. package/dist/dev/define/audio/minimal-skin.css +225 -107
  503. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  504. package/dist/dev/define/audio/minimal-skin.js +18 -14
  505. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  506. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
  507. package/dist/dev/define/audio/minimal-skin.tailwind.js +29 -23
  508. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  509. package/dist/dev/define/audio/minimal-ui.js +8 -3
  510. package/dist/dev/define/audio/minimal-ui.js.map +1 -1
  511. package/dist/dev/define/audio/skin.css +251 -107
  512. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  513. package/dist/dev/define/audio/skin.js +18 -13
  514. package/dist/dev/define/audio/skin.js.map +1 -1
  515. package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
  516. package/dist/dev/define/audio/skin.tailwind.js +27 -21
  517. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  518. package/dist/dev/define/audio/ui.js +10 -1
  519. package/dist/dev/define/audio/ui.js.map +1 -1
  520. package/dist/dev/define/background/skin.css +4 -2
  521. package/dist/dev/define/{base.css → global.css} +12 -8
  522. package/dist/dev/define/live-audio/minimal-skin.css +225 -107
  523. package/dist/dev/define/live-audio/minimal-skin.d.ts.map +1 -1
  524. package/dist/dev/define/live-audio/minimal-skin.js +6 -4
  525. package/dist/dev/define/live-audio/minimal-skin.js.map +1 -1
  526. package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts.map +1 -1
  527. package/dist/dev/define/live-audio/minimal-skin.tailwind.js +12 -10
  528. package/dist/dev/define/live-audio/minimal-skin.tailwind.js.map +1 -1
  529. package/dist/dev/define/live-audio/minimal-ui.d.ts +1 -0
  530. package/dist/dev/define/live-audio/minimal-ui.js +26 -0
  531. package/dist/dev/define/live-audio/minimal-ui.js.map +1 -0
  532. package/dist/dev/define/live-audio/player.d.ts +17 -0
  533. package/dist/dev/define/live-audio/player.d.ts.map +1 -0
  534. package/dist/dev/define/live-audio/player.js +18 -0
  535. package/dist/dev/define/live-audio/player.js.map +1 -0
  536. package/dist/dev/define/live-audio/skin.css +251 -107
  537. package/dist/dev/define/live-audio/skin.d.ts.map +1 -1
  538. package/dist/dev/define/live-audio/skin.js +6 -4
  539. package/dist/dev/define/live-audio/skin.js.map +1 -1
  540. package/dist/dev/define/live-audio/skin.tailwind.d.ts.map +1 -1
  541. package/dist/dev/define/live-audio/skin.tailwind.js +11 -9
  542. package/dist/dev/define/live-audio/skin.tailwind.js.map +1 -1
  543. package/dist/dev/define/live-audio/ui.d.ts +1 -0
  544. package/dist/dev/define/live-audio/ui.js +30 -0
  545. package/dist/dev/define/live-audio/ui.js.map +1 -0
  546. package/dist/dev/define/live-video/minimal-skin.css +569 -146
  547. package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
  548. package/dist/dev/define/live-video/minimal-skin.js +53 -5
  549. package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
  550. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
  551. package/dist/dev/define/live-video/minimal-skin.tailwind.js +60 -9
  552. package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
  553. package/dist/dev/define/live-video/minimal-ui.d.ts +1 -0
  554. package/dist/dev/define/live-video/minimal-ui.js +44 -0
  555. package/dist/dev/define/live-video/minimal-ui.js.map +1 -0
  556. package/dist/dev/define/live-video/player.d.ts +17 -0
  557. package/dist/dev/define/live-video/player.d.ts.map +1 -0
  558. package/dist/dev/define/live-video/player.js +18 -0
  559. package/dist/dev/define/live-video/player.js.map +1 -0
  560. package/dist/dev/define/live-video/skin.css +579 -144
  561. package/dist/dev/define/live-video/skin.d.ts.map +1 -1
  562. package/dist/dev/define/live-video/skin.js +36 -2
  563. package/dist/dev/define/live-video/skin.js.map +1 -1
  564. package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
  565. package/dist/dev/define/live-video/skin.tailwind.js +57 -8
  566. package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
  567. package/dist/dev/define/live-video/ui.d.ts +1 -0
  568. package/dist/dev/define/live-video/ui.js +44 -0
  569. package/dist/dev/define/live-video/ui.js.map +1 -0
  570. package/dist/dev/define/shared.css +4 -0
  571. package/dist/dev/define/skin-element.js +2 -2
  572. package/dist/dev/define/skin-element.js.map +1 -1
  573. package/dist/dev/define/tailwind.css +66 -0
  574. package/dist/dev/define/ui/compounds.d.ts +3 -1
  575. package/dist/dev/define/ui/compounds.d.ts.map +1 -1
  576. package/dist/dev/define/ui/compounds.js +43 -1
  577. package/dist/dev/define/ui/compounds.js.map +1 -1
  578. package/dist/dev/define/ui/menu.d.ts +25 -0
  579. package/dist/dev/define/ui/menu.d.ts.map +1 -0
  580. package/dist/dev/define/ui/menu.js +6 -0
  581. package/dist/dev/define/ui/menu.js.map +1 -0
  582. package/dist/dev/define/ui/playback-rate-menu.d.ts +13 -0
  583. package/dist/dev/define/ui/playback-rate-menu.d.ts.map +1 -0
  584. package/dist/dev/define/ui/playback-rate-menu.js +13 -0
  585. package/dist/dev/define/ui/playback-rate-menu.js.map +1 -0
  586. package/dist/dev/define/ui/seek-indicator-value.d.ts +9 -0
  587. package/dist/dev/define/ui/seek-indicator-value.d.ts.map +1 -0
  588. package/dist/dev/define/ui/seek-indicator-value.js +7 -0
  589. package/dist/dev/define/ui/seek-indicator-value.js.map +1 -0
  590. package/dist/dev/define/ui/seek-indicator.d.ts +11 -0
  591. package/dist/dev/define/ui/seek-indicator.d.ts.map +1 -0
  592. package/dist/dev/define/ui/seek-indicator.js +9 -0
  593. package/dist/dev/define/ui/seek-indicator.js.map +1 -0
  594. package/dist/dev/define/ui/status-announcer.d.ts +9 -0
  595. package/dist/dev/define/ui/status-announcer.d.ts.map +1 -0
  596. package/dist/dev/define/ui/status-announcer.js +7 -0
  597. package/dist/dev/define/ui/status-announcer.js.map +1 -0
  598. package/dist/dev/define/ui/status-indicator-value.d.ts +9 -0
  599. package/dist/dev/define/ui/status-indicator-value.d.ts.map +1 -0
  600. package/dist/dev/define/ui/status-indicator-value.js +7 -0
  601. package/dist/dev/define/ui/status-indicator-value.js.map +1 -0
  602. package/dist/dev/define/ui/status-indicator.d.ts +11 -0
  603. package/dist/dev/define/ui/status-indicator.d.ts.map +1 -0
  604. package/dist/dev/define/ui/status-indicator.js +9 -0
  605. package/dist/dev/define/ui/status-indicator.js.map +1 -0
  606. package/dist/dev/define/ui/volume-indicator-fill.d.ts +9 -0
  607. package/dist/dev/define/ui/volume-indicator-fill.d.ts.map +1 -0
  608. package/dist/dev/define/ui/volume-indicator-fill.js +7 -0
  609. package/dist/dev/define/ui/volume-indicator-fill.js.map +1 -0
  610. package/dist/dev/define/ui/volume-indicator-value.d.ts +9 -0
  611. package/dist/dev/define/ui/volume-indicator-value.d.ts.map +1 -0
  612. package/dist/dev/define/ui/volume-indicator-value.js +7 -0
  613. package/dist/dev/define/ui/volume-indicator-value.js.map +1 -0
  614. package/dist/dev/define/ui/volume-indicator.d.ts +13 -0
  615. package/dist/dev/define/ui/volume-indicator.d.ts.map +1 -0
  616. package/dist/dev/define/ui/volume-indicator.js +11 -0
  617. package/dist/dev/define/ui/volume-indicator.js.map +1 -0
  618. package/dist/dev/define/video/minimal-skin.css +569 -146
  619. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  620. package/dist/dev/define/video/minimal-skin.js +79 -14
  621. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  622. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  623. package/dist/dev/define/video/minimal-skin.tailwind.js +93 -21
  624. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  625. package/dist/dev/define/video/minimal-ui.js +13 -3
  626. package/dist/dev/define/video/minimal-ui.js.map +1 -1
  627. package/dist/dev/define/video/skin.css +579 -144
  628. package/dist/dev/define/video/skin.d.ts.map +1 -1
  629. package/dist/dev/define/video/skin.js +52 -11
  630. package/dist/dev/define/video/skin.js.map +1 -1
  631. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  632. package/dist/dev/define/video/skin.tailwind.js +89 -19
  633. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  634. package/dist/dev/define/video/ui.js +11 -1
  635. package/dist/dev/define/video/ui.js.map +1 -1
  636. package/dist/dev/icons/default/index.d.ts +2 -0
  637. package/dist/dev/icons/default/index.js +19 -0
  638. package/dist/dev/icons/element/default/index.d.ts +1 -0
  639. package/dist/dev/icons/element/default/index.js +1 -0
  640. package/dist/dev/icons/element/index.d.ts +1 -0
  641. package/dist/dev/icons/element/index.js +1 -0
  642. package/dist/dev/icons/element/minimal/index.d.ts +1 -0
  643. package/dist/dev/icons/element/minimal/index.js +1 -0
  644. package/dist/dev/icons/index.d.ts +2 -0
  645. package/dist/dev/icons/index.js +19 -0
  646. package/dist/dev/icons/minimal/index.d.ts +2 -0
  647. package/dist/dev/icons/minimal/index.js +19 -0
  648. package/dist/dev/index.d.ts +26 -2
  649. package/dist/dev/index.js +25 -1
  650. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/index.d.ts +2 -0
  651. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.d.ts +61 -0
  652. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.d.ts.map +1 -0
  653. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-consumer.d.ts +1 -0
  654. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-provider.d.ts +22 -0
  655. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-provider.d.ts.map +1 -0
  656. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts +19 -0
  657. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts.map +1 -0
  658. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/consume.d.ts +1 -0
  659. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/provide.d.ts +1 -0
  660. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/value-notifier.d.ts +1 -0
  661. package/dist/dev/node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.d.ts +116 -0
  662. package/dist/dev/node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.d.ts.map +1 -0
  663. package/dist/dev/packages/icons/dist/element/base.js +66 -0
  664. package/dist/dev/packages/icons/dist/element/base.js.map +1 -0
  665. package/dist/dev/packages/icons/dist/element/default/icons.js +25 -0
  666. package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -0
  667. package/dist/dev/packages/icons/dist/element/default/index.d.ts +1 -0
  668. package/dist/dev/packages/icons/dist/element/default/index.js +10 -0
  669. package/dist/dev/packages/icons/dist/element/default/index.js.map +1 -0
  670. package/dist/dev/packages/icons/dist/element/index.d.ts +1 -0
  671. package/dist/dev/packages/icons/dist/element/index.js +11 -0
  672. package/dist/dev/packages/icons/dist/element/index.js.map +1 -0
  673. package/dist/dev/packages/icons/dist/element/minimal/icons.js +25 -0
  674. package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -0
  675. package/dist/dev/packages/icons/dist/element/minimal/index.d.ts +1 -0
  676. package/dist/dev/packages/icons/dist/element/minimal/index.js +10 -0
  677. package/dist/dev/packages/icons/dist/element/minimal/index.js.map +1 -0
  678. package/dist/dev/packages/icons/dist/html/default/captions-off.js +6 -0
  679. package/dist/dev/packages/icons/dist/html/default/captions-off.js.map +1 -0
  680. package/dist/dev/packages/icons/dist/html/default/captions-on.js +6 -0
  681. package/dist/dev/packages/icons/dist/html/default/captions-on.js.map +1 -0
  682. package/dist/dev/packages/icons/dist/html/default/cast-enter.js +6 -0
  683. package/dist/dev/packages/icons/dist/html/default/cast-enter.js.map +1 -0
  684. package/dist/dev/packages/icons/dist/html/default/cast-exit.js +6 -0
  685. package/dist/dev/packages/icons/dist/html/default/cast-exit.js.map +1 -0
  686. package/dist/dev/packages/icons/dist/html/default/check.js +6 -0
  687. package/dist/dev/packages/icons/dist/html/default/check.js.map +1 -0
  688. package/dist/dev/packages/icons/dist/html/default/chevron.js +6 -0
  689. package/dist/dev/packages/icons/dist/html/default/chevron.js.map +1 -0
  690. package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js +6 -0
  691. package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js.map +1 -0
  692. package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js +6 -0
  693. package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js.map +1 -0
  694. package/dist/dev/packages/icons/dist/html/default/index.d.ts +23 -0
  695. package/dist/dev/packages/icons/dist/html/default/index.d.ts.map +1 -0
  696. package/dist/dev/packages/icons/dist/html/default/pause.js +6 -0
  697. package/dist/dev/packages/icons/dist/html/default/pause.js.map +1 -0
  698. package/dist/dev/packages/icons/dist/html/default/pip-enter.js +6 -0
  699. package/dist/dev/packages/icons/dist/html/default/pip-enter.js.map +1 -0
  700. package/dist/dev/packages/icons/dist/html/default/pip-exit.js +6 -0
  701. package/dist/dev/packages/icons/dist/html/default/pip-exit.js.map +1 -0
  702. package/dist/dev/packages/icons/dist/html/default/play.js +6 -0
  703. package/dist/dev/packages/icons/dist/html/default/play.js.map +1 -0
  704. package/dist/dev/packages/icons/dist/html/default/restart.js +6 -0
  705. package/dist/dev/packages/icons/dist/html/default/restart.js.map +1 -0
  706. package/dist/dev/packages/icons/dist/html/default/seek.js +6 -0
  707. package/dist/dev/packages/icons/dist/html/default/seek.js.map +1 -0
  708. package/dist/dev/packages/icons/dist/html/default/spinner.js +6 -0
  709. package/dist/dev/packages/icons/dist/html/default/spinner.js.map +1 -0
  710. package/dist/dev/packages/icons/dist/html/default/volume-high.js +6 -0
  711. package/dist/dev/packages/icons/dist/html/default/volume-high.js.map +1 -0
  712. package/dist/dev/packages/icons/dist/html/default/volume-low.js +6 -0
  713. package/dist/dev/packages/icons/dist/html/default/volume-low.js.map +1 -0
  714. package/dist/dev/packages/icons/dist/html/default/volume-off.js +6 -0
  715. package/dist/dev/packages/icons/dist/html/default/volume-off.js.map +1 -0
  716. package/dist/dev/packages/icons/dist/html/minimal/captions-off.js +6 -0
  717. package/dist/dev/packages/icons/dist/html/minimal/captions-off.js.map +1 -0
  718. package/dist/dev/packages/icons/dist/html/minimal/captions-on.js +6 -0
  719. package/dist/dev/packages/icons/dist/html/minimal/captions-on.js.map +1 -0
  720. package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js +6 -0
  721. package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js.map +1 -0
  722. package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js +6 -0
  723. package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js.map +1 -0
  724. package/dist/dev/packages/icons/dist/html/minimal/check.js +6 -0
  725. package/dist/dev/packages/icons/dist/html/minimal/check.js.map +1 -0
  726. package/dist/dev/packages/icons/dist/html/minimal/chevron.js +6 -0
  727. package/dist/dev/packages/icons/dist/html/minimal/chevron.js.map +1 -0
  728. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js +6 -0
  729. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
  730. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js +6 -0
  731. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
  732. package/dist/dev/packages/icons/dist/html/minimal/index.d.ts +23 -0
  733. package/dist/dev/packages/icons/dist/html/minimal/index.d.ts.map +1 -0
  734. package/dist/dev/packages/icons/dist/html/minimal/pause.js +6 -0
  735. package/dist/dev/packages/icons/dist/html/minimal/pause.js.map +1 -0
  736. package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js +6 -0
  737. package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js.map +1 -0
  738. package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js +6 -0
  739. package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js.map +1 -0
  740. package/dist/dev/packages/icons/dist/html/minimal/play.js +6 -0
  741. package/dist/dev/packages/icons/dist/html/minimal/play.js.map +1 -0
  742. package/dist/dev/packages/icons/dist/html/minimal/restart.js +6 -0
  743. package/dist/dev/packages/icons/dist/html/minimal/restart.js.map +1 -0
  744. package/dist/dev/packages/icons/dist/html/minimal/seek.js +6 -0
  745. package/dist/dev/packages/icons/dist/html/minimal/seek.js.map +1 -0
  746. package/dist/dev/packages/icons/dist/html/minimal/spinner.js +6 -0
  747. package/dist/dev/packages/icons/dist/html/minimal/spinner.js.map +1 -0
  748. package/dist/dev/packages/icons/dist/html/minimal/volume-high.js +6 -0
  749. package/dist/dev/packages/icons/dist/html/minimal/volume-high.js.map +1 -0
  750. package/dist/dev/packages/icons/dist/html/minimal/volume-low.js +6 -0
  751. package/dist/dev/packages/icons/dist/html/minimal/volume-low.js.map +1 -0
  752. package/dist/dev/packages/icons/dist/html/minimal/volume-off.js +6 -0
  753. package/dist/dev/packages/icons/dist/html/minimal/volume-off.js.map +1 -0
  754. package/dist/dev/packages/icons/dist/render/default/index.js +32 -0
  755. package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -0
  756. package/dist/dev/packages/icons/dist/render/minimal/index.js +32 -0
  757. package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -0
  758. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/audio.tailwind.js +3 -2
  759. package/dist/dev/packages/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -0
  760. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/buffering.js +1 -1
  761. package/dist/dev/packages/skins/dist/default/default/tailwind/components/buffering.js.map +1 -0
  762. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  763. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +13 -0
  764. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -0
  765. package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js +7 -0
  766. package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js.map +1 -0
  767. package/dist/dev/packages/skins/dist/default/default/tailwind/components/error.js.map +1 -0
  768. package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js +9 -0
  769. package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js.map +1 -0
  770. package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
  771. package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
  772. package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js +12 -0
  773. package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
  774. package/dist/dev/packages/skins/dist/default/default/tailwind/components/overlay.js.map +1 -0
  775. package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js +6 -0
  776. package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -0
  777. package/dist/dev/packages/skins/dist/default/default/tailwind/components/popup.js.map +1 -0
  778. package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  779. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/preview.js +1 -1
  780. package/dist/dev/packages/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  781. package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js +7 -0
  782. package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
  783. package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js +8 -0
  784. package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js.map +1 -0
  785. package/dist/dev/packages/skins/dist/default/default/tailwind/components/seek.js.map +1 -0
  786. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/slider.js +1 -1
  787. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -0
  788. package/dist/dev/packages/skins/dist/default/default/tailwind/components/surface.js.map +1 -0
  789. package/dist/dev/packages/skins/dist/default/default/tailwind/components/time.js.map +1 -0
  790. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/video.tailwind.js +13 -4
  791. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -0
  792. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
  793. package/dist/dev/packages/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -0
  794. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/buffering.js +1 -1
  795. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -0
  796. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -0
  797. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js +13 -0
  798. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js.map +1 -0
  799. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js +7 -0
  800. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -0
  801. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  802. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js +9 -0
  803. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -0
  804. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
  805. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
  806. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
  807. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
  808. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -0
  809. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  810. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  811. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -0
  812. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  813. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/preview.js +1 -1
  814. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  815. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
  816. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
  817. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js +8 -0
  818. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js.map +1 -0
  819. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -0
  820. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/slider.js +1 -1
  821. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -0
  822. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/time.js.map +1 -0
  823. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/video.tailwind.js +6 -4
  824. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -0
  825. package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  826. package/dist/dev/player/context.d.ts +2 -1
  827. package/dist/dev/player/context.d.ts.map +1 -1
  828. package/dist/dev/player/context.js.map +1 -1
  829. package/dist/dev/presets/live-audio.d.ts +2 -1
  830. package/dist/dev/presets/live-audio.js +2 -1
  831. package/dist/dev/presets/live-video.d.ts +2 -1
  832. package/dist/dev/presets/live-video.js +2 -1
  833. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  834. package/dist/dev/store/provider-mixin.js +8 -3
  835. package/dist/dev/store/provider-mixin.js.map +1 -1
  836. package/dist/dev/ui/controls/controls-element.d.ts.map +1 -1
  837. package/dist/dev/ui/controls/controls-element.js +13 -1
  838. package/dist/dev/ui/controls/controls-element.js.map +1 -1
  839. package/dist/dev/ui/gesture/gesture-element.js +2 -1
  840. package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
  841. package/dist/dev/ui/hotkey/hotkey-element.js +1 -0
  842. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
  843. package/dist/dev/ui/input-indicators/input-indicator-element.d.ts +37 -0
  844. package/dist/dev/ui/input-indicators/input-indicator-element.d.ts.map +1 -0
  845. package/dist/dev/ui/input-indicators/input-indicator-element.js +110 -0
  846. package/dist/dev/ui/input-indicators/input-indicator-element.js.map +1 -0
  847. package/dist/dev/ui/input-indicators/live-indicator.d.ts +18 -0
  848. package/dist/dev/ui/input-indicators/live-indicator.d.ts.map +1 -0
  849. package/dist/dev/ui/input-indicators/live-indicator.js +32 -0
  850. package/dist/dev/ui/input-indicators/live-indicator.js.map +1 -0
  851. package/dist/dev/ui/live-button/live-button-element.d.ts +38 -0
  852. package/dist/dev/ui/live-button/live-button-element.d.ts.map +1 -0
  853. package/dist/dev/ui/live-button/live-button-element.js +98 -0
  854. package/dist/dev/ui/live-button/live-button-element.js.map +1 -0
  855. package/dist/dev/ui/menu/context.d.ts +25 -0
  856. package/dist/dev/ui/menu/context.d.ts.map +1 -0
  857. package/dist/dev/ui/menu/context.js +10 -0
  858. package/dist/dev/ui/menu/context.js.map +1 -0
  859. package/dist/dev/ui/menu/menu-back-element.d.ts +20 -0
  860. package/dist/dev/ui/menu/menu-back-element.d.ts.map +1 -0
  861. package/dist/dev/ui/menu/menu-back-element.js +57 -0
  862. package/dist/dev/ui/menu/menu-back-element.js.map +1 -0
  863. package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts +24 -0
  864. package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts.map +1 -0
  865. package/dist/dev/ui/menu/menu-checkbox-item-element.js +78 -0
  866. package/dist/dev/ui/menu/menu-checkbox-item-element.js.map +1 -0
  867. package/dist/dev/ui/menu/menu-element.d.ts +52 -0
  868. package/dist/dev/ui/menu/menu-element.d.ts.map +1 -0
  869. package/dist/dev/ui/menu/menu-element.js +285 -0
  870. package/dist/dev/ui/menu/menu-element.js.map +1 -0
  871. package/dist/dev/ui/menu/menu-group-element.d.ts +18 -0
  872. package/dist/dev/ui/menu/menu-group-element.d.ts.map +1 -0
  873. package/dist/dev/ui/menu/menu-group-element.js +35 -0
  874. package/dist/dev/ui/menu/menu-group-element.js.map +1 -0
  875. package/dist/dev/ui/menu/menu-item-element.d.ts +25 -0
  876. package/dist/dev/ui/menu/menu-item-element.d.ts.map +1 -0
  877. package/dist/dev/ui/menu/menu-item-element.js +96 -0
  878. package/dist/dev/ui/menu/menu-item-element.js.map +1 -0
  879. package/dist/dev/ui/menu/menu-item-indicator-element.d.ts +22 -0
  880. package/dist/dev/ui/menu/menu-item-indicator-element.d.ts.map +1 -0
  881. package/dist/dev/ui/menu/menu-item-indicator-element.js +34 -0
  882. package/dist/dev/ui/menu/menu-item-indicator-element.js.map +1 -0
  883. package/dist/dev/ui/menu/menu-label-element.d.ts +15 -0
  884. package/dist/dev/ui/menu/menu-label-element.d.ts.map +1 -0
  885. package/dist/dev/ui/menu/menu-label-element.js +20 -0
  886. package/dist/dev/ui/menu/menu-label-element.js.map +1 -0
  887. package/dist/dev/ui/menu/menu-radio-group-element.d.ts +22 -0
  888. package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -0
  889. package/dist/dev/ui/menu/menu-radio-group-element.js +51 -0
  890. package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -0
  891. package/dist/dev/ui/menu/menu-radio-item-element.d.ts +24 -0
  892. package/dist/dev/ui/menu/menu-radio-item-element.d.ts.map +1 -0
  893. package/dist/dev/ui/menu/menu-radio-item-element.js +84 -0
  894. package/dist/dev/ui/menu/menu-radio-item-element.js.map +1 -0
  895. package/dist/dev/ui/menu/menu-separator-element.d.ts +12 -0
  896. package/dist/dev/ui/menu/menu-separator-element.d.ts.map +1 -0
  897. package/dist/dev/ui/menu/menu-separator-element.js +24 -0
  898. package/dist/dev/ui/menu/menu-separator-element.js.map +1 -0
  899. package/dist/dev/ui/menu/menu-view-element.d.ts +11 -0
  900. package/dist/dev/ui/menu/menu-view-element.d.ts.map +1 -0
  901. package/dist/dev/ui/menu/menu-view-element.js +16 -0
  902. package/dist/dev/ui/menu/menu-view-element.js.map +1 -0
  903. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts +53 -0
  904. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts.map +1 -0
  905. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js +48 -0
  906. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
  907. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts +35 -0
  908. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts.map +1 -0
  909. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +86 -0
  910. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
  911. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts +31 -0
  912. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts.map +1 -0
  913. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js +114 -0
  914. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
  915. package/dist/dev/ui/popover/popover-element.d.ts +6 -0
  916. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  917. package/dist/dev/ui/popover/popover-element.js +30 -9
  918. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  919. package/dist/dev/ui/position-controller.js +11 -6
  920. package/dist/dev/ui/position-controller.js.map +1 -1
  921. package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts +25 -0
  922. package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts.map +1 -0
  923. package/dist/dev/ui/seek-indicator/seek-indicator-element.js +44 -0
  924. package/dist/dev/ui/seek-indicator/seek-indicator-element.js.map +1 -0
  925. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts +9 -0
  926. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts.map +1 -0
  927. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js +11 -0
  928. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
  929. package/dist/dev/ui/status-announcer/status-announcer-element.d.ts +23 -0
  930. package/dist/dev/ui/status-announcer/status-announcer-element.d.ts.map +1 -0
  931. package/dist/dev/ui/status-announcer/status-announcer-element.js +70 -0
  932. package/dist/dev/ui/status-announcer/status-announcer-element.js.map +1 -0
  933. package/dist/dev/ui/status-indicator/status-indicator-element.d.ts +29 -0
  934. package/dist/dev/ui/status-indicator/status-indicator-element.d.ts.map +1 -0
  935. package/dist/dev/ui/status-indicator/status-indicator-element.js +53 -0
  936. package/dist/dev/ui/status-indicator/status-indicator-element.js.map +1 -0
  937. package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts +9 -0
  938. package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts.map +1 -0
  939. package/dist/dev/ui/status-indicator/status-indicator-value-element.js +11 -0
  940. package/dist/dev/ui/status-indicator/status-indicator-value-element.js.map +1 -0
  941. package/dist/dev/ui/tooltip/tooltip-element.d.ts +6 -0
  942. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  943. package/dist/dev/ui/tooltip/tooltip-element.js +27 -8
  944. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  945. package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts +25 -0
  946. package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts.map +1 -0
  947. package/dist/dev/ui/volume-indicator/volume-indicator-element.js +46 -0
  948. package/dist/dev/ui/volume-indicator/volume-indicator-element.js.map +1 -0
  949. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts +9 -0
  950. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts.map +1 -0
  951. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
  952. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
  953. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts +9 -0
  954. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts.map +1 -0
  955. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js +11 -0
  956. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
  957. package/docs/README.md +7 -0
  958. package/docs/concepts/accessibility.md +60 -0
  959. package/docs/concepts/browser-support.md +37 -0
  960. package/docs/concepts/features.md +129 -0
  961. package/docs/concepts/overview.md +118 -0
  962. package/docs/concepts/presets.md +207 -0
  963. package/docs/concepts/skins.md +2006 -0
  964. package/docs/concepts/ui-components.md +59 -0
  965. package/docs/concepts/v10-roadmap.md +75 -0
  966. package/docs/concepts/why-videojs.md +113 -0
  967. package/docs/how-to/build-with-ai.md +39 -0
  968. package/docs/how-to/build-your-own-component.md +217 -0
  969. package/docs/how-to/customize-skins.md +5711 -0
  970. package/docs/how-to/installation.md +172 -0
  971. package/docs/llms.txt +88 -0
  972. package/docs/reference/buffering-indicator.md +152 -0
  973. package/docs/reference/captions-button.md +216 -0
  974. package/docs/reference/container-mixin.md +69 -0
  975. package/docs/reference/controls.md +248 -0
  976. package/docs/reference/create-selector.md +59 -0
  977. package/docs/reference/feature-buffer.md +52 -0
  978. package/docs/reference/feature-controls.md +70 -0
  979. package/docs/reference/feature-error.md +60 -0
  980. package/docs/reference/feature-fullscreen.md +90 -0
  981. package/docs/reference/feature-live.md +60 -0
  982. package/docs/reference/feature-pip.md +90 -0
  983. package/docs/reference/feature-playback-rate.md +70 -0
  984. package/docs/reference/feature-playback.md +110 -0
  985. package/docs/reference/feature-remote-playback.md +70 -0
  986. package/docs/reference/feature-source.md +70 -0
  987. package/docs/reference/feature-stream-type.md +46 -0
  988. package/docs/reference/feature-text-tracks.md +100 -0
  989. package/docs/reference/feature-time.md +80 -0
  990. package/docs/reference/feature-volume.md +90 -0
  991. package/docs/reference/fullscreen-button.md +229 -0
  992. package/docs/reference/html-create-player.md +449 -0
  993. package/docs/reference/media-attach-mixin.md +83 -0
  994. package/docs/reference/mute-button.md +301 -0
  995. package/docs/reference/pip-button.md +229 -0
  996. package/docs/reference/play-button.md +251 -0
  997. package/docs/reference/playback-rate-button.md +170 -0
  998. package/docs/reference/player-container.md +126 -0
  999. package/docs/reference/player-context.md +50 -0
  1000. package/docs/reference/player-controller.md +276 -0
  1001. package/docs/reference/player-provider.md +114 -0
  1002. package/docs/reference/popover.md +460 -0
  1003. package/docs/reference/poster.md +158 -0
  1004. package/docs/reference/provider-mixin.md +71 -0
  1005. package/docs/reference/seek-button.md +223 -0
  1006. package/docs/reference/slider.md +862 -0
  1007. package/docs/reference/snapshot-controller.md +208 -0
  1008. package/docs/reference/store-controller.md +180 -0
  1009. package/docs/reference/thumbnail.md +364 -0
  1010. package/docs/reference/time-slider.md +794 -0
  1011. package/docs/reference/time.md +488 -0
  1012. package/docs/reference/tooltip.md +547 -0
  1013. package/docs/reference/volume-slider.md +783 -0
  1014. package/package.json +23 -10
  1015. package/cdn/compounds-BHHGcL_P.js.map +0 -1
  1016. package/cdn/compounds-DJyzXLOB.js +0 -8
  1017. package/cdn/compounds-DJyzXLOB.js.map +0 -1
  1018. package/cdn/create-player-B-gVAMdr.js.map +0 -1
  1019. package/cdn/create-player-C5ui1T2i.js +0 -7
  1020. package/cdn/create-player-C5ui1T2i.js.map +0 -1
  1021. package/cdn/default-Djy9PEXm.js +0 -2
  1022. package/cdn/default-Djy9PEXm.js.map +0 -1
  1023. package/cdn/default-YzaLyoYg.js +0 -30
  1024. package/cdn/default-YzaLyoYg.js.map +0 -1
  1025. package/cdn/hls-DEP0AzDp.js.map +0 -1
  1026. package/cdn/hls-DR-Xxpxv.js.map +0 -1
  1027. package/cdn/hotkey-element-BvI78DTc.js +0 -2
  1028. package/cdn/hotkey-element-BvI78DTc.js.map +0 -1
  1029. package/cdn/hotkey-element-oEdY8YLl.js.map +0 -1
  1030. package/cdn/minimal-CciG7Fsu.js +0 -30
  1031. package/cdn/minimal-CciG7Fsu.js.map +0 -1
  1032. package/cdn/minimal-DSLrhnDm.js +0 -2
  1033. package/cdn/minimal-DSLrhnDm.js.map +0 -1
  1034. package/cdn/minimal-ui-Bx-_SggT.js +0 -29
  1035. package/cdn/minimal-ui-Bx-_SggT.js.map +0 -1
  1036. package/cdn/minimal-ui-CFO4ssL8.js +0 -2
  1037. package/cdn/minimal-ui-CFO4ssL8.js.map +0 -1
  1038. package/cdn/minimal-ui-D6Pvbx1R.js +0 -2
  1039. package/cdn/minimal-ui-D6Pvbx1R.js.map +0 -1
  1040. package/cdn/minimal-ui-Dl-8ZL53.js +0 -22
  1041. package/cdn/minimal-ui-Dl-8ZL53.js.map +0 -1
  1042. package/cdn/player-BKKCelEs.js +0 -2
  1043. package/cdn/player-BKKCelEs.js.map +0 -1
  1044. package/cdn/player-C_6YjMl7.js.map +0 -1
  1045. package/cdn/player-CtegNw3g.js +0 -2
  1046. package/cdn/predicate-BOcV_HDG.js.map +0 -1
  1047. package/cdn/predicate-Cad5WV4q.js.map +0 -1
  1048. package/cdn/skin-element-BcbrkgGs.js +0 -55
  1049. package/cdn/skin-element-BcbrkgGs.js.map +0 -1
  1050. package/cdn/skin-element-DesLkJKs.js +0 -2
  1051. package/cdn/skin-element-DesLkJKs.js.map +0 -1
  1052. package/cdn/ui-CzxKbsyb.js +0 -32
  1053. package/cdn/ui-CzxKbsyb.js.map +0 -1
  1054. package/cdn/ui-D6DV-Emw.js +0 -2
  1055. package/cdn/ui-D6DV-Emw.js.map +0 -1
  1056. package/cdn/ui-Dw-n2AMs.js +0 -2
  1057. package/cdn/ui-Dw-n2AMs.js.map +0 -1
  1058. package/cdn/ui-S_eLj4ur.js +0 -25
  1059. package/cdn/ui-S_eLj4ur.js.map +0 -1
  1060. package/dist/default/_virtual/inline-css_src/define/base.js +0 -6
  1061. package/dist/default/_virtual/inline-css_src/define/base.js.map +0 -1
  1062. package/dist/dev/_virtual/inline-css_src/define/base.js +0 -6
  1063. package/dist/dev/_virtual/inline-css_src/define/base.js.map +0 -1
  1064. package/dist/dev/icons/dist/render/default/index.js +0 -30
  1065. package/dist/dev/icons/dist/render/default/index.js.map +0 -1
  1066. package/dist/dev/icons/dist/render/minimal/index.js +0 -30
  1067. package/dist/dev/icons/dist/render/minimal/index.js.map +0 -1
  1068. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +0 -1
  1069. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +0 -1
  1070. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js.map +0 -1
  1071. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +0 -12
  1072. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +0 -1
  1073. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +0 -7
  1074. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +0 -1
  1075. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +0 -1
  1076. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +0 -9
  1077. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +0 -1
  1078. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +0 -1
  1079. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +0 -6
  1080. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +0 -1
  1081. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +0 -1
  1082. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +0 -1
  1083. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +0 -1
  1084. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +0 -7
  1085. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +0 -1
  1086. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +0 -1
  1087. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +0 -1
  1088. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +0 -1
  1089. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +0 -1
  1090. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +0 -1
  1091. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +0 -1
  1092. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +0 -1
  1093. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +0 -1
  1094. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +0 -12
  1095. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +0 -1
  1096. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +0 -7
  1097. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +0 -1
  1098. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +0 -1
  1099. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +0 -9
  1100. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +0 -1
  1101. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +0 -1
  1102. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +0 -6
  1103. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +0 -1
  1104. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +0 -1
  1105. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +0 -1
  1106. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +0 -1
  1107. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +0 -7
  1108. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +0 -1
  1109. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +0 -1
  1110. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +0 -1
  1111. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +0 -1
  1112. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +0 -1
  1113. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +0 -1
  1114. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/button-group.js +0 -0
  1115. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/error.js +0 -0
  1116. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/overlay.js +0 -0
  1117. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/popup.js +0 -0
  1118. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/poster.js +0 -0
  1119. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/seek.js +0 -0
  1120. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/surface.js +0 -0
  1121. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/time.js +0 -0
  1122. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/button-group.js +0 -0
  1123. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/error.js +0 -0
  1124. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/overlay.js +0 -0
  1125. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/popup.js +0 -0
  1126. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/poster.js +0 -0
  1127. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/seek.js +0 -0
  1128. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/time.js +0 -0
  1129. /package/dist/dev/{skins → packages/skins}/dist/default/shared/tailwind/icon-state.js +0 -0
@@ -1,7 +1,7 @@
1
- import { A as MediaElement, C as isMediaStreamTypeCapable, D as throwNoTargetError, E as noop, F as isInteractiveActivation, M as ContextConsumer, O as AbortControllerRegistry, P as isEditableTarget, S as isMediaSeekCapable, T as createState, _ as errorFeature, b as bufferFeature, c as timeFeature, d as remotePlaybackFeature, f as playbackRateFeature, g as fullscreenFeature, h as liveFeature, j as ContextProvider, l as textTrackFeature, m as pipFeature, n as PlayerController, p as playbackFeature, r as SnapshotController, s as volumeFeature, u as sourceFeature, v as controlsFeature, w as definePlayerFeature, x as isMediaBufferCapable } from "./create-player-B-gVAMdr.js";
1
+ import { C as isMediaSeekCapable, D as noop, E as createState, F as isEditableTarget, I as isInteractiveActivation, M as ContextProvider, N as ContextConsumer, O as throwNoTargetError, S as isMediaBufferCapable, T as definePlayerFeature, _ as fullscreenFeature, b as getGestureCoordinator, c as volumeFeature, d as sourceFeature, f as remotePlaybackFeature, g as liveFeature, h as pipFeature, j as MediaElement, k as AbortControllerRegistry, l as timeFeature, m as playbackFeature, n as PlayerController, p as playbackRateFeature, r as SnapshotController, u as textTrackFeature, v as errorFeature, w as isMediaStreamTypeCapable, x as bufferFeature, y as controlsFeature } from "./create-player-_WED6HtK.js";
2
2
  import { t as listen } from "./listen-CJT7C4kM.js";
3
3
  import { n as kebabCase, t as pick } from "./pick-D-wCJ3iA.js";
4
- import { a as isUndefined, c as playerContext, d as safeDefine, l as createContext, n as isNull, o as containerContext, r as isNumber, t as isFunction } from "./predicate-BOcV_HDG.js";
4
+ import { a as isString, f as safeDefine, l as playerContext, n as isNull, o as isUndefined, r as isNumber, s as containerContext, t as isFunction, u as createContext } from "./predicate-Dqd8wbW6.js";
5
5
  import { t as MediaStreamTypes } from "./types-B_4Es-UH.js";
6
6
 
7
7
  //#region ../utils/dist/dom/direction.js
@@ -75,12 +75,23 @@ function resolveCSSLength(el, value) {
75
75
 
76
76
  //#endregion
77
77
  //#region ../core/dist/dev/core/ui/transition.js
78
+ /** Shared data attributes for open/close transition state. Spread into component data-attrs objects. */
79
+ const TransitionDataAttrs = {
80
+ transitionStarting: "data-starting-style",
81
+ transitionEnding: "data-ending-style"
82
+ };
78
83
  function getTransitionFlags(status) {
79
84
  return {
80
85
  transitionStarting: status === "starting",
81
86
  transitionEnding: status === "ending"
82
87
  };
83
88
  }
89
+ function getTransitionStyleAttrs({ transitionStarting, transitionEnding }) {
90
+ return {
91
+ [TransitionDataAttrs.transitionStarting]: transitionStarting ? "" : void 0,
92
+ [TransitionDataAttrs.transitionEnding]: transitionEnding ? "" : void 0
93
+ };
94
+ }
84
95
 
85
96
  //#endregion
86
97
  //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-core.js
@@ -127,8 +138,7 @@ var AlertDialogCore = class {
127
138
  //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-data-attrs.js
128
139
  const AlertDialogDataAttrs = {
129
140
  open: "data-open",
130
- transitionStarting: "data-starting-style",
131
- transitionEnding: "data-ending-style"
141
+ ...TransitionDataAttrs
132
142
  };
133
143
 
134
144
  //#endregion
@@ -265,152 +275,757 @@ var ErrorDialogCore = class extends AlertDialogCore {
265
275
  };
266
276
 
267
277
  //#endregion
268
- //#region ../core/dist/dev/core/ui/mute-button/mute-button-core.js
269
- var MuteButtonCore = class MuteButtonCore {
270
- static defaultProps = {
271
- label: "",
272
- disabled: false
273
- };
274
- state = createState({
275
- muted: false,
276
- volumeLevel: "off",
277
- label: ""
278
- });
279
- #props = { ...MuteButtonCore.defaultProps };
280
- #media = null;
281
- constructor(props) {
282
- if (props) this.setProps(props);
278
+ //#region ../core/dist/dev/core/ui/input-feedback/indicator-lifecycle.js
279
+ var IndicatorCloseController = class {
280
+ #timer = null;
281
+ #close;
282
+ #getDelay;
283
+ constructor(close, getDelay) {
284
+ this.#close = close;
285
+ this.#getDelay = getDelay;
286
+ }
287
+ arm() {
288
+ this.clear();
289
+ this.#timer = setTimeout(() => {
290
+ this.#timer = null;
291
+ this.#close();
292
+ }, this.#getDelay());
293
+ }
294
+ clear() {
295
+ if (this.#timer === null) return;
296
+ clearTimeout(this.#timer);
297
+ this.#timer = null;
298
+ }
299
+ close() {
300
+ this.clear();
301
+ this.#close();
283
302
  }
284
- setProps(props) {
285
- this.#props = defaults(props, MuteButtonCore.defaultProps);
303
+ destroy() {
304
+ this.clear();
286
305
  }
287
- getLabel(state) {
288
- const { label } = this.#props;
289
- if (isFunction(label)) {
290
- const customLabel = label(state);
291
- if (customLabel) return customLabel;
292
- } else if (label) return label;
293
- return state.muted ? "Unmute" : "Mute";
306
+ };
307
+ var IndicatorVisibilityCoordinator = class {
308
+ #handles = /* @__PURE__ */ new Set();
309
+ register(handle) {
310
+ this.#handles.add(handle);
311
+ return () => this.#handles.delete(handle);
294
312
  }
295
- getAttrs(state) {
313
+ show(handle) {
314
+ for (const nextHandle of this.#handles) if (nextHandle !== handle) nextHandle.close();
315
+ }
316
+ };
317
+ function getIndicatorCloseDelay(props) {
318
+ return props.closeDelay ?? 800;
319
+ }
320
+ function isIndicatorPresent(current, transition) {
321
+ return current.open || transition.active;
322
+ }
323
+ function getRenderedIndicatorState(current, snapshot, transition) {
324
+ const payload = current.open ? current : snapshot;
325
+ return {
326
+ ...payload,
327
+ open: current.open && transition.active,
328
+ generation: current.open ? current.generation : payload.generation,
329
+ ...getTransitionFlags(transition.status)
330
+ };
331
+ }
332
+
333
+ //#endregion
334
+ //#region ../utils/dist/number/number.js
335
+ /** Clamp a value between min and max (inclusive). */
336
+ function clamp(value, min, max) {
337
+ return Math.max(min, Math.min(max, value));
338
+ }
339
+ /** Snap a value to the nearest step, offset from min. */
340
+ function roundToStep(value, step, min) {
341
+ const nearest = Math.round((value - min) / step) * step + min;
342
+ const dot = `${step}`.indexOf(".");
343
+ return dot === -1 ? nearest : Number(nearest.toFixed(`${step}`.length - dot - 1));
344
+ }
345
+
346
+ //#endregion
347
+ //#region ../utils/dist/time/format.js
348
+ const UNIT_LABELS = [
349
+ {
350
+ singular: "hour",
351
+ plural: "hours"
352
+ },
353
+ {
354
+ singular: "minute",
355
+ plural: "minutes"
356
+ },
357
+ {
358
+ singular: "second",
359
+ plural: "seconds"
360
+ }
361
+ ];
362
+ function isValidTime(value) {
363
+ return isNumber(value) && Number.isFinite(value);
364
+ }
365
+ function toTimeUnitPhrase(value, unitIndex) {
366
+ return `${value} ${value === 1 ? UNIT_LABELS[unitIndex]?.singular : UNIT_LABELS[unitIndex]?.plural}`;
367
+ }
368
+ /**
369
+ * Format seconds to digital display string.
370
+ *
371
+ * @param seconds - Time in seconds (can be negative)
372
+ * @param guide - Guide time (typically duration) to determine display format
373
+ * @returns Formatted string like "1:30" or "1:05:30"
374
+ *
375
+ * @example
376
+ * formatTime(90) // "1:30"
377
+ * formatTime(3661) // "1:01:01"
378
+ * formatTime(35, 3600) // "0:00:35" (guided by 1-hour duration)
379
+ * formatTime(35, 600) // "00:35" (guided by 10-minute duration)
380
+ */
381
+ function formatTime(seconds, guide) {
382
+ if (!isValidTime(seconds)) return "0:00";
383
+ const negative = seconds < 0;
384
+ const positiveSeconds = Math.abs(seconds);
385
+ const h = Math.floor(positiveSeconds / 3600);
386
+ const m = Math.floor(positiveSeconds / 60 % 60);
387
+ const s = Math.floor(positiveSeconds % 60);
388
+ const guideAbs = guide ? Math.abs(guide) : 0;
389
+ const gh = Math.floor(guideAbs / 3600);
390
+ const gm = Math.floor(guideAbs / 60 % 60);
391
+ const showHours = h > 0 || gh > 0;
392
+ const padMinutes = showHours || gm >= 10;
393
+ const hoursStr = showHours ? `${h}:` : "";
394
+ const minutesStr = `${padMinutes && m < 10 ? "0" : ""}${m}:`;
395
+ const secondsStr = s < 10 ? `0${s}` : `${s}`;
396
+ return `${negative ? "-" : ""}${hoursStr}${minutesStr}${secondsStr}`;
397
+ }
398
+ /**
399
+ * Format seconds to human-readable phrase for screen readers.
400
+ *
401
+ * @param seconds - Time in seconds (negative indicates remaining)
402
+ * @returns Human-readable phrase like "1 minute, 30 seconds"
403
+ *
404
+ * @example
405
+ * formatTimeAsPhrase(90) // "1 minute, 30 seconds"
406
+ * formatTimeAsPhrase(3661) // "1 hour, 1 minute, 1 second"
407
+ * formatTimeAsPhrase(-270) // "4 minutes, 30 seconds remaining"
408
+ */
409
+ function formatTimeAsPhrase(seconds) {
410
+ if (!isValidTime(seconds)) return "";
411
+ const negative = seconds < 0;
412
+ const positiveSeconds = Math.abs(seconds);
413
+ const h = Math.floor(positiveSeconds / 3600);
414
+ const m = Math.floor(positiveSeconds / 60 % 60);
415
+ const s = Math.floor(positiveSeconds % 60);
416
+ if (positiveSeconds === 0) return `${toTimeUnitPhrase(0, 2)}${negative ? " remaining" : ""}`;
417
+ return `${[
418
+ h,
419
+ m,
420
+ s
421
+ ].map((value, index) => value > 0 ? toTimeUnitPhrase(value, index) : null).filter(Boolean).join(", ")}${negative ? " remaining" : ""}`;
422
+ }
423
+ /**
424
+ * Convert seconds to ISO 8601 duration for datetime attribute.
425
+ *
426
+ * @param seconds - Time in seconds
427
+ * @returns ISO 8601 duration string like "PT1M30S"
428
+ *
429
+ * @example
430
+ * secondsToIsoDuration(90) // "PT1M30S"
431
+ * secondsToIsoDuration(3661) // "PT1H1M1S"
432
+ */
433
+ function secondsToIsoDuration(seconds) {
434
+ if (!isValidTime(seconds)) return "PT0S";
435
+ const positiveSeconds = Math.abs(seconds);
436
+ const h = Math.floor(positiveSeconds / 3600);
437
+ const m = Math.floor(positiveSeconds / 60 % 60);
438
+ const s = Math.floor(positiveSeconds % 60);
439
+ let duration = "PT";
440
+ if (h > 0) duration += `${h}H`;
441
+ if (m > 0) duration += `${m}M`;
442
+ if (s > 0 || duration === "PT") duration += `${s}S`;
443
+ return duration;
444
+ }
445
+
446
+ //#endregion
447
+ //#region ../core/dist/dev/core/ui/input-feedback/status.js
448
+ const DEFAULT_INPUT_INDICATOR_LABELS = {
449
+ muted: "Muted",
450
+ volume: "Volume",
451
+ captionsOn: "Captions on",
452
+ captionsOff: "Captions off",
453
+ paused: "Paused",
454
+ playing: "Playing",
455
+ fullscreen: "Fullscreen",
456
+ exitFullscreen: "Exit fullscreen",
457
+ pictureInPicture: "Picture in picture",
458
+ exitPictureInPicture: "Exit picture in picture"
459
+ };
460
+ function isVolumeIndicatorAction(action) {
461
+ return action === "toggleMuted" || action === "volumeStep";
462
+ }
463
+ function isSeekIndicatorAction(action) {
464
+ return action === "seekStep" || action === "seekToPercent";
465
+ }
466
+ function deriveStatus(event, snapshot, labels = DEFAULT_INPUT_INDICATOR_LABELS) {
467
+ switch (event.action) {
468
+ case "togglePaused": {
469
+ const paused = snapshot.paused !== void 0 ? !snapshot.paused : true;
470
+ return {
471
+ status: paused ? "pause" : "play",
472
+ label: paused ? labels.paused : labels.playing,
473
+ value: null,
474
+ volumeLevel: null
475
+ };
476
+ }
477
+ case "toggleMuted":
478
+ case "volumeStep": return deriveVolumeStatus(event, snapshot, labels);
479
+ case "toggleSubtitles": {
480
+ const showing = snapshot.subtitlesShowing !== void 0 ? !snapshot.subtitlesShowing : true;
481
+ return {
482
+ status: showing ? "captions-on" : "captions-off",
483
+ label: showing ? labels.captionsOn : labels.captionsOff,
484
+ value: null,
485
+ volumeLevel: null
486
+ };
487
+ }
488
+ case "toggleFullscreen": {
489
+ const fullscreen = snapshot.fullscreen !== void 0 ? !snapshot.fullscreen : true;
490
+ return {
491
+ status: fullscreen ? "fullscreen" : "exit-fullscreen",
492
+ label: fullscreen ? labels.fullscreen : labels.exitFullscreen,
493
+ value: null,
494
+ volumeLevel: null
495
+ };
496
+ }
497
+ case "togglePictureInPicture": {
498
+ const pip = snapshot.pip !== void 0 ? !snapshot.pip : true;
499
+ return {
500
+ status: pip ? "pip" : "exit-pip",
501
+ label: pip ? labels.pictureInPicture : labels.exitPictureInPicture,
502
+ value: null,
503
+ volumeLevel: null
504
+ };
505
+ }
506
+ default: return null;
507
+ }
508
+ }
509
+ function deriveAnnouncerLabel(event, snapshot, labels = DEFAULT_INPUT_INDICATOR_LABELS) {
510
+ const details = deriveStatus(event, snapshot, labels);
511
+ if (!details) return null;
512
+ if (isVolumeIndicatorAction(event.action)) return details.status === "volume-off" ? labels.muted : `${labels.volume} ${details.value}`;
513
+ return details.label;
514
+ }
515
+ function getVolumeLevel$1(volume) {
516
+ if (volume <= 0) return "off";
517
+ return volume <= .5 ? "low" : "high";
518
+ }
519
+ function formatVolumeValue(volume) {
520
+ return `${Math.round(clamp(volume, 0, 1) * 100)}%`;
521
+ }
522
+ function formatCurrentTime(snapshot) {
523
+ return formatTime(snapshot.currentTime ?? 0, snapshot.duration);
524
+ }
525
+ function getStatusIndicatorDisplayValue(state) {
526
+ return state.value ?? state.label ?? "";
527
+ }
528
+ function getVolumeIndicatorDisplayValue(state) {
529
+ return state.value ?? "";
530
+ }
531
+ function getSeekIndicatorDisplayValue(state) {
532
+ return state.value ?? state.currentTime;
533
+ }
534
+ function getSeekToPercent(event) {
535
+ if (event.value !== void 0) return clamp(event.value, 0, 100);
536
+ if (!event.key || event.key < "0" || event.key > "9") return null;
537
+ return Number(event.key) * 10;
538
+ }
539
+ function getSeekDirection(event, snapshot) {
540
+ if (event.action === "seekStep" && event.value !== void 0) {
541
+ if (event.value > 0) return "forward";
542
+ if (event.value < 0) return "backward";
543
+ }
544
+ if (event.action === "seekToPercent") {
545
+ const percent = getSeekToPercent(event);
546
+ if (percent === null || snapshot.duration === void 0 || snapshot.duration <= 0) return null;
547
+ const targetTime = percent / 100 * snapshot.duration;
548
+ const currentTime = snapshot.currentTime ?? 0;
549
+ if (targetTime > currentTime) return "forward";
550
+ if (targetTime < currentTime) return "backward";
551
+ }
552
+ return null;
553
+ }
554
+ function isInputActionIncluded(action, actions) {
555
+ if (!action) return false;
556
+ return !actions || actions.includes(action);
557
+ }
558
+ function predictVolumeActionOutcome(event, snapshot) {
559
+ const muted = snapshot.muted === true;
560
+ const snapshotVolume = snapshot.volume ?? 0;
561
+ if (event.action === "toggleMuted") return {
562
+ snapshotVolume,
563
+ nextMuted: !muted,
564
+ nextVolume: snapshotVolume
565
+ };
566
+ if (event.action === "volumeStep") {
567
+ const nextVolume = clamp(snapshotVolume + (event.value ?? 0), 0, 1);
296
568
  return {
297
- "aria-label": this.getLabel(state),
298
- "aria-disabled": this.#props.disabled ? "true" : void 0
569
+ snapshotVolume,
570
+ nextMuted: muted && nextVolume <= 0,
571
+ nextVolume
299
572
  };
300
573
  }
301
- setMedia(media) {
302
- this.#media = media;
303
- }
304
- getState() {
305
- const media = this.#media;
574
+ return {
575
+ snapshotVolume,
576
+ nextMuted: muted,
577
+ nextVolume: snapshotVolume
578
+ };
579
+ }
580
+ function volumePredictionToStatusDetails(prediction, labels) {
581
+ const level = prediction.nextMuted ? "off" : getVolumeLevel$1(prediction.nextVolume);
582
+ const value = prediction.nextMuted ? "0%" : formatVolumeValue(prediction.nextVolume);
583
+ return {
584
+ status: level === "off" ? "volume-off" : level === "low" ? "volume-low" : "volume-high",
585
+ label: level === "off" ? labels.muted : labels.volume,
586
+ value,
587
+ volumeLevel: level
588
+ };
589
+ }
590
+ /** Labels/value/level for volume actions — single source shared with `VolumeIndicatorCore`. */
591
+ function deriveVolumeStatus(event, snapshot, labels = DEFAULT_INPUT_INDICATOR_LABELS, cachedPrediction) {
592
+ return volumePredictionToStatusDetails(cachedPrediction ?? predictVolumeActionOutcome(event, snapshot), labels);
593
+ }
594
+
595
+ //#endregion
596
+ //#region ../core/dist/dev/core/ui/input-feedback/seek-indicator-core.js
597
+ const INITIAL_STATE$2 = {
598
+ open: false,
599
+ generation: 0,
600
+ direction: null,
601
+ count: 0,
602
+ seekTotal: 0,
603
+ value: null,
604
+ currentTime: "0:00",
605
+ transitionStarting: false,
606
+ transitionEnding: false
607
+ };
608
+ var SeekIndicatorCore = class {
609
+ state = createState({ ...INITIAL_STATE$2 });
610
+ #props = {};
611
+ #originTime = null;
612
+ #close = new IndicatorCloseController(() => {
613
+ this.#originTime = null;
306
614
  this.state.patch({
307
- muted: media.muted || media.volume === 0,
308
- volumeLevel: getVolumeLevel(media)
615
+ open: false,
616
+ direction: null,
617
+ count: 0,
618
+ seekTotal: 0,
619
+ value: null
309
620
  });
310
- this.state.patch({ label: this.getLabel(this.state.current) });
311
- return this.state.current;
621
+ }, () => getIndicatorCloseDelay(this.#props));
622
+ setProps(props) {
623
+ this.#props = props;
312
624
  }
313
- toggle(media) {
314
- if (this.#props.disabled) return;
315
- media.toggleMuted();
625
+ destroy() {
626
+ this.#close.destroy();
627
+ }
628
+ close() {
629
+ this.#close.close();
630
+ }
631
+ processEvent(event, snapshot) {
632
+ if (!isSeekIndicatorAction(event.action)) return false;
633
+ const current = this.state.current;
634
+ const direction = getSeekDirection(event, snapshot);
635
+ const rapidRepeat = current.open && event.action === "seekStep" && current.direction === direction;
636
+ if (!rapidRepeat) this.#originTime = snapshot.currentTime ?? null;
637
+ const value = this.#getEffectiveSeekValue(event, snapshot, rapidRepeat);
638
+ const seekTotal = rapidRepeat ? current.seekTotal + Math.abs(value) : Math.abs(value);
639
+ this.state.patch({
640
+ open: true,
641
+ generation: current.generation + 1,
642
+ direction,
643
+ count: rapidRepeat ? current.count + 1 : 1,
644
+ seekTotal,
645
+ value: event.action === "seekStep" && seekTotal > 0 ? `${seekTotal}s` : null,
646
+ currentTime: formatCurrentTime(snapshot)
647
+ });
648
+ this.#close.arm();
649
+ return true;
650
+ }
651
+ #getEffectiveSeekValue(event, snapshot, rapidRepeat) {
652
+ if (event.action !== "seekStep" || event.value === void 0) return 0;
653
+ if (!rapidRepeat || this.#originTime === null) return event.value;
654
+ const originTime = this.#originTime;
655
+ const duration = snapshot.duration ?? Infinity;
656
+ const currentTotal = this.state.current.seekTotal;
657
+ const step = Math.abs(event.value);
658
+ return (event.value < 0 ? Math.max(0, originTime - currentTotal) : Math.max(0, duration - originTime - currentTotal)) >= step ? event.value : 0;
316
659
  }
317
660
  };
318
- function getVolumeLevel(media) {
319
- if (media.muted || media.volume === 0) return "off";
320
- if (media.volume < .5) return "low";
321
- if (media.volume < .75) return "medium";
322
- return "high";
323
- }
324
661
 
325
662
  //#endregion
326
- //#region ../core/dist/dev/core/ui/mute-button/mute-button-data-attrs.js
327
- const MuteButtonDataAttrs = {
328
- muted: "data-muted",
329
- volumeLevel: "data-volume-level"
663
+ //#region ../core/dist/dev/core/ui/input-feedback/seek-indicator-data-attrs.js
664
+ const SeekIndicatorDataAttrs = {
665
+ open: "data-open",
666
+ direction: "data-direction",
667
+ transitionStarting: "data-starting-style",
668
+ transitionEnding: "data-ending-style"
330
669
  };
331
670
 
332
671
  //#endregion
333
- //#region ../core/dist/dev/core/ui/play-button/play-button-core.js
334
- var PlayButtonCore = class PlayButtonCore {
335
- static defaultProps = {
336
- label: "",
337
- disabled: false
338
- };
339
- state = createState({
340
- paused: true,
341
- ended: false,
342
- started: false,
343
- label: ""
344
- });
345
- #props = { ...PlayButtonCore.defaultProps };
346
- #media = null;
347
- constructor(props) {
348
- if (props) this.setProps(props);
349
- }
672
+ //#region ../core/dist/dev/core/ui/input-feedback/status-announcer-core.js
673
+ var StatusAnnouncerCore = class {
674
+ state = createState({ label: null });
675
+ #props = {};
676
+ #close = new IndicatorCloseController(() => this.state.patch({ label: null }), () => getIndicatorCloseDelay(this.#props));
350
677
  setProps(props) {
351
- this.#props = defaults(props, PlayButtonCore.defaultProps);
678
+ this.#props = props;
352
679
  }
353
- getLabel(state) {
354
- const { label } = this.#props;
355
- if (isFunction(label)) {
356
- const customLabel = label(state);
357
- if (customLabel) return customLabel;
358
- } else if (label) return label;
359
- if (state.ended) return "Replay";
360
- return state.paused ? "Play" : "Pause";
680
+ destroy() {
681
+ this.#close.destroy();
361
682
  }
362
- getAttrs(state) {
363
- return {
364
- "aria-label": this.getLabel(state),
365
- "aria-disabled": this.#props.disabled ? "true" : void 0
366
- };
683
+ processEvent(event, snapshot) {
684
+ const label = deriveAnnouncerLabel(event, snapshot, {
685
+ ...DEFAULT_INPUT_INDICATOR_LABELS,
686
+ ...this.#props.labels
687
+ });
688
+ if (!label) return false;
689
+ this.state.patch({ label });
690
+ this.#close.arm();
691
+ return true;
367
692
  }
368
- setMedia(media) {
693
+ };
694
+
695
+ //#endregion
696
+ //#region ../core/dist/dev/core/ui/input-feedback/status-indicator-core.js
697
+ const INITIAL_STATE$1 = {
698
+ open: false,
699
+ generation: 0,
700
+ status: null,
701
+ label: null,
702
+ value: null,
703
+ transitionStarting: false,
704
+ transitionEnding: false
705
+ };
706
+ var StatusIndicatorCore = class {
707
+ state = createState({ ...INITIAL_STATE$1 });
708
+ #props = {};
709
+ #close = new IndicatorCloseController(() => this.state.patch({
710
+ open: false,
711
+ status: null,
712
+ label: null,
713
+ value: null
714
+ }), () => getIndicatorCloseDelay(this.#props));
715
+ setProps(props) {
716
+ this.#props = props;
717
+ }
718
+ destroy() {
719
+ this.#close.destroy();
720
+ }
721
+ close() {
722
+ this.#close.close();
723
+ }
724
+ processEvent(event, snapshot) {
725
+ if (!isInputActionIncluded(event.action, this.#props.actions)) return false;
726
+ const details = deriveStatus(event, snapshot, {
727
+ ...DEFAULT_INPUT_INDICATOR_LABELS,
728
+ ...this.#props.labels
729
+ });
730
+ if (!details) return false;
731
+ this.state.patch({
732
+ open: true,
733
+ generation: this.state.current.generation + 1,
734
+ status: details.status,
735
+ label: details.label,
736
+ value: details.value
737
+ });
738
+ this.#close.arm();
739
+ return true;
740
+ }
741
+ };
742
+
743
+ //#endregion
744
+ //#region ../core/dist/dev/core/ui/input-feedback/status-indicator-data-attrs.js
745
+ const StatusIndicatorDataAttrs = {
746
+ open: "data-open",
747
+ status: "data-status",
748
+ transitionStarting: "data-starting-style",
749
+ transitionEnding: "data-ending-style"
750
+ };
751
+
752
+ //#endregion
753
+ //#region ../core/dist/dev/core/ui/input-feedback/volume-indicator-core.js
754
+ const BOUNDARY_CLEAR_DELAY = 300;
755
+ const INITIAL_STATE = {
756
+ open: false,
757
+ generation: 0,
758
+ level: null,
759
+ value: null,
760
+ fill: null,
761
+ min: false,
762
+ max: false,
763
+ transitionStarting: false,
764
+ transitionEnding: false
765
+ };
766
+ var VolumeIndicatorCore = class {
767
+ state = createState({ ...INITIAL_STATE });
768
+ #props = {};
769
+ #boundaryTimer = null;
770
+ #boundaryRestartTimer = null;
771
+ #close = new IndicatorCloseController(() => this.state.patch({
772
+ open: false,
773
+ level: null,
774
+ value: null,
775
+ fill: null,
776
+ min: false,
777
+ max: false
778
+ }), () => getIndicatorCloseDelay(this.#props));
779
+ setProps(props) {
780
+ this.#props = props;
781
+ }
782
+ destroy() {
783
+ this.#close.destroy();
784
+ this.#clearBoundaryTimers();
785
+ }
786
+ close() {
787
+ this.#clearBoundaryTimers();
788
+ this.#close.close();
789
+ }
790
+ processEvent(event, snapshot) {
791
+ if (!isVolumeIndicatorAction(event.action)) return false;
792
+ const current = this.state.current;
793
+ const prediction = predictVolumeActionOutcome(event, snapshot);
794
+ const details = deriveVolumeStatus(event, snapshot, DEFAULT_INPUT_INDICATOR_LABELS, prediction);
795
+ const boundary = getVolumeBoundary(event, prediction.snapshotVolume, prediction.nextVolume);
796
+ const repeatedBoundary = boundary !== null && current[boundary] === true;
797
+ if (!boundary) this.#clearBoundaryTimers();
798
+ this.state.patch({
799
+ open: true,
800
+ generation: current.generation + 1,
801
+ level: details.volumeLevel,
802
+ value: details.value,
803
+ fill: details.value,
804
+ min: boundary === "min" && !repeatedBoundary,
805
+ max: boundary === "max" && !repeatedBoundary
806
+ });
807
+ if (boundary) if (repeatedBoundary) this.#restartBoundary(boundary);
808
+ else this.#scheduleBoundaryClear();
809
+ this.#close.arm();
810
+ return true;
811
+ }
812
+ #scheduleBoundaryClear() {
813
+ this.#clearBoundaryTimer();
814
+ this.#boundaryTimer = setTimeout(() => {
815
+ this.#boundaryTimer = null;
816
+ this.state.patch({
817
+ min: false,
818
+ max: false
819
+ });
820
+ }, BOUNDARY_CLEAR_DELAY);
821
+ }
822
+ #restartBoundary(boundary) {
823
+ this.#clearBoundaryTimers();
824
+ this.state.patch({
825
+ min: false,
826
+ max: false
827
+ });
828
+ this.#boundaryRestartTimer = setTimeout(() => {
829
+ this.#boundaryRestartTimer = null;
830
+ this.state.patch({ [boundary]: true });
831
+ this.#scheduleBoundaryClear();
832
+ }, 0);
833
+ }
834
+ #clearBoundaryTimer() {
835
+ if (this.#boundaryTimer === null) return;
836
+ clearTimeout(this.#boundaryTimer);
837
+ this.#boundaryTimer = null;
838
+ }
839
+ #clearBoundaryRestartTimer() {
840
+ if (this.#boundaryRestartTimer === null) return;
841
+ clearTimeout(this.#boundaryRestartTimer);
842
+ this.#boundaryRestartTimer = null;
843
+ }
844
+ #clearBoundaryTimers() {
845
+ this.#clearBoundaryTimer();
846
+ this.#clearBoundaryRestartTimer();
847
+ }
848
+ };
849
+ function getVolumeBoundary(event, currentVolume, nextVolume) {
850
+ if (event.action !== "volumeStep" || event.value === void 0 || event.value === 0) return null;
851
+ if (nextVolume !== currentVolume) return null;
852
+ return event.value < 0 ? "min" : "max";
853
+ }
854
+
855
+ //#endregion
856
+ //#region ../core/dist/dev/core/ui/input-feedback/volume-indicator-css-vars.js
857
+ const VolumeIndicatorCSSVars = { fill: "--media-volume-fill" };
858
+
859
+ //#endregion
860
+ //#region ../core/dist/dev/core/ui/input-feedback/volume-indicator-data-attrs.js
861
+ const VolumeIndicatorDataAttrs = {
862
+ open: "data-open",
863
+ level: "data-level",
864
+ min: "data-min",
865
+ max: "data-max",
866
+ transitionStarting: "data-starting-style",
867
+ transitionEnding: "data-ending-style"
868
+ };
869
+
870
+ //#endregion
871
+ //#region ../core/dist/dev/core/ui/menu/menu-core.js
872
+ /** Base menu logic: ARIA attributes and open/close state computation. */
873
+ var MenuCore = class MenuCore {
874
+ static defaultProps = {
875
+ side: "bottom",
876
+ align: "start",
877
+ open: false,
878
+ defaultOpen: false,
879
+ closeOnEscape: true,
880
+ closeOnOutsideClick: true,
881
+ isSubmenu: false
882
+ };
883
+ #props = { ...MenuCore.defaultProps };
884
+ #input = null;
885
+ get props() {
886
+ return this.#props;
887
+ }
888
+ constructor(props) {
889
+ if (props) this.setProps(props);
890
+ }
891
+ setProps(props) {
892
+ this.#props = defaults(props, MenuCore.defaultProps);
893
+ }
894
+ setInput(input) {
895
+ this.#input = input;
896
+ }
897
+ getState() {
898
+ const input = this.#input;
899
+ const isSubmenu = this.#props.isSubmenu;
900
+ return {
901
+ open: input.active,
902
+ status: input.status,
903
+ side: isSubmenu ? void 0 : this.#props.side,
904
+ align: isSubmenu ? void 0 : this.#props.align,
905
+ isSubmenu,
906
+ ...getTransitionFlags(input.status)
907
+ };
908
+ }
909
+ getTriggerAttrs(state, contentId) {
910
+ return {
911
+ "aria-haspopup": "menu",
912
+ "aria-expanded": state.open ? "true" : "false",
913
+ "aria-controls": contentId
914
+ };
915
+ }
916
+ getContentAttrs(state) {
917
+ return {
918
+ role: "menu",
919
+ tabIndex: -1,
920
+ ...!state.isSubmenu && { popover: "manual" }
921
+ };
922
+ }
923
+ };
924
+
925
+ //#endregion
926
+ //#region ../core/dist/dev/core/ui/menu/menu-data-attrs.js
927
+ /** Data attributes set on the menu Content element and inherited by all children. */
928
+ const MenuDataAttrs = {
929
+ open: "data-open",
930
+ side: "data-side",
931
+ align: "data-align",
932
+ isSubmenu: "data-submenu",
933
+ ...TransitionDataAttrs
934
+ };
935
+
936
+ //#endregion
937
+ //#region ../core/dist/dev/core/ui/menu/menu-item-data-attrs.js
938
+ /** Data attributes set on all navigable menu item elements. */
939
+ const MenuItemDataAttrs = {
940
+ item: "data-item",
941
+ highlighted: "data-highlighted"
942
+ };
943
+
944
+ //#endregion
945
+ //#region ../core/dist/dev/core/ui/mute-button/mute-button-core.js
946
+ var MuteButtonCore = class MuteButtonCore {
947
+ static defaultProps = {
948
+ label: "",
949
+ disabled: false
950
+ };
951
+ state = createState({
952
+ muted: false,
953
+ volumeLevel: "off",
954
+ label: ""
955
+ });
956
+ #props = { ...MuteButtonCore.defaultProps };
957
+ #media = null;
958
+ constructor(props) {
959
+ if (props) this.setProps(props);
960
+ }
961
+ setProps(props) {
962
+ this.#props = defaults(props, MuteButtonCore.defaultProps);
963
+ }
964
+ getLabel(state) {
965
+ const { label } = this.#props;
966
+ if (isFunction(label)) {
967
+ const customLabel = label(state);
968
+ if (customLabel) return customLabel;
969
+ } else if (label) return label;
970
+ return state.muted ? "Unmute" : "Mute";
971
+ }
972
+ getAttrs(state) {
973
+ return {
974
+ "aria-label": this.getLabel(state),
975
+ "aria-disabled": this.#props.disabled ? "true" : void 0
976
+ };
977
+ }
978
+ setMedia(media) {
369
979
  this.#media = media;
370
980
  }
371
981
  getState() {
372
982
  const media = this.#media;
373
983
  this.state.patch({
374
- paused: media.paused,
375
- ended: media.ended,
376
- started: media.started
984
+ muted: media.muted || media.volume === 0,
985
+ volumeLevel: getVolumeLevel(media)
377
986
  });
378
987
  this.state.patch({ label: this.getLabel(this.state.current) });
379
988
  return this.state.current;
380
989
  }
381
- async toggle(media) {
990
+ toggle(media) {
382
991
  if (this.#props.disabled) return;
383
- if (media.paused || media.ended) return media.play();
384
- media.pause();
992
+ media.toggleMuted();
385
993
  }
386
994
  };
995
+ function getVolumeLevel(media) {
996
+ if (media.muted || media.volume === 0) return "off";
997
+ if (media.volume < .5) return "low";
998
+ if (media.volume < .75) return "medium";
999
+ return "high";
1000
+ }
387
1001
 
388
1002
  //#endregion
389
- //#region ../core/dist/dev/core/ui/play-button/play-button-data-attrs.js
390
- const PlayButtonDataAttrs = {
391
- paused: "data-paused",
392
- ended: "data-ended",
393
- started: "data-started"
1003
+ //#region ../core/dist/dev/core/ui/mute-button/mute-button-data-attrs.js
1004
+ const MuteButtonDataAttrs = {
1005
+ muted: "data-muted",
1006
+ volumeLevel: "data-volume-level"
394
1007
  };
395
1008
 
396
1009
  //#endregion
397
- //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-core.js
398
- var PlaybackRateButtonCore = class PlaybackRateButtonCore {
1010
+ //#region ../core/dist/dev/core/ui/play-button/play-button-core.js
1011
+ var PlayButtonCore = class PlayButtonCore {
399
1012
  static defaultProps = {
400
1013
  label: "",
401
1014
  disabled: false
402
1015
  };
403
1016
  state = createState({
404
- rate: 1,
1017
+ paused: true,
1018
+ ended: false,
1019
+ started: false,
405
1020
  label: ""
406
1021
  });
407
- #props = { ...PlaybackRateButtonCore.defaultProps };
1022
+ #props = { ...PlayButtonCore.defaultProps };
408
1023
  #media = null;
409
1024
  constructor(props) {
410
1025
  if (props) this.setProps(props);
411
1026
  }
412
1027
  setProps(props) {
413
- this.#props = defaults(props, PlaybackRateButtonCore.defaultProps);
1028
+ this.#props = defaults(props, PlayButtonCore.defaultProps);
414
1029
  }
415
1030
  getLabel(state) {
416
1031
  const { label } = this.#props;
@@ -418,7 +1033,8 @@ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
418
1033
  const customLabel = label(state);
419
1034
  if (customLabel) return customLabel;
420
1035
  } else if (label) return label;
421
- return `Playback rate ${state.rate}`;
1036
+ if (state.ended) return "Replay";
1037
+ return state.paused ? "Play" : "Pause";
422
1038
  }
423
1039
  getAttrs(state) {
424
1040
  return {
@@ -431,23 +1047,28 @@ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
431
1047
  }
432
1048
  getState() {
433
1049
  const media = this.#media;
434
- this.state.patch({ rate: media.playbackRate });
1050
+ this.state.patch({
1051
+ paused: media.paused,
1052
+ ended: media.ended,
1053
+ started: media.started
1054
+ });
435
1055
  this.state.patch({ label: this.getLabel(this.state.current) });
436
1056
  return this.state.current;
437
1057
  }
438
- cycle(media) {
1058
+ async toggle(media) {
439
1059
  if (this.#props.disabled) return;
440
- const { playbackRates, playbackRate } = media;
441
- if (playbackRates.length === 0) return;
442
- const idx = playbackRates.indexOf(playbackRate);
443
- const next = idx === -1 ? playbackRates.find((r) => r > playbackRate) ?? playbackRates[0] : playbackRates[(idx + 1) % playbackRates.length];
444
- media.setPlaybackRate(next);
1060
+ if (media.paused || media.ended) return media.play();
1061
+ media.pause();
445
1062
  }
446
1063
  };
447
1064
 
448
1065
  //#endregion
449
- //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-data-attrs.js
450
- const PlaybackRateButtonDataAttrs = { rate: "data-rate" };
1066
+ //#region ../core/dist/dev/core/ui/play-button/play-button-data-attrs.js
1067
+ const PlayButtonDataAttrs = {
1068
+ paused: "data-paused",
1069
+ ended: "data-ended",
1070
+ started: "data-started"
1071
+ };
451
1072
 
452
1073
  //#endregion
453
1074
  //#region ../core/dist/dev/core/ui/popover/popover-core.js
@@ -507,6 +1128,7 @@ var PopoverCore = class PopoverCore {
507
1128
  const PopoverCSSVars = {
508
1129
  sideOffset: "--media-popover-side-offset",
509
1130
  alignOffset: "--media-popover-align-offset",
1131
+ boundaryOffset: "--media-popover-boundary-offset",
510
1132
  anchorWidth: "--media-popover-anchor-width",
511
1133
  anchorHeight: "--media-popover-anchor-height",
512
1134
  availableWidth: "--media-popover-available-width",
@@ -519,84 +1141,19 @@ const PopoverDataAttrs = {
519
1141
  open: "data-open",
520
1142
  side: "data-side",
521
1143
  align: "data-align",
522
- transitionStarting: "data-starting-style",
523
- transitionEnding: "data-ending-style"
524
- };
525
-
526
- //#endregion
527
- //#region ../core/dist/dev/core/ui/seek-button/seek-button-core.js
528
- var SeekButtonCore = class SeekButtonCore {
529
- static defaultProps = {
530
- seconds: 30,
531
- label: "",
532
- disabled: false
533
- };
534
- state = createState({
535
- seeking: false,
536
- direction: "forward",
537
- label: ""
538
- });
539
- #props = { ...SeekButtonCore.defaultProps };
540
- #media = null;
541
- constructor(props) {
542
- if (props) this.setProps(props);
543
- }
544
- setProps(props) {
545
- this.#props = defaults(props, SeekButtonCore.defaultProps);
546
- }
547
- getLabel(state) {
548
- const { label } = this.#props;
549
- if (isFunction(label)) {
550
- const customLabel = label(state);
551
- if (customLabel) return customLabel;
552
- } else if (label) return label;
553
- const abs = Math.abs(this.#props.seconds);
554
- return state.direction === "backward" ? `Seek backward ${abs} seconds` : `Seek forward ${abs} seconds`;
555
- }
556
- getAttrs(state) {
557
- return {
558
- "aria-label": this.getLabel(state),
559
- "aria-disabled": this.#props.disabled ? "true" : void 0
560
- };
561
- }
562
- setMedia(media) {
563
- this.#media = media;
564
- }
565
- getState() {
566
- const media = this.#media;
567
- const direction = this.#props.seconds < 0 ? "backward" : "forward";
568
- this.state.patch({
569
- seeking: media.seeking,
570
- direction
571
- });
572
- this.state.patch({ label: this.getLabel(this.state.current) });
573
- return this.state.current;
574
- }
575
- async seek(media) {
576
- if (this.#props.disabled) return;
577
- await media.seek(media.currentTime + this.#props.seconds);
578
- }
579
- };
580
-
581
- //#endregion
582
- //#region ../core/dist/dev/core/ui/seek-button/seek-button-data-attrs.js
583
- const SeekButtonDataAttrs = {
584
- seeking: "data-seeking",
585
- direction: "data-direction"
1144
+ ...TransitionDataAttrs
586
1145
  };
587
1146
 
588
1147
  //#endregion
589
- //#region ../utils/dist/number/number.js
590
- /** Clamp a value between min and max (inclusive). */
591
- function clamp(value, min, max) {
592
- return Math.max(min, Math.min(max, value));
593
- }
594
- /** Snap a value to the nearest step, offset from min. */
595
- function roundToStep(value, step, min) {
596
- const nearest = Math.round((value - min) / step) * step + min;
597
- const dot = `${step}`.indexOf(".");
598
- return dot === -1 ? nearest : Number(nearest.toFixed(`${step}`.length - dot - 1));
599
- }
1148
+ //#region ../core/dist/dev/core/ui/popover/popup-host-attr.js
1149
+ /**
1150
+ * Hosted floating UI surfaces (popover, menu, tooltip, and future overlays) that support
1151
+ * parent-driven lifecycle may set {@link POPUP_HOST_ATTR}. Ancestors can discover them with
1152
+ * {@link POPUP_HOST_SELECTOR} and call methods such as `close('imperative-action')` when
1153
+ * the element implements that contract.
1154
+ */
1155
+ const POPUP_HOST_ATTR = "data-popup";
1156
+ const POPUP_HOST_SELECTOR = `[${POPUP_HOST_ATTR}]`;
600
1157
 
601
1158
  //#endregion
602
1159
  //#region ../core/dist/dev/core/ui/slider/slider-core.js
@@ -877,106 +1434,6 @@ function mapCuesToThumbnails(cues, baseURL) {
877
1434
  return images;
878
1435
  }
879
1436
 
880
- //#endregion
881
- //#region ../utils/dist/time/format.js
882
- const UNIT_LABELS = [
883
- {
884
- singular: "hour",
885
- plural: "hours"
886
- },
887
- {
888
- singular: "minute",
889
- plural: "minutes"
890
- },
891
- {
892
- singular: "second",
893
- plural: "seconds"
894
- }
895
- ];
896
- function isValidTime(value) {
897
- return isNumber(value) && Number.isFinite(value);
898
- }
899
- function toTimeUnitPhrase(value, unitIndex) {
900
- return `${value} ${value === 1 ? UNIT_LABELS[unitIndex]?.singular : UNIT_LABELS[unitIndex]?.plural}`;
901
- }
902
- /**
903
- * Format seconds to digital display string.
904
- *
905
- * @param seconds - Time in seconds (can be negative)
906
- * @param guide - Guide time (typically duration) to determine display format
907
- * @returns Formatted string like "1:30" or "1:05:30"
908
- *
909
- * @example
910
- * formatTime(90) // "1:30"
911
- * formatTime(3661) // "1:01:01"
912
- * formatTime(35, 3600) // "0:00:35" (guided by 1-hour duration)
913
- * formatTime(35, 600) // "00:35" (guided by 10-minute duration)
914
- */
915
- function formatTime(seconds, guide) {
916
- if (!isValidTime(seconds)) return "0:00";
917
- const negative = seconds < 0;
918
- const positiveSeconds = Math.abs(seconds);
919
- const h = Math.floor(positiveSeconds / 3600);
920
- const m = Math.floor(positiveSeconds / 60 % 60);
921
- const s = Math.floor(positiveSeconds % 60);
922
- const guideAbs = guide ? Math.abs(guide) : 0;
923
- const gh = Math.floor(guideAbs / 3600);
924
- const gm = Math.floor(guideAbs / 60 % 60);
925
- const showHours = h > 0 || gh > 0;
926
- const padMinutes = showHours || gm >= 10;
927
- const hoursStr = showHours ? `${h}:` : "";
928
- const minutesStr = `${padMinutes && m < 10 ? "0" : ""}${m}:`;
929
- const secondsStr = s < 10 ? `0${s}` : `${s}`;
930
- return `${negative ? "-" : ""}${hoursStr}${minutesStr}${secondsStr}`;
931
- }
932
- /**
933
- * Format seconds to human-readable phrase for screen readers.
934
- *
935
- * @param seconds - Time in seconds (negative indicates remaining)
936
- * @returns Human-readable phrase like "1 minute, 30 seconds"
937
- *
938
- * @example
939
- * formatTimeAsPhrase(90) // "1 minute, 30 seconds"
940
- * formatTimeAsPhrase(3661) // "1 hour, 1 minute, 1 second"
941
- * formatTimeAsPhrase(-270) // "4 minutes, 30 seconds remaining"
942
- */
943
- function formatTimeAsPhrase(seconds) {
944
- if (!isValidTime(seconds)) return "";
945
- const negative = seconds < 0;
946
- const positiveSeconds = Math.abs(seconds);
947
- const h = Math.floor(positiveSeconds / 3600);
948
- const m = Math.floor(positiveSeconds / 60 % 60);
949
- const s = Math.floor(positiveSeconds % 60);
950
- if (positiveSeconds === 0) return `${toTimeUnitPhrase(0, 2)}${negative ? " remaining" : ""}`;
951
- return `${[
952
- h,
953
- m,
954
- s
955
- ].map((value, index) => value > 0 ? toTimeUnitPhrase(value, index) : null).filter(Boolean).join(", ")}${negative ? " remaining" : ""}`;
956
- }
957
- /**
958
- * Convert seconds to ISO 8601 duration for datetime attribute.
959
- *
960
- * @param seconds - Time in seconds
961
- * @returns ISO 8601 duration string like "PT1M30S"
962
- *
963
- * @example
964
- * secondsToIsoDuration(90) // "PT1M30S"
965
- * secondsToIsoDuration(3661) // "PT1H1M1S"
966
- */
967
- function secondsToIsoDuration(seconds) {
968
- if (!isValidTime(seconds)) return "PT0S";
969
- const positiveSeconds = Math.abs(seconds);
970
- const h = Math.floor(positiveSeconds / 3600);
971
- const m = Math.floor(positiveSeconds / 60 % 60);
972
- const s = Math.floor(positiveSeconds % 60);
973
- let duration = "PT";
974
- if (h > 0) duration += `${h}H`;
975
- if (m > 0) duration += `${m}M`;
976
- if (s > 0 || duration === "PT") duration += `${s}S`;
977
- return duration;
978
- }
979
-
980
1437
  //#endregion
981
1438
  //#region ../core/dist/dev/core/ui/time/time-core.js
982
1439
  const DEFAULT_LABELS = {
@@ -1171,6 +1628,7 @@ var TooltipCore = class TooltipCore {
1171
1628
  const TooltipCSSVars = {
1172
1629
  sideOffset: "--media-tooltip-side-offset",
1173
1630
  alignOffset: "--media-tooltip-align-offset",
1631
+ boundaryOffset: "--media-tooltip-boundary-offset",
1174
1632
  anchorWidth: "--media-tooltip-anchor-width",
1175
1633
  anchorHeight: "--media-tooltip-anchor-height",
1176
1634
  availableWidth: "--media-tooltip-available-width",
@@ -1183,8 +1641,7 @@ const TooltipDataAttrs = {
1183
1641
  open: "data-open",
1184
1642
  side: "data-side",
1185
1643
  align: "data-align",
1186
- transitionStarting: "data-starting-style",
1187
- transitionEnding: "data-ending-style"
1644
+ ...TransitionDataAttrs
1188
1645
  };
1189
1646
 
1190
1647
  //#endregion
@@ -1390,10 +1847,15 @@ var HotkeyCoordinator = class {
1390
1847
  #docDisconnect = null;
1391
1848
  /** Action name → bound keys. Controls query this to set `aria-keyshortcuts`. */
1392
1849
  #ariaRegistry = /* @__PURE__ */ new Map();
1850
+ #subscribers = /* @__PURE__ */ new Set();
1393
1851
  #destroyed = false;
1394
1852
  constructor(target) {
1395
1853
  this.#target = target;
1396
1854
  }
1855
+ subscribe(callback) {
1856
+ this.#subscribers.add(callback);
1857
+ return () => this.#subscribers.delete(callback);
1858
+ }
1397
1859
  add(options) {
1398
1860
  const parsed = parseHotkeyPattern(options.keys);
1399
1861
  const binding = {
@@ -1463,6 +1925,7 @@ var HotkeyCoordinator = class {
1463
1925
  #handleEvent = (event) => {
1464
1926
  if (event.key === "Unidentified") return;
1465
1927
  if (isInteractiveActivation(event)) return;
1928
+ if (event.defaultPrevented) return;
1466
1929
  const editable = isEditableTarget(event);
1467
1930
  for (const binding of this.#bindings) {
1468
1931
  const { options, parsed } = binding;
@@ -1472,6 +1935,19 @@ var HotkeyCoordinator = class {
1472
1935
  for (const p of parsed) {
1473
1936
  if (!matchesHotkeyEvent(p, event)) continue;
1474
1937
  if (editable && p.modifiers.size === 0) continue;
1938
+ if (this.#subscribers.size > 0) {
1939
+ const activateEvent = {
1940
+ source: "hotkey",
1941
+ action: options.action,
1942
+ value: options.value,
1943
+ event
1944
+ };
1945
+ for (const cb of this.#subscribers) try {
1946
+ cb(activateEvent);
1947
+ } catch (error) {
1948
+ console.warn("[vjs-hotkey] subscribe callback threw:", error);
1949
+ }
1950
+ }
1475
1951
  event.preventDefault();
1476
1952
  options.onActivate(event, p.originalKey);
1477
1953
  return;
@@ -1564,7 +2040,8 @@ const coordinators = /* @__PURE__ */ new WeakMap();
1564
2040
  function findHotkeyCoordinator(target) {
1565
2041
  return coordinators.get(target);
1566
2042
  }
1567
- function getCoordinator(target) {
2043
+ /** Look up or create the hotkey coordinator for a target element. */
2044
+ function getHotkeyCoordinator(target) {
1568
2045
  let coordinator = coordinators.get(target);
1569
2046
  if (!coordinator) {
1570
2047
  coordinator = new HotkeyCoordinator(target);
@@ -1589,7 +2066,7 @@ function getCoordinator(target) {
1589
2066
  * @returns A cleanup function that removes the binding.
1590
2067
  */
1591
2068
  function createHotkey(target, options) {
1592
- return getCoordinator(target).add(options);
2069
+ return getHotkeyCoordinator(target).add(options);
1593
2070
  }
1594
2071
 
1595
2072
  //#endregion
@@ -1625,6 +2102,7 @@ function createDismissLayer(options) {
1625
2102
  }
1626
2103
  function handleKeydown(event) {
1627
2104
  if (event.key !== "Escape") return;
2105
+ if (event.defaultPrevented) return;
1628
2106
  if (!state.current.active) return;
1629
2107
  if (!(options.closeOnEscape?.() ?? true)) return;
1630
2108
  options.onEscapeDismiss(event);
@@ -1765,6 +2243,50 @@ function createButton(options) {
1765
2243
  };
1766
2244
  }
1767
2245
 
2246
+ //#endregion
2247
+ //#region ../core/dist/dev/dom/ui/input-action.js
2248
+ function toInputActionEvent(event) {
2249
+ return {
2250
+ action: event.action,
2251
+ value: event.value,
2252
+ source: event.source,
2253
+ key: "key" in event.event ? event.event.key : void 0
2254
+ };
2255
+ }
2256
+ function getMediaSnapshot(store) {
2257
+ if (!store) return {};
2258
+ const state = store.state;
2259
+ const time = selectTime(state);
2260
+ return {
2261
+ paused: selectPlayback(state)?.paused,
2262
+ volume: selectVolume(state)?.volume,
2263
+ muted: selectVolume(state)?.muted,
2264
+ fullscreen: selectFullscreen(state)?.fullscreen,
2265
+ subtitlesShowing: selectTextTrack(state)?.subtitlesShowing,
2266
+ pip: selectPiP(state)?.pip,
2267
+ currentTime: time?.currentTime,
2268
+ duration: time?.duration
2269
+ };
2270
+ }
2271
+ function subscribeToInputActions(container, callback) {
2272
+ const handleEvent = (event) => callback(toInputActionEvent(event));
2273
+ const gestureUnsubscribe = getGestureCoordinator(container).subscribe(handleEvent);
2274
+ const hotkeyUnsubscribe = getHotkeyCoordinator(container).subscribe(handleEvent);
2275
+ return () => {
2276
+ gestureUnsubscribe();
2277
+ hotkeyUnsubscribe();
2278
+ };
2279
+ }
2280
+ const indicatorVisibilityCoordinators = /* @__PURE__ */ new WeakMap();
2281
+ function getIndicatorVisibilityCoordinator(container) {
2282
+ let coordinator = indicatorVisibilityCoordinators.get(container);
2283
+ if (!coordinator) {
2284
+ coordinator = new IndicatorVisibilityCoordinator();
2285
+ indicatorVisibilityCoordinators.set(container, coordinator);
2286
+ }
2287
+ return coordinator;
2288
+ }
2289
+
1768
2290
  //#endregion
1769
2291
  //#region ../core/dist/dev/dom/ui/popover/popover.js
1770
2292
  function createPopover(options) {
@@ -1788,6 +2310,9 @@ function createPopover(options) {
1788
2310
  }
1789
2311
  });
1790
2312
  const state = layer.input;
2313
+ const groupMember = { close(reason) {
2314
+ applyClose(reason);
2315
+ } };
1791
2316
  function clearHoverTimeout() {
1792
2317
  if (hoverTimeout !== null) {
1793
2318
  clearTimeout(hoverTimeout);
@@ -1823,6 +2348,7 @@ function createPopover(options) {
1823
2348
  function applyOpen(reason, event) {
1824
2349
  const opening = layer.open();
1825
2350
  if (!opening) return;
2351
+ options.group?.()?.open(groupMember);
1826
2352
  onOpenChange(true, event ? {
1827
2353
  reason,
1828
2354
  event
@@ -1835,6 +2361,7 @@ function createPopover(options) {
1835
2361
  function applyClose(reason, event) {
1836
2362
  const closing = layer.close(popupEl);
1837
2363
  if (!closing) return;
2364
+ options.group?.()?.close(groupMember);
1838
2365
  onOpenChange(false, event ? {
1839
2366
  reason,
1840
2367
  event
@@ -1858,6 +2385,7 @@ function createPopover(options) {
1858
2385
  applyClose("outside-click", event);
1859
2386
  }
1860
2387
  layer.signal.addEventListener("abort", () => {
2388
+ options.group?.()?.close(groupMember);
1861
2389
  clearHoverTimeout();
1862
2390
  capturedPointers.clear();
1863
2391
  triggerEl = null;
@@ -1947,14 +2475,621 @@ function createPopover(options) {
1947
2475
  };
1948
2476
  }
1949
2477
 
2478
+ //#endregion
2479
+ //#region ../core/dist/dev/dom/ui/menu/create-menu.js
2480
+ function isMenuNavigationKey(event) {
2481
+ const { key } = event;
2482
+ return key === "ArrowDown" || key === "ArrowUp" || key === "ArrowLeft" || key === "ArrowRight" || key === "Home" || key === "End" || key === "Enter" || key === " " || key === "Escape" || key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;
2483
+ }
2484
+ function getRootPositionOptions(side, align) {
2485
+ if (!side || !align) return null;
2486
+ return {
2487
+ side,
2488
+ align
2489
+ };
2490
+ }
2491
+ function completeMenuItemSelection(menu, parentMenu = null) {
2492
+ if (parentMenu) parentMenu.pop();
2493
+ else menu.close();
2494
+ }
2495
+ function createMenu(options) {
2496
+ const items = [];
2497
+ let highlightedItem = null;
2498
+ let triggerElement = null;
2499
+ let contentElement = null;
2500
+ let typeaheadBuffer = "";
2501
+ let typeaheadTimer = null;
2502
+ let openRafId = 0;
2503
+ let lastCloseReason = null;
2504
+ const navigationState = createState({
2505
+ stack: [],
2506
+ direction: "forward"
2507
+ });
2508
+ function push(menuId, triggerId) {
2509
+ const stack = navigationState.current.stack;
2510
+ if (stack[stack.length - 1]?.menuId === menuId) return;
2511
+ navigationState.patch({
2512
+ stack: [...stack, {
2513
+ menuId,
2514
+ triggerId
2515
+ }],
2516
+ direction: "forward"
2517
+ });
2518
+ }
2519
+ function pop() {
2520
+ const stack = navigationState.current.stack;
2521
+ if (stack.length === 0) return;
2522
+ navigationState.patch({
2523
+ stack: stack.slice(0, -1),
2524
+ direction: "back"
2525
+ });
2526
+ }
2527
+ function highlight(element, highlightOptions) {
2528
+ if (highlightedItem === element) return;
2529
+ if (highlightedItem) {
2530
+ highlightedItem.tabIndex = -1;
2531
+ highlightedItem.removeAttribute(MenuItemDataAttrs.highlighted);
2532
+ }
2533
+ highlightedItem = element;
2534
+ if (element) {
2535
+ element.tabIndex = 0;
2536
+ element.setAttribute(MenuItemDataAttrs.highlighted, "");
2537
+ if (highlightOptions?.focus !== false) if (highlightOptions?.preventScroll) element.focus({ preventScroll: true });
2538
+ else element.focus();
2539
+ }
2540
+ options.onHighlightChange?.(element);
2541
+ }
2542
+ function clearHighlight() {
2543
+ if (highlightedItem) {
2544
+ highlightedItem.tabIndex = -1;
2545
+ highlightedItem.removeAttribute(MenuItemDataAttrs.highlighted);
2546
+ highlightedItem = null;
2547
+ options.onHighlightChange?.(null);
2548
+ }
2549
+ }
2550
+ function highlightFirstItem(options) {
2551
+ highlight(items[0] ?? null, options);
2552
+ }
2553
+ function getInitialHighlightItem() {
2554
+ return items.find((item) => item.matches("[aria-checked=\"true\"], [aria-selected=\"true\"]")) ?? items[0] ?? null;
2555
+ }
2556
+ function clearTypeahead() {
2557
+ if (typeaheadTimer !== null) {
2558
+ clearTimeout(typeaheadTimer);
2559
+ typeaheadTimer = null;
2560
+ }
2561
+ typeaheadBuffer = "";
2562
+ }
2563
+ function scheduleInitialHighlight() {
2564
+ cancelAnimationFrame(openRafId);
2565
+ openRafId = requestAnimationFrame(() => {
2566
+ openRafId = 0;
2567
+ if (!popover.input.current.active || popover.input.current.status === "ending" || highlightedItem) return;
2568
+ highlight(getInitialHighlightItem());
2569
+ });
2570
+ }
2571
+ function handleTypeahead(char) {
2572
+ typeaheadBuffer = typeaheadBuffer.length === 1 && typeaheadBuffer.toLowerCase() === char.toLowerCase() ? char : typeaheadBuffer + char;
2573
+ if (typeaheadTimer !== null) clearTimeout(typeaheadTimer);
2574
+ typeaheadTimer = setTimeout(clearTypeahead, 500);
2575
+ const searchStart = (highlightedItem ? items.indexOf(highlightedItem) : -1) + 1;
2576
+ const candidates = [...items.slice(searchStart), ...items.slice(0, searchStart)];
2577
+ const needle = typeaheadBuffer.toLowerCase();
2578
+ const match = candidates.find((candidate) => {
2579
+ return (candidate.textContent?.trim().toLowerCase() ?? "").startsWith(needle);
2580
+ });
2581
+ if (match) highlight(match);
2582
+ }
2583
+ const popover = createPopover({
2584
+ transition: options.transition,
2585
+ onOpenChange(open, details) {
2586
+ lastCloseReason = open ? null : details.reason;
2587
+ options.onOpenChange(open, details);
2588
+ if (open) scheduleInitialHighlight();
2589
+ else {
2590
+ clearHighlight();
2591
+ clearTypeahead();
2592
+ navigationState.patch({
2593
+ stack: [],
2594
+ direction: "forward"
2595
+ });
2596
+ }
2597
+ },
2598
+ onOpenChangeComplete(open) {
2599
+ options.onOpenChangeComplete?.(open);
2600
+ if (!open && lastCloseReason !== "imperative-action" && lastCloseReason !== "group-open") triggerElement?.focus();
2601
+ },
2602
+ closeOnEscape: options.closeOnEscape,
2603
+ closeOnOutsideClick: options.closeOnOutsideClick,
2604
+ ...options.group ? { group: options.group } : {}
2605
+ });
2606
+ const contentProps = {
2607
+ onFocusOut: popover.popupProps.onFocusOut,
2608
+ onKeyDown(event) {
2609
+ const { key } = event;
2610
+ if (key !== "Escape" && isMenuNavigationKey(event) && !event.defaultPrevented) event.preventDefault();
2611
+ if (items.length === 0) return;
2612
+ switch (key) {
2613
+ case "ArrowDown":
2614
+ event.preventDefault();
2615
+ highlight(items[((highlightedItem ? items.indexOf(highlightedItem) : -1) + 1) % items.length] ?? null);
2616
+ break;
2617
+ case "ArrowUp": {
2618
+ event.preventDefault();
2619
+ const currentIndex = highlightedItem ? items.indexOf(highlightedItem) : 0;
2620
+ highlight(items[(currentIndex <= 0 ? items.length : currentIndex) - 1] ?? null);
2621
+ break;
2622
+ }
2623
+ case "Home":
2624
+ event.preventDefault();
2625
+ highlight(items[0] ?? null);
2626
+ break;
2627
+ case "End":
2628
+ event.preventDefault();
2629
+ highlight(items[items.length - 1] ?? null);
2630
+ break;
2631
+ case "Enter":
2632
+ case " ":
2633
+ event.preventDefault();
2634
+ highlightedItem?.click();
2635
+ break;
2636
+ default: if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) handleTypeahead(key);
2637
+ }
2638
+ }
2639
+ };
2640
+ function handleTriggerKeyDown(event) {
2641
+ const input = popover.input.current;
2642
+ if (!input.active || input.status === "ending") return;
2643
+ if (event.key === "Escape") return;
2644
+ if (!isMenuNavigationKey(event)) return;
2645
+ contentProps.onKeyDown(event);
2646
+ event.stopPropagation();
2647
+ }
2648
+ function setTriggerElement(element) {
2649
+ triggerElement = element;
2650
+ popover.setTriggerElement(element);
2651
+ }
2652
+ function setContentElement(element) {
2653
+ contentElement = element;
2654
+ popover.setPopupElement(element);
2655
+ }
2656
+ function compareItems(a, b) {
2657
+ if (a === b) return 0;
2658
+ const position = a.compareDocumentPosition(b);
2659
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
2660
+ if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;
2661
+ return 0;
2662
+ }
2663
+ function registerItem(element) {
2664
+ element.tabIndex = -1;
2665
+ element.setAttribute(MenuItemDataAttrs.item, "");
2666
+ items.push(element);
2667
+ items.sort(compareItems);
2668
+ if (popover.input.current.active && popover.input.current.status !== "ending" && !highlightedItem) scheduleInitialHighlight();
2669
+ return () => {
2670
+ const index = items.indexOf(element);
2671
+ if (index !== -1) items.splice(index, 1);
2672
+ if (highlightedItem === element) clearHighlight();
2673
+ };
2674
+ }
2675
+ function destroy() {
2676
+ cancelAnimationFrame(openRafId);
2677
+ openRafId = 0;
2678
+ clearTypeahead();
2679
+ popover.destroy();
2680
+ }
2681
+ return {
2682
+ input: popover.input,
2683
+ navigationInput: navigationState,
2684
+ triggerProps: {
2685
+ onClick: popover.triggerProps.onClick,
2686
+ onKeyDown: handleTriggerKeyDown
2687
+ },
2688
+ contentProps,
2689
+ get triggerElement() {
2690
+ return triggerElement;
2691
+ },
2692
+ get contentElement() {
2693
+ return contentElement;
2694
+ },
2695
+ setTriggerElement,
2696
+ setContentElement,
2697
+ registerItem,
2698
+ highlight,
2699
+ highlightFirstItem,
2700
+ push,
2701
+ pop,
2702
+ open: popover.open,
2703
+ close: popover.close,
2704
+ destroy
2705
+ };
2706
+ }
2707
+
2708
+ //#endregion
2709
+ //#region ../core/dist/dev/dom/utils/layout.js
2710
+ function forceLayout(element) {
2711
+ element?.getBoundingClientRect();
2712
+ }
2713
+ function createDOMRect(left, top, width, height) {
2714
+ const right = left + width;
2715
+ const bottom = top + height;
2716
+ return {
2717
+ x: left,
2718
+ y: top,
2719
+ width,
2720
+ height,
2721
+ top,
2722
+ right,
2723
+ bottom,
2724
+ left,
2725
+ toJSON() {
2726
+ return {
2727
+ x: left,
2728
+ y: top,
2729
+ width,
2730
+ height,
2731
+ top,
2732
+ right,
2733
+ bottom,
2734
+ left
2735
+ };
2736
+ }
2737
+ };
2738
+ }
2739
+ function intersectDOMRects(firstRect, secondRect) {
2740
+ const left = Math.max(firstRect.left, secondRect.left);
2741
+ const top = Math.max(firstRect.top, secondRect.top);
2742
+ const right = Math.min(firstRect.right, secondRect.right);
2743
+ const bottom = Math.min(firstRect.bottom, secondRect.bottom);
2744
+ return createDOMRect(left, top, Math.max(0, right - left), Math.max(0, bottom - top));
2745
+ }
2746
+ function getPositioningBoundaryRect(boundaryElement) {
2747
+ const viewportRect = document.documentElement.getBoundingClientRect();
2748
+ return boundaryElement ? intersectDOMRects(viewportRect, boundaryElement.getBoundingClientRect()) : viewportRect;
2749
+ }
2750
+ function resolvePositioningBoundary(boundary, options = {}) {
2751
+ if (!boundary) return null;
2752
+ if (!isString(boundary)) return boundary;
2753
+ if (boundary === "viewport") return null;
2754
+ if (boundary === "container") return options.container ?? null;
2755
+ try {
2756
+ return (options.root ?? document).querySelector(boundary);
2757
+ } catch {
2758
+ return null;
2759
+ }
2760
+ }
2761
+
2762
+ //#endregion
2763
+ //#region ../core/dist/dev/dom/ui/menu/create-menu-view-transition.js
2764
+ const DEFAULT_MENU_VIEW_TRANSITION_STATE = {
2765
+ phase: "hidden",
2766
+ direction: "forward",
2767
+ triggerId: null
2768
+ };
2769
+ async function waitForElementAnimations(element) {
2770
+ const animations = element.getAnimations?.() ?? [];
2771
+ if (!animations.length) return;
2772
+ await Promise.all(animations.map((animation) => animation.finished)).catch(() => {});
2773
+ }
2774
+ function focusFirstMenuViewItem(element) {
2775
+ element.querySelector("[data-item]")?.focus({ preventScroll: true });
2776
+ }
2777
+ function getMenuViewState(phase) {
2778
+ return phase === "entering" || phase === "active" ? "active" : "inactive";
2779
+ }
2780
+ function getMenuViewTransitionAttrs(state) {
2781
+ return {
2782
+ "data-menu-view": "",
2783
+ "data-menu-view-state": getMenuViewState(state.phase),
2784
+ "data-direction": state.direction,
2785
+ ...getTransitionStyleAttrs({
2786
+ transitionStarting: state.phase === "entering",
2787
+ transitionEnding: state.phase === "exiting"
2788
+ }),
2789
+ "data-open": state.phase !== "hidden" ? "" : void 0,
2790
+ hidden: state.phase === "hidden"
2791
+ };
2792
+ }
2793
+ function createMenuViewTransition(options = {}) {
2794
+ const input = createState(DEFAULT_MENU_VIEW_TRANSITION_STATE);
2795
+ const waitForAnimations = options.waitForAnimations ?? waitForElementAnimations;
2796
+ const focusFirstItem = options.focusFirstItem ?? focusFirstMenuViewItem;
2797
+ let element = null;
2798
+ let transitionId = 0;
2799
+ let raf1 = 0;
2800
+ let raf2 = 0;
2801
+ let focusRaf = 0;
2802
+ let scheduledTransitionId = 0;
2803
+ let scheduledPhase = null;
2804
+ function cancelFrames() {
2805
+ cancelAnimationFrame(raf1);
2806
+ cancelAnimationFrame(raf2);
2807
+ cancelAnimationFrame(focusRaf);
2808
+ raf1 = 0;
2809
+ raf2 = 0;
2810
+ focusRaf = 0;
2811
+ scheduledTransitionId = 0;
2812
+ scheduledPhase = null;
2813
+ }
2814
+ function scheduleCurrentPhase() {
2815
+ const { phase } = input.current;
2816
+ if (!element || phase !== "entering" && phase !== "exiting") return;
2817
+ if (scheduledTransitionId === transitionId && scheduledPhase === phase) return;
2818
+ scheduledTransitionId = transitionId;
2819
+ scheduledPhase = phase;
2820
+ if (phase === "entering") scheduleEnterComplete(transitionId, element);
2821
+ else scheduleExitComplete(transitionId, element);
2822
+ }
2823
+ function scheduleEnterComplete(currentTransitionId, currentElement) {
2824
+ forceLayout(currentElement);
2825
+ raf1 = requestAnimationFrame(() => {
2826
+ if (currentTransitionId !== transitionId) return;
2827
+ raf2 = requestAnimationFrame(() => {
2828
+ if (currentTransitionId !== transitionId) return;
2829
+ forceLayout(currentElement);
2830
+ input.patch({ phase: "active" });
2831
+ focusRaf = requestAnimationFrame(() => {
2832
+ if (currentTransitionId !== transitionId) return;
2833
+ focusFirstItem(currentElement);
2834
+ });
2835
+ });
2836
+ });
2837
+ }
2838
+ function scheduleExitComplete(currentTransitionId, currentElement) {
2839
+ forceLayout(currentElement);
2840
+ raf1 = requestAnimationFrame(async () => {
2841
+ await waitForAnimations(currentElement);
2842
+ if (currentTransitionId !== transitionId) return;
2843
+ const { direction, triggerId } = input.current;
2844
+ input.patch({
2845
+ phase: "hidden",
2846
+ triggerId: null
2847
+ });
2848
+ if (direction === "back") options.restoreFocus?.(triggerId);
2849
+ });
2850
+ }
2851
+ function startEnter(direction, triggerId) {
2852
+ transitionId++;
2853
+ cancelFrames();
2854
+ input.patch({
2855
+ phase: "entering",
2856
+ direction,
2857
+ triggerId
2858
+ });
2859
+ scheduleCurrentPhase();
2860
+ }
2861
+ function startExit(direction) {
2862
+ transitionId++;
2863
+ cancelFrames();
2864
+ input.patch({
2865
+ phase: "exiting",
2866
+ direction
2867
+ });
2868
+ scheduleCurrentPhase();
2869
+ }
2870
+ function setElement(nextElement) {
2871
+ if (element === nextElement) return;
2872
+ element = nextElement;
2873
+ scheduleCurrentPhase();
2874
+ }
2875
+ function sync({ active, direction, triggerId = null }) {
2876
+ const { phase } = input.current;
2877
+ if (active && (phase === "hidden" || phase === "exiting")) startEnter(direction, triggerId);
2878
+ else if (!active && (phase === "active" || phase === "entering")) startExit(direction);
2879
+ }
2880
+ function destroy() {
2881
+ transitionId++;
2882
+ cancelFrames();
2883
+ element = null;
2884
+ input.patch(DEFAULT_MENU_VIEW_TRANSITION_STATE);
2885
+ }
2886
+ return {
2887
+ input,
2888
+ setElement,
2889
+ sync,
2890
+ destroy
2891
+ };
2892
+ }
2893
+
2894
+ //#endregion
2895
+ //#region ../core/dist/dev/dom/ui/menu/menu-viewport-transition.js
2896
+ const DEFAULT_MENU_VIEWPORT_MIN_WIDTH = 160;
2897
+ const MENU_VIEW_ATTR = "data-menu-view";
2898
+ const MENU_VIEW_STATE_ATTR = "data-menu-view-state";
2899
+ const MENU_VIEW_ACTIVE_STATE = "active";
2900
+ const MENU_VIEW_INACTIVE_STATE = "inactive";
2901
+ const MENU_ROOT_VIEW_ATTR = "data-menu-root-view";
2902
+ const MENU_VIEWPORT_ATTR = "data-menu-viewport";
2903
+ const MENU_WIDTH_VAR = "--media-menu-width";
2904
+ const MENU_HEIGHT_VAR = "--media-menu-height";
2905
+ const MENU_VIEW_MEASURE_STYLE_PROPERTIES = [
2906
+ "position",
2907
+ "top",
2908
+ "right",
2909
+ "bottom",
2910
+ "left",
2911
+ "width",
2912
+ "height",
2913
+ "min-width",
2914
+ "max-width"
2915
+ ];
2916
+ const viewportTransitionStates = /* @__PURE__ */ new WeakMap();
2917
+ function getMenuViewportAttrs() {
2918
+ return { "data-menu-viewport": "" };
2919
+ }
2920
+ function getMenuRootViewAttrs() {
2921
+ return {
2922
+ "data-menu-root-view": "",
2923
+ "data-menu-view": ""
2924
+ };
2925
+ }
2926
+ function getViewportTransitionState(content) {
2927
+ let state = viewportTransitionStates.get(content);
2928
+ if (!state) {
2929
+ state = {
2930
+ pending: null,
2931
+ phaseKeys: /* @__PURE__ */ new WeakMap()
2932
+ };
2933
+ viewportTransitionStates.set(content, state);
2934
+ }
2935
+ return state;
2936
+ }
2937
+ function getMenuViewportElement(content) {
2938
+ if (!content) return null;
2939
+ return content.querySelector(`:scope > [${MENU_VIEWPORT_ATTR}]`) ?? content;
2940
+ }
2941
+ function getViewportElement(content, view) {
2942
+ const viewport = getMenuViewportElement(content);
2943
+ if (viewport && viewport !== content) return viewport;
2944
+ if (view?.parentElement && content.contains(view.parentElement)) return view.parentElement;
2945
+ return content;
2946
+ }
2947
+ function getRootViewElement(viewport) {
2948
+ return viewport.querySelector(`:scope > [${MENU_ROOT_VIEW_ATTR}]`);
2949
+ }
2950
+ function getActiveMenuViewElement(viewport) {
2951
+ return Array.from(viewport.children).find((child) => child instanceof HTMLElement && child.hasAttribute(MENU_VIEW_ATTR) && !child.hasAttribute(MENU_ROOT_VIEW_ATTR) && !child.hidden && !child.hasAttribute(TransitionDataAttrs.transitionEnding)) ?? null;
2952
+ }
2953
+ function resolveMinWidth(options) {
2954
+ return options?.minWidth ?? DEFAULT_MENU_VIEWPORT_MIN_WIDTH;
2955
+ }
2956
+ function snapshotInlineStyle(element) {
2957
+ return MENU_VIEW_MEASURE_STYLE_PROPERTIES.map((property) => ({
2958
+ property,
2959
+ value: element.style.getPropertyValue(property),
2960
+ priority: element.style.getPropertyPriority(property)
2961
+ }));
2962
+ }
2963
+ function restoreInlineStyle(element, snapshot) {
2964
+ for (const { property, value, priority } of snapshot) if (value) element.style.setProperty(property, value, priority);
2965
+ else element.style.removeProperty(property);
2966
+ }
2967
+ function measureMenuView(view, minWidth) {
2968
+ const snapshot = snapshotInlineStyle(view);
2969
+ try {
2970
+ view.style.setProperty("position", "absolute");
2971
+ view.style.setProperty("top", "0px");
2972
+ view.style.setProperty("right", "auto");
2973
+ view.style.setProperty("bottom", "auto");
2974
+ view.style.setProperty("left", "0px");
2975
+ view.style.setProperty("width", "max-content");
2976
+ view.style.setProperty("height", "auto");
2977
+ view.style.setProperty("min-width", `${minWidth}px`);
2978
+ view.style.setProperty("max-width", "none");
2979
+ forceLayout(view);
2980
+ const rect = view.getBoundingClientRect();
2981
+ return {
2982
+ width: Math.ceil(Math.max(minWidth, rect.width, view.scrollWidth)),
2983
+ height: Math.ceil(Math.max(rect.height, view.scrollHeight))
2984
+ };
2985
+ } finally {
2986
+ restoreInlineStyle(view, snapshot);
2987
+ forceLayout(view);
2988
+ }
2989
+ }
2990
+ function setViewportSize(content, size) {
2991
+ content.style.setProperty(MENU_WIDTH_VAR, `${size.width}px`);
2992
+ content.style.setProperty(MENU_HEIGHT_VAR, `${size.height}px`);
2993
+ }
2994
+ function setMenuViewState(view, state) {
2995
+ view.setAttribute(MENU_VIEW_STATE_ATTR, state);
2996
+ if (state === MENU_VIEW_ACTIVE_STATE) view.setAttribute("data-open", "");
2997
+ else view.removeAttribute("data-open");
2998
+ }
2999
+ function prepareEnteringMenuView(content, rootView, entering, state, options) {
3000
+ const minWidth = resolveMinWidth(options);
3001
+ const fromSize = measureMenuView(rootView, minWidth);
3002
+ state.pending = {
3003
+ entering,
3004
+ fromSize,
3005
+ toSize: measureMenuView(entering, minWidth)
3006
+ };
3007
+ setMenuViewState(rootView, MENU_VIEW_ACTIVE_STATE);
3008
+ setViewportSize(content, fromSize);
3009
+ forceLayout(content);
3010
+ }
3011
+ function startEnteringMenuView(content, rootView, entering, state, options) {
3012
+ const minWidth = resolveMinWidth(options);
3013
+ const current = state.pending?.entering === entering ? state.pending : {
3014
+ entering,
3015
+ fromSize: measureMenuView(rootView, minWidth),
3016
+ toSize: measureMenuView(entering, minWidth)
3017
+ };
3018
+ state.pending = null;
3019
+ setViewportSize(content, current.fromSize);
3020
+ forceLayout(rootView);
3021
+ setMenuViewState(rootView, MENU_VIEW_INACTIVE_STATE);
3022
+ forceLayout(rootView);
3023
+ setViewportSize(content, current.toSize);
3024
+ }
3025
+ function startExitingMenuView(content, rootView, exiting, transitionState, options) {
3026
+ transitionState.pending = null;
3027
+ const minWidth = resolveMinWidth(options);
3028
+ const fromSize = measureMenuView(exiting, minWidth);
3029
+ const toSize = measureMenuView(rootView, minWidth);
3030
+ setViewportSize(content, fromSize);
3031
+ setMenuViewState(rootView, MENU_VIEW_INACTIVE_STATE);
3032
+ forceLayout(rootView);
3033
+ setMenuViewState(rootView, MENU_VIEW_ACTIVE_STATE);
3034
+ forceLayout(rootView);
3035
+ setViewportSize(content, toSize);
3036
+ }
3037
+ function syncMenuViewRoot(content, hasActiveChildView, options) {
3038
+ if (!content || hasActiveChildView) return;
3039
+ const viewport = getViewportElement(content);
3040
+ const rootView = getRootViewElement(viewport);
3041
+ if (!rootView || getActiveMenuViewElement(viewport)) return;
3042
+ const size = measureMenuView(rootView, resolveMinWidth(options));
3043
+ setMenuViewState(rootView, MENU_VIEW_ACTIVE_STATE);
3044
+ setViewportSize(content, size);
3045
+ }
3046
+ function syncMenuViewTransition(content, view, viewState, options) {
3047
+ if (!content || !view) return;
3048
+ const viewport = getViewportElement(content, view);
3049
+ const rootView = getRootViewElement(viewport);
3050
+ if (!rootView) return;
3051
+ const state = getViewportTransitionState(content);
3052
+ const phaseKey = `${viewState.phase}:${viewState.direction}`;
3053
+ if (state.phaseKeys.get(view) === phaseKey) return;
3054
+ state.phaseKeys.set(view, phaseKey);
3055
+ if (viewState.phase === "hidden") {
3056
+ state.phaseKeys.delete(view);
3057
+ syncMenuViewRoot(content, getActiveMenuViewElement(viewport) !== null, options);
3058
+ return;
3059
+ }
3060
+ if (viewState.phase === "entering") {
3061
+ prepareEnteringMenuView(content, rootView, view, state, options);
3062
+ return;
3063
+ }
3064
+ if (viewState.phase === "active") {
3065
+ startEnteringMenuView(content, rootView, view, state, options);
3066
+ return;
3067
+ }
3068
+ startExitingMenuView(content, rootView, view, state, options);
3069
+ }
3070
+
1950
3071
  //#endregion
1951
3072
  //#region ../core/dist/dev/dom/ui/popover/popover-positioning.js
3073
+ const ZERO_OFFSETS = {
3074
+ sideOffset: 0,
3075
+ alignOffset: 0,
3076
+ boundaryOffset: 0
3077
+ };
1952
3078
  const OPPOSITE_SIDE = {
1953
3079
  top: "bottom",
1954
3080
  bottom: "top",
1955
3081
  left: "right",
1956
3082
  right: "left"
1957
3083
  };
3084
+ function formatPixels(value) {
3085
+ return `${clamp(value, 0, Infinity)}px`;
3086
+ }
3087
+ function getCrossAxisAvailable(start, end, size, boundaryStart, boundaryEnd, align, alignOffset) {
3088
+ if (align === "start") return boundaryEnd - (start + alignOffset);
3089
+ if (align === "end") return end + alignOffset - boundaryStart;
3090
+ const center = start + size / 2 + alignOffset;
3091
+ return Math.min(center - boundaryStart, boundaryEnd - center) * 2;
3092
+ }
1958
3093
  /**
1959
3094
  * Get positioning styles for the popup element.
1960
3095
  *
@@ -1971,17 +3106,20 @@ const OPPOSITE_SIDE = {
1971
3106
  * `applyStyles()` from `@videojs/utils/dom`.
1972
3107
  */
1973
3108
  function getAnchorPositionStyle(anchorName, opts, triggerRect, popupRect, boundaryRect, offsets, cssVars = PopoverCSSVars) {
1974
- if (supportsAnchorPositioning()) return getAnchorPositionCSS(anchorName, opts, cssVars);
1975
- if (triggerRect && popupRect) return {
1976
- ...getManualPositionStyle(triggerRect, popupRect, opts, offsets ?? {
1977
- sideOffset: 0,
1978
- alignOffset: 0
1979
- }),
1980
- ...boundaryRect ? getPositioningCSSVars(triggerRect, boundaryRect, opts.side, cssVars) : {},
1981
- position: "fixed",
1982
- inset: "auto",
1983
- margin: "0"
3109
+ if (supportsAnchorPositioning()) return {
3110
+ ...getAnchorPositionCSS(anchorName, opts, cssVars),
3111
+ ...triggerRect && boundaryRect ? getPositioningCSSVars(triggerRect, boundaryRect, opts, offsets, cssVars) : {}
1984
3112
  };
3113
+ if (triggerRect && popupRect) {
3114
+ const resolved = offsets ?? ZERO_OFFSETS;
3115
+ return {
3116
+ ...getManualPositionStyle(triggerRect, popupRect, opts, resolved),
3117
+ ...boundaryRect ? getPositioningCSSVars(triggerRect, boundaryRect, opts, resolved, cssVars) : {},
3118
+ position: "fixed",
3119
+ inset: "auto",
3120
+ margin: "0"
3121
+ };
3122
+ }
1985
3123
  return {};
1986
3124
  }
1987
3125
  /** Generate style to set on the trigger for CSS Anchor Positioning. */
@@ -2029,16 +3167,24 @@ function getAnchorPositionCSS(anchorName, opts, cssVars = PopoverCSSVars) {
2029
3167
  * Accepts a `cssVars` map so the same logic works for both popover
2030
3168
  * (`--media-popover-*`) and tooltip (`--media-tooltip-*`) namespaces.
2031
3169
  */
2032
- function getPositioningCSSVars(triggerRect, boundaryRect, side, cssVars = PopoverCSSVars) {
3170
+ function getPositioningCSSVars(triggerRect, boundaryRect, opts, offsets = ZERO_OFFSETS, cssVars = PopoverCSSVars) {
2033
3171
  const vars = {};
3172
+ const { side, align } = opts;
3173
+ const boundaryOffset = offsets.boundaryOffset ?? 0;
3174
+ const boundaryStartX = boundaryRect.left + boundaryOffset;
3175
+ const boundaryEndX = boundaryRect.right - boundaryOffset;
3176
+ const boundaryStartY = boundaryRect.top + boundaryOffset;
3177
+ const boundaryEndY = boundaryRect.bottom - boundaryOffset;
2034
3178
  vars[cssVars.anchorWidth] = `${triggerRect.width}px`;
2035
3179
  vars[cssVars.anchorHeight] = `${triggerRect.height}px`;
2036
3180
  if (side === "top" || side === "bottom") {
2037
- vars[cssVars.availableHeight] = side === "top" ? `${triggerRect.top - boundaryRect.top}px` : `${boundaryRect.bottom - triggerRect.bottom}px`;
2038
- vars[cssVars.availableWidth] = `${boundaryRect.width}px`;
3181
+ const sideSpace = side === "top" ? triggerRect.top - boundaryStartY : boundaryEndY - triggerRect.bottom;
3182
+ vars[cssVars.availableHeight] = formatPixels(sideSpace - offsets.sideOffset);
3183
+ vars[cssVars.availableWidth] = formatPixels(getCrossAxisAvailable(triggerRect.left, triggerRect.right, triggerRect.width, boundaryStartX, boundaryEndX, align, offsets.alignOffset));
2039
3184
  } else {
2040
- vars[cssVars.availableWidth] = side === "left" ? `${triggerRect.left - boundaryRect.left}px` : `${boundaryRect.right - triggerRect.right}px`;
2041
- vars[cssVars.availableHeight] = `${boundaryRect.height}px`;
3185
+ const sideSpace = side === "left" ? triggerRect.left - boundaryStartX : boundaryEndX - triggerRect.right;
3186
+ vars[cssVars.availableWidth] = formatPixels(sideSpace - offsets.sideOffset);
3187
+ vars[cssVars.availableHeight] = formatPixels(getCrossAxisAvailable(triggerRect.top, triggerRect.bottom, triggerRect.height, boundaryStartY, boundaryEndY, align, offsets.alignOffset));
2042
3188
  }
2043
3189
  return vars;
2044
3190
  }
@@ -2076,14 +3222,15 @@ function getManualPositionStyle(triggerRect, popupRect, opts, offsets = {
2076
3222
  };
2077
3223
  }
2078
3224
  /**
2079
- * Read side-offset and align-offset CSS custom properties from the
3225
+ * Read positioning offset CSS custom properties from the
2080
3226
  * popup element's computed style, returning numeric pixel values.
2081
3227
  */
2082
3228
  function resolveOffsets(el, cssVars = PopoverCSSVars) {
2083
3229
  const computed = getComputedStyle(el);
2084
3230
  return {
2085
3231
  sideOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.sideOffset)),
2086
- alignOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.alignOffset))
3232
+ alignOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.alignOffset)),
3233
+ boundaryOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.boundaryOffset))
2087
3234
  };
2088
3235
  }
2089
3236
  /**
@@ -2097,17 +3244,7 @@ function getPopupPositionRect(el) {
2097
3244
  const rect = el.getBoundingClientRect();
2098
3245
  const width = el.offsetWidth || rect.width;
2099
3246
  const height = el.offsetHeight || rect.height;
2100
- const adjustedRect = {
2101
- ...rect,
2102
- width,
2103
- height,
2104
- right: rect.left + width,
2105
- bottom: rect.top + height
2106
- };
2107
- return {
2108
- ...adjustedRect,
2109
- toJSON: () => adjustedRect
2110
- };
3247
+ return createDOMRect(rect.left, rect.top, width, height);
2111
3248
  }
2112
3249
 
2113
3250
  //#endregion
@@ -2479,7 +3616,8 @@ const REASON_MAP = {
2479
3616
  hover: "hover",
2480
3617
  focus: "focus",
2481
3618
  escape: "escape",
2482
- blur: "blur"
3619
+ blur: "blur",
3620
+ "imperative-action": "imperative-action"
2483
3621
  };
2484
3622
  function createTooltip(options) {
2485
3623
  const popoverOpts = {
@@ -2547,7 +3685,7 @@ function createTooltip(options) {
2547
3685
  return popover.triggerElement;
2548
3686
  },
2549
3687
  open: () => popover.open("hover"),
2550
- close: () => popover.close("hover")
3688
+ close: (reason = "hover") => popover.close(reason)
2551
3689
  };
2552
3690
  }
2553
3691
 
@@ -2677,8 +3815,17 @@ function applyElementProps(element, props, options) {
2677
3815
  }
2678
3816
 
2679
3817
  //#endregion
2680
- //#region ../core/dist/dev/dom/utils/log.js
2681
- const warned = /* @__PURE__ */ new Set();
3818
+ //#region ../core/dist/dev/dom/utils/event.js
3819
+ function isEventWithinElement(event, element) {
3820
+ if (!element) return false;
3821
+ if (isFunction(event.composedPath)) return event.composedPath().includes(element);
3822
+ const target = event.target;
3823
+ return target instanceof Node && element.contains(target);
3824
+ }
3825
+
3826
+ //#endregion
3827
+ //#region ../core/dist/dev/dom/utils/log.js
3828
+ const warned = /* @__PURE__ */ new Set();
2682
3829
  function logMissingFeature(displayName, featureName) {
2683
3830
  const key = `${displayName}:${featureName}`;
2684
3831
  if (warned.has(key)) return;
@@ -2836,23 +3983,6 @@ var PlayButtonElement = class extends MediaButtonElement {
2836
3983
  }
2837
3984
  };
2838
3985
 
2839
- //#endregion
2840
- //#region src/ui/playback-rate-button/playback-rate-button-element.ts
2841
- var PlaybackRateButtonElement = class extends MediaButtonElement {
2842
- constructor(..._args) {
2843
- super(..._args);
2844
- this.core = new PlaybackRateButtonCore();
2845
- this.stateAttrMap = PlaybackRateButtonDataAttrs;
2846
- this.mediaState = new PlayerController(this, playerContext, selectPlaybackRate);
2847
- }
2848
- static {
2849
- this.tagName = "media-playback-rate-button";
2850
- }
2851
- activate(state) {
2852
- this.core.cycle(state);
2853
- }
2854
- };
2855
-
2856
3986
  //#endregion
2857
3987
  //#region src/ui/position-controller.ts
2858
3988
  /**
@@ -2860,7 +3990,8 @@ var PlaybackRateButtonElement = class extends MediaButtonElement {
2860
3990
  * popup elements (tooltips, popovers). Tracks scroll, resize, and
2861
3991
  * ResizeObserver events to keep the popup aligned with its trigger.
2862
3992
  *
2863
- * When native CSS Anchor Positioning is supported, `sync()` is a no-op.
3993
+ * Native CSS Anchor Positioning still uses this controller for dynamic
3994
+ * sizing variables such as available width/height.
2864
3995
  */
2865
3996
  var PositionController = class {
2866
3997
  #host;
@@ -2868,6 +3999,7 @@ var PositionController = class {
2868
3999
  #frame = 0;
2869
4000
  #resizeObserver = null;
2870
4001
  #trigger = null;
4002
+ #boundary = null;
2871
4003
  constructor(host) {
2872
4004
  this.#host = host;
2873
4005
  host.addController(this);
@@ -2878,15 +4010,16 @@ var PositionController = class {
2878
4010
  return this.#host.getRootNode().querySelector(`[commandfor="${this.#host.id}"]`);
2879
4011
  }
2880
4012
  /** Start or update position tracking for the given trigger. */
2881
- sync(trigger) {
2882
- if (supportsAnchorPositioning()) return;
4013
+ sync(trigger, boundary = null) {
2883
4014
  if (!trigger) return;
2884
- if (this.#abort && this.#trigger === trigger) return;
4015
+ if (this.#abort && this.#trigger === trigger && this.#boundary === boundary) return;
2885
4016
  this.cleanup();
2886
4017
  this.#abort = new AbortController();
2887
4018
  this.#trigger = trigger;
4019
+ this.#boundary = boundary;
2888
4020
  const { signal } = this.#abort;
2889
- const reposition = () => {
4021
+ const reposition = (event) => {
4022
+ if (event && isEventWithinElement(event, this.#host)) return;
2890
4023
  cancelAnimationFrame(this.#frame);
2891
4024
  this.#frame = requestAnimationFrame(() => {
2892
4025
  if (signal.aborted) return;
@@ -2905,6 +4038,7 @@ var PositionController = class {
2905
4038
  });
2906
4039
  this.#resizeObserver.observe(trigger);
2907
4040
  this.#resizeObserver.observe(this.#host);
4041
+ if (boundary) this.#resizeObserver.observe(boundary);
2908
4042
  }
2909
4043
  reposition();
2910
4044
  }
@@ -2913,6 +4047,7 @@ var PositionController = class {
2913
4047
  this.#abort?.abort();
2914
4048
  this.#abort = null;
2915
4049
  this.#trigger = null;
4050
+ this.#boundary = null;
2916
4051
  cancelAnimationFrame(this.#frame);
2917
4052
  this.#frame = 0;
2918
4053
  this.#resizeObserver?.disconnect();
@@ -2926,6 +4061,440 @@ var PositionController = class {
2926
4061
  }
2927
4062
  };
2928
4063
 
4064
+ //#endregion
4065
+ //#region src/ui/menu/context.ts
4066
+ const MENU_CONTEXT_KEY = Symbol("@videojs/menu");
4067
+ const MENU_RADIO_GROUP_CONTEXT_KEY = Symbol("@videojs/menu-radio-group");
4068
+ const menuContext = createContext(MENU_CONTEXT_KEY);
4069
+ const menuRadioGroupContext = createContext(MENU_RADIO_GROUP_CONTEXT_KEY);
4070
+
4071
+ //#endregion
4072
+ //#region src/ui/menu/menu-element.ts
4073
+ var MenuElement = class extends MediaElement {
4074
+ constructor(..._args) {
4075
+ super(..._args);
4076
+ this.open = MenuCore.defaultProps.open;
4077
+ this.defaultOpen = MenuCore.defaultProps.defaultOpen;
4078
+ this.side = MenuCore.defaultProps.side;
4079
+ this.align = MenuCore.defaultProps.align;
4080
+ this.closeOnEscape = MenuCore.defaultProps.closeOnEscape;
4081
+ this.closeOnOutsideClick = MenuCore.defaultProps.closeOnOutsideClick;
4082
+ this.boundary = "container";
4083
+ this.#core = new MenuCore();
4084
+ this.#provider = new ContextProvider(this, { context: menuContext });
4085
+ this.#position = new PositionController(this);
4086
+ this.#containerCtx = new ContextConsumer(this, {
4087
+ context: containerContext,
4088
+ subscribe: true
4089
+ });
4090
+ this.#parentCtx = new ContextConsumer(this, {
4091
+ context: menuContext,
4092
+ subscribe: true
4093
+ });
4094
+ this.#menuViewTransition = createMenuViewTransition({
4095
+ focusFirstItem: () => {
4096
+ this.#menu?.highlightFirstItem({ preventScroll: true });
4097
+ },
4098
+ restoreFocus: (triggerId) => {
4099
+ const triggerElement = triggerId ? document.getElementById(triggerId) : null;
4100
+ const fallbackTrigger = this.parentElement?.querySelector(`[data-has-submenu][commandfor="${this.id}"]`);
4101
+ (triggerElement ?? fallbackTrigger)?.focus({ preventScroll: true });
4102
+ }
4103
+ });
4104
+ this.#menu = null;
4105
+ this.#snapshot = null;
4106
+ this.#navSnapshot = null;
4107
+ this.#menuViewSnapshot = null;
4108
+ this.#navState = {
4109
+ stack: [],
4110
+ direction: "forward"
4111
+ };
4112
+ this.#disconnect = null;
4113
+ this.#triggerAbort = null;
4114
+ this.#currentTrigger = null;
4115
+ this.#handleContentKeyDown = (event) => {
4116
+ const isNavigationKey = isMenuNavigationKey(event);
4117
+ const defaultPreventedBeforeMenu = event.defaultPrevented;
4118
+ this.#menu?.contentProps.onKeyDown(event);
4119
+ const parentCtx = this.#parentCtx.value ?? null;
4120
+ if (!parentCtx) {
4121
+ if (event.key === "Escape") return;
4122
+ if (isNavigationKey) event.stopPropagation();
4123
+ return;
4124
+ }
4125
+ const stack = parentCtx.menu.navigationInput.current.stack;
4126
+ const ownsActiveSubmenu = stack[stack.length - 1]?.menuId === this.id;
4127
+ const isBackNavigationKey = event.key === "ArrowLeft" || event.key === "Escape";
4128
+ if (isBackNavigationKey && ownsActiveSubmenu && !defaultPreventedBeforeMenu) {
4129
+ event.preventDefault();
4130
+ parentCtx.menu.pop();
4131
+ }
4132
+ if (isNavigationKey && (!isBackNavigationKey || ownsActiveSubmenu)) event.stopPropagation();
4133
+ };
4134
+ this.#handleContentFocusOut = (event) => {
4135
+ this.#menu?.contentProps.onFocusOut(event);
4136
+ };
4137
+ }
4138
+ static {
4139
+ this.tagName = "media-menu";
4140
+ }
4141
+ static {
4142
+ this.properties = {
4143
+ open: { type: Boolean },
4144
+ defaultOpen: {
4145
+ type: Boolean,
4146
+ attribute: "default-open"
4147
+ },
4148
+ side: { type: String },
4149
+ align: { type: String },
4150
+ closeOnEscape: {
4151
+ type: Boolean,
4152
+ attribute: "close-on-escape"
4153
+ },
4154
+ closeOnOutsideClick: {
4155
+ type: Boolean,
4156
+ attribute: "close-on-outside-click"
4157
+ },
4158
+ boundary: { type: String }
4159
+ };
4160
+ }
4161
+ #core;
4162
+ #provider;
4163
+ #position;
4164
+ #containerCtx;
4165
+ #parentCtx;
4166
+ #menuViewTransition;
4167
+ #menu;
4168
+ #snapshot;
4169
+ #navSnapshot;
4170
+ #menuViewSnapshot;
4171
+ #navState;
4172
+ #disconnect;
4173
+ #triggerAbort;
4174
+ #currentTrigger;
4175
+ connectedCallback() {
4176
+ super.connectedCallback();
4177
+ if (this.destroyed) return;
4178
+ this.setAttribute(POPUP_HOST_ATTR, "");
4179
+ this.#disconnect = new AbortController();
4180
+ this.#menu = createMenu({
4181
+ transition: createTransition(),
4182
+ onOpenChange: (nextOpen, details) => {
4183
+ this.open = nextOpen;
4184
+ this.dispatchEvent(new CustomEvent("open-change", { detail: {
4185
+ open: nextOpen,
4186
+ ...details
4187
+ } }));
4188
+ },
4189
+ closeOnEscape: () => this.closeOnEscape,
4190
+ closeOnOutsideClick: () => this.closeOnOutsideClick,
4191
+ group: () => this.#parentCtx.value ? void 0 : this.#containerCtx.value?.popupGroup
4192
+ });
4193
+ this.#menu.setContentElement(this);
4194
+ applyElementProps(this, {
4195
+ onKeyDown: this.#handleContentKeyDown,
4196
+ onFocusOut: this.#handleContentFocusOut
4197
+ }, { signal: this.#disconnect.signal });
4198
+ if (this.#snapshot) this.#snapshot.track(this.#menu.input);
4199
+ else this.#snapshot = new SnapshotController(this, this.#menu.input);
4200
+ if (this.#navSnapshot) this.#navSnapshot.track(this.#menu.navigationInput);
4201
+ else this.#navSnapshot = new SnapshotController(this, this.#menu.navigationInput);
4202
+ if (this.#menuViewSnapshot) this.#menuViewSnapshot.track(this.#menuViewTransition.input);
4203
+ else this.#menuViewSnapshot = new SnapshotController(this, this.#menuViewTransition.input);
4204
+ }
4205
+ firstUpdated(changed) {
4206
+ super.firstUpdated(changed);
4207
+ if (this.defaultOpen && !this.open) this.#menu?.open();
4208
+ }
4209
+ disconnectedCallback() {
4210
+ super.disconnectedCallback();
4211
+ this.#cleanupTrigger();
4212
+ this.#menu?.destroy();
4213
+ this.#menu = null;
4214
+ this.#disconnect?.abort();
4215
+ this.#disconnect = null;
4216
+ this.#menuViewTransition.destroy();
4217
+ }
4218
+ close(reason = "imperative-action") {
4219
+ this.#menu?.close(reason);
4220
+ }
4221
+ willUpdate(changed) {
4222
+ super.willUpdate(changed);
4223
+ const isSubmenu = (this.#parentCtx.value ?? null) !== null;
4224
+ this.#core.setProps({
4225
+ open: this.open,
4226
+ defaultOpen: this.defaultOpen,
4227
+ side: this.side,
4228
+ align: this.align,
4229
+ closeOnEscape: this.closeOnEscape,
4230
+ closeOnOutsideClick: this.closeOnOutsideClick,
4231
+ isSubmenu
4232
+ });
4233
+ if (this.#menu && changed.has("open") && !isSubmenu) {
4234
+ const { active: interactionOpen } = this.#menu.input.current;
4235
+ if (this.open !== interactionOpen) if (this.open) this.#menu.open();
4236
+ else this.#menu.close();
4237
+ }
4238
+ }
4239
+ update(_changed) {
4240
+ super.update(_changed);
4241
+ if (!this.#menu) return;
4242
+ const parentCtx = this.#parentCtx.value ?? null;
4243
+ const isSubmenu = parentCtx !== null;
4244
+ this.#navState = this.#menu.navigationInput.current;
4245
+ const input = this.#menu.input.current;
4246
+ this.#core.setInput(input);
4247
+ const state = this.#core.getState();
4248
+ if (isSubmenu && parentCtx) this.#updateAsSubmenu(parentCtx);
4249
+ else this.#updateAsRoot(state);
4250
+ const parentMenu = parentCtx?.menu ?? null;
4251
+ this.#provider.setValue({
4252
+ menu: this.#menu,
4253
+ state,
4254
+ stateAttrMap: MenuDataAttrs,
4255
+ navigation: this.#navState,
4256
+ parentMenu
4257
+ });
4258
+ }
4259
+ #updateAsRoot(state) {
4260
+ if (!this.#menu) return;
4261
+ const triggerElement = this.#position.findTrigger();
4262
+ this.#syncTrigger(triggerElement);
4263
+ applyElementProps(this, {
4264
+ ...this.#core.getContentAttrs(state),
4265
+ ...getMenuViewportAttrs()
4266
+ });
4267
+ applyStateDataAttrs(this, state, MenuDataAttrs);
4268
+ if (state.open) tryShowPopover(this);
4269
+ else tryHidePopover(this);
4270
+ if (this.#currentTrigger) {
4271
+ applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));
4272
+ applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
4273
+ }
4274
+ if (!state.open) {
4275
+ this.#position.cleanup();
4276
+ return;
4277
+ }
4278
+ syncMenuViewRoot(this, this.#navState.stack.length > 0);
4279
+ const positionOptions = getRootPositionOptions(state.side, state.align);
4280
+ if (!positionOptions) return;
4281
+ const boundaryElement = this.#getBoundaryElement();
4282
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
4283
+ const boundaryRect = getPositioningBoundaryRect(boundaryElement);
4284
+ const offsets = resolveOffsets(this);
4285
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, positionOptions, triggerRect, void 0, boundaryRect, offsets));
4286
+ else {
4287
+ const selfRect = getPopupPositionRect(this);
4288
+ applyStyles(this, getAnchorPositionStyle(this.id, positionOptions, triggerRect, selfRect, boundaryRect, offsets));
4289
+ }
4290
+ this.#position.sync(this.#currentTrigger, boundaryElement);
4291
+ }
4292
+ #updateAsSubmenu(parentCtx) {
4293
+ const parentNavigation = parentCtx.navigation;
4294
+ const topEntry = parentNavigation.stack[parentNavigation.stack.length - 1];
4295
+ const isActive = (topEntry?.menuId ?? null) === this.id;
4296
+ this.#menuViewTransition.setElement(this);
4297
+ this.#menuViewTransition.sync({
4298
+ active: isActive,
4299
+ direction: parentNavigation.direction,
4300
+ triggerId: topEntry?.triggerId ?? null
4301
+ });
4302
+ const transitionState = this.#menuViewTransition.input.current;
4303
+ applyElementProps(this, {
4304
+ ...getMenuViewTransitionAttrs(transitionState),
4305
+ role: "menu",
4306
+ tabIndex: -1,
4307
+ "data-submenu": ""
4308
+ });
4309
+ syncMenuViewTransition(parentCtx.menu.contentElement, this, transitionState);
4310
+ }
4311
+ #handleContentKeyDown;
4312
+ #handleContentFocusOut;
4313
+ #syncTrigger(triggerElement) {
4314
+ if (triggerElement === this.#currentTrigger) return;
4315
+ this.#position.cleanup();
4316
+ this.#cleanupTrigger();
4317
+ this.#currentTrigger = triggerElement;
4318
+ this.#menu?.setTriggerElement(triggerElement);
4319
+ if (triggerElement && this.#menu) {
4320
+ this.#triggerAbort = new AbortController();
4321
+ applyElementProps(triggerElement, this.#menu.triggerProps, { signal: this.#triggerAbort.signal });
4322
+ }
4323
+ }
4324
+ #cleanupTrigger() {
4325
+ if (this.#currentTrigger) {
4326
+ applyElementProps(this.#currentTrigger, {
4327
+ "aria-expanded": void 0,
4328
+ "aria-haspopup": void 0,
4329
+ "aria-controls": void 0
4330
+ });
4331
+ this.#currentTrigger.style.removeProperty("anchor-name");
4332
+ }
4333
+ this.#triggerAbort?.abort();
4334
+ this.#triggerAbort = null;
4335
+ this.#currentTrigger = null;
4336
+ }
4337
+ #getBoundaryElement() {
4338
+ return resolvePositioningBoundary(this.boundary, {
4339
+ container: this.#containerCtx.value?.container ?? null,
4340
+ root: this.getRootNode()
4341
+ });
4342
+ }
4343
+ };
4344
+
4345
+ //#endregion
4346
+ //#region src/ui/menu/menu-item-indicator-element.ts
4347
+ var MenuItemIndicatorElement = class extends MediaElement {
4348
+ constructor(..._args) {
4349
+ super(..._args);
4350
+ this.checked = false;
4351
+ this.forceMount = false;
4352
+ }
4353
+ static {
4354
+ this.tagName = "media-menu-item-indicator";
4355
+ }
4356
+ static {
4357
+ this.properties = {
4358
+ checked: { type: Boolean },
4359
+ forceMount: {
4360
+ type: Boolean,
4361
+ attribute: "force-mount"
4362
+ }
4363
+ };
4364
+ }
4365
+ update(_changed) {
4366
+ super.update(_changed);
4367
+ const hidden = !this.checked && !this.forceMount;
4368
+ applyElementProps(this, {
4369
+ "aria-hidden": "true",
4370
+ hidden
4371
+ });
4372
+ }
4373
+ };
4374
+
4375
+ //#endregion
4376
+ //#region src/ui/menu/menu-radio-group-element.ts
4377
+ var MenuRadioGroupElement = class extends MediaElement {
4378
+ constructor(..._args) {
4379
+ super(..._args);
4380
+ this.value = "";
4381
+ this.label = void 0;
4382
+ this.#menuCtx = new ContextConsumer(this, {
4383
+ context: menuContext,
4384
+ subscribe: true
4385
+ });
4386
+ this.#provider = new ContextProvider(this, { context: menuRadioGroupContext });
4387
+ }
4388
+ static {
4389
+ this.tagName = "media-menu-radio-group";
4390
+ }
4391
+ static {
4392
+ this.properties = {
4393
+ value: { type: String },
4394
+ label: { type: String }
4395
+ };
4396
+ }
4397
+ #menuCtx;
4398
+ #provider;
4399
+ update(_changed) {
4400
+ super.update(_changed);
4401
+ applyElementProps(this, {
4402
+ role: "group",
4403
+ "aria-label": this.label
4404
+ });
4405
+ const ctx = this.#menuCtx.value;
4406
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
4407
+ this.#provider.setValue({
4408
+ value: this.value,
4409
+ onValueChange: (next) => {
4410
+ this.value = next;
4411
+ this.dispatchEvent(new CustomEvent("value-change", {
4412
+ detail: { value: next },
4413
+ bubbles: true
4414
+ }));
4415
+ }
4416
+ });
4417
+ }
4418
+ };
4419
+
4420
+ //#endregion
4421
+ //#region src/ui/menu/menu-radio-item-element.ts
4422
+ var MenuRadioItemElement = class extends MediaElement {
4423
+ constructor(..._args) {
4424
+ super(..._args);
4425
+ this.value = "";
4426
+ this.disabled = false;
4427
+ this.#menuCtx = new ContextConsumer(this, {
4428
+ context: menuContext,
4429
+ subscribe: true
4430
+ });
4431
+ this.#groupCtx = new ContextConsumer(this, {
4432
+ context: menuRadioGroupContext,
4433
+ subscribe: true
4434
+ });
4435
+ this.#disconnect = null;
4436
+ this.#registered = false;
4437
+ this.#cleanupRegistration = null;
4438
+ }
4439
+ static {
4440
+ this.tagName = "media-menu-radio-item";
4441
+ }
4442
+ static {
4443
+ this.properties = {
4444
+ value: { type: String },
4445
+ disabled: { type: Boolean }
4446
+ };
4447
+ }
4448
+ #menuCtx;
4449
+ #groupCtx;
4450
+ #disconnect;
4451
+ #registered;
4452
+ #cleanupRegistration;
4453
+ connectedCallback() {
4454
+ super.connectedCallback();
4455
+ this.#disconnect = new AbortController();
4456
+ this.#registered = false;
4457
+ }
4458
+ disconnectedCallback() {
4459
+ super.disconnectedCallback();
4460
+ this.#cleanupRegistration?.();
4461
+ this.#cleanupRegistration = null;
4462
+ this.#disconnect?.abort();
4463
+ this.#disconnect = null;
4464
+ this.#registered = false;
4465
+ }
4466
+ update(_changed) {
4467
+ super.update(_changed);
4468
+ const menuCtx = this.#menuCtx.value;
4469
+ const groupCtx = this.#groupCtx.value;
4470
+ if (!menuCtx || !groupCtx || !this.#disconnect) return;
4471
+ if (!this.#registered) {
4472
+ this.#registered = true;
4473
+ this.#cleanupRegistration = menuCtx.menu.registerItem(this);
4474
+ applyElementProps(this, {
4475
+ onClick: () => {
4476
+ const currentMenuCtx = this.#menuCtx.value;
4477
+ const currentGroupCtx = this.#groupCtx.value;
4478
+ if (!currentMenuCtx || !currentGroupCtx || this.disabled) return;
4479
+ currentGroupCtx.onValueChange(this.value);
4480
+ completeMenuItemSelection(currentMenuCtx.menu, currentMenuCtx.parentMenu);
4481
+ },
4482
+ onPointerenter: () => {
4483
+ const currentMenuCtx = this.#menuCtx.value;
4484
+ if (!this.disabled) currentMenuCtx?.menu.highlight(this, { focus: false });
4485
+ }
4486
+ }, { signal: this.#disconnect.signal });
4487
+ }
4488
+ const checked = groupCtx.value === this.value;
4489
+ applyElementProps(this, {
4490
+ role: "menuitemradio",
4491
+ "aria-checked": String(checked),
4492
+ "aria-disabled": this.disabled ? "true" : void 0
4493
+ });
4494
+ applyStateDataAttrs(this, menuCtx.state, menuCtx.stateAttrMap);
4495
+ }
4496
+ };
4497
+
2929
4498
  //#endregion
2930
4499
  //#region src/ui/popover/popover-element.ts
2931
4500
  var PopoverElement = class extends MediaElement {
@@ -2941,7 +4510,12 @@ var PopoverElement = class extends MediaElement {
2941
4510
  this.openOnHover = PopoverCore.defaultProps.openOnHover;
2942
4511
  this.delay = PopoverCore.defaultProps.delay;
2943
4512
  this.closeDelay = PopoverCore.defaultProps.closeDelay;
4513
+ this.boundary = "container";
2944
4514
  this.#core = new PopoverCore();
4515
+ this.#containerCtx = new ContextConsumer(this, {
4516
+ context: containerContext,
4517
+ subscribe: true
4518
+ });
2945
4519
  this.#position = new PositionController(this);
2946
4520
  this.#popover = null;
2947
4521
  this.#snapshot = null;
@@ -2978,10 +4552,12 @@ var PopoverElement = class extends MediaElement {
2978
4552
  closeDelay: {
2979
4553
  type: Number,
2980
4554
  attribute: "close-delay"
2981
- }
4555
+ },
4556
+ boundary: { type: String }
2982
4557
  };
2983
4558
  }
2984
4559
  #core;
4560
+ #containerCtx;
2985
4561
  #position;
2986
4562
  #popover;
2987
4563
  #snapshot;
@@ -2991,6 +4567,7 @@ var PopoverElement = class extends MediaElement {
2991
4567
  connectedCallback() {
2992
4568
  super.connectedCallback();
2993
4569
  if (this.destroyed) return;
4570
+ this.setAttribute(POPUP_HOST_ATTR, "");
2994
4571
  this.#disconnect = new AbortController();
2995
4572
  this.#popover = createPopover({
2996
4573
  transition: createTransition(),
@@ -3005,7 +4582,8 @@ var PopoverElement = class extends MediaElement {
3005
4582
  closeOnOutsideClick: () => this.closeOnOutsideClick,
3006
4583
  openOnHover: () => this.openOnHover,
3007
4584
  delay: () => this.delay,
3008
- closeDelay: () => this.closeDelay
4585
+ closeDelay: () => this.closeDelay,
4586
+ group: () => this.#containerCtx.value?.popupGroup
3009
4587
  });
3010
4588
  this.#popover.setPopupElement(this);
3011
4589
  applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });
@@ -3026,6 +4604,9 @@ var PopoverElement = class extends MediaElement {
3026
4604
  this.#popover?.destroy();
3027
4605
  super.destroyCallback();
3028
4606
  }
4607
+ close(reason = "imperative-action") {
4608
+ this.#popover?.close(reason);
4609
+ }
3029
4610
  willUpdate(changed) {
3030
4611
  super.willUpdate(changed);
3031
4612
  this.#core.setProps(this);
@@ -3059,15 +4640,16 @@ var PopoverElement = class extends MediaElement {
3059
4640
  side: state.side,
3060
4641
  align: state.align
3061
4642
  };
3062
- if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts));
4643
+ const boundaryElement = this.#getBoundaryElement();
4644
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
4645
+ const boundaryRect = getPositioningBoundaryRect(boundaryElement);
4646
+ const offsets = resolveOffsets(this);
4647
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, void 0, boundaryRect, offsets));
3063
4648
  else {
3064
- const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3065
4649
  const selfRect = getPopupPositionRect(this);
3066
- const boundaryRect = document.documentElement.getBoundingClientRect();
3067
- const offsets = resolveOffsets(this);
3068
4650
  applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));
3069
4651
  }
3070
- this.#position.sync(this.#currentTrigger);
4652
+ this.#position.sync(this.#currentTrigger, boundaryElement);
3071
4653
  }
3072
4654
  #syncTrigger(triggerEl) {
3073
4655
  if (triggerEl === this.#currentTrigger) return;
@@ -3093,29 +4675,11 @@ var PopoverElement = class extends MediaElement {
3093
4675
  this.#triggerAbort = null;
3094
4676
  this.#currentTrigger = null;
3095
4677
  }
3096
- };
3097
-
3098
- //#endregion
3099
- //#region src/ui/seek-button/seek-button-element.ts
3100
- var SeekButtonElement = class extends MediaButtonElement {
3101
- constructor(..._args) {
3102
- super(..._args);
3103
- this.seconds = SeekButtonCore.defaultProps.seconds;
3104
- this.core = new SeekButtonCore();
3105
- this.stateAttrMap = SeekButtonDataAttrs;
3106
- this.mediaState = new PlayerController(this, playerContext, selectTime);
3107
- }
3108
- static {
3109
- this.tagName = "media-seek-button";
3110
- }
3111
- static {
3112
- this.properties = {
3113
- ...MediaButtonElement.properties,
3114
- seconds: { type: Number }
3115
- };
3116
- }
3117
- activate(state) {
3118
- this.core.seek(state);
4678
+ #getBoundaryElement() {
4679
+ return resolvePositioningBoundary(this.boundary, {
4680
+ container: this.#containerCtx.value?.container ?? null,
4681
+ root: this.getRootNode()
4682
+ });
3119
4683
  }
3120
4684
  };
3121
4685
 
@@ -3140,8 +4704,13 @@ var TooltipElement = class extends MediaElement {
3140
4704
  this.closeDelay = TooltipCore.defaultProps.closeDelay;
3141
4705
  this.disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;
3142
4706
  this.disabled = TooltipCore.defaultProps.disabled;
4707
+ this.boundary = "container";
3143
4708
  this.#core = new TooltipCore();
3144
4709
  this.#groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
4710
+ this.#containerCtx = new ContextConsumer(this, {
4711
+ context: containerContext,
4712
+ subscribe: true
4713
+ });
3145
4714
  this.#position = new PositionController(this);
3146
4715
  this.#tooltip = null;
3147
4716
  this.#snapshot = null;
@@ -3170,11 +4739,13 @@ var TooltipElement = class extends MediaElement {
3170
4739
  type: Boolean,
3171
4740
  attribute: "disable-hoverable-popup"
3172
4741
  },
3173
- disabled: { type: Boolean }
4742
+ disabled: { type: Boolean },
4743
+ boundary: { type: String }
3174
4744
  };
3175
4745
  }
3176
4746
  #core;
3177
4747
  #groupConsumer;
4748
+ #containerCtx;
3178
4749
  #position;
3179
4750
  #tooltip;
3180
4751
  #snapshot;
@@ -3184,6 +4755,7 @@ var TooltipElement = class extends MediaElement {
3184
4755
  connectedCallback() {
3185
4756
  super.connectedCallback();
3186
4757
  if (this.destroyed) return;
4758
+ this.setAttribute(POPUP_HOST_ATTR, "");
3187
4759
  this.#disconnect = new AbortController();
3188
4760
  this.#tooltip = createTooltip({
3189
4761
  transition: createTransition(),
@@ -3217,6 +4789,9 @@ var TooltipElement = class extends MediaElement {
3217
4789
  this.#disconnect?.abort();
3218
4790
  this.#disconnect = null;
3219
4791
  }
4792
+ close(reason = "imperative-action") {
4793
+ this.#tooltip?.close(reason);
4794
+ }
3220
4795
  willUpdate(changed) {
3221
4796
  super.willUpdate(changed);
3222
4797
  this.#core.setProps(this);
@@ -3247,15 +4822,16 @@ var TooltipElement = class extends MediaElement {
3247
4822
  side: state.side,
3248
4823
  align: state.align
3249
4824
  };
3250
- if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts, void 0, void 0, void 0, void 0, TooltipCSSVars));
4825
+ const boundaryElement = this.#getBoundaryElement();
4826
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
4827
+ const boundaryRect = getPositioningBoundaryRect(boundaryElement);
4828
+ const offsets = resolveOffsets(this, TooltipCSSVars);
4829
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, void 0, boundaryRect, offsets, TooltipCSSVars));
3251
4830
  else {
3252
- const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3253
4831
  const selfRect = getPopupPositionRect(this);
3254
- const boundaryRect = document.documentElement.getBoundingClientRect();
3255
- const offsets = resolveOffsets(this, TooltipCSSVars);
3256
4832
  applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars));
3257
4833
  }
3258
- this.#position.sync(this.#currentTrigger);
4834
+ this.#position.sync(this.#currentTrigger, boundaryElement);
3259
4835
  }
3260
4836
  #syncTrigger(triggerEl) {
3261
4837
  if (triggerEl === this.#currentTrigger) return;
@@ -3281,6 +4857,12 @@ var TooltipElement = class extends MediaElement {
3281
4857
  this.#triggerAbort = null;
3282
4858
  this.#currentTrigger = null;
3283
4859
  }
4860
+ #getBoundaryElement() {
4861
+ return resolvePositioningBoundary(this.boundary, {
4862
+ container: this.#containerCtx.value?.container ?? null,
4863
+ root: this.getRootNode()
4864
+ });
4865
+ }
3284
4866
  };
3285
4867
 
3286
4868
  //#endregion
@@ -3383,169 +4965,644 @@ var AlertDialogCloseElement = class extends MediaElement {
3383
4965
  var ContextPartElement = class extends MediaElement {
3384
4966
  update(_changed) {
3385
4967
  super.update(_changed);
3386
- const ctx = this.consumer.value;
3387
- if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
4968
+ const ctx = this.consumer.value;
4969
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
4970
+ }
4971
+ };
4972
+
4973
+ //#endregion
4974
+ //#region src/ui/alert-dialog/alert-dialog-description-element.ts
4975
+ var AlertDialogDescriptionElement = class extends ContextPartElement {
4976
+ constructor(..._args) {
4977
+ super(..._args);
4978
+ this.consumer = new ContextConsumer(this, {
4979
+ context: alertDialogContext,
4980
+ subscribe: true
4981
+ });
4982
+ }
4983
+ static {
4984
+ this.tagName = "media-alert-dialog-description";
4985
+ }
4986
+ update(changed) {
4987
+ super.update(changed);
4988
+ const descriptionId = this.consumer.value?.state.descriptionId;
4989
+ if (descriptionId) this.id = descriptionId;
4990
+ }
4991
+ };
4992
+
4993
+ //#endregion
4994
+ //#region src/ui/alert-dialog/alert-dialog-title-element.ts
4995
+ var AlertDialogTitleElement = class extends ContextPartElement {
4996
+ constructor(..._args) {
4997
+ super(..._args);
4998
+ this.consumer = new ContextConsumer(this, {
4999
+ context: alertDialogContext,
5000
+ subscribe: true
5001
+ });
5002
+ }
5003
+ static {
5004
+ this.tagName = "media-alert-dialog-title";
5005
+ }
5006
+ update(changed) {
5007
+ super.update(changed);
5008
+ const titleId = this.consumer.value?.state.titleId;
5009
+ if (titleId) this.id = titleId;
5010
+ }
5011
+ };
5012
+
5013
+ //#endregion
5014
+ //#region src/ui/controls/context.ts
5015
+ const CONTROLS_CONTEXT_KEY = Symbol("@videojs/controls");
5016
+ const controlsContext = createContext(CONTROLS_CONTEXT_KEY);
5017
+
5018
+ //#endregion
5019
+ //#region src/ui/controls/controls-element.ts
5020
+ var ControlsElement = class extends MediaElement {
5021
+ static {
5022
+ this.tagName = "media-controls";
5023
+ }
5024
+ #core = new ControlsCore();
5025
+ #mediaState = new PlayerController(this, playerContext, selectControls);
5026
+ #provider = new ContextProvider(this, { context: controlsContext });
5027
+ #visible = true;
5028
+ connectedCallback() {
5029
+ super.connectedCallback();
5030
+ if (!this.#mediaState.value && this.#mediaState.displayName) logMissingFeature(this.localName, this.#mediaState.displayName);
5031
+ }
5032
+ update(_changed) {
5033
+ super.update(_changed);
5034
+ const media = this.#mediaState.value;
5035
+ if (!media) return;
5036
+ this.#core.setMedia(media);
5037
+ const state = this.#core.getState();
5038
+ applyStateDataAttrs(this, state, ControlsDataAttrs);
5039
+ this.#provider.setValue({
5040
+ state,
5041
+ stateAttrMap: ControlsDataAttrs
5042
+ });
5043
+ const wasVisible = this.#visible;
5044
+ this.#visible = state.visible;
5045
+ if (wasVisible && !state.visible) this.#closeOwnedOverlays();
5046
+ }
5047
+ #closeOwnedOverlays() {
5048
+ for (const element of this.querySelectorAll(POPUP_HOST_SELECTOR)) {
5049
+ const host = element;
5050
+ if (!isFunction(host.close)) continue;
5051
+ host.close("imperative-action");
5052
+ }
5053
+ }
5054
+ };
5055
+
5056
+ //#endregion
5057
+ //#region src/ui/controls/controls-group-element.ts
5058
+ var ControlsGroupElement = class extends ContextPartElement {
5059
+ constructor(..._args) {
5060
+ super(..._args);
5061
+ this.consumer = new ContextConsumer(this, {
5062
+ context: controlsContext,
5063
+ subscribe: true
5064
+ });
5065
+ }
5066
+ static {
5067
+ this.tagName = "media-controls-group";
5068
+ }
5069
+ connectedCallback() {
5070
+ super.connectedCallback();
5071
+ if (this.hasAttribute("aria-label") || this.hasAttribute("aria-labelledby")) this.setAttribute("role", "group");
5072
+ }
5073
+ };
5074
+
5075
+ //#endregion
5076
+ //#region src/ui/error-dialog/error-dialog-element.ts
5077
+ const FALLBACK_MESSAGE = "An error occurred. Please try again.";
5078
+ let idCounter = 0;
5079
+ var ErrorDialogElement = class extends MediaElement {
5080
+ static {
5081
+ this.tagName = "media-error-dialog";
5082
+ }
5083
+ #core = new ErrorDialogCore();
5084
+ #provider = new ContextProvider(this, { context: alertDialogContext });
5085
+ #titleId = `vjs-error-dialog-title-${idCounter++}`;
5086
+ #descriptionId = `vjs-error-dialog-desc-${idCounter++}`;
5087
+ #errorState = new PlayerController(this, playerContext, selectError);
5088
+ #dialog = null;
5089
+ #snapshot = null;
5090
+ #lastErrorMessage = null;
5091
+ constructor() {
5092
+ super();
5093
+ this.#core.setTitleId(this.#titleId);
5094
+ this.#core.setDescriptionId(this.#descriptionId);
5095
+ }
5096
+ connectedCallback() {
5097
+ super.connectedCallback();
5098
+ if (this.destroyed) return;
5099
+ this.#dialog = createAlertDialog({
5100
+ transition: createTransition(),
5101
+ onOpenChange: (nextOpen) => {
5102
+ if (!nextOpen) this.#errorState.value?.dismissError();
5103
+ }
5104
+ });
5105
+ this.#dialog.setElement(this);
5106
+ if (this.#snapshot) this.#snapshot.track(this.#dialog.input);
5107
+ else this.#snapshot = new SnapshotController(this, this.#dialog.input);
5108
+ }
5109
+ disconnectedCallback() {
5110
+ super.disconnectedCallback();
5111
+ this.#dialog?.destroy();
5112
+ this.#dialog = null;
5113
+ }
5114
+ willUpdate(_changed) {
5115
+ super.willUpdate(_changed);
5116
+ if (!this.#dialog) return;
5117
+ const errorState = this.#errorState.value;
5118
+ const hasError = Boolean(errorState?.error);
5119
+ const { active: isOpen } = this.#dialog.input.current;
5120
+ if (errorState?.error) {
5121
+ const message = errorState.error.message?.trim();
5122
+ this.#lastErrorMessage = message || null;
5123
+ }
5124
+ const desc = this.querySelector("media-alert-dialog-description");
5125
+ if (desc) desc.textContent = this.#lastErrorMessage ?? FALLBACK_MESSAGE;
5126
+ if (hasError && !isOpen) this.#dialog.open();
5127
+ else if (!hasError && isOpen) this.#dialog.close();
5128
+ }
5129
+ update(_changed) {
5130
+ super.update(_changed);
5131
+ if (!this.#dialog) return;
5132
+ const input = this.#dialog.input.current;
5133
+ this.#core.setInput(input);
5134
+ const state = this.#core.getState();
5135
+ applyElementProps(this, this.#core.getAttrs(state));
5136
+ applyStateDataAttrs(this, state, AlertDialogDataAttrs);
5137
+ this.#provider.setValue({
5138
+ state,
5139
+ stateAttrMap: AlertDialogDataAttrs,
5140
+ close: () => this.#dialog?.close()
5141
+ });
5142
+ }
5143
+ };
5144
+
5145
+ //#endregion
5146
+ //#region src/ui/menu/menu-back-element.ts
5147
+ var MenuBackElement = class extends MediaElement {
5148
+ constructor(..._args) {
5149
+ super(..._args);
5150
+ this.label = "Back";
5151
+ this.#ctx = new ContextConsumer(this, {
5152
+ context: menuContext,
5153
+ subscribe: true
5154
+ });
5155
+ this.#disconnect = null;
5156
+ this.#bound = false;
5157
+ }
5158
+ static {
5159
+ this.tagName = "media-menu-back";
5160
+ }
5161
+ static {
5162
+ this.properties = { label: { type: String } };
5163
+ }
5164
+ #ctx;
5165
+ #disconnect;
5166
+ #bound;
5167
+ connectedCallback() {
5168
+ super.connectedCallback();
5169
+ this.#disconnect = new AbortController();
5170
+ this.#bound = false;
5171
+ }
5172
+ disconnectedCallback() {
5173
+ super.disconnectedCallback();
5174
+ this.#disconnect?.abort();
5175
+ this.#disconnect = null;
5176
+ this.#bound = false;
5177
+ }
5178
+ update(_changed) {
5179
+ super.update(_changed);
5180
+ const ctx = this.#ctx.value;
5181
+ if (!ctx || !this.#disconnect) return;
5182
+ if (!this.#bound) {
5183
+ this.#bound = true;
5184
+ applyElementProps(this, { onClick: () => {
5185
+ ctx.parentMenu?.pop();
5186
+ } }, { signal: this.#disconnect.signal });
5187
+ }
5188
+ applyElementProps(this, {
5189
+ role: "button",
5190
+ "aria-label": this.label
5191
+ });
5192
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
5193
+ }
5194
+ };
5195
+
5196
+ //#endregion
5197
+ //#region src/ui/menu/menu-checkbox-item-element.ts
5198
+ var MenuCheckboxItemElement = class extends MediaElement {
5199
+ constructor(..._args) {
5200
+ super(..._args);
5201
+ this.checked = false;
5202
+ this.disabled = false;
5203
+ this.#ctx = new ContextConsumer(this, {
5204
+ context: menuContext,
5205
+ subscribe: true
5206
+ });
5207
+ this.#disconnect = null;
5208
+ this.#registered = false;
5209
+ this.#cleanupRegistration = null;
5210
+ }
5211
+ static {
5212
+ this.tagName = "media-menu-checkbox-item";
5213
+ }
5214
+ static {
5215
+ this.properties = {
5216
+ checked: { type: Boolean },
5217
+ disabled: { type: Boolean }
5218
+ };
5219
+ }
5220
+ #ctx;
5221
+ #disconnect;
5222
+ #registered;
5223
+ #cleanupRegistration;
5224
+ connectedCallback() {
5225
+ super.connectedCallback();
5226
+ this.#disconnect = new AbortController();
5227
+ this.#registered = false;
5228
+ }
5229
+ disconnectedCallback() {
5230
+ super.disconnectedCallback();
5231
+ this.#cleanupRegistration?.();
5232
+ this.#cleanupRegistration = null;
5233
+ this.#disconnect?.abort();
5234
+ this.#disconnect = null;
5235
+ this.#registered = false;
5236
+ }
5237
+ update(_changed) {
5238
+ super.update(_changed);
5239
+ const ctx = this.#ctx.value;
5240
+ if (!ctx || !this.#disconnect) return;
5241
+ if (!this.#registered) {
5242
+ this.#registered = true;
5243
+ this.#cleanupRegistration = ctx.menu.registerItem(this);
5244
+ applyElementProps(this, {
5245
+ onClick: () => {
5246
+ if (!this.#ctx.value || this.disabled) return;
5247
+ this.checked = !this.checked;
5248
+ this.dispatchEvent(new CustomEvent("checked-change", {
5249
+ detail: { checked: this.checked },
5250
+ bubbles: true
5251
+ }));
5252
+ },
5253
+ onPointerenter: () => {
5254
+ const currentCtx = this.#ctx.value;
5255
+ if (!this.disabled) currentCtx?.menu.highlight(this, { focus: false });
5256
+ }
5257
+ }, { signal: this.#disconnect.signal });
5258
+ }
5259
+ applyElementProps(this, {
5260
+ role: "menuitemcheckbox",
5261
+ "aria-checked": String(this.checked),
5262
+ "aria-disabled": this.disabled ? "true" : void 0
5263
+ });
5264
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
5265
+ }
5266
+ };
5267
+
5268
+ //#endregion
5269
+ //#region src/ui/menu/menu-group-element.ts
5270
+ var MenuGroupElement = class extends MediaElement {
5271
+ constructor(..._args) {
5272
+ super(..._args);
5273
+ this.label = void 0;
5274
+ this.#ctx = new ContextConsumer(this, {
5275
+ context: menuContext,
5276
+ subscribe: true
5277
+ });
5278
+ }
5279
+ static {
5280
+ this.tagName = "media-menu-group";
5281
+ }
5282
+ static {
5283
+ this.properties = { label: { type: String } };
5284
+ }
5285
+ #ctx;
5286
+ update(_changed) {
5287
+ super.update(_changed);
5288
+ applyElementProps(this, {
5289
+ role: "group",
5290
+ "aria-label": this.label
5291
+ });
5292
+ const ctx = this.#ctx.value;
5293
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
5294
+ }
5295
+ };
5296
+
5297
+ //#endregion
5298
+ //#region src/ui/menu/menu-item-element.ts
5299
+ var MenuItemElement = class extends MediaElement {
5300
+ constructor(..._args) {
5301
+ super(..._args);
5302
+ this.disabled = false;
5303
+ this.commandfor = void 0;
5304
+ this.#ctx = new ContextConsumer(this, {
5305
+ context: menuContext,
5306
+ subscribe: true
5307
+ });
5308
+ this.#disconnect = null;
5309
+ this.#registered = false;
5310
+ this.#cleanupRegistration = null;
5311
+ }
5312
+ static {
5313
+ this.tagName = "media-menu-item";
5314
+ }
5315
+ static {
5316
+ this.properties = {
5317
+ disabled: { type: Boolean },
5318
+ commandfor: { type: String }
5319
+ };
5320
+ }
5321
+ #ctx;
5322
+ #disconnect;
5323
+ #registered;
5324
+ #cleanupRegistration;
5325
+ connectedCallback() {
5326
+ super.connectedCallback();
5327
+ this.#disconnect = new AbortController();
5328
+ this.#registered = false;
5329
+ }
5330
+ disconnectedCallback() {
5331
+ super.disconnectedCallback();
5332
+ this.#cleanupRegistration?.();
5333
+ this.#cleanupRegistration = null;
5334
+ this.#disconnect?.abort();
5335
+ this.#disconnect = null;
5336
+ this.#registered = false;
5337
+ }
5338
+ update(_changed) {
5339
+ super.update(_changed);
5340
+ const ctx = this.#ctx.value;
5341
+ if (!ctx || !this.#disconnect) return;
5342
+ if (!this.#registered) {
5343
+ this.#registered = true;
5344
+ this.#cleanupRegistration = ctx.menu.registerItem(this);
5345
+ applyElementProps(this, {
5346
+ onClick: (event) => {
5347
+ const currentCtx = this.#ctx.value;
5348
+ if (!currentCtx || this.disabled) return;
5349
+ const target = this.commandfor;
5350
+ if (target) currentCtx.menu.push(target, this.id);
5351
+ else {
5352
+ this.dispatchEvent(new CustomEvent("select", { bubbles: true }));
5353
+ completeMenuItemSelection(currentCtx.menu, currentCtx.parentMenu);
5354
+ }
5355
+ event.preventDefault();
5356
+ },
5357
+ onKeyDown: (event) => {
5358
+ const currentCtx = this.#ctx.value;
5359
+ if (!currentCtx || this.disabled || event.key !== "ArrowRight") return;
5360
+ const target = this.commandfor;
5361
+ if (!target) return;
5362
+ currentCtx.menu.push(target, this.id);
5363
+ event.preventDefault();
5364
+ },
5365
+ onPointerenter: () => {
5366
+ const currentCtx = this.#ctx.value;
5367
+ if (!this.disabled) currentCtx?.menu.highlight(this, { focus: false });
5368
+ }
5369
+ }, { signal: this.#disconnect.signal });
5370
+ }
5371
+ const hasSubmenu = Boolean(this.commandfor);
5372
+ const activeSubMenuId = ctx.navigation.stack[ctx.navigation.stack.length - 1]?.menuId ?? null;
5373
+ const isExpanded = hasSubmenu ? activeSubMenuId === this.commandfor : void 0;
5374
+ applyElementProps(this, {
5375
+ role: "menuitem",
5376
+ "aria-disabled": this.disabled ? "true" : void 0,
5377
+ ...hasSubmenu && {
5378
+ "aria-haspopup": "menu",
5379
+ "aria-expanded": isExpanded ? "true" : "false",
5380
+ "data-has-submenu": ""
5381
+ }
5382
+ });
5383
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3388
5384
  }
3389
5385
  };
3390
5386
 
3391
5387
  //#endregion
3392
- //#region src/ui/alert-dialog/alert-dialog-description-element.ts
3393
- var AlertDialogDescriptionElement = class extends ContextPartElement {
5388
+ //#region src/ui/menu/menu-label-element.ts
5389
+ var MenuLabelElement = class extends ContextPartElement {
3394
5390
  constructor(..._args) {
3395
5391
  super(..._args);
3396
5392
  this.consumer = new ContextConsumer(this, {
3397
- context: alertDialogContext,
5393
+ context: menuContext,
3398
5394
  subscribe: true
3399
5395
  });
3400
5396
  }
3401
5397
  static {
3402
- this.tagName = "media-alert-dialog-description";
3403
- }
3404
- update(changed) {
3405
- super.update(changed);
3406
- const descriptionId = this.consumer.value?.state.descriptionId;
3407
- if (descriptionId) this.id = descriptionId;
5398
+ this.tagName = "media-menu-label";
3408
5399
  }
3409
5400
  };
3410
5401
 
3411
5402
  //#endregion
3412
- //#region src/ui/alert-dialog/alert-dialog-title-element.ts
3413
- var AlertDialogTitleElement = class extends ContextPartElement {
3414
- constructor(..._args) {
3415
- super(..._args);
3416
- this.consumer = new ContextConsumer(this, {
3417
- context: alertDialogContext,
3418
- subscribe: true
3419
- });
3420
- }
5403
+ //#region src/ui/menu/menu-separator-element.ts
5404
+ var MenuSeparatorElement = class extends MediaElement {
3421
5405
  static {
3422
- this.tagName = "media-alert-dialog-title";
5406
+ this.tagName = "media-menu-separator";
3423
5407
  }
3424
- update(changed) {
3425
- super.update(changed);
3426
- const titleId = this.consumer.value?.state.titleId;
3427
- if (titleId) this.id = titleId;
5408
+ #ctx = new ContextConsumer(this, {
5409
+ context: menuContext,
5410
+ subscribe: true
5411
+ });
5412
+ update(_changed) {
5413
+ super.update(_changed);
5414
+ applyElementProps(this, { role: "separator" });
5415
+ const ctx = this.#ctx.value;
5416
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3428
5417
  }
3429
5418
  };
3430
5419
 
3431
5420
  //#endregion
3432
- //#region src/ui/controls/context.ts
3433
- const CONTROLS_CONTEXT_KEY = Symbol("@videojs/controls");
3434
- const controlsContext = createContext(CONTROLS_CONTEXT_KEY);
3435
-
3436
- //#endregion
3437
- //#region src/ui/controls/controls-element.ts
3438
- var ControlsElement = class extends MediaElement {
5421
+ //#region src/ui/menu/menu-view-element.ts
5422
+ var MenuViewElement = class extends MediaElement {
3439
5423
  static {
3440
- this.tagName = "media-controls";
3441
- }
3442
- #core = new ControlsCore();
3443
- #mediaState = new PlayerController(this, playerContext, selectControls);
3444
- #provider = new ContextProvider(this, { context: controlsContext });
3445
- connectedCallback() {
3446
- super.connectedCallback();
3447
- if (!this.#mediaState.value && this.#mediaState.displayName) logMissingFeature(this.localName, this.#mediaState.displayName);
5424
+ this.tagName = "media-menu-view";
3448
5425
  }
3449
- update(_changed) {
3450
- super.update(_changed);
3451
- const media = this.#mediaState.value;
3452
- if (!media) return;
3453
- this.#core.setMedia(media);
3454
- const state = this.#core.getState();
3455
- applyStateDataAttrs(this, state, ControlsDataAttrs);
3456
- this.#provider.setValue({
3457
- state,
3458
- stateAttrMap: ControlsDataAttrs
3459
- });
5426
+ update(changed) {
5427
+ super.update(changed);
5428
+ applyElementProps(this, getMenuRootViewAttrs());
3460
5429
  }
3461
5430
  };
3462
5431
 
3463
5432
  //#endregion
3464
- //#region src/ui/controls/controls-group-element.ts
3465
- var ControlsGroupElement = class extends ContextPartElement {
5433
+ //#region src/ui/input-indicators/input-indicator-element.ts
5434
+ var InputIndicatorElement = class extends MediaElement {
3466
5435
  constructor(..._args) {
3467
5436
  super(..._args);
3468
- this.consumer = new ContextConsumer(this, {
3469
- context: controlsContext,
5437
+ this.player = new PlayerController(this, playerContext);
5438
+ this.container = new ContextConsumer(this, {
5439
+ context: containerContext,
5440
+ callback: () => this.#reconnect(),
3470
5441
  subscribe: true
3471
5442
  });
5443
+ this.#disconnect = null;
5444
+ this.#inputActionUnsubscribe = null;
5445
+ this.#visibilityUnsubscribe = null;
5446
+ this.#visibilityHandle = null;
5447
+ this.#lastGeneration = 0;
5448
+ this.#snapshot = null;
3472
5449
  }
3473
- static {
3474
- this.tagName = "media-controls-group";
5450
+ #disconnect;
5451
+ #inputActionUnsubscribe;
5452
+ #visibilityUnsubscribe;
5453
+ #visibilityHandle;
5454
+ #lastGeneration;
5455
+ #snapshot;
5456
+ #getVisibilityHandle() {
5457
+ return this.#visibilityHandle ??= { close: () => this.core.close() };
5458
+ }
5459
+ #payloadSnapshot() {
5460
+ return this.#snapshot ?? this.core.state.current;
3475
5461
  }
3476
5462
  connectedCallback() {
3477
5463
  super.connectedCallback();
3478
- if (this.hasAttribute("aria-label") || this.hasAttribute("aria-labelledby")) this.setAttribute("role", "group");
5464
+ if (this.destroyed) return;
5465
+ this.#snapshot = this.core.state.current;
5466
+ this.#disconnect = new AbortController();
5467
+ this.core.state.subscribe(() => this.requestUpdate(), { signal: this.#disconnect.signal });
5468
+ this.transition.state.subscribe(() => this.requestUpdate(), { signal: this.#disconnect.signal });
5469
+ this.hidden = true;
5470
+ this.#reconnect();
5471
+ }
5472
+ disconnectedCallback() {
5473
+ super.disconnectedCallback();
5474
+ this.#inputActionUnsubscribe?.();
5475
+ this.#visibilityUnsubscribe?.();
5476
+ this.#inputActionUnsubscribe = null;
5477
+ this.#visibilityUnsubscribe = null;
5478
+ this.#disconnect?.abort();
5479
+ this.#disconnect = null;
5480
+ }
5481
+ destroyCallback() {
5482
+ this.#inputActionUnsubscribe?.();
5483
+ this.#visibilityUnsubscribe?.();
5484
+ this.core.destroy();
5485
+ this.transition.destroy();
5486
+ this.liveIndicator.remove();
5487
+ super.destroyCallback();
5488
+ }
5489
+ willUpdate(changed) {
5490
+ super.willUpdate(changed);
5491
+ this.syncCoreProps();
5492
+ }
5493
+ update(changed) {
5494
+ super.update(changed);
5495
+ this.#syncTransition();
5496
+ const currentState = this.core.state.current;
5497
+ const transitionState = this.transition.state.current;
5498
+ if (!isIndicatorPresent(currentState, transitionState)) {
5499
+ this.liveIndicator.remove();
5500
+ return;
5501
+ }
5502
+ const state = getRenderedIndicatorState(currentState, this.#payloadSnapshot(), transitionState);
5503
+ this.liveIndicator.render(state);
5504
+ }
5505
+ #syncTransition() {
5506
+ const currentState = this.core.state.current;
5507
+ if (currentState.open) {
5508
+ this.#snapshot = currentState;
5509
+ if (this.#lastGeneration !== currentState.generation) {
5510
+ this.#lastGeneration = currentState.generation;
5511
+ this.transition.open();
5512
+ }
5513
+ return;
5514
+ }
5515
+ const { active, status } = this.transition.state.current;
5516
+ if (active && status !== "ending") this.transition.close(this.liveIndicator.element);
5517
+ }
5518
+ #reconnect() {
5519
+ this.#inputActionUnsubscribe?.();
5520
+ this.#visibilityUnsubscribe?.();
5521
+ this.#inputActionUnsubscribe = null;
5522
+ this.#visibilityUnsubscribe = null;
5523
+ const container = this.container.value?.container;
5524
+ if (!container) return;
5525
+ const visibility = getIndicatorVisibilityCoordinator(container);
5526
+ const visibilityHandle = this.#getVisibilityHandle();
5527
+ this.#visibilityUnsubscribe = visibility.register(visibilityHandle);
5528
+ this.#inputActionUnsubscribe = subscribeToInputActions(container, (event) => {
5529
+ if (this.core.processEvent(event, getMediaSnapshot(this.player.value))) visibility.show(visibilityHandle);
5530
+ });
3479
5531
  }
3480
5532
  };
3481
5533
 
3482
5534
  //#endregion
3483
- //#region src/ui/error-dialog/error-dialog-element.ts
3484
- const FALLBACK_MESSAGE = "An error occurred. Please try again.";
3485
- let idCounter = 0;
3486
- var ErrorDialogElement = class extends MediaElement {
5535
+ //#region src/ui/input-indicators/live-indicator.ts
5536
+ var LiveIndicator = class {
5537
+ #host;
5538
+ #dataAttrs;
5539
+ #render;
5540
+ constructor(options) {
5541
+ this.#host = options.host;
5542
+ this.#dataAttrs = options.dataAttrs;
5543
+ this.#render = options.render;
5544
+ }
5545
+ get element() {
5546
+ return this.#host;
5547
+ }
5548
+ render(state) {
5549
+ this.#host.hidden = false;
5550
+ applyStateDataAttrs(this.#host, state, this.#dataAttrs);
5551
+ this.#render(this.#host, state);
5552
+ return this.#host;
5553
+ }
5554
+ remove() {
5555
+ this.#host.hidden = true;
5556
+ for (const key in this.#dataAttrs) {
5557
+ const name = this.#dataAttrs[key];
5558
+ if (name) this.#host.removeAttribute(name);
5559
+ }
5560
+ }
5561
+ };
5562
+
5563
+ //#endregion
5564
+ //#region src/ui/seek-indicator/seek-indicator-element.ts
5565
+ var SeekIndicatorElement = class extends InputIndicatorElement {
3487
5566
  static {
3488
- this.tagName = "media-error-dialog";
5567
+ this.tagName = "media-seek-indicator";
3489
5568
  }
3490
- #core = new ErrorDialogCore();
3491
- #provider = new ContextProvider(this, { context: alertDialogContext });
3492
- #titleId = `vjs-error-dialog-title-${idCounter++}`;
3493
- #descriptionId = `vjs-error-dialog-desc-${idCounter++}`;
3494
- #errorState = new PlayerController(this, playerContext, selectError);
3495
- #dialog = null;
3496
- #snapshot = null;
3497
- #lastErrorMessage = null;
3498
- constructor() {
3499
- super();
3500
- this.#core.setTitleId(this.#titleId);
3501
- this.#core.setDescriptionId(this.#descriptionId);
5569
+ static {
5570
+ this.properties = { closeDelay: {
5571
+ type: Number,
5572
+ attribute: "close-delay"
5573
+ } };
5574
+ }
5575
+ #core = new SeekIndicatorCore();
5576
+ #transition = createTransition();
5577
+ #liveIndicator = new LiveIndicator({
5578
+ host: this,
5579
+ dataAttrs: SeekIndicatorDataAttrs,
5580
+ render: renderSeekIndicator
5581
+ });
5582
+ get core() {
5583
+ return this.#core;
3502
5584
  }
3503
- connectedCallback() {
3504
- super.connectedCallback();
3505
- if (this.destroyed) return;
3506
- this.#dialog = createAlertDialog({
3507
- transition: createTransition(),
3508
- onOpenChange: (nextOpen) => {
3509
- if (!nextOpen) this.#errorState.value?.dismissError();
3510
- }
3511
- });
3512
- this.#dialog.setElement(this);
3513
- if (this.#snapshot) this.#snapshot.track(this.#dialog.input);
3514
- else this.#snapshot = new SnapshotController(this, this.#dialog.input);
5585
+ get transition() {
5586
+ return this.#transition;
3515
5587
  }
3516
- disconnectedCallback() {
3517
- super.disconnectedCallback();
3518
- this.#dialog?.destroy();
3519
- this.#dialog = null;
5588
+ get liveIndicator() {
5589
+ return this.#liveIndicator;
3520
5590
  }
3521
- willUpdate(_changed) {
3522
- super.willUpdate(_changed);
3523
- if (!this.#dialog) return;
3524
- const errorState = this.#errorState.value;
3525
- const hasError = Boolean(errorState?.error);
3526
- const { active: isOpen } = this.#dialog.input.current;
3527
- if (errorState?.error) {
3528
- const message = errorState.error.message?.trim();
3529
- this.#lastErrorMessage = message || null;
3530
- }
3531
- const desc = this.querySelector("media-alert-dialog-description");
3532
- if (desc) desc.textContent = this.#lastErrorMessage ?? FALLBACK_MESSAGE;
3533
- if (hasError && !isOpen) this.#dialog.open();
3534
- else if (!hasError && isOpen) this.#dialog.close();
5591
+ syncCoreProps() {
5592
+ this.#core.setProps({ closeDelay: this.closeDelay });
3535
5593
  }
3536
- update(_changed) {
3537
- super.update(_changed);
3538
- if (!this.#dialog) return;
3539
- const input = this.#dialog.input.current;
3540
- this.#core.setInput(input);
3541
- const state = this.#core.getState();
3542
- applyElementProps(this, this.#core.getAttrs(state));
3543
- applyStateDataAttrs(this, state, AlertDialogDataAttrs);
3544
- this.#provider.setValue({
3545
- state,
3546
- stateAttrMap: AlertDialogDataAttrs,
3547
- close: () => this.#dialog?.close()
3548
- });
5594
+ };
5595
+ function renderSeekIndicator(element, state) {
5596
+ const value = element.querySelector("media-seek-indicator-value");
5597
+ if (!value) return;
5598
+ value.textContent = getSeekIndicatorDisplayValue(state);
5599
+ }
5600
+
5601
+ //#endregion
5602
+ //#region src/ui/seek-indicator/seek-indicator-value-element.ts
5603
+ var SeekIndicatorValueElement = class extends MediaElement {
5604
+ static {
5605
+ this.tagName = "media-seek-indicator-value";
3549
5606
  }
3550
5607
  };
3551
5608
 
@@ -3866,6 +5923,123 @@ var SliderValueElement = class extends MediaElement {
3866
5923
  }
3867
5924
  };
3868
5925
 
5926
+ //#endregion
5927
+ //#region src/ui/status-announcer/status-announcer-element.ts
5928
+ var StatusAnnouncerElement = class extends MediaElement {
5929
+ static {
5930
+ this.tagName = "media-status-announcer";
5931
+ }
5932
+ static {
5933
+ this.properties = { closeDelay: {
5934
+ type: Number,
5935
+ attribute: "close-delay"
5936
+ } };
5937
+ }
5938
+ #core = new StatusAnnouncerCore();
5939
+ #player = new PlayerController(this, playerContext);
5940
+ #container = new ContextConsumer(this, {
5941
+ context: containerContext,
5942
+ callback: () => this.#reconnect(),
5943
+ subscribe: true
5944
+ });
5945
+ #disconnect = null;
5946
+ #inputActionUnsubscribe = null;
5947
+ connectedCallback() {
5948
+ super.connectedCallback();
5949
+ if (this.destroyed) return;
5950
+ this.setAttribute("role", "status");
5951
+ this.#disconnect = new AbortController();
5952
+ this.#core.state.subscribe(() => this.requestUpdate(), { signal: this.#disconnect.signal });
5953
+ this.#reconnect();
5954
+ }
5955
+ disconnectedCallback() {
5956
+ super.disconnectedCallback();
5957
+ this.#inputActionUnsubscribe?.();
5958
+ this.#inputActionUnsubscribe = null;
5959
+ this.#disconnect?.abort();
5960
+ this.#disconnect = null;
5961
+ }
5962
+ destroyCallback() {
5963
+ this.#inputActionUnsubscribe?.();
5964
+ this.#core.destroy();
5965
+ super.destroyCallback();
5966
+ }
5967
+ willUpdate(changed) {
5968
+ super.willUpdate(changed);
5969
+ this.#core.setProps({ closeDelay: this.closeDelay });
5970
+ }
5971
+ update(changed) {
5972
+ super.update(changed);
5973
+ const label = this.#core.state.current.label;
5974
+ if (label) this.setAttribute("aria-label", label);
5975
+ else this.removeAttribute("aria-label");
5976
+ }
5977
+ #reconnect() {
5978
+ this.#inputActionUnsubscribe?.();
5979
+ this.#inputActionUnsubscribe = null;
5980
+ const container = this.#container.value?.container;
5981
+ if (!container) return;
5982
+ this.#inputActionUnsubscribe = subscribeToInputActions(container, (event) => {
5983
+ this.#core.processEvent(event, getMediaSnapshot(this.#player.value));
5984
+ });
5985
+ }
5986
+ };
5987
+
5988
+ //#endregion
5989
+ //#region src/ui/status-indicator/status-indicator-element.ts
5990
+ var StatusIndicatorElement = class extends InputIndicatorElement {
5991
+ static {
5992
+ this.tagName = "media-status-indicator";
5993
+ }
5994
+ static {
5995
+ this.properties = {
5996
+ actions: { type: String },
5997
+ closeDelay: {
5998
+ type: Number,
5999
+ attribute: "close-delay"
6000
+ }
6001
+ };
6002
+ }
6003
+ #core = new StatusIndicatorCore();
6004
+ #transition = createTransition();
6005
+ #liveIndicator = new LiveIndicator({
6006
+ host: this,
6007
+ dataAttrs: StatusIndicatorDataAttrs,
6008
+ render: renderStatusIndicator
6009
+ });
6010
+ get core() {
6011
+ return this.#core;
6012
+ }
6013
+ get transition() {
6014
+ return this.#transition;
6015
+ }
6016
+ get liveIndicator() {
6017
+ return this.#liveIndicator;
6018
+ }
6019
+ syncCoreProps() {
6020
+ this.#core.setProps({
6021
+ actions: parseActions(this.actions),
6022
+ closeDelay: this.closeDelay
6023
+ });
6024
+ }
6025
+ };
6026
+ function parseActions(actions) {
6027
+ return actions?.split(/[\s,]+/).filter(Boolean);
6028
+ }
6029
+ function renderStatusIndicator(element, state) {
6030
+ const value = element.querySelector("media-status-indicator-value");
6031
+ if (!value) return;
6032
+ value.textContent = getStatusIndicatorDisplayValue(state);
6033
+ }
6034
+
6035
+ //#endregion
6036
+ //#region src/ui/status-indicator/status-indicator-value-element.ts
6037
+ var StatusIndicatorValueElement = class extends MediaElement {
6038
+ static {
6039
+ this.tagName = "media-status-indicator-value";
6040
+ }
6041
+ };
6042
+
3869
6043
  //#endregion
3870
6044
  //#region src/ui/time/time-element.ts
3871
6045
  var TimeElement = class extends MediaElement {
@@ -4073,6 +6247,62 @@ var TimeSliderElement = class extends MediaElement {
4073
6247
  }
4074
6248
  };
4075
6249
 
6250
+ //#endregion
6251
+ //#region src/ui/volume-indicator/volume-indicator-element.ts
6252
+ var VolumeIndicatorElement = class extends InputIndicatorElement {
6253
+ static {
6254
+ this.tagName = "media-volume-indicator";
6255
+ }
6256
+ static {
6257
+ this.properties = { closeDelay: {
6258
+ type: Number,
6259
+ attribute: "close-delay"
6260
+ } };
6261
+ }
6262
+ #core = new VolumeIndicatorCore();
6263
+ #transition = createTransition();
6264
+ #liveIndicator = new LiveIndicator({
6265
+ host: this,
6266
+ dataAttrs: VolumeIndicatorDataAttrs,
6267
+ render: renderVolumeIndicator
6268
+ });
6269
+ get core() {
6270
+ return this.#core;
6271
+ }
6272
+ get transition() {
6273
+ return this.#transition;
6274
+ }
6275
+ get liveIndicator() {
6276
+ return this.#liveIndicator;
6277
+ }
6278
+ syncCoreProps() {
6279
+ this.#core.setProps({ closeDelay: this.closeDelay });
6280
+ }
6281
+ };
6282
+ function renderVolumeIndicator(element, state) {
6283
+ const fill = element.querySelector("media-volume-indicator-fill");
6284
+ const value = element.querySelector("media-volume-indicator-value");
6285
+ if (state.fill) fill?.style.setProperty(VolumeIndicatorCSSVars.fill, state.fill);
6286
+ else fill?.style.removeProperty(VolumeIndicatorCSSVars.fill);
6287
+ if (value) value.textContent = getVolumeIndicatorDisplayValue(state);
6288
+ }
6289
+
6290
+ //#endregion
6291
+ //#region src/ui/volume-indicator/volume-indicator-fill-element.ts
6292
+ var VolumeIndicatorFillElement = class extends MediaElement {
6293
+ static {
6294
+ this.tagName = "media-volume-indicator-fill";
6295
+ }
6296
+ };
6297
+
6298
+ //#endregion
6299
+ //#region src/ui/volume-indicator/volume-indicator-value-element.ts
6300
+ var VolumeIndicatorValueElement = class extends MediaElement {
6301
+ static {
6302
+ this.tagName = "media-volume-indicator-value";
6303
+ }
6304
+ };
6305
+
4076
6306
  //#endregion
4077
6307
  //#region src/ui/volume-slider/volume-slider-element.ts
4078
6308
  var VolumeSliderElement = class extends MediaElement {
@@ -4200,6 +6430,19 @@ var VolumeSliderElement = class extends MediaElement {
4200
6430
 
4201
6431
  //#endregion
4202
6432
  //#region src/define/ui/compounds.ts
6433
+ function defineMenu() {
6434
+ safeDefine(MenuElement);
6435
+ safeDefine(MenuBackElement);
6436
+ safeDefine(MenuItemElement);
6437
+ safeDefine(MenuLabelElement);
6438
+ safeDefine(MenuSeparatorElement);
6439
+ safeDefine(MenuGroupElement);
6440
+ safeDefine(MenuRadioGroupElement);
6441
+ safeDefine(MenuRadioItemElement);
6442
+ safeDefine(MenuCheckboxItemElement);
6443
+ safeDefine(MenuItemIndicatorElement);
6444
+ safeDefine(MenuViewElement);
6445
+ }
4203
6446
  function defineControls() {
4204
6447
  safeDefine(ControlsElement);
4205
6448
  safeDefine(ControlsGroupElement);
@@ -4210,6 +6453,16 @@ function defineErrorDialog() {
4210
6453
  safeDefine(AlertDialogDescriptionElement);
4211
6454
  safeDefine(AlertDialogTitleElement);
4212
6455
  }
6456
+ function defineInputIndicators() {
6457
+ safeDefine(StatusAnnouncerElement);
6458
+ safeDefine(StatusIndicatorElement);
6459
+ safeDefine(StatusIndicatorValueElement);
6460
+ safeDefine(VolumeIndicatorElement);
6461
+ safeDefine(VolumeIndicatorFillElement);
6462
+ safeDefine(VolumeIndicatorValueElement);
6463
+ safeDefine(SeekIndicatorElement);
6464
+ safeDefine(SeekIndicatorValueElement);
6465
+ }
4213
6466
  /** Shared slider sub-elements used by all slider types. */
4214
6467
  function defineSliderParts() {
4215
6468
  safeDefine(SliderFillElement);
@@ -4235,5 +6488,5 @@ function defineVolumeSlider() {
4235
6488
  }
4236
6489
 
4237
6490
  //#endregion
4238
- export { selectTime as C, selectTextTrack as S, defaults as T, selectFullscreen as _, defineVolumeSlider as a, selectPlaybackRate as b, SeekButtonElement as c, PlayButtonElement as d, MuteButtonElement as f, createHotkey as g, logMissingFeature as h, defineTimeSlider as i, PopoverElement as l, applyStateDataAttrs as m, defineErrorDialog as n, TooltipGroupElement as o, MediaButtonElement as p, defineTime as r, TooltipElement as s, defineControls as t, PlaybackRateButtonElement as u, selectPiP as v, selectVolume as w, selectRemotePlayback as x, selectPlayback as y };
4239
- //# sourceMappingURL=compounds-BHHGcL_P.js.map
6491
+ export { selectTextTrack as A, selectBuffer as C, selectPlayback as D, selectPiP as E, selectVolume as M, defaults as N, selectPlaybackRate as O, createHotkey as S, selectLive as T, MediaButtonElement as _, defineTime as a, applyElementProps as b, TooltipGroupElement as c, MenuRadioItemElement as d, MenuRadioGroupElement as f, MuteButtonElement as g, PlayButtonElement as h, defineMenu as i, selectTime as j, selectRemotePlayback as k, TooltipElement as l, MenuElement as m, defineErrorDialog as n, defineTimeSlider as o, MenuItemIndicatorElement as p, defineInputIndicators as r, defineVolumeSlider as s, defineControls as t, PopoverElement as u, applyStateDataAttrs as v, selectFullscreen as w, createButton as x, logMissingFeature as y };
6492
+ //# sourceMappingURL=compounds-DxdDY3jr.js.map