@videojs/html 10.0.0-beta.22 → 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 (1296) hide show
  1. package/README.md +6 -0
  2. package/cdn/{abort-C9UiBdVU.js → abort-0nUH9HXc.js} +1 -1
  3. package/cdn/{abort-C9UiBdVU.js.map → abort-0nUH9HXc.js.map} +1 -1
  4. package/cdn/{abort-DsTff8mS.js → abort-DQxwCs92.js} +1 -1
  5. package/cdn/{abort-DsTff8mS.js.map → abort-DQxwCs92.js.map} +1 -1
  6. package/cdn/audio-minimal-ui.dev.js +2 -4
  7. package/cdn/audio-minimal-ui.js +1 -1
  8. package/cdn/audio-minimal.dev.js +22 -20
  9. package/cdn/audio-minimal.dev.js.map +1 -1
  10. package/cdn/audio-minimal.js +1 -1
  11. package/cdn/audio-minimal.js.map +1 -1
  12. package/cdn/audio-ui.dev.js +2 -4
  13. package/cdn/audio-ui.js +1 -1
  14. package/cdn/audio.dev.js +22 -19
  15. package/cdn/audio.dev.js.map +1 -1
  16. package/cdn/audio.js +1 -1
  17. package/cdn/audio.js.map +1 -1
  18. package/cdn/background.dev.js +4 -4
  19. package/cdn/background.dev.js.map +1 -1
  20. package/cdn/background.js +1 -1
  21. package/cdn/background.js.map +1 -1
  22. package/cdn/base-CaXY3kMA.js +66 -0
  23. package/cdn/base-CaXY3kMA.js.map +1 -0
  24. package/cdn/base-JIGv_MlJ.js +2 -0
  25. package/cdn/base-JIGv_MlJ.js.map +1 -0
  26. package/cdn/compounds-CJ9NGNJr.js +8 -0
  27. package/cdn/compounds-CJ9NGNJr.js.map +1 -0
  28. package/cdn/{compounds-DD3MYkSc.js → compounds-DxdDY3jr.js} +2872 -537
  29. package/cdn/compounds-DxdDY3jr.js.map +1 -0
  30. package/cdn/create-player-B2W5yr5I.js +7 -0
  31. package/cdn/create-player-B2W5yr5I.js.map +1 -0
  32. package/cdn/{create-player-BKLw7l1a.js → create-player-_WED6HtK.js} +288 -183
  33. package/cdn/create-player-_WED6HtK.js.map +1 -0
  34. package/cdn/default-BtA2xVd7.js +33 -0
  35. package/cdn/default-BtA2xVd7.js.map +1 -0
  36. package/cdn/default-Ci15Ic2n.js +2 -0
  37. package/cdn/default-Ci15Ic2n.js.map +1 -0
  38. package/cdn/default-Ciudg7Lh.js +32 -0
  39. package/cdn/default-Ciudg7Lh.js.map +1 -0
  40. package/cdn/default-CmbctS5n.js +2 -0
  41. package/cdn/default-CmbctS5n.js.map +1 -0
  42. package/cdn/hls-CoCXCB8b.js +41 -0
  43. package/cdn/hls-CoCXCB8b.js.map +1 -0
  44. package/cdn/{hls-CcSAx_3I.js → hls-DjqAxSvY.js} +236 -21
  45. package/cdn/hls-DjqAxSvY.js.map +1 -0
  46. package/cdn/{hotkey-element-BONs_FyJ.js → hotkey-element-89VAnCrc.js} +47 -52
  47. package/cdn/hotkey-element-89VAnCrc.js.map +1 -0
  48. package/cdn/hotkey-element-CmUxzW-C.js +2 -0
  49. package/cdn/hotkey-element-CmUxzW-C.js.map +1 -0
  50. package/cdn/live-button-element-BMneBAzX.js +208 -0
  51. package/cdn/live-button-element-BMneBAzX.js.map +1 -0
  52. package/cdn/live-button-element-CPEl1qK3.js +2 -0
  53. package/cdn/live-button-element-CPEl1qK3.js.map +1 -0
  54. package/cdn/live-video-minimal.dev.d.ts +1 -0
  55. package/cdn/live-video-minimal.dev.js +193 -0
  56. package/cdn/live-video-minimal.dev.js.map +1 -0
  57. package/cdn/live-video-minimal.js +2 -0
  58. package/cdn/live-video-minimal.js.map +1 -0
  59. package/cdn/live-video.dev.d.ts +1 -0
  60. package/cdn/live-video.dev.js +194 -0
  61. package/cdn/live-video.dev.js.map +1 -0
  62. package/cdn/live-video.js +2 -0
  63. package/cdn/live-video.js.map +1 -0
  64. package/cdn/media/dash-video.dev.js +8 -7
  65. package/cdn/media/dash-video.dev.js.map +1 -1
  66. package/cdn/media/dash-video.js +6 -6
  67. package/cdn/media/dash-video.js.map +1 -1
  68. package/cdn/media/hls-video.dev.js +4 -4
  69. package/cdn/media/hls-video.js +1 -1
  70. package/cdn/media/hls-video.js.map +1 -1
  71. package/cdn/media/mux-audio.dev.js +8 -6
  72. package/cdn/media/mux-audio.dev.js.map +1 -1
  73. package/cdn/media/mux-audio.js +1 -1
  74. package/cdn/media/mux-audio.js.map +1 -1
  75. package/cdn/media/mux-video.dev.js +8 -6
  76. package/cdn/media/mux-video.dev.js.map +1 -1
  77. package/cdn/media/mux-video.js +1 -1
  78. package/cdn/media/mux-video.js.map +1 -1
  79. package/cdn/media/native-hls-video.dev.js +4 -4
  80. package/cdn/media/native-hls-video.js +1 -1
  81. package/cdn/media/native-hls-video.js.map +1 -1
  82. package/cdn/media/simple-hls-video.dev.js +3604 -2632
  83. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  84. package/cdn/media/simple-hls-video.js +7 -7
  85. package/cdn/media/simple-hls-video.js.map +1 -1
  86. package/cdn/media-attach-mixin-0gzahJxP.js +2 -0
  87. package/cdn/{media-attach-mixin-C2wz0Qbd.js.map → media-attach-mixin-0gzahJxP.js.map} +1 -1
  88. package/cdn/{media-attach-mixin-CYoNe7Sh.js → media-attach-mixin-C1KQy-y8.js} +2 -2
  89. package/cdn/{media-attach-mixin-CYoNe7Sh.js.map → media-attach-mixin-C1KQy-y8.js.map} +1 -1
  90. package/cdn/minimal-BGKTRgLy.js +2 -0
  91. package/cdn/minimal-BGKTRgLy.js.map +1 -0
  92. package/cdn/minimal-BY8ZmNCh.js +33 -0
  93. package/cdn/minimal-BY8ZmNCh.js.map +1 -0
  94. package/cdn/minimal-D-o7FGL2.js +2 -0
  95. package/cdn/minimal-D-o7FGL2.js.map +1 -0
  96. package/cdn/minimal-b3s_qClU.js +32 -0
  97. package/cdn/minimal-b3s_qClU.js.map +1 -0
  98. package/cdn/minimal-ui-B0PWg1gR.js +2 -0
  99. package/cdn/minimal-ui-B0PWg1gR.js.map +1 -0
  100. package/cdn/minimal-ui-B6AtFmJO.js +2 -0
  101. package/cdn/minimal-ui-B6AtFmJO.js.map +1 -0
  102. package/cdn/minimal-ui-BjQUqQ_m.js +26 -0
  103. package/cdn/minimal-ui-BjQUqQ_m.js.map +1 -0
  104. package/cdn/minimal-ui-C2NRTvWx.js +38 -0
  105. package/cdn/minimal-ui-C2NRTvWx.js.map +1 -0
  106. package/cdn/{mux-BgWl50KW.js → mux-CJn4lTbv.js} +10 -10
  107. package/cdn/mux-CJn4lTbv.js.map +1 -0
  108. package/cdn/{mux-BhHIeG3e.js → mux-wKbnuUQu.js} +55 -20
  109. package/cdn/mux-wKbnuUQu.js.map +1 -0
  110. package/cdn/native-hls-1-isweaY.js +2 -0
  111. package/cdn/native-hls-1-isweaY.js.map +1 -0
  112. package/cdn/native-hls-D4f2-E9D.js +371 -0
  113. package/cdn/native-hls-D4f2-E9D.js.map +1 -0
  114. package/cdn/playback-rate-button-element-Ck7CCs0t.js +2 -0
  115. package/cdn/playback-rate-button-element-Ck7CCs0t.js.map +1 -0
  116. package/cdn/playback-rate-button-element-DN78puhg.js +79 -0
  117. package/cdn/playback-rate-button-element-DN78puhg.js.map +1 -0
  118. package/cdn/player-9_6BPhTP.js +16 -0
  119. package/cdn/player-9_6BPhTP.js.map +1 -0
  120. package/cdn/player-C6DIXZpP.js +16 -0
  121. package/cdn/player-C6DIXZpP.js.map +1 -0
  122. package/cdn/{player-BVGWmIbQ.js → player-ClV0UtoS.js} +3 -3
  123. package/cdn/{player-BVGWmIbQ.js.map → player-ClV0UtoS.js.map} +1 -1
  124. package/cdn/player-D7lHFQo6.js +2 -0
  125. package/cdn/player-D7lHFQo6.js.map +1 -0
  126. package/cdn/player-DzqwkiTI.js +2 -0
  127. package/cdn/{player-ChdQN3H5.js.map → player-DzqwkiTI.js.map} +1 -1
  128. package/cdn/player-_4EjFnET.js +2 -0
  129. package/cdn/player-_4EjFnET.js.map +1 -0
  130. package/cdn/poster-element-DmfmTRCV.js +2 -0
  131. package/cdn/poster-element-DmfmTRCV.js.map +1 -0
  132. package/cdn/{player-DX5Ka0vt.js → poster-element-IdY3MYJj.js} +18 -25
  133. package/cdn/poster-element-IdY3MYJj.js.map +1 -0
  134. package/cdn/{context-0rI_P6jf.js → predicate-Dqd8wbW6.js} +26 -2
  135. package/cdn/predicate-Dqd8wbW6.js.map +1 -0
  136. package/cdn/{context-CEFisYD0.js → predicate-Dxl3IuYh.js} +2 -2
  137. package/cdn/predicate-Dxl3IuYh.js.map +1 -0
  138. package/cdn/seek-button-element-BkC8xrVR.js +394 -0
  139. package/cdn/seek-button-element-BkC8xrVR.js.map +1 -0
  140. package/cdn/seek-button-element-C0uAXebE.js +2 -0
  141. package/cdn/seek-button-element-C0uAXebE.js.map +1 -0
  142. package/cdn/{shallow-equal-xh6Wj-hj.js → shallow-equal-D-fthE54.js} +1 -1
  143. package/cdn/{shallow-equal-xh6Wj-hj.js.map → shallow-equal-D-fthE54.js.map} +1 -1
  144. package/cdn/{shallow-equal-Daj3-_LC.js → shallow-equal-DSpD9PMp.js} +1 -1
  145. package/cdn/{shallow-equal-Daj3-_LC.js.map → shallow-equal-DSpD9PMp.js.map} +1 -1
  146. package/cdn/skin-element-D0TDGWJH.js +2 -0
  147. package/cdn/skin-element-D0TDGWJH.js.map +1 -0
  148. package/cdn/skin-element-mgqcAutZ.js +55 -0
  149. package/cdn/skin-element-mgqcAutZ.js.map +1 -0
  150. package/cdn/types-B_4Es-UH.js +20 -0
  151. package/cdn/types-B_4Es-UH.js.map +1 -0
  152. package/cdn/types-DRezN4yy.js +2 -0
  153. package/cdn/types-DRezN4yy.js.map +1 -0
  154. package/cdn/ui-BH0azXYN.js +2 -0
  155. package/cdn/ui-BH0azXYN.js.map +1 -0
  156. package/cdn/ui-B_E6hb1k.js +33 -0
  157. package/cdn/ui-B_E6hb1k.js.map +1 -0
  158. package/cdn/ui-ByhUcpaY.js +2 -0
  159. package/cdn/ui-ByhUcpaY.js.map +1 -0
  160. package/cdn/ui-DG0AlJbU.js +42 -0
  161. package/cdn/ui-DG0AlJbU.js.map +1 -0
  162. package/cdn/{video-host-BtD61mpF.js → video-host-BU9t26fe.js} +29 -16
  163. package/cdn/{video-host-BtD61mpF.js.map → video-host-BU9t26fe.js.map} +1 -1
  164. package/cdn/{video-host-LeB1FKfO.js → video-host-CvYvXa8l.js} +10 -10
  165. package/cdn/{video-host-LeB1FKfO.js.map → video-host-CvYvXa8l.js.map} +1 -1
  166. package/cdn/video-minimal-ui.dev.js +2 -4
  167. package/cdn/video-minimal-ui.js +1 -1
  168. package/cdn/video-minimal.dev.js +83 -20
  169. package/cdn/video-minimal.dev.js.map +1 -1
  170. package/cdn/video-minimal.js +1 -1
  171. package/cdn/video-minimal.js.map +1 -1
  172. package/cdn/video-ui.dev.js +2 -4
  173. package/cdn/video-ui.js +1 -1
  174. package/cdn/video.dev.js +56 -17
  175. package/cdn/video.dev.js.map +1 -1
  176. package/cdn/video.js +1 -1
  177. package/cdn/video.js.map +1 -1
  178. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  179. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  180. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  181. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  182. package/dist/default/_virtual/inline-css_src/define/background/skin.js +1 -1
  183. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -1
  184. package/dist/default/_virtual/inline-css_src/define/global.js +6 -0
  185. package/dist/default/_virtual/inline-css_src/define/global.js.map +1 -0
  186. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +6 -0
  187. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -0
  188. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +6 -0
  189. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -0
  190. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +6 -0
  191. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -0
  192. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +6 -0
  193. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -0
  194. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  195. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  196. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  197. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  198. package/dist/default/define/audio/minimal-skin.css +227 -108
  199. package/dist/default/define/audio/minimal-skin.js +1 -1
  200. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  201. package/dist/default/define/audio/minimal-skin.tailwind.js +3 -2
  202. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  203. package/dist/default/define/audio/minimal-ui.js +8 -3
  204. package/dist/default/define/audio/minimal-ui.js.map +1 -1
  205. package/dist/default/define/audio/skin.css +253 -108
  206. package/dist/default/define/audio/skin.js +1 -1
  207. package/dist/default/define/audio/skin.js.map +1 -1
  208. package/dist/default/define/audio/skin.tailwind.js +2 -1
  209. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  210. package/dist/default/define/audio/ui.js +10 -1
  211. package/dist/default/define/audio/ui.js.map +1 -1
  212. package/dist/default/define/background/skin.css +4 -2
  213. package/dist/default/define/background/skin.js +1 -1
  214. package/dist/{dev/define/base.css → default/define/global.css} +12 -8
  215. package/dist/default/define/live-audio/minimal-skin.css +897 -0
  216. package/dist/default/define/live-audio/minimal-skin.js +26 -0
  217. package/dist/default/define/live-audio/minimal-skin.js.map +1 -0
  218. package/dist/default/define/live-audio/minimal-skin.tailwind.js +29 -0
  219. package/dist/default/define/live-audio/minimal-skin.tailwind.js.map +1 -0
  220. package/dist/default/define/live-audio/minimal-ui.js +26 -0
  221. package/dist/default/define/live-audio/minimal-ui.js.map +1 -0
  222. package/dist/default/define/live-audio/player.js +18 -0
  223. package/dist/default/define/live-audio/player.js.map +1 -0
  224. package/dist/default/define/live-audio/skin.css +939 -0
  225. package/dist/default/define/live-audio/skin.js +26 -0
  226. package/dist/default/define/live-audio/skin.js.map +1 -0
  227. package/dist/default/define/live-audio/skin.tailwind.js +28 -0
  228. package/dist/default/define/live-audio/skin.tailwind.js.map +1 -0
  229. package/dist/default/define/live-audio/ui.js +30 -0
  230. package/dist/default/define/live-audio/ui.js.map +1 -0
  231. package/dist/default/define/live-video/minimal-skin.css +1593 -0
  232. package/dist/default/define/live-video/minimal-skin.js +26 -0
  233. package/dist/default/define/live-video/minimal-skin.js.map +1 -0
  234. package/dist/default/define/live-video/minimal-skin.tailwind.js +31 -0
  235. package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -0
  236. package/dist/default/define/live-video/minimal-ui.js +44 -0
  237. package/dist/default/define/live-video/minimal-ui.js.map +1 -0
  238. package/dist/default/define/live-video/player.js +18 -0
  239. package/dist/default/define/live-video/player.js.map +1 -0
  240. package/dist/default/define/live-video/skin.css +1595 -0
  241. package/dist/default/define/live-video/skin.js +26 -0
  242. package/dist/default/define/live-video/skin.js.map +1 -0
  243. package/dist/default/define/live-video/skin.tailwind.js +29 -0
  244. package/dist/default/define/live-video/skin.tailwind.js.map +1 -0
  245. package/dist/default/define/live-video/ui.js +44 -0
  246. package/dist/default/define/live-video/ui.js.map +1 -0
  247. package/dist/default/define/shared.css +4 -0
  248. package/dist/default/define/skin-element.js +3 -3
  249. package/dist/default/define/skin-element.js.map +1 -1
  250. package/dist/default/define/tailwind.css +66 -0
  251. package/dist/default/define/ui/compounds.js +43 -1
  252. package/dist/default/define/ui/compounds.js.map +1 -1
  253. package/dist/default/define/ui/menu.js +6 -0
  254. package/dist/default/define/ui/menu.js.map +1 -0
  255. package/dist/default/define/ui/playback-rate-menu.js +13 -0
  256. package/dist/default/define/ui/playback-rate-menu.js.map +1 -0
  257. package/dist/default/define/ui/seek-indicator-value.js +7 -0
  258. package/dist/default/define/ui/seek-indicator-value.js.map +1 -0
  259. package/dist/default/define/ui/seek-indicator.js +9 -0
  260. package/dist/default/define/ui/seek-indicator.js.map +1 -0
  261. package/dist/default/define/ui/status-announcer.js +7 -0
  262. package/dist/default/define/ui/status-announcer.js.map +1 -0
  263. package/dist/default/define/ui/status-indicator-value.js +7 -0
  264. package/dist/default/define/ui/status-indicator-value.js.map +1 -0
  265. package/dist/default/define/ui/status-indicator.js +9 -0
  266. package/dist/default/define/ui/status-indicator.js.map +1 -0
  267. package/dist/default/define/ui/volume-indicator-fill.js +7 -0
  268. package/dist/default/define/ui/volume-indicator-fill.js.map +1 -0
  269. package/dist/default/define/ui/volume-indicator-value.js +7 -0
  270. package/dist/default/define/ui/volume-indicator-value.js.map +1 -0
  271. package/dist/default/define/ui/volume-indicator.js +11 -0
  272. package/dist/default/define/ui/volume-indicator.js.map +1 -0
  273. package/dist/default/define/video/minimal-skin.css +571 -147
  274. package/dist/default/define/video/minimal-skin.js +1 -1
  275. package/dist/default/define/video/minimal-skin.js.map +1 -1
  276. package/dist/default/define/video/minimal-skin.tailwind.js +4 -2
  277. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  278. package/dist/default/define/video/minimal-ui.js +13 -3
  279. package/dist/default/define/video/minimal-ui.js.map +1 -1
  280. package/dist/default/define/video/skin.css +581 -145
  281. package/dist/default/define/video/skin.js +1 -1
  282. package/dist/default/define/video/skin.js.map +1 -1
  283. package/dist/default/define/video/skin.tailwind.js +3 -2
  284. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  285. package/dist/default/define/video/ui.js +11 -1
  286. package/dist/default/define/video/ui.js.map +1 -1
  287. package/dist/default/icons/default/index.js +19 -0
  288. package/dist/default/icons/dist/element/base.js +66 -0
  289. package/dist/default/icons/dist/element/base.js.map +1 -0
  290. package/dist/default/icons/dist/element/default/icons.js +25 -0
  291. package/dist/default/icons/dist/element/default/icons.js.map +1 -0
  292. package/dist/default/icons/dist/element/default/index.js +10 -0
  293. package/dist/default/icons/dist/element/default/index.js.map +1 -0
  294. package/dist/default/icons/dist/element/index.js +11 -0
  295. package/dist/default/icons/dist/element/index.js.map +1 -0
  296. package/dist/default/icons/dist/element/minimal/icons.js +25 -0
  297. package/dist/default/icons/dist/element/minimal/icons.js.map +1 -0
  298. package/dist/default/icons/dist/element/minimal/index.js +10 -0
  299. package/dist/default/icons/dist/element/minimal/index.js.map +1 -0
  300. package/dist/default/icons/dist/html/default/captions-off.js +6 -0
  301. package/dist/default/icons/dist/html/default/captions-off.js.map +1 -0
  302. package/dist/default/icons/dist/html/default/captions-on.js +6 -0
  303. package/dist/default/icons/dist/html/default/captions-on.js.map +1 -0
  304. package/dist/default/icons/dist/html/default/cast-enter.js +6 -0
  305. package/dist/default/icons/dist/html/default/cast-enter.js.map +1 -0
  306. package/dist/default/icons/dist/html/default/cast-exit.js +6 -0
  307. package/dist/default/icons/dist/html/default/cast-exit.js.map +1 -0
  308. package/dist/default/icons/dist/html/default/check.js +6 -0
  309. package/dist/default/icons/dist/html/default/check.js.map +1 -0
  310. package/dist/default/icons/dist/html/default/chevron.js +6 -0
  311. package/dist/default/icons/dist/html/default/chevron.js.map +1 -0
  312. package/dist/default/icons/dist/html/default/fullscreen-enter.js +6 -0
  313. package/dist/default/icons/dist/html/default/fullscreen-enter.js.map +1 -0
  314. package/dist/default/icons/dist/html/default/fullscreen-exit.js +6 -0
  315. package/dist/default/icons/dist/html/default/fullscreen-exit.js.map +1 -0
  316. package/dist/default/icons/dist/html/default/pause.js +6 -0
  317. package/dist/default/icons/dist/html/default/pause.js.map +1 -0
  318. package/dist/default/icons/dist/html/default/pip-enter.js +6 -0
  319. package/dist/default/icons/dist/html/default/pip-enter.js.map +1 -0
  320. package/dist/default/icons/dist/html/default/pip-exit.js +6 -0
  321. package/dist/default/icons/dist/html/default/pip-exit.js.map +1 -0
  322. package/dist/default/icons/dist/html/default/play.js +6 -0
  323. package/dist/default/icons/dist/html/default/play.js.map +1 -0
  324. package/dist/default/icons/dist/html/default/restart.js +6 -0
  325. package/dist/default/icons/dist/html/default/restart.js.map +1 -0
  326. package/dist/default/icons/dist/html/default/seek.js +6 -0
  327. package/dist/default/icons/dist/html/default/seek.js.map +1 -0
  328. package/dist/default/icons/dist/html/default/spinner.js +6 -0
  329. package/dist/default/icons/dist/html/default/spinner.js.map +1 -0
  330. package/dist/default/icons/dist/html/default/volume-high.js +6 -0
  331. package/dist/default/icons/dist/html/default/volume-high.js.map +1 -0
  332. package/dist/default/icons/dist/html/default/volume-low.js +6 -0
  333. package/dist/default/icons/dist/html/default/volume-low.js.map +1 -0
  334. package/dist/default/icons/dist/html/default/volume-off.js +6 -0
  335. package/dist/default/icons/dist/html/default/volume-off.js.map +1 -0
  336. package/dist/default/icons/dist/html/minimal/captions-off.js +6 -0
  337. package/dist/default/icons/dist/html/minimal/captions-off.js.map +1 -0
  338. package/dist/default/icons/dist/html/minimal/captions-on.js +6 -0
  339. package/dist/default/icons/dist/html/minimal/captions-on.js.map +1 -0
  340. package/dist/default/icons/dist/html/minimal/cast-enter.js +6 -0
  341. package/dist/default/icons/dist/html/minimal/cast-enter.js.map +1 -0
  342. package/dist/default/icons/dist/html/minimal/cast-exit.js +6 -0
  343. package/dist/default/icons/dist/html/minimal/cast-exit.js.map +1 -0
  344. package/dist/default/icons/dist/html/minimal/check.js +6 -0
  345. package/dist/default/icons/dist/html/minimal/check.js.map +1 -0
  346. package/dist/default/icons/dist/html/minimal/chevron.js +6 -0
  347. package/dist/default/icons/dist/html/minimal/chevron.js.map +1 -0
  348. package/dist/default/icons/dist/html/minimal/fullscreen-enter.js +6 -0
  349. package/dist/default/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
  350. package/dist/default/icons/dist/html/minimal/fullscreen-exit.js +6 -0
  351. package/dist/default/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
  352. package/dist/default/icons/dist/html/minimal/pause.js +6 -0
  353. package/dist/default/icons/dist/html/minimal/pause.js.map +1 -0
  354. package/dist/default/icons/dist/html/minimal/pip-enter.js +6 -0
  355. package/dist/default/icons/dist/html/minimal/pip-enter.js.map +1 -0
  356. package/dist/default/icons/dist/html/minimal/pip-exit.js +6 -0
  357. package/dist/default/icons/dist/html/minimal/pip-exit.js.map +1 -0
  358. package/dist/default/icons/dist/html/minimal/play.js +6 -0
  359. package/dist/default/icons/dist/html/minimal/play.js.map +1 -0
  360. package/dist/default/icons/dist/html/minimal/restart.js +6 -0
  361. package/dist/default/icons/dist/html/minimal/restart.js.map +1 -0
  362. package/dist/default/icons/dist/html/minimal/seek.js +6 -0
  363. package/dist/default/icons/dist/html/minimal/seek.js.map +1 -0
  364. package/dist/default/icons/dist/html/minimal/spinner.js +6 -0
  365. package/dist/default/icons/dist/html/minimal/spinner.js.map +1 -0
  366. package/dist/default/icons/dist/html/minimal/volume-high.js +6 -0
  367. package/dist/default/icons/dist/html/minimal/volume-high.js.map +1 -0
  368. package/dist/default/icons/dist/html/minimal/volume-low.js +6 -0
  369. package/dist/default/icons/dist/html/minimal/volume-low.js.map +1 -0
  370. package/dist/default/icons/dist/html/minimal/volume-off.js +6 -0
  371. package/dist/default/icons/dist/html/minimal/volume-off.js.map +1 -0
  372. package/dist/default/icons/dist/render/default/index.js +17 -15
  373. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  374. package/dist/default/icons/dist/render/minimal/index.js +17 -15
  375. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  376. package/dist/default/icons/element/default/index.js +1 -0
  377. package/dist/default/icons/element/index.js +1 -0
  378. package/dist/default/icons/element/minimal/index.js +1 -0
  379. package/dist/default/icons/index.js +19 -0
  380. package/dist/default/icons/minimal/index.js +19 -0
  381. package/dist/default/index.js +26 -1
  382. package/dist/default/media/mux-audio/index.js +4 -1
  383. package/dist/default/media/mux-audio/index.js.map +1 -1
  384. package/dist/default/media/mux-video/index.js +4 -1
  385. package/dist/default/media/mux-video/index.js.map +1 -1
  386. package/dist/default/player/context.js.map +1 -1
  387. package/dist/default/presets/live-audio.js +7 -0
  388. package/dist/default/presets/live-video.js +7 -0
  389. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +3 -2
  390. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  391. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  392. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  393. package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -2
  394. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  395. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +1 -1
  396. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  397. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -1
  398. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  399. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
  400. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
  401. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +12 -0
  402. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
  403. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  404. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  405. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +1 -1
  406. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -1
  407. package/dist/default/skins/dist/default/default/tailwind/components/reset.js +7 -0
  408. package/dist/default/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
  409. package/dist/default/skins/dist/default/default/tailwind/components/root.js +2 -1
  410. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  411. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +1 -1
  412. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  413. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +13 -4
  414. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  415. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
  416. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  417. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  418. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  419. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +3 -2
  420. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  421. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  422. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  423. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  424. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  425. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
  426. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
  427. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
  428. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
  429. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +1 -1
  430. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -1
  431. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +1 -1
  432. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -1
  433. package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
  434. package/dist/default/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
  435. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +2 -1
  436. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  437. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  438. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  439. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -4
  440. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  441. package/dist/default/store/provider-mixin.js +8 -3
  442. package/dist/default/store/provider-mixin.js.map +1 -1
  443. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js +7 -5
  444. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  445. package/dist/default/ui/alert-dialog/alert-dialog-element.js +12 -6
  446. package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  447. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +6 -3
  448. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  449. package/dist/default/ui/cast-button/cast-button-element.js +2 -2
  450. package/dist/default/ui/cast-button/cast-button-element.js.map +1 -1
  451. package/dist/default/ui/controls/controls-element.js +13 -1
  452. package/dist/default/ui/controls/controls-element.js.map +1 -1
  453. package/dist/default/ui/error-dialog/error-dialog-element.js +4 -1
  454. package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -1
  455. package/dist/default/ui/gesture/gesture-element.js +12 -8
  456. package/dist/default/ui/gesture/gesture-element.js.map +1 -1
  457. package/dist/default/ui/hotkey/hotkey-element.js +11 -7
  458. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
  459. package/dist/default/ui/input-indicators/input-indicator-element.js +110 -0
  460. package/dist/default/ui/input-indicators/input-indicator-element.js.map +1 -0
  461. package/dist/default/ui/input-indicators/live-indicator.js +32 -0
  462. package/dist/default/ui/input-indicators/live-indicator.js.map +1 -0
  463. package/dist/default/ui/live-button/live-button-element.js +97 -0
  464. package/dist/default/ui/live-button/live-button-element.js.map +1 -0
  465. package/dist/default/ui/media-button-element.js +4 -2
  466. package/dist/default/ui/media-button-element.js.map +1 -1
  467. package/dist/default/ui/menu/context.js +10 -0
  468. package/dist/default/ui/menu/context.js.map +1 -0
  469. package/dist/default/ui/menu/menu-back-element.js +57 -0
  470. package/dist/default/ui/menu/menu-back-element.js.map +1 -0
  471. package/dist/default/ui/menu/menu-checkbox-item-element.js +78 -0
  472. package/dist/default/ui/menu/menu-checkbox-item-element.js.map +1 -0
  473. package/dist/default/ui/menu/menu-element.js +285 -0
  474. package/dist/default/ui/menu/menu-element.js.map +1 -0
  475. package/dist/default/ui/menu/menu-group-element.js +35 -0
  476. package/dist/default/ui/menu/menu-group-element.js.map +1 -0
  477. package/dist/default/ui/menu/menu-item-element.js +96 -0
  478. package/dist/default/ui/menu/menu-item-element.js.map +1 -0
  479. package/dist/default/ui/menu/menu-item-indicator-element.js +34 -0
  480. package/dist/default/ui/menu/menu-item-indicator-element.js.map +1 -0
  481. package/dist/default/ui/menu/menu-label-element.js +20 -0
  482. package/dist/default/ui/menu/menu-label-element.js.map +1 -0
  483. package/dist/default/ui/menu/menu-radio-group-element.js +51 -0
  484. package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -0
  485. package/dist/default/ui/menu/menu-radio-item-element.js +84 -0
  486. package/dist/default/ui/menu/menu-radio-item-element.js.map +1 -0
  487. package/dist/default/ui/menu/menu-separator-element.js +24 -0
  488. package/dist/default/ui/menu/menu-separator-element.js.map +1 -0
  489. package/dist/default/ui/menu/menu-view-element.js +16 -0
  490. package/dist/default/ui/menu/menu-view-element.js.map +1 -0
  491. package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js +47 -0
  492. package/dist/default/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
  493. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +85 -0
  494. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
  495. package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js +113 -0
  496. package/dist/default/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
  497. package/dist/default/ui/popover/popover-element.js +44 -16
  498. package/dist/default/ui/popover/popover-element.js.map +1 -1
  499. package/dist/default/ui/position-controller.js +11 -6
  500. package/dist/default/ui/position-controller.js.map +1 -1
  501. package/dist/default/ui/seek-indicator/seek-indicator-element.js +44 -0
  502. package/dist/default/ui/seek-indicator/seek-indicator-element.js.map +1 -0
  503. package/dist/default/ui/seek-indicator/seek-indicator-value-element.js +11 -0
  504. package/dist/default/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
  505. package/dist/default/ui/slider/slider-element.js +8 -4
  506. package/dist/default/ui/slider/slider-element.js.map +1 -1
  507. package/dist/default/ui/slider/slider-preview-element.js +9 -6
  508. package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
  509. package/dist/default/ui/slider/slider-value-element.js +5 -4
  510. package/dist/default/ui/slider/slider-value-element.js.map +1 -1
  511. package/dist/default/ui/status-announcer/status-announcer-element.js +70 -0
  512. package/dist/default/ui/status-announcer/status-announcer-element.js.map +1 -0
  513. package/dist/default/ui/status-indicator/status-indicator-element.js +53 -0
  514. package/dist/default/ui/status-indicator/status-indicator-element.js.map +1 -0
  515. package/dist/default/ui/status-indicator/status-indicator-value-element.js +11 -0
  516. package/dist/default/ui/status-indicator/status-indicator-value-element.js.map +1 -0
  517. package/dist/default/ui/thumbnail/thumbnail-element.js +10 -5
  518. package/dist/default/ui/thumbnail/thumbnail-element.js.map +1 -1
  519. package/dist/default/ui/time/time-element.js +8 -4
  520. package/dist/default/ui/time/time-element.js.map +1 -1
  521. package/dist/default/ui/time-slider/time-slider-element.js +12 -6
  522. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  523. package/dist/default/ui/tooltip/tooltip-element.js +43 -16
  524. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  525. package/dist/default/ui/tooltip/tooltip-group-element.js +7 -5
  526. package/dist/default/ui/tooltip/tooltip-group-element.js.map +1 -1
  527. package/dist/default/ui/volume-indicator/volume-indicator-element.js +46 -0
  528. package/dist/default/ui/volume-indicator/volume-indicator-element.js.map +1 -0
  529. package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
  530. package/dist/default/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
  531. package/dist/default/ui/volume-indicator/volume-indicator-value-element.js +11 -0
  532. package/dist/default/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
  533. package/dist/default/ui/volume-slider/volume-slider-element.js +10 -5
  534. package/dist/default/ui/volume-slider/volume-slider-element.js.map +1 -1
  535. package/dist/dev/_virtual/_rolldown/runtime.js +27 -0
  536. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  537. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  538. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  539. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  540. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +1 -1
  541. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -1
  542. package/dist/dev/_virtual/inline-css_src/define/global.js +6 -0
  543. package/dist/dev/_virtual/inline-css_src/define/global.js.map +1 -0
  544. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +6 -0
  545. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -0
  546. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +6 -0
  547. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -0
  548. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +6 -0
  549. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -0
  550. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +6 -0
  551. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -0
  552. package/dist/dev/_virtual/inline-css_src/define/shared.js +1 -1
  553. package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -1
  554. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  555. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  556. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  557. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  558. package/dist/dev/define/audio/minimal-skin.css +227 -108
  559. package/dist/dev/define/audio/minimal-skin.d.ts +2 -2
  560. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  561. package/dist/dev/define/audio/minimal-skin.js +18 -14
  562. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  563. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
  564. package/dist/dev/define/audio/minimal-skin.tailwind.js +29 -23
  565. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  566. package/dist/dev/define/audio/minimal-ui.js +8 -3
  567. package/dist/dev/define/audio/minimal-ui.js.map +1 -1
  568. package/dist/dev/define/audio/player.d.ts +2 -2
  569. package/dist/dev/define/audio/skin.css +253 -108
  570. package/dist/dev/define/audio/skin.d.ts +2 -2
  571. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  572. package/dist/dev/define/audio/skin.js +18 -13
  573. package/dist/dev/define/audio/skin.js.map +1 -1
  574. package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
  575. package/dist/dev/define/audio/skin.tailwind.js +27 -21
  576. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  577. package/dist/dev/define/audio/ui.js +10 -1
  578. package/dist/dev/define/audio/ui.js.map +1 -1
  579. package/dist/dev/define/background/player.d.ts +2 -2
  580. package/dist/dev/define/background/skin.css +4 -2
  581. package/dist/dev/define/background/skin.d.ts.map +1 -1
  582. package/dist/dev/define/background/skin.js +1 -1
  583. package/dist/{default/define/base.css → dev/define/global.css} +12 -8
  584. package/dist/dev/define/live-audio/minimal-skin.css +897 -0
  585. package/dist/dev/define/live-audio/minimal-skin.d.ts +17 -0
  586. package/dist/dev/define/live-audio/minimal-skin.d.ts.map +1 -0
  587. package/dist/dev/define/live-audio/minimal-skin.js +78 -0
  588. package/dist/dev/define/live-audio/minimal-skin.js.map +1 -0
  589. package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts +14 -0
  590. package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts.map +1 -0
  591. package/dist/dev/define/live-audio/minimal-skin.tailwind.js +81 -0
  592. package/dist/dev/define/live-audio/minimal-skin.tailwind.js.map +1 -0
  593. package/dist/dev/define/live-audio/minimal-ui.d.ts +1 -0
  594. package/dist/dev/define/live-audio/minimal-ui.js +26 -0
  595. package/dist/dev/define/live-audio/minimal-ui.js.map +1 -0
  596. package/dist/dev/define/live-audio/player.d.ts +17 -0
  597. package/dist/dev/define/live-audio/player.d.ts.map +1 -0
  598. package/dist/dev/define/live-audio/player.js +18 -0
  599. package/dist/dev/define/live-audio/player.js.map +1 -0
  600. package/dist/dev/define/live-audio/skin.css +939 -0
  601. package/dist/dev/define/live-audio/skin.d.ts +17 -0
  602. package/dist/dev/define/live-audio/skin.d.ts.map +1 -0
  603. package/dist/dev/define/live-audio/skin.js +85 -0
  604. package/dist/dev/define/live-audio/skin.js.map +1 -0
  605. package/dist/dev/define/live-audio/skin.tailwind.d.ts +14 -0
  606. package/dist/dev/define/live-audio/skin.tailwind.d.ts.map +1 -0
  607. package/dist/dev/define/live-audio/skin.tailwind.js +80 -0
  608. package/dist/dev/define/live-audio/skin.tailwind.js.map +1 -0
  609. package/dist/dev/define/live-audio/ui.d.ts +1 -0
  610. package/dist/dev/define/live-audio/ui.js +30 -0
  611. package/dist/dev/define/live-audio/ui.js.map +1 -0
  612. package/dist/dev/define/live-video/minimal-skin.css +1593 -0
  613. package/dist/dev/define/live-video/minimal-skin.d.ts +17 -0
  614. package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -0
  615. package/dist/dev/define/live-video/minimal-skin.js +160 -0
  616. package/dist/dev/define/live-video/minimal-skin.js.map +1 -0
  617. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts +14 -0
  618. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -0
  619. package/dist/dev/define/live-video/minimal-skin.tailwind.js +161 -0
  620. package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -0
  621. package/dist/dev/define/live-video/minimal-ui.d.ts +1 -0
  622. package/dist/dev/define/live-video/minimal-ui.js +44 -0
  623. package/dist/dev/define/live-video/minimal-ui.js.map +1 -0
  624. package/dist/dev/define/live-video/player.d.ts +17 -0
  625. package/dist/dev/define/live-video/player.d.ts.map +1 -0
  626. package/dist/dev/define/live-video/player.js +18 -0
  627. package/dist/dev/define/live-video/player.js.map +1 -0
  628. package/dist/dev/define/live-video/skin.css +1595 -0
  629. package/dist/dev/define/live-video/skin.d.ts +17 -0
  630. package/dist/dev/define/live-video/skin.d.ts.map +1 -0
  631. package/dist/dev/define/live-video/skin.js +161 -0
  632. package/dist/dev/define/live-video/skin.js.map +1 -0
  633. package/dist/dev/define/live-video/skin.tailwind.d.ts +14 -0
  634. package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -0
  635. package/dist/dev/define/live-video/skin.tailwind.js +160 -0
  636. package/dist/dev/define/live-video/skin.tailwind.js.map +1 -0
  637. package/dist/dev/define/live-video/ui.d.ts +1 -0
  638. package/dist/dev/define/live-video/ui.js +44 -0
  639. package/dist/dev/define/live-video/ui.js.map +1 -0
  640. package/dist/dev/define/shared.css +4 -0
  641. package/dist/dev/define/skin-element.d.ts +1 -1
  642. package/dist/dev/define/skin-element.d.ts.map +1 -1
  643. package/dist/dev/define/skin-element.js +3 -3
  644. package/dist/dev/define/skin-element.js.map +1 -1
  645. package/dist/dev/define/tailwind.css +66 -0
  646. package/dist/dev/define/ui/compounds.d.ts +3 -1
  647. package/dist/dev/define/ui/compounds.d.ts.map +1 -1
  648. package/dist/dev/define/ui/compounds.js +43 -1
  649. package/dist/dev/define/ui/compounds.js.map +1 -1
  650. package/dist/dev/define/ui/menu.d.ts +25 -0
  651. package/dist/dev/define/ui/menu.d.ts.map +1 -0
  652. package/dist/dev/define/ui/menu.js +6 -0
  653. package/dist/dev/define/ui/menu.js.map +1 -0
  654. package/dist/dev/define/ui/playback-rate-menu.d.ts +13 -0
  655. package/dist/dev/define/ui/playback-rate-menu.d.ts.map +1 -0
  656. package/dist/dev/define/ui/playback-rate-menu.js +13 -0
  657. package/dist/dev/define/ui/playback-rate-menu.js.map +1 -0
  658. package/dist/dev/define/ui/seek-indicator-value.d.ts +9 -0
  659. package/dist/dev/define/ui/seek-indicator-value.d.ts.map +1 -0
  660. package/dist/dev/define/ui/seek-indicator-value.js +7 -0
  661. package/dist/dev/define/ui/seek-indicator-value.js.map +1 -0
  662. package/dist/dev/define/ui/seek-indicator.d.ts +11 -0
  663. package/dist/dev/define/ui/seek-indicator.d.ts.map +1 -0
  664. package/dist/dev/define/ui/seek-indicator.js +9 -0
  665. package/dist/dev/define/ui/seek-indicator.js.map +1 -0
  666. package/dist/dev/define/ui/status-announcer.d.ts +9 -0
  667. package/dist/dev/define/ui/status-announcer.d.ts.map +1 -0
  668. package/dist/dev/define/ui/status-announcer.js +7 -0
  669. package/dist/dev/define/ui/status-announcer.js.map +1 -0
  670. package/dist/dev/define/ui/status-indicator-value.d.ts +9 -0
  671. package/dist/dev/define/ui/status-indicator-value.d.ts.map +1 -0
  672. package/dist/dev/define/ui/status-indicator-value.js +7 -0
  673. package/dist/dev/define/ui/status-indicator-value.js.map +1 -0
  674. package/dist/dev/define/ui/status-indicator.d.ts +11 -0
  675. package/dist/dev/define/ui/status-indicator.d.ts.map +1 -0
  676. package/dist/dev/define/ui/status-indicator.js +9 -0
  677. package/dist/dev/define/ui/status-indicator.js.map +1 -0
  678. package/dist/dev/define/ui/volume-indicator-fill.d.ts +9 -0
  679. package/dist/dev/define/ui/volume-indicator-fill.d.ts.map +1 -0
  680. package/dist/dev/define/ui/volume-indicator-fill.js +7 -0
  681. package/dist/dev/define/ui/volume-indicator-fill.js.map +1 -0
  682. package/dist/dev/define/ui/volume-indicator-value.d.ts +9 -0
  683. package/dist/dev/define/ui/volume-indicator-value.d.ts.map +1 -0
  684. package/dist/dev/define/ui/volume-indicator-value.js +7 -0
  685. package/dist/dev/define/ui/volume-indicator-value.js.map +1 -0
  686. package/dist/dev/define/ui/volume-indicator.d.ts +13 -0
  687. package/dist/dev/define/ui/volume-indicator.d.ts.map +1 -0
  688. package/dist/dev/define/ui/volume-indicator.js +11 -0
  689. package/dist/dev/define/ui/volume-indicator.js.map +1 -0
  690. package/dist/dev/define/video/minimal-skin.css +571 -147
  691. package/dist/dev/define/video/minimal-skin.d.ts +2 -2
  692. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  693. package/dist/dev/define/video/minimal-skin.js +79 -14
  694. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  695. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  696. package/dist/dev/define/video/minimal-skin.tailwind.js +93 -21
  697. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  698. package/dist/dev/define/video/minimal-ui.js +13 -3
  699. package/dist/dev/define/video/minimal-ui.js.map +1 -1
  700. package/dist/dev/define/video/player.d.ts +2 -2
  701. package/dist/dev/define/video/skin.css +581 -145
  702. package/dist/dev/define/video/skin.d.ts +2 -2
  703. package/dist/dev/define/video/skin.d.ts.map +1 -1
  704. package/dist/dev/define/video/skin.js +52 -11
  705. package/dist/dev/define/video/skin.js.map +1 -1
  706. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  707. package/dist/dev/define/video/skin.tailwind.js +89 -19
  708. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  709. package/dist/dev/define/video/ui.js +11 -1
  710. package/dist/dev/define/video/ui.js.map +1 -1
  711. package/dist/dev/icons/default/index.d.ts +2 -0
  712. package/dist/dev/icons/default/index.js +19 -0
  713. package/dist/dev/icons/element/default/index.d.ts +1 -0
  714. package/dist/dev/icons/element/default/index.js +1 -0
  715. package/dist/dev/icons/element/index.d.ts +1 -0
  716. package/dist/dev/icons/element/index.js +1 -0
  717. package/dist/dev/icons/element/minimal/index.d.ts +1 -0
  718. package/dist/dev/icons/element/minimal/index.js +1 -0
  719. package/dist/dev/icons/index.d.ts +2 -0
  720. package/dist/dev/icons/index.js +19 -0
  721. package/dist/dev/icons/minimal/index.d.ts +2 -0
  722. package/dist/dev/icons/minimal/index.js +19 -0
  723. package/dist/dev/index.d.ts +36 -3
  724. package/dist/dev/index.d.ts.map +1 -0
  725. package/dist/dev/index.js +26 -1
  726. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  727. package/dist/dev/media/container-element.d.ts +2 -2
  728. package/dist/dev/media/dash-video/index.d.ts +2 -2
  729. package/dist/dev/media/hls-video/index.d.ts +2 -2
  730. package/dist/dev/media/mux-audio/index.d.ts +2 -2
  731. package/dist/dev/media/mux-audio/index.js +4 -1
  732. package/dist/dev/media/mux-audio/index.js.map +1 -1
  733. package/dist/dev/media/mux-video/index.d.ts +2 -2
  734. package/dist/dev/media/mux-video/index.js +4 -1
  735. package/dist/dev/media/mux-video/index.js.map +1 -1
  736. package/dist/dev/media/native-hls-video/index.d.ts +2 -2
  737. package/dist/dev/media/simple-hls-video/index.d.ts +2 -2
  738. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/index.d.ts +2 -0
  739. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.d.ts +61 -0
  740. 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
  741. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-consumer.d.ts +1 -0
  742. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/controllers/context-provider.d.ts +22 -0
  743. 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
  744. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts +19 -0
  745. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/create-context.d.ts.map +1 -0
  746. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/consume.d.ts +1 -0
  747. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/decorators/provide.d.ts +1 -0
  748. package/dist/dev/node_modules/.pnpm/@lit_context@1.1.6/node_modules/@lit/context/development/lib/value-notifier.d.ts +1 -0
  749. package/dist/dev/node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/development/reactive-element.d.ts +116 -0
  750. 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
  751. package/dist/dev/packages/icons/dist/element/base.js +66 -0
  752. package/dist/dev/packages/icons/dist/element/base.js.map +1 -0
  753. package/dist/dev/packages/icons/dist/element/default/icons.js +25 -0
  754. package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -0
  755. package/dist/dev/packages/icons/dist/element/default/index.d.ts +1 -0
  756. package/dist/dev/packages/icons/dist/element/default/index.js +10 -0
  757. package/dist/dev/packages/icons/dist/element/default/index.js.map +1 -0
  758. package/dist/dev/packages/icons/dist/element/index.d.ts +1 -0
  759. package/dist/dev/packages/icons/dist/element/index.js +11 -0
  760. package/dist/dev/packages/icons/dist/element/index.js.map +1 -0
  761. package/dist/dev/packages/icons/dist/element/minimal/icons.js +25 -0
  762. package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -0
  763. package/dist/dev/packages/icons/dist/element/minimal/index.d.ts +1 -0
  764. package/dist/dev/packages/icons/dist/element/minimal/index.js +10 -0
  765. package/dist/dev/packages/icons/dist/element/minimal/index.js.map +1 -0
  766. package/dist/dev/packages/icons/dist/html/default/captions-off.js +6 -0
  767. package/dist/dev/packages/icons/dist/html/default/captions-off.js.map +1 -0
  768. package/dist/dev/packages/icons/dist/html/default/captions-on.js +6 -0
  769. package/dist/dev/packages/icons/dist/html/default/captions-on.js.map +1 -0
  770. package/dist/dev/packages/icons/dist/html/default/cast-enter.js +6 -0
  771. package/dist/dev/packages/icons/dist/html/default/cast-enter.js.map +1 -0
  772. package/dist/dev/packages/icons/dist/html/default/cast-exit.js +6 -0
  773. package/dist/dev/packages/icons/dist/html/default/cast-exit.js.map +1 -0
  774. package/dist/dev/packages/icons/dist/html/default/check.js +6 -0
  775. package/dist/dev/packages/icons/dist/html/default/check.js.map +1 -0
  776. package/dist/dev/packages/icons/dist/html/default/chevron.js +6 -0
  777. package/dist/dev/packages/icons/dist/html/default/chevron.js.map +1 -0
  778. package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js +6 -0
  779. package/dist/dev/packages/icons/dist/html/default/fullscreen-enter.js.map +1 -0
  780. package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js +6 -0
  781. package/dist/dev/packages/icons/dist/html/default/fullscreen-exit.js.map +1 -0
  782. package/dist/dev/packages/icons/dist/html/default/index.d.ts +23 -0
  783. package/dist/dev/packages/icons/dist/html/default/index.d.ts.map +1 -0
  784. package/dist/dev/packages/icons/dist/html/default/pause.js +6 -0
  785. package/dist/dev/packages/icons/dist/html/default/pause.js.map +1 -0
  786. package/dist/dev/packages/icons/dist/html/default/pip-enter.js +6 -0
  787. package/dist/dev/packages/icons/dist/html/default/pip-enter.js.map +1 -0
  788. package/dist/dev/packages/icons/dist/html/default/pip-exit.js +6 -0
  789. package/dist/dev/packages/icons/dist/html/default/pip-exit.js.map +1 -0
  790. package/dist/dev/packages/icons/dist/html/default/play.js +6 -0
  791. package/dist/dev/packages/icons/dist/html/default/play.js.map +1 -0
  792. package/dist/dev/packages/icons/dist/html/default/restart.js +6 -0
  793. package/dist/dev/packages/icons/dist/html/default/restart.js.map +1 -0
  794. package/dist/dev/packages/icons/dist/html/default/seek.js +6 -0
  795. package/dist/dev/packages/icons/dist/html/default/seek.js.map +1 -0
  796. package/dist/dev/packages/icons/dist/html/default/spinner.js +6 -0
  797. package/dist/dev/packages/icons/dist/html/default/spinner.js.map +1 -0
  798. package/dist/dev/packages/icons/dist/html/default/volume-high.js +6 -0
  799. package/dist/dev/packages/icons/dist/html/default/volume-high.js.map +1 -0
  800. package/dist/dev/packages/icons/dist/html/default/volume-low.js +6 -0
  801. package/dist/dev/packages/icons/dist/html/default/volume-low.js.map +1 -0
  802. package/dist/dev/packages/icons/dist/html/default/volume-off.js +6 -0
  803. package/dist/dev/packages/icons/dist/html/default/volume-off.js.map +1 -0
  804. package/dist/dev/packages/icons/dist/html/minimal/captions-off.js +6 -0
  805. package/dist/dev/packages/icons/dist/html/minimal/captions-off.js.map +1 -0
  806. package/dist/dev/packages/icons/dist/html/minimal/captions-on.js +6 -0
  807. package/dist/dev/packages/icons/dist/html/minimal/captions-on.js.map +1 -0
  808. package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js +6 -0
  809. package/dist/dev/packages/icons/dist/html/minimal/cast-enter.js.map +1 -0
  810. package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js +6 -0
  811. package/dist/dev/packages/icons/dist/html/minimal/cast-exit.js.map +1 -0
  812. package/dist/dev/packages/icons/dist/html/minimal/check.js +6 -0
  813. package/dist/dev/packages/icons/dist/html/minimal/check.js.map +1 -0
  814. package/dist/dev/packages/icons/dist/html/minimal/chevron.js +6 -0
  815. package/dist/dev/packages/icons/dist/html/minimal/chevron.js.map +1 -0
  816. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js +6 -0
  817. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-enter.js.map +1 -0
  818. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js +6 -0
  819. package/dist/dev/packages/icons/dist/html/minimal/fullscreen-exit.js.map +1 -0
  820. package/dist/dev/packages/icons/dist/html/minimal/index.d.ts +23 -0
  821. package/dist/dev/packages/icons/dist/html/minimal/index.d.ts.map +1 -0
  822. package/dist/dev/packages/icons/dist/html/minimal/pause.js +6 -0
  823. package/dist/dev/packages/icons/dist/html/minimal/pause.js.map +1 -0
  824. package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js +6 -0
  825. package/dist/dev/packages/icons/dist/html/minimal/pip-enter.js.map +1 -0
  826. package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js +6 -0
  827. package/dist/dev/packages/icons/dist/html/minimal/pip-exit.js.map +1 -0
  828. package/dist/dev/packages/icons/dist/html/minimal/play.js +6 -0
  829. package/dist/dev/packages/icons/dist/html/minimal/play.js.map +1 -0
  830. package/dist/dev/packages/icons/dist/html/minimal/restart.js +6 -0
  831. package/dist/dev/packages/icons/dist/html/minimal/restart.js.map +1 -0
  832. package/dist/dev/packages/icons/dist/html/minimal/seek.js +6 -0
  833. package/dist/dev/packages/icons/dist/html/minimal/seek.js.map +1 -0
  834. package/dist/dev/packages/icons/dist/html/minimal/spinner.js +6 -0
  835. package/dist/dev/packages/icons/dist/html/minimal/spinner.js.map +1 -0
  836. package/dist/dev/packages/icons/dist/html/minimal/volume-high.js +6 -0
  837. package/dist/dev/packages/icons/dist/html/minimal/volume-high.js.map +1 -0
  838. package/dist/dev/packages/icons/dist/html/minimal/volume-low.js +6 -0
  839. package/dist/dev/packages/icons/dist/html/minimal/volume-low.js.map +1 -0
  840. package/dist/dev/packages/icons/dist/html/minimal/volume-off.js +6 -0
  841. package/dist/dev/packages/icons/dist/html/minimal/volume-off.js.map +1 -0
  842. package/dist/dev/packages/icons/dist/render/default/index.js +32 -0
  843. package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -0
  844. package/dist/dev/packages/icons/dist/render/minimal/index.js +32 -0
  845. package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -0
  846. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/audio.tailwind.js +3 -2
  847. package/dist/dev/packages/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -0
  848. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/buffering.js +1 -1
  849. package/dist/dev/packages/skins/dist/default/default/tailwind/components/buffering.js.map +1 -0
  850. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  851. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +13 -0
  852. package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -0
  853. package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js +7 -0
  854. package/dist/dev/packages/skins/dist/default/default/tailwind/components/controls.js.map +1 -0
  855. package/dist/dev/packages/skins/dist/default/default/tailwind/components/error.js.map +1 -0
  856. package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js +9 -0
  857. package/dist/dev/packages/skins/dist/default/default/tailwind/components/icon.js.map +1 -0
  858. package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js +40 -0
  859. package/dist/dev/packages/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -0
  860. package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js +12 -0
  861. package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js.map +1 -0
  862. package/dist/dev/packages/skins/dist/default/default/tailwind/components/overlay.js.map +1 -0
  863. package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js +6 -0
  864. package/dist/dev/packages/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -0
  865. package/dist/dev/packages/skins/dist/default/default/tailwind/components/popup.js.map +1 -0
  866. package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  867. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/preview.js +1 -1
  868. package/dist/dev/packages/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  869. package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js +7 -0
  870. package/dist/dev/packages/skins/dist/default/default/tailwind/components/reset.js.map +1 -0
  871. package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js +8 -0
  872. package/dist/dev/packages/skins/dist/default/default/tailwind/components/root.js.map +1 -0
  873. package/dist/dev/packages/skins/dist/default/default/tailwind/components/seek.js.map +1 -0
  874. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/slider.js +1 -1
  875. package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -0
  876. package/dist/dev/packages/skins/dist/default/default/tailwind/components/surface.js.map +1 -0
  877. package/dist/dev/packages/skins/dist/default/default/tailwind/components/time.js.map +1 -0
  878. package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/video.tailwind.js +13 -4
  879. package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -0
  880. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/audio.tailwind.js +4 -2
  881. package/dist/dev/packages/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -0
  882. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/buffering.js +1 -1
  883. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -0
  884. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -0
  885. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js +13 -0
  886. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js.map +1 -0
  887. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js +7 -0
  888. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -0
  889. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  890. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js +9 -0
  891. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -0
  892. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js +41 -0
  893. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -0
  894. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js +12 -0
  895. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -0
  896. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -0
  897. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  898. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  899. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -0
  900. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  901. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/preview.js +1 -1
  902. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  903. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js +7 -0
  904. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/reset.js.map +1 -0
  905. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js +8 -0
  906. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/root.js.map +1 -0
  907. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -0
  908. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/slider.js +1 -1
  909. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -0
  910. package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/time.js.map +1 -0
  911. package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/video.tailwind.js +6 -4
  912. package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -0
  913. package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  914. package/dist/dev/player/context.d.ts +3 -2
  915. package/dist/dev/player/context.d.ts.map +1 -1
  916. package/dist/dev/player/context.js.map +1 -1
  917. package/dist/dev/player/player-controller.d.ts +1 -1
  918. package/dist/dev/player/player-controller.d.ts.map +1 -1
  919. package/dist/dev/presets/live-audio.d.ts +7 -0
  920. package/dist/dev/presets/live-audio.js +7 -0
  921. package/dist/dev/presets/live-video.d.ts +7 -0
  922. package/dist/dev/presets/live-video.js +7 -0
  923. package/dist/dev/store/container-mixin.d.ts +1 -1
  924. package/dist/dev/store/provider-mixin.d.ts +1 -1
  925. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  926. package/dist/dev/store/provider-mixin.js +8 -3
  927. package/dist/dev/store/provider-mixin.js.map +1 -1
  928. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.d.ts.map +1 -1
  929. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js +7 -5
  930. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  931. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.d.ts +2 -2
  932. package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
  933. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +12 -6
  934. package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  935. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.d.ts +2 -2
  936. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
  937. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +6 -3
  938. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  939. package/dist/dev/ui/captions-button/captions-button-element.d.ts +4 -4
  940. package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
  941. package/dist/dev/ui/cast-button/cast-button-element.d.ts +6 -6
  942. package/dist/dev/ui/cast-button/cast-button-element.d.ts.map +1 -1
  943. package/dist/dev/ui/cast-button/cast-button-element.js +2 -2
  944. package/dist/dev/ui/cast-button/cast-button-element.js.map +1 -1
  945. package/dist/dev/ui/controls/controls-element.d.ts.map +1 -1
  946. package/dist/dev/ui/controls/controls-element.js +13 -1
  947. package/dist/dev/ui/controls/controls-element.js.map +1 -1
  948. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -1
  949. package/dist/dev/ui/error-dialog/error-dialog-element.js +4 -1
  950. package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -1
  951. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +4 -4
  952. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
  953. package/dist/dev/ui/gesture/gesture-element.js +12 -8
  954. package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
  955. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -1
  956. package/dist/dev/ui/hotkey/hotkey-element.js +11 -7
  957. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
  958. package/dist/dev/ui/input-indicators/input-indicator-element.d.ts +37 -0
  959. package/dist/dev/ui/input-indicators/input-indicator-element.d.ts.map +1 -0
  960. package/dist/dev/ui/input-indicators/input-indicator-element.js +110 -0
  961. package/dist/dev/ui/input-indicators/input-indicator-element.js.map +1 -0
  962. package/dist/dev/ui/input-indicators/live-indicator.d.ts +18 -0
  963. package/dist/dev/ui/input-indicators/live-indicator.d.ts.map +1 -0
  964. package/dist/dev/ui/input-indicators/live-indicator.js +32 -0
  965. package/dist/dev/ui/input-indicators/live-indicator.js.map +1 -0
  966. package/dist/dev/ui/live-button/live-button-element.d.ts +38 -0
  967. package/dist/dev/ui/live-button/live-button-element.d.ts.map +1 -0
  968. package/dist/dev/ui/live-button/live-button-element.js +98 -0
  969. package/dist/dev/ui/live-button/live-button-element.js.map +1 -0
  970. package/dist/dev/ui/media-button-element.d.ts +1 -1
  971. package/dist/dev/ui/media-button-element.js +4 -2
  972. package/dist/dev/ui/media-button-element.js.map +1 -1
  973. package/dist/dev/ui/media-element.d.ts +2 -2
  974. package/dist/dev/ui/menu/context.d.ts +25 -0
  975. package/dist/dev/ui/menu/context.d.ts.map +1 -0
  976. package/dist/dev/ui/menu/context.js +10 -0
  977. package/dist/dev/ui/menu/context.js.map +1 -0
  978. package/dist/dev/ui/menu/menu-back-element.d.ts +20 -0
  979. package/dist/dev/ui/menu/menu-back-element.d.ts.map +1 -0
  980. package/dist/dev/ui/menu/menu-back-element.js +57 -0
  981. package/dist/dev/ui/menu/menu-back-element.js.map +1 -0
  982. package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts +24 -0
  983. package/dist/dev/ui/menu/menu-checkbox-item-element.d.ts.map +1 -0
  984. package/dist/dev/ui/menu/menu-checkbox-item-element.js +78 -0
  985. package/dist/dev/ui/menu/menu-checkbox-item-element.js.map +1 -0
  986. package/dist/dev/ui/menu/menu-element.d.ts +52 -0
  987. package/dist/dev/ui/menu/menu-element.d.ts.map +1 -0
  988. package/dist/dev/ui/menu/menu-element.js +285 -0
  989. package/dist/dev/ui/menu/menu-element.js.map +1 -0
  990. package/dist/dev/ui/menu/menu-group-element.d.ts +18 -0
  991. package/dist/dev/ui/menu/menu-group-element.d.ts.map +1 -0
  992. package/dist/dev/ui/menu/menu-group-element.js +35 -0
  993. package/dist/dev/ui/menu/menu-group-element.js.map +1 -0
  994. package/dist/dev/ui/menu/menu-item-element.d.ts +25 -0
  995. package/dist/dev/ui/menu/menu-item-element.d.ts.map +1 -0
  996. package/dist/dev/ui/menu/menu-item-element.js +96 -0
  997. package/dist/dev/ui/menu/menu-item-element.js.map +1 -0
  998. package/dist/dev/ui/menu/menu-item-indicator-element.d.ts +22 -0
  999. package/dist/dev/ui/menu/menu-item-indicator-element.d.ts.map +1 -0
  1000. package/dist/dev/ui/menu/menu-item-indicator-element.js +34 -0
  1001. package/dist/dev/ui/menu/menu-item-indicator-element.js.map +1 -0
  1002. package/dist/dev/ui/menu/menu-label-element.d.ts +15 -0
  1003. package/dist/dev/ui/menu/menu-label-element.d.ts.map +1 -0
  1004. package/dist/dev/ui/menu/menu-label-element.js +20 -0
  1005. package/dist/dev/ui/menu/menu-label-element.js.map +1 -0
  1006. package/dist/dev/ui/menu/menu-radio-group-element.d.ts +22 -0
  1007. package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -0
  1008. package/dist/dev/ui/menu/menu-radio-group-element.js +51 -0
  1009. package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -0
  1010. package/dist/dev/ui/menu/menu-radio-item-element.d.ts +24 -0
  1011. package/dist/dev/ui/menu/menu-radio-item-element.d.ts.map +1 -0
  1012. package/dist/dev/ui/menu/menu-radio-item-element.js +84 -0
  1013. package/dist/dev/ui/menu/menu-radio-item-element.js.map +1 -0
  1014. package/dist/dev/ui/menu/menu-separator-element.d.ts +12 -0
  1015. package/dist/dev/ui/menu/menu-separator-element.d.ts.map +1 -0
  1016. package/dist/dev/ui/menu/menu-separator-element.js +24 -0
  1017. package/dist/dev/ui/menu/menu-separator-element.js.map +1 -0
  1018. package/dist/dev/ui/menu/menu-view-element.d.ts +11 -0
  1019. package/dist/dev/ui/menu/menu-view-element.d.ts.map +1 -0
  1020. package/dist/dev/ui/menu/menu-view-element.js +16 -0
  1021. package/dist/dev/ui/menu/menu-view-element.js.map +1 -0
  1022. package/dist/dev/ui/mute-button/mute-button-element.d.ts +4 -4
  1023. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
  1024. package/dist/dev/ui/pip-button/pip-button-element.d.ts +4 -4
  1025. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
  1026. package/dist/dev/ui/play-button/play-button-element.d.ts +5 -5
  1027. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
  1028. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts +3 -3
  1029. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
  1030. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts +53 -0
  1031. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.d.ts.map +1 -0
  1032. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js +48 -0
  1033. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-element.js.map +1 -0
  1034. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts +35 -0
  1035. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.d.ts.map +1 -0
  1036. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js +86 -0
  1037. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger-element.js.map +1 -0
  1038. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts +31 -0
  1039. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.d.ts.map +1 -0
  1040. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js +114 -0
  1041. package/dist/dev/ui/playback-rate-menu/playback-rate-options-element.js.map +1 -0
  1042. package/dist/dev/ui/popover/popover-element.d.ts +9 -3
  1043. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  1044. package/dist/dev/ui/popover/popover-element.js +44 -16
  1045. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  1046. package/dist/dev/ui/position-controller.js +11 -6
  1047. package/dist/dev/ui/position-controller.js.map +1 -1
  1048. package/dist/dev/ui/poster/poster-element.d.ts +4 -4
  1049. package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
  1050. package/dist/dev/ui/seek-button/seek-button-element.d.ts +4 -4
  1051. package/dist/dev/ui/seek-button/seek-button-element.d.ts.map +1 -1
  1052. package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts +25 -0
  1053. package/dist/dev/ui/seek-indicator/seek-indicator-element.d.ts.map +1 -0
  1054. package/dist/dev/ui/seek-indicator/seek-indicator-element.js +44 -0
  1055. package/dist/dev/ui/seek-indicator/seek-indicator-element.js.map +1 -0
  1056. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts +9 -0
  1057. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.d.ts.map +1 -0
  1058. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js +11 -0
  1059. package/dist/dev/ui/seek-indicator/seek-indicator-value-element.js.map +1 -0
  1060. package/dist/dev/ui/slider/slider-element.d.ts +2 -2
  1061. package/dist/dev/ui/slider/slider-element.d.ts.map +1 -1
  1062. package/dist/dev/ui/slider/slider-element.js +8 -4
  1063. package/dist/dev/ui/slider/slider-element.js.map +1 -1
  1064. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
  1065. package/dist/dev/ui/slider/slider-preview-element.js +9 -6
  1066. package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
  1067. package/dist/dev/ui/slider/slider-value-element.d.ts.map +1 -1
  1068. package/dist/dev/ui/slider/slider-value-element.js +5 -4
  1069. package/dist/dev/ui/slider/slider-value-element.js.map +1 -1
  1070. package/dist/dev/ui/status-announcer/status-announcer-element.d.ts +23 -0
  1071. package/dist/dev/ui/status-announcer/status-announcer-element.d.ts.map +1 -0
  1072. package/dist/dev/ui/status-announcer/status-announcer-element.js +70 -0
  1073. package/dist/dev/ui/status-announcer/status-announcer-element.js.map +1 -0
  1074. package/dist/dev/ui/status-indicator/status-indicator-element.d.ts +29 -0
  1075. package/dist/dev/ui/status-indicator/status-indicator-element.d.ts.map +1 -0
  1076. package/dist/dev/ui/status-indicator/status-indicator-element.js +53 -0
  1077. package/dist/dev/ui/status-indicator/status-indicator-element.js.map +1 -0
  1078. package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts +9 -0
  1079. package/dist/dev/ui/status-indicator/status-indicator-value-element.d.ts.map +1 -0
  1080. package/dist/dev/ui/status-indicator/status-indicator-value-element.js +11 -0
  1081. package/dist/dev/ui/status-indicator/status-indicator-value-element.js.map +1 -0
  1082. package/dist/dev/ui/thumbnail/thumbnail-element.d.ts.map +1 -1
  1083. package/dist/dev/ui/thumbnail/thumbnail-element.js +10 -5
  1084. package/dist/dev/ui/thumbnail/thumbnail-element.js.map +1 -1
  1085. package/dist/dev/ui/time/time-element.d.ts +2 -2
  1086. package/dist/dev/ui/time/time-element.d.ts.map +1 -1
  1087. package/dist/dev/ui/time/time-element.js +8 -4
  1088. package/dist/dev/ui/time/time-element.js.map +1 -1
  1089. package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
  1090. package/dist/dev/ui/time-slider/time-slider-element.d.ts.map +1 -1
  1091. package/dist/dev/ui/time-slider/time-slider-element.js +12 -6
  1092. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  1093. package/dist/dev/ui/tooltip/tooltip-element.d.ts +9 -3
  1094. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  1095. package/dist/dev/ui/tooltip/tooltip-element.js +43 -16
  1096. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  1097. package/dist/dev/ui/tooltip/tooltip-group-element.d.ts.map +1 -1
  1098. package/dist/dev/ui/tooltip/tooltip-group-element.js +7 -5
  1099. package/dist/dev/ui/tooltip/tooltip-group-element.js.map +1 -1
  1100. package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts +25 -0
  1101. package/dist/dev/ui/volume-indicator/volume-indicator-element.d.ts.map +1 -0
  1102. package/dist/dev/ui/volume-indicator/volume-indicator-element.js +46 -0
  1103. package/dist/dev/ui/volume-indicator/volume-indicator-element.js.map +1 -0
  1104. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts +9 -0
  1105. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.d.ts.map +1 -0
  1106. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js +11 -0
  1107. package/dist/dev/ui/volume-indicator/volume-indicator-fill-element.js.map +1 -0
  1108. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts +9 -0
  1109. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.d.ts.map +1 -0
  1110. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js +11 -0
  1111. package/dist/dev/ui/volume-indicator/volume-indicator-value-element.js.map +1 -0
  1112. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts +2 -2
  1113. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts.map +1 -1
  1114. package/dist/dev/ui/volume-slider/volume-slider-element.js +10 -5
  1115. package/dist/dev/ui/volume-slider/volume-slider-element.js.map +1 -1
  1116. package/docs/README.md +7 -0
  1117. package/docs/concepts/accessibility.md +60 -0
  1118. package/docs/concepts/browser-support.md +37 -0
  1119. package/docs/concepts/features.md +129 -0
  1120. package/docs/concepts/overview.md +118 -0
  1121. package/docs/concepts/presets.md +207 -0
  1122. package/docs/concepts/skins.md +2006 -0
  1123. package/docs/concepts/ui-components.md +59 -0
  1124. package/docs/concepts/v10-roadmap.md +75 -0
  1125. package/docs/concepts/why-videojs.md +113 -0
  1126. package/docs/how-to/build-with-ai.md +39 -0
  1127. package/docs/how-to/build-your-own-component.md +217 -0
  1128. package/docs/how-to/customize-skins.md +5711 -0
  1129. package/docs/how-to/installation.md +172 -0
  1130. package/docs/llms.txt +88 -0
  1131. package/docs/reference/buffering-indicator.md +152 -0
  1132. package/docs/reference/captions-button.md +216 -0
  1133. package/docs/reference/container-mixin.md +69 -0
  1134. package/docs/reference/controls.md +248 -0
  1135. package/docs/reference/create-selector.md +59 -0
  1136. package/docs/reference/feature-buffer.md +52 -0
  1137. package/docs/reference/feature-controls.md +70 -0
  1138. package/docs/reference/feature-error.md +60 -0
  1139. package/docs/reference/feature-fullscreen.md +90 -0
  1140. package/docs/reference/feature-live.md +60 -0
  1141. package/docs/reference/feature-pip.md +90 -0
  1142. package/docs/reference/feature-playback-rate.md +70 -0
  1143. package/docs/reference/feature-playback.md +110 -0
  1144. package/docs/reference/feature-remote-playback.md +70 -0
  1145. package/docs/reference/feature-source.md +70 -0
  1146. package/docs/reference/feature-stream-type.md +46 -0
  1147. package/docs/reference/feature-text-tracks.md +100 -0
  1148. package/docs/reference/feature-time.md +80 -0
  1149. package/docs/reference/feature-volume.md +90 -0
  1150. package/docs/reference/fullscreen-button.md +229 -0
  1151. package/docs/reference/html-create-player.md +449 -0
  1152. package/docs/reference/media-attach-mixin.md +83 -0
  1153. package/docs/reference/mute-button.md +301 -0
  1154. package/docs/reference/pip-button.md +229 -0
  1155. package/docs/reference/play-button.md +251 -0
  1156. package/docs/reference/playback-rate-button.md +170 -0
  1157. package/docs/reference/player-container.md +126 -0
  1158. package/docs/reference/player-context.md +50 -0
  1159. package/docs/reference/player-controller.md +276 -0
  1160. package/docs/reference/player-provider.md +114 -0
  1161. package/docs/reference/popover.md +460 -0
  1162. package/docs/reference/poster.md +158 -0
  1163. package/docs/reference/provider-mixin.md +71 -0
  1164. package/docs/reference/seek-button.md +223 -0
  1165. package/docs/reference/slider.md +862 -0
  1166. package/docs/reference/snapshot-controller.md +208 -0
  1167. package/docs/reference/store-controller.md +180 -0
  1168. package/docs/reference/thumbnail.md +364 -0
  1169. package/docs/reference/time-slider.md +794 -0
  1170. package/docs/reference/time.md +488 -0
  1171. package/docs/reference/tooltip.md +547 -0
  1172. package/docs/reference/volume-slider.md +783 -0
  1173. package/package.json +46 -12
  1174. package/cdn/compounds-CCgS3IGo.js +0 -8
  1175. package/cdn/compounds-CCgS3IGo.js.map +0 -1
  1176. package/cdn/compounds-DD3MYkSc.js.map +0 -1
  1177. package/cdn/context-0rI_P6jf.js.map +0 -1
  1178. package/cdn/context-CEFisYD0.js.map +0 -1
  1179. package/cdn/create-player-B-PGzhq2.js +0 -7
  1180. package/cdn/create-player-B-PGzhq2.js.map +0 -1
  1181. package/cdn/create-player-BKLw7l1a.js.map +0 -1
  1182. package/cdn/default-Djy9PEXm.js +0 -2
  1183. package/cdn/default-Djy9PEXm.js.map +0 -1
  1184. package/cdn/default-YzaLyoYg.js +0 -30
  1185. package/cdn/default-YzaLyoYg.js.map +0 -1
  1186. package/cdn/hls-CcSAx_3I.js.map +0 -1
  1187. package/cdn/hls-Dl2v35sW.js +0 -41
  1188. package/cdn/hls-Dl2v35sW.js.map +0 -1
  1189. package/cdn/hotkey-element-BONs_FyJ.js.map +0 -1
  1190. package/cdn/hotkey-element-DWWkfH3A.js +0 -2
  1191. package/cdn/hotkey-element-DWWkfH3A.js.map +0 -1
  1192. package/cdn/media-attach-mixin-C2wz0Qbd.js +0 -2
  1193. package/cdn/minimal-AX_y2YBU.js +0 -30
  1194. package/cdn/minimal-AX_y2YBU.js.map +0 -1
  1195. package/cdn/minimal-Bc74CFqg.js +0 -2
  1196. package/cdn/minimal-Bc74CFqg.js.map +0 -1
  1197. package/cdn/minimal-ui-CE1sVxKB.js +0 -22
  1198. package/cdn/minimal-ui-CE1sVxKB.js.map +0 -1
  1199. package/cdn/minimal-ui-hC8-_9_F.js +0 -2
  1200. package/cdn/minimal-ui-hC8-_9_F.js.map +0 -1
  1201. package/cdn/minimal-ui-lnw8AjaS.js +0 -2
  1202. package/cdn/minimal-ui-lnw8AjaS.js.map +0 -1
  1203. package/cdn/minimal-ui-yKur3jyD.js +0 -29
  1204. package/cdn/minimal-ui-yKur3jyD.js.map +0 -1
  1205. package/cdn/mux-BgWl50KW.js.map +0 -1
  1206. package/cdn/mux-BhHIeG3e.js.map +0 -1
  1207. package/cdn/native-hls-lhip4tV9.js +0 -123
  1208. package/cdn/native-hls-lhip4tV9.js.map +0 -1
  1209. package/cdn/native-hls-odPBXxK7.js +0 -2
  1210. package/cdn/native-hls-odPBXxK7.js.map +0 -1
  1211. package/cdn/player-B7jISTmQ.js +0 -2
  1212. package/cdn/player-B7jISTmQ.js.map +0 -1
  1213. package/cdn/player-ChdQN3H5.js +0 -2
  1214. package/cdn/player-DX5Ka0vt.js.map +0 -1
  1215. package/cdn/skin-element-D3iVinGP.js +0 -55
  1216. package/cdn/skin-element-D3iVinGP.js.map +0 -1
  1217. package/cdn/skin-element-DM82PPxz.js +0 -2
  1218. package/cdn/skin-element-DM82PPxz.js.map +0 -1
  1219. package/cdn/ui-BGvi0TNr.js +0 -2
  1220. package/cdn/ui-BGvi0TNr.js.map +0 -1
  1221. package/cdn/ui-BN57BxYZ.js +0 -2
  1222. package/cdn/ui-BN57BxYZ.js.map +0 -1
  1223. package/cdn/ui-CKR6dVbQ.js +0 -25
  1224. package/cdn/ui-CKR6dVbQ.js.map +0 -1
  1225. package/cdn/ui-CZ4yl3t3.js +0 -32
  1226. package/cdn/ui-CZ4yl3t3.js.map +0 -1
  1227. package/dist/default/_virtual/inline-css_src/define/base.js +0 -6
  1228. package/dist/default/_virtual/inline-css_src/define/base.js.map +0 -1
  1229. package/dist/dev/_virtual/inline-css_src/define/base.js +0 -6
  1230. package/dist/dev/_virtual/inline-css_src/define/base.js.map +0 -1
  1231. package/dist/dev/icons/dist/render/default/index.js +0 -30
  1232. package/dist/dev/icons/dist/render/default/index.js.map +0 -1
  1233. package/dist/dev/icons/dist/render/minimal/index.js +0 -30
  1234. package/dist/dev/icons/dist/render/minimal/index.js.map +0 -1
  1235. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +0 -1
  1236. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +0 -1
  1237. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js.map +0 -1
  1238. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +0 -12
  1239. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +0 -1
  1240. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +0 -7
  1241. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +0 -1
  1242. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +0 -1
  1243. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +0 -9
  1244. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +0 -1
  1245. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +0 -1
  1246. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +0 -6
  1247. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +0 -1
  1248. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +0 -1
  1249. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +0 -1
  1250. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +0 -1
  1251. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +0 -7
  1252. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +0 -1
  1253. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +0 -1
  1254. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +0 -1
  1255. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +0 -1
  1256. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +0 -1
  1257. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +0 -1
  1258. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +0 -1
  1259. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +0 -1
  1260. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +0 -1
  1261. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +0 -12
  1262. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +0 -1
  1263. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +0 -7
  1264. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +0 -1
  1265. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +0 -1
  1266. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +0 -9
  1267. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +0 -1
  1268. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +0 -1
  1269. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +0 -6
  1270. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +0 -1
  1271. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +0 -1
  1272. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +0 -1
  1273. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +0 -1
  1274. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +0 -7
  1275. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +0 -1
  1276. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +0 -1
  1277. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +0 -1
  1278. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +0 -1
  1279. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +0 -1
  1280. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +0 -1
  1281. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/button-group.js +0 -0
  1282. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/error.js +0 -0
  1283. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/overlay.js +0 -0
  1284. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/popup.js +0 -0
  1285. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/poster.js +0 -0
  1286. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/seek.js +0 -0
  1287. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/surface.js +0 -0
  1288. /package/dist/dev/{skins → packages/skins}/dist/default/default/tailwind/components/time.js +0 -0
  1289. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/button-group.js +0 -0
  1290. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/error.js +0 -0
  1291. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/overlay.js +0 -0
  1292. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/popup.js +0 -0
  1293. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/poster.js +0 -0
  1294. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/seek.js +0 -0
  1295. /package/dist/dev/{skins → packages/skins}/dist/default/minimal/tailwind/components/time.js +0 -0
  1296. /package/dist/dev/{skins → packages/skins}/dist/default/shared/tailwind/icon-state.js +0 -0
