@videojs/html 10.0.0-beta.2 → 10.0.0-beta.22

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 (984) hide show
  1. package/cdn/abort-C9UiBdVU.js +2 -0
  2. package/cdn/abort-C9UiBdVU.js.map +1 -0
  3. package/cdn/abort-DsTff8mS.js +22 -0
  4. package/cdn/abort-DsTff8mS.js.map +1 -0
  5. package/cdn/audio-minimal-ui.dev.d.ts +1 -0
  6. package/cdn/audio-minimal-ui.dev.js +4 -0
  7. package/cdn/audio-minimal-ui.js +1 -0
  8. package/cdn/audio-minimal.dev.d.ts +1 -0
  9. package/cdn/audio-minimal.dev.js +93 -5331
  10. package/cdn/audio-minimal.dev.js.map +1 -1
  11. package/cdn/audio-minimal.js +1 -24
  12. package/cdn/audio-minimal.js.map +1 -1
  13. package/cdn/audio-ui.dev.d.ts +1 -0
  14. package/cdn/audio-ui.dev.js +4 -0
  15. package/cdn/audio-ui.js +1 -0
  16. package/cdn/audio.dev.d.ts +1 -0
  17. package/cdn/audio.dev.js +107 -5325
  18. package/cdn/audio.dev.js.map +1 -1
  19. package/cdn/audio.js +1 -24
  20. package/cdn/audio.js.map +1 -1
  21. package/cdn/background.dev.d.ts +1 -0
  22. package/cdn/background.dev.js +105 -2017
  23. package/cdn/background.dev.js.map +1 -1
  24. package/cdn/background.js +1 -18
  25. package/cdn/background.js.map +1 -1
  26. package/cdn/compounds-CCgS3IGo.js +8 -0
  27. package/cdn/compounds-CCgS3IGo.js.map +1 -0
  28. package/cdn/compounds-DD3MYkSc.js +4157 -0
  29. package/cdn/compounds-DD3MYkSc.js.map +1 -0
  30. package/cdn/context-0rI_P6jf.js +107 -0
  31. package/cdn/context-0rI_P6jf.js.map +1 -0
  32. package/cdn/context-CEFisYD0.js +14 -0
  33. package/cdn/context-CEFisYD0.js.map +1 -0
  34. package/cdn/create-player-B-PGzhq2.js +7 -0
  35. package/cdn/create-player-B-PGzhq2.js.map +1 -0
  36. package/cdn/create-player-BKLw7l1a.js +2246 -0
  37. package/cdn/create-player-BKLw7l1a.js.map +1 -0
  38. package/cdn/default-Djy9PEXm.js +2 -0
  39. package/cdn/default-Djy9PEXm.js.map +1 -0
  40. package/cdn/default-YzaLyoYg.js +30 -0
  41. package/cdn/default-YzaLyoYg.js.map +1 -0
  42. package/cdn/hls-CcSAx_3I.js +28632 -0
  43. package/cdn/hls-CcSAx_3I.js.map +1 -0
  44. package/cdn/hls-Dl2v35sW.js +41 -0
  45. package/cdn/hls-Dl2v35sW.js.map +1 -0
  46. package/cdn/hotkey-element-BONs_FyJ.js +369 -0
  47. package/cdn/hotkey-element-BONs_FyJ.js.map +1 -0
  48. package/cdn/hotkey-element-DWWkfH3A.js +2 -0
  49. package/cdn/hotkey-element-DWWkfH3A.js.map +1 -0
  50. package/cdn/listen-CJT7C4kM.js +9 -0
  51. package/cdn/listen-CJT7C4kM.js.map +1 -0
  52. package/cdn/listen-DFX-0NbX.js +2 -0
  53. package/cdn/listen-DFX-0NbX.js.map +1 -0
  54. package/cdn/media/dash-video.dev.d.ts +1 -0
  55. package/cdn/media/dash-video.dev.js +39153 -0
  56. package/cdn/media/dash-video.dev.js.map +1 -0
  57. package/cdn/media/dash-video.js +21 -0
  58. package/cdn/media/dash-video.js.map +1 -0
  59. package/cdn/media/hls-video.dev.d.ts +1 -0
  60. package/cdn/media/hls-video.dev.js +12 -28712
  61. package/cdn/media/hls-video.dev.js.map +1 -1
  62. package/cdn/media/hls-video.js +1 -82
  63. package/cdn/media/hls-video.js.map +1 -1
  64. package/cdn/media/mux-audio.dev.d.ts +1 -0
  65. package/cdn/media/mux-audio.dev.js +29 -0
  66. package/cdn/media/mux-audio.dev.js.map +1 -0
  67. package/cdn/media/mux-audio.js +2 -0
  68. package/cdn/media/mux-audio.js.map +1 -0
  69. package/cdn/media/mux-video.dev.d.ts +1 -0
  70. package/cdn/media/mux-video.dev.js +29 -0
  71. package/cdn/media/mux-video.dev.js.map +1 -0
  72. package/cdn/media/mux-video.js +2 -0
  73. package/cdn/media/mux-video.js.map +1 -0
  74. package/cdn/media/native-hls-video.dev.d.ts +1 -0
  75. package/cdn/media/native-hls-video.dev.js +19 -0
  76. package/cdn/media/native-hls-video.dev.js.map +1 -0
  77. package/cdn/media/native-hls-video.js +2 -0
  78. package/cdn/media/native-hls-video.js.map +1 -0
  79. package/cdn/media/simple-hls-video.dev.d.ts +1 -0
  80. package/cdn/media/simple-hls-video.dev.js +2887 -2605
  81. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  82. package/cdn/media/simple-hls-video.js +58 -43
  83. package/cdn/media/simple-hls-video.js.map +1 -1
  84. package/cdn/media-attach-mixin-C2wz0Qbd.js +2 -0
  85. package/cdn/media-attach-mixin-C2wz0Qbd.js.map +1 -0
  86. package/cdn/media-attach-mixin-CYoNe7Sh.js +67 -0
  87. package/cdn/media-attach-mixin-CYoNe7Sh.js.map +1 -0
  88. package/cdn/minimal-AX_y2YBU.js +30 -0
  89. package/cdn/minimal-AX_y2YBU.js.map +1 -0
  90. package/cdn/minimal-Bc74CFqg.js +2 -0
  91. package/cdn/minimal-Bc74CFqg.js.map +1 -0
  92. package/cdn/minimal-ui-CE1sVxKB.js +22 -0
  93. package/cdn/minimal-ui-CE1sVxKB.js.map +1 -0
  94. package/cdn/minimal-ui-hC8-_9_F.js +2 -0
  95. package/cdn/minimal-ui-hC8-_9_F.js.map +1 -0
  96. package/cdn/minimal-ui-lnw8AjaS.js +2 -0
  97. package/cdn/minimal-ui-lnw8AjaS.js.map +1 -0
  98. package/cdn/minimal-ui-yKur3jyD.js +29 -0
  99. package/cdn/minimal-ui-yKur3jyD.js.map +1 -0
  100. package/cdn/mux-BgWl50KW.js +27 -0
  101. package/cdn/mux-BgWl50KW.js.map +1 -0
  102. package/cdn/mux-BhHIeG3e.js +3783 -0
  103. package/cdn/mux-BhHIeG3e.js.map +1 -0
  104. package/cdn/native-hls-lhip4tV9.js +123 -0
  105. package/cdn/native-hls-lhip4tV9.js.map +1 -0
  106. package/cdn/native-hls-odPBXxK7.js +2 -0
  107. package/cdn/native-hls-odPBXxK7.js.map +1 -0
  108. package/cdn/pick-CERGq1No.js +2 -0
  109. package/cdn/pick-CERGq1No.js.map +1 -0
  110. package/cdn/pick-D-wCJ3iA.js +23 -0
  111. package/cdn/pick-D-wCJ3iA.js.map +1 -0
  112. package/cdn/player-B7jISTmQ.js +2 -0
  113. package/cdn/player-B7jISTmQ.js.map +1 -0
  114. package/cdn/player-BVGWmIbQ.js +16 -0
  115. package/cdn/player-BVGWmIbQ.js.map +1 -0
  116. package/cdn/player-ChdQN3H5.js +2 -0
  117. package/cdn/player-ChdQN3H5.js.map +1 -0
  118. package/cdn/player-DX5Ka0vt.js +463 -0
  119. package/cdn/player-DX5Ka0vt.js.map +1 -0
  120. package/cdn/shadow-styles-BYZ6q3Q4.js +3 -0
  121. package/cdn/shadow-styles-BYZ6q3Q4.js.map +1 -0
  122. package/cdn/shadow-styles-DKXFMmyD.js +41 -0
  123. package/cdn/shadow-styles-DKXFMmyD.js.map +1 -0
  124. package/cdn/shallow-equal-Daj3-_LC.js +15 -0
  125. package/cdn/shallow-equal-Daj3-_LC.js.map +1 -0
  126. package/cdn/shallow-equal-xh6Wj-hj.js +2 -0
  127. package/cdn/shallow-equal-xh6Wj-hj.js.map +1 -0
  128. package/cdn/skin-element-D3iVinGP.js +55 -0
  129. package/cdn/skin-element-D3iVinGP.js.map +1 -0
  130. package/cdn/skin-element-DM82PPxz.js +2 -0
  131. package/cdn/skin-element-DM82PPxz.js.map +1 -0
  132. package/cdn/ui-BGvi0TNr.js +2 -0
  133. package/cdn/ui-BGvi0TNr.js.map +1 -0
  134. package/cdn/ui-BN57BxYZ.js +2 -0
  135. package/cdn/ui-BN57BxYZ.js.map +1 -0
  136. package/cdn/ui-CKR6dVbQ.js +25 -0
  137. package/cdn/ui-CKR6dVbQ.js.map +1 -0
  138. package/cdn/ui-CZ4yl3t3.js +32 -0
  139. package/cdn/ui-CZ4yl3t3.js.map +1 -0
  140. package/cdn/video-host-BtD61mpF.js +440 -0
  141. package/cdn/video-host-BtD61mpF.js.map +1 -0
  142. package/cdn/video-host-LeB1FKfO.js +47 -0
  143. package/cdn/video-host-LeB1FKfO.js.map +1 -0
  144. package/cdn/video-minimal-ui.dev.d.ts +1 -0
  145. package/cdn/video-minimal-ui.dev.js +4 -0
  146. package/cdn/video-minimal-ui.js +1 -0
  147. package/cdn/video-minimal.dev.d.ts +1 -0
  148. package/cdn/video-minimal.dev.js +120 -5669
  149. package/cdn/video-minimal.dev.js.map +1 -1
  150. package/cdn/video-minimal.js +1 -24
  151. package/cdn/video-minimal.js.map +1 -1
  152. package/cdn/video-ui.dev.d.ts +1 -0
  153. package/cdn/video-ui.dev.js +4 -0
  154. package/cdn/video-ui.js +1 -0
  155. package/cdn/video.dev.d.ts +1 -0
  156. package/cdn/video.dev.js +142 -5739
  157. package/cdn/video.dev.js.map +1 -1
  158. package/cdn/video.js +1 -24
  159. package/cdn/video.js.map +1 -1
  160. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +2 -2
  161. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  162. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +2 -2
  163. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  164. package/dist/default/_virtual/inline-css_src/define/background/skin.js +6 -0
  165. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  166. package/dist/default/_virtual/inline-css_src/define/base.js +6 -0
  167. package/dist/default/_virtual/inline-css_src/define/base.js.map +1 -0
  168. package/dist/default/_virtual/inline-css_src/define/shared.js +6 -0
  169. package/dist/default/_virtual/inline-css_src/define/shared.js.map +1 -0
  170. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +2 -2
  171. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  172. package/dist/default/_virtual/inline-css_src/define/video/skin.js +2 -2
  173. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  174. package/dist/default/define/audio/minimal-skin.css +324 -182
  175. package/dist/default/define/audio/minimal-skin.js +10 -19
  176. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  177. package/dist/default/define/audio/minimal-skin.tailwind.js +11 -19
  178. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  179. package/dist/default/define/audio/minimal-ui.js +28 -0
  180. package/dist/default/define/audio/minimal-ui.js.map +1 -0
  181. package/dist/default/define/audio/player.js +1 -2
  182. package/dist/default/define/audio/player.js.map +1 -1
  183. package/dist/default/define/audio/skin.css +307 -174
  184. package/dist/default/define/audio/skin.js +10 -19
  185. package/dist/default/define/audio/skin.js.map +1 -1
  186. package/dist/default/define/audio/skin.tailwind.js +13 -21
  187. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  188. package/dist/default/define/audio/ui.js +32 -0
  189. package/dist/default/define/audio/ui.js.map +1 -0
  190. package/dist/default/define/background/player.js +1 -2
  191. package/dist/default/define/background/player.js.map +1 -1
  192. package/dist/default/define/background/skin.css +1 -1
  193. package/dist/default/define/background/skin.js +6 -4
  194. package/dist/default/define/background/skin.js.map +1 -1
  195. package/dist/default/define/background/video.js +1 -2
  196. package/dist/default/define/base.css +27 -0
  197. package/dist/default/define/media/background-video.js +1 -2
  198. package/dist/default/define/media/background-video.js.map +1 -1
  199. package/dist/default/define/media/container.js +1 -2
  200. package/dist/default/define/media/container.js.map +1 -1
  201. package/dist/default/define/media/dash-video.js +13 -0
  202. package/dist/default/define/media/dash-video.js.map +1 -0
  203. package/dist/default/define/media/hls-video.js +1 -2
  204. package/dist/default/define/media/hls-video.js.map +1 -1
  205. package/dist/default/define/media/mux-audio.js +13 -0
  206. package/dist/default/define/media/mux-audio.js.map +1 -0
  207. package/dist/default/define/media/mux-video.js +13 -0
  208. package/dist/default/define/media/mux-video.js.map +1 -0
  209. package/dist/default/define/media/native-hls-video.js +13 -0
  210. package/dist/default/define/media/native-hls-video.js.map +1 -0
  211. package/dist/default/define/media/simple-hls-video.js +3 -3
  212. package/dist/default/define/media/simple-hls-video.js.map +1 -1
  213. package/dist/default/define/safe-define.js +4 -2
  214. package/dist/default/define/safe-define.js.map +1 -1
  215. package/dist/default/define/shared.css +14 -0
  216. package/dist/default/define/skin-element.js +33 -0
  217. package/dist/default/define/skin-element.js.map +1 -0
  218. package/dist/default/define/ui/alert-dialog-close.js +1 -2
  219. package/dist/default/define/ui/alert-dialog-close.js.map +1 -1
  220. package/dist/default/define/ui/alert-dialog-description.js +1 -2
  221. package/dist/default/define/ui/alert-dialog-description.js.map +1 -1
  222. package/dist/default/define/ui/alert-dialog-title.js +1 -2
  223. package/dist/default/define/ui/alert-dialog-title.js.map +1 -1
  224. package/dist/default/define/ui/alert-dialog.js +1 -2
  225. package/dist/default/define/ui/alert-dialog.js.map +1 -1
  226. package/dist/default/define/ui/buffering-indicator.js +1 -2
  227. package/dist/default/define/ui/buffering-indicator.js.map +1 -1
  228. package/dist/default/define/ui/captions-button.js +3 -3
  229. package/dist/default/define/ui/captions-button.js.map +1 -1
  230. package/dist/default/define/ui/cast-button.js +7 -0
  231. package/dist/default/define/ui/cast-button.js.map +1 -0
  232. package/dist/default/define/ui/compounds.js +62 -0
  233. package/dist/default/define/ui/compounds.js.map +1 -0
  234. package/dist/default/define/ui/controls-group.js +1 -2
  235. package/dist/default/define/ui/controls-group.js.map +1 -1
  236. package/dist/default/define/ui/controls.js +3 -7
  237. package/dist/default/define/ui/controls.js.map +1 -1
  238. package/dist/default/define/ui/error-dialog.js +6 -0
  239. package/dist/default/define/ui/error-dialog.js.map +1 -0
  240. package/dist/default/define/ui/fullscreen-button.js +1 -2
  241. package/dist/default/define/ui/fullscreen-button.js.map +1 -1
  242. package/dist/default/define/ui/hotkey.js +7 -0
  243. package/dist/default/define/ui/hotkey.js.map +1 -0
  244. package/dist/default/define/ui/mute-button.js +1 -2
  245. package/dist/default/define/ui/mute-button.js.map +1 -1
  246. package/dist/default/define/ui/pip-button.js +1 -2
  247. package/dist/default/define/ui/pip-button.js.map +1 -1
  248. package/dist/default/define/ui/play-button.js +1 -2
  249. package/dist/default/define/ui/play-button.js.map +1 -1
  250. package/dist/default/define/ui/playback-rate-button.js +1 -2
  251. package/dist/default/define/ui/playback-rate-button.js.map +1 -1
  252. package/dist/default/define/ui/popover.js +1 -2
  253. package/dist/default/define/ui/popover.js.map +1 -1
  254. package/dist/default/define/ui/poster.js +1 -2
  255. package/dist/default/define/ui/poster.js.map +1 -1
  256. package/dist/default/define/ui/seek-button.js +1 -2
  257. package/dist/default/define/ui/seek-button.js.map +1 -1
  258. package/dist/default/define/ui/slider-buffer.js +1 -2
  259. package/dist/default/define/ui/slider-buffer.js.map +1 -1
  260. package/dist/default/define/ui/slider-fill.js +1 -2
  261. package/dist/default/define/ui/slider-fill.js.map +1 -1
  262. package/dist/default/define/ui/slider-thumb.js +1 -2
  263. package/dist/default/define/ui/slider-thumb.js.map +1 -1
  264. package/dist/default/define/ui/slider-thumbnail.js +1 -2
  265. package/dist/default/define/ui/slider-thumbnail.js.map +1 -1
  266. package/dist/default/define/ui/slider-track.js +1 -2
  267. package/dist/default/define/ui/slider-track.js.map +1 -1
  268. package/dist/default/define/ui/slider-value.js +1 -2
  269. package/dist/default/define/ui/slider-value.js.map +1 -1
  270. package/dist/default/define/ui/slider.js +3 -15
  271. package/dist/default/define/ui/slider.js.map +1 -1
  272. package/dist/default/define/ui/thumbnail.js +1 -2
  273. package/dist/default/define/ui/thumbnail.js.map +1 -1
  274. package/dist/default/define/ui/time-group.js +1 -2
  275. package/dist/default/define/ui/time-group.js.map +1 -1
  276. package/dist/default/define/ui/time-separator.js +1 -2
  277. package/dist/default/define/ui/time-separator.js.map +1 -1
  278. package/dist/default/define/ui/time-slider.js +3 -19
  279. package/dist/default/define/ui/time-slider.js.map +1 -1
  280. package/dist/default/define/ui/time.js +3 -9
  281. package/dist/default/define/ui/time.js.map +1 -1
  282. package/dist/default/define/ui/tooltip-group.js +1 -2
  283. package/dist/default/define/ui/tooltip-group.js.map +1 -1
  284. package/dist/default/define/ui/tooltip.js +1 -2
  285. package/dist/default/define/ui/tooltip.js.map +1 -1
  286. package/dist/default/define/ui/volume-slider.js +3 -15
  287. package/dist/default/define/ui/volume-slider.js.map +1 -1
  288. package/dist/default/define/video/minimal-skin.css +624 -328
  289. package/dist/default/define/video/minimal-skin.js +10 -23
  290. package/dist/default/define/video/minimal-skin.js.map +1 -1
  291. package/dist/default/define/video/minimal-skin.tailwind.js +13 -30
  292. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  293. package/dist/default/define/video/minimal-ui.js +41 -0
  294. package/dist/default/define/video/minimal-ui.js.map +1 -0
  295. package/dist/default/define/video/player.js +1 -2
  296. package/dist/default/define/video/player.js.map +1 -1
  297. package/dist/default/define/video/skin.css +592 -311
  298. package/dist/default/define/video/skin.js +10 -24
  299. package/dist/default/define/video/skin.js.map +1 -1
  300. package/dist/default/define/video/skin.tailwind.js +13 -28
  301. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  302. package/dist/default/define/video/ui.js +45 -0
  303. package/dist/default/define/video/ui.js.map +1 -0
  304. package/dist/default/icons/dist/render/default/index.js +5 -2
  305. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  306. package/dist/default/icons/dist/render/minimal/index.js +5 -2
  307. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  308. package/dist/default/index.js +11 -5
  309. package/dist/default/media/background-video/index.js +6 -3
  310. package/dist/default/media/background-video/index.js.map +1 -1
  311. package/dist/default/media/container-element.js +22 -4
  312. package/dist/default/media/container-element.js.map +1 -1
  313. package/dist/default/media/dash-video/index.js +9 -0
  314. package/dist/default/media/dash-video/index.js.map +1 -0
  315. package/dist/default/media/hls-video/index.js +12 -19
  316. package/dist/default/media/hls-video/index.js.map +1 -1
  317. package/dist/default/media/mux-audio/index.js +18 -0
  318. package/dist/default/media/mux-audio/index.js.map +1 -0
  319. package/dist/default/media/mux-video/index.js +18 -0
  320. package/dist/default/media/mux-video/index.js.map +1 -0
  321. package/dist/default/media/native-hls-video/index.js +9 -0
  322. package/dist/default/media/native-hls-video/index.js.map +1 -0
  323. package/dist/default/media/simple-hls-video/index.js +5 -17
  324. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  325. package/dist/default/player/context.js +7 -4
  326. package/dist/default/player/context.js.map +1 -1
  327. package/dist/default/player/create-player.js +12 -5
  328. package/dist/default/player/create-player.js.map +1 -1
  329. package/dist/default/player/player-controller.js +1 -2
  330. package/dist/default/player/player-controller.js.map +1 -1
  331. package/dist/default/presets/audio.js +1 -2
  332. package/dist/default/presets/background.js +1 -2
  333. package/dist/default/presets/video.js +1 -2
  334. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +17 -38
  335. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  336. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  337. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  338. package/dist/default/skins/dist/default/default/tailwind/components/button-group.js +7 -0
  339. package/dist/default/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  340. package/dist/default/skins/dist/default/default/tailwind/components/button.js +5 -5
  341. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  342. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +2 -3
  343. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  344. package/dist/default/skins/dist/default/default/tailwind/components/error.js +4 -5
  345. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  346. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -2
  347. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  348. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +2 -3
  349. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  350. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  351. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  352. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +5 -6
  353. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  354. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +15 -0
  355. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  356. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +12 -0
  357. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  358. package/dist/default/skins/dist/default/default/tailwind/components/root.js +2 -3
  359. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  360. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +2 -3
  361. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  362. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +2 -3
  363. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  364. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +2 -3
  365. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  366. package/dist/default/skins/dist/default/default/tailwind/components/time.js +1 -1
  367. package/dist/default/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  368. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +41 -26
  369. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  370. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +18 -33
  371. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  372. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  373. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  374. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js +1 -2
  375. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -1
  376. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +5 -5
  377. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  378. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +2 -3
  379. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  380. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +4 -5
  381. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  382. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -2
  383. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  384. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +2 -3
  385. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  386. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  387. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  388. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +5 -5
  389. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  390. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +15 -0
  391. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  392. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +13 -0
  393. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  394. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +2 -3
  395. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  396. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +2 -3
  397. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  398. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +2 -3
  399. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  400. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +5 -6
  401. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  402. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +45 -24
  403. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  404. package/dist/{dev/skins/dist/default/default/tailwind/components → default/skins/dist/default/shared/tailwind}/icon-state.js +12 -2
  405. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  406. package/dist/default/store/container-mixin.js +17 -62
  407. package/dist/default/store/container-mixin.js.map +1 -1
  408. package/dist/default/store/media-attach-mixin.js +44 -0
  409. package/dist/default/store/media-attach-mixin.js.map +1 -0
  410. package/dist/default/store/provider-mixin.js +100 -11
  411. package/dist/default/store/provider-mixin.js.map +1 -1
  412. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js +1 -2
  413. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  414. package/dist/default/ui/alert-dialog/alert-dialog-description-element.js +1 -2
  415. package/dist/default/ui/alert-dialog/alert-dialog-description-element.js.map +1 -1
  416. package/dist/default/ui/alert-dialog/alert-dialog-element.js +2 -2
  417. package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  418. package/dist/default/ui/alert-dialog/alert-dialog-title-element.js +1 -2
  419. package/dist/default/ui/alert-dialog/alert-dialog-title-element.js.map +1 -1
  420. package/dist/default/ui/alert-dialog/context.js +2 -5
  421. package/dist/default/ui/alert-dialog/context.js.map +1 -1
  422. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +2 -2
  423. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  424. package/dist/default/ui/captions-button/captions-button-element.js +2 -2
  425. package/dist/default/ui/captions-button/captions-button-element.js.map +1 -1
  426. package/dist/default/ui/cast-button/cast-button-element.js +24 -0
  427. package/dist/default/ui/cast-button/cast-button-element.js.map +1 -0
  428. package/dist/default/ui/context-part-element.js +1 -2
  429. package/dist/default/ui/context-part-element.js.map +1 -1
  430. package/dist/default/ui/controls/context.js +2 -5
  431. package/dist/default/ui/controls/context.js.map +1 -1
  432. package/dist/default/ui/controls/controls-element.js +1 -2
  433. package/dist/default/ui/controls/controls-element.js.map +1 -1
  434. package/dist/default/ui/controls/controls-group-element.js +1 -2
  435. package/dist/default/ui/controls/controls-group-element.js.map +1 -1
  436. package/dist/default/ui/error-dialog/error-dialog-element.js +77 -0
  437. package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -0
  438. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +2 -2
  439. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  440. package/dist/default/ui/gesture/gesture-element.js +84 -0
  441. package/dist/default/ui/gesture/gesture-element.js.map +1 -0
  442. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  443. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  444. package/dist/default/ui/hotkey/hotkey-element.js +81 -0
  445. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -0
  446. package/dist/default/ui/media-button-element.js +17 -3
  447. package/dist/default/ui/media-button-element.js.map +1 -1
  448. package/dist/default/ui/media-element.js +1 -2
  449. package/dist/default/ui/media-element.js.map +1 -1
  450. package/dist/default/ui/media-ui-element.js +1 -2
  451. package/dist/default/ui/media-ui-element.js.map +1 -1
  452. package/dist/default/ui/mute-button/mute-button-element.js +2 -2
  453. package/dist/default/ui/mute-button/mute-button-element.js.map +1 -1
  454. package/dist/default/ui/pip-button/pip-button-element.js +2 -2
  455. package/dist/default/ui/pip-button/pip-button-element.js.map +1 -1
  456. package/dist/default/ui/play-button/play-button-element.js +2 -2
  457. package/dist/default/ui/play-button/play-button-element.js.map +1 -1
  458. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  459. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  460. package/dist/default/ui/popover/popover-element.js +13 -11
  461. package/dist/default/ui/popover/popover-element.js.map +1 -1
  462. package/dist/default/ui/position-controller.js +76 -0
  463. package/dist/default/ui/position-controller.js.map +1 -0
  464. package/dist/default/ui/poster/poster-element.js +1 -2
  465. package/dist/default/ui/poster/poster-element.js.map +1 -1
  466. package/dist/default/ui/seek-button/seek-button-element.js +1 -2
  467. package/dist/default/ui/seek-button/seek-button-element.js.map +1 -1
  468. package/dist/default/ui/slider/context.js +2 -5
  469. package/dist/default/ui/slider/context.js.map +1 -1
  470. package/dist/default/ui/slider/slider-buffer-element.js +1 -2
  471. package/dist/default/ui/slider/slider-buffer-element.js.map +1 -1
  472. package/dist/default/ui/slider/slider-element.js +2 -3
  473. package/dist/default/ui/slider/slider-element.js.map +1 -1
  474. package/dist/default/ui/slider/slider-fill-element.js +1 -2
  475. package/dist/default/ui/slider/slider-fill-element.js.map +1 -1
  476. package/dist/default/ui/slider/slider-preview-element.js +2 -3
  477. package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
  478. package/dist/default/ui/slider/slider-thumb-element.js +1 -2
  479. package/dist/default/ui/slider/slider-thumb-element.js.map +1 -1
  480. package/dist/default/ui/slider/slider-thumbnail-element.js +1 -2
  481. package/dist/default/ui/slider/slider-thumbnail-element.js.map +1 -1
  482. package/dist/default/ui/slider/slider-track-element.js +1 -2
  483. package/dist/default/ui/slider/slider-track-element.js.map +1 -1
  484. package/dist/default/ui/slider/slider-value-element.js +1 -2
  485. package/dist/default/ui/slider/slider-value-element.js.map +1 -1
  486. package/dist/default/ui/thumbnail/thumbnail-element.js +1 -2
  487. package/dist/default/ui/thumbnail/thumbnail-element.js.map +1 -1
  488. package/dist/default/ui/time/time-element.js +13 -12
  489. package/dist/default/ui/time/time-element.js.map +1 -1
  490. package/dist/default/ui/time/time-group-element.js +1 -2
  491. package/dist/default/ui/time/time-group-element.js.map +1 -1
  492. package/dist/default/ui/time/time-separator-element.js +1 -2
  493. package/dist/default/ui/time/time-separator-element.js.map +1 -1
  494. package/dist/default/ui/time-slider/time-slider-element.js +7 -8
  495. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  496. package/dist/default/ui/tooltip/context.js +2 -5
  497. package/dist/default/ui/tooltip/context.js.map +1 -1
  498. package/dist/default/ui/tooltip/tooltip-element.js +25 -18
  499. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  500. package/dist/default/ui/tooltip/tooltip-group-element.js +5 -3
  501. package/dist/default/ui/tooltip/tooltip-group-element.js.map +1 -1
  502. package/dist/default/ui/volume-slider/volume-slider-element.js +27 -20
  503. package/dist/default/ui/volume-slider/volume-slider-element.js.map +1 -1
  504. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +2 -2
  505. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  506. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +2 -2
  507. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  508. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +6 -0
  509. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  510. package/dist/dev/_virtual/inline-css_src/define/base.js +6 -0
  511. package/dist/dev/_virtual/inline-css_src/define/base.js.map +1 -0
  512. package/dist/dev/_virtual/inline-css_src/define/shared.js +6 -0
  513. package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -0
  514. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +2 -2
  515. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  516. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +2 -2
  517. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  518. package/dist/dev/define/audio/minimal-skin.css +324 -182
  519. package/dist/dev/define/audio/minimal-skin.d.ts +6 -10
  520. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  521. package/dist/dev/define/audio/minimal-skin.js +85 -82
  522. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  523. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts +4 -10
  524. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
  525. package/dist/dev/define/audio/minimal-skin.tailwind.js +86 -84
  526. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  527. package/dist/dev/define/audio/minimal-ui.d.ts +1 -0
  528. package/dist/dev/define/audio/minimal-ui.js +28 -0
  529. package/dist/dev/define/audio/minimal-ui.js.map +1 -0
  530. package/dist/dev/define/audio/player.js +1 -2
  531. package/dist/dev/define/audio/player.js.map +1 -1
  532. package/dist/dev/define/audio/skin.css +307 -174
  533. package/dist/dev/define/audio/skin.d.ts +6 -10
  534. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  535. package/dist/dev/define/audio/skin.js +97 -74
  536. package/dist/dev/define/audio/skin.js.map +1 -1
  537. package/dist/dev/define/audio/skin.tailwind.d.ts +4 -10
  538. package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
  539. package/dist/dev/define/audio/skin.tailwind.js +84 -78
  540. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  541. package/dist/dev/define/audio/ui.d.ts +1 -0
  542. package/dist/dev/define/audio/ui.js +32 -0
  543. package/dist/dev/define/audio/ui.js.map +1 -0
  544. package/dist/dev/define/background/player.js +1 -2
  545. package/dist/dev/define/background/player.js.map +1 -1
  546. package/dist/dev/define/background/skin.css +1 -1
  547. package/dist/dev/define/background/skin.d.ts.map +1 -1
  548. package/dist/dev/define/background/skin.js +8 -4
  549. package/dist/dev/define/background/skin.js.map +1 -1
  550. package/dist/dev/define/background/video.js +1 -2
  551. package/dist/dev/define/base.css +27 -0
  552. package/dist/dev/define/media/background-video.js +1 -2
  553. package/dist/dev/define/media/background-video.js.map +1 -1
  554. package/dist/dev/define/media/container.js +1 -2
  555. package/dist/dev/define/media/container.js.map +1 -1
  556. package/dist/dev/define/media/dash-video.d.ts +14 -0
  557. package/dist/dev/define/media/dash-video.d.ts.map +1 -0
  558. package/dist/dev/define/media/dash-video.js +13 -0
  559. package/dist/dev/define/media/dash-video.js.map +1 -0
  560. package/dist/dev/define/media/hls-video.js +1 -2
  561. package/dist/dev/define/media/hls-video.js.map +1 -1
  562. package/dist/dev/define/media/mux-audio.d.ts +14 -0
  563. package/dist/dev/define/media/mux-audio.d.ts.map +1 -0
  564. package/dist/dev/define/media/mux-audio.js +13 -0
  565. package/dist/dev/define/media/mux-audio.js.map +1 -0
  566. package/dist/dev/define/media/mux-video.d.ts +14 -0
  567. package/dist/dev/define/media/mux-video.d.ts.map +1 -0
  568. package/dist/dev/define/media/mux-video.js +13 -0
  569. package/dist/dev/define/media/mux-video.js.map +1 -0
  570. package/dist/dev/define/media/native-hls-video.d.ts +14 -0
  571. package/dist/dev/define/media/native-hls-video.d.ts.map +1 -0
  572. package/dist/dev/define/media/native-hls-video.js +13 -0
  573. package/dist/dev/define/media/native-hls-video.js.map +1 -0
  574. package/dist/dev/define/media/simple-hls-video.d.ts.map +1 -1
  575. package/dist/dev/define/media/simple-hls-video.js +3 -3
  576. package/dist/dev/define/media/simple-hls-video.js.map +1 -1
  577. package/dist/dev/define/safe-define.js +4 -2
  578. package/dist/dev/define/safe-define.js.map +1 -1
  579. package/dist/dev/define/shared.css +14 -0
  580. package/dist/dev/define/skin-element.d.ts +18 -0
  581. package/dist/dev/define/skin-element.d.ts.map +1 -0
  582. package/dist/dev/define/skin-element.js +33 -0
  583. package/dist/dev/define/skin-element.js.map +1 -0
  584. package/dist/dev/define/ui/alert-dialog-close.js +1 -2
  585. package/dist/dev/define/ui/alert-dialog-close.js.map +1 -1
  586. package/dist/dev/define/ui/alert-dialog-description.js +1 -2
  587. package/dist/dev/define/ui/alert-dialog-description.js.map +1 -1
  588. package/dist/dev/define/ui/alert-dialog-title.js +1 -2
  589. package/dist/dev/define/ui/alert-dialog-title.js.map +1 -1
  590. package/dist/dev/define/ui/alert-dialog.js +1 -2
  591. package/dist/dev/define/ui/alert-dialog.js.map +1 -1
  592. package/dist/dev/define/ui/buffering-indicator.js +1 -2
  593. package/dist/dev/define/ui/buffering-indicator.js.map +1 -1
  594. package/dist/dev/define/ui/captions-button.d.ts.map +1 -1
  595. package/dist/dev/define/ui/captions-button.js +3 -3
  596. package/dist/dev/define/ui/captions-button.js.map +1 -1
  597. package/dist/dev/define/ui/cast-button.d.ts +9 -0
  598. package/dist/dev/define/ui/cast-button.d.ts.map +1 -0
  599. package/dist/dev/define/ui/cast-button.js +7 -0
  600. package/dist/dev/define/ui/cast-button.js.map +1 -0
  601. package/dist/dev/define/ui/compounds.d.ts +12 -0
  602. package/dist/dev/define/ui/compounds.d.ts.map +1 -0
  603. package/dist/dev/define/ui/compounds.js +62 -0
  604. package/dist/dev/define/ui/compounds.js.map +1 -0
  605. package/dist/dev/define/ui/controls-group.js +1 -2
  606. package/dist/dev/define/ui/controls-group.js.map +1 -1
  607. package/dist/dev/define/ui/controls.d.ts +2 -0
  608. package/dist/dev/define/ui/controls.d.ts.map +1 -1
  609. package/dist/dev/define/ui/controls.js +3 -7
  610. package/dist/dev/define/ui/controls.js.map +1 -1
  611. package/dist/dev/define/ui/error-dialog.d.ts +15 -0
  612. package/dist/dev/define/ui/error-dialog.d.ts.map +1 -0
  613. package/dist/dev/define/ui/error-dialog.js +6 -0
  614. package/dist/dev/define/ui/error-dialog.js.map +1 -0
  615. package/dist/dev/define/ui/fullscreen-button.js +1 -2
  616. package/dist/dev/define/ui/fullscreen-button.js.map +1 -1
  617. package/dist/dev/define/ui/hotkey.d.ts +9 -0
  618. package/dist/dev/define/ui/hotkey.d.ts.map +1 -0
  619. package/dist/dev/define/ui/hotkey.js +7 -0
  620. package/dist/dev/define/ui/hotkey.js.map +1 -0
  621. package/dist/dev/define/ui/mute-button.js +1 -2
  622. package/dist/dev/define/ui/mute-button.js.map +1 -1
  623. package/dist/dev/define/ui/pip-button.js +1 -2
  624. package/dist/dev/define/ui/pip-button.js.map +1 -1
  625. package/dist/dev/define/ui/play-button.js +1 -2
  626. package/dist/dev/define/ui/play-button.js.map +1 -1
  627. package/dist/dev/define/ui/playback-rate-button.js +1 -2
  628. package/dist/dev/define/ui/playback-rate-button.js.map +1 -1
  629. package/dist/dev/define/ui/popover.js +1 -2
  630. package/dist/dev/define/ui/popover.js.map +1 -1
  631. package/dist/dev/define/ui/poster.js +1 -2
  632. package/dist/dev/define/ui/poster.js.map +1 -1
  633. package/dist/dev/define/ui/seek-button.js +1 -2
  634. package/dist/dev/define/ui/seek-button.js.map +1 -1
  635. package/dist/dev/define/ui/slider-buffer.js +1 -2
  636. package/dist/dev/define/ui/slider-buffer.js.map +1 -1
  637. package/dist/dev/define/ui/slider-fill.js +1 -2
  638. package/dist/dev/define/ui/slider-fill.js.map +1 -1
  639. package/dist/dev/define/ui/slider-thumb.js +1 -2
  640. package/dist/dev/define/ui/slider-thumb.js.map +1 -1
  641. package/dist/dev/define/ui/slider-thumbnail.js +1 -2
  642. package/dist/dev/define/ui/slider-thumbnail.js.map +1 -1
  643. package/dist/dev/define/ui/slider-track.js +1 -2
  644. package/dist/dev/define/ui/slider-track.js.map +1 -1
  645. package/dist/dev/define/ui/slider-value.js +1 -2
  646. package/dist/dev/define/ui/slider-value.js.map +1 -1
  647. package/dist/dev/define/ui/slider.d.ts +10 -0
  648. package/dist/dev/define/ui/slider.d.ts.map +1 -1
  649. package/dist/dev/define/ui/slider.js +3 -15
  650. package/dist/dev/define/ui/slider.js.map +1 -1
  651. package/dist/dev/define/ui/thumbnail.js +1 -2
  652. package/dist/dev/define/ui/thumbnail.js.map +1 -1
  653. package/dist/dev/define/ui/time-group.js +1 -2
  654. package/dist/dev/define/ui/time-group.js.map +1 -1
  655. package/dist/dev/define/ui/time-separator.js +1 -2
  656. package/dist/dev/define/ui/time-separator.js.map +1 -1
  657. package/dist/dev/define/ui/time-slider.d.ts +14 -0
  658. package/dist/dev/define/ui/time-slider.d.ts.map +1 -1
  659. package/dist/dev/define/ui/time-slider.js +3 -19
  660. package/dist/dev/define/ui/time-slider.js.map +1 -1
  661. package/dist/dev/define/ui/time.d.ts +4 -0
  662. package/dist/dev/define/ui/time.d.ts.map +1 -1
  663. package/dist/dev/define/ui/time.js +3 -9
  664. package/dist/dev/define/ui/time.js.map +1 -1
  665. package/dist/dev/define/ui/tooltip-group.js +1 -2
  666. package/dist/dev/define/ui/tooltip-group.js.map +1 -1
  667. package/dist/dev/define/ui/tooltip.js +1 -2
  668. package/dist/dev/define/ui/tooltip.js.map +1 -1
  669. package/dist/dev/define/ui/volume-slider.d.ts +10 -0
  670. package/dist/dev/define/ui/volume-slider.d.ts.map +1 -1
  671. package/dist/dev/define/ui/volume-slider.js +3 -15
  672. package/dist/dev/define/ui/volume-slider.js.map +1 -1
  673. package/dist/dev/define/video/minimal-skin.css +624 -328
  674. package/dist/dev/define/video/minimal-skin.d.ts +6 -10
  675. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  676. package/dist/dev/define/video/minimal-skin.js +119 -119
  677. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  678. package/dist/dev/define/video/minimal-skin.tailwind.d.ts +4 -10
  679. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  680. package/dist/dev/define/video/minimal-skin.tailwind.js +110 -129
  681. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  682. package/dist/dev/define/video/minimal-ui.d.ts +1 -0
  683. package/dist/dev/define/video/minimal-ui.js +41 -0
  684. package/dist/dev/define/video/minimal-ui.js.map +1 -0
  685. package/dist/dev/define/video/player.js +1 -2
  686. package/dist/dev/define/video/player.js.map +1 -1
  687. package/dist/dev/define/video/skin.css +592 -311
  688. package/dist/dev/define/video/skin.d.ts +6 -10
  689. package/dist/dev/define/video/skin.d.ts.map +1 -1
  690. package/dist/dev/define/video/skin.js +140 -116
  691. package/dist/dev/define/video/skin.js.map +1 -1
  692. package/dist/dev/define/video/skin.tailwind.d.ts +4 -10
  693. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  694. package/dist/dev/define/video/skin.tailwind.js +106 -121
  695. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  696. package/dist/dev/define/video/ui.d.ts +1 -0
  697. package/dist/dev/define/video/ui.js +45 -0
  698. package/dist/dev/define/video/ui.js.map +1 -0
  699. package/dist/dev/icons/dist/render/default/index.js +5 -2
  700. package/dist/dev/icons/dist/render/default/index.js.map +1 -1
  701. package/dist/dev/icons/dist/render/minimal/index.js +5 -2
  702. package/dist/dev/icons/dist/render/minimal/index.js.map +1 -1
  703. package/dist/dev/index.d.ts +13 -5
  704. package/dist/dev/index.js +11 -5
  705. package/dist/dev/media/background-video/index.d.ts +8 -1
  706. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  707. package/dist/dev/media/background-video/index.js +6 -3
  708. package/dist/dev/media/background-video/index.js.map +1 -1
  709. package/dist/dev/media/container-element.d.ts +3 -0
  710. package/dist/dev/media/container-element.d.ts.map +1 -1
  711. package/dist/dev/media/container-element.js +22 -4
  712. package/dist/dev/media/container-element.js.map +1 -1
  713. package/dist/dev/media/dash-video/index.d.ts +17 -0
  714. package/dist/dev/media/dash-video/index.d.ts.map +1 -0
  715. package/dist/dev/media/dash-video/index.js +9 -0
  716. package/dist/dev/media/dash-video/index.js.map +1 -0
  717. package/dist/dev/media/hls-video/index.d.ts +13 -6
  718. package/dist/dev/media/hls-video/index.d.ts.map +1 -1
  719. package/dist/dev/media/hls-video/index.js +12 -19
  720. package/dist/dev/media/hls-video/index.js.map +1 -1
  721. package/dist/dev/media/mux-audio/index.d.ts +19 -0
  722. package/dist/dev/media/mux-audio/index.d.ts.map +1 -0
  723. package/dist/dev/media/mux-audio/index.js +18 -0
  724. package/dist/dev/media/mux-audio/index.js.map +1 -0
  725. package/dist/dev/media/mux-video/index.d.ts +19 -0
  726. package/dist/dev/media/mux-video/index.d.ts.map +1 -0
  727. package/dist/dev/media/mux-video/index.js +18 -0
  728. package/dist/dev/media/mux-video/index.js.map +1 -0
  729. package/dist/dev/media/native-hls-video/index.d.ts +17 -0
  730. package/dist/dev/media/native-hls-video/index.d.ts.map +1 -0
  731. package/dist/dev/media/native-hls-video/index.js +9 -0
  732. package/dist/dev/media/native-hls-video/index.js.map +1 -0
  733. package/dist/dev/media/simple-hls-video/index.d.ts +12 -6
  734. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
  735. package/dist/dev/media/simple-hls-video/index.js +5 -17
  736. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  737. package/dist/dev/player/context.d.ts +19 -3
  738. package/dist/dev/player/context.d.ts.map +1 -1
  739. package/dist/dev/player/context.js +7 -4
  740. package/dist/dev/player/context.js.map +1 -1
  741. package/dist/dev/player/create-player.d.ts +1 -1
  742. package/dist/dev/player/create-player.js +12 -5
  743. package/dist/dev/player/create-player.js.map +1 -1
  744. package/dist/dev/player/player-controller.js +1 -2
  745. package/dist/dev/player/player-controller.js.map +1 -1
  746. package/dist/dev/presets/audio.js +1 -2
  747. package/dist/dev/presets/background.js +1 -2
  748. package/dist/dev/presets/video.js +1 -2
  749. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +17 -38
  750. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  751. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  752. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  753. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js +7 -0
  754. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  755. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +5 -5
  756. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  757. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +2 -3
  758. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  759. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +4 -5
  760. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  761. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +1 -2
  762. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  763. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +2 -3
  764. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  765. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  766. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  767. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +5 -6
  768. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  769. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +15 -0
  770. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  771. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js +12 -0
  772. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  773. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +2 -3
  774. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  775. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +2 -3
  776. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  777. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +2 -3
  778. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  779. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +2 -3
  780. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  781. package/dist/dev/skins/dist/default/default/tailwind/components/time.js +1 -1
  782. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  783. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +41 -26
  784. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  785. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +18 -33
  786. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  787. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  788. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  789. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js +1 -2
  790. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -1
  791. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +5 -5
  792. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  793. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +2 -3
  794. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  795. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +4 -5
  796. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  797. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +1 -2
  798. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  799. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +2 -3
  800. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  801. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  802. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  803. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +5 -5
  804. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  805. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +15 -0
  806. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  807. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js +13 -0
  808. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  809. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +2 -3
  810. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  811. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +2 -3
  812. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  813. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +2 -3
  814. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  815. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +5 -6
  816. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  817. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +45 -24
  818. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  819. package/dist/{default/skins/dist/default/default/tailwind/components → dev/skins/dist/default/shared/tailwind}/icon-state.js +12 -2
  820. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  821. package/dist/dev/store/container-mixin.d.ts +10 -5
  822. package/dist/dev/store/container-mixin.d.ts.map +1 -1
  823. package/dist/dev/store/container-mixin.js +17 -62
  824. package/dist/dev/store/container-mixin.js.map +1 -1
  825. package/dist/dev/store/media-attach-mixin.d.ts +19 -0
  826. package/dist/dev/store/media-attach-mixin.d.ts.map +1 -0
  827. package/dist/dev/store/media-attach-mixin.js +44 -0
  828. package/dist/dev/store/media-attach-mixin.js.map +1 -0
  829. package/dist/dev/store/provider-mixin.d.ts +19 -6
  830. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  831. package/dist/dev/store/provider-mixin.js +100 -11
  832. package/dist/dev/store/provider-mixin.js.map +1 -1
  833. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js +1 -2
  834. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  835. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.js +1 -2
  836. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.js.map +1 -1
  837. package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
  838. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +2 -2
  839. package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  840. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.js +1 -2
  841. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.js.map +1 -1
  842. package/dist/dev/ui/alert-dialog/context.js +2 -5
  843. package/dist/dev/ui/alert-dialog/context.js.map +1 -1
  844. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
  845. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +2 -2
  846. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  847. package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -0
  848. package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
  849. package/dist/dev/ui/captions-button/captions-button-element.js +2 -2
  850. package/dist/dev/ui/captions-button/captions-button-element.js.map +1 -1
  851. package/dist/dev/ui/cast-button/cast-button-element.d.ts +19 -0
  852. package/dist/dev/ui/cast-button/cast-button-element.d.ts.map +1 -0
  853. package/dist/dev/ui/cast-button/cast-button-element.js +24 -0
  854. package/dist/dev/ui/cast-button/cast-button-element.js.map +1 -0
  855. package/dist/dev/ui/context-part-element.d.ts +1 -1
  856. package/dist/dev/ui/context-part-element.js +1 -2
  857. package/dist/dev/ui/context-part-element.js.map +1 -1
  858. package/dist/dev/ui/controls/context.js +2 -5
  859. package/dist/dev/ui/controls/context.js.map +1 -1
  860. package/dist/dev/ui/controls/controls-element.js +1 -2
  861. package/dist/dev/ui/controls/controls-element.js.map +1 -1
  862. package/dist/dev/ui/controls/controls-group-element.js +1 -2
  863. package/dist/dev/ui/controls/controls-group-element.js.map +1 -1
  864. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts +16 -0
  865. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -0
  866. package/dist/dev/ui/error-dialog/error-dialog-element.js +77 -0
  867. package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -0
  868. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +1 -0
  869. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
  870. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +2 -2
  871. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  872. package/dist/dev/ui/gesture/gesture-element.d.ts +22 -0
  873. package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -0
  874. package/dist/dev/ui/gesture/gesture-element.js +84 -0
  875. package/dist/dev/ui/gesture/gesture-element.js.map +1 -0
  876. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +15 -0
  877. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -0
  878. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  879. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  880. package/dist/dev/ui/hotkey/hotkey-element.d.ts +21 -0
  881. package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -0
  882. package/dist/dev/ui/hotkey/hotkey-element.js +81 -0
  883. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -0
  884. package/dist/dev/ui/media-button-element.d.ts +8 -2
  885. package/dist/dev/ui/media-button-element.d.ts.map +1 -1
  886. package/dist/dev/ui/media-button-element.js +17 -3
  887. package/dist/dev/ui/media-button-element.js.map +1 -1
  888. package/dist/dev/ui/media-element.js +1 -2
  889. package/dist/dev/ui/media-element.js.map +1 -1
  890. package/dist/dev/ui/media-ui-element.js +1 -2
  891. package/dist/dev/ui/media-ui-element.js.map +1 -1
  892. package/dist/dev/ui/mute-button/mute-button-element.d.ts +1 -0
  893. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
  894. package/dist/dev/ui/mute-button/mute-button-element.js +2 -2
  895. package/dist/dev/ui/mute-button/mute-button-element.js.map +1 -1
  896. package/dist/dev/ui/pip-button/pip-button-element.d.ts +1 -0
  897. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
  898. package/dist/dev/ui/pip-button/pip-button-element.js +2 -2
  899. package/dist/dev/ui/pip-button/pip-button-element.js.map +1 -1
  900. package/dist/dev/ui/play-button/play-button-element.d.ts +1 -0
  901. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
  902. package/dist/dev/ui/play-button/play-button-element.js +2 -2
  903. package/dist/dev/ui/play-button/play-button-element.js.map +1 -1
  904. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  905. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  906. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  907. package/dist/dev/ui/popover/popover-element.js +13 -11
  908. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  909. package/dist/dev/ui/position-controller.js +76 -0
  910. package/dist/dev/ui/position-controller.js.map +1 -0
  911. package/dist/dev/ui/poster/poster-element.js +1 -2
  912. package/dist/dev/ui/poster/poster-element.js.map +1 -1
  913. package/dist/dev/ui/seek-button/seek-button-element.js +1 -2
  914. package/dist/dev/ui/seek-button/seek-button-element.js.map +1 -1
  915. package/dist/dev/ui/slider/context.js +2 -5
  916. package/dist/dev/ui/slider/context.js.map +1 -1
  917. package/dist/dev/ui/slider/slider-buffer-element.js +1 -2
  918. package/dist/dev/ui/slider/slider-buffer-element.js.map +1 -1
  919. package/dist/dev/ui/slider/slider-element.js +2 -3
  920. package/dist/dev/ui/slider/slider-element.js.map +1 -1
  921. package/dist/dev/ui/slider/slider-fill-element.js +1 -2
  922. package/dist/dev/ui/slider/slider-fill-element.js.map +1 -1
  923. package/dist/dev/ui/slider/slider-preview-element.d.ts +21 -0
  924. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -0
  925. package/dist/dev/ui/slider/slider-preview-element.js +2 -3
  926. package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
  927. package/dist/dev/ui/slider/slider-thumb-element.js +1 -2
  928. package/dist/dev/ui/slider/slider-thumb-element.js.map +1 -1
  929. package/dist/dev/ui/slider/slider-thumbnail-element.js +1 -2
  930. package/dist/dev/ui/slider/slider-thumbnail-element.js.map +1 -1
  931. package/dist/dev/ui/slider/slider-track-element.js +1 -2
  932. package/dist/dev/ui/slider/slider-track-element.js.map +1 -1
  933. package/dist/dev/ui/slider/slider-value-element.js +1 -2
  934. package/dist/dev/ui/slider/slider-value-element.js.map +1 -1
  935. package/dist/dev/ui/thumbnail/thumbnail-element.js +1 -2
  936. package/dist/dev/ui/thumbnail/thumbnail-element.js.map +1 -1
  937. package/dist/dev/ui/time/time-element.d.ts +0 -1
  938. package/dist/dev/ui/time/time-element.d.ts.map +1 -1
  939. package/dist/dev/ui/time/time-element.js +13 -12
  940. package/dist/dev/ui/time/time-element.js.map +1 -1
  941. package/dist/dev/ui/time/time-group-element.js +1 -2
  942. package/dist/dev/ui/time/time-group-element.js.map +1 -1
  943. package/dist/dev/ui/time/time-separator-element.js +1 -2
  944. package/dist/dev/ui/time/time-separator-element.js.map +1 -1
  945. package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
  946. package/dist/dev/ui/time-slider/time-slider-element.js +7 -8
  947. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  948. package/dist/dev/ui/tooltip/context.js +2 -5
  949. package/dist/dev/ui/tooltip/context.js.map +1 -1
  950. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  951. package/dist/dev/ui/tooltip/tooltip-element.js +25 -18
  952. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  953. package/dist/dev/ui/tooltip/tooltip-group-element.js +5 -3
  954. package/dist/dev/ui/tooltip/tooltip-group-element.js.map +1 -1
  955. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts +5 -0
  956. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts.map +1 -1
  957. package/dist/dev/ui/volume-slider/volume-slider-element.js +27 -20
  958. package/dist/dev/ui/volume-slider/volume-slider-element.js.map +1 -1
  959. package/package.json +25 -14
  960. package/cdn/audio-minimal.css +0 -1
  961. package/cdn/audio.css +0 -1
  962. package/cdn/background.css +0 -1
  963. package/cdn/video-minimal.css +0 -1
  964. package/cdn/video.css +0 -1
  965. package/dist/default/define/skin-mixin.js +0 -55
  966. package/dist/default/define/skin-mixin.js.map +0 -1
  967. package/dist/default/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  968. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js +0 -28
  969. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  970. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js +0 -29
  971. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  972. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js +0 -28
  973. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
  974. package/dist/dev/define/skin-mixin.d.ts +0 -21
  975. package/dist/dev/define/skin-mixin.d.ts.map +0 -1
  976. package/dist/dev/define/skin-mixin.js +0 -69
  977. package/dist/dev/define/skin-mixin.js.map +0 -1
  978. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  979. package/dist/dev/skins/dist/default/default/tailwind/components/tooltip-state.js +0 -28
  980. package/dist/dev/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  981. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js +0 -29
  982. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  983. package/dist/dev/skins/dist/default/minimal/tailwind/components/tooltip-state.js +0 -28
  984. package/dist/dev/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
