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

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