@@ -1,7 +1,8 @@
1
- import { A as ContextProvider, C as AbortControllerRegistry, D as isUndefined, E as isNumber, N as isEditableTarget, P as isInteractiveActivation, S as throwNoTargetError, T as isNull, b as createState, c as timeFeature, d as playbackRateFeature, f as playbackFeature, g as controlsFeature, h as errorFeature, j as ContextConsumer, k as MediaElement, l as textTrackFeature, m as fullscreenFeature, n as PlayerController, p as pipFeature, r as SnapshotController, s as volumeFeature, u as sourceFeature, v as castFeature, w as isFunction, x as noop, y as bufferFeature } from "./create-player-BKLw7l1a.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 { i as createContext, o as safeDefine, r as playerContext, t as containerContext } from "./context-0rI_P6jf.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
+ import { t as MediaStreamTypes } from "./types-B_4Es-UH.js";
5
6
 
6
7
  //#region ../utils/dist/dom/direction.js
7
8
  /** Check whether an element's text direction is right-to-left. */
@@ -74,12 +75,23 @@ function resolveCSSLength(el, value) {
74
75
 
75
76
  //#endregion
76
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
+ };
77
83
  function getTransitionFlags(status) {
78
84
  return {
79
85
  transitionStarting: status === "starting",
80
86
  transitionEnding: status === "ending"
81
87
  };
82
88
  }