@@ -0,0 +1,4157 @@
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";
2
+ import { t as listen } from "./listen-CJT7C4kM.js";
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";
5
+
6
+ //#region ../utils/dist/dom/direction.js
7
+ /** Check whether an element's text direction is right-to-left. */
8
+ function isRTL(element) {
9
+ const dir = element.closest("[dir]")?.getAttribute("dir");
10
+ if (dir) return dir.toLowerCase() === "rtl";
11
+ return getComputedStyle(element).direction === "rtl";
12
+ }
13
+
14
+ //#endregion
15
+ //#region ../utils/dist/dom/supports.js
16
+ function supportsAnchorPositioning() {
17
+ return typeof CSS !== "undefined" && CSS.supports("anchor-name: --a");
18
+ }
19
+
20
+ //#endregion
21
+ //#region ../utils/dist/dom/platform.js
22
+ function isMacOS() {
23
+ return typeof navigator !== "undefined" && /mac/i.test(navigator.userAgent);
24
+ }
25
+
26
+ //#endregion
27
+ //#region ../utils/dist/dom/popover.js
28
+ function tryShowPopover(el) {
29
+ try {
30
+ el?.showPopover?.();
31
+ } catch {}
32
+ }
33
+ function tryHidePopover(el) {
34
+ try {
35
+ el?.hidePopover?.();
36
+ } catch {}
37
+ }
38
+
39
+ //#endregion
40
+ //#region ../utils/dist/dom/style.js
41
+ function applyStyles(element, styles) {
42
+ for (const [prop, value] of Object.entries(styles)) if (typeof value === "string") {
43
+ const key = prop.startsWith("--") ? prop : kebabCase(prop);
44
+ element.style.setProperty(key, value);
45
+ }
46
+ }
47
+ function resolveCSSLength(el, value) {
48
+ const trimmed = value.trim();
49
+ if (!trimmed) return 0;
50
+ const parsed = Number.parseFloat(trimmed);
51
+ if (Number.isNaN(parsed)) return 0;
52
+ if (/^-?\d*\.?\d+$/.test(trimmed) || trimmed.endsWith("px")) return parsed;
53
+ const doc = el.ownerDocument;
54
+ const root = doc?.documentElement;
55
+ if (trimmed.endsWith("rem")) return parsed * (root ? Number.parseFloat(getComputedStyle(root).fontSize) || 16 : 16);
56
+ if (trimmed.endsWith("em")) return parsed * (el instanceof HTMLElement ? Number.parseFloat(getComputedStyle(el).fontSize) || 16 : 16);
57
+ if (!doc) return parsed;
58
+ const measurementEl = doc.createElement("div");
59
+ measurementEl.style.position = "absolute";
60
+ measurementEl.style.visibility = "hidden";
61
+ measurementEl.style.pointerEvents = "none";
62
+ measurementEl.style.inlineSize = trimmed;
63
+ measurementEl.style.blockSize = "0";
64
+ measurementEl.style.padding = "0";
65
+ measurementEl.style.border = "0";
66
+ measurementEl.style.inset = "0";
67
+ const parent = doc.body ?? doc.documentElement;
68
+ if (!parent) return parsed;
69
+ parent.appendChild(measurementEl);
70
+ const pixels = measurementEl.getBoundingClientRect().width;
71
+ measurementEl.remove();
72
+ return Number.isFinite(pixels) ? pixels : parsed;
73
+ }
74
+
75
+ //#endregion
76
+ //#region ../core/dist/dev/core/ui/transition.js
77
+ function getTransitionFlags(status) {
78
+ return {
79
+ transitionStarting: status === "starting",
80
+ transitionEnding: status === "ending"
81
+ };
82
+ }
83
+
84
+ //#endregion
85
+ //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-core.js
86
+ var AlertDialogCore = class {
87
+ static defaultProps = {
88
+ open: false,
89
+ defaultOpen: false
90
+ };
91
+ /** Accept props for API consistency. Props are consumed by platform layers. */
92
+ setProps(_props) {}
93
+ #input = null;
94
+ #titleId = void 0;
95
+ #descriptionId = void 0;
96
+ setInput(input) {
97
+ this.#input = input;
98
+ }
99
+ setTitleId(id) {
100
+ this.#titleId = id;
101
+ }
102
+ setDescriptionId(id) {
103
+ this.#descriptionId = id;
104
+ }
105
+ getState() {
106
+ const input = this.#input;
107
+ return {
108
+ open: input.active,
109
+ status: input.status,
110
+ titleId: this.#titleId,
111
+ descriptionId: this.#descriptionId,
112
+ ...getTransitionFlags(input.status)
113
+ };
114
+ }
115
+ getAttrs(state) {
116
+ return {
117
+ role: "alertdialog",
118
+ "aria-modal": "true",
119
+ "aria-labelledby": state.titleId,
120
+ "aria-describedby": state.descriptionId
121
+ };
122
+ }
123
+ };
124
+
125
+ //#endregion
126
+ //#region ../core/dist/dev/core/ui/alert-dialog/alert-dialog-data-attrs.js
127
+ const AlertDialogDataAttrs = {
128
+ open: "data-open",
129
+ transitionStarting: "data-starting-style",
130
+ transitionEnding: "data-ending-style"
131
+ };
132
+
133
+ //#endregion
134
+ //#region ../utils/dist/object/defaults.js
135
+ /**
136
+ * Creates a new object with default values filled in for undefined properties.
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * const props = { label: undefined, disabled: true };
141
+ * const defaultProps = { label: '', disabled: false };
142
+ * defaults(props, defaultProps); // { label: '', disabled: true }
143
+ * ```
144
+ */
145
+ function defaults(object, defaultValues) {
146
+ const result = { ...defaultValues };
147
+ for (const key in object) if (!isUndefined(object[key])) result[key] = object[key];
148
+ return result;
149
+ }
150
+
151
+ //#endregion
152
+ //#region ../store/dist/dev/core/selector.js
153
+ const stateContext = {
154
+ target: throwNoTargetError,
155
+ signals: new AbortControllerRegistry(),
156
+ get: throwNoTargetError,
157
+ set: throwNoTargetError
158
+ };
159
+ /**
160
+ * Create a type-safe selector for a slice's state.
161
+ *
162
+ * The selector returns the slice's state, or `undefined` if the slice
163
+ * is not configured in the store.
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * const selectPlayback = createSelector(playbackSlice);
168
+ * selectPlayback(store.state); // { paused, play, pause, ... } | undefined
169
+ * selectPlayback.displayName; // 'playback' (from slice name)
170
+ * ```
171
+ *
172
+ * @param slice - The slice to create a selector for.
173
+ */
174
+ function createSelector(slice) {
175
+ const initialState = slice.state(stateContext);
176
+ const keys = Object.keys(initialState);
177
+ const firstKey = keys[0];
178
+ if (!firstKey) return Object.assign(() => void 0, { displayName: slice.name });
179
+ return Object.assign((state) => {
180
+ if (!(firstKey in state)) return void 0;
181
+ return pick(state, keys);
182
+ }, { displayName: slice.name });
183
+ }
184
+
185
+ //#endregion
186
+ //#region ../utils/dist/function/throttle.js
187
+ /**
188
+ * Throttle: limits `fn` to at most once per `ms` window.
189
+ *
190
+ * - Default (no options): trailing-edge only — the first call schedules a
191
+ * timer; subsequent calls within the window update the arguments. The
192
+ * function fires once per window with the latest arguments.
193
+ * - `{ leading: true }`: leading + trailing — the first call invokes
194
+ * immediately and opens a cooldown window. Subsequent calls within the
195
+ * window are coalesced to a single trailing-edge invocation.
196
+ */
197
+ function throttle(fn, ms, options) {
198
+ const leading = options?.leading ?? false;
199
+ let timerId = null;
200
+ let latestArgs;
201
+ let hasPending = false;
202
+ function startCooldown() {
203
+ timerId = setTimeout(() => {
204
+ timerId = null;
205
+ if (hasPending) {
206
+ hasPending = false;
207
+ fn(...latestArgs);
208
+ startCooldown();
209
+ }
210
+ }, ms);
211
+ }
212
+ const throttled = (...args) => {
213
+ latestArgs = args;
214
+ if (leading) if (timerId === null) {
215
+ fn(...latestArgs);
216
+ startCooldown();
217
+ } else hasPending = true;
218
+ else {
219
+ if (timerId !== null) return;
220
+ timerId = setTimeout(() => {
221
+ timerId = null;
222
+ fn(...latestArgs);
223
+ }, ms);
224
+ }
225
+ };
226
+ throttled.cancel = () => {
227
+ if (timerId !== null) {
228
+ clearTimeout(timerId);
229
+ timerId = null;
230
+ }
231
+ hasPending = false;
232
+ };
233
+ return throttled;
234
+ }
235
+
236
+ //#endregion
237
+ //#region ../core/dist/dev/core/ui/controls/controls-core.js
238
+ var ControlsCore = class {
239
+ #media = null;
240
+ setMedia(media) {
241
+ this.#media = media;
242
+ }
243
+ getState() {
244
+ const media = this.#media;
245
+ return {
246
+ visible: media.controlsVisible,
247
+ userActive: media.userActive
248
+ };
249
+ }
250
+ };
251
+
252
+ //#endregion
253
+ //#region ../core/dist/dev/core/ui/controls/controls-data-attrs.js
254
+ const ControlsDataAttrs = {
255
+ visible: "data-visible",
256
+ userActive: "data-user-active"
257
+ };
258
+
259
+ //#endregion
260
+ //#region ../core/dist/dev/core/ui/error-dialog/error-dialog-core.js
261
+ /** Error-dialog core: an alert dialog whose open state is driven by media error state. */
262
+ var ErrorDialogCore = class extends AlertDialogCore {
263
+ setProps() {}
264
+ };
265
+
266
+ //#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);
282
+ }
283
+ setProps(props) {
284
+ this.#props = defaults(props, MuteButtonCore.defaultProps);
285
+ }
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";
293
+ }
294
+ getAttrs(state) {
295
+ return {
296
+ "aria-label": this.getLabel(state),
297
+ "aria-disabled": this.#props.disabled ? "true" : void 0
298
+ };
299
+ }
300
+ setMedia(media) {
301
+ this.#media = media;
302
+ }
303
+ getState() {
304
+ const media = this.#media;
305
+ this.state.patch({
306
+ muted: media.muted || media.volume === 0,
307
+ volumeLevel: getVolumeLevel(media)
308
+ });
309
+ this.state.patch({ label: this.getLabel(this.state.current) });
310
+ return this.state.current;
311
+ }
312
+ toggle(media) {
313
+ if (this.#props.disabled) return;
314
+ media.toggleMuted();
315
+ }
316
+ };
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
+
324
+ //#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"
329
+ };
330
+
331
+ //#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
+ }
349
+ setProps(props) {
350
+ this.#props = defaults(props, PlayButtonCore.defaultProps);
351
+ }
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";
360
+ }
361
+ getAttrs(state) {
362
+ return {
363
+ "aria-label": this.getLabel(state),
364
+ "aria-disabled": this.#props.disabled ? "true" : void 0
365
+ };
366
+ }
367
+ setMedia(media) {
368
+ this.#media = media;
369
+ }
370
+ getState() {
371
+ const media = this.#media;
372
+ this.state.patch({
373
+ paused: media.paused,
374
+ ended: media.ended,
375
+ started: media.started
376
+ });
377
+ this.state.patch({ label: this.getLabel(this.state.current) });
378
+ return this.state.current;
379
+ }
380
+ async toggle(media) {
381
+ if (this.#props.disabled) return;
382
+ if (media.paused || media.ended) return media.play();
383
+ media.pause();
384
+ }
385
+ };
386
+
387
+ //#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"
393
+ };
394
+
395
+ //#endregion
396
+ //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-core.js
397
+ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
398
+ static defaultProps = {
399
+ label: "",
400
+ disabled: false
401
+ };
402
+ state = createState({
403
+ rate: 1,
404
+ label: ""
405
+ });
406
+ #props = { ...PlaybackRateButtonCore.defaultProps };
407
+ #media = null;
408
+ constructor(props) {
409
+ if (props) this.setProps(props);
410
+ }
411
+ setProps(props) {
412
+ this.#props = defaults(props, PlaybackRateButtonCore.defaultProps);
413
+ }
414
+ getLabel(state) {
415
+ const { label } = this.#props;
416
+ if (isFunction(label)) {
417
+ const customLabel = label(state);
418
+ if (customLabel) return customLabel;
419
+ } else if (label) return label;
420
+ return `Playback rate ${state.rate}`;
421
+ }
422
+ getAttrs(state) {
423
+ return {
424
+ "aria-label": this.getLabel(state),
425
+ "aria-disabled": this.#props.disabled ? "true" : void 0
426
+ };
427
+ }
428
+ setMedia(media) {
429
+ this.#media = media;
430
+ }
431
+ getState() {
432
+ const media = this.#media;
433
+ this.state.patch({ rate: media.playbackRate });
434
+ this.state.patch({ label: this.getLabel(this.state.current) });
435
+ return this.state.current;
436
+ }
437
+ cycle(media) {
438
+ 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);
444
+ }
445
+ };
446
+
447
+ //#endregion
448
+ //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-data-attrs.js
449
+ const PlaybackRateButtonDataAttrs = { rate: "data-rate" };
450
+
451
+ //#endregion
452
+ //#region ../core/dist/dev/core/ui/popover/popover-core.js
453
+ var PopoverCore = class PopoverCore {
454
+ static defaultProps = {
455
+ side: "top",
456
+ align: "center",
457
+ modal: false,
458
+ closeOnEscape: true,
459
+ closeOnOutsideClick: true,
460
+ open: false,
461
+ defaultOpen: false,
462
+ openOnHover: false,
463
+ delay: 300,
464
+ closeDelay: 0
465
+ };
466
+ #props = { ...PopoverCore.defaultProps };
467
+ constructor(props) {
468
+ if (props) this.setProps(props);
469
+ }
470
+ setProps(props) {
471
+ this.#props = defaults(props, PopoverCore.defaultProps);
472
+ }
473
+ #input = null;
474
+ setInput(input) {
475
+ this.#input = input;
476
+ }
477
+ getState() {
478
+ const input = this.#input;
479
+ return {
480
+ open: input.active,
481
+ status: input.status,
482
+ side: this.#props.side,
483
+ align: this.#props.align,
484
+ modal: this.#props.modal,
485
+ ...getTransitionFlags(input.status)
486
+ };
487
+ }
488
+ getTriggerAttrs(state, popupId) {
489
+ return {
490
+ "aria-expanded": state.open ? "true" : "false",
491
+ "aria-haspopup": "dialog",
492
+ "aria-controls": popupId
493
+ };
494
+ }
495
+ getPopupAttrs(state) {
496
+ return {
497
+ popover: "manual",
498
+ role: "dialog",
499
+ "aria-modal": state.modal === true ? "true" : void 0
500
+ };
501
+ }
502
+ };
503
+
504
+ //#endregion
505
+ //#region ../core/dist/dev/core/ui/popover/popover-css-vars.js
506
+ const PopoverCSSVars = {
507
+ sideOffset: "--media-popover-side-offset",
508
+ alignOffset: "--media-popover-align-offset",
509
+ anchorWidth: "--media-popover-anchor-width",
510
+ anchorHeight: "--media-popover-anchor-height",
511
+ availableWidth: "--media-popover-available-width",
512
+ availableHeight: "--media-popover-available-height"
513
+ };
514
+
515
+ //#endregion
516
+ //#region ../core/dist/dev/core/ui/popover/popover-data-attrs.js
517
+ const PopoverDataAttrs = {
518
+ open: "data-open",
519
+ side: "data-side",
520
+ 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"
585
+ };
586
+
587
+ //#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
+ }
599
+
600
+ //#endregion
601
+ //#region ../core/dist/dev/core/ui/slider/slider-core.js
602
+ /** Base slider logic: value mapping, ARIA attrs, and step calculations. */
603
+ var SliderCore = class SliderCore {
604
+ static defaultProps = {
605
+ label: "",
606
+ step: 1,
607
+ largeStep: 10,
608
+ orientation: "horizontal",
609
+ disabled: false,
610
+ thumbAlignment: "center",
611
+ value: 0,
612
+ min: 0,
613
+ max: 100
614
+ };
615
+ static defaultInput = {
616
+ pointerPercent: 0,
617
+ dragPercent: 0,
618
+ dragging: false,
619
+ pointing: false,
620
+ focused: false
621
+ };
622
+ #props = { ...SliderCore.defaultProps };
623
+ #input = { ...SliderCore.defaultInput };
624
+ get props() {
625
+ return this.#props;
626
+ }
627
+ get input() {
628
+ return this.#input;
629
+ }
630
+ constructor(props) {
631
+ if (props) this.setProps(props);
632
+ }
633
+ setProps(props) {
634
+ this.#props = defaults(props, SliderCore.defaultProps);
635
+ }
636
+ setInput(input) {
637
+ this.#input = input;
638
+ }
639
+ getSliderState(value) {
640
+ const { orientation, disabled, thumbAlignment } = this.#props;
641
+ const { pointerPercent, dragging, pointing, focused } = this.#input;
642
+ return {
643
+ value,
644
+ fillPercent: this.percentFromValue(value),
645
+ pointerPercent,
646
+ dragging,
647
+ pointing,
648
+ interactive: dragging || pointing || focused,
649
+ orientation,
650
+ disabled,
651
+ thumbAlignment
652
+ };
653
+ }
654
+ getLabel(state) {
655
+ const { label } = this.#props;
656
+ if (isFunction(label)) {
657
+ const customLabel = label(state);
658
+ if (customLabel) return customLabel;
659
+ } else if (label) return label;
660
+ return "";
661
+ }
662
+ getAttrs(state) {
663
+ return {
664
+ role: "slider",
665
+ tabIndex: state.disabled ? -1 : 0,
666
+ autoComplete: "off",
667
+ "aria-label": this.getLabel(state),
668
+ "aria-valuemin": this.#props.min,
669
+ "aria-valuemax": this.#props.max,
670
+ "aria-valuenow": state.value,
671
+ "aria-orientation": state.orientation,
672
+ "aria-disabled": state.disabled ? "true" : void 0
673
+ };
674
+ }
675
+ valueFromPercent(percent) {
676
+ const { min, max, step } = this.#props;
677
+ return roundToStep(clamp(min + percent / 100 * (max - min), min, max), step, min);
678
+ }
679
+ /** Convert percent to a clamped value without applying step rounding. */
680
+ rawValueFromPercent(percent) {
681
+ const { min, max } = this.#props;
682
+ return clamp(min + percent / 100 * (max - min), min, max);
683
+ }
684
+ percentFromValue(value) {
685
+ const { min, max } = this.#props;
686
+ if (max === min) return 0;
687
+ return (value - min) / (max - min) * 100;
688
+ }
689
+ /** Step as a percentage of the slider range. */
690
+ getStepPercent() {
691
+ const { step, min, max } = this.#props;
692
+ const range = max - min;
693
+ return range > 0 ? step / range * 100 : 0;
694
+ }
695
+ /** Large step as a percentage of the slider range. */
696
+ getLargeStepPercent() {
697
+ const { largeStep, min, max } = this.#props;
698
+ const range = max - min;
699
+ return range > 0 ? largeStep / range * 100 : 0;
700
+ }
701
+ adjustPercentForAlignment(rawPercent, thumbSize, trackSize) {
702
+ if (this.#props.thumbAlignment === "center" || trackSize === 0) return rawPercent;
703
+ const thumbHalf = thumbSize / trackSize * 100 / 2;
704
+ const minPercent = thumbHalf;
705
+ const maxPercent = 100 - thumbHalf;
706
+ return minPercent + rawPercent / 100 * (maxPercent - minPercent);
707
+ }
708
+ };
709
+
710
+ //#endregion
711
+ //#region ../core/dist/dev/core/ui/slider/slider-css-vars.js
712
+ /** CSS custom property names for slider visual state. */
713
+ const SliderCSSVars = {
714
+ fill: "--media-slider-fill",
715
+ pointer: "--media-slider-pointer",
716
+ buffer: "--media-slider-buffer"
717
+ };
718
+
719
+ //#endregion
720
+ //#region ../core/dist/dev/core/ui/slider/slider-data-attrs.js
721
+ const SliderDataAttrs = {
722
+ dragging: "data-dragging",
723
+ pointing: "data-pointing",
724
+ interactive: "data-interactive",
725
+ orientation: "data-orientation",
726
+ disabled: "data-disabled"
727
+ };
728
+
729
+ //#endregion
730
+ //#region ../core/dist/dev/core/ui/thumbnail/thumbnail-core.js
731
+ var ThumbnailCore = class {
732
+ findActiveThumbnail(thumbnails, time) {
733
+ if (thumbnails.length === 0) return void 0;
734
+ let low = 0;
735
+ let high = thumbnails.length - 1;
736
+ let result;
737
+ while (low <= high) {
738
+ const mid = low + high >>> 1;
739
+ const image = thumbnails[mid];
740
+ if (time >= image.startTime) {
741
+ result = image;
742
+ low = mid + 1;
743
+ } else high = mid - 1;
744
+ }
745
+ return result;
746
+ }
747
+ /**
748
+ * Parse CSS constraint strings into numeric `ThumbnailConstraints`.
749
+ *
750
+ * Accepts any object with string `minWidth`/`maxWidth`/`minHeight`/`maxHeight`
751
+ * properties — `CSSStyleDeclaration` satisfies this structurally.
752
+ */
753
+ parseConstraints(raw) {
754
+ const minW = parseFloat(raw.minWidth);
755
+ const maxW = parseFloat(raw.maxWidth);
756
+ const minH = parseFloat(raw.minHeight);
757
+ const maxH = parseFloat(raw.maxHeight);
758
+ return {
759
+ minWidth: Number.isFinite(minW) ? minW : 0,
760
+ maxWidth: Number.isFinite(maxW) ? maxW : Infinity,
761
+ minHeight: Number.isFinite(minH) ? minH : 0,
762
+ maxHeight: Number.isFinite(maxH) ? maxH : Infinity
763
+ };
764
+ }
765
+ /**
766
+ * Calculate a uniform scale factor that fits `tileWidth × tileHeight` within the
767
+ * given CSS min/max constraints while preserving aspect ratio.
768
+ *
769
+ * - Scales down when the tile exceeds max constraints.
770
+ * - Scales up when the tile is smaller than min constraints.
771
+ * - Returns `1` when no scaling is needed.
772
+ */
773
+ calculateScale(tileWidth, tileHeight, constraints) {
774
+ const { minWidth, maxWidth, minHeight, maxHeight } = constraints;
775
+ const maxRatio = Math.min(maxWidth / tileWidth, maxHeight / tileHeight);
776
+ const minRatio = Math.max(minWidth / tileWidth, minHeight / tileHeight);
777
+ if (Number.isFinite(maxRatio) && maxRatio < 1) return maxRatio;
778
+ if (Number.isFinite(minRatio) && minRatio > 1) return minRatio;
779
+ return 1;
780
+ }
781
+ /**
782
+ * Compute container and image dimensions for the current thumbnail, scaled to
783
+ * fit within the element's CSS min/max constraints.
784
+ *
785
+ * The container clips the sprite sheet via `overflow: hidden`, and the image is
786
+ * positioned with `transform: translate()` to show the correct tile.
787
+ */
788
+ resize(thumbnail, imgNaturalWidth, imgNaturalHeight, constraints) {
789
+ const tileWidth = thumbnail.width ?? imgNaturalWidth;
790
+ const tileHeight = thumbnail.height ?? imgNaturalHeight;
791
+ if (!tileWidth || !tileHeight) return void 0;
792
+ const scale = this.calculateScale(tileWidth, tileHeight, constraints);
793
+ const coordX = thumbnail.coords?.x ?? 0;
794
+ const coordY = thumbnail.coords?.y ?? 0;
795
+ const inset = scale !== 1 ? 1 : 0;
796
+ return {
797
+ scale,
798
+ containerWidth: Math.max(0, Math.floor(tileWidth * scale) - inset * 2),
799
+ containerHeight: Math.max(0, Math.floor(tileHeight * scale) - inset * 2),
800
+ imageWidth: Math.ceil(imgNaturalWidth * scale),
801
+ imageHeight: Math.ceil(imgNaturalHeight * scale),
802
+ offsetX: Math.ceil(coordX * scale) + inset,
803
+ offsetY: Math.ceil(coordY * scale) + inset
804
+ };
805
+ }
806
+ getState(loading, error, thumbnail) {
807
+ return {
808
+ loading,
809
+ error,
810
+ hidden: !loading && !thumbnail
811
+ };
812
+ }
813
+ getAttrs(_state) {
814
+ return {
815
+ role: "img",
816
+ "aria-hidden": "true"
817
+ };
818
+ }
819
+ };
820
+
821
+ //#endregion
822
+ //#region ../core/dist/dev/core/ui/thumbnail/thumbnail-data-attrs.js
823
+ const ThumbnailDataAttrs = {
824
+ loading: "data-loading",
825
+ error: "data-error",
826
+ hidden: "data-hidden"
827
+ };
828
+
829
+ //#endregion
830
+ //#region ../core/dist/dev/core/ui/thumbnail/thumbnail-media-fragment.js
831
+ /** Parse `url#xywh=x,y,w,h` into a URL and optional sprite coordinates. */
832
+ function parseMediaFragment(text, baseURL) {
833
+ const parts = text.trim().split("#");
834
+ const rawURL = parts[0] ?? "";
835
+ const hash = parts[1];
836
+ const url = baseURL ? new URL(rawURL, baseURL).href : rawURL;
837
+ if (!hash) return { url };
838
+ const eqIndex = hash.indexOf("=");
839
+ if (eqIndex === -1) return { url };
840
+ const keys = hash.slice(0, eqIndex);
841
+ const values = hash.slice(eqIndex + 1).split(",").map(Number);
842
+ const data = {};
843
+ for (let i = 0; i < keys.length; i++) {
844
+ const key = keys[i];
845
+ const value = values[i];
846
+ if (key && isNumber(value) && !Number.isNaN(value)) data[key] = value;
847
+ }
848
+ const result = { url };
849
+ if (isNumber(data.w)) result.width = data.w;
850
+ if (isNumber(data.h)) result.height = data.h;
851
+ if (isNumber(data.x) && isNumber(data.y)) result.coords = {
852
+ x: data.x,
853
+ y: data.y
854
+ };
855
+ return result;
856
+ }
857
+ /**
858
+ * Convert an array of text cues (e.g. `VTTCue` from a `<track>` element)
859
+ * into {@link ThumbnailImage} entries by parsing the media-fragment in
860
+ * each cue's text.
861
+ */
862
+ function mapCuesToThumbnails(cues, baseURL) {
863
+ const images = [];
864
+ for (const cue of cues) {
865
+ const fragment = parseMediaFragment(cue.text, baseURL);
866
+ const image = {
867
+ url: fragment.url,
868
+ startTime: cue.startTime,
869
+ endTime: cue.endTime
870
+ };
871
+ if (fragment.width) image.width = fragment.width;
872
+ if (fragment.height) image.height = fragment.height;
873
+ if (fragment.coords) image.coords = fragment.coords;
874
+ images.push(image);
875
+ }
876
+ return images;
877
+ }
878
+
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
+ //#endregion
980
+ //#region ../core/dist/dev/core/ui/time/time-core.js
981
+ const DEFAULT_LABELS = {
982
+ current: "Current time",
983
+ duration: "Duration",
984
+ remaining: "Remaining"
985
+ };
986
+ var TimeCore = class TimeCore {
987
+ static defaultProps = {
988
+ type: "current",
989
+ negativeSign: "-",
990
+ label: ""
991
+ };
992
+ #props = { ...TimeCore.defaultProps };
993
+ #media = null;
994
+ constructor(props) {
995
+ if (props) this.setProps(props);
996
+ }
997
+ setProps(props) {
998
+ this.#props = defaults(props, TimeCore.defaultProps);
999
+ }
1000
+ setMedia(media) {
1001
+ this.#media = media;
1002
+ }
1003
+ #getSeconds() {
1004
+ const media = this.#media;
1005
+ const { type } = this.#props;
1006
+ switch (type) {
1007
+ case "current": return media.currentTime;
1008
+ case "duration": return media.duration;
1009
+ case "remaining": return media.currentTime - media.duration;
1010
+ default: return 0;
1011
+ }
1012
+ }
1013
+ #getText() {
1014
+ const media = this.#media;
1015
+ const seconds = this.#getSeconds();
1016
+ return formatTime(Math.abs(seconds), media.duration);
1017
+ }
1018
+ #getPhrase() {
1019
+ const { type } = this.#props;
1020
+ const seconds = this.#getSeconds();
1021
+ if (type === "remaining") return formatTimeAsPhrase(seconds < 0 ? seconds : -Math.abs(seconds));
1022
+ return formatTimeAsPhrase(seconds);
1023
+ }
1024
+ #getDatetime() {
1025
+ const seconds = this.#getSeconds();
1026
+ return secondsToIsoDuration(Math.abs(seconds));
1027
+ }
1028
+ getLabel(state) {
1029
+ const { label } = this.#props;
1030
+ if (isFunction(label)) {
1031
+ const customLabel = label(state);
1032
+ if (customLabel) return customLabel;
1033
+ } else if (label) return label;
1034
+ return DEFAULT_LABELS[this.#props.type];
1035
+ }
1036
+ getAttrs(state) {
1037
+ return {
1038
+ "aria-label": this.getLabel(state),
1039
+ "aria-valuetext": state.phrase
1040
+ };
1041
+ }
1042
+ getState() {
1043
+ const seconds = this.#getSeconds();
1044
+ return {
1045
+ type: this.#props.type,
1046
+ seconds,
1047
+ negative: this.#props.type === "remaining" && seconds < 0,
1048
+ text: this.#getText(),
1049
+ phrase: this.#getPhrase(),
1050
+ datetime: this.#getDatetime()
1051
+ };
1052
+ }
1053
+ };
1054
+
1055
+ //#endregion
1056
+ //#region ../core/dist/dev/core/ui/time/time-data-attrs.js
1057
+ const TimeDataAttrs = { type: "data-type" };
1058
+
1059
+ //#endregion
1060
+ //#region ../core/dist/dev/core/ui/time-slider/time-slider-core.js
1061
+ /** Time-domain slider: maps media time/buffer state to slider state. */
1062
+ var TimeSliderCore = class TimeSliderCore extends SliderCore {
1063
+ static defaultProps = {
1064
+ ...SliderCore.defaultProps,
1065
+ label: "Seek",
1066
+ changeThrottle: 100
1067
+ };
1068
+ #props = { ...TimeSliderCore.defaultProps };
1069
+ #media = null;
1070
+ constructor(props) {
1071
+ super();
1072
+ if (props) this.setProps(props);
1073
+ }
1074
+ setProps(props) {
1075
+ this.#props = defaults(props, TimeSliderCore.defaultProps);
1076
+ super.setProps({
1077
+ ...props,
1078
+ min: 0
1079
+ });
1080
+ }
1081
+ setMedia(media) {
1082
+ this.#media = media;
1083
+ }
1084
+ getState() {
1085
+ const { duration, currentTime, seeking, buffered } = this.#media;
1086
+ super.setProps({
1087
+ ...this.#props,
1088
+ min: 0,
1089
+ max: duration
1090
+ });
1091
+ const base = super.getSliderState(currentTime);
1092
+ const bufferedEnd = buffered.length > 0 ? buffered[buffered.length - 1][1] : 0;
1093
+ const bufferPercent = duration > 0 ? bufferedEnd / duration * 100 : 0;
1094
+ return {
1095
+ ...base,
1096
+ currentTime,
1097
+ duration,
1098
+ seeking,
1099
+ bufferPercent
1100
+ };
1101
+ }
1102
+ getLabel(state) {
1103
+ return super.getLabel(state) || "Seek";
1104
+ }
1105
+ getAttrs(state) {
1106
+ const base = super.getAttrs(state);
1107
+ const announceValue = state.dragging ? this.rawValueFromPercent(state.pointerPercent) : state.value;
1108
+ const currentPhrase = formatTimeAsPhrase(announceValue);
1109
+ const durationPhrase = formatTimeAsPhrase(state.duration);
1110
+ const valuetext = durationPhrase ? `${currentPhrase} of ${durationPhrase}` : currentPhrase;
1111
+ return {
1112
+ ...base,
1113
+ "aria-valuenow": announceValue,
1114
+ "aria-valuetext": valuetext
1115
+ };
1116
+ }
1117
+ };
1118
+
1119
+ //#endregion
1120
+ //#region ../core/dist/dev/core/ui/time-slider/time-slider-data-attrs.js
1121
+ const TimeSliderDataAttrs = {
1122
+ ...SliderDataAttrs,
1123
+ seeking: "data-seeking"
1124
+ };
1125
+
1126
+ //#endregion
1127
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-core.js
1128
+ var TooltipCore = class TooltipCore {
1129
+ static defaultProps = {
1130
+ side: "top",
1131
+ align: "center",
1132
+ open: false,
1133
+ defaultOpen: false,
1134
+ delay: 600,
1135
+ closeDelay: 0,
1136
+ disableHoverablePopup: true,
1137
+ disabled: false
1138
+ };
1139
+ #props = { ...TooltipCore.defaultProps };
1140
+ constructor(props) {
1141
+ if (props) this.setProps(props);
1142
+ }
1143
+ setProps(props) {
1144
+ this.#props = defaults(props, TooltipCore.defaultProps);
1145
+ }
1146
+ #input = null;
1147
+ setInput(input) {
1148
+ this.#input = input;
1149
+ }
1150
+ getState() {
1151
+ const input = this.#input;
1152
+ return {
1153
+ open: input.active,
1154
+ status: input.status,
1155
+ side: this.#props.side,
1156
+ align: this.#props.align,
1157
+ ...getTransitionFlags(input.status)
1158
+ };
1159
+ }
1160
+ getPopupAttrs(_state) {
1161
+ return {
1162
+ popover: "manual",
1163
+ role: "presentation"
1164
+ };
1165
+ }
1166
+ };
1167
+
1168
+ //#endregion
1169
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-css-vars.js
1170
+ const TooltipCSSVars = {
1171
+ sideOffset: "--media-tooltip-side-offset",
1172
+ alignOffset: "--media-tooltip-align-offset",
1173
+ anchorWidth: "--media-tooltip-anchor-width",
1174
+ anchorHeight: "--media-tooltip-anchor-height",
1175
+ availableWidth: "--media-tooltip-available-width",
1176
+ availableHeight: "--media-tooltip-available-height"
1177
+ };
1178
+
1179
+ //#endregion
1180
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-data-attrs.js
1181
+ const TooltipDataAttrs = {
1182
+ open: "data-open",
1183
+ side: "data-side",
1184
+ align: "data-align",
1185
+ transitionStarting: "data-starting-style",
1186
+ transitionEnding: "data-ending-style"
1187
+ };
1188
+
1189
+ //#endregion
1190
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-group-core.js
1191
+ var TooltipGroupCore = class TooltipGroupCore {
1192
+ static defaultProps = {
1193
+ delay: 600,
1194
+ closeDelay: 0,
1195
+ timeout: 400
1196
+ };
1197
+ #props = { ...TooltipGroupCore.defaultProps };
1198
+ #lastCloseTime = 0;
1199
+ #isOpen = false;
1200
+ constructor(props) {
1201
+ if (props) this.setProps(props);
1202
+ }
1203
+ setProps(props) {
1204
+ this.#props = defaults(props, TooltipGroupCore.defaultProps);
1205
+ }
1206
+ get delay() {
1207
+ return this.#props.delay;
1208
+ }
1209
+ get closeDelay() {
1210
+ return this.#props.closeDelay;
1211
+ }
1212
+ shouldSkipDelay() {
1213
+ if (this.#isOpen) return true;
1214
+ return Date.now() - this.#lastCloseTime < this.#props.timeout;
1215
+ }
1216
+ notifyOpen() {
1217
+ this.#isOpen = true;
1218
+ }
1219
+ notifyClose() {
1220
+ this.#isOpen = false;
1221
+ this.#lastCloseTime = Date.now();
1222
+ }
1223
+ };
1224
+
1225
+ //#endregion
1226
+ //#region ../core/dist/dev/core/ui/volume-slider/volume-slider-core.js
1227
+ /** Volume-domain slider: maps media volume/mute state to slider state. */
1228
+ var VolumeSliderCore = class VolumeSliderCore extends SliderCore {
1229
+ static defaultProps = {
1230
+ ...SliderCore.defaultProps,
1231
+ label: "Volume",
1232
+ wheelStep: 5
1233
+ };
1234
+ #media = null;
1235
+ constructor(props) {
1236
+ super();
1237
+ if (props) this.setProps(props);
1238
+ }
1239
+ setProps(props) {
1240
+ super.setProps(defaults(props, VolumeSliderCore.defaultProps));
1241
+ }
1242
+ setMedia(media) {
1243
+ this.#media = media;
1244
+ }
1245
+ getState() {
1246
+ const media = this.#media;
1247
+ const { volume, muted } = media;
1248
+ const effectivelyMuted = muted || volume === 0;
1249
+ const { dragging, dragPercent } = this.input;
1250
+ const volumePercent = volume * 100;
1251
+ const value = dragging ? this.valueFromPercent(dragPercent) : volumePercent;
1252
+ const base = super.getSliderState(value);
1253
+ return {
1254
+ ...base,
1255
+ fillPercent: effectivelyMuted ? 0 : base.fillPercent,
1256
+ volume,
1257
+ muted: effectivelyMuted,
1258
+ availability: media.volumeAvailability
1259
+ };
1260
+ }
1261
+ /** Wheel step as a percentage of the slider range. */
1262
+ getWheelStepPercent() {
1263
+ const props = this.props;
1264
+ const range = props.max - props.min;
1265
+ return range > 0 ? props.wheelStep / range * 100 : 0;
1266
+ }
1267
+ getLabel(state) {
1268
+ return super.getLabel(state) || "Volume";
1269
+ }
1270
+ getAttrs(state) {
1271
+ const base = super.getAttrs(state);
1272
+ const valuetext = `${Math.round(state.value)} percent${state.muted ? ", muted" : ""}`;
1273
+ return {
1274
+ ...base,
1275
+ "aria-valuetext": valuetext
1276
+ };
1277
+ }
1278
+ };
1279
+
1280
+ //#endregion
1281
+ //#region ../core/dist/dev/core/ui/volume-slider/volume-slider-data-attrs.js
1282
+ const VolumeSliderDataAttrs = {
1283
+ ...SliderDataAttrs,
1284
+ availability: "data-availability"
1285
+ };
1286
+
1287
+ //#endregion
1288
+ //#region ../core/dist/dev/dom/store/selectors.js
1289
+ /** Select the buffer state (buffered ranges, percent buffered). */
1290
+ const selectBuffer = createSelector(bufferFeature);
1291
+ /** Select the cast state (cast connection state, availability). */
1292
+ const selectCast = createSelector(castFeature);
1293
+ /** Select the controls state (controls visible, user-active). */
1294
+ const selectControls = createSelector(controlsFeature);
1295
+ /** Select the error state (error, dismissed, dismissError). */
1296
+ const selectError = createSelector(errorFeature);
1297
+ /** Select the fullscreen state (fullscreen active, availability). */
1298
+ const selectFullscreen = createSelector(fullscreenFeature);
1299
+ /** Select the PiP state (picture-in-picture active, availability). */
1300
+ const selectPiP = createSelector(pipFeature);
1301
+ /** Select the playback state (paused, ended, play, pause, toggle). */
1302
+ const selectPlayback = createSelector(playbackFeature);
1303
+ /** Select the playback rate state (playbackRate, playbackRates, setPlaybackRate). */
1304
+ const selectPlaybackRate = createSelector(playbackRateFeature);
1305
+ /** Select the source state (src, type). */
1306
+ const selectSource = createSelector(sourceFeature);
1307
+ /** Select the text track state (chapters cues, thumbnail cues). */
1308
+ const selectTextTrack = createSelector(textTrackFeature);
1309
+ /** Select the time state (currentTime, duration, seek). */
1310
+ const selectTime = createSelector(timeFeature);
1311
+ /** Select the volume state (volume, muted, setVolume, setMuted). */
1312
+ const selectVolume = createSelector(volumeFeature);
1313
+
1314
+ //#endregion
1315
+ //#region ../core/dist/dev/dom/hotkey/aria.js
1316
+ const ARIA_MODIFIER_MAP = {
1317
+ shift: "Shift",
1318
+ ctrl: "Control",
1319
+ alt: "Alt",
1320
+ meta: "Meta"
1321
+ };
1322
+ const MODIFIER_ORDER = [
1323
+ "ctrl",
1324
+ "shift",
1325
+ "alt",
1326
+ "meta"
1327
+ ];
1328
+ /**
1329
+ * Convert parsed key bindings to a WAI-ARIA `aria-keyshortcuts` formatted string.
1330
+ *
1331
+ * @example
1332
+ * ```ts
1333
+ * toAriaKeyShortcut(parseHotkeyPattern('Ctrl+Shift+f'));
1334
+ * // "Control+Shift+f"
1335
+ *
1336
+ * toAriaKeyShortcut([...parseHotkeyPattern('k'), ...parseHotkeyPattern('Space')]);
1337
+ * // "k Space"
1338
+ * ```
1339
+ */
1340
+ function toAriaKeyShortcut(bindings) {
1341
+ return bindings.map((b) => {
1342
+ const parts = [];
1343
+ for (const mod of MODIFIER_ORDER) if (b.modifiers.has(mod)) parts.push(ARIA_MODIFIER_MAP[mod]);
1344
+ parts.push(b.originalKey);
1345
+ return parts.join("+");
1346
+ }).join(" ");
1347
+ }
1348
+
1349
+ //#endregion
1350
+ //#region ../core/dist/dev/dom/hotkey/coordinator.js
1351
+ var HotkeyCoordinator = class {
1352
+ #target;
1353
+ #bindings = [];
1354
+ #nextId = 0;
1355
+ #disconnect = null;
1356
+ #docDisconnect = null;
1357
+ /** Action name → bound keys. Controls query this to set `aria-keyshortcuts`. */
1358
+ #ariaRegistry = /* @__PURE__ */ new Map();
1359
+ #destroyed = false;
1360
+ constructor(target) {
1361
+ this.#target = target;
1362
+ }
1363
+ add(options) {
1364
+ const parsed = parseHotkeyPattern(options.keys);
1365
+ const binding = {
1366
+ parsed,
1367
+ options,
1368
+ id: this.#nextId++
1369
+ };
1370
+ this.#bindings.push(binding);
1371
+ this.#sortBindings();
1372
+ if (options.action) this.#addToAriaRegistry(options.action, parsed);
1373
+ if (options.target === "document") this.#connectDocument();
1374
+ else this.#connect();
1375
+ let removed = false;
1376
+ return () => {
1377
+ if (removed) return;
1378
+ removed = true;
1379
+ const idx = this.#bindings.indexOf(binding);
1380
+ if (idx !== -1) this.#bindings.splice(idx, 1);
1381
+ if (options.action) this.#removeFromAriaRegistry(options.action, parsed);
1382
+ this.#maybeDisconnect();
1383
+ };
1384
+ }
1385
+ getAriaKeys(action) {
1386
+ const bindings = this.#ariaRegistry.get(action);
1387
+ if (!bindings?.length) return void 0;
1388
+ return toAriaKeyShortcut(bindings);
1389
+ }
1390
+ destroy() {
1391
+ if (this.#destroyed) return;
1392
+ this.#destroyed = true;
1393
+ this.#disconnect?.abort();
1394
+ this.#disconnect = null;
1395
+ this.#docDisconnect?.abort();
1396
+ this.#docDisconnect = null;
1397
+ this.#bindings = [];
1398
+ this.#ariaRegistry.clear();
1399
+ }
1400
+ #sortBindings() {
1401
+ this.#bindings.sort((a, b) => {
1402
+ const specDiff = b.parsed[0].modifiers.size - a.parsed[0].modifiers.size;
1403
+ if (specDiff !== 0) return specDiff;
1404
+ return a.id - b.id;
1405
+ });
1406
+ }
1407
+ #connect() {
1408
+ if (this.#disconnect) return;
1409
+ this.#disconnect = new AbortController();
1410
+ listen(this.#target, "keydown", this.#handleEvent, { signal: this.#disconnect.signal });
1411
+ }
1412
+ #connectDocument() {
1413
+ if (this.#docDisconnect) return;
1414
+ this.#docDisconnect = new AbortController();
1415
+ listen(document, "keydown", this.#handleEvent, { signal: this.#docDisconnect.signal });
1416
+ }
1417
+ #maybeDisconnect() {
1418
+ const hasPlayer = this.#bindings.some((b) => b.options.target !== "document");
1419
+ const hasDoc = this.#bindings.some((b) => b.options.target === "document");
1420
+ if (!hasPlayer) {
1421
+ this.#disconnect?.abort();
1422
+ this.#disconnect = null;
1423
+ }
1424
+ if (!hasDoc) {
1425
+ this.#docDisconnect?.abort();
1426
+ this.#docDisconnect = null;
1427
+ }
1428
+ }
1429
+ #handleEvent = (event) => {
1430
+ if (event.key === "Unidentified") return;
1431
+ if (isInteractiveActivation(event)) return;
1432
+ const editable = isEditableTarget(event);
1433
+ for (const binding of this.#bindings) {
1434
+ const { options, parsed } = binding;
1435
+ if (options.disabled) continue;
1436
+ if (event.repeat && options.repeatable === false) continue;
1437
+ if (options.target === "document" !== (event.currentTarget === document)) continue;
1438
+ for (const p of parsed) {
1439
+ if (!matchesHotkeyEvent(p, event)) continue;
1440
+ if (editable && p.modifiers.size === 0) continue;
1441
+ event.preventDefault();
1442
+ options.onActivate(event, p.originalKey);
1443
+ return;
1444
+ }
1445
+ }
1446
+ };
1447
+ #addToAriaRegistry(action, bindings) {
1448
+ let existing = this.#ariaRegistry.get(action);
1449
+ if (!existing) {
1450
+ existing = [];
1451
+ this.#ariaRegistry.set(action, existing);
1452
+ }
1453
+ existing.push(...bindings);
1454
+ }
1455
+ #removeFromAriaRegistry(action, bindings) {
1456
+ const existing = this.#ariaRegistry.get(action);
1457
+ if (!existing) return;
1458
+ const filtered = existing.filter((b) => !bindings.includes(b));
1459
+ if (filtered.length === 0) this.#ariaRegistry.delete(action);
1460
+ else this.#ariaRegistry.set(action, filtered);
1461
+ }
1462
+ };
1463
+
1464
+ //#endregion
1465
+ //#region ../core/dist/dev/dom/hotkey/hotkey.js
1466
+ const MODIFIER_KEYS = new Set([
1467
+ "shift",
1468
+ "ctrl",
1469
+ "alt",
1470
+ "meta"
1471
+ ]);
1472
+ /**
1473
+ * Parse a key pattern string into one or more bindings.
1474
+ *
1475
+ * @example
1476
+ * ```ts
1477
+ * parseHotkeyPattern('>');
1478
+ * // [{ modifiers: Set(), key: '>', originalKey: '>' }]
1479
+ *
1480
+ * parseHotkeyPattern('0-9');
1481
+ * // 10 bindings, one per digit
1482
+ * ```
1483
+ */
1484
+ function parseHotkeyPattern(pattern) {
1485
+ if (pattern === "0-9") return Array.from({ length: 10 }, (_, i) => ({
1486
+ modifiers: /* @__PURE__ */ new Set(),
1487
+ key: String(i),
1488
+ originalKey: String(i)
1489
+ }));
1490
+ const segments = pattern.split("+");
1491
+ const rawKey = segments.pop();
1492
+ const modifiers = /* @__PURE__ */ new Set();
1493
+ for (const seg of segments) {
1494
+ const lower = seg.toLowerCase();
1495
+ if (lower === "mod") modifiers.add(isMacOS() ? "meta" : "ctrl");
1496
+ else if (MODIFIER_KEYS.has(lower)) modifiers.add(lower);
1497
+ else console.warn(`[vjs-hotkey] Unknown modifier: "${seg}" in pattern "${pattern}"`);
1498
+ }
1499
+ return [{
1500
+ modifiers,
1501
+ key: rawKey === "Space" ? " " : rawKey.toLowerCase(),
1502
+ originalKey: rawKey
1503
+ }];
1504
+ }
1505
+ /**
1506
+ * Single non-letter character — layout-dependent modifiers (Shift, Alt/Option)
1507
+ * were used to produce the character itself, not as deliberate modifiers
1508
+ * (e.g. Shift+. → ">", Option+Shift → ">" on some Mac layouts).
1509
+ * Letters excluded because Shift changes case intentionally (k vs K).
1510
+ * Named keys excluded because event.key.length > 1 (ArrowLeft, Tab, etc.).
1511
+ */
1512
+ function isImplicitModifierKey(key) {
1513
+ return key.length === 1 && !/[a-z]/i.test(key);
1514
+ }
1515
+ /** Whether a parsed binding matches a keyboard event. */
1516
+ function matchesHotkeyEvent(binding, event) {
1517
+ if (event.key === "Unidentified") return false;
1518
+ if (event.key.toLowerCase() !== binding.key) return false;
1519
+ const implicit = isImplicitModifierKey(event.key);
1520
+ const shiftKey = implicit ? event.shiftKey && binding.modifiers.has("shift") : event.shiftKey;
1521
+ const altKey = implicit ? event.altKey && binding.modifiers.has("alt") : event.altKey;
1522
+ if (shiftKey !== binding.modifiers.has("shift")) return false;
1523
+ if (event.ctrlKey !== binding.modifiers.has("ctrl")) return false;
1524
+ if (altKey !== binding.modifiers.has("alt")) return false;
1525
+ if (event.metaKey !== binding.modifiers.has("meta")) return false;
1526
+ return true;
1527
+ }
1528
+ const coordinators = /* @__PURE__ */ new WeakMap();
1529
+ /** Look up the coordinator for a target element, if one exists. */
1530
+ function findHotkeyCoordinator(target) {
1531
+ return coordinators.get(target);
1532
+ }
1533
+ function getCoordinator(target) {
1534
+ let coordinator = coordinators.get(target);
1535
+ if (!coordinator) {
1536
+ coordinator = new HotkeyCoordinator(target);
1537
+ coordinators.set(target, coordinator);
1538
+ }
1539
+ return coordinator;
1540
+ }
1541
+ /**
1542
+ * Register a hotkey binding on a target element.
1543
+ *
1544
+ * @example
1545
+ * ```ts
1546
+ * const cleanup = createHotkey(container, {
1547
+ * keys: 'k',
1548
+ * onActivate: () => store.paused ? store.play() : store.pause(),
1549
+ * });
1550
+ *
1551
+ * // Later: remove the binding
1552
+ * cleanup();
1553
+ * ```
1554
+ *
1555
+ * @returns A cleanup function that removes the binding.
1556
+ */
1557
+ function createHotkey(target, options) {
1558
+ return getCoordinator(target).add(options);
1559
+ }
1560
+
1561
+ //#endregion
1562
+ //#region ../core/dist/dev/dom/ui/dismiss-layer.js
1563
+ function createDismissLayer(options) {
1564
+ const { transition } = options;
1565
+ const state = transition.state;
1566
+ const abort = new AbortController();
1567
+ let docAbort = null;
1568
+ function open() {
1569
+ if (abort.signal.aborted) return null;
1570
+ const { active, status } = state.current;
1571
+ if (active && status !== "ending") return null;
1572
+ if (status === "ending") transition.cancel();
1573
+ return transition.open();
1574
+ }
1575
+ function close(element) {
1576
+ const { active, status } = state.current;
1577
+ if (abort.signal.aborted || !active || status === "ending") return null;
1578
+ return transition.close(element);
1579
+ }
1580
+ function setupDocumentListeners() {
1581
+ cleanupDocumentListeners();
1582
+ if (typeof document === "undefined") return;
1583
+ docAbort = new AbortController();
1584
+ const { signal } = docAbort;
1585
+ listen(document, "keydown", handleKeydown, { signal });
1586
+ options.onDocumentActive?.(signal);
1587
+ }
1588
+ function cleanupDocumentListeners() {
1589
+ docAbort?.abort();
1590
+ docAbort = null;
1591
+ }
1592
+ function handleKeydown(event) {
1593
+ if (event.key !== "Escape") return;
1594
+ if (!state.current.active) return;
1595
+ if (!(options.closeOnEscape?.() ?? true)) return;
1596
+ options.onEscapeDismiss(event);
1597
+ }
1598
+ const unsubscribe = state.subscribe(() => {
1599
+ if (state.current.active) setupDocumentListeners();
1600
+ else cleanupDocumentListeners();
1601
+ });
1602
+ abort.signal.addEventListener("abort", () => {
1603
+ unsubscribe();
1604
+ transition.destroy();
1605
+ cleanupDocumentListeners();
1606
+ });
1607
+ function destroy() {
1608
+ if (abort.signal.aborted) return;
1609
+ abort.abort();
1610
+ }
1611
+ return {
1612
+ input: state,
1613
+ open,
1614
+ close,
1615
+ signal: abort.signal,
1616
+ destroy
1617
+ };
1618
+ }
1619
+
1620
+ //#endregion
1621
+ //#region ../core/dist/dev/dom/ui/alert-dialog.js
1622
+ function createAlertDialog(options) {
1623
+ const { onOpenChange } = options;
1624
+ let element = null;
1625
+ let previousFocus = null;
1626
+ let elementAbort = null;
1627
+ const layer = createDismissLayer({
1628
+ transition: options.transition,
1629
+ closeOnEscape: options.closeOnEscape,
1630
+ onEscapeDismiss(event) {
1631
+ event.stopPropagation();
1632
+ applyClose();
1633
+ }
1634
+ });
1635
+ const state = layer.input;
1636
+ function applyOpen() {
1637
+ previousFocus = document.activeElement;
1638
+ const opening = layer.open();
1639
+ if (!opening) return;
1640
+ onOpenChange(true);
1641
+ requestAnimationFrame(() => {
1642
+ if (layer.signal.aborted || !state.current.active) return;
1643
+ element?.focus();
1644
+ });
1645
+ opening.then(() => {
1646
+ if (layer.signal.aborted || !state.current.active) return;
1647
+ options.onOpenChangeComplete?.(true);
1648
+ });
1649
+ }
1650
+ function applyClose() {
1651
+ const closing = layer.close(element);
1652
+ if (!closing) return;
1653
+ onOpenChange(false);
1654
+ closing.then(() => {
1655
+ if (layer.signal.aborted) return;
1656
+ if (previousFocus) {
1657
+ previousFocus.focus();
1658
+ previousFocus = null;
1659
+ }
1660
+ options.onOpenChangeComplete?.(false);
1661
+ });
1662
+ }
1663
+ function setupElementListeners() {
1664
+ cleanupElementListeners();
1665
+ if (!element) return;
1666
+ elementAbort = new AbortController();
1667
+ const { signal } = elementAbort;
1668
+ listen(element, "click", handleElementClick, { signal });
1669
+ }
1670
+ function cleanupElementListeners() {
1671
+ elementAbort?.abort();
1672
+ elementAbort = null;
1673
+ }
1674
+ function handleElementClick(event) {
1675
+ if (event.target instanceof HTMLButtonElement) applyClose();
1676
+ }
1677
+ function setElement(el) {
1678
+ element = el;
1679
+ setupElementListeners();
1680
+ }
1681
+ layer.signal.addEventListener("abort", () => {
1682
+ cleanupElementListeners();
1683
+ element = null;
1684
+ previousFocus = null;
1685
+ });
1686
+ return {
1687
+ input: state,
1688
+ open: applyOpen,
1689
+ close: applyClose,
1690
+ setElement,
1691
+ destroy: layer.destroy
1692
+ };
1693
+ }
1694
+
1695
+ //#endregion
1696
+ //#region ../core/dist/dev/dom/ui/button.js
1697
+ function createButton(options) {
1698
+ const { onActivate, isDisabled } = options;
1699
+ return {
1700
+ role: "button",
1701
+ tabIndex: 0,
1702
+ onClick(event) {
1703
+ if (isDisabled()) {
1704
+ event.preventDefault();
1705
+ return;
1706
+ }
1707
+ onActivate();
1708
+ },
1709
+ onPointerDown(event) {
1710
+ if (isDisabled()) event.preventDefault();
1711
+ },
1712
+ onMouseDown(event) {
1713
+ if (isDisabled()) event.preventDefault();
1714
+ },
1715
+ onKeyDown(event) {
1716
+ if (event.target !== event.currentTarget) return;
1717
+ if (isDisabled()) {
1718
+ if (event.key !== "Tab") event.preventDefault();
1719
+ return;
1720
+ }
1721
+ if (event.key === "Enter") {
1722
+ event.preventDefault();
1723
+ onActivate();
1724
+ } else if (event.key === " ") event.preventDefault();
1725
+ },
1726
+ onKeyUp(event) {
1727
+ if (event.target !== event.currentTarget) return;
1728
+ if (isDisabled()) return;
1729
+ if (event.key === " ") onActivate();
1730
+ }
1731
+ };
1732
+ }
1733
+
1734
+ //#endregion
1735
+ //#region ../core/dist/dev/dom/ui/popover/popover.js
1736
+ function createPopover(options) {
1737
+ const { onOpenChange, closeOnOutsideClick } = options;
1738
+ let triggerEl = null;
1739
+ let popupEl = null;
1740
+ let hoverTimeout = null;
1741
+ const capturedPointers = /* @__PURE__ */ new Set();
1742
+ const layer = createDismissLayer({
1743
+ transition: options.transition,
1744
+ closeOnEscape: options.closeOnEscape,
1745
+ onEscapeDismiss(event) {
1746
+ event.preventDefault();
1747
+ applyClose("escape", event);
1748
+ },
1749
+ onDocumentActive(signal) {
1750
+ listen(document, "pointerdown", handleDocumentPointerdown, {
1751
+ capture: true,
1752
+ signal
1753
+ });
1754
+ }
1755
+ });
1756
+ const state = layer.input;
1757
+ function clearHoverTimeout() {
1758
+ if (hoverTimeout !== null) {
1759
+ clearTimeout(hoverTimeout);
1760
+ hoverTimeout = null;
1761
+ }
1762
+ }
1763
+ function canHover() {
1764
+ return globalThis.matchMedia?.("(hover: hover)")?.matches ?? false;
1765
+ }
1766
+ function canOpenOnFocus() {
1767
+ if (!canHover()) return false;
1768
+ return globalThis.matchMedia?.("(pointer: fine)")?.matches ?? false;
1769
+ }
1770
+ function canToggleOnClick() {
1771
+ if (!options.openOnHover?.()) return true;
1772
+ return canHover();
1773
+ }
1774
+ /**
1775
+ * The transition handler manages animation lifecycle via `createState`:
1776
+ *
1777
+ * **Open:** `transition.open()` patches `{ active: true, status: 'starting' }`.
1778
+ * After one RAF it patches `{ status: 'idle' }` and the promise resolves.
1779
+ * Frameworks render `data-starting-style` / `data-ending-style` via
1780
+ * `getPopupAttrs(state)` — no imperative DOM mutation needed.
1781
+ *
1782
+ * **Close:** `transition.close(el)` patches `{ status: 'ending' }` (keeping
1783
+ * `active: true` so the element stays mounted). After a double-RAF it waits
1784
+ * for `getAnimations()` to settle, then patches `{ active: false, status: 'idle' }`.
1785
+ *
1786
+ * `onOpenChange` fires immediately (before animations).
1787
+ * `onOpenChangeComplete` fires after animations finish.
1788
+ */
1789
+ function applyOpen(reason, event) {
1790
+ const opening = layer.open();
1791
+ if (!opening) return;
1792
+ onOpenChange(true, event ? {
1793
+ reason,
1794
+ event
1795
+ } : { reason });
1796
+ opening.then(() => {
1797
+ if (layer.signal.aborted || !state.current.active) return;
1798
+ options.onOpenChangeComplete?.(true);
1799
+ });
1800
+ }
1801
+ function applyClose(reason, event) {
1802
+ const closing = layer.close(popupEl);
1803
+ if (!closing) return;
1804
+ onOpenChange(false, event ? {
1805
+ reason,
1806
+ event
1807
+ } : { reason });
1808
+ closing.then(() => {
1809
+ if (layer.signal.aborted) return;
1810
+ tryHidePopover(popupEl);
1811
+ options.onOpenChangeComplete?.(false);
1812
+ });
1813
+ }
1814
+ function open(reason = "click") {
1815
+ applyOpen(reason);
1816
+ }
1817
+ function close(reason = "click") {
1818
+ applyClose(reason);
1819
+ }
1820
+ function handleDocumentPointerdown(event) {
1821
+ if (!closeOnOutsideClick() || !state.current.active) return;
1822
+ const path = event.composedPath();
1823
+ if (triggerEl && path.includes(triggerEl) || popupEl && path.includes(popupEl)) return;
1824
+ applyClose("outside-click", event);
1825
+ }
1826
+ layer.signal.addEventListener("abort", () => {
1827
+ clearHoverTimeout();
1828
+ capturedPointers.clear();
1829
+ triggerEl = null;
1830
+ popupEl = null;
1831
+ });
1832
+ const triggerProps = {
1833
+ onClick(event) {
1834
+ if (!canToggleOnClick()) return;
1835
+ if (state.current.active && state.current.status !== "ending") applyClose("click", event);
1836
+ else applyOpen("click", event);
1837
+ },
1838
+ onPointerEnter(_event) {
1839
+ if (!options.openOnHover?.()) return;
1840
+ if (!canHover()) return;
1841
+ clearHoverTimeout();
1842
+ if (state.current.active) return;
1843
+ const delay = options.delay?.() ?? 300;
1844
+ hoverTimeout = setTimeout(() => applyOpen("hover"), delay);
1845
+ },
1846
+ onPointerLeave(_event) {
1847
+ if (!options.openOnHover?.()) return;
1848
+ if (!canHover()) return;
1849
+ clearHoverTimeout();
1850
+ if (!state.current.active) return;
1851
+ const closeDelay = options.closeDelay?.() ?? 0;
1852
+ hoverTimeout = setTimeout(() => applyClose("hover"), closeDelay);
1853
+ },
1854
+ onFocusIn(_event) {
1855
+ if (options.openOnHover?.()) {
1856
+ if (!canOpenOnFocus()) return;
1857
+ applyOpen("focus");
1858
+ }
1859
+ },
1860
+ onFocusOut(event) {
1861
+ const relatedTarget = event.relatedTarget;
1862
+ if (relatedTarget && (triggerEl?.contains(relatedTarget) || popupEl?.contains(relatedTarget))) return;
1863
+ if (options.openOnHover?.()) applyClose("blur");
1864
+ }
1865
+ };
1866
+ const popupProps = {
1867
+ onPointerEnter(_event) {
1868
+ if (!options.openOnHover?.()) return;
1869
+ clearHoverTimeout();
1870
+ },
1871
+ onPointerLeave(_event) {
1872
+ if (!options.openOnHover?.()) return;
1873
+ if (capturedPointers.size > 0) return;
1874
+ clearHoverTimeout();
1875
+ if (!state.current.active) return;
1876
+ const closeDelay = options.closeDelay?.() ?? 0;
1877
+ hoverTimeout = setTimeout(() => applyClose("hover"), closeDelay);
1878
+ },
1879
+ onGotPointerCapture(event) {
1880
+ capturedPointers.add(event.pointerId);
1881
+ },
1882
+ onLostPointerCapture(event) {
1883
+ capturedPointers.delete(event.pointerId);
1884
+ },
1885
+ onFocusOut(event) {
1886
+ const relatedTarget = event.relatedTarget;
1887
+ if (relatedTarget && (triggerEl?.contains(relatedTarget) || popupEl?.contains(relatedTarget))) return;
1888
+ applyClose("blur");
1889
+ }
1890
+ };
1891
+ function setTriggerElement(el) {
1892
+ triggerEl = el;
1893
+ }
1894
+ function setPopupElement(el) {
1895
+ if (!el && popupEl && state.current.active) tryHidePopover(popupEl);
1896
+ popupEl = el;
1897
+ if (el) {
1898
+ if (state.current.active) tryShowPopover(el);
1899
+ }
1900
+ }
1901
+ return {
1902
+ input: state,
1903
+ triggerProps,
1904
+ popupProps,
1905
+ get triggerElement() {
1906
+ return triggerEl;
1907
+ },
1908
+ setTriggerElement,
1909
+ setPopupElement,
1910
+ open,
1911
+ close,
1912
+ destroy: layer.destroy
1913
+ };
1914
+ }
1915
+
1916
+ //#endregion
1917
+ //#region ../core/dist/dev/dom/ui/popover/popover-positioning.js
1918
+ const OPPOSITE_SIDE = {
1919
+ top: "bottom",
1920
+ bottom: "top",
1921
+ left: "right",
1922
+ right: "left"
1923
+ };
1924
+ /**
1925
+ * Get positioning styles for the popup element.
1926
+ *
1927
+ * When the browser supports CSS Anchor Positioning, returns native CSS properties
1928
+ * that reference the provided CSS var names for side/align offsets — no JS offset
1929
+ * values needed.
1930
+ *
1931
+ * When rects are provided and anchor positioning is unsupported, falls back to
1932
+ * manual JS-computed positioning. The caller must resolve offset CSS vars via
1933
+ * `getComputedStyle` and pass them as `offsets`.
1934
+ *
1935
+ * Returns camelCase keys for standard CSS properties and `--*` keys for
1936
+ * custom properties — compatible with both React's `style` prop and
1937
+ * `applyStyles()` from `@videojs/utils/dom`.
1938
+ */
1939
+ 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"
1950
+ };
1951
+ return {};
1952
+ }
1953
+ /** Generate style to set on the trigger for CSS Anchor Positioning. */
1954
+ function getAnchorNameStyle(anchorName) {
1955
+ if (!supportsAnchorPositioning()) return {};
1956
+ return { anchorName: `--${anchorName}` };
1957
+ }
1958
+ function getAnchorPositionCSS(anchorName, opts, cssVars = PopoverCSSVars) {
1959
+ const SIDE_OFFSET_VAR = `var(${cssVars.sideOffset}, 0px)`;
1960
+ const ALIGN_OFFSET_VAR = `var(${cssVars.alignOffset}, 0px)`;
1961
+ const { side, align } = opts;
1962
+ const style = {
1963
+ positionAnchor: `--${anchorName}`,
1964
+ position: "fixed",
1965
+ inset: "auto",
1966
+ margin: "0",
1967
+ justifySelf: "normal",
1968
+ alignSelf: "normal",
1969
+ marginInlineStart: "0",
1970
+ marginBlockStart: "0"
1971
+ };
1972
+ const insetProp = OPPOSITE_SIDE[side];
1973
+ if (side === "top" || side === "bottom") {
1974
+ style[insetProp] = `calc(anchor(${side}) + ${SIDE_OFFSET_VAR})`;
1975
+ if (align === "start") style.left = `calc(anchor(left) + ${ALIGN_OFFSET_VAR})`;
1976
+ else if (align === "end") style.right = `calc(anchor(right) + ${ALIGN_OFFSET_VAR})`;
1977
+ else {
1978
+ style.justifySelf = "anchor-center";
1979
+ style.marginInlineStart = ALIGN_OFFSET_VAR;
1980
+ }
1981
+ } else {
1982
+ style[insetProp] = `calc(anchor(${side}) + ${SIDE_OFFSET_VAR})`;
1983
+ if (align === "start") style.top = `calc(anchor(top) + ${ALIGN_OFFSET_VAR})`;
1984
+ else if (align === "end") style.bottom = `calc(anchor(bottom) + ${ALIGN_OFFSET_VAR})`;
1985
+ else {
1986
+ style.alignSelf = "anchor-center";
1987
+ style.marginBlockStart = ALIGN_OFFSET_VAR;
1988
+ }
1989
+ }
1990
+ return style;
1991
+ }
1992
+ /**
1993
+ * Compute CSS variables for sizing constraints relative to the anchor/boundary.
1994
+ *
1995
+ * Accepts a `cssVars` map so the same logic works for both popover
1996
+ * (`--media-popover-*`) and tooltip (`--media-tooltip-*`) namespaces.
1997
+ */
1998
+ function getPositioningCSSVars(triggerRect, boundaryRect, side, cssVars = PopoverCSSVars) {
1999
+ const vars = {};
2000
+ vars[cssVars.anchorWidth] = `${triggerRect.width}px`;
2001
+ vars[cssVars.anchorHeight] = `${triggerRect.height}px`;
2002
+ 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`;
2005
+ } else {
2006
+ vars[cssVars.availableWidth] = side === "left" ? `${triggerRect.left - boundaryRect.left}px` : `${boundaryRect.right - triggerRect.right}px`;
2007
+ vars[cssVars.availableHeight] = `${boundaryRect.height}px`;
2008
+ }
2009
+ return vars;
2010
+ }
2011
+ /**
2012
+ * Compute manual positioning when CSS Anchor Positioning is not supported.
2013
+ *
2014
+ * Returns inline `top`/`left` styles in **viewport coordinates** for use
2015
+ * with `position: fixed` (the popup is in the top layer). All rects from
2016
+ * `getBoundingClientRect()` are already viewport-relative.
2017
+ *
2018
+ * Offsets are resolved by the caller from CSS custom properties via
2019
+ * `getComputedStyle()` and passed as `offsets`.
2020
+ */
2021
+ function getManualPositionStyle(triggerRect, popupRect, opts, offsets = {
2022
+ sideOffset: 0,
2023
+ alignOffset: 0
2024
+ }) {
2025
+ const { side, align } = opts;
2026
+ const { sideOffset, alignOffset } = offsets;
2027
+ let top = 0;
2028
+ let left = 0;
2029
+ if (side === "top") top = triggerRect.top - popupRect.height - sideOffset;
2030
+ else if (side === "bottom") top = triggerRect.bottom + sideOffset;
2031
+ else if (side === "left") left = triggerRect.left - popupRect.width - sideOffset;
2032
+ else left = triggerRect.right + sideOffset;
2033
+ if (side === "top" || side === "bottom") if (align === "start") left = triggerRect.left + alignOffset;
2034
+ else if (align === "end") left = triggerRect.right - popupRect.width + alignOffset;
2035
+ else left = triggerRect.left + (triggerRect.width - popupRect.width) / 2 + alignOffset;
2036
+ else if (align === "start") top = triggerRect.top + alignOffset;
2037
+ else if (align === "end") top = triggerRect.bottom - popupRect.height + alignOffset;
2038
+ else top = triggerRect.top + (triggerRect.height - popupRect.height) / 2 + alignOffset;
2039
+ return {
2040
+ top: `${top}px`,
2041
+ left: `${left}px`
2042
+ };
2043
+ }
2044
+ /**
2045
+ * Read side-offset and align-offset CSS custom properties from the
2046
+ * popup element's computed style, returning numeric pixel values.
2047
+ */
2048
+ function resolveOffsets(el, cssVars = PopoverCSSVars) {
2049
+ const computed = getComputedStyle(el);
2050
+ return {
2051
+ sideOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.sideOffset)),
2052
+ alignOffset: resolveCSSLength(el, computed.getPropertyValue(cssVars.alignOffset))
2053
+ };
2054
+ }
2055
+ /**
2056
+ * Measure the popup's layout box for positioning.
2057
+ *
2058
+ * `getBoundingClientRect()` includes active transforms, which causes the
2059
+ * fallback position to drift while opening/closing animations scale the popup.
2060
+ * Using `offsetWidth`/`offsetHeight` preserves the untransformed size.
2061
+ */
2062
+ function getPopupPositionRect(el) {
2063
+ const rect = el.getBoundingClientRect();
2064
+ const width = el.offsetWidth || rect.width;
2065
+ 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
+ };
2077
+ }
2078
+
2079
+ //#endregion
2080
+ //#region ../core/dist/dev/dom/utils/pointer.js
2081
+ /** Convert a pointer event position to a 0–100 percent along an element's rect. */
2082
+ function getPercentFromPointerEvent(event, rect, orientation, isRTL) {
2083
+ let ratio;
2084
+ if (orientation === "vertical") ratio = 1 - (event.clientY - rect.top) / rect.height;
2085
+ else if (isRTL) ratio = (rect.right - event.clientX) / rect.width;
2086
+ else ratio = (event.clientX - rect.left) / rect.width;
2087
+ if (!Number.isFinite(ratio)) return 0;
2088
+ return clamp(ratio * 100, 0, 100);
2089
+ }
2090
+
2091
+ //#endregion
2092
+ //#region ../core/dist/dev/dom/ui/slider.js
2093
+ function createSlider(options) {
2094
+ const input = createState({
2095
+ pointerPercent: 0,
2096
+ dragPercent: 0,
2097
+ dragging: false,
2098
+ pointing: false,
2099
+ focused: false
2100
+ });
2101
+ const abort = new AbortController();
2102
+ const changeThrottleMs = options.changeThrottle ?? 0;
2103
+ let isDragging = false, cachedRTL = false, cachedRect = null, capturedPointerId = null, lastDragPercent = 0, committedOnRelease = false;
2104
+ const throttledChange = changeThrottleMs > 0 ? throttle((percent) => options.onValueChange?.(percent), changeThrottleMs, { leading: true }) : null;
2105
+ /** Fire `onValueChange` — throttled during drag when `changeThrottle > 0`. */
2106
+ function fireChange(percent, duringDrag) {
2107
+ if (duringDrag && throttledChange) throttledChange(percent);
2108
+ else options.onValueChange?.(percent);
2109
+ }
2110
+ function releaseCapture() {
2111
+ if (isNull(capturedPointerId)) return;
2112
+ const id = capturedPointerId;
2113
+ capturedPointerId = null;
2114
+ try {
2115
+ options.getElement().releasePointerCapture(id);
2116
+ } catch {}
2117
+ }
2118
+ function endDrag() {
2119
+ if (!isDragging) input.patch({ pointing: false });
2120
+ else {
2121
+ if (!committedOnRelease) options.onValueCommit?.(lastDragPercent);
2122
+ isDragging = false;
2123
+ input.patch({
2124
+ dragging: false,
2125
+ pointing: false
2126
+ });
2127
+ options.onDragEnd?.();
2128
+ }
2129
+ committedOnRelease = false;
2130
+ cleanup();
2131
+ }
2132
+ function cleanup() {
2133
+ throttledChange?.cancel();
2134
+ capturedPointerId = null;
2135
+ cachedRect = null;
2136
+ }
2137
+ const rootProps = {
2138
+ onPointerDown(event) {
2139
+ if (options.isDisabled()) return;
2140
+ event.stopPropagation();
2141
+ event.preventDefault();
2142
+ const el = options.getElement();
2143
+ cachedRect = el.getBoundingClientRect();
2144
+ cachedRTL = options.isRTL();
2145
+ committedOnRelease = false;
2146
+ releaseCapture();
2147
+ capturedPointerId = event.pointerId;
2148
+ el.setPointerCapture(event.pointerId);
2149
+ const percent = getPercentFromPointerEvent(event, cachedRect, options.getOrientation(), cachedRTL);
2150
+ isDragging = true;
2151
+ lastDragPercent = percent;
2152
+ input.patch({
2153
+ pointing: true,
2154
+ dragging: true,
2155
+ pointerPercent: percent,
2156
+ dragPercent: percent
2157
+ });
2158
+ options.onDragStart?.();
2159
+ options.onValueChange?.(percent);
2160
+ options.getThumbElement?.()?.focus({
2161
+ preventScroll: true,
2162
+ focusVisible: false
2163
+ });
2164
+ },
2165
+ onPointerMove(event) {
2166
+ if (options.isDisabled()) return;
2167
+ if (!isNull(capturedPointerId)) {
2168
+ if (event.pointerType !== "touch" && event.buttons === 0) {
2169
+ endDrag();
2170
+ return;
2171
+ }
2172
+ const percent = getPercentFromPointerEvent(event, cachedRect, options.getOrientation(), cachedRTL);
2173
+ lastDragPercent = percent;
2174
+ input.patch({
2175
+ dragPercent: percent,
2176
+ pointerPercent: percent
2177
+ });
2178
+ fireChange(percent, true);
2179
+ return;
2180
+ }
2181
+ const percent = getPercentFromPointerEvent(event, options.getElement().getBoundingClientRect(), options.getOrientation(), options.isRTL());
2182
+ input.patch({
2183
+ pointing: true,
2184
+ pointerPercent: percent
2185
+ });
2186
+ },
2187
+ onPointerUp(event) {
2188
+ if (options.isDisabled()) return;
2189
+ event.stopPropagation();
2190
+ if (isNull(capturedPointerId)) return;
2191
+ const percent = getPercentFromPointerEvent(event, cachedRect, options.getOrientation(), cachedRTL);
2192
+ throttledChange?.cancel();
2193
+ options.onValueChange?.(percent);
2194
+ options.onValueCommit?.(percent);
2195
+ committedOnRelease = true;
2196
+ },
2197
+ onPointerLeave() {
2198
+ if (!isNull(capturedPointerId)) return;
2199
+ input.patch({ pointing: false });
2200
+ },
2201
+ onLostPointerCapture() {
2202
+ endDrag();
2203
+ }
2204
+ };
2205
+ const thumbProps = {
2206
+ onKeyDown(event) {
2207
+ if (options.isDisabled()) {
2208
+ if (event.key !== "Tab") event.preventDefault();
2209
+ return;
2210
+ }
2211
+ const stepPercent = options.getStepPercent();
2212
+ const largeStepPercent = options.getLargeStepPercent();
2213
+ const rounded = roundToStep(options.getPercent(), stepPercent, 0);
2214
+ const horizontalSign = options.isRTL() ? -1 : 1;
2215
+ const step = event.shiftKey ? largeStepPercent : stepPercent;
2216
+ let newPercent = null;
2217
+ switch (event.key) {
2218
+ case "ArrowRight":
2219
+ newPercent = rounded + step * horizontalSign;
2220
+ break;
2221
+ case "ArrowLeft":
2222
+ newPercent = rounded - step * horizontalSign;
2223
+ break;
2224
+ case "ArrowUp":
2225
+ newPercent = rounded + step;
2226
+ break;
2227
+ case "ArrowDown":
2228
+ newPercent = rounded - step;
2229
+ break;
2230
+ case "PageUp":
2231
+ newPercent = rounded + largeStepPercent;
2232
+ break;
2233
+ case "PageDown":
2234
+ newPercent = rounded - largeStepPercent;
2235
+ break;
2236
+ case "Home":
2237
+ newPercent = 0;
2238
+ break;
2239
+ case "End":
2240
+ newPercent = 100;
2241
+ break;
2242
+ default:
2243
+ if (!event.metaKey && !event.ctrlKey && !event.altKey && event.key >= "0" && event.key <= "9") newPercent = Number(event.key) * 10;
2244
+ break;
2245
+ }
2246
+ if (newPercent !== null) {
2247
+ event.preventDefault();
2248
+ newPercent = clamp(newPercent, 0, 100);
2249
+ input.patch({
2250
+ pointerPercent: newPercent,
2251
+ dragPercent: newPercent
2252
+ });
2253
+ options.onValueChange?.(newPercent);
2254
+ options.onValueCommit?.(newPercent);
2255
+ }
2256
+ },
2257
+ onFocus() {
2258
+ input.patch({ focused: true });
2259
+ },
2260
+ onBlur() {
2261
+ input.patch({ focused: false });
2262
+ }
2263
+ };
2264
+ function adjustForAlignment(state) {
2265
+ if (!options.adjustPercent || state.thumbAlignment !== "edge") return state;
2266
+ const rootEl = options.getElement();
2267
+ const thumbEl = options.getThumbElement?.();
2268
+ if (!thumbEl) return state;
2269
+ const isHorizontal = state.orientation === "horizontal";
2270
+ const thumbSize = isHorizontal ? thumbEl.offsetWidth : thumbEl.offsetHeight;
2271
+ const trackSize = isHorizontal ? rootEl.offsetWidth : rootEl.offsetHeight;
2272
+ return {
2273
+ ...state,
2274
+ fillPercent: options.adjustPercent(state.fillPercent, thumbSize, trackSize),
2275
+ pointerPercent: options.adjustPercent(state.pointerPercent, thumbSize, trackSize)
2276
+ };
2277
+ }
2278
+ let resizeObserver = null;
2279
+ if (options.onResize) {
2280
+ resizeObserver = new ResizeObserver(() => options.onResize());
2281
+ resizeObserver.observe(options.getElement());
2282
+ }
2283
+ return {
2284
+ input,
2285
+ rootProps,
2286
+ rootStyle: {
2287
+ touchAction: "none",
2288
+ userSelect: "none"
2289
+ },
2290
+ thumbProps,
2291
+ adjustForAlignment,
2292
+ destroy() {
2293
+ if (abort.signal.aborted) return;
2294
+ abort.abort();
2295
+ resizeObserver?.disconnect();
2296
+ releaseCapture();
2297
+ cleanup();
2298
+ }
2299
+ };
2300
+ }
2301
+
2302
+ //#endregion
2303
+ //#region ../core/dist/dev/dom/ui/slider-css-vars.js
2304
+ function getSliderCSSVars(state) {
2305
+ return {
2306
+ [SliderCSSVars.fill]: `${state.fillPercent.toFixed(3)}%`,
2307
+ [SliderCSSVars.pointer]: `${state.pointerPercent.toFixed(3)}%`
2308
+ };
2309
+ }
2310
+ function getTimeSliderCSSVars(state) {
2311
+ return {
2312
+ ...getSliderCSSVars(state),
2313
+ [SliderCSSVars.buffer]: `${state.bufferPercent.toFixed(3)}%`
2314
+ };
2315
+ }
2316
+ /** Compute structural positioning styles for a slider preview element. */
2317
+ function getSliderPreviewStyle(width, overflow) {
2318
+ const halfWidth = width / 2;
2319
+ return {
2320
+ position: "absolute",
2321
+ left: overflow === "visible" ? `calc(var(${SliderCSSVars.pointer}) - ${halfWidth}px)` : `min(max(0px, calc(var(${SliderCSSVars.pointer}) - ${halfWidth}px)), calc(100% - ${width}px))`,
2322
+ width: "max-content",
2323
+ pointerEvents: "none"
2324
+ };
2325
+ }
2326
+
2327
+ //#endregion
2328
+ //#region ../core/dist/dev/dom/ui/thumbnail.js
2329
+ function createThumbnail(options) {
2330
+ const { getContainer, getImg, onStateChange } = options;
2331
+ const core = new ThumbnailCore();
2332
+ const abort = new AbortController();
2333
+ const signal = abort.signal;
2334
+ let loading = false;
2335
+ let error = false;
2336
+ let naturalWidth = 0;
2337
+ let naturalHeight = 0;
2338
+ let lastSrc = "";
2339
+ let imgBound = false;
2340
+ let resizeObserver = null;
2341
+ function onImgLoad() {
2342
+ const img = getImg();
2343
+ if (img) {
2344
+ naturalWidth = img.naturalWidth;
2345
+ naturalHeight = img.naturalHeight;
2346
+ }
2347
+ loading = false;
2348
+ error = false;
2349
+ onStateChange();
2350
+ }
2351
+ function onImgError() {
2352
+ loading = false;
2353
+ error = true;
2354
+ onStateChange();
2355
+ }
2356
+ function bindImg(img) {
2357
+ listen(img, "load", onImgLoad, { signal });
2358
+ listen(img, "error", onImgError, { signal });
2359
+ }
2360
+ function ensureBindings() {
2361
+ if (!imgBound) {
2362
+ const img = getImg();
2363
+ if (img) {
2364
+ bindImg(img);
2365
+ imgBound = true;
2366
+ }
2367
+ }
2368
+ if (!resizeObserver) {
2369
+ const container = getContainer();
2370
+ if (container) {
2371
+ resizeObserver = new ResizeObserver(onStateChange);
2372
+ resizeObserver.observe(container);
2373
+ }
2374
+ }
2375
+ }
2376
+ function updateSrc(url) {
2377
+ ensureBindings();
2378
+ const src = url ?? "";
2379
+ if (src === lastSrc) return;
2380
+ lastSrc = src;
2381
+ if (src) {
2382
+ loading = true;
2383
+ error = false;
2384
+ } else {
2385
+ loading = false;
2386
+ error = false;
2387
+ naturalWidth = 0;
2388
+ naturalHeight = 0;
2389
+ }
2390
+ }
2391
+ function connect() {
2392
+ ensureBindings();
2393
+ const img = getImg();
2394
+ if (img?.complete && lastSrc) {
2395
+ if (img.naturalWidth > 0) {
2396
+ naturalWidth = img.naturalWidth;
2397
+ naturalHeight = img.naturalHeight;
2398
+ loading = false;
2399
+ error = false;
2400
+ } else {
2401
+ loading = false;
2402
+ error = true;
2403
+ }
2404
+ onStateChange();
2405
+ }
2406
+ }
2407
+ function destroy() {
2408
+ abort.abort();
2409
+ resizeObserver?.disconnect();
2410
+ resizeObserver = null;
2411
+ }
2412
+ return {
2413
+ get loading() {
2414
+ return loading;
2415
+ },
2416
+ get error() {
2417
+ return error;
2418
+ },
2419
+ get naturalWidth() {
2420
+ return naturalWidth;
2421
+ },
2422
+ get naturalHeight() {
2423
+ return naturalHeight;
2424
+ },
2425
+ readConstraints() {
2426
+ const el = getContainer();
2427
+ if (!el) return {
2428
+ minWidth: 0,
2429
+ maxWidth: Infinity,
2430
+ minHeight: 0,
2431
+ maxHeight: Infinity
2432
+ };
2433
+ return core.parseConstraints(getComputedStyle(el));
2434
+ },
2435
+ updateSrc,
2436
+ connect,
2437
+ destroy
2438
+ };
2439
+ }
2440
+
2441
+ //#endregion
2442
+ //#region ../core/dist/dev/dom/ui/tooltip/tooltip.js
2443
+ /** Map popover reasons to tooltip reasons, filtering out click/outside-click. */
2444
+ const REASON_MAP = {
2445
+ hover: "hover",
2446
+ focus: "focus",
2447
+ escape: "escape",
2448
+ blur: "blur"
2449
+ };
2450
+ function createTooltip(options) {
2451
+ const popoverOpts = {
2452
+ transition: options.transition,
2453
+ onOpenChange(open, details) {
2454
+ const reason = REASON_MAP[details.reason];
2455
+ if (!reason) return;
2456
+ const group = options.group?.();
2457
+ if (open) group?.notifyOpen();
2458
+ else group?.notifyClose();
2459
+ const tooltipDetails = details.event ? {
2460
+ reason,
2461
+ event: details.event
2462
+ } : { reason };
2463
+ options.onOpenChange(open, tooltipDetails);
2464
+ },
2465
+ closeOnEscape: () => true,
2466
+ closeOnOutsideClick: () => false,
2467
+ openOnHover: () => true,
2468
+ delay: () => {
2469
+ const group = options.group?.();
2470
+ if (group?.shouldSkipDelay()) return 0;
2471
+ return options.delay?.() ?? group?.delay ?? 600;
2472
+ },
2473
+ closeDelay: () => {
2474
+ const group = options.group?.();
2475
+ return options.closeDelay?.() ?? group?.closeDelay ?? 0;
2476
+ }
2477
+ };
2478
+ if (options.onOpenChangeComplete) popoverOpts.onOpenChangeComplete = options.onOpenChangeComplete;
2479
+ const popover = createPopover(popoverOpts);
2480
+ let isPointerDown = false;
2481
+ const { onClick: _, ...baseTriggerProps } = popover.triggerProps;
2482
+ const triggerProps = {
2483
+ ...baseTriggerProps,
2484
+ onPointerDown() {
2485
+ isPointerDown = true;
2486
+ },
2487
+ onPointerEnter(event) {
2488
+ if (options.disabled?.()) return;
2489
+ if (event.pointerType === "touch") return;
2490
+ baseTriggerProps.onPointerEnter(event);
2491
+ },
2492
+ onFocusIn(event) {
2493
+ if (options.disabled?.()) return;
2494
+ if (isPointerDown) {
2495
+ isPointerDown = false;
2496
+ return;
2497
+ }
2498
+ baseTriggerProps.onFocusIn(event);
2499
+ }
2500
+ };
2501
+ const popupProps = {
2502
+ ...popover.popupProps,
2503
+ onPointerEnter(event) {
2504
+ if (options.disableHoverablePopup?.()) return;
2505
+ popover.popupProps.onPointerEnter(event);
2506
+ }
2507
+ };
2508
+ return {
2509
+ ...popover,
2510
+ triggerProps,
2511
+ popupProps,
2512
+ get triggerElement() {
2513
+ return popover.triggerElement;
2514
+ },
2515
+ open: () => popover.open("hover"),
2516
+ close: () => popover.close("hover")
2517
+ };
2518
+ }
2519
+
2520
+ //#endregion
2521
+ //#region ../core/dist/dev/dom/ui/transition.js
2522
+ /**
2523
+ * Manages open/close transition lifecycle via `createState`.
2524
+ *
2525
+ * **Open:** patches `{ active: true, status: 'starting' }`, then after a
2526
+ * double-RAF patches `{ status: 'idle' }` so the browser paints the
2527
+ * initial ("from") state before transitioning.
2528
+ *
2529
+ * **Close:** patches `{ status: 'ending' }` (keeping `active: true` so the
2530
+ * element stays mounted), then after a double-RAF waits for
2531
+ * `getAnimations()` to settle before patching `{ active: false, status: 'idle' }`.
2532
+ */
2533
+ function createTransition() {
2534
+ const state = createState({
2535
+ active: false,
2536
+ status: "idle"
2537
+ });
2538
+ let destroyed = false;
2539
+ let rafId1 = 0;
2540
+ let rafId2 = 0;
2541
+ function open() {
2542
+ cancelAnimationFrame(rafId1);
2543
+ cancelAnimationFrame(rafId2);
2544
+ rafId1 = 0;
2545
+ rafId2 = 0;
2546
+ state.patch({
2547
+ active: true,
2548
+ status: "starting"
2549
+ });
2550
+ return new Promise((resolve) => {
2551
+ rafId1 = requestAnimationFrame(() => {
2552
+ rafId1 = 0;
2553
+ rafId2 = requestAnimationFrame(() => {
2554
+ rafId2 = 0;
2555
+ if (destroyed || !state.current.active) return resolve();
2556
+ state.patch({ status: "idle" });
2557
+ resolve();
2558
+ });
2559
+ });
2560
+ });
2561
+ }
2562
+ function close(el) {
2563
+ cancelAnimationFrame(rafId1);
2564
+ cancelAnimationFrame(rafId2);
2565
+ rafId1 = 0;
2566
+ rafId2 = 0;
2567
+ state.patch({ status: "ending" });
2568
+ return new Promise((resolve) => {
2569
+ rafId1 = requestAnimationFrame(() => {
2570
+ rafId1 = 0;
2571
+ rafId2 = requestAnimationFrame(() => {
2572
+ rafId2 = 0;
2573
+ if (destroyed) return resolve();
2574
+ waitForAnimations(el).finally(() => {
2575
+ if (destroyed || state.current.status !== "ending") return resolve();
2576
+ state.patch({
2577
+ active: false,
2578
+ status: "idle"
2579
+ });
2580
+ resolve();
2581
+ });
2582
+ });
2583
+ });
2584
+ });
2585
+ }
2586
+ function cancel() {
2587
+ cancelAnimationFrame(rafId1);
2588
+ cancelAnimationFrame(rafId2);
2589
+ rafId1 = 0;
2590
+ rafId2 = 0;
2591
+ if (state.current.status !== "idle") state.patch({ status: "idle" });
2592
+ }
2593
+ return {
2594
+ state,
2595
+ open,
2596
+ close,
2597
+ cancel,
2598
+ destroy() {
2599
+ if (destroyed) return;
2600
+ destroyed = true;
2601
+ cancel();
2602
+ }
2603
+ };
2604
+ }
2605
+ function waitForAnimations(el) {
2606
+ if (!el) return Promise.resolve();
2607
+ const animations = el.getAnimations?.() ?? [];
2608
+ if (animations.length === 0) return Promise.resolve();
2609
+ return Promise.all(animations.map((a) => a.finished)).then(noop, noop);
2610
+ }
2611
+
2612
+ //#endregion
2613
+ //#region ../core/dist/dev/dom/ui/wheel-step.js
2614
+ function createWheelStep(options) {
2615
+ return { onWheel(event) {
2616
+ if (options.isDisabled()) return;
2617
+ const direction = Math.sign(event.deltaY);
2618
+ if (direction === 0) return;
2619
+ event.preventDefault();
2620
+ const stepPercent = options.getStepPercent();
2621
+ const newPercent = clamp(options.getPercent() - direction * stepPercent, 0, 100);
2622
+ options.onValueChange?.(newPercent);
2623
+ } };
2624
+ }
2625
+
2626
+ //#endregion
2627
+ //#region ../core/dist/dev/dom/utils/element-props.js
2628
+ /**
2629
+ * Apply props to a DOM element.
2630
+ *
2631
+ * Handles both attributes and event listeners:
2632
+ * - Event props (onClick, onKeyDown, etc.) are attached as listeners
2633
+ * - Boolean props: `true` sets empty attribute, `false` removes
2634
+ * - `undefined` removes the attribute
2635
+ * - Other props are set as string attributes
2636
+ */
2637
+ function applyElementProps(element, props, options) {
2638
+ const signal = options?.signal;
2639
+ for (const [key, value] of Object.entries(props)) if (isFunction(value) && key.startsWith("on")) listen(element, key.slice(2).toLowerCase(), value, signal ? { signal } : void 0);
2640
+ else if (isUndefined(value) || value === false) element.removeAttribute(key);
2641
+ else if (value === true) element.setAttribute(key, "");
2642
+ else element.setAttribute(key, String(value));
2643
+ }
2644
+
2645
+ //#endregion
2646
+ //#region ../core/dist/dev/dom/utils/log.js
2647
+ const warned = /* @__PURE__ */ new Set();
2648
+ function logMissingFeature(displayName, featureName) {
2649
+ const key = `${displayName}:${featureName}`;
2650
+ if (warned.has(key)) return;
2651
+ warned.add(key);
2652
+ console.warn(`${displayName} requires ${featureName} feature`);
2653
+ }
2654
+
2655
+ //#endregion
2656
+ //#region ../core/dist/dev/dom/utils/state-data-attrs.js
2657
+ /**
2658
+ * Apply state as data attributes to an element.
2659
+ *
2660
+ * - `true` → sets `data-keyname=""`
2661
+ * - truthy string/number → sets `data-keyname="value"`
2662
+ * - falsy → removes the attribute
2663
+ *
2664
+ * @example
2665
+ * ```ts
2666
+ * const state = { paused: true, ended: false };
2667
+ * applyStateDataAttrs(element, state);
2668
+ * // element has data-paused="", data-ended is removed
2669
+ * ```
2670
+ */
2671
+ function applyStateDataAttrs(element, state, map) {
2672
+ for (const key in state) {
2673
+ if (map && !(key in map)) continue;
2674
+ const name = map?.[key] ?? toDataAttrName(key), value = state[key];
2675
+ if (value === true) element.setAttribute(name, "");
2676
+ else if (value) element.setAttribute(name, String(value));
2677
+ else element.removeAttribute(name);
2678
+ }
2679
+ }
2680
+ function toDataAttrName(key) {
2681
+ return `data-${key.toLowerCase()}`;
2682
+ }
2683
+
2684
+ //#endregion
2685
+ //#region src/ui/hotkey/aria-key-shortcuts-controller.ts
2686
+ /** Provides `aria-keyshortcuts` for a given hotkey action name. */
2687
+ var AriaKeyShortcutsController = class {
2688
+ #action;
2689
+ #container;
2690
+ constructor(host, action) {
2691
+ this.#action = action;
2692
+ this.#container = new ContextConsumer(host, {
2693
+ context: containerContext,
2694
+ subscribe: true
2695
+ });
2696
+ host.addController(this);
2697
+ }
2698
+ get value() {
2699
+ const container = this.#container.value?.container;
2700
+ if (!container) return void 0;
2701
+ return findHotkeyCoordinator(container)?.getAriaKeys(this.#action);
2702
+ }
2703
+ hostConnected() {}
2704
+ hostDisconnected() {}
2705
+ };
2706
+
2707
+ //#endregion
2708
+ //#region src/ui/media-button-element.ts
2709
+ /** Abstract base for HTML custom elements that render a media-control button. */
2710
+ var MediaButtonElement = class extends MediaElement {
2711
+ constructor(..._args) {
2712
+ super(..._args);
2713
+ this.disabled = false;
2714
+ this.label = "";
2715
+ this.hotkeyAction = void 0;
2716
+ }
2717
+ static {
2718
+ this.properties = {
2719
+ label: { type: String },
2720
+ disabled: { type: Boolean }
2721
+ };
2722
+ }
2723
+ get $state() {
2724
+ return this.core.state;
2725
+ }
2726
+ #disconnect = null;
2727
+ #hotkeyRegistry = null;
2728
+ connectedCallback() {
2729
+ super.connectedCallback();
2730
+ if (this.destroyed) return;
2731
+ if (this.hotkeyAction && !this.#hotkeyRegistry) this.#hotkeyRegistry = new AriaKeyShortcutsController(this, this.hotkeyAction);
2732
+ this.#disconnect = new AbortController();
2733
+ const buttonProps = createButton({
2734
+ onActivate: () => this.activate(this.mediaState.value),
2735
+ isDisabled: () => this.disabled || !this.mediaState.value
2736
+ });
2737
+ applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });
2738
+ if (!this.mediaState.value && this.mediaState.displayName) logMissingFeature(this.localName, this.mediaState.displayName);
2739
+ }
2740
+ disconnectedCallback() {
2741
+ super.disconnectedCallback();
2742
+ this.#disconnect?.abort();
2743
+ this.#disconnect = null;
2744
+ }
2745
+ /** Returns the button's current label derived from media state. */
2746
+ getLabel() {
2747
+ return this.core.state.current.label || void 0;
2748
+ }
2749
+ willUpdate(changed) {
2750
+ super.willUpdate(changed);
2751
+ this.core.setProps?.(this);
2752
+ }
2753
+ update(changed) {
2754
+ super.update(changed);
2755
+ const media = this.mediaState.value;
2756
+ if (!media) return;
2757
+ this.core.setMedia(media);
2758
+ const state = this.core.getState();
2759
+ applyElementProps(this, {
2760
+ ...this.core.getAttrs?.(state),
2761
+ "aria-keyshortcuts": this.#hotkeyRegistry?.value
2762
+ });
2763
+ applyStateDataAttrs(this, state, this.stateAttrMap);
2764
+ }
2765
+ };
2766
+
2767
+ //#endregion
2768
+ //#region src/ui/mute-button/mute-button-element.ts
2769
+ var MuteButtonElement = class extends MediaButtonElement {
2770
+ constructor(..._args) {
2771
+ super(..._args);
2772
+ this.core = new MuteButtonCore();
2773
+ this.stateAttrMap = MuteButtonDataAttrs;
2774
+ this.mediaState = new PlayerController(this, playerContext, selectVolume);
2775
+ this.hotkeyAction = "toggleMuted";
2776
+ }
2777
+ static {
2778
+ this.tagName = "media-mute-button";
2779
+ }
2780
+ activate(state) {
2781
+ this.core.toggle(state);
2782
+ }
2783
+ };
2784
+
2785
+ //#endregion
2786
+ //#region src/ui/play-button/play-button-element.ts
2787
+ var PlayButtonElement = class extends MediaButtonElement {
2788
+ constructor(..._args) {
2789
+ super(..._args);
2790
+ this.core = new PlayButtonCore();
2791
+ this.stateAttrMap = PlayButtonDataAttrs;
2792
+ this.mediaState = new PlayerController(this, playerContext, selectPlayback);
2793
+ this.hotkeyAction = "togglePaused";
2794
+ }
2795
+ static {
2796
+ this.tagName = "media-play-button";
2797
+ }
2798
+ activate(state) {
2799
+ this.core.toggle(state);
2800
+ }
2801
+ };
2802
+
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
+ //#endregion
2821
+ //#region src/ui/position-controller.ts
2822
+ /**
2823
+ * Reactive controller that manages JS-fallback positioning for floating
2824
+ * popup elements (tooltips, popovers). Tracks scroll, resize, and
2825
+ * ResizeObserver events to keep the popup aligned with its trigger.
2826
+ *
2827
+ * When native CSS Anchor Positioning is supported, `sync()` is a no-op.
2828
+ */
2829
+ var PositionController = class {
2830
+ #host;
2831
+ #abort = null;
2832
+ #frame = 0;
2833
+ #resizeObserver = null;
2834
+ #trigger = null;
2835
+ constructor(host) {
2836
+ this.#host = host;
2837
+ host.addController(this);
2838
+ }
2839
+ /** Discover a trigger element linked via `commandfor` attribute. */
2840
+ findTrigger() {
2841
+ if (!this.#host.id) return null;
2842
+ return this.#host.getRootNode().querySelector(`[commandfor="${this.#host.id}"]`);
2843
+ }
2844
+ /** Start or update position tracking for the given trigger. */
2845
+ sync(trigger) {
2846
+ if (supportsAnchorPositioning()) return;
2847
+ if (!trigger) return;
2848
+ if (this.#abort && this.#trigger === trigger) return;
2849
+ this.cleanup();
2850
+ this.#abort = new AbortController();
2851
+ this.#trigger = trigger;
2852
+ const { signal } = this.#abort;
2853
+ const reposition = () => {
2854
+ cancelAnimationFrame(this.#frame);
2855
+ this.#frame = requestAnimationFrame(() => {
2856
+ if (signal.aborted) return;
2857
+ this.#host.requestUpdate();
2858
+ });
2859
+ };
2860
+ window.addEventListener("scroll", reposition, {
2861
+ capture: true,
2862
+ passive: true,
2863
+ signal
2864
+ });
2865
+ window.addEventListener("resize", reposition, { signal });
2866
+ if (typeof ResizeObserver === "function") {
2867
+ this.#resizeObserver = new ResizeObserver(() => {
2868
+ reposition();
2869
+ });
2870
+ this.#resizeObserver.observe(trigger);
2871
+ this.#resizeObserver.observe(this.#host);
2872
+ }
2873
+ reposition();
2874
+ }
2875
+ /** Stop all position tracking. */
2876
+ cleanup() {
2877
+ this.#abort?.abort();
2878
+ this.#abort = null;
2879
+ this.#trigger = null;
2880
+ cancelAnimationFrame(this.#frame);
2881
+ this.#frame = 0;
2882
+ this.#resizeObserver?.disconnect();
2883
+ this.#resizeObserver = null;
2884
+ }
2885
+ hostDisconnected() {
2886
+ this.cleanup();
2887
+ }
2888
+ hostDestroyed() {
2889
+ this.cleanup();
2890
+ }
2891
+ };
2892
+
2893
+ //#endregion
2894
+ //#region src/ui/popover/popover-element.ts
2895
+ var PopoverElement = class extends MediaElement {
2896
+ constructor(..._args) {
2897
+ super(..._args);
2898
+ this.open = PopoverCore.defaultProps.open;
2899
+ this.defaultOpen = PopoverCore.defaultProps.defaultOpen;
2900
+ this.side = PopoverCore.defaultProps.side;
2901
+ this.align = PopoverCore.defaultProps.align;
2902
+ this.modal = PopoverCore.defaultProps.modal;
2903
+ this.closeOnEscape = PopoverCore.defaultProps.closeOnEscape;
2904
+ this.closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;
2905
+ this.openOnHover = PopoverCore.defaultProps.openOnHover;
2906
+ this.delay = PopoverCore.defaultProps.delay;
2907
+ this.closeDelay = PopoverCore.defaultProps.closeDelay;
2908
+ }
2909
+ static {
2910
+ this.tagName = "media-popover";
2911
+ }
2912
+ static {
2913
+ this.properties = {
2914
+ open: { type: Boolean },
2915
+ defaultOpen: {
2916
+ type: Boolean,
2917
+ attribute: "default-open"
2918
+ },
2919
+ side: { type: String },
2920
+ align: { type: String },
2921
+ modal: { type: Boolean },
2922
+ closeOnEscape: {
2923
+ type: Boolean,
2924
+ attribute: "close-on-escape"
2925
+ },
2926
+ closeOnOutsideClick: {
2927
+ type: Boolean,
2928
+ attribute: "close-on-outside-click"
2929
+ },
2930
+ openOnHover: {
2931
+ type: Boolean,
2932
+ attribute: "open-on-hover"
2933
+ },
2934
+ delay: { type: Number },
2935
+ closeDelay: {
2936
+ type: Number,
2937
+ attribute: "close-delay"
2938
+ }
2939
+ };
2940
+ }
2941
+ #core = new PopoverCore();
2942
+ #position = new PositionController(this);
2943
+ #popover = null;
2944
+ #snapshot = null;
2945
+ #disconnect = null;
2946
+ #triggerAbort = null;
2947
+ #currentTrigger = null;
2948
+ connectedCallback() {
2949
+ super.connectedCallback();
2950
+ if (this.destroyed) return;
2951
+ this.#disconnect = new AbortController();
2952
+ this.#popover = createPopover({
2953
+ transition: createTransition(),
2954
+ onOpenChange: (nextOpen, details) => {
2955
+ this.open = nextOpen;
2956
+ this.dispatchEvent(new CustomEvent("open-change", { detail: {
2957
+ open: nextOpen,
2958
+ ...details
2959
+ } }));
2960
+ },
2961
+ closeOnEscape: () => this.closeOnEscape,
2962
+ closeOnOutsideClick: () => this.closeOnOutsideClick,
2963
+ openOnHover: () => this.openOnHover,
2964
+ delay: () => this.delay,
2965
+ closeDelay: () => this.closeDelay
2966
+ });
2967
+ this.#popover.setPopupElement(this);
2968
+ applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });
2969
+ if (this.#snapshot) this.#snapshot.track(this.#popover.input);
2970
+ else this.#snapshot = new SnapshotController(this, this.#popover.input);
2971
+ }
2972
+ firstUpdated(changed) {
2973
+ super.firstUpdated(changed);
2974
+ if (this.defaultOpen && !this.open) this.#popover?.open();
2975
+ }
2976
+ disconnectedCallback() {
2977
+ super.disconnectedCallback();
2978
+ this.#disconnect?.abort();
2979
+ this.#disconnect = null;
2980
+ }
2981
+ destroyCallback() {
2982
+ this.#cleanupTrigger();
2983
+ this.#popover?.destroy();
2984
+ super.destroyCallback();
2985
+ }
2986
+ willUpdate(changed) {
2987
+ super.willUpdate(changed);
2988
+ this.#core.setProps(this);
2989
+ if (this.#popover && changed.has("open")) {
2990
+ const { active: interactionOpen } = this.#popover.input.current;
2991
+ if (this.open !== interactionOpen) if (this.open) this.#popover.open();
2992
+ else this.#popover.close();
2993
+ }
2994
+ }
2995
+ update(_changed) {
2996
+ super.update(_changed);
2997
+ if (!this.#popover) return;
2998
+ const triggerEl = this.#position.findTrigger();
2999
+ this.#syncTrigger(triggerEl);
3000
+ const input = this.#popover.input.current;
3001
+ this.#core.setInput(input);
3002
+ const state = this.#core.getState();
3003
+ applyElementProps(this, this.#core.getPopupAttrs(state));
3004
+ applyStateDataAttrs(this, state, PopoverDataAttrs);
3005
+ if (state.open) tryShowPopover(this);
3006
+ else tryHidePopover(this);
3007
+ if (this.#currentTrigger) {
3008
+ applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));
3009
+ applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
3010
+ }
3011
+ if (!state.open) {
3012
+ this.#position.cleanup();
3013
+ return;
3014
+ }
3015
+ const posOpts = {
3016
+ side: state.side,
3017
+ align: state.align
3018
+ };
3019
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts));
3020
+ else {
3021
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3022
+ const selfRect = getPopupPositionRect(this);
3023
+ const boundaryRect = document.documentElement.getBoundingClientRect();
3024
+ const offsets = resolveOffsets(this);
3025
+ applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));
3026
+ }
3027
+ this.#position.sync(this.#currentTrigger);
3028
+ }
3029
+ #syncTrigger(triggerEl) {
3030
+ if (triggerEl === this.#currentTrigger) return;
3031
+ this.#position.cleanup();
3032
+ this.#cleanupTrigger();
3033
+ this.#currentTrigger = triggerEl;
3034
+ this.#popover?.setTriggerElement(triggerEl);
3035
+ if (triggerEl && this.#popover) {
3036
+ this.#triggerAbort = new AbortController();
3037
+ applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });
3038
+ }
3039
+ }
3040
+ #cleanupTrigger() {
3041
+ if (this.#currentTrigger) {
3042
+ applyElementProps(this.#currentTrigger, {
3043
+ "aria-expanded": void 0,
3044
+ "aria-haspopup": void 0,
3045
+ "aria-controls": void 0
3046
+ });
3047
+ this.#currentTrigger.style.removeProperty("anchor-name");
3048
+ }
3049
+ this.#triggerAbort?.abort();
3050
+ this.#triggerAbort = null;
3051
+ this.#currentTrigger = null;
3052
+ }
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);
3076
+ }
3077
+ };
3078
+
3079
+ //#endregion
3080
+ //#region src/ui/tooltip/context.ts
3081
+ const TOOLTIP_GROUP_CONTEXT_KEY = Symbol("@videojs/tooltip-group");
3082
+ const tooltipGroupContext = createContext(TOOLTIP_GROUP_CONTEXT_KEY);
3083
+
3084
+ //#endregion
3085
+ //#region src/ui/tooltip/tooltip-element.ts
3086
+ function isLabelTrigger(el) {
3087
+ return "$state" in el;
3088
+ }
3089
+ var TooltipElement = class extends MediaElement {
3090
+ constructor(..._args) {
3091
+ super(..._args);
3092
+ this.open = TooltipCore.defaultProps.open;
3093
+ this.defaultOpen = TooltipCore.defaultProps.defaultOpen;
3094
+ this.side = TooltipCore.defaultProps.side;
3095
+ this.align = TooltipCore.defaultProps.align;
3096
+ this.delay = TooltipCore.defaultProps.delay;
3097
+ this.closeDelay = TooltipCore.defaultProps.closeDelay;
3098
+ this.disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;
3099
+ this.disabled = TooltipCore.defaultProps.disabled;
3100
+ }
3101
+ static {
3102
+ this.tagName = "media-tooltip";
3103
+ }
3104
+ static {
3105
+ this.properties = {
3106
+ open: { type: Boolean },
3107
+ defaultOpen: {
3108
+ type: Boolean,
3109
+ attribute: "default-open"
3110
+ },
3111
+ side: { type: String },
3112
+ align: { type: String },
3113
+ delay: { type: Number },
3114
+ closeDelay: {
3115
+ type: Number,
3116
+ attribute: "close-delay"
3117
+ },
3118
+ disableHoverablePopup: {
3119
+ type: Boolean,
3120
+ attribute: "disable-hoverable-popup"
3121
+ },
3122
+ disabled: { type: Boolean }
3123
+ };
3124
+ }
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;
3133
+ connectedCallback() {
3134
+ super.connectedCallback();
3135
+ if (this.destroyed) return;
3136
+ this.#disconnect = new AbortController();
3137
+ this.#tooltip = createTooltip({
3138
+ transition: createTransition(),
3139
+ onOpenChange: (nextOpen, details) => {
3140
+ this.open = nextOpen;
3141
+ this.dispatchEvent(new CustomEvent("open-change", { detail: {
3142
+ open: nextOpen,
3143
+ ...details
3144
+ } }));
3145
+ },
3146
+ delay: () => this.delay,
3147
+ closeDelay: () => this.closeDelay,
3148
+ disableHoverablePopup: () => this.disableHoverablePopup,
3149
+ disabled: () => this.disabled,
3150
+ group: () => this.#groupConsumer.value
3151
+ });
3152
+ this.#tooltip.setPopupElement(this);
3153
+ applyElementProps(this, this.#tooltip.popupProps, { signal: this.#disconnect.signal });
3154
+ if (this.#snapshot) this.#snapshot.track(this.#tooltip.input);
3155
+ else this.#snapshot = new SnapshotController(this, this.#tooltip.input);
3156
+ }
3157
+ firstUpdated(changed) {
3158
+ super.firstUpdated(changed);
3159
+ if (this.defaultOpen && !this.open) this.#tooltip?.open();
3160
+ }
3161
+ disconnectedCallback() {
3162
+ super.disconnectedCallback();
3163
+ this.#cleanupTrigger();
3164
+ this.#tooltip?.destroy();
3165
+ this.#tooltip = null;
3166
+ this.#disconnect?.abort();
3167
+ this.#disconnect = null;
3168
+ }
3169
+ willUpdate(changed) {
3170
+ super.willUpdate(changed);
3171
+ this.#core.setProps(this);
3172
+ if (this.#tooltip && changed.has("open")) {
3173
+ const { active: interactionOpen } = this.#tooltip.input.current;
3174
+ if (this.open !== interactionOpen) if (this.open) this.#tooltip.open();
3175
+ else this.#tooltip.close();
3176
+ }
3177
+ }
3178
+ update(_changed) {
3179
+ super.update(_changed);
3180
+ if (!this.#tooltip) return;
3181
+ const triggerEl = this.#position.findTrigger();
3182
+ this.#syncTrigger(triggerEl);
3183
+ const input = this.#tooltip.input.current;
3184
+ this.#core.setInput(input);
3185
+ const state = this.#core.getState();
3186
+ applyElementProps(this, this.#core.getPopupAttrs(state));
3187
+ applyStateDataAttrs(this, state, TooltipDataAttrs);
3188
+ if (state.open) tryShowPopover(this);
3189
+ else tryHidePopover(this);
3190
+ if (this.#currentTrigger) applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
3191
+ if (!state.open) {
3192
+ this.#position.cleanup();
3193
+ return;
3194
+ }
3195
+ const posOpts = {
3196
+ side: state.side,
3197
+ align: state.align
3198
+ };
3199
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts, void 0, void 0, void 0, void 0, TooltipCSSVars));
3200
+ else {
3201
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
3202
+ const selfRect = getPopupPositionRect(this);
3203
+ const boundaryRect = document.documentElement.getBoundingClientRect();
3204
+ const offsets = resolveOffsets(this, TooltipCSSVars);
3205
+ applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars));
3206
+ }
3207
+ this.#position.sync(this.#currentTrigger);
3208
+ }
3209
+ #syncTrigger(triggerEl) {
3210
+ if (triggerEl === this.#currentTrigger) return;
3211
+ this.#position.cleanup();
3212
+ this.#cleanupTrigger();
3213
+ this.#currentTrigger = triggerEl;
3214
+ this.#tooltip?.setTriggerElement(triggerEl);
3215
+ if (triggerEl && this.#tooltip) {
3216
+ this.#triggerAbort = new AbortController();
3217
+ applyElementProps(triggerEl, this.#tooltip.triggerProps, { signal: this.#triggerAbort.signal });
3218
+ if (isLabelTrigger(triggerEl)) {
3219
+ this.#syncContent(triggerEl);
3220
+ triggerEl.$state.subscribe(() => this.#syncContent(triggerEl), { signal: this.#triggerAbort.signal });
3221
+ }
3222
+ }
3223
+ }
3224
+ #syncContent(triggerEl) {
3225
+ this.textContent = triggerEl.getLabel() ?? "";
3226
+ }
3227
+ #cleanupTrigger() {
3228
+ if (this.#currentTrigger) this.#currentTrigger.style.removeProperty("anchor-name");
3229
+ this.#triggerAbort?.abort();
3230
+ this.#triggerAbort = null;
3231
+ this.#currentTrigger = null;
3232
+ }
3233
+ };
3234
+
3235
+ //#endregion
3236
+ //#region src/ui/tooltip/tooltip-group-element.ts
3237
+ var TooltipGroupElement = class extends MediaElement {
3238
+ constructor(..._args) {
3239
+ super(..._args);
3240
+ this.delay = TooltipGroupCore.defaultProps.delay;
3241
+ this.closeDelay = TooltipGroupCore.defaultProps.closeDelay;
3242
+ this.timeout = TooltipGroupCore.defaultProps.timeout;
3243
+ }
3244
+ static {
3245
+ this.tagName = "media-tooltip-group";
3246
+ }
3247
+ static {
3248
+ this.properties = {
3249
+ delay: { type: Number },
3250
+ closeDelay: {
3251
+ type: Number,
3252
+ attribute: "close-delay"
3253
+ },
3254
+ timeout: { type: Number }
3255
+ };
3256
+ }
3257
+ #core = new TooltipGroupCore();
3258
+ #provider = new ContextProvider(this, {
3259
+ context: tooltipGroupContext,
3260
+ initialValue: this.#core
3261
+ });
3262
+ update(_changed) {
3263
+ super.update(_changed);
3264
+ this.#core.setProps(this);
3265
+ this.#provider.setValue(this.#core);
3266
+ }
3267
+ };
3268
+
3269
+ //#endregion
3270
+ //#region src/ui/alert-dialog/context.ts
3271
+ const ALERT_DIALOG_CONTEXT_KEY = Symbol("@videojs/alert-dialog");
3272
+ const alertDialogContext = createContext(ALERT_DIALOG_CONTEXT_KEY);
3273
+
3274
+ //#endregion
3275
+ //#region src/ui/alert-dialog/alert-dialog-close-element.ts
3276
+ var AlertDialogCloseElement = class extends MediaElement {
3277
+ constructor(..._args) {
3278
+ super(..._args);
3279
+ this.disabled = false;
3280
+ }
3281
+ static {
3282
+ this.tagName = "media-alert-dialog-close";
3283
+ }
3284
+ static {
3285
+ this.properties = { disabled: { type: Boolean } };
3286
+ }
3287
+ #ctx = new ContextConsumer(this, {
3288
+ context: alertDialogContext,
3289
+ subscribe: true
3290
+ });
3291
+ #disconnect = null;
3292
+ connectedCallback() {
3293
+ super.connectedCallback();
3294
+ this.#disconnect = new AbortController();
3295
+ const buttonProps = createButton({
3296
+ onActivate: () => this.#ctx.value?.close(),
3297
+ isDisabled: () => this.disabled
3298
+ });
3299
+ applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });
3300
+ }
3301
+ disconnectedCallback() {
3302
+ super.disconnectedCallback();
3303
+ this.#disconnect?.abort();
3304
+ this.#disconnect = null;
3305
+ }
3306
+ update(_changed) {
3307
+ super.update(_changed);
3308
+ const ctx = this.#ctx.value;
3309
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3310
+ }
3311
+ };
3312
+
3313
+ //#endregion
3314
+ //#region src/ui/context-part-element.ts
3315
+ /**
3316
+ * Abstract base for compound-component part elements that consume a parent
3317
+ * context and apply data attributes from `ctx.state` + `ctx.stateAttrMap`.
3318
+ *
3319
+ * Subclasses only need to declare the `consumer` property:
3320
+ *
3321
+ * ```ts
3322
+ * export class SliderTrackElement extends ContextPartElement<SliderState> {
3323
+ * static readonly tagName = 'media-slider-track';
3324
+ * protected readonly consumer = new ContextConsumer(this, { context: sliderContext, subscribe: true });
3325
+ * }
3326
+ * ```
3327
+ */
3328
+ var ContextPartElement = class extends MediaElement {
3329
+ update(_changed) {
3330
+ super.update(_changed);
3331
+ const ctx = this.consumer.value;
3332
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3333
+ }
3334
+ };
3335
+
3336
+ //#endregion
3337
+ //#region src/ui/alert-dialog/alert-dialog-description-element.ts
3338
+ var AlertDialogDescriptionElement = class extends ContextPartElement {
3339
+ constructor(..._args) {
3340
+ super(..._args);
3341
+ this.consumer = new ContextConsumer(this, {
3342
+ context: alertDialogContext,
3343
+ subscribe: true
3344
+ });
3345
+ }
3346
+ static {
3347
+ this.tagName = "media-alert-dialog-description";
3348
+ }
3349
+ update(changed) {
3350
+ super.update(changed);
3351
+ const descriptionId = this.consumer.value?.state.descriptionId;
3352
+ if (descriptionId) this.id = descriptionId;
3353
+ }
3354
+ };
3355
+
3356
+ //#endregion
3357
+ //#region src/ui/alert-dialog/alert-dialog-title-element.ts
3358
+ var AlertDialogTitleElement = class extends ContextPartElement {
3359
+ constructor(..._args) {
3360
+ super(..._args);
3361
+ this.consumer = new ContextConsumer(this, {
3362
+ context: alertDialogContext,
3363
+ subscribe: true
3364
+ });
3365
+ }
3366
+ 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;
3373
+ }
3374
+ };
3375
+
3376
+ //#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 {
3384
+ 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);
3393
+ }
3394
+ update(_changed) {
3395
+ 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
+ });
3405
+ }
3406
+ };
3407
+
3408
+ //#endregion
3409
+ //#region src/ui/controls/controls-group-element.ts
3410
+ var ControlsGroupElement = class extends ContextPartElement {
3411
+ constructor(..._args) {
3412
+ super(..._args);
3413
+ this.consumer = new ContextConsumer(this, {
3414
+ context: controlsContext,
3415
+ subscribe: true
3416
+ });
3417
+ }
3418
+ static {
3419
+ this.tagName = "media-controls-group";
3420
+ }
3421
+ connectedCallback() {
3422
+ super.connectedCallback();
3423
+ if (this.hasAttribute("aria-label") || this.hasAttribute("aria-labelledby")) this.setAttribute("role", "group");
3424
+ }
3425
+ };
3426
+
3427
+ //#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 {
3432
+ static {
3433
+ this.tagName = "media-error-dialog";
3434
+ }
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);
3447
+ }
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);
3460
+ }
3461
+ disconnectedCallback() {
3462
+ super.disconnectedCallback();
3463
+ this.#dialog?.destroy();
3464
+ this.#dialog = null;
3465
+ }
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();
3477
+ }
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
+ });
3491
+ }
3492
+ };
3493
+
3494
+ //#endregion
3495
+ //#region src/ui/slider/context.ts
3496
+ const SLIDER_CONTEXT_KEY = Symbol("@videojs/slider");
3497
+ const sliderContext = createContext(SLIDER_CONTEXT_KEY);
3498
+
3499
+ //#endregion
3500
+ //#region src/ui/slider/slider-buffer-element.ts
3501
+ var SliderBufferElement = class extends ContextPartElement {
3502
+ constructor(..._args) {
3503
+ super(..._args);
3504
+ this.consumer = new ContextConsumer(this, {
3505
+ context: sliderContext,
3506
+ subscribe: true
3507
+ });
3508
+ }
3509
+ static {
3510
+ this.tagName = "media-slider-buffer";
3511
+ }
3512
+ };
3513
+
3514
+ //#endregion
3515
+ //#region src/ui/slider/slider-fill-element.ts
3516
+ var SliderFillElement = class extends ContextPartElement {
3517
+ constructor(..._args) {
3518
+ super(..._args);
3519
+ this.consumer = new ContextConsumer(this, {
3520
+ context: sliderContext,
3521
+ subscribe: true
3522
+ });
3523
+ }
3524
+ static {
3525
+ this.tagName = "media-slider-fill";
3526
+ }
3527
+ };
3528
+
3529
+ //#endregion
3530
+ //#region src/ui/slider/slider-preview-element.ts
3531
+ var SliderPreviewElement = class extends MediaElement {
3532
+ constructor(..._args) {
3533
+ super(..._args);
3534
+ this.overflow = "clamp";
3535
+ }
3536
+ static {
3537
+ this.tagName = "media-slider-preview";
3538
+ }
3539
+ static {
3540
+ this.properties = { overflow: { type: String } };
3541
+ }
3542
+ #ctx = new ContextConsumer(this, {
3543
+ context: sliderContext,
3544
+ subscribe: true
3545
+ });
3546
+ #resizeObserver = null;
3547
+ #width = 0;
3548
+ connectedCallback() {
3549
+ super.connectedCallback();
3550
+ this.#resizeObserver = new ResizeObserver(([entry]) => {
3551
+ this.#width = entry.contentRect.width;
3552
+ this.#applyPosition();
3553
+ });
3554
+ this.#resizeObserver.observe(this);
3555
+ }
3556
+ disconnectedCallback() {
3557
+ super.disconnectedCallback();
3558
+ this.#resizeObserver?.disconnect();
3559
+ this.#resizeObserver = null;
3560
+ }
3561
+ #applyPosition() {
3562
+ applyStyles(this, getSliderPreviewStyle(this.#width, this.overflow));
3563
+ }
3564
+ update(_changed) {
3565
+ super.update(_changed);
3566
+ const ctx = this.#ctx.value;
3567
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3568
+ this.#applyPosition();
3569
+ }
3570
+ };
3571
+
3572
+ //#endregion
3573
+ //#region src/ui/slider/slider-thumb-element.ts
3574
+ var SliderThumbElement = class extends MediaElement {
3575
+ static {
3576
+ this.tagName = "media-slider-thumb";
3577
+ }
3578
+ #ctx = new ContextConsumer(this, {
3579
+ context: sliderContext,
3580
+ subscribe: true
3581
+ });
3582
+ #disconnect = null;
3583
+ #thumbPropsApplied = false;
3584
+ connectedCallback() {
3585
+ super.connectedCallback();
3586
+ this.#disconnect = new AbortController();
3587
+ this.#thumbPropsApplied = false;
3588
+ }
3589
+ disconnectedCallback() {
3590
+ super.disconnectedCallback();
3591
+ this.#disconnect?.abort();
3592
+ this.#disconnect = null;
3593
+ this.#thumbPropsApplied = false;
3594
+ }
3595
+ update(_changed) {
3596
+ super.update(_changed);
3597
+ const ctx = this.#ctx.value;
3598
+ if (!ctx) return;
3599
+ if (!this.#thumbPropsApplied && this.#disconnect) {
3600
+ applyElementProps(this, ctx.thumbProps, { signal: this.#disconnect.signal });
3601
+ this.#thumbPropsApplied = true;
3602
+ }
3603
+ applyElementProps(this, ctx.thumbAttrs);
3604
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3605
+ }
3606
+ };
3607
+
3608
+ //#endregion
3609
+ //#region src/ui/thumbnail/thumbnail-element.ts
3610
+ const SHADOW_CSS = `\
3611
+ :host {
3612
+ display: inline-block;
3613
+ overflow: hidden;
3614
+ }
3615
+ img {
3616
+ display: block;
3617
+ }`;
3618
+ var ThumbnailElement = class extends MediaElement {
3619
+ static {
3620
+ this.tagName = "media-thumbnail";
3621
+ }
3622
+ static {
3623
+ this.properties = {
3624
+ time: { type: Number },
3625
+ crossOrigin: {
3626
+ type: String,
3627
+ attribute: "crossorigin"
3628
+ },
3629
+ loading: { type: String },
3630
+ fetchPriority: {
3631
+ type: String,
3632
+ attribute: "fetchpriority"
3633
+ }
3634
+ };
3635
+ }
3636
+ #core = new ThumbnailCore();
3637
+ #img = document.createElement("img");
3638
+ #textTracks = new PlayerController(this, playerContext, selectTextTrack);
3639
+ #thumbnails = [];
3640
+ #externalThumbnails;
3641
+ #lastTextTrack;
3642
+ #api = null;
3643
+ constructor() {
3644
+ super();
3645
+ this.time = 0;
3646
+ const shadow = this.attachShadow({ mode: "open" });
3647
+ const style = document.createElement("style");
3648
+ style.textContent = SHADOW_CSS;
3649
+ shadow.appendChild(style);
3650
+ this.#img.alt = "";
3651
+ this.#img.setAttribute("part", "img");
3652
+ this.#img.setAttribute("aria-hidden", "true");
3653
+ this.#img.setAttribute("decoding", "async");
3654
+ shadow.appendChild(this.#img);
3655
+ }
3656
+ /**
3657
+ * Set thumbnail images directly, bypassing the automatic `<track>` detection.
3658
+ * When set, this takes priority over the text track path.
3659
+ */
3660
+ get thumbnails() {
3661
+ return this.#externalThumbnails;
3662
+ }
3663
+ set thumbnails(value) {
3664
+ this.#externalThumbnails = value;
3665
+ this.requestUpdate();
3666
+ }
3667
+ connectedCallback() {
3668
+ super.connectedCallback();
3669
+ if (this.destroyed) return;
3670
+ this.#api = createThumbnail({
3671
+ getContainer: () => this,
3672
+ getImg: () => this.#img,
3673
+ onStateChange: () => this.requestUpdate()
3674
+ });
3675
+ }
3676
+ disconnectedCallback() {
3677
+ super.disconnectedCallback();
3678
+ }
3679
+ destroyCallback() {
3680
+ this.#api?.destroy();
3681
+ super.destroyCallback();
3682
+ }
3683
+ update(changed) {
3684
+ super.update(changed);
3685
+ if (this.#externalThumbnails) this.#thumbnails = this.#externalThumbnails;
3686
+ else {
3687
+ const textTrack = this.#textTracks.value;
3688
+ if (textTrack !== this.#lastTextTrack) {
3689
+ this.#lastTextTrack = textTrack;
3690
+ this.#thumbnails = textTrack && textTrack.thumbnailCues.length > 0 ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? void 0) : [];
3691
+ }
3692
+ }
3693
+ const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);
3694
+ applyElementProps(this.#img, {
3695
+ crossorigin: this.crossOrigin || void 0,
3696
+ loading: this.loading,
3697
+ fetchpriority: this.fetchPriority
3698
+ });
3699
+ this.#api?.updateSrc(thumbnail?.url);
3700
+ if (!thumbnail) {
3701
+ this.#img.removeAttribute("src");
3702
+ this.#resetStyles();
3703
+ const state = this.#core.getState(false, false, void 0);
3704
+ applyElementProps(this, this.#core.getAttrs(state));
3705
+ applyStateDataAttrs(this, state, ThumbnailDataAttrs);
3706
+ return;
3707
+ }
3708
+ if (this.#img.getAttribute("src") !== thumbnail.url) this.#img.src = thumbnail.url;
3709
+ const api = this.#api;
3710
+ const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);
3711
+ applyElementProps(this, this.#core.getAttrs(state));
3712
+ applyStateDataAttrs(this, state, ThumbnailDataAttrs);
3713
+ if (api?.naturalWidth && api.naturalHeight) {
3714
+ const constraints = api.readConstraints();
3715
+ const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);
3716
+ if (result) this.#applyResize(result);
3717
+ }
3718
+ }
3719
+ #applyResize(result) {
3720
+ this.style.width = `${result.containerWidth}px`;
3721
+ this.style.height = `${result.containerHeight}px`;
3722
+ const imgStyle = this.#img.style;
3723
+ imgStyle.width = `${result.imageWidth}px`;
3724
+ imgStyle.height = `${result.imageHeight}px`;
3725
+ imgStyle.maxWidth = "none";
3726
+ imgStyle.transform = result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : "";
3727
+ }
3728
+ #resetStyles() {
3729
+ this.style.width = "";
3730
+ this.style.height = "";
3731
+ const imgStyle = this.#img.style;
3732
+ imgStyle.width = "";
3733
+ imgStyle.height = "";
3734
+ imgStyle.maxWidth = "";
3735
+ imgStyle.transform = "";
3736
+ }
3737
+ };
3738
+
3739
+ //#endregion
3740
+ //#region src/ui/slider/slider-thumbnail-element.ts
3741
+ var SliderThumbnailElement = class extends ThumbnailElement {
3742
+ static {
3743
+ this.tagName = "media-slider-thumbnail";
3744
+ }
3745
+ #ctx = new ContextConsumer(this, {
3746
+ context: sliderContext,
3747
+ subscribe: true
3748
+ });
3749
+ update(changed) {
3750
+ const ctx = this.#ctx.value;
3751
+ if (ctx) this.time = ctx.pointerValue;
3752
+ super.update(changed);
3753
+ }
3754
+ };
3755
+
3756
+ //#endregion
3757
+ //#region src/ui/slider/slider-track-element.ts
3758
+ var SliderTrackElement = class extends ContextPartElement {
3759
+ constructor(..._args) {
3760
+ super(..._args);
3761
+ this.consumer = new ContextConsumer(this, {
3762
+ context: sliderContext,
3763
+ subscribe: true
3764
+ });
3765
+ }
3766
+ static {
3767
+ this.tagName = "media-slider-track";
3768
+ }
3769
+ };
3770
+
3771
+ //#endregion
3772
+ //#region src/ui/slider/slider-value-element.ts
3773
+ var SliderValueElement = class extends MediaElement {
3774
+ constructor(..._args) {
3775
+ super(..._args);
3776
+ this.type = "current";
3777
+ }
3778
+ static {
3779
+ this.tagName = "media-slider-value";
3780
+ }
3781
+ static {
3782
+ this.properties = { type: { type: String } };
3783
+ }
3784
+ #ctx = new ContextConsumer(this, {
3785
+ context: sliderContext,
3786
+ subscribe: true
3787
+ });
3788
+ connectedCallback() {
3789
+ super.connectedCallback();
3790
+ this.setAttribute("aria-live", "off");
3791
+ }
3792
+ update(_changed) {
3793
+ super.update(_changed);
3794
+ const ctx = this.#ctx.value;
3795
+ if (!ctx) return;
3796
+ const value = this.type === "pointer" ? ctx.pointerValue : ctx.state.value;
3797
+ this.textContent = ctx.formatValue ? ctx.formatValue(value, this.type) : String(Math.round(value));
3798
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
3799
+ }
3800
+ };
3801
+
3802
+ //#endregion
3803
+ //#region src/ui/time/time-element.ts
3804
+ var TimeElement = class extends MediaElement {
3805
+ constructor(..._args) {
3806
+ super(..._args);
3807
+ this.type = TimeCore.defaultProps.type;
3808
+ this.negativeSign = TimeCore.defaultProps.negativeSign;
3809
+ this.label = TimeCore.defaultProps.label;
3810
+ }
3811
+ static {
3812
+ this.tagName = "media-time";
3813
+ }
3814
+ static {
3815
+ this.properties = {
3816
+ type: { type: String },
3817
+ negativeSign: {
3818
+ type: String,
3819
+ attribute: "negative-sign"
3820
+ },
3821
+ label: { type: String }
3822
+ };
3823
+ }
3824
+ #core = new TimeCore();
3825
+ #state = new PlayerController(this, playerContext, selectTime);
3826
+ #signSpan = document.createElement("span");
3827
+ #textNode = document.createTextNode("");
3828
+ connectedCallback() {
3829
+ super.connectedCallback();
3830
+ if (!this.#signSpan.parentNode) {
3831
+ this.#signSpan.setAttribute("aria-hidden", "true");
3832
+ this.#signSpan.hidden = true;
3833
+ this.appendChild(this.#signSpan);
3834
+ this.appendChild(this.#textNode);
3835
+ }
3836
+ if (!this.#state.value) logMissingFeature(this.localName, this.#state.displayName);
3837
+ }
3838
+ willUpdate(changed) {
3839
+ super.willUpdate(changed);
3840
+ this.#core.setProps(this);
3841
+ }
3842
+ update(changed) {
3843
+ super.update(changed);
3844
+ const media = this.#state.value;
3845
+ if (!media) return;
3846
+ this.#core.setMedia(media);
3847
+ const state = this.#core.getState();
3848
+ this.#signSpan.hidden = !state.negative;
3849
+ this.#signSpan.textContent = state.negative ? this.negativeSign : "";
3850
+ this.#textNode.textContent = state.text;
3851
+ applyElementProps(this, this.#core.getAttrs(state));
3852
+ applyStateDataAttrs(this, state, TimeDataAttrs);
3853
+ }
3854
+ };
3855
+
3856
+ //#endregion
3857
+ //#region src/ui/time/time-group-element.ts
3858
+ var TimeGroupElement = class extends MediaElement {
3859
+ static {
3860
+ this.tagName = "media-time-group";
3861
+ }
3862
+ };
3863
+
3864
+ //#endregion
3865
+ //#region src/ui/time/time-separator-element.ts
3866
+ var TimeSeparatorElement = class extends MediaElement {
3867
+ static {
3868
+ this.tagName = "media-time-separator";
3869
+ }
3870
+ connectedCallback() {
3871
+ super.connectedCallback();
3872
+ this.setAttribute("aria-hidden", "true");
3873
+ if (!this.textContent?.trim()) this.textContent = "/";
3874
+ }
3875
+ };
3876
+
3877
+ //#endregion
3878
+ //#region src/ui/time-slider/time-slider-element.ts
3879
+ var TimeSliderElement = class extends MediaElement {
3880
+ constructor(..._args) {
3881
+ super(..._args);
3882
+ this.label = TimeSliderCore.defaultProps.label;
3883
+ this.changeThrottle = TimeSliderCore.defaultProps.changeThrottle;
3884
+ this.step = TimeSliderCore.defaultProps.step;
3885
+ this.largeStep = TimeSliderCore.defaultProps.largeStep;
3886
+ this.orientation = TimeSliderCore.defaultProps.orientation;
3887
+ this.disabled = TimeSliderCore.defaultProps.disabled;
3888
+ this.thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;
3889
+ }
3890
+ static {
3891
+ this.tagName = "media-time-slider";
3892
+ }
3893
+ static {
3894
+ this.properties = {
3895
+ label: { type: String },
3896
+ changeThrottle: {
3897
+ type: Number,
3898
+ attribute: "change-throttle"
3899
+ },
3900
+ step: { type: Number },
3901
+ largeStep: {
3902
+ type: Number,
3903
+ attribute: "large-step"
3904
+ },
3905
+ orientation: { type: String },
3906
+ disabled: { type: Boolean },
3907
+ thumbAlignment: {
3908
+ type: String,
3909
+ attribute: "thumb-alignment"
3910
+ }
3911
+ };
3912
+ }
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;
3919
+ connectedCallback() {
3920
+ super.connectedCallback();
3921
+ if (this.destroyed) return;
3922
+ this.#disconnect = new AbortController();
3923
+ const signal = this.#disconnect.signal;
3924
+ this.#slider = createSlider({
3925
+ getElement: () => this,
3926
+ getThumbElement: () => this.querySelector("media-slider-thumb"),
3927
+ getOrientation: () => this.orientation,
3928
+ isRTL: () => isRTL(this),
3929
+ isDisabled: () => this.disabled || !this.#timeState.value,
3930
+ getPercent: () => {
3931
+ const media = this.#timeState.value;
3932
+ if (!media) return 0;
3933
+ return this.#core.percentFromValue(media.currentTime);
3934
+ },
3935
+ getStepPercent: () => this.#core.getStepPercent(),
3936
+ getLargeStepPercent: () => this.#core.getLargeStepPercent(),
3937
+ onValueCommit: (percent) => {
3938
+ const media = this.#timeState.value;
3939
+ if (media) media.seek(this.#core.rawValueFromPercent(percent));
3940
+ },
3941
+ changeThrottle: this.changeThrottle,
3942
+ onDragStart: () => {
3943
+ this.dispatchEvent(new CustomEvent("drag-start", { bubbles: true }));
3944
+ },
3945
+ onDragEnd: () => {
3946
+ this.dispatchEvent(new CustomEvent("drag-end", { bubbles: true }));
3947
+ },
3948
+ adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),
3949
+ onResize: () => this.requestUpdate()
3950
+ });
3951
+ applyElementProps(this, this.#slider.rootProps, { signal });
3952
+ applyStyles(this, this.#slider.rootStyle);
3953
+ this.#slider.input.subscribe(() => this.requestUpdate(), { signal });
3954
+ if (!this.#timeState.value) logMissingFeature(this.localName, this.#timeState.displayName);
3955
+ }
3956
+ disconnectedCallback() {
3957
+ super.disconnectedCallback();
3958
+ this.#disconnect?.abort();
3959
+ this.#disconnect = null;
3960
+ }
3961
+ destroyCallback() {
3962
+ this.#slider?.destroy();
3963
+ super.destroyCallback();
3964
+ }
3965
+ willUpdate(_changed) {
3966
+ super.willUpdate(_changed);
3967
+ this.#core.setProps(this);
3968
+ }
3969
+ update(_changed) {
3970
+ super.update(_changed);
3971
+ if (!this.#slider) return;
3972
+ const time = this.#timeState.value;
3973
+ const buffer = this.#bufferState.value;
3974
+ if (!time) return;
3975
+ this.#core.setInput(this.#slider.input.current);
3976
+ const media = {
3977
+ ...time,
3978
+ ...buffer ?? {
3979
+ buffered: [],
3980
+ seekable: []
3981
+ }
3982
+ };
3983
+ this.#core.setMedia(media);
3984
+ const state = this.#core.getState();
3985
+ const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));
3986
+ applyStyles(this, cssVars);
3987
+ applyStateDataAttrs(this, state, TimeSliderDataAttrs);
3988
+ this.#provider.setValue({
3989
+ state,
3990
+ stateAttrMap: TimeSliderDataAttrs,
3991
+ pointerValue: this.#core.valueFromPercent(state.pointerPercent),
3992
+ thumbAttrs: this.#core.getAttrs(state),
3993
+ thumbProps: this.#slider.thumbProps,
3994
+ formatValue: (value) => formatTime(value, state.duration)
3995
+ });
3996
+ }
3997
+ };
3998
+
3999
+ //#endregion
4000
+ //#region src/ui/volume-slider/volume-slider-element.ts
4001
+ var VolumeSliderElement = class extends MediaElement {
4002
+ constructor(..._args) {
4003
+ super(..._args);
4004
+ this.label = VolumeSliderCore.defaultProps.label;
4005
+ this.step = VolumeSliderCore.defaultProps.step;
4006
+ this.largeStep = VolumeSliderCore.defaultProps.largeStep;
4007
+ this.wheelStep = VolumeSliderCore.defaultProps.wheelStep;
4008
+ this.orientation = VolumeSliderCore.defaultProps.orientation;
4009
+ this.disabled = VolumeSliderCore.defaultProps.disabled;
4010
+ this.thumbAlignment = VolumeSliderCore.defaultProps.thumbAlignment;
4011
+ }
4012
+ static {
4013
+ this.tagName = "media-volume-slider";
4014
+ }
4015
+ static {
4016
+ this.properties = {
4017
+ label: { type: String },
4018
+ step: { type: Number },
4019
+ largeStep: {
4020
+ type: Number,
4021
+ attribute: "large-step"
4022
+ },
4023
+ wheelStep: {
4024
+ type: Number,
4025
+ attribute: "wheel-step"
4026
+ },
4027
+ orientation: { type: String },
4028
+ disabled: { type: Boolean },
4029
+ thumbAlignment: {
4030
+ type: String,
4031
+ attribute: "thumb-alignment"
4032
+ }
4033
+ };
4034
+ }
4035
+ #core = new VolumeSliderCore();
4036
+ #provider = new ContextProvider(this, { context: sliderContext });
4037
+ #volumeState = new PlayerController(this, playerContext, selectVolume);
4038
+ #slider = null;
4039
+ #disconnect = null;
4040
+ connectedCallback() {
4041
+ super.connectedCallback();
4042
+ if (this.destroyed) return;
4043
+ this.#disconnect = new AbortController();
4044
+ const signal = this.#disconnect.signal;
4045
+ const isDisabled = () => this.disabled || !this.#volumeState.value;
4046
+ const getPercent = () => (this.#volumeState.value?.volume ?? 0) * 100;
4047
+ const getStepPercent = () => this.#core.getStepPercent();
4048
+ const setVolume = (percent) => this.#setVolume(percent);
4049
+ this.#slider = createSlider({
4050
+ getElement: () => this,
4051
+ getThumbElement: () => this.querySelector("media-slider-thumb"),
4052
+ getOrientation: () => this.orientation,
4053
+ isRTL: () => isRTL(this),
4054
+ isDisabled,
4055
+ getPercent,
4056
+ getStepPercent,
4057
+ getLargeStepPercent: () => this.#core.getLargeStepPercent(),
4058
+ onValueChange: setVolume,
4059
+ onValueCommit: setVolume,
4060
+ onDragStart: () => {
4061
+ this.dispatchEvent(new CustomEvent("drag-start", { bubbles: true }));
4062
+ },
4063
+ onDragEnd: () => {
4064
+ this.dispatchEvent(new CustomEvent("drag-end", { bubbles: true }));
4065
+ },
4066
+ adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),
4067
+ onResize: () => this.requestUpdate()
4068
+ });
4069
+ const wheelProps = createWheelStep({
4070
+ isDisabled,
4071
+ getPercent,
4072
+ getStepPercent: () => this.#core.getWheelStepPercent(),
4073
+ onValueChange: setVolume
4074
+ });
4075
+ applyElementProps(this, this.#slider.rootProps, { signal });
4076
+ applyElementProps(this, wheelProps, { signal });
4077
+ applyStyles(this, this.#slider.rootStyle);
4078
+ this.#slider.input.subscribe(() => this.requestUpdate(), { signal });
4079
+ if (!this.#volumeState.value) logMissingFeature(this.localName, this.#volumeState.displayName);
4080
+ }
4081
+ disconnectedCallback() {
4082
+ super.disconnectedCallback();
4083
+ this.#disconnect?.abort();
4084
+ this.#disconnect = null;
4085
+ }
4086
+ destroyCallback() {
4087
+ this.#slider?.destroy();
4088
+ super.destroyCallback();
4089
+ }
4090
+ willUpdate(_changed) {
4091
+ super.willUpdate(_changed);
4092
+ this.#core.setProps(this);
4093
+ }
4094
+ update(_changed) {
4095
+ super.update(_changed);
4096
+ if (!this.#slider) return;
4097
+ const media = this.#volumeState.value;
4098
+ if (!media) return;
4099
+ this.#core.setInput(this.#slider.input.current);
4100
+ this.#core.setMedia(media);
4101
+ const state = this.#core.getState();
4102
+ const cssVars = getSliderCSSVars(this.#slider.adjustForAlignment(state));
4103
+ applyStyles(this, cssVars);
4104
+ applyStateDataAttrs(this, state, VolumeSliderDataAttrs);
4105
+ this.#provider.setValue({
4106
+ state,
4107
+ stateAttrMap: VolumeSliderDataAttrs,
4108
+ pointerValue: this.#core.valueFromPercent(state.pointerPercent),
4109
+ thumbAttrs: this.#core.getAttrs(state),
4110
+ thumbProps: this.#slider.thumbProps,
4111
+ formatValue: (value) => `${Math.round(value)}%`
4112
+ });
4113
+ }
4114
+ #setVolume(percent) {
4115
+ this.#volumeState.value?.setVolume(this.#core.valueFromPercent(percent) / 100);
4116
+ }
4117
+ };
4118
+
4119
+ //#endregion
4120
+ //#region src/define/ui/compounds.ts
4121
+ function defineControls() {
4122
+ safeDefine(ControlsElement);
4123
+ safeDefine(ControlsGroupElement);
4124
+ }
4125
+ function defineErrorDialog() {
4126
+ safeDefine(ErrorDialogElement);
4127
+ safeDefine(AlertDialogCloseElement);
4128
+ safeDefine(AlertDialogDescriptionElement);
4129
+ safeDefine(AlertDialogTitleElement);
4130
+ }
4131
+ /** Shared slider sub-elements used by all slider types. */
4132
+ function defineSliderParts() {
4133
+ safeDefine(SliderFillElement);
4134
+ safeDefine(SliderPreviewElement);
4135
+ safeDefine(SliderThumbElement);
4136
+ safeDefine(SliderTrackElement);
4137
+ safeDefine(SliderValueElement);
4138
+ }
4139
+ function defineTime() {
4140
+ safeDefine(TimeElement);
4141
+ safeDefine(TimeGroupElement);
4142
+ safeDefine(TimeSeparatorElement);
4143
+ }
4144
+ function defineTimeSlider() {
4145
+ safeDefine(TimeSliderElement);
4146
+ defineSliderParts();
4147
+ safeDefine(SliderBufferElement);
4148
+ safeDefine(SliderThumbnailElement);
4149
+ }
4150
+ function defineVolumeSlider() {
4151
+ safeDefine(VolumeSliderElement);
4152
+ defineSliderParts();
4153
+ }
4154
+
4155
+ //#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