89
+ function getTransitionStyleAttrs({ transitionStarting, transitionEnding }) {
90
+ return {
91
+ [TransitionDataAttrs.transitionStarting]: transitionStarting ? "" : void 0,
92
+ [TransitionDataAttrs.transitionEnding]: transitionEnding ? "" : void 0
93
+ };
94
+ }
83
95
 
84
96
  //#endregion
85
97
  //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-core.js
@@ -126,8 +138,7 @@ var AlertDialogCore = class {
126
138
  //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-data-attrs.js
127
139
  const AlertDialogDataAttrs = {
128
140
  open: "data-open",
129
- transitionStarting: "data-starting-style",
130
- transitionEnding: "data-ending-style"
141
+ ...TransitionDataAttrs
131
142
  };
132
143
 
133
144
  //#endregion
@@ -264,152 +275,757 @@ var ErrorDialogCore = class extends AlertDialogCore {
264
275
  };
265
276
 
266
277
  //#endregion
267
- //#region ../core/dist/dev/core/ui/mute-button/mute-button-core.js
268
- var MuteButtonCore = class MuteButtonCore {
269
- static defaultProps = {
270
- label: "",
271
- disabled: false
272
- };
273
- state = createState({
274
- muted: false,
275
- volumeLevel: "off",
276
- label: ""
277
- });
278
- #props = { ...MuteButtonCore.defaultProps };
279
- #media = null;
280
- constructor(props) {
281
- 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();
282
302
  }
283
- setProps(props) {
284
- this.#props = defaults(props, MuteButtonCore.defaultProps);
303
+ destroy() {
304
+ this.clear();
285
305
  }
286
- getLabel(state) {
287
- const { label } = this.#props;
288
- if (isFunction(label)) {
289
- const customLabel = label(state);
290
- if (customLabel) return customLabel;
291
- } else if (label) return label;
292
- 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);
293
312
  }
294
- 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);
295
568
  return {
296
- "aria-label": this.getLabel(state),
297
- "aria-disabled": this.#props.disabled ? "true" : void 0
569
+ snapshotVolume,
570
+ nextMuted: muted && nextVolume <= 0,
571
+ nextVolume
298
572
  };
299
573
  }
300
- setMedia(media) {
301
- this.#media = media;
302
- }
303
- getState() {
304
- 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;
305
614
  this.state.patch({
306
- muted: media.muted || media.volume === 0,
307
- volumeLevel: getVolumeLevel(media)
615
+ open: false,
616
+ direction: null,
617
+ count: 0,
618
+ seekTotal: 0,
619
+ value: null
308
620
  });
309
- this.state.patch({ label: this.getLabel(this.state.current) });
310
- return this.state.current;
621
+ }, () => getIndicatorCloseDelay(this.#props));
622
+ setProps(props) {
623
+ this.#props = props;
311
624
  }
312
- toggle(media) {
313
- if (this.#props.disabled) return;
314
- 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;
315
659
  }
316
660
  };
317
- function getVolumeLevel(media) {
318
- if (media.muted || media.volume === 0) return "off";
319
- if (media.volume < .5) return "low";
320
- if (media.volume < .75) return "medium";
321
- return "high";
322
- }
323
661
 
324
662
  //#endregion
325
- //#region ../core/dist/dev/core/ui/mute-button/mute-button-data-attrs.js
326
- const MuteButtonDataAttrs = {
327
- muted: "data-muted",
328
- 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"
329
669
  };
330
670
 
331
671
  //#endregion
332
- //#region ../core/dist/dev/core/ui/play-button/play-button-core.js
333
- var PlayButtonCore = class PlayButtonCore {
334
- static defaultProps = {
335
- label: "",
336
- disabled: false
337
- };
338
- state = createState({
339
- paused: true,
340
- ended: false,
341
- started: false,
342
- label: ""
343
- });
344
- #props = { ...PlayButtonCore.defaultProps };
345
- #media = null;
346
- constructor(props) {
347
- if (props) this.setProps(props);
348
- }
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));
349
677
  setProps(props) {
350
- this.#props = defaults(props, PlayButtonCore.defaultProps);
678
+ this.#props = props;
351
679
  }
352
- getLabel(state) {
353
- const { label } = this.#props;
354
- if (isFunction(label)) {
355
- const customLabel = label(state);
356
- if (customLabel) return customLabel;
357
- } else if (label) return label;
358
- if (state.ended) return "Replay";
359
- return state.paused ? "Play" : "Pause";
680
+ destroy() {
681
+ this.#close.destroy();
360
682
  }
361
- getAttrs(state) {
362
- return {
363
- "aria-label": this.getLabel(state),
364
- "aria-disabled": this.#props.disabled ? "true" : void 0
365
- };
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;
366
692
  }
367
- 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) {
368
979
  this.#media = media;
369
980
  }
370
981
  getState() {
371
982
  const media = this.#media;
372
983
  this.state.patch({
373
- paused: media.paused,
374
- ended: media.ended,
375
- started: media.started
984
+ muted: media.muted || media.volume === 0,
985
+ volumeLevel: getVolumeLevel(media)
376
986
  });
377
987
  this.state.patch({ label: this.getLabel(this.state.current) });
378
988
  return this.state.current;
379
989
  }
380
- async toggle(media) {
990
+ toggle(media) {
381
991
  if (this.#props.disabled) return;
382
- if (media.paused || media.ended) return media.play();
383
- media.pause();
992
+ media.toggleMuted();
384
993
  }
385
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
+ }
386
1001
 
387
1002
  //#endregion
388
- //#region ../core/dist/dev/core/ui/play-button/play-button-data-attrs.js
389
- const PlayButtonDataAttrs = {
390
- paused: "data-paused",
391
- ended: "data-ended",
392
- 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"
393
1007
  };
394
1008
 
395
1009
  //#endregion
396
- //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-core.js
397
- var PlaybackRateButtonCore = class PlaybackRateButtonCore {
1010
+ //#region ../core/dist/dev/core/ui/play-button/play-button-core.js
1011
+ var PlayButtonCore = class PlayButtonCore {
398
1012
  static defaultProps = {
399
1013
  label: "",
400
1014
  disabled: false
401
1015
  };
402
1016
  state = createState({
403
- rate: 1,
1017
+ paused: true,
1018
+ ended: false,
1019
+ started: false,
404
1020
  label: ""
405
1021
  });
406
- #props = { ...PlaybackRateButtonCore.defaultProps };
1022
+ #props = { ...PlayButtonCore.defaultProps };
407
1023
  #media = null;
408
1024
  constructor(props) {
409
1025
  if (props) this.setProps(props);
410
1026
  }
411
1027
  setProps(props) {
412
- this.#props = defaults(props, PlaybackRateButtonCore.defaultProps);
1028
+ this.#props = defaults(props, PlayButtonCore.defaultProps);
413
1029
  }
414
1030
  getLabel(state) {
415
1031
  const { label } = this.#props;
@@ -417,7 +1033,8 @@ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
417
1033
  const customLabel = label(state);
418
1034
  if (customLabel) return customLabel;
419
1035
  } else if (label) return label;
420
- return `Playback rate ${state.rate}`;
1036
+ if (state.ended) return "Replay";
1037
+ return state.paused ? "Play" : "Pause";
421
1038
  }
422
1039
  getAttrs(state) {
423
1040
  return {
@@ -430,23 +1047,28 @@ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
430
1047
  }
431
1048
  getState() {
432
1049
  const media = this.#media;
433
- this.state.patch({ rate: media.playbackRate });
1050
+ this.state.patch({
1051
+ paused: media.paused,
1052
+ ended: media.ended,
1053
+ started: media.started
1054
+ });
434
1055
  this.state.patch({ label: this.getLabel(this.state.current) });
435
1056
  return this.state.current;
436
1057
  }
437
- cycle(media) {
1058
+ async toggle(media) {
438
1059
  if (this.#props.disabled) return;
439
- const { playbackRates, playbackRate } = media;
440
- if (playbackRates.length === 0) return;
441
- const idx = playbackRates.indexOf(playbackRate);
442
- const next = idx === -1 ? playbackRates.find((r) => r > playbackRate) ?? playbackRates[0] : playbackRates[(idx + 1) % playbackRates.length];
443
- media.setPlaybackRate(next);
1060
+ if (media.paused || media.ended) return media.play();
1061
+ media.pause();
444
1062
  }
445
1063
  };
446
1064
 
447
1065
  //#endregion
448
- //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-data-attrs.js
449
- 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
+ };
450
1072
 
451
1073
  //#endregion
452
1074
  //#region ../core/dist/dev/core/ui/popover/popover-core.js
@@ -506,6 +1128,7 @@ var PopoverCore = class PopoverCore {
506
1128
  const PopoverCSSVars = {
507
1129
  sideOffset: "--media-popover-side-offset",
508
1130
  alignOffset: "--media-popover-align-offset",
1131
+ boundaryOffset: "--media-popover-boundary-offset",
509
1132
  anchorWidth: "--media-popover-anchor-width",
510
1133
  anchorHeight: "--media-popover-anchor-height",
511
1134
  availableWidth: "--media-popover-available-width",
@@ -518,84 +1141,19 @@ const PopoverDataAttrs = {
518
1141
  open: "data-open",
519
1142
  side: "data-side",
520
1143
  align: "data-align",
521
- transitionStarting: "data-starting-style",
522
- transitionEnding: "data-ending-style"
523
- };
524
-
525
- //#endregion
526
- //#region ../core/dist/dev/core/ui/seek-button/seek-button-core.js
527
- var SeekButtonCore = class SeekButtonCore {
528
- static defaultProps = {
529
- seconds: 30,
530
- label: "",
531
- disabled: false
532
- };
533
- state = createState({
534
- seeking: false,
535
- direction: "forward",
536
- label: ""
537
- });
538
- #props = { ...SeekButtonCore.defaultProps };
539
- #media = null;
540
- constructor(props) {
541
- if (props) this.setProps(props);
542
- }
543
- setProps(props) {
544
- this.#props = defaults(props, SeekButtonCore.defaultProps);
545
- }
546
- getLabel(state) {
547
- const { label } = this.#props;
548
- if (isFunction(label)) {
549
- const customLabel = label(state);
550
- if (customLabel) return customLabel;
551
- } else if (label) return label;
552
- const abs = Math.abs(this.#props.seconds);
553
- return state.direction === "backward" ? `Seek backward ${abs} seconds` : `Seek forward ${abs} seconds`;
554
- }
555
- getAttrs(state) {
556
- return {
557
- "aria-label": this.getLabel(state),
558
- "aria-disabled": this.#props.disabled ? "true" : void 0
559
- };
560
- }
561
- setMedia(media) {
562
- this.#media = media;
563
- }
564
- getState() {
565
- const media = this.#media;
566
- const direction = this.#props.seconds < 0 ? "backward" : "forward";
567
- this.state.patch({
568
- seeking: media.seeking,
569
- direction
570
- });
571
- this.state.patch({ label: this.getLabel(this.state.current) });
572
- return this.state.current;
573
- }
574
- async seek(media) {
575
- if (this.#props.disabled) return;
576
- await media.seek(media.currentTime + this.#props.seconds);
577
- }
578
- };
579
-
580
- //#endregion
581
- //#region ../core/dist/dev/core/ui/seek-button/seek-button-data-attrs.js
582
- const SeekButtonDataAttrs = {
583
- seeking: "data-seeking",
584
- direction: "data-direction"
1144
+ ...TransitionDataAttrs
585
1145
  };
586
1146
 
587
1147
  //#endregion
588
- //#region ../utils/dist/number/number.js
589
- /** Clamp a value between min and max (inclusive). */
590
- function clamp(value, min, max) {
591
- return Math.max(min, Math.min(max, value));
592
- }
593
- /** Snap a value to the nearest step, offset from min. */
594
- function roundToStep(value, step, min) {
595
- const nearest = Math.round((value - min) / step) * step + min;
596
- const dot = `${step}`.indexOf(".");
597
- return dot === -1 ? nearest : Number(nearest.toFixed(`${step}`.length - dot - 1));
598
- }
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}]`;
599
1157
 
600
1158
  //#endregion
601
1159
  //#region ../core/dist/dev/core/ui/slider/slider-core.js
@@ -876,106 +1434,6 @@ function mapCuesToThumbnails(cues, baseURL) {
876
1434
  return images;
877
1435
  }
878
1436
 
879
- //#endregion
880
- //#region ../utils/dist/time/format.js
881
- const UNIT_LABELS = [
882
- {
883
- singular: "hour",
884
- plural: "hours"
885
- },
886
- {
887
- singular: "minute",
888
- plural: "minutes"
889
- },
890
- {
891
- singular: "second",
892
- plural: "seconds"
893
- }
894
- ];
895
- function isValidTime(value) {
896
- return isNumber(value) && Number.isFinite(value);
897
- }
898
- function toTimeUnitPhrase(value, unitIndex) {
899
- return `${value} ${value === 1 ? UNIT_LABELS[unitIndex]?.singular : UNIT_LABELS[unitIndex]?.plural}`;
900
- }
901
- /**
902
- * Format seconds to digital display string.
903
- *
904
- * @param seconds - Time in seconds (can be negative)
905
- * @param guide - Guide time (typically duration) to determine display format
906
- * @returns Formatted string like "1:30" or "1:05:30"
907
- *
908
- * @example
909
- * formatTime(90) // "1:30"
910
- * formatTime(3661) // "1:01:01"
911
- * formatTime(35, 3600) // "0:00:35" (guided by 1-hour duration)
912
- * formatTime(35, 600) // "00:35" (guided by 10-minute duration)
913
- */
914
- function formatTime(seconds, guide) {
915
- if (!isValidTime(seconds)) return "0:00";
916
- const negative = seconds < 0;
917
- const positiveSeconds = Math.abs(seconds);
918
- const h = Math.floor(positiveSeconds / 3600);
919
- const m = Math.floor(positiveSeconds / 60 % 60);
920
- const s = Math.floor(positiveSeconds % 60);
921
- const guideAbs = guide ? Math.abs(guide) : 0;
922
- const gh = Math.floor(guideAbs / 3600);
923
- const gm = Math.floor(guideAbs / 60 % 60);
924
- const showHours = h > 0 || gh > 0;
925
- const padMinutes = showHours || gm >= 10;
926
- const hoursStr = showHours ? `${h}:` : "";
927
- const minutesStr = `${padMinutes && m < 10 ? "0" : ""}${m}:`;
928
- const secondsStr = s < 10 ? `0${s}` : `${s}`;
929
- return `${negative ? "-" : ""}${hoursStr}${minutesStr}${secondsStr}`;
930
- }
931
- /**
932
- * Format seconds to human-readable phrase for screen readers.
933
- *
934
- * @param seconds - Time in seconds (negative indicates remaining)
935
- * @returns Human-readable phrase like "1 minute, 30 seconds"
936
- *
937
- * @example
938
- * formatTimeAsPhrase(90) // "1 minute, 30 seconds"
939
- * formatTimeAsPhrase(3661) // "1 hour, 1 minute, 1 second"
940
- * formatTimeAsPhrase(-270) // "4 minutes, 30 seconds remaining"
941
- */
942
- function formatTimeAsPhrase(seconds) {
943
- if (!isValidTime(seconds)) return "";
944
- const negative = seconds < 0;
945
- const positiveSeconds = Math.abs(seconds);
946
- const h = Math.floor(positiveSeconds / 3600);
947
- const m = Math.floor(positiveSeconds / 60 % 60);
948
- const s = Math.floor(positiveSeconds % 60);
949
- if (positiveSeconds === 0) return `${toTimeUnitPhrase(0, 2)}${negative ? " remaining" : ""}`;
950
- return `${[
951
- h,
952
- m,
953
- s
954
- ].map((value, index) => value > 0 ? toTimeUnitPhrase(value, index) : null).filter(Boolean).join(", ")}${negative ? " remaining" : ""}`;
955
- }
956
- /**
957
- * Convert seconds to ISO 8601 duration for datetime attribute.
958
- *
959
- * @param seconds - Time in seconds
960
- * @returns ISO 8601 duration string like "PT1M30S"
961
- *
962
- * @example
963
- * secondsToIsoDuration(90) // "PT1M30S"
964
- * secondsToIsoDuration(3661) // "PT1H1M1S"
965
- */
966
- function secondsToIsoDuration(seconds) {
967
- if (!isValidTime(seconds)) return "PT0S";
968
- const positiveSeconds = Math.abs(seconds);
969
- const h = Math.floor(positiveSeconds / 3600);
970
- const m = Math.floor(positiveSeconds / 60 % 60);
971
- const s = Math.floor(positiveSeconds % 60);
972
- let duration = "PT";
973
- if (h > 0) duration += `${h}H`;
974
- if (m > 0) duration += `${m}M`;
975
- if (s > 0 || duration === "PT") duration += `${s}S`;
976
- return duration;
977
- }
978
-
979
1437
  //#endregion
980
1438
  //#region ../core/dist/dev/core/ui/time/time-core.js
981
1439
  const DEFAULT_LABELS = {
@@ -1170,6 +1628,7 @@ var TooltipCore = class TooltipCore {
1170
1628
  const TooltipCSSVars = {
1171
1629
  sideOffset: "--media-tooltip-side-offset",
1172
1630
  alignOffset: "--media-tooltip-align-offset",
1631
+ boundaryOffset: "--media-tooltip-boundary-offset",
1173
1632
  anchorWidth: "--media-tooltip-anchor-width",
1174
1633
  anchorHeight: "--media-tooltip-anchor-height",
1175
1634
  availableWidth: "--media-tooltip-available-width",
@@ -1182,8 +1641,7 @@ const TooltipDataAttrs = {
1182
1641
  open: "data-open",
1183
1642
  side: "data-side",
1184
1643
  align: "data-align",
1185
- transitionStarting: "data-starting-style",
1186
- transitionEnding: "data-ending-style"
1644
+ ...TransitionDataAttrs
1187
1645
  };
1188
1646
 
1189
1647
  //#endregion
@@ -1284,26 +1742,59 @@ const VolumeSliderDataAttrs = {
1284
1742
  availability: "data-availability"
1285
1743
  };
1286
1744
 
1745
+ //#endregion
1746
+ //#region ../core/dist/dev/dom/store/features/stream-type.js
1747
+ const streamTypeFeature = definePlayerFeature({
1748
+ name: "streamType",
1749
+ state: () => ({ streamType: MediaStreamTypes.UNKNOWN }),
1750
+ attach({ target, signal, set }) {
1751
+ const { media } = target;
1752
+ if (isMediaStreamTypeCapable(media)) {
1753
+ const sync = () => set({ streamType: media.streamType });
1754
+ sync();
1755
+ listen(media, "streamtypechange", sync, { signal });
1756
+ return;
1757
+ }
1758
+ if (!isMediaSeekCapable(media)) return;
1759
+ const detect = () => {
1760
+ const { duration } = media;
1761
+ if (duration === Number.POSITIVE_INFINITY) return MediaStreamTypes.LIVE;
1762
+ if (Number.isFinite(duration) && duration > 0) return MediaStreamTypes.ON_DEMAND;
1763
+ return MediaStreamTypes.UNKNOWN;
1764
+ };
1765
+ const sync = () => set({ streamType: detect() });
1766
+ sync();
1767
+ listen(media, "durationchange", sync, { signal });
1768
+ listen(media, "loadedmetadata", sync, { signal });
1769
+ listen(media, "emptied", sync, { signal });
1770
+ if (isMediaBufferCapable(media)) listen(media, "progress", sync, { signal });
1771
+ }
1772
+ });
1773
+
1287
1774
  //#endregion
1288
1775
  //#region ../core/dist/dev/dom/store/selectors.js
1289
1776
  /** Select the buffer state (buffered ranges, percent buffered). */
1290
1777
  const selectBuffer = createSelector(bufferFeature);
1291
- /** Select the cast state (cast connection state, availability). */
1292
- const selectCast = createSelector(castFeature);
1293
1778
  /** Select the controls state (controls visible, user-active). */
1294
1779
  const selectControls = createSelector(controlsFeature);
1295
1780
  /** Select the error state (error, dismissed, dismissError). */
1296
1781
  const selectError = createSelector(errorFeature);
1297
1782
  /** Select the fullscreen state (fullscreen active, availability). */
1298
1783
  const selectFullscreen = createSelector(fullscreenFeature);
1784
+ /** Select the live state (`liveEdgeStart`, `targetLiveWindow`). */
1785
+ const selectLive = createSelector(liveFeature);
1299
1786
  /** Select the PiP state (picture-in-picture active, availability). */
1300
1787
  const selectPiP = createSelector(pipFeature);
1301
1788
  /** Select the playback state (paused, ended, play, pause, toggle). */
1302
1789
  const selectPlayback = createSelector(playbackFeature);
1303
1790
  /** Select the playback rate state (playbackRate, playbackRates, setPlaybackRate). */
1304
1791
  const selectPlaybackRate = createSelector(playbackRateFeature);
1792
+ /** Select the remote playback state (remote playback connection state, availability). */
1793
+ const selectRemotePlayback = createSelector(remotePlaybackFeature);
1305
1794
  /** Select the source state (src, type). */
1306
1795
  const selectSource = createSelector(sourceFeature);
1796
+ /** Select the stream type state (`'on-demand' | 'live' | 'unknown'`). */
1797
+ const selectStreamType = createSelector(streamTypeFeature);
1307
1798
  /** Select the text track state (chapters cues, thumbnail cues). */
1308
1799
  const selectTextTrack = createSelector(textTrackFeature);
1309
1800
  /** Select the time state (currentTime, duration, seek). */
@@ -1356,10 +1847,15 @@ var HotkeyCoordinator = class {
1356
1847
  #docDisconnect = null;
1357
1848
  /** Action name → bound keys. Controls query this to set `aria-keyshortcuts`. */
1358
1849
  #ariaRegistry = /* @__PURE__ */ new Map();
1850
+ #subscribers = /* @__PURE__ */ new Set();
1359
1851
  #destroyed = false;
1360
1852
  constructor(target) {
1361
1853
  this.#target = target;
1362
1854
  }
1855
+ subscribe(callback) {
1856
+ this.#subscribers.add(callback);
1857
+ return () => this.#subscribers.delete(callback);
1858
+ }
1363
1859
  add(options) {
1364
1860
  const parsed = parseHotkeyPattern(options.keys);
1365
1861
  const binding = {
@@ -1429,6 +1925,7 @@ var HotkeyCoordinator = class {
1429
1925
  #handleEvent = (event) => {
1430
1926
  if (event.key === "Unidentified") return;
1431
1927
  if (isInteractiveActivation(event)) return;
1928
+ if (event.defaultPrevented) return;
1432
1929
  const editable = isEditableTarget(event);
1433
1930
  for (const binding of this.#bindings) {
1434
1931
  const { options, parsed } = binding;
@@ -1438,6 +1935,19 @@ var HotkeyCoordinator = class {
1438
1935
  for (const p of parsed) {
1439
1936
  if (!matchesHotkeyEvent(p, event)) continue;
1440
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
+ }
1441
1951
  event.preventDefault();
1442
1952
  options.onActivate(event, p.originalKey);
1443
1953
  return;
@@ -1530,7 +2040,8 @@ const coordinators = /* @__PURE__ */ new WeakMap();
1530
2040
  function findHotkeyCoordinator(target) {
1531
2041
  return coordinators.get(target);
1532
2042
  }
1533
- function getCoordinator(target) {
2043
+ /** Look up or create the hotkey coordinator for a target element. */
2044
+ function getHotkeyCoordinator(target) {
1534
2045
  let coordinator = coordinators.get(target);
1535
2046
  if (!coordinator) {
1536
2047
  coordinator = new HotkeyCoordinator(target);
@@ -1555,7 +2066,7 @@ function getCoordinator(target) {
1555
2066
  * @returns A cleanup function that removes the binding.
1556
2067
  */
1557
2068
  function createHotkey(target, options) {
1558
- return getCoordinator(target).add(options);
2069
+ return getHotkeyCoordinator(target).add(options);
1559
2070
  }
1560
2071
 
1561
2072
  //#endregion
@@ -1591,6 +2102,7 @@ function createDismissLayer(options) {
1591
2102
  }
1592
2103
  function handleKeydown(event) {
1593
2104
  if (event.key !== "Escape") return;
2105
+ if (event.defaultPrevented) return;
1594
2106
  if (!state.current.active) return;
1595
2107
  if (!(options.closeOnEscape?.() ?? true)) return;
1596
2108
  options.onEscapeDismiss(event);
@@ -1731,6 +2243,50 @@ function createButton(options) {
1731
2243
  };
1732
2244
  }
1733
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
+
1734
2290
  //#endregion
1735
2291
  //#region ../core/dist/dev/dom/ui/popover/popover.js
1736
2292
  function createPopover(options) {
@@ -1754,6 +2310,9 @@ function createPopover(options) {
1754
2310
  }
1755
2311
  });
1756
2312
  const state = layer.input;
2313
+ const groupMember = { close(reason) {
2314
+ applyClose(reason);
2315
+ } };
1757
2316
  function clearHoverTimeout() {
1758
2317
  if (hoverTimeout !== null) {
1759
2318
  clearTimeout(hoverTimeout);
@@ -1789,6 +2348,7 @@ function createPopover(options) {
1789
2348
  function applyOpen(reason, event) {
1790
2349
  const opening = layer.open();
1791
2350
  if (!opening) return;
2351
+ options.group?.()?.open(groupMember);
1792
2352
  onOpenChange(true, event ? {
1793
2353
  reason,
1794
2354
  event
@@ -1801,6 +2361,7 @@ function createPopover(options) {
1801
2361
  function applyClose(reason, event) {
1802
2362
  const closing = layer.close(popupEl);
1803
2363
  if (!closing) return;
2364
+ options.group?.()?.close(groupMember);
1804
2365
  onOpenChange(false, event ? {
1805
2366
  reason,
1806
2367
  event
@@ -1824,6 +2385,7 @@ function createPopover(options) {
1824
2385
  applyClose("outside-click", event);
1825
2386
  }
1826
2387
  layer.signal.addEventListener("abort", () => {
2388
+ options.group?.()?.close(groupMember);
1827
2389
  clearHoverTimeout();
1828
2390
  capturedPointers.clear();
1829
2391
  triggerEl = null;
@@ -1913,14 +2475,621 @@ function createPopover(options) {
1913
2475
  };
1914
2476
  }
1915
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
+
1916
3071
  //#endregion
1917
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
+ };
1918
3078
  const OPPOSITE_SIDE = {
1919
3079
  top: "bottom",
1920
3080
  bottom: "top",
1921
3081
  left: "right",
1922
3082
  right: "left"
1923
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
+ }
1924
3093
  /**
1925
3094
  * Get positioning styles for the popup element.
1926
3095
  *
@@ -1937,17 +3106,20 @@ const OPPOSITE_SIDE = {
1937
3106
  * `applyStyles()` from `@videojs/utils/dom`.
1938
3107
  */
1939
3108
  function getAnchorPositionStyle(anchorName, opts, triggerRect, popupRect, boundaryRect, offsets, cssVars = PopoverCSSVars) {
1940
- if (supportsAnchorPositioning()) return getAnchorPositionCSS(anchorName, opts, cssVars);
1941
- if (triggerRect && popupRect) return {
1942
- ...getManualPositionStyle(triggerRect, popupRect, opts, offsets ?? {
1943
- sideOffset: 0,
1944
- alignOffset: 0
1945
- }),
1946
- ...boundaryRect ? getPositioningCSSVars(triggerRect, boundaryRect, opts.side, cssVars) : {},
1947
- position: "fixed",
1948
- inset: "auto",
1949
- margin: "0"
3109
+ if (supportsAnchorPositioning()) return {
3110
+ ...getAnchorPositionCSS(anchorName, opts, cssVars),
3111
+ ...triggerRect && boundaryRect ? getPositioningCSSVars(triggerRect, boundaryRect, opts, offsets, cssVars) : {}
1950
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
+ }
1951
3123
  return {};
1952
3124
  }
1953
3125
  /** Generate style to set on the trigger for CSS Anchor Positioning. */
@@ -1995,16 +3167,24 @@ function getAnchorPositionCSS(anchorName, opts, cssVars = PopoverCSSVars) {
1995
3167
  * Accepts a `cssVars` map so the same logic works for both popover
1996
3168
  * (`--media-popover-*`) and tooltip (`--media-tooltip-*`) namespaces.
1997
3169
  */
1998
- function getPositioningCSSVars(triggerRect, boundaryRect, side, cssVars = PopoverCSSVars) {
3170
+ function getPositioningCSSVars(triggerRect, boundaryRect, opts, offsets = ZERO_OFFSETS, cssVars = PopoverCSSVars) {
1999
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;
2000
3178
  vars[cssVars.anchorWidth] = `${triggerRect.width}px`;
2001
3179
  vars[cssVars.anchorHeight] = `${triggerRect.height}px`;
2002
3180
  if (side === "top" || side === "bottom") {
2003
- vars[cssVars.availableHeight] = side === "top" ? `${triggerRect.top - boundaryRect.top}px` : `${boundaryRect.bottom - triggerRect.bottom}px`;
2004
- 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));
2005
3184
  } else {
2006
- vars[cssVars.availableWidth] = side === "left" ? `${triggerRect.left - boundaryRect.left}px` : `${boundaryRect.right - triggerRect.right}px`;
2007
- 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));
2008
3188
  }
2009
3189
  return vars;
2010
3190
  }
@@ -2042,14 +3222,15 @@ function getManualPositionStyle(triggerRect, popupRect, opts, offsets = {
2042
3222
  };
2043
3223
  }
2044
3224
  /**
2045
- * Read side-offset and align-offset CSS custom properties from the
3225
+ * Read positioning offset CSS custom properties from the
2046
3226
  * popup element's computed style, returning numeric pixel values.
2047
3227
  */
2048
3228
  function resolveOffsets(el, cssVars = PopoverCSSVars) {
2049
3229
  const computed = getComputedStyle(el);
2050
3230
  return {
2051
3231
  sideOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.sideOffset)),
2052
- alignOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.alignOffset))
3232
+ alignOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.alignOffset)),
3233
+ boundaryOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.boundaryOffset))
2053
3234
  };
2054
3235
  }
2055
3236
  /**
@@ -2063,17 +3244,7 @@ function getPopupPositionRect(el) {
2063
3244
  const rect = el.getBoundingClientRect();
2064
3245
  const width = el.offsetWidth || rect.width;
2065
3246
  const height = el.offsetHeight || rect.height;
2066
- const adjustedRect = {
2067
- ...rect,
2068
- width,
2069
- height,
2070
- right: rect.left + width,
2071
- bottom: rect.top + height
2072
- };
2073
- return {
2074
- ...adjustedRect,
2075
- toJSON: () => adjustedRect
2076
- };
3247
+ return createDOMRect(rect.left, rect.top, width, height);
2077
3248
  }
2078
3249
 
2079
3250
  //#endregion
@@ -2445,7 +3616,8 @@ const REASON_MAP = {
2445
3616
  hover: "hover",
2446
3617
  focus: "focus",
2447
3618
  escape: "escape",
2448
- blur: "blur"
3619
+ blur: "blur",
3620
+ "imperative-action": "imperative-action"
2449
3621
  };
2450
3622
  function createTooltip(options) {
2451
3623
  const popoverOpts = {
@@ -2513,7 +3685,7 @@ function createTooltip(options) {
2513
3685
  return popover.triggerElement;
2514
3686
  },
2515
3687
  open: () => popover.open("hover"),
2516
- close: () => popover.close("hover")
3688
+ close: (reason = "hover") => popover.close(reason)
2517
3689
  };
2518
3690
  }
2519
3691
 
@@ -2642,6 +3814,15 @@ function applyElementProps(element, props, options) {
2642
3814
  else element.setAttribute(key, String(value));
2643
3815
  }
2644
3816
 
3817
+ //#endregion
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
+
2645
3826
  //#endregion
2646
3827
  //#region ../core/dist/dev/dom/utils/log.js
2647
3828
  const warned = /* @__PURE__ */ new Set();
@@ -2713,6 +3894,8 @@ var MediaButtonElement = class extends MediaElement {
2713
3894
  this.disabled = false;
2714
3895
  this.label = "";
2715
3896
  this.hotkeyAction = void 0;
3897
+ this.#disconnect = null;
3898
+ this.#hotkeyRegistry = null;
2716
3899
  }
2717
3900
  static {
2718
3901
  this.properties = {
@@ -2723,8 +3906,8 @@ var MediaButtonElement = class extends MediaElement {
2723
3906
  get $state() {
2724
3907
  return this.core.state;
2725
3908
  }
2726
- #disconnect = null;
2727
- #hotkeyRegistry = null;
3909
+ #disconnect;
3910
+ #hotkeyRegistry;
2728
3911
  connectedCallback() {
2729
3912
  super.connectedCallback();
2730
3913
  if (this.destroyed) return;
@@ -2800,23 +3983,6 @@ var PlayButtonElement = class extends MediaButtonElement {
2800
3983
  }
2801
3984
  };
2802
3985
 
2803
- //#endregion
2804
- //#region src/ui/playback-rate-button/playback-rate-button-element.ts
2805
- var PlaybackRateButtonElement = class extends MediaButtonElement {
2806
- constructor(..._args) {
2807
- super(..._args);
2808
- this.core = new PlaybackRateButtonCore();
2809
- this.stateAttrMap = PlaybackRateButtonDataAttrs;
2810
- this.mediaState = new PlayerController(this, playerContext, selectPlaybackRate);
2811
- }
2812
- static {
2813
- this.tagName = "media-playback-rate-button";
2814
- }
2815
- activate(state) {
2816
- this.core.cycle(state);
2817
- }
2818
- };
2819
-
2820
3986
  //#endregion
2821
3987
  //#region src/ui/position-controller.ts
2822
3988
  /**
@@ -2824,7 +3990,8 @@ var PlaybackRateButtonElement = class extends MediaButtonElement {
2824
3990
  * popup elements (tooltips, popovers). Tracks scroll, resize, and
2825
3991
  * ResizeObserver events to keep the popup aligned with its trigger.
2826
3992
  *
2827
- * 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.
2828
3995
  */
2829
3996
  var PositionController = class {
2830
3997
  #host;
@@ -2832,6 +3999,7 @@ var PositionController = class {
2832
3999
  #frame = 0;
2833
4000
  #resizeObserver = null;
2834
4001
  #trigger = null;
4002
+ #boundary = null;
2835
4003
  constructor(host) {
2836
4004
  this.#host = host;
2837
4005
  host.addController(this);
@@ -2842,15 +4010,16 @@ var PositionController = class {
2842
4010
  return this.#host.getRootNode().querySelector(`[commandfor="${this.#host.id}"]`);
2843
4011
  }
2844
4012
  /** Start or update position tracking for the given trigger. */
2845
- sync(trigger) {
2846
- if (supportsAnchorPositioning()) return;
4013
+ sync(trigger, boundary = null) {
2847
4014
  if (!trigger) return;
2848
- if (this.#abort && this.#trigger === trigger) return;
4015
+ if (this.#abort && this.#trigger === trigger && this.#boundary === boundary) return;
2849
4016
  this.cleanup();
2850
4017
  this.#abort = new AbortController();
2851
4018
  this.#trigger = trigger;
4019
+ this.#boundary = boundary;
2852
4020
  const { signal } = this.#abort;
2853
- const reposition = () => {
4021
+ const reposition = (event) => {
4022
+ if (event && isEventWithinElement(event, this.#host)) return;
2854
4023
  cancelAnimationFrame(this.#frame);
2855
4024
  this.#frame = requestAnimationFrame(() => {
2856
4025
  if (signal.aborted) return;
@@ -2869,6 +4038,7 @@ var PositionController = class {
2869
4038
  });
2870
4039
  this.#resizeObserver.observe(trigger);
2871
4040
  this.#resizeObserver.observe(this.#host);
4041
+ if (boundary) this.#resizeObserver.observe(boundary);
2872
4042
  }
2873
4043
  reposition();
2874
4044
  }
@@ -2877,6 +4047,7 @@ var PositionController = class {
2877
4047
  this.#abort?.abort();
2878
4048
  this.#abort = null;
2879
4049
  this.#trigger = null;
4050
+ this.#boundary = null;
2880
4051
  cancelAnimationFrame(this.#frame);
2881
4052
  this.#frame = 0;
2882
4053
  this.#resizeObserver?.disconnect();
@@ -2890,6 +4061,440 @@ var PositionController = class {
2890
4061
  }
2891
4062
  };
2892
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
+
2893
4498
  //#endregion
2894
4499
  //#region src/ui/popover/popover-element.ts
2895
4500
  var PopoverElement = class extends MediaElement {
@@ -2905,6 +4510,18 @@ var PopoverElement = class extends MediaElement {
2905
4510
  this.openOnHover = PopoverCore.defaultProps.openOnHover;
2906
4511
  this.delay = PopoverCore.defaultProps.delay;
2907
4512
  this.closeDelay = PopoverCore.defaultProps.closeDelay;
4513
+ this.boundary = "container";
4514
+ this.#core = new PopoverCore();
4515
+ this.#containerCtx = new ContextConsumer(this, {
4516
+ context: containerContext,
4517
+ subscribe: true
4518
+ });
4519
+ this.#position = new PositionController(this);
4520
+ this.#popover = null;
4521
+ this.#snapshot = null;
4522
+ this.#disconnect = null;
4523
+ this.#triggerAbort = null;
4524
+ this.#currentTrigger = null;
2908
4525
  }
2909
4526
  static {
2910
4527
  this.tagName = "media-popover";
@@ -2935,19 +4552,22 @@ var PopoverElement = class extends MediaElement {
2935
4552
  closeDelay: {
2936
4553
  type: Number,
2937
4554
  attribute: "close-delay"
2938
- }
4555
+ },
4556
+ boundary: { type: String }
2939
4557
  };
2940
4558
  }
2941
- #core = new PopoverCore();
2942
- #position = new PositionController(this);
2943
- #popover = null;
2944
- #snapshot = null;
2945
- #disconnect = null;
2946
- #triggerAbort = null;
2947
- #currentTrigger = null;
4559
+ #core;
4560
+ #containerCtx;
4561
+ #position;
4562
+ #popover;
4563
+ #snapshot;
4564
+ #disconnect;
4565
+ #triggerAbort;
4566
+ #currentTrigger;
2948
4567
  connectedCallback() {
2949
4568
  super.connectedCallback();
2950
4569
  if (this.destroyed) return;
4570
+ this.setAttribute(POPUP_HOST_ATTR, "");
2951
4571
  this.#disconnect = new AbortController();
2952
4572
  this.#popover = createPopover({
2953
4573
  transition: createTransition(),
@@ -2962,7 +4582,8 @@ var PopoverElement = class extends MediaElement {
2962
4582
  closeOnOutsideClick: () => this.closeOnOutsideClick,
2963
4583
  openOnHover: () => this.openOnHover,
2964
4584
  delay: () => this.delay,
2965
- closeDelay: () => this.closeDelay
4585
+ closeDelay: () => this.closeDelay,
4586
+ group: () => this.#containerCtx.value?.popupGroup
2966
4587
  });
2967
4588
  this.#popover.setPopupElement(this);
2968
4589
  applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });
@@ -2983,6 +4604,9 @@ var PopoverElement = class extends MediaElement {
2983
4604
  this.#popover?.destroy();
2984
4605
  super.destroyCallback();
2985
4606
  }
4607
+ close(reason = "imperative-action") {
4608
+ this.#popover?.close(reason);
4609
+ }
2986
4610
  willUpdate(changed) {
2987
4611
  super.willUpdate(changed);
2988
4612
  this.#core.setProps(this);
@@ -3016,15 +4640,16 @@ var PopoverElement = class extends MediaElement {
3016
4640
  side: state.side,
3017
4641
  align: state.align
3018
4642
  };
3019
- 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));
3020
4648
  else {
3021
- const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3022
4649
  const selfRect = getPopupPositionRect(this);
3023
- const boundaryRect = document.documentElement.getBoundingClientRect();
3024
- const offsets = resolveOffsets(this);
3025
4650
  applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));
3026
4651
  }
3027
- this.#position.sync(this.#currentTrigger);
4652
+ this.#position.sync(this.#currentTrigger, boundaryElement);
3028
4653
  }
3029
4654
  #syncTrigger(triggerEl) {
3030
4655
  if (triggerEl === this.#currentTrigger) return;
@@ -3050,29 +4675,11 @@ var PopoverElement = class extends MediaElement {
3050
4675
  this.#triggerAbort = null;
3051
4676
  this.#currentTrigger = null;
3052
4677
  }
3053
- };
3054
-
3055
- //#endregion
3056
- //#region src/ui/seek-button/seek-button-element.ts
3057
- var SeekButtonElement = class extends MediaButtonElement {
3058
- constructor(..._args) {
3059
- super(..._args);
3060
- this.seconds = SeekButtonCore.defaultProps.seconds;
3061
- this.core = new SeekButtonCore();
3062
- this.stateAttrMap = SeekButtonDataAttrs;
3063
- this.mediaState = new PlayerController(this, playerContext, selectTime);
3064
- }
3065
- static {
3066
- this.tagName = "media-seek-button";
3067
- }
3068
- static {
3069
- this.properties = {
3070
- ...MediaButtonElement.properties,
3071
- seconds: { type: Number }
3072
- };
3073
- }
3074
- activate(state) {
3075
- this.core.seek(state);
4678
+ #getBoundaryElement() {
4679
+ return resolvePositioningBoundary(this.boundary, {
4680
+ container: this.#containerCtx.value?.container ?? null,
4681
+ root: this.getRootNode()
4682
+ });
3076
4683
  }
3077
4684
  };
3078
4685
 
@@ -3097,6 +4704,19 @@ var TooltipElement = class extends MediaElement {
3097
4704
  this.closeDelay = TooltipCore.defaultProps.closeDelay;
3098
4705
  this.disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;
3099
4706
  this.disabled = TooltipCore.defaultProps.disabled;
4707
+ this.boundary = "container";
4708
+ this.#core = new TooltipCore();
4709
+ this.#groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
4710
+ this.#containerCtx = new ContextConsumer(this, {
4711
+ context: containerContext,
4712
+ subscribe: true
4713
+ });
4714
+ this.#position = new PositionController(this);
4715
+ this.#tooltip = null;
4716
+ this.#snapshot = null;
4717
+ this.#disconnect = null;
4718
+ this.#triggerAbort = null;
4719
+ this.#currentTrigger = null;
3100
4720
  }
3101
4721
  static {
3102
4722
  this.tagName = "media-tooltip";
@@ -3119,20 +4739,23 @@ var TooltipElement = class extends MediaElement {
3119
4739
  type: Boolean,
3120
4740
  attribute: "disable-hoverable-popup"
3121
4741
  },
3122
- disabled: { type: Boolean }
4742
+ disabled: { type: Boolean },
4743
+ boundary: { type: String }
3123
4744
  };
3124
4745
  }
3125
- #core = new TooltipCore();
3126
- #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
3127
- #position = new PositionController(this);
3128
- #tooltip = null;
3129
- #snapshot = null;
3130
- #disconnect = null;
3131
- #triggerAbort = null;
3132
- #currentTrigger = null;
4746
+ #core;
4747
+ #groupConsumer;
4748
+ #containerCtx;
4749
+ #position;
4750
+ #tooltip;
4751
+ #snapshot;
4752
+ #disconnect;
4753
+ #triggerAbort;
4754
+ #currentTrigger;
3133
4755
  connectedCallback() {
3134
4756
  super.connectedCallback();
3135
4757
  if (this.destroyed) return;
4758
+ this.setAttribute(POPUP_HOST_ATTR, "");
3136
4759
  this.#disconnect = new AbortController();
3137
4760
  this.#tooltip = createTooltip({
3138
4761
  transition: createTransition(),
@@ -3166,6 +4789,9 @@ var TooltipElement = class extends MediaElement {
3166
4789
  this.#disconnect?.abort();
3167
4790
  this.#disconnect = null;
3168
4791
  }
4792
+ close(reason = "imperative-action") {
4793
+ this.#tooltip?.close(reason);
4794
+ }
3169
4795
  willUpdate(changed) {
3170
4796
  super.willUpdate(changed);
3171
4797
  this.#core.setProps(this);
@@ -3196,15 +4822,16 @@ var TooltipElement = class extends MediaElement {
3196
4822
  side: state.side,
3197
4823
  align: state.align
3198
4824
  };
3199
- 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));
3200
4830
  else {
3201
- const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3202
4831
  const selfRect = getPopupPositionRect(this);
3203
- const boundaryRect = document.documentElement.getBoundingClientRect();
3204
- const offsets = resolveOffsets(this, TooltipCSSVars);
3205
4832
  applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars));
3206
4833
  }
3207
- this.#position.sync(this.#currentTrigger);
4834
+ this.#position.sync(this.#currentTrigger, boundaryElement);
3208
4835
  }
3209
4836
  #syncTrigger(triggerEl) {
3210
4837
  if (triggerEl === this.#currentTrigger) return;
@@ -3230,6 +4857,12 @@ var TooltipElement = class extends MediaElement {
3230
4857
  this.#triggerAbort = null;
3231
4858
  this.#currentTrigger = null;
3232
4859
  }
4860
+ #getBoundaryElement() {
4861
+ return resolvePositioningBoundary(this.boundary, {
4862
+ container: this.#containerCtx.value?.container ?? null,
4863
+ root: this.getRootNode()
4864
+ });
4865
+ }
3233
4866
  };
3234
4867
 
3235
4868
  //#endregion
@@ -3240,6 +4873,11 @@ var TooltipGroupElement = class extends MediaElement {
3240
4873
  this.delay = TooltipGroupCore.defaultProps.delay;
3241
4874
  this.closeDelay = TooltipGroupCore.defaultProps.closeDelay;
3242
4875
  this.timeout = TooltipGroupCore.defaultProps.timeout;
4876
+ this.#core = new TooltipGroupCore();
4877
+ this.#provider = new ContextProvider(this, {
4878
+ context: tooltipGroupContext,
4879
+ initialValue: this.#core
4880
+ });
3243
4881
  }
3244
4882
  static {
3245
4883
  this.tagName = "media-tooltip-group";
@@ -3254,11 +4892,8 @@ var TooltipGroupElement = class extends MediaElement {
3254
4892
  timeout: { type: Number }
3255
4893
  };
3256
4894
  }
3257
- #core = new TooltipGroupCore();
3258
- #provider = new ContextProvider(this, {
3259
- context: tooltipGroupContext,
3260
- initialValue: this.#core
3261
- });
4895
+ #core;
4896
+ #provider;
3262
4897
  update(_changed) {
3263
4898
  super.update(_changed);
3264
4899
  this.#core.setProps(this);
@@ -3277,6 +4912,11 @@ var AlertDialogCloseElement = class extends MediaElement {
3277
4912
  constructor(..._args) {
3278
4913
  super(..._args);
3279
4914
  this.disabled = false;
4915
+ this.#ctx = new ContextConsumer(this, {
4916
+ context: alertDialogContext,
4917
+ subscribe: true
4918
+ });
4919
+ this.#disconnect = null;
3280
4920
  }
3281
4921
  static {
3282
4922
  this.tagName = "media-alert-dialog-close";
@@ -3284,11 +4924,8 @@ var AlertDialogCloseElement = class extends MediaElement {
3284
4924
  static {
3285
4925
  this.properties = { disabled: { type: Boolean } };
3286
4926
  }
3287
- #ctx = new ContextConsumer(this, {
3288
- context: alertDialogContext,
3289
- subscribe: true
3290
- });
3291
- #disconnect = null;
4927
+ #ctx;
4928
+ #disconnect;
3292
4929
  connectedCallback() {
3293
4930
  super.connectedCallback();
3294
4931
  this.#disconnect = new AbortController();
@@ -3354,140 +4991,618 @@ var AlertDialogDescriptionElement = class extends ContextPartElement {
3354
4991
  };
3355
4992
 
3356
4993
  //#endregion
3357
- //#region src/ui/alert-dialog/alert-dialog-title-element.ts
3358
- var AlertDialogTitleElement = class extends ContextPartElement {
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);
5384
+ }
5385
+ };
5386
+
5387
+ //#endregion
5388
+ //#region src/ui/menu/menu-label-element.ts
5389
+ var MenuLabelElement = class extends ContextPartElement {
3359
5390
  constructor(..._args) {
3360
5391
  super(..._args);
3361
5392
  this.consumer = new ContextConsumer(this, {
3362
- context: alertDialogContext,
5393
+ context: menuContext,
3363
5394
  subscribe: true
3364
5395
  });
3365
5396
  }
3366
5397
  static {
3367
- this.tagName = "media-alert-dialog-title";
3368
- }
3369
- update(changed) {
3370
- super.update(changed);
3371
- const titleId = this.consumer.value?.state.titleId;
3372
- if (titleId) this.id = titleId;
5398
+ this.tagName = "media-menu-label";
3373
5399
  }
3374
5400
  };
3375
5401
 
3376
5402
  //#endregion
3377
- //#region src/ui/controls/context.ts
3378
- const CONTROLS_CONTEXT_KEY = Symbol("@videojs/controls");
3379
- const controlsContext = createContext(CONTROLS_CONTEXT_KEY);
3380
-
3381
- //#endregion
3382
- //#region src/ui/controls/controls-element.ts
3383
- var ControlsElement = class extends MediaElement {
5403
+ //#region src/ui/menu/menu-separator-element.ts
5404
+ var MenuSeparatorElement = class extends MediaElement {
3384
5405
  static {
3385
- this.tagName = "media-controls";
3386
- }
3387
- #core = new ControlsCore();
3388
- #mediaState = new PlayerController(this, playerContext, selectControls);
3389
- #provider = new ContextProvider(this, { context: controlsContext });
3390
- connectedCallback() {
3391
- super.connectedCallback();
3392
- if (!this.#mediaState.value && this.#mediaState.displayName) logMissingFeature(this.localName, this.#mediaState.displayName);
5406
+ this.tagName = "media-menu-separator";
3393
5407
  }
5408
+ #ctx = new ContextConsumer(this, {
5409
+ context: menuContext,
5410
+ subscribe: true
5411
+ });
3394
5412
  update(_changed) {
3395
5413
  super.update(_changed);
3396
- const media = this.#mediaState.value;
3397
- if (!media) return;
3398
- this.#core.setMedia(media);
3399
- const state = this.#core.getState();
3400
- applyStateDataAttrs(this, state, ControlsDataAttrs);
3401
- this.#provider.setValue({
3402
- state,
3403
- stateAttrMap: ControlsDataAttrs
3404
- });
5414
+ applyElementProps(this, { role: "separator" });
5415
+ const ctx = this.#ctx.value;
5416
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3405
5417
  }
3406
5418
  };
3407
5419
 
3408
5420
  //#endregion
3409
- //#region src/ui/controls/controls-group-element.ts
3410
- var ControlsGroupElement = class extends ContextPartElement {
5421
+ //#region src/ui/menu/menu-view-element.ts
5422
+ var MenuViewElement = class extends MediaElement {
5423
+ static {
5424
+ this.tagName = "media-menu-view";
5425
+ }
5426
+ update(changed) {
5427
+ super.update(changed);
5428
+ applyElementProps(this, getMenuRootViewAttrs());
5429
+ }
5430
+ };
5431
+
5432
+ //#endregion
5433
+ //#region src/ui/input-indicators/input-indicator-element.ts
5434
+ var InputIndicatorElement = class extends MediaElement {
3411
5435
  constructor(..._args) {
3412
5436
  super(..._args);
3413
- this.consumer = new ContextConsumer(this, {
3414
- context: controlsContext,
5437
+ this.player = new PlayerController(this, playerContext);
5438
+ this.container = new ContextConsumer(this, {
5439
+ context: containerContext,
5440
+ callback: () => this.#reconnect(),
3415
5441
  subscribe: true
3416
5442
  });
3417
- }
3418
- static {
3419
- this.tagName = "media-controls-group";
5443
+ this.#disconnect = null;
5444
+ this.#inputActionUnsubscribe = null;
5445
+ this.#visibilityUnsubscribe = null;
5446
+ this.#visibilityHandle = null;
5447
+ this.#lastGeneration = 0;
5448
+ this.#snapshot = null;
5449
+ }
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;
3420
5461
  }
3421
5462
  connectedCallback() {
3422
5463
  super.connectedCallback();
3423
- 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
+ });
3424
5531
  }
3425
5532
  };
3426
5533
 
3427
5534
  //#endregion
3428
- //#region src/ui/error-dialog/error-dialog-element.ts
3429
- const FALLBACK_MESSAGE = "An error occurred. Please try again.";
3430
- let idCounter = 0;
3431
- 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 {
3432
5566
  static {
3433
- this.tagName = "media-error-dialog";
5567
+ this.tagName = "media-seek-indicator";
3434
5568
  }
3435
- #core = new ErrorDialogCore();
3436
- #provider = new ContextProvider(this, { context: alertDialogContext });
3437
- #titleId = `vjs-error-dialog-title-${idCounter++}`;
3438
- #descriptionId = `vjs-error-dialog-desc-${idCounter++}`;
3439
- #errorState = new PlayerController(this, playerContext, selectError);
3440
- #dialog = null;
3441
- #snapshot = null;
3442
- #lastErrorMessage = null;
3443
- constructor() {
3444
- super();
3445
- this.#core.setTitleId(this.#titleId);
3446
- 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;
3447
5584
  }
3448
- connectedCallback() {
3449
- super.connectedCallback();
3450
- if (this.destroyed) return;
3451
- this.#dialog = createAlertDialog({
3452
- transition: createTransition(),
3453
- onOpenChange: (nextOpen) => {
3454
- if (!nextOpen) this.#errorState.value?.dismissError();
3455
- }
3456
- });
3457
- this.#dialog.setElement(this);
3458
- if (this.#snapshot) this.#snapshot.track(this.#dialog.input);
3459
- else this.#snapshot = new SnapshotController(this, this.#dialog.input);
5585
+ get transition() {
5586
+ return this.#transition;
3460
5587
  }
3461
- disconnectedCallback() {
3462
- super.disconnectedCallback();
3463
- this.#dialog?.destroy();
3464
- this.#dialog = null;
5588
+ get liveIndicator() {
5589
+ return this.#liveIndicator;
3465
5590
  }
3466
- willUpdate(_changed) {
3467
- super.willUpdate(_changed);
3468
- if (!this.#dialog) return;
3469
- const errorState = this.#errorState.value;
3470
- const hasError = Boolean(errorState?.error);
3471
- const { active: isOpen } = this.#dialog.input.current;
3472
- if (errorState?.error) this.#lastErrorMessage = errorState.error.message?.trim() || null;
3473
- const desc = this.querySelector("media-alert-dialog-description");
3474
- if (desc) desc.textContent = this.#lastErrorMessage ?? FALLBACK_MESSAGE;
3475
- if (hasError && !isOpen) this.#dialog.open();
3476
- else if (!hasError && isOpen) this.#dialog.close();
5591
+ syncCoreProps() {
5592
+ this.#core.setProps({ closeDelay: this.closeDelay });
3477
5593
  }
3478
- update(_changed) {
3479
- super.update(_changed);
3480
- if (!this.#dialog) return;
3481
- const input = this.#dialog.input.current;
3482
- this.#core.setInput(input);
3483
- const state = this.#core.getState();
3484
- applyElementProps(this, this.#core.getAttrs(state));
3485
- applyStateDataAttrs(this, state, AlertDialogDataAttrs);
3486
- this.#provider.setValue({
3487
- state,
3488
- stateAttrMap: AlertDialogDataAttrs,
3489
- close: () => this.#dialog?.close()
3490
- });
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";
3491
5606
  }
3492
5607
  };
3493
5608
 
@@ -3532,6 +5647,12 @@ var SliderPreviewElement = class extends MediaElement {
3532
5647
  constructor(..._args) {
3533
5648
  super(..._args);
3534
5649
  this.overflow = "clamp";
5650
+ this.#ctx = new ContextConsumer(this, {
5651
+ context: sliderContext,
5652
+ subscribe: true
5653
+ });
5654
+ this.#resizeObserver = null;
5655
+ this.#width = 0;
3535
5656
  }
3536
5657
  static {
3537
5658
  this.tagName = "media-slider-preview";
@@ -3539,12 +5660,9 @@ var SliderPreviewElement = class extends MediaElement {
3539
5660
  static {
3540
5661
  this.properties = { overflow: { type: String } };
3541
5662
  }
3542
- #ctx = new ContextConsumer(this, {
3543
- context: sliderContext,
3544
- subscribe: true
3545
- });
3546
- #resizeObserver = null;
3547
- #width = 0;
5663
+ #ctx;
5664
+ #resizeObserver;
5665
+ #width;
3548
5666
  connectedCallback() {
3549
5667
  super.connectedCallback();
3550
5668
  this.#resizeObserver = new ResizeObserver(([entry]) => {
@@ -3633,16 +5751,21 @@ var ThumbnailElement = class extends MediaElement {
3633
5751
  }
3634
5752
  };
3635
5753
  }
3636
- #core = new ThumbnailCore();
3637
- #img = document.createElement("img");
3638
- #textTracks = new PlayerController(this, playerContext, selectTextTrack);
3639
- #thumbnails = [];
5754
+ #core;
5755
+ #img;
5756
+ #textTracks;
5757
+ #thumbnails;
3640
5758
  #externalThumbnails;
3641
5759
  #lastTextTrack;
3642
- #api = null;
5760
+ #api;
3643
5761
  constructor() {
3644
5762
  super();
3645
5763
  this.time = 0;
5764
+ this.#core = new ThumbnailCore();
5765
+ this.#img = document.createElement("img");
5766
+ this.#textTracks = new PlayerController(this, playerContext, selectTextTrack);
5767
+ this.#thumbnails = [];
5768
+ this.#api = null;
3646
5769
  const shadow = this.attachShadow({ mode: "open" });
3647
5770
  const style = document.createElement("style");
3648
5771
  style.textContent = SHADOW_CSS;
@@ -3774,6 +5897,10 @@ var SliderValueElement = class extends MediaElement {
3774
5897
  constructor(..._args) {
3775
5898
  super(..._args);
3776
5899
  this.type = "current";
5900
+ this.#ctx = new ContextConsumer(this, {
5901
+ context: sliderContext,
5902
+ subscribe: true
5903
+ });
3777
5904
  }
3778
5905
  static {
3779
5906
  this.tagName = "media-slider-value";
@@ -3781,10 +5908,7 @@ var SliderValueElement = class extends MediaElement {
3781
5908
  static {
3782
5909
  this.properties = { type: { type: String } };
3783
5910
  }
3784
- #ctx = new ContextConsumer(this, {
3785
- context: sliderContext,
3786
- subscribe: true
3787
- });
5911
+ #ctx;
3788
5912
  connectedCallback() {
3789
5913
  super.connectedCallback();
3790
5914
  this.setAttribute("aria-live", "off");
@@ -3799,6 +5923,123 @@ var SliderValueElement = class extends MediaElement {
3799
5923
  }
3800
5924
  };
3801
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
+
3802
6043
  //#endregion
3803
6044
  //#region src/ui/time/time-element.ts
3804
6045
  var TimeElement = class extends MediaElement {
@@ -3807,6 +6048,10 @@ var TimeElement = class extends MediaElement {
3807
6048
  this.type = TimeCore.defaultProps.type;
3808
6049
  this.negativeSign = TimeCore.defaultProps.negativeSign;
3809
6050
  this.label = TimeCore.defaultProps.label;
6051
+ this.#core = new TimeCore();
6052
+ this.#state = new PlayerController(this, playerContext, selectTime);
6053
+ this.#signSpan = document.createElement("span");
6054
+ this.#textNode = document.createTextNode("");
3810
6055
  }
3811
6056
  static {
3812
6057
  this.tagName = "media-time";
@@ -3821,10 +6066,10 @@ var TimeElement = class extends MediaElement {
3821
6066
  label: { type: String }
3822
6067
  };
3823
6068
  }
3824
- #core = new TimeCore();
3825
- #state = new PlayerController(this, playerContext, selectTime);
3826
- #signSpan = document.createElement("span");
3827
- #textNode = document.createTextNode("");
6069
+ #core;
6070
+ #state;
6071
+ #signSpan;
6072
+ #textNode;
3828
6073
  connectedCallback() {
3829
6074
  super.connectedCallback();
3830
6075
  if (!this.#signSpan.parentNode) {
@@ -3886,6 +6131,12 @@ var TimeSliderElement = class extends MediaElement {
3886
6131
  this.orientation = TimeSliderCore.defaultProps.orientation;
3887
6132
  this.disabled = TimeSliderCore.defaultProps.disabled;
3888
6133
  this.thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;
6134
+ this.#core = new TimeSliderCore();
6135
+ this.#provider = new ContextProvider(this, { context: sliderContext });
6136
+ this.#timeState = new PlayerController(this, playerContext, selectTime);
6137
+ this.#bufferState = new PlayerController(this, playerContext, selectBuffer);
6138
+ this.#slider = null;
6139
+ this.#disconnect = null;
3889
6140
  }
3890
6141
  static {
3891
6142
  this.tagName = "media-time-slider";
@@ -3910,12 +6161,12 @@ var TimeSliderElement = class extends MediaElement {
3910
6161
  }
3911
6162
  };
3912
6163
  }
3913
- #core = new TimeSliderCore();
3914
- #provider = new ContextProvider(this, { context: sliderContext });
3915
- #timeState = new PlayerController(this, playerContext, selectTime);
3916
- #bufferState = new PlayerController(this, playerContext, selectBuffer);
3917
- #slider = null;
3918
- #disconnect = null;
6164
+ #core;
6165
+ #provider;
6166
+ #timeState;
6167
+ #bufferState;
6168
+ #slider;
6169
+ #disconnect;
3919
6170
  connectedCallback() {
3920
6171
  super.connectedCallback();
3921
6172
  if (this.destroyed) return;
@@ -3996,6 +6247,62 @@ var TimeSliderElement = class extends MediaElement {
3996
6247
  }
3997
6248
  };
3998
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
+
3999
6306
  //#endregion
4000
6307
  //#region src/ui/volume-slider/volume-slider-element.ts
4001
6308
  var VolumeSliderElement = class extends MediaElement {
@@ -4008,6 +6315,11 @@ var VolumeSliderElement = class extends MediaElement {
4008
6315
  this.orientation = VolumeSliderCore.defaultProps.orientation;
4009
6316
  this.disabled = VolumeSliderCore.defaultProps.disabled;
4010
6317
  this.thumbAlignment = VolumeSliderCore.defaultProps.thumbAlignment;
6318
+ this.#core = new VolumeSliderCore();
6319
+ this.#provider = new ContextProvider(this, { context: sliderContext });
6320
+ this.#volumeState = new PlayerController(this, playerContext, selectVolume);
6321
+ this.#slider = null;
6322
+ this.#disconnect = null;
4011
6323
  }
4012
6324
  static {
4013
6325
  this.tagName = "media-volume-slider";
@@ -4032,11 +6344,11 @@ var VolumeSliderElement = class extends MediaElement {
4032
6344
  }
4033
6345
  };
4034
6346
  }
4035
- #core = new VolumeSliderCore();
4036
- #provider = new ContextProvider(this, { context: sliderContext });
4037
- #volumeState = new PlayerController(this, playerContext, selectVolume);
4038
- #slider = null;
4039
- #disconnect = null;
6347
+ #core;
6348
+ #provider;
6349
+ #volumeState;
6350
+ #slider;
6351
+ #disconnect;
4040
6352
  connectedCallback() {
4041
6353
  super.connectedCallback();
4042
6354
  if (this.destroyed) return;
@@ -4118,6 +6430,19 @@ var VolumeSliderElement = class extends MediaElement {
4118
6430
 
4119
6431
  //#endregion
4120
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
+ }
4121
6446
  function defineControls() {
4122
6447
  safeDefine(ControlsElement);
4123
6448
  safeDefine(ControlsGroupElement);
@@ -4128,6 +6453,16 @@ function defineErrorDialog() {
4128
6453
  safeDefine(AlertDialogDescriptionElement);
4129
6454
  safeDefine(AlertDialogTitleElement);
4130
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
+ }
4131
6466
  /** Shared slider sub-elements used by all slider types. */
4132
6467
  function defineSliderParts() {
4133
6468
  safeDefine(SliderFillElement);
@@ -4153,5 +6488,5 @@ function defineVolumeSlider() {
4153
6488
  }
4154
6489
 
4155
6490
  //#endregion
4156
- export { selectTime as C, selectTextTrack as S, defaults as T, selectCast as _, defineVolumeSlider as a, selectPlayback 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, selectFullscreen as v, selectVolume as w, selectPlaybackRate as x, selectPiP as y };
4157
- //# sourceMappingURL=compounds-DD3MYkSc.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