@videojs/html 10.0.0-beta.1 → 10.0.0-beta.11

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 (463) hide show
  1. package/cdn/audio-minimal.dev.d.ts +1 -0
  2. package/cdn/audio-minimal.dev.js +113 -0
  3. package/cdn/audio-minimal.dev.js.map +1 -0
  4. package/cdn/audio-minimal.js +2 -0
  5. package/cdn/audio-minimal.js.map +1 -0
  6. package/cdn/audio.dev.d.ts +1 -0
  7. package/cdn/audio.dev.js +104 -0
  8. package/cdn/audio.dev.js.map +1 -0
  9. package/cdn/audio.js +2 -0
  10. package/cdn/audio.js.map +1 -0
  11. package/cdn/background.dev.d.ts +1 -0
  12. package/cdn/background.dev.js +160 -0
  13. package/cdn/background.dev.js.map +1 -0
  14. package/cdn/background.js +2 -0
  15. package/cdn/background.js.map +1 -0
  16. package/cdn/context-Be8C5kVd.js +166 -0
  17. package/cdn/context-Be8C5kVd.js.map +1 -0
  18. package/cdn/context-CUBywtsB.js +14 -0
  19. package/cdn/context-CUBywtsB.js.map +1 -0
  20. package/cdn/create-player-AcfnN3li.js +3218 -0
  21. package/cdn/create-player-AcfnN3li.js.map +1 -0
  22. package/cdn/create-player-s_qISCpw.js +7 -0
  23. package/cdn/create-player-s_qISCpw.js.map +1 -0
  24. package/cdn/custom-media-element-DqevSVgS.js +47 -0
  25. package/cdn/custom-media-element-DqevSVgS.js.map +1 -0
  26. package/cdn/custom-media-element-moFa3UZp.js +303 -0
  27. package/cdn/custom-media-element-moFa3UZp.js.map +1 -0
  28. package/cdn/default-GgKND7a8.js +2 -0
  29. package/cdn/default-GgKND7a8.js.map +1 -0
  30. package/cdn/default-cLso8BHO.js +28 -0
  31. package/cdn/default-cLso8BHO.js.map +1 -0
  32. package/cdn/delegate-CzAcT1xm.js +44 -0
  33. package/cdn/delegate-CzAcT1xm.js.map +1 -0
  34. package/cdn/delegate-Uc-6tQDR.js +2 -0
  35. package/cdn/delegate-Uc-6tQDR.js.map +1 -0
  36. package/cdn/listen-4jqsRSKo.js +2 -0
  37. package/cdn/listen-4jqsRSKo.js.map +1 -0
  38. package/cdn/listen-YSH3Jfyk.js +9 -0
  39. package/cdn/listen-YSH3Jfyk.js.map +1 -0
  40. package/cdn/media/dash-video.dev.d.ts +1 -0
  41. package/cdn/media/dash-video.dev.js +39167 -0
  42. package/cdn/media/dash-video.dev.js.map +1 -0
  43. package/cdn/media/dash-video.js +21 -0
  44. package/cdn/media/dash-video.js.map +1 -0
  45. package/cdn/media/hls-video.dev.d.ts +1 -0
  46. package/cdn/media/hls-video.dev.js +28359 -0
  47. package/cdn/media/hls-video.dev.js.map +1 -0
  48. package/cdn/media/hls-video.js +41 -0
  49. package/cdn/media/hls-video.js.map +1 -0
  50. package/cdn/media/simple-hls-video.dev.d.ts +1 -0
  51. package/cdn/media/simple-hls-video.dev.js +3603 -0
  52. package/cdn/media/simple-hls-video.dev.js.map +1 -0
  53. package/cdn/media/simple-hls-video.js +2 -0
  54. package/cdn/media/simple-hls-video.js.map +1 -0
  55. package/cdn/media-attach-mixin-D5_nfJpa.js +2 -0
  56. package/cdn/media-attach-mixin-D5_nfJpa.js.map +1 -0
  57. package/cdn/media-attach-mixin-U_KQB_9O.js +44 -0
  58. package/cdn/media-attach-mixin-U_KQB_9O.js.map +1 -0
  59. package/cdn/minimal-BJfleQcQ.js +2 -0
  60. package/cdn/minimal-BJfleQcQ.js.map +1 -0
  61. package/cdn/minimal-DBMdC_0I.js +28 -0
  62. package/cdn/minimal-DBMdC_0I.js.map +1 -0
  63. package/cdn/player-C46h14iP.js +2 -0
  64. package/cdn/player-C46h14iP.js.map +1 -0
  65. package/cdn/player-CvrOeLpy.js +15 -0
  66. package/cdn/player-CvrOeLpy.js.map +1 -0
  67. package/cdn/poster-Olv5zDI_.js +195 -0
  68. package/cdn/poster-Olv5zDI_.js.map +1 -0
  69. package/cdn/poster-odJ4iwIv.js +2 -0
  70. package/cdn/poster-odJ4iwIv.js.map +1 -0
  71. package/cdn/predicate-BG-dj_kF.js +26 -0
  72. package/cdn/predicate-BG-dj_kF.js.map +1 -0
  73. package/cdn/predicate-Y9jDHLpX.js +2 -0
  74. package/cdn/predicate-Y9jDHLpX.js.map +1 -0
  75. package/cdn/safe-define-B8lHgj_K.js +9 -0
  76. package/cdn/safe-define-B8lHgj_K.js.map +1 -0
  77. package/cdn/safe-define-GrHW3P9e.js +2 -0
  78. package/cdn/safe-define-GrHW3P9e.js.map +1 -0
  79. package/cdn/video-minimal.dev.d.ts +1 -0
  80. package/cdn/video-minimal.dev.js +156 -0
  81. package/cdn/video-minimal.dev.js.map +1 -0
  82. package/cdn/video-minimal.js +2 -0
  83. package/cdn/video-minimal.js.map +1 -0
  84. package/cdn/video.dev.d.ts +1 -0
  85. package/cdn/video.dev.js +170 -0
  86. package/cdn/video.dev.js.map +1 -0
  87. package/cdn/video.js +2 -0
  88. package/cdn/video.js.map +1 -0
  89. package/cdn/volume-slider-D7BOdSDF.js +2459 -0
  90. package/cdn/volume-slider-D7BOdSDF.js.map +1 -0
  91. package/cdn/volume-slider-DPeFF5tt.js +8 -0
  92. package/cdn/volume-slider-DPeFF5tt.js.map +1 -0
  93. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  94. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  95. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  96. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  97. package/dist/default/_virtual/inline-css_src/define/background/skin.js +6 -0
  98. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  99. package/dist/default/_virtual/inline-css_src/define/base.js +6 -0
  100. package/dist/default/_virtual/inline-css_src/define/base.js.map +1 -0
  101. package/dist/default/_virtual/inline-css_src/define/shared.js +6 -0
  102. package/dist/default/_virtual/inline-css_src/define/shared.js.map +1 -0
  103. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  104. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  105. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  106. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  107. package/dist/default/define/audio/minimal-skin.css +237 -157
  108. package/dist/default/define/audio/minimal-skin.js +2 -79
  109. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  110. package/dist/default/define/audio/minimal-skin.tailwind.js +5 -82
  111. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  112. package/dist/default/define/audio/skin.css +234 -153
  113. package/dist/default/define/audio/skin.js +2 -70
  114. package/dist/default/define/audio/skin.js.map +1 -1
  115. package/dist/default/define/audio/skin.tailwind.js +6 -75
  116. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  117. package/dist/default/define/background/skin.css +1 -1
  118. package/dist/default/define/background/skin.js +11 -5
  119. package/dist/default/define/background/skin.js.map +1 -1
  120. package/dist/default/define/base.css +23 -0
  121. package/dist/default/define/media/dash-video.js +14 -0
  122. package/dist/default/define/media/dash-video.js.map +1 -0
  123. package/dist/default/define/shared.css +13 -0
  124. package/dist/default/define/skin-mixin.js +16 -33
  125. package/dist/default/define/skin-mixin.js.map +1 -1
  126. package/dist/default/define/video/minimal-skin.css +486 -301
  127. package/dist/default/define/video/minimal-skin.js +3 -121
  128. package/dist/default/define/video/minimal-skin.js.map +1 -1
  129. package/dist/default/define/video/minimal-skin.tailwind.js +8 -136
  130. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  131. package/dist/default/define/video/skin.css +484 -289
  132. package/dist/default/define/video/skin.js +3 -116
  133. package/dist/default/define/video/skin.js.map +1 -1
  134. package/dist/default/define/video/skin.tailwind.js +8 -128
  135. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  136. package/dist/default/icons/dist/render/default/index.js +2 -1
  137. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  138. package/dist/default/icons/dist/render/minimal/index.js +2 -1
  139. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  140. package/dist/default/index.js +4 -2
  141. package/dist/default/media/background-video/index.js +6 -19
  142. package/dist/default/media/background-video/index.js.map +1 -1
  143. package/dist/default/media/container-element.js +5 -2
  144. package/dist/default/media/container-element.js.map +1 -1
  145. package/dist/default/media/dash-video/index.js +26 -0
  146. package/dist/default/media/dash-video/index.js.map +1 -0
  147. package/dist/default/media/hls-video/index.js +2 -1
  148. package/dist/default/media/hls-video/index.js.map +1 -1
  149. package/dist/default/media/simple-hls-video/index.js +3 -1
  150. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  151. package/dist/default/player/context.js +6 -2
  152. package/dist/default/player/context.js.map +1 -1
  153. package/dist/default/player/create-player.js +11 -3
  154. package/dist/default/player/create-player.js.map +1 -1
  155. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +10 -26
  156. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  157. package/dist/default/skins/dist/default/default/tailwind/components/button.js +4 -3
  158. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  159. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +1 -1
  160. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  161. package/dist/default/skins/dist/default/default/tailwind/components/error.js +3 -3
  162. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  163. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  164. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  165. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +3 -3
  166. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  167. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +16 -0
  168. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  169. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +13 -0
  170. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  171. package/dist/default/skins/dist/default/default/tailwind/components/root.js +1 -1
  172. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  173. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +1 -1
  174. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  175. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +1 -1
  176. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  177. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +1 -1
  178. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  179. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +27 -16
  180. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  181. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +11 -24
  182. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  183. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  184. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  185. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  186. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  187. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +3 -3
  188. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  189. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  190. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  191. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  192. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  193. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +4 -3
  194. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  195. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +16 -0
  196. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  197. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +14 -0
  198. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  199. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  200. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  201. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  202. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  203. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  204. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  205. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +1 -1
  206. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  207. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +33 -16
  208. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  209. package/dist/default/skins/dist/default/{default/tailwind/components → shared/tailwind}/icon-state.js +6 -1
  210. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  211. package/dist/{dev/skins/dist/default/default/tailwind/components → default/skins/dist/default/shared/tailwind}/tooltip-state.js +1 -1
  212. package/dist/default/skins/dist/default/shared/tailwind/tooltip-state.js.map +1 -0
  213. package/dist/default/store/container-mixin.js +16 -60
  214. package/dist/default/store/container-mixin.js.map +1 -1
  215. package/dist/default/store/media-attach-mixin.js +45 -0
  216. package/dist/default/store/media-attach-mixin.js.map +1 -0
  217. package/dist/default/store/provider-mixin.js +99 -9
  218. package/dist/default/store/provider-mixin.js.map +1 -1
  219. package/dist/default/ui/alert-dialog/alert-dialog-element.js +1 -1
  220. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +1 -1
  221. package/dist/default/ui/captions-button/captions-button-element.js +1 -1
  222. package/dist/default/ui/controls/controls-element.js +1 -1
  223. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +1 -1
  224. package/dist/default/ui/mute-button/mute-button-element.js +1 -1
  225. package/dist/default/ui/pip-button/pip-button-element.js +1 -1
  226. package/dist/default/ui/play-button/play-button-element.js +1 -1
  227. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -1
  228. package/dist/default/ui/popover/popover-element.js +55 -4
  229. package/dist/default/ui/popover/popover-element.js.map +1 -1
  230. package/dist/default/ui/poster/poster-element.js +1 -1
  231. package/dist/default/ui/seek-button/seek-button-element.js +1 -1
  232. package/dist/default/ui/slider/slider-element.js +1 -1
  233. package/dist/default/ui/thumbnail/thumbnail-element.js +1 -1
  234. package/dist/default/ui/time/time-element.js +1 -1
  235. package/dist/default/ui/time-slider/time-slider-element.js +2 -2
  236. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  237. package/dist/default/ui/tooltip/tooltip-element.js +54 -4
  238. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  239. package/dist/default/ui/tooltip/tooltip-group-element.js +5 -2
  240. package/dist/default/ui/tooltip/tooltip-group-element.js.map +1 -1
  241. package/dist/default/ui/volume-slider/volume-slider-element.js +3 -3
  242. package/dist/default/ui/volume-slider/volume-slider-element.js.map +1 -1
  243. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  244. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  245. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  246. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  247. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +6 -0
  248. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  249. package/dist/dev/_virtual/inline-css_src/define/base.js +6 -0
  250. package/dist/dev/_virtual/inline-css_src/define/base.js.map +1 -0
  251. package/dist/dev/_virtual/inline-css_src/define/shared.js +6 -0
  252. package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -0
  253. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  254. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  255. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  256. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  257. package/dist/dev/define/audio/minimal-skin.css +237 -157
  258. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  259. package/dist/dev/define/audio/minimal-skin.js +69 -64
  260. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  261. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
  262. package/dist/dev/define/audio/minimal-skin.tailwind.js +73 -66
  263. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  264. package/dist/dev/define/audio/skin.css +234 -153
  265. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  266. package/dist/dev/define/audio/skin.js +61 -56
  267. package/dist/dev/define/audio/skin.js.map +1 -1
  268. package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
  269. package/dist/dev/define/audio/skin.tailwind.js +67 -61
  270. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  271. package/dist/dev/define/background/skin.css +1 -1
  272. package/dist/dev/define/background/skin.d.ts.map +1 -1
  273. package/dist/dev/define/background/skin.js +13 -1
  274. package/dist/dev/define/background/skin.js.map +1 -1
  275. package/dist/dev/define/base.css +23 -0
  276. package/dist/dev/define/media/dash-video.d.ts +14 -0
  277. package/dist/dev/define/media/dash-video.d.ts.map +1 -0
  278. package/dist/dev/define/media/dash-video.js +14 -0
  279. package/dist/dev/define/media/dash-video.js.map +1 -0
  280. package/dist/dev/define/shared.css +13 -0
  281. package/dist/dev/define/skin-mixin.d.ts +2 -2
  282. package/dist/dev/define/skin-mixin.d.ts.map +1 -1
  283. package/dist/dev/define/skin-mixin.js +16 -33
  284. package/dist/dev/define/skin-mixin.js.map +1 -1
  285. package/dist/dev/define/video/minimal-skin.css +486 -301
  286. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  287. package/dist/dev/define/video/minimal-skin.js +110 -103
  288. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  289. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  290. package/dist/dev/define/video/minimal-skin.tailwind.js +123 -116
  291. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  292. package/dist/dev/define/video/skin.css +484 -289
  293. package/dist/dev/define/video/skin.d.ts.map +1 -1
  294. package/dist/dev/define/video/skin.js +105 -100
  295. package/dist/dev/define/video/skin.js.map +1 -1
  296. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  297. package/dist/dev/define/video/skin.tailwind.js +114 -108
  298. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  299. package/dist/dev/icons/dist/render/default/index.js +2 -1
  300. package/dist/dev/icons/dist/render/default/index.js.map +1 -1
  301. package/dist/dev/icons/dist/render/minimal/index.js +2 -1
  302. package/dist/dev/icons/dist/render/minimal/index.js.map +1 -1
  303. package/dist/dev/index.d.ts +6 -4
  304. package/dist/dev/index.js +4 -2
  305. package/dist/dev/media/background-video/index.d.ts +8 -1
  306. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  307. package/dist/dev/media/background-video/index.js +5 -1
  308. package/dist/dev/media/background-video/index.js.map +1 -1
  309. package/dist/dev/media/container-element.js +5 -2
  310. package/dist/dev/media/container-element.js.map +1 -1
  311. package/dist/dev/media/dash-video/index.d.ts +13 -0
  312. package/dist/dev/media/dash-video/index.d.ts.map +1 -0
  313. package/dist/dev/media/dash-video/index.js +26 -0
  314. package/dist/dev/media/dash-video/index.js.map +1 -0
  315. package/dist/dev/media/hls-video/index.d.ts +2 -1
  316. package/dist/dev/media/hls-video/index.d.ts.map +1 -1
  317. package/dist/dev/media/hls-video/index.js +2 -1
  318. package/dist/dev/media/hls-video/index.js.map +1 -1
  319. package/dist/dev/media/simple-hls-video/index.d.ts +2 -1
  320. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
  321. package/dist/dev/media/simple-hls-video/index.js +3 -1
  322. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  323. package/dist/dev/player/context.d.ts +16 -2
  324. package/dist/dev/player/context.d.ts.map +1 -1
  325. package/dist/dev/player/context.js +6 -2
  326. package/dist/dev/player/context.js.map +1 -1
  327. package/dist/dev/player/create-player.d.ts +1 -1
  328. package/dist/dev/player/create-player.js +11 -3
  329. package/dist/dev/player/create-player.js.map +1 -1
  330. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +10 -26
  331. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  332. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +4 -3
  333. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  334. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +1 -1
  335. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  336. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +3 -3
  337. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  338. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  339. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  340. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +3 -3
  341. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  342. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +16 -0
  343. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  344. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js +13 -0
  345. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  346. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +1 -1
  347. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  348. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +1 -1
  349. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  350. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +1 -1
  351. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  352. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +1 -1
  353. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  354. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +27 -16
  355. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  356. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +11 -24
  357. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  358. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +4 -3
  359. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  360. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +1 -1
  361. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  362. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +3 -3
  363. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  364. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  365. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  366. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  367. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  368. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +4 -3
  369. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  370. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +16 -0
  371. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  372. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js +14 -0
  373. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  374. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  375. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  376. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  377. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  378. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  379. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  380. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +1 -1
  381. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  382. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +33 -16
  383. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  384. package/dist/{default/skins/dist/default/minimal/tailwind/components → dev/skins/dist/default/shared/tailwind}/icon-state.js +6 -1
  385. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  386. package/dist/dev/skins/dist/default/{minimal/tailwind/components → shared/tailwind}/tooltip-state.js +1 -1
  387. package/dist/dev/skins/dist/default/shared/tailwind/tooltip-state.js.map +1 -0
  388. package/dist/dev/store/container-mixin.d.ts +10 -5
  389. package/dist/dev/store/container-mixin.d.ts.map +1 -1
  390. package/dist/dev/store/container-mixin.js +16 -60
  391. package/dist/dev/store/container-mixin.js.map +1 -1
  392. package/dist/dev/store/media-attach-mixin.d.ts +19 -0
  393. package/dist/dev/store/media-attach-mixin.d.ts.map +1 -0
  394. package/dist/dev/store/media-attach-mixin.js +45 -0
  395. package/dist/dev/store/media-attach-mixin.js.map +1 -0
  396. package/dist/dev/store/provider-mixin.d.ts +19 -6
  397. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  398. package/dist/dev/store/provider-mixin.js +99 -9
  399. package/dist/dev/store/provider-mixin.js.map +1 -1
  400. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.d.ts +1 -1
  401. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +1 -1
  402. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.d.ts +1 -1
  403. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +1 -1
  404. package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -1
  405. package/dist/dev/ui/captions-button/captions-button-element.js +1 -1
  406. package/dist/dev/ui/context-part-element.d.ts +1 -1
  407. package/dist/dev/ui/controls/controls-element.js +1 -1
  408. package/dist/dev/ui/controls/controls-group-element.d.ts +1 -1
  409. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +1 -1
  410. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +1 -1
  411. package/dist/dev/ui/media-button-element.d.ts +1 -1
  412. package/dist/dev/ui/media-ui-element.d.ts +1 -1
  413. package/dist/dev/ui/mute-button/mute-button-element.d.ts +1 -1
  414. package/dist/dev/ui/mute-button/mute-button-element.js +1 -1
  415. package/dist/dev/ui/pip-button/pip-button-element.d.ts +1 -1
  416. package/dist/dev/ui/pip-button/pip-button-element.js +1 -1
  417. package/dist/dev/ui/play-button/play-button-element.d.ts +1 -1
  418. package/dist/dev/ui/play-button/play-button-element.js +1 -1
  419. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts +1 -1
  420. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -1
  421. package/dist/dev/ui/popover/popover-element.d.ts +1 -1
  422. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  423. package/dist/dev/ui/popover/popover-element.js +55 -4
  424. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  425. package/dist/dev/ui/poster/poster-element.d.ts +1 -1
  426. package/dist/dev/ui/poster/poster-element.js +1 -1
  427. package/dist/dev/ui/seek-button/seek-button-element.d.ts +1 -1
  428. package/dist/dev/ui/seek-button/seek-button-element.js +1 -1
  429. package/dist/dev/ui/slider/context.d.ts +1 -1
  430. package/dist/dev/ui/slider/slider-buffer-element.d.ts +1 -1
  431. package/dist/dev/ui/slider/slider-element.d.ts +1 -1
  432. package/dist/dev/ui/slider/slider-element.js +1 -1
  433. package/dist/dev/ui/slider/slider-fill-element.d.ts +1 -1
  434. package/dist/dev/ui/slider/slider-track-element.d.ts +1 -1
  435. package/dist/dev/ui/thumbnail/thumbnail-element.d.ts +1 -1
  436. package/dist/dev/ui/thumbnail/thumbnail-element.js +1 -1
  437. package/dist/dev/ui/time/time-element.d.ts +1 -1
  438. package/dist/dev/ui/time/time-element.js +1 -1
  439. package/dist/dev/ui/time-slider/time-slider-element.d.ts +1 -1
  440. package/dist/dev/ui/time-slider/time-slider-element.js +2 -2
  441. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  442. package/dist/dev/ui/tooltip/tooltip-element.d.ts +1 -1
  443. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  444. package/dist/dev/ui/tooltip/tooltip-element.js +54 -4
  445. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  446. package/dist/dev/ui/tooltip/tooltip-group-element.js +5 -2
  447. package/dist/dev/ui/tooltip/tooltip-group-element.js.map +1 -1
  448. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts +1 -1
  449. package/dist/dev/ui/volume-slider/volume-slider-element.js +3 -3
  450. package/dist/dev/ui/volume-slider/volume-slider-element.js.map +1 -1
  451. package/package.json +26 -13
  452. package/dist/default/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  453. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js +0 -28
  454. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  455. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  456. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js +0 -28
  457. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
  458. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js +0 -29
  459. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  460. package/dist/dev/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  461. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js +0 -29
  462. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  463. package/dist/dev/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
@@ -0,0 +1,2459 @@
1
+ import { B as applyStyles, C as getAnchorPositionStyle, D as createButton, E as createPopover, F as selectTime, H as tryShowPopover, I as selectVolume, M as selectPlayback, N as selectPlaybackRate, O as selectBuffer, P as selectTextTrack, S as getAnchorNameStyle, T as resolveOffsets, U as supportsAnchorPositioning, V as tryHidePopover, W as createState, _ as getSliderPreviewStyle, a as MediaElement, b as clamp, c as ContextConsumer, d as applyElementProps, f as createTransition, g as getSliderCSSVars, h as ThumbnailCore, i as MediaContainerElement, l as applyStateDataAttrs, m as createThumbnail, n as PlayerController, p as createTooltip, r as SnapshotController, s as ContextProvider, u as logMissingFeature, v as getTimeSliderCSSVars, w as getPopupPositionRect, x as roundToStep, y as createSlider } from "./create-player-AcfnN3li.js";
2
+ import { i as isNumber, o as isUndefined, t as isFunction } from "./predicate-BG-dj_kF.js";
3
+ import { i as createContext, r as playerContext } from "./context-Be8C5kVd.js";
4
+ import { t as safeDefine } from "./safe-define-B8lHgj_K.js";
5
+
6
+ //#region ../utils/dist/object/defaults.js
7
+ /**
8
+ * Creates a new object with default values filled in for undefined properties.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const props = { label: undefined, disabled: true };
13
+ * const defaultProps = { label: '', disabled: false };
14
+ * defaults(props, defaultProps); // { label: '', disabled: true }
15
+ * ```
16
+ */
17
+ function defaults(object, defaultValues) {
18
+ const result = { ...defaultValues };
19
+ for (const key in object) if (!isUndefined(object[key])) result[key] = object[key];
20
+ return result;
21
+ }
22
+
23
+ //#endregion
24
+ //#region ../utils/dist/dom/direction.js
25
+ /** Check whether an element's text direction is right-to-left. */
26
+ function isRTL(element) {
27
+ const dir = element.closest("[dir]")?.getAttribute("dir");
28
+ if (dir) return dir.toLowerCase() === "rtl";
29
+ return getComputedStyle(element).direction === "rtl";
30
+ }
31
+
32
+ //#endregion
33
+ //#region inline-css:src/define/base.js
34
+ var base_default = "video-player {\n display: contents;\n}\n\n/*\nRequired to override any default video and image styles (such as\nTailwind's CSS reset) and ensure they fill the container as expected.\n*/\nvideo-player video,\nvideo-player [slot=\"poster\"] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\nvideo-player video::-webkit-media-text-track-container {\n transition: translate var(--media-caption-track-duration, 0) ease-out;\n transition-delay: var(--media-caption-track-delay, 0);\n translate: 0 var(--media-caption-track-y, 0);\n scale: 0.98;\n z-index: 1;\n font-family: inherit;\n}\n";
35
+
36
+ //#endregion
37
+ //#region inline-css:src/define/shared.js
38
+ var shared_default = "media-tooltip-group {\n display: contents;\n}\n\n/* Fixes a weird issue with Safari when setting aspect-ratio */\n:host {\n display: grid;\n}\n\n/* Hide volume popover when volume control is unsupported (e.g., iOS Safari). */\n.media-popover--volume:has(media-volume-slider[data-availability=\"unsupported\"]) {\n display: none;\n}\n";
39
+
40
+ //#endregion
41
+ //#region src/define/skin-mixin.ts
42
+ const STYLES_ID = "__media-styles";
43
+ function ensureRootStyles() {
44
+ if (document.getElementById(STYLES_ID)) return;
45
+ const style = document.createElement("style");
46
+ style.id = STYLES_ID;
47
+ style.textContent = base_default;
48
+ document.head.appendChild(style);
49
+ }
50
+ const sharedSheet = new CSSStyleSheet();
51
+ sharedSheet.replaceSync(shared_default);
52
+ /**
53
+ * Mixin for skin elements that renders the template from a static
54
+ * `getTemplateHTML` method into a shadow root. Native `<slot>` elements
55
+ * handle light DOM projection automatically.
56
+ *
57
+ * When `static styles` is set, the stylesheet is adopted into the
58
+ * shadow root via `adoptedStyleSheets`.
59
+ */
60
+ function SkinMixin(BaseClass) {
61
+ class SkinElement extends BaseClass {
62
+ static {
63
+ this.shadowRootOptions = { mode: "open" };
64
+ }
65
+ constructor(...args) {
66
+ super(...args);
67
+ ensureRootStyles();
68
+ if (!this.shadowRoot) {
69
+ const ctor = this.constructor;
70
+ this.attachShadow(ctor.shadowRootOptions);
71
+ const sheets = [sharedSheet];
72
+ if (ctor.styles) sheets.push(ctor.styles);
73
+ this.shadowRoot.adoptedStyleSheets = sheets;
74
+ if (ctor.getTemplateHTML) this.shadowRoot.innerHTML = ctor.getTemplateHTML();
75
+ }
76
+ }
77
+ }
78
+ return SkinElement;
79
+ }
80
+ /** Create a shared `CSSStyleSheet` from a CSS string. */
81
+ function createStyles(css) {
82
+ const sheet = new CSSStyleSheet();
83
+ sheet.replaceSync(css);
84
+ return sheet;
85
+ }
86
+
87
+ //#endregion
88
+ //#region src/define/media/container.ts
89
+ safeDefine(MediaContainerElement);
90
+
91
+ //#endregion
92
+ //#region ../core/dist/dev/core/ui/transition.js
93
+ function getTransitionFlags(status) {
94
+ return {
95
+ transitionStarting: status === "starting",
96
+ transitionEnding: status === "ending"
97
+ };
98
+ }
99
+
100
+ //#endregion
101
+ //#region ../core/dist/dev/core/ui/buffering-indicator/buffering-indicator-core.js
102
+ var BufferingIndicatorCore = class BufferingIndicatorCore {
103
+ static defaultProps = { delay: 500 };
104
+ state = createState({ visible: false });
105
+ #props = { ...BufferingIndicatorCore.defaultProps };
106
+ #timer = null;
107
+ setProps(props) {
108
+ this.#props = defaults(props, BufferingIndicatorCore.defaultProps);
109
+ }
110
+ destroy() {
111
+ this.#clearTimer();
112
+ }
113
+ update(media) {
114
+ const buffering = media.waiting && !media.paused;
115
+ if (buffering && !this.state.current.visible && !this.#timer) this.#timer = setTimeout(() => {
116
+ this.#timer = null;
117
+ this.state.patch({ visible: true });
118
+ }, this.#props.delay);
119
+ else if (!buffering) {
120
+ this.#clearTimer();
121
+ this.state.patch({ visible: false });
122
+ }
123
+ }
124
+ #clearTimer() {
125
+ if (this.#timer !== null) {
126
+ clearTimeout(this.#timer);
127
+ this.#timer = null;
128
+ }
129
+ }
130
+ };
131
+
132
+ //#endregion
133
+ //#region ../core/dist/dev/core/ui/buffering-indicator/buffering-indicator-data-attrs.js
134
+ const BufferingIndicatorDataAttrs = { visible: "data-visible" };
135
+
136
+ //#endregion
137
+ //#region ../core/dist/dev/core/ui/captions-button/captions-button-core.js
138
+ var CaptionsButtonCore = class CaptionsButtonCore {
139
+ static defaultProps = {
140
+ label: "",
141
+ disabled: false
142
+ };
143
+ #props = { ...CaptionsButtonCore.defaultProps };
144
+ #media = null;
145
+ constructor(props) {
146
+ if (props) this.setProps(props);
147
+ }
148
+ setProps(props) {
149
+ this.#props = defaults(props, CaptionsButtonCore.defaultProps);
150
+ }
151
+ getLabel(state) {
152
+ const { label } = this.#props;
153
+ if (isFunction(label)) {
154
+ const customLabel = label(state);
155
+ if (customLabel) return customLabel;
156
+ } else if (label) return label;
157
+ return state.subtitlesShowing ? "Disable captions" : "Enable captions";
158
+ }
159
+ getAttrs(state) {
160
+ return {
161
+ "aria-label": this.getLabel(state),
162
+ "aria-disabled": this.#props.disabled ? "true" : void 0
163
+ };
164
+ }
165
+ setMedia(media) {
166
+ this.#media = media;
167
+ }
168
+ getState() {
169
+ const media = this.#media;
170
+ return {
171
+ subtitlesShowing: media.subtitlesShowing,
172
+ availability: media.textTrackList.some((t) => t.kind === "captions" || t.kind === "subtitles") ? "available" : "unavailable"
173
+ };
174
+ }
175
+ toggle(media) {
176
+ if (this.#props.disabled) return;
177
+ media.toggleSubtitles();
178
+ }
179
+ };
180
+
181
+ //#endregion
182
+ //#region ../core/dist/dev/core/ui/captions-button/captions-button-data-attrs.js
183
+ const CaptionsButtonDataAttrs = {
184
+ subtitlesShowing: "data-active",
185
+ availability: "data-availability"
186
+ };
187
+
188
+ //#endregion
189
+ //#region ../core/dist/dev/core/ui/controls/controls-core.js
190
+ var ControlsCore = class {
191
+ #media = null;
192
+ setMedia(media) {
193
+ this.#media = media;
194
+ }
195
+ getState() {
196
+ const media = this.#media;
197
+ return {
198
+ visible: media.controlsVisible,
199
+ userActive: media.userActive
200
+ };
201
+ }
202
+ };
203
+
204
+ //#endregion
205
+ //#region ../core/dist/dev/core/ui/controls/controls-data-attrs.js
206
+ const ControlsDataAttrs = {
207
+ visible: "data-visible",
208
+ userActive: "data-user-active"
209
+ };
210
+
211
+ //#endregion
212
+ //#region ../core/dist/dev/core/ui/fullscreen-button/fullscreen-button-core.js
213
+ var FullscreenButtonCore = class FullscreenButtonCore {
214
+ static defaultProps = {
215
+ label: "",
216
+ disabled: false
217
+ };
218
+ #props = { ...FullscreenButtonCore.defaultProps };
219
+ #media = null;
220
+ constructor(props) {
221
+ if (props) this.setProps(props);
222
+ }
223
+ setProps(props) {
224
+ this.#props = defaults(props, FullscreenButtonCore.defaultProps);
225
+ }
226
+ getLabel(state) {
227
+ const { label } = this.#props;
228
+ if (isFunction(label)) {
229
+ const customLabel = label(state);
230
+ if (customLabel) return customLabel;
231
+ } else if (label) return label;
232
+ return state.fullscreen ? "Exit fullscreen" : "Enter fullscreen";
233
+ }
234
+ getAttrs(state) {
235
+ return {
236
+ "aria-label": this.getLabel(state),
237
+ "aria-disabled": this.#props.disabled ? "true" : void 0
238
+ };
239
+ }
240
+ setMedia(media) {
241
+ this.#media = media;
242
+ }
243
+ getState() {
244
+ const media = this.#media;
245
+ return {
246
+ fullscreen: media.fullscreen,
247
+ availability: media.fullscreenAvailability
248
+ };
249
+ }
250
+ async toggle(media) {
251
+ if (this.#props.disabled) return;
252
+ if (media.fullscreenAvailability !== "available") return;
253
+ try {
254
+ if (media.fullscreen) await media.exitFullscreen();
255
+ else await media.requestFullscreen();
256
+ } catch {}
257
+ }
258
+ };
259
+
260
+ //#endregion
261
+ //#region ../core/dist/dev/core/ui/fullscreen-button/fullscreen-button-data-attrs.js
262
+ const FullscreenButtonDataAttrs = {
263
+ fullscreen: "data-fullscreen",
264
+ availability: "data-availability"
265
+ };
266
+
267
+ //#endregion
268
+ //#region ../core/dist/dev/core/ui/mute-button/mute-button-core.js
269
+ var MuteButtonCore = class MuteButtonCore {
270
+ static defaultProps = {
271
+ label: "",
272
+ disabled: false
273
+ };
274
+ #props = { ...MuteButtonCore.defaultProps };
275
+ #media = null;
276
+ constructor(props) {
277
+ if (props) this.setProps(props);
278
+ }
279
+ setProps(props) {
280
+ this.#props = defaults(props, MuteButtonCore.defaultProps);
281
+ }
282
+ getLabel(state) {
283
+ const { label } = this.#props;
284
+ if (isFunction(label)) {
285
+ const customLabel = label(state);
286
+ if (customLabel) return customLabel;
287
+ } else if (label) return label;
288
+ return state.muted ? "Unmute" : "Mute";
289
+ }
290
+ getAttrs(state) {
291
+ return {
292
+ "aria-label": this.getLabel(state),
293
+ "aria-disabled": this.#props.disabled ? "true" : void 0
294
+ };
295
+ }
296
+ setMedia(media) {
297
+ this.#media = media;
298
+ }
299
+ getState() {
300
+ const media = this.#media;
301
+ return {
302
+ muted: media.muted || media.volume === 0,
303
+ volumeLevel: getVolumeLevel(media)
304
+ };
305
+ }
306
+ toggle(media) {
307
+ if (this.#props.disabled) return;
308
+ media.toggleMuted();
309
+ }
310
+ };
311
+ function getVolumeLevel(media) {
312
+ if (media.muted || media.volume === 0) return "off";
313
+ if (media.volume < .5) return "low";
314
+ if (media.volume < .75) return "medium";
315
+ return "high";
316
+ }
317
+
318
+ //#endregion
319
+ //#region ../core/dist/dev/core/ui/mute-button/mute-button-data-attrs.js
320
+ const MuteButtonDataAttrs = {
321
+ muted: "data-muted",
322
+ volumeLevel: "data-volume-level"
323
+ };
324
+
325
+ //#endregion
326
+ //#region ../core/dist/dev/core/ui/pip-button/pip-button-core.js
327
+ var PiPButtonCore = class PiPButtonCore {
328
+ static defaultProps = {
329
+ label: "",
330
+ disabled: false
331
+ };
332
+ #props = { ...PiPButtonCore.defaultProps };
333
+ #media = null;
334
+ constructor(props) {
335
+ if (props) this.setProps(props);
336
+ }
337
+ setProps(props) {
338
+ this.#props = defaults(props, PiPButtonCore.defaultProps);
339
+ }
340
+ getLabel(state) {
341
+ const { label } = this.#props;
342
+ if (isFunction(label)) {
343
+ const customLabel = label(state);
344
+ if (customLabel) return customLabel;
345
+ } else if (label) return label;
346
+ return state.pip ? "Exit picture-in-picture" : "Enter picture-in-picture";
347
+ }
348
+ getAttrs(state) {
349
+ return {
350
+ "aria-label": this.getLabel(state),
351
+ "aria-disabled": this.#props.disabled ? "true" : void 0
352
+ };
353
+ }
354
+ setMedia(media) {
355
+ this.#media = media;
356
+ }
357
+ getState() {
358
+ const media = this.#media;
359
+ return {
360
+ pip: media.pip,
361
+ availability: media.pipAvailability
362
+ };
363
+ }
364
+ async toggle(media) {
365
+ if (this.#props.disabled) return;
366
+ if (media.pipAvailability !== "available") return;
367
+ try {
368
+ if (media.pip) await media.exitPictureInPicture();
369
+ else await media.requestPictureInPicture();
370
+ } catch {}
371
+ }
372
+ };
373
+
374
+ //#endregion
375
+ //#region ../core/dist/dev/core/ui/pip-button/pip-button-data-attrs.js
376
+ const PiPButtonDataAttrs = {
377
+ pip: "data-pip",
378
+ availability: "data-availability"
379
+ };
380
+
381
+ //#endregion
382
+ //#region ../core/dist/dev/core/ui/play-button/play-button-core.js
383
+ var PlayButtonCore = class PlayButtonCore {
384
+ static defaultProps = {
385
+ label: "",
386
+ disabled: false
387
+ };
388
+ #props = { ...PlayButtonCore.defaultProps };
389
+ #media = null;
390
+ constructor(props) {
391
+ if (props) this.setProps(props);
392
+ }
393
+ setProps(props) {
394
+ this.#props = defaults(props, PlayButtonCore.defaultProps);
395
+ }
396
+ getLabel(state) {
397
+ const { label } = this.#props;
398
+ if (isFunction(label)) {
399
+ const customLabel = label(state);
400
+ if (customLabel) return customLabel;
401
+ } else if (label) return label;
402
+ if (state.ended) return "Replay";
403
+ return state.paused ? "Play" : "Pause";
404
+ }
405
+ getAttrs(state) {
406
+ return {
407
+ "aria-label": this.getLabel(state),
408
+ "aria-disabled": this.#props.disabled ? "true" : void 0
409
+ };
410
+ }
411
+ setMedia(media) {
412
+ this.#media = media;
413
+ }
414
+ getState() {
415
+ const media = this.#media;
416
+ return {
417
+ paused: media.paused,
418
+ ended: media.ended,
419
+ started: media.started
420
+ };
421
+ }
422
+ async toggle(media) {
423
+ if (this.#props.disabled) return;
424
+ if (media.paused || media.ended) return media.play();
425
+ media.pause();
426
+ }
427
+ };
428
+
429
+ //#endregion
430
+ //#region ../core/dist/dev/core/ui/play-button/play-button-data-attrs.js
431
+ const PlayButtonDataAttrs = {
432
+ paused: "data-paused",
433
+ ended: "data-ended",
434
+ started: "data-started"
435
+ };
436
+
437
+ //#endregion
438
+ //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-core.js
439
+ var PlaybackRateButtonCore = class PlaybackRateButtonCore {
440
+ static defaultProps = {
441
+ label: "",
442
+ disabled: false
443
+ };
444
+ #props = { ...PlaybackRateButtonCore.defaultProps };
445
+ #media = null;
446
+ constructor(props) {
447
+ if (props) this.setProps(props);
448
+ }
449
+ setProps(props) {
450
+ this.#props = defaults(props, PlaybackRateButtonCore.defaultProps);
451
+ }
452
+ getLabel(state) {
453
+ const { label } = this.#props;
454
+ if (isFunction(label)) {
455
+ const customLabel = label(state);
456
+ if (customLabel) return customLabel;
457
+ } else if (label) return label;
458
+ return `Playback rate ${state.rate}`;
459
+ }
460
+ getAttrs(state) {
461
+ return {
462
+ "aria-label": this.getLabel(state),
463
+ "aria-disabled": this.#props.disabled ? "true" : void 0
464
+ };
465
+ }
466
+ setMedia(media) {
467
+ this.#media = media;
468
+ }
469
+ getState() {
470
+ return { rate: this.#media.playbackRate };
471
+ }
472
+ cycle(media) {
473
+ if (this.#props.disabled) return;
474
+ const { playbackRates, playbackRate } = media;
475
+ if (playbackRates.length === 0) return;
476
+ const idx = playbackRates.indexOf(playbackRate);
477
+ const next = idx === -1 ? playbackRates.find((r) => r > playbackRate) ?? playbackRates[0] : playbackRates[(idx + 1) % playbackRates.length];
478
+ media.setPlaybackRate(next);
479
+ }
480
+ };
481
+
482
+ //#endregion
483
+ //#region ../core/dist/dev/core/ui/playback-rate-button/playback-rate-button-data-attrs.js
484
+ const PlaybackRateButtonDataAttrs = { rate: "data-rate" };
485
+
486
+ //#endregion
487
+ //#region ../core/dist/dev/core/ui/popover/popover-core.js
488
+ var PopoverCore = class PopoverCore {
489
+ static defaultProps = {
490
+ side: "top",
491
+ align: "center",
492
+ modal: false,
493
+ closeOnEscape: true,
494
+ closeOnOutsideClick: true,
495
+ open: false,
496
+ defaultOpen: false,
497
+ openOnHover: false,
498
+ delay: 300,
499
+ closeDelay: 0
500
+ };
501
+ #props = { ...PopoverCore.defaultProps };
502
+ constructor(props) {
503
+ if (props) this.setProps(props);
504
+ }
505
+ setProps(props) {
506
+ this.#props = defaults(props, PopoverCore.defaultProps);
507
+ }
508
+ #input = null;
509
+ setInput(input) {
510
+ this.#input = input;
511
+ }
512
+ getState() {
513
+ const input = this.#input;
514
+ return {
515
+ open: input.active,
516
+ status: input.status,
517
+ side: this.#props.side,
518
+ align: this.#props.align,
519
+ modal: this.#props.modal,
520
+ ...getTransitionFlags(input.status)
521
+ };
522
+ }
523
+ getTriggerAttrs(state, popupId) {
524
+ return {
525
+ "aria-expanded": state.open ? "true" : "false",
526
+ "aria-haspopup": "dialog",
527
+ "aria-controls": popupId
528
+ };
529
+ }
530
+ getPopupAttrs(state) {
531
+ return {
532
+ popover: "manual",
533
+ role: "dialog",
534
+ "aria-modal": state.modal === true ? "true" : void 0
535
+ };
536
+ }
537
+ };
538
+
539
+ //#endregion
540
+ //#region ../core/dist/dev/core/ui/popover/popover-data-attrs.js
541
+ const PopoverDataAttrs = {
542
+ open: "data-open",
543
+ side: "data-side",
544
+ align: "data-align",
545
+ transitionStarting: "data-starting-style",
546
+ transitionEnding: "data-ending-style"
547
+ };
548
+
549
+ //#endregion
550
+ //#region ../core/dist/dev/core/ui/poster/poster-core.js
551
+ var PosterCore = class {
552
+ #media = null;
553
+ setMedia(media) {
554
+ this.#media = media;
555
+ }
556
+ getState() {
557
+ return { visible: !this.#media.started };
558
+ }
559
+ };
560
+
561
+ //#endregion
562
+ //#region ../core/dist/dev/core/ui/poster/poster-data-attrs.js
563
+ const PosterDataAttrs = { visible: "data-visible" };
564
+
565
+ //#endregion
566
+ //#region ../core/dist/dev/core/ui/seek-button/seek-button-core.js
567
+ var SeekButtonCore = class SeekButtonCore {
568
+ static defaultProps = {
569
+ seconds: 30,
570
+ label: "",
571
+ disabled: false
572
+ };
573
+ #props = { ...SeekButtonCore.defaultProps };
574
+ #media = null;
575
+ constructor(props) {
576
+ if (props) this.setProps(props);
577
+ }
578
+ setProps(props) {
579
+ this.#props = defaults(props, SeekButtonCore.defaultProps);
580
+ }
581
+ getLabel(state) {
582
+ const { label } = this.#props;
583
+ if (isFunction(label)) {
584
+ const customLabel = label(state);
585
+ if (customLabel) return customLabel;
586
+ } else if (label) return label;
587
+ const abs = Math.abs(this.#props.seconds);
588
+ return state.direction === "backward" ? `Seek backward ${abs} seconds` : `Seek forward ${abs} seconds`;
589
+ }
590
+ getAttrs(state) {
591
+ return {
592
+ "aria-label": this.getLabel(state),
593
+ "aria-disabled": this.#props.disabled ? "true" : void 0
594
+ };
595
+ }
596
+ setMedia(media) {
597
+ this.#media = media;
598
+ }
599
+ getState() {
600
+ return {
601
+ seeking: this.#media.seeking,
602
+ direction: this.#props.seconds < 0 ? "backward" : "forward"
603
+ };
604
+ }
605
+ async seek(media) {
606
+ if (this.#props.disabled) return;
607
+ await media.seek(media.currentTime + this.#props.seconds);
608
+ }
609
+ };
610
+
611
+ //#endregion
612
+ //#region ../core/dist/dev/core/ui/seek-button/seek-button-data-attrs.js
613
+ const SeekButtonDataAttrs = {
614
+ seeking: "data-seeking",
615
+ direction: "data-direction"
616
+ };
617
+
618
+ //#endregion
619
+ //#region ../core/dist/dev/core/ui/slider/slider-core.js
620
+ /** Base slider logic: value mapping, ARIA attrs, and step calculations. */
621
+ var SliderCore = class SliderCore {
622
+ static defaultProps = {
623
+ label: "",
624
+ step: 1,
625
+ largeStep: 10,
626
+ orientation: "horizontal",
627
+ disabled: false,
628
+ thumbAlignment: "center",
629
+ value: 0,
630
+ min: 0,
631
+ max: 100
632
+ };
633
+ static defaultInput = {
634
+ pointerPercent: 0,
635
+ dragPercent: 0,
636
+ dragging: false,
637
+ pointing: false,
638
+ focused: false
639
+ };
640
+ #props = { ...SliderCore.defaultProps };
641
+ #input = { ...SliderCore.defaultInput };
642
+ get props() {
643
+ return this.#props;
644
+ }
645
+ get input() {
646
+ return this.#input;
647
+ }
648
+ constructor(props) {
649
+ if (props) this.setProps(props);
650
+ }
651
+ setProps(props) {
652
+ this.#props = defaults(props, SliderCore.defaultProps);
653
+ }
654
+ setInput(input) {
655
+ this.#input = input;
656
+ }
657
+ getSliderState(value) {
658
+ const { orientation, disabled, thumbAlignment } = this.#props;
659
+ const { pointerPercent, dragging, pointing, focused } = this.#input;
660
+ return {
661
+ value,
662
+ fillPercent: this.percentFromValue(value),
663
+ pointerPercent,
664
+ dragging,
665
+ pointing,
666
+ interactive: dragging || pointing || focused,
667
+ orientation,
668
+ disabled,
669
+ thumbAlignment
670
+ };
671
+ }
672
+ getLabel(state) {
673
+ const { label } = this.#props;
674
+ if (isFunction(label)) {
675
+ const customLabel = label(state);
676
+ if (customLabel) return customLabel;
677
+ } else if (label) return label;
678
+ return "";
679
+ }
680
+ getAttrs(state) {
681
+ return {
682
+ role: "slider",
683
+ tabIndex: state.disabled ? -1 : 0,
684
+ autoComplete: "off",
685
+ "aria-label": this.getLabel(state),
686
+ "aria-valuemin": this.#props.min,
687
+ "aria-valuemax": this.#props.max,
688
+ "aria-valuenow": state.value,
689
+ "aria-orientation": state.orientation,
690
+ "aria-disabled": state.disabled ? "true" : void 0
691
+ };
692
+ }
693
+ valueFromPercent(percent) {
694
+ const { min, max, step } = this.#props;
695
+ return roundToStep(clamp(min + percent / 100 * (max - min), min, max), step, min);
696
+ }
697
+ /** Convert percent to a clamped value without applying step rounding. */
698
+ rawValueFromPercent(percent) {
699
+ const { min, max } = this.#props;
700
+ return clamp(min + percent / 100 * (max - min), min, max);
701
+ }
702
+ percentFromValue(value) {
703
+ const { min, max } = this.#props;
704
+ if (max === min) return 0;
705
+ return (value - min) / (max - min) * 100;
706
+ }
707
+ /** Step as a percentage of the slider range. */
708
+ getStepPercent() {
709
+ const { step, min, max } = this.#props;
710
+ const range = max - min;
711
+ return range > 0 ? step / range * 100 : 0;
712
+ }
713
+ /** Large step as a percentage of the slider range. */
714
+ getLargeStepPercent() {
715
+ const { largeStep, min, max } = this.#props;
716
+ const range = max - min;
717
+ return range > 0 ? largeStep / range * 100 : 0;
718
+ }
719
+ adjustPercentForAlignment(rawPercent, thumbSize, trackSize) {
720
+ if (this.#props.thumbAlignment === "center" || trackSize === 0) return rawPercent;
721
+ const thumbHalf = thumbSize / trackSize * 100 / 2;
722
+ const minPercent = thumbHalf;
723
+ const maxPercent = 100 - thumbHalf;
724
+ return minPercent + rawPercent / 100 * (maxPercent - minPercent);
725
+ }
726
+ };
727
+
728
+ //#endregion
729
+ //#region ../core/dist/dev/core/ui/slider/slider-data-attrs.js
730
+ const SliderDataAttrs = {
731
+ dragging: "data-dragging",
732
+ pointing: "data-pointing",
733
+ interactive: "data-interactive",
734
+ orientation: "data-orientation",
735
+ disabled: "data-disabled"
736
+ };
737
+
738
+ //#endregion
739
+ //#region ../core/dist/dev/core/ui/thumbnail/thumbnail-data-attrs.js
740
+ const ThumbnailDataAttrs = {
741
+ loading: "data-loading",
742
+ error: "data-error",
743
+ hidden: "data-hidden"
744
+ };
745
+
746
+ //#endregion
747
+ //#region ../core/dist/dev/core/ui/thumbnail/thumbnail-media-fragment.js
748
+ /** Parse `url#xywh=x,y,w,h` into a URL and optional sprite coordinates. */
749
+ function parseMediaFragment(text, baseURL) {
750
+ const parts = text.trim().split("#");
751
+ const rawURL = parts[0] ?? "";
752
+ const hash = parts[1];
753
+ const url = baseURL ? new URL(rawURL, baseURL).href : rawURL;
754
+ if (!hash) return { url };
755
+ const eqIndex = hash.indexOf("=");
756
+ if (eqIndex === -1) return { url };
757
+ const keys = hash.slice(0, eqIndex);
758
+ const values = hash.slice(eqIndex + 1).split(",").map(Number);
759
+ const data = {};
760
+ for (let i = 0; i < keys.length; i++) {
761
+ const key = keys[i];
762
+ const value = values[i];
763
+ if (key && isNumber(value) && !Number.isNaN(value)) data[key] = value;
764
+ }
765
+ const result = { url };
766
+ if (isNumber(data.w)) result.width = data.w;
767
+ if (isNumber(data.h)) result.height = data.h;
768
+ if (isNumber(data.x) && isNumber(data.y)) result.coords = {
769
+ x: data.x,
770
+ y: data.y
771
+ };
772
+ return result;
773
+ }
774
+ /**
775
+ * Convert an array of text cues (e.g. `VTTCue` from a `<track>` element)
776
+ * into {@link ThumbnailImage} entries by parsing the media-fragment in
777
+ * each cue's text.
778
+ */
779
+ function mapCuesToThumbnails(cues, baseURL) {
780
+ const images = [];
781
+ for (const cue of cues) {
782
+ const fragment = parseMediaFragment(cue.text, baseURL);
783
+ const image = {
784
+ url: fragment.url,
785
+ startTime: cue.startTime,
786
+ endTime: cue.endTime
787
+ };
788
+ if (fragment.width) image.width = fragment.width;
789
+ if (fragment.height) image.height = fragment.height;
790
+ if (fragment.coords) image.coords = fragment.coords;
791
+ images.push(image);
792
+ }
793
+ return images;
794
+ }
795
+
796
+ //#endregion
797
+ //#region ../utils/dist/time/format.js
798
+ const UNIT_LABELS = [
799
+ {
800
+ singular: "hour",
801
+ plural: "hours"
802
+ },
803
+ {
804
+ singular: "minute",
805
+ plural: "minutes"
806
+ },
807
+ {
808
+ singular: "second",
809
+ plural: "seconds"
810
+ }
811
+ ];
812
+ function isValidTime(value) {
813
+ return isNumber(value) && Number.isFinite(value);
814
+ }
815
+ function toTimeUnitPhrase(value, unitIndex) {
816
+ return `${value} ${value === 1 ? UNIT_LABELS[unitIndex]?.singular : UNIT_LABELS[unitIndex]?.plural}`;
817
+ }
818
+ /**
819
+ * Format seconds to digital display string.
820
+ *
821
+ * @param seconds - Time in seconds (can be negative)
822
+ * @param guide - Guide time (typically duration) to determine display format
823
+ * @returns Formatted string like "1:30" or "1:05:30"
824
+ *
825
+ * @example
826
+ * formatTime(90) // "1:30"
827
+ * formatTime(3661) // "1:01:01"
828
+ * formatTime(35, 3600) // "0:00:35" (guided by 1-hour duration)
829
+ * formatTime(35, 600) // "00:35" (guided by 10-minute duration)
830
+ */
831
+ function formatTime(seconds, guide) {
832
+ if (!isValidTime(seconds)) return "0:00";
833
+ const negative = seconds < 0;
834
+ const positiveSeconds = Math.abs(seconds);
835
+ const h = Math.floor(positiveSeconds / 3600);
836
+ const m = Math.floor(positiveSeconds / 60 % 60);
837
+ const s = Math.floor(positiveSeconds % 60);
838
+ const guideAbs = guide ? Math.abs(guide) : 0;
839
+ const gh = Math.floor(guideAbs / 3600);
840
+ const gm = Math.floor(guideAbs / 60 % 60);
841
+ const showHours = h > 0 || gh > 0;
842
+ const padMinutes = showHours || gm >= 10;
843
+ const hoursStr = showHours ? `${h}:` : "";
844
+ const minutesStr = `${padMinutes && m < 10 ? "0" : ""}${m}:`;
845
+ const secondsStr = s < 10 ? `0${s}` : `${s}`;
846
+ return `${negative ? "-" : ""}${hoursStr}${minutesStr}${secondsStr}`;
847
+ }
848
+ /**
849
+ * Format seconds to human-readable phrase for screen readers.
850
+ *
851
+ * @param seconds - Time in seconds (negative indicates remaining)
852
+ * @returns Human-readable phrase like "1 minute, 30 seconds"
853
+ *
854
+ * @example
855
+ * formatTimeAsPhrase(90) // "1 minute, 30 seconds"
856
+ * formatTimeAsPhrase(3661) // "1 hour, 1 minute, 1 second"
857
+ * formatTimeAsPhrase(-270) // "4 minutes, 30 seconds remaining"
858
+ */
859
+ function formatTimeAsPhrase(seconds) {
860
+ if (!isValidTime(seconds)) return "";
861
+ const negative = seconds < 0;
862
+ const positiveSeconds = Math.abs(seconds);
863
+ const h = Math.floor(positiveSeconds / 3600);
864
+ const m = Math.floor(positiveSeconds / 60 % 60);
865
+ const s = Math.floor(positiveSeconds % 60);
866
+ if (positiveSeconds === 0) return `${toTimeUnitPhrase(0, 2)}${negative ? " remaining" : ""}`;
867
+ return `${[
868
+ h,
869
+ m,
870
+ s
871
+ ].map((value, index) => value > 0 ? toTimeUnitPhrase(value, index) : null).filter(Boolean).join(", ")}${negative ? " remaining" : ""}`;
872
+ }
873
+ /**
874
+ * Convert seconds to ISO 8601 duration for datetime attribute.
875
+ *
876
+ * @param seconds - Time in seconds
877
+ * @returns ISO 8601 duration string like "PT1M30S"
878
+ *
879
+ * @example
880
+ * secondsToIsoDuration(90) // "PT1M30S"
881
+ * secondsToIsoDuration(3661) // "PT1H1M1S"
882
+ */
883
+ function secondsToIsoDuration(seconds) {
884
+ if (!isValidTime(seconds)) return "PT0S";
885
+ const positiveSeconds = Math.abs(seconds);
886
+ const h = Math.floor(positiveSeconds / 3600);
887
+ const m = Math.floor(positiveSeconds / 60 % 60);
888
+ const s = Math.floor(positiveSeconds % 60);
889
+ let duration = "PT";
890
+ if (h > 0) duration += `${h}H`;
891
+ if (m > 0) duration += `${m}M`;
892
+ if (s > 0 || duration === "PT") duration += `${s}S`;
893
+ return duration;
894
+ }
895
+
896
+ //#endregion
897
+ //#region ../core/dist/dev/core/ui/time/time-core.js
898
+ const DEFAULT_LABELS = {
899
+ current: "Current time",
900
+ duration: "Duration",
901
+ remaining: "Remaining"
902
+ };
903
+ var TimeCore = class TimeCore {
904
+ static defaultProps = {
905
+ type: "current",
906
+ negativeSign: "-",
907
+ label: ""
908
+ };
909
+ #props = { ...TimeCore.defaultProps };
910
+ #media = null;
911
+ constructor(props) {
912
+ if (props) this.setProps(props);
913
+ }
914
+ setProps(props) {
915
+ this.#props = defaults(props, TimeCore.defaultProps);
916
+ }
917
+ setMedia(media) {
918
+ this.#media = media;
919
+ }
920
+ #getSeconds() {
921
+ const media = this.#media;
922
+ const { type } = this.#props;
923
+ switch (type) {
924
+ case "current": return media.currentTime;
925
+ case "duration": return media.duration;
926
+ case "remaining": return media.currentTime - media.duration;
927
+ default: return 0;
928
+ }
929
+ }
930
+ #getText() {
931
+ const media = this.#media;
932
+ const seconds = this.#getSeconds();
933
+ return formatTime(Math.abs(seconds), media.duration);
934
+ }
935
+ #getPhrase() {
936
+ const { type } = this.#props;
937
+ const seconds = this.#getSeconds();
938
+ if (type === "remaining") return formatTimeAsPhrase(seconds < 0 ? seconds : -Math.abs(seconds));
939
+ return formatTimeAsPhrase(seconds);
940
+ }
941
+ #getDatetime() {
942
+ const seconds = this.#getSeconds();
943
+ return secondsToIsoDuration(Math.abs(seconds));
944
+ }
945
+ getLabel(state) {
946
+ const { label } = this.#props;
947
+ if (isFunction(label)) {
948
+ const customLabel = label(state);
949
+ if (customLabel) return customLabel;
950
+ } else if (label) return label;
951
+ return DEFAULT_LABELS[this.#props.type];
952
+ }
953
+ getAttrs(state) {
954
+ return {
955
+ "aria-label": this.getLabel(state),
956
+ "aria-valuetext": state.phrase
957
+ };
958
+ }
959
+ getState() {
960
+ const seconds = this.#getSeconds();
961
+ return {
962
+ type: this.#props.type,
963
+ seconds,
964
+ negative: this.#props.type === "remaining" && seconds < 0,
965
+ text: this.#getText(),
966
+ phrase: this.#getPhrase(),
967
+ datetime: this.#getDatetime()
968
+ };
969
+ }
970
+ };
971
+
972
+ //#endregion
973
+ //#region ../core/dist/dev/core/ui/time/time-data-attrs.js
974
+ const TimeDataAttrs = { type: "data-type" };
975
+
976
+ //#endregion
977
+ //#region ../core/dist/dev/core/ui/time-slider/time-slider-core.js
978
+ /** Time-domain slider: maps media time/buffer state to slider state. */
979
+ var TimeSliderCore = class TimeSliderCore extends SliderCore {
980
+ static defaultProps = {
981
+ ...SliderCore.defaultProps,
982
+ label: "Seek",
983
+ commitThrottle: 100
984
+ };
985
+ #props = { ...TimeSliderCore.defaultProps };
986
+ #media = null;
987
+ constructor(props) {
988
+ super();
989
+ if (props) this.setProps(props);
990
+ }
991
+ setProps(props) {
992
+ this.#props = defaults(props, TimeSliderCore.defaultProps);
993
+ super.setProps({
994
+ ...props,
995
+ min: 0
996
+ });
997
+ }
998
+ setMedia(media) {
999
+ this.#media = media;
1000
+ }
1001
+ getState() {
1002
+ const { duration, currentTime, seeking, buffered } = this.#media;
1003
+ const { dragging, dragPercent } = this.input;
1004
+ super.setProps({
1005
+ ...this.#props,
1006
+ min: 0,
1007
+ max: duration
1008
+ });
1009
+ const value = dragging ? clamp(dragPercent / 100 * duration, 0, duration) : currentTime;
1010
+ const base = super.getSliderState(value);
1011
+ const bufferedEnd = buffered.length > 0 ? buffered[buffered.length - 1][1] : 0;
1012
+ const bufferPercent = duration > 0 ? bufferedEnd / duration * 100 : 0;
1013
+ return {
1014
+ ...base,
1015
+ currentTime,
1016
+ duration,
1017
+ seeking,
1018
+ bufferPercent
1019
+ };
1020
+ }
1021
+ getLabel(state) {
1022
+ return super.getLabel(state) || "Seek";
1023
+ }
1024
+ getAttrs(state) {
1025
+ const base = super.getAttrs(state);
1026
+ const currentPhrase = formatTimeAsPhrase(state.value);
1027
+ const durationPhrase = formatTimeAsPhrase(state.duration);
1028
+ const valuetext = durationPhrase ? `${currentPhrase} of ${durationPhrase}` : currentPhrase;
1029
+ return {
1030
+ ...base,
1031
+ "aria-valuetext": valuetext
1032
+ };
1033
+ }
1034
+ };
1035
+
1036
+ //#endregion
1037
+ //#region ../core/dist/dev/core/ui/time-slider/time-slider-data-attrs.js
1038
+ const TimeSliderDataAttrs = {
1039
+ ...SliderDataAttrs,
1040
+ seeking: "data-seeking"
1041
+ };
1042
+
1043
+ //#endregion
1044
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-core.js
1045
+ var TooltipCore = class TooltipCore {
1046
+ static defaultProps = {
1047
+ side: "top",
1048
+ align: "center",
1049
+ open: false,
1050
+ defaultOpen: false,
1051
+ delay: 600,
1052
+ closeDelay: 0,
1053
+ disableHoverablePopup: true,
1054
+ disabled: false
1055
+ };
1056
+ #props = { ...TooltipCore.defaultProps };
1057
+ constructor(props) {
1058
+ if (props) this.setProps(props);
1059
+ }
1060
+ setProps(props) {
1061
+ this.#props = defaults(props, TooltipCore.defaultProps);
1062
+ }
1063
+ #input = null;
1064
+ setInput(input) {
1065
+ this.#input = input;
1066
+ }
1067
+ getState() {
1068
+ const input = this.#input;
1069
+ return {
1070
+ open: input.active,
1071
+ status: input.status,
1072
+ side: this.#props.side,
1073
+ align: this.#props.align,
1074
+ ...getTransitionFlags(input.status)
1075
+ };
1076
+ }
1077
+ getTriggerAttrs(state, popupId) {
1078
+ return { "aria-describedby": state.open ? popupId : void 0 };
1079
+ }
1080
+ getPopupAttrs(_state) {
1081
+ return {
1082
+ popover: "manual",
1083
+ role: "tooltip"
1084
+ };
1085
+ }
1086
+ };
1087
+
1088
+ //#endregion
1089
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-css-vars.js
1090
+ const TooltipCSSVars = {
1091
+ sideOffset: "--media-tooltip-side-offset",
1092
+ alignOffset: "--media-tooltip-align-offset",
1093
+ anchorWidth: "--media-tooltip-anchor-width",
1094
+ anchorHeight: "--media-tooltip-anchor-height",
1095
+ availableWidth: "--media-tooltip-available-width",
1096
+ availableHeight: "--media-tooltip-available-height"
1097
+ };
1098
+
1099
+ //#endregion
1100
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-data-attrs.js
1101
+ const TooltipDataAttrs = {
1102
+ open: "data-open",
1103
+ side: "data-side",
1104
+ align: "data-align",
1105
+ transitionStarting: "data-starting-style",
1106
+ transitionEnding: "data-ending-style"
1107
+ };
1108
+
1109
+ //#endregion
1110
+ //#region ../core/dist/dev/core/ui/tooltip/tooltip-group-core.js
1111
+ var TooltipGroupCore = class TooltipGroupCore {
1112
+ static defaultProps = {
1113
+ delay: 600,
1114
+ closeDelay: 0,
1115
+ timeout: 400
1116
+ };
1117
+ #props = { ...TooltipGroupCore.defaultProps };
1118
+ #lastCloseTime = 0;
1119
+ #isOpen = false;
1120
+ constructor(props) {
1121
+ if (props) this.setProps(props);
1122
+ }
1123
+ setProps(props) {
1124
+ this.#props = defaults(props, TooltipGroupCore.defaultProps);
1125
+ }
1126
+ get delay() {
1127
+ return this.#props.delay;
1128
+ }
1129
+ get closeDelay() {
1130
+ return this.#props.closeDelay;
1131
+ }
1132
+ shouldSkipDelay() {
1133
+ if (this.#isOpen) return true;
1134
+ return Date.now() - this.#lastCloseTime < this.#props.timeout;
1135
+ }
1136
+ notifyOpen() {
1137
+ this.#isOpen = true;
1138
+ }
1139
+ notifyClose() {
1140
+ this.#isOpen = false;
1141
+ this.#lastCloseTime = Date.now();
1142
+ }
1143
+ };
1144
+
1145
+ //#endregion
1146
+ //#region ../core/dist/dev/core/ui/volume-slider/volume-slider-core.js
1147
+ /** Volume-domain slider: maps media volume/mute state to slider state. */
1148
+ var VolumeSliderCore = class VolumeSliderCore extends SliderCore {
1149
+ static defaultProps = {
1150
+ ...SliderCore.defaultProps,
1151
+ label: "Volume"
1152
+ };
1153
+ #media = null;
1154
+ constructor(props) {
1155
+ super();
1156
+ if (props) this.setProps(props);
1157
+ }
1158
+ setProps(props) {
1159
+ super.setProps(defaults(props, VolumeSliderCore.defaultProps));
1160
+ }
1161
+ setMedia(media) {
1162
+ this.#media = media;
1163
+ }
1164
+ getState() {
1165
+ const media = this.#media;
1166
+ const { volume, muted } = media;
1167
+ const effectivelyMuted = muted || volume === 0;
1168
+ const { dragging, dragPercent } = this.input;
1169
+ const volumePercent = volume * 100;
1170
+ const value = dragging ? this.valueFromPercent(dragPercent) : volumePercent;
1171
+ const base = super.getSliderState(value);
1172
+ return {
1173
+ ...base,
1174
+ fillPercent: effectivelyMuted ? 0 : base.fillPercent,
1175
+ volume,
1176
+ muted: effectivelyMuted,
1177
+ availability: media.volumeAvailability
1178
+ };
1179
+ }
1180
+ getLabel(state) {
1181
+ return super.getLabel(state) || "Volume";
1182
+ }
1183
+ getAttrs(state) {
1184
+ const base = super.getAttrs(state);
1185
+ const valuetext = `${Math.round(state.value)} percent${state.muted ? ", muted" : ""}`;
1186
+ return {
1187
+ ...base,
1188
+ "aria-valuetext": valuetext
1189
+ };
1190
+ }
1191
+ };
1192
+
1193
+ //#endregion
1194
+ //#region ../core/dist/dev/core/ui/volume-slider/volume-slider-data-attrs.js
1195
+ const VolumeSliderDataAttrs = {
1196
+ ...SliderDataAttrs,
1197
+ availability: "data-availability"
1198
+ };
1199
+
1200
+ //#endregion
1201
+ //#region src/ui/media-button-element.ts
1202
+ /** Abstract base for HTML custom elements that render a media-control button. */
1203
+ var MediaButtonElement = class extends MediaElement {
1204
+ constructor(..._args) {
1205
+ super(..._args);
1206
+ this.disabled = false;
1207
+ this.label = "";
1208
+ }
1209
+ static {
1210
+ this.properties = {
1211
+ label: { type: String },
1212
+ disabled: { type: Boolean }
1213
+ };
1214
+ }
1215
+ #disconnect = null;
1216
+ connectedCallback() {
1217
+ super.connectedCallback();
1218
+ this.#disconnect = new AbortController();
1219
+ const buttonProps = createButton({
1220
+ onActivate: () => this.activate(this.mediaState.value),
1221
+ isDisabled: () => this.disabled || !this.mediaState.value
1222
+ });
1223
+ applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });
1224
+ if (!this.mediaState.value && this.mediaState.displayName) logMissingFeature(this.localName, this.mediaState.displayName);
1225
+ }
1226
+ disconnectedCallback() {
1227
+ super.disconnectedCallback();
1228
+ this.#disconnect?.abort();
1229
+ this.#disconnect = null;
1230
+ }
1231
+ willUpdate(changed) {
1232
+ super.willUpdate(changed);
1233
+ this.core.setProps?.(this);
1234
+ }
1235
+ update(changed) {
1236
+ super.update(changed);
1237
+ const media = this.mediaState.value;
1238
+ if (!media) return;
1239
+ this.core.setMedia(media);
1240
+ const state = this.core.getState();
1241
+ applyElementProps(this, this.core.getAttrs?.(state) ?? {});
1242
+ applyStateDataAttrs(this, state, this.stateAttrMap);
1243
+ }
1244
+ };
1245
+
1246
+ //#endregion
1247
+ //#region src/ui/context-part-element.ts
1248
+ /**
1249
+ * Abstract base for compound-component part elements that consume a parent
1250
+ * context and apply data attributes from `ctx.state` + `ctx.stateAttrMap`.
1251
+ *
1252
+ * Subclasses only need to declare the `consumer` property:
1253
+ *
1254
+ * ```ts
1255
+ * export class SliderTrackElement extends ContextPartElement<SliderState> {
1256
+ * static readonly tagName = 'media-slider-track';
1257
+ * protected readonly consumer = new ContextConsumer(this, { context: sliderContext, subscribe: true });
1258
+ * }
1259
+ * ```
1260
+ */
1261
+ var ContextPartElement = class extends MediaElement {
1262
+ update(_changed) {
1263
+ super.update(_changed);
1264
+ const ctx = this.consumer.value;
1265
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
1266
+ }
1267
+ };
1268
+
1269
+ //#endregion
1270
+ //#region src/ui/mute-button/mute-button-element.ts
1271
+ var MuteButtonElement = class extends MediaButtonElement {
1272
+ constructor(..._args) {
1273
+ super(..._args);
1274
+ this.core = new MuteButtonCore();
1275
+ this.stateAttrMap = MuteButtonDataAttrs;
1276
+ this.mediaState = new PlayerController(this, playerContext, selectVolume);
1277
+ }
1278
+ static {
1279
+ this.tagName = "media-mute-button";
1280
+ }
1281
+ activate(state) {
1282
+ this.core.toggle(state);
1283
+ }
1284
+ };
1285
+
1286
+ //#endregion
1287
+ //#region src/define/ui/mute-button.ts
1288
+ safeDefine(MuteButtonElement);
1289
+
1290
+ //#endregion
1291
+ //#region src/ui/play-button/play-button-element.ts
1292
+ var PlayButtonElement = class extends MediaButtonElement {
1293
+ constructor(..._args) {
1294
+ super(..._args);
1295
+ this.core = new PlayButtonCore();
1296
+ this.stateAttrMap = PlayButtonDataAttrs;
1297
+ this.mediaState = new PlayerController(this, playerContext, selectPlayback);
1298
+ }
1299
+ static {
1300
+ this.tagName = "media-play-button";
1301
+ }
1302
+ activate(state) {
1303
+ this.core.toggle(state);
1304
+ }
1305
+ };
1306
+
1307
+ //#endregion
1308
+ //#region src/define/ui/play-button.ts
1309
+ safeDefine(PlayButtonElement);
1310
+
1311
+ //#endregion
1312
+ //#region src/ui/playback-rate-button/playback-rate-button-element.ts
1313
+ var PlaybackRateButtonElement = class extends MediaButtonElement {
1314
+ constructor(..._args) {
1315
+ super(..._args);
1316
+ this.core = new PlaybackRateButtonCore();
1317
+ this.stateAttrMap = PlaybackRateButtonDataAttrs;
1318
+ this.mediaState = new PlayerController(this, playerContext, selectPlaybackRate);
1319
+ }
1320
+ static {
1321
+ this.tagName = "media-playback-rate-button";
1322
+ }
1323
+ activate(state) {
1324
+ this.core.cycle(state);
1325
+ }
1326
+ };
1327
+
1328
+ //#endregion
1329
+ //#region src/define/ui/playback-rate-button.ts
1330
+ safeDefine(PlaybackRateButtonElement);
1331
+
1332
+ //#endregion
1333
+ //#region src/ui/popover/popover-element.ts
1334
+ var PopoverElement = class extends MediaElement {
1335
+ constructor(..._args) {
1336
+ super(..._args);
1337
+ this.open = PopoverCore.defaultProps.open;
1338
+ this.defaultOpen = PopoverCore.defaultProps.defaultOpen;
1339
+ this.side = PopoverCore.defaultProps.side;
1340
+ this.align = PopoverCore.defaultProps.align;
1341
+ this.modal = PopoverCore.defaultProps.modal;
1342
+ this.closeOnEscape = PopoverCore.defaultProps.closeOnEscape;
1343
+ this.closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;
1344
+ this.openOnHover = PopoverCore.defaultProps.openOnHover;
1345
+ this.delay = PopoverCore.defaultProps.delay;
1346
+ this.closeDelay = PopoverCore.defaultProps.closeDelay;
1347
+ }
1348
+ static {
1349
+ this.tagName = "media-popover";
1350
+ }
1351
+ static {
1352
+ this.properties = {
1353
+ open: { type: Boolean },
1354
+ defaultOpen: {
1355
+ type: Boolean,
1356
+ attribute: "default-open"
1357
+ },
1358
+ side: { type: String },
1359
+ align: { type: String },
1360
+ modal: { type: Boolean },
1361
+ closeOnEscape: {
1362
+ type: Boolean,
1363
+ attribute: "close-on-escape"
1364
+ },
1365
+ closeOnOutsideClick: {
1366
+ type: Boolean,
1367
+ attribute: "close-on-outside-click"
1368
+ },
1369
+ openOnHover: {
1370
+ type: Boolean,
1371
+ attribute: "open-on-hover"
1372
+ },
1373
+ delay: { type: Number },
1374
+ closeDelay: {
1375
+ type: Number,
1376
+ attribute: "close-delay"
1377
+ }
1378
+ };
1379
+ }
1380
+ #core = new PopoverCore();
1381
+ #popover = null;
1382
+ #snapshot = null;
1383
+ #disconnect = null;
1384
+ #triggerAbort = null;
1385
+ #currentTrigger = null;
1386
+ #positionAbort = null;
1387
+ #positionFrame = 0;
1388
+ #resizeObserver = null;
1389
+ #positionTrigger = null;
1390
+ connectedCallback() {
1391
+ super.connectedCallback();
1392
+ if (this.destroyed) return;
1393
+ this.#disconnect = new AbortController();
1394
+ this.#popover = createPopover({
1395
+ transition: createTransition(),
1396
+ onOpenChange: (nextOpen, details) => {
1397
+ this.open = nextOpen;
1398
+ this.dispatchEvent(new CustomEvent("open-change", { detail: {
1399
+ open: nextOpen,
1400
+ ...details
1401
+ } }));
1402
+ },
1403
+ closeOnEscape: () => this.closeOnEscape,
1404
+ closeOnOutsideClick: () => this.closeOnOutsideClick,
1405
+ openOnHover: () => this.openOnHover,
1406
+ delay: () => this.delay,
1407
+ closeDelay: () => this.closeDelay
1408
+ });
1409
+ this.#popover.setPopupElement(this);
1410
+ applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });
1411
+ if (this.#snapshot) this.#snapshot.track(this.#popover.input);
1412
+ else this.#snapshot = new SnapshotController(this, this.#popover.input);
1413
+ }
1414
+ firstUpdated(changed) {
1415
+ super.firstUpdated(changed);
1416
+ if (this.defaultOpen && !this.open) this.#popover?.open();
1417
+ }
1418
+ disconnectedCallback() {
1419
+ super.disconnectedCallback();
1420
+ this.#cleanupPositioning();
1421
+ this.#disconnect?.abort();
1422
+ this.#disconnect = null;
1423
+ }
1424
+ destroyCallback() {
1425
+ this.#cleanupPositioning();
1426
+ this.#cleanupTrigger();
1427
+ this.#popover?.destroy();
1428
+ super.destroyCallback();
1429
+ }
1430
+ willUpdate(changed) {
1431
+ super.willUpdate(changed);
1432
+ this.#core.setProps(this);
1433
+ if (this.#popover && changed.has("open")) {
1434
+ const { active: interactionOpen } = this.#popover.input.current;
1435
+ if (this.open !== interactionOpen) if (this.open) this.#popover.open();
1436
+ else this.#popover.close();
1437
+ }
1438
+ }
1439
+ update(_changed) {
1440
+ super.update(_changed);
1441
+ if (!this.#popover) return;
1442
+ const triggerEl = this.#findTrigger();
1443
+ this.#syncTrigger(triggerEl);
1444
+ const input = this.#popover.input.current;
1445
+ this.#core.setInput(input);
1446
+ const state = this.#core.getState();
1447
+ applyElementProps(this, this.#core.getPopupAttrs(state));
1448
+ applyStateDataAttrs(this, state, PopoverDataAttrs);
1449
+ if (state.open) tryShowPopover(this);
1450
+ else tryHidePopover(this);
1451
+ if (this.#currentTrigger) {
1452
+ applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));
1453
+ applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
1454
+ }
1455
+ if (!state.open) {
1456
+ this.#cleanupPositioning();
1457
+ return;
1458
+ }
1459
+ const posOpts = {
1460
+ side: state.side,
1461
+ align: state.align
1462
+ };
1463
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts));
1464
+ else {
1465
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
1466
+ const selfRect = getPopupPositionRect(this);
1467
+ const boundaryRect = document.documentElement.getBoundingClientRect();
1468
+ const offsets = resolveOffsets(this);
1469
+ applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));
1470
+ }
1471
+ this.#syncPositioning();
1472
+ }
1473
+ #findTrigger() {
1474
+ if (!this.id) return null;
1475
+ return this.getRootNode().querySelector(`[commandfor="${this.id}"]`);
1476
+ }
1477
+ #syncTrigger(triggerEl) {
1478
+ if (triggerEl === this.#currentTrigger) return;
1479
+ this.#cleanupPositioning();
1480
+ this.#cleanupTrigger();
1481
+ this.#currentTrigger = triggerEl;
1482
+ this.#popover?.setTriggerElement(triggerEl);
1483
+ if (triggerEl && this.#popover) {
1484
+ this.#triggerAbort = new AbortController();
1485
+ applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });
1486
+ }
1487
+ }
1488
+ #cleanupTrigger() {
1489
+ if (this.#currentTrigger) {
1490
+ applyElementProps(this.#currentTrigger, {
1491
+ "aria-expanded": void 0,
1492
+ "aria-haspopup": void 0,
1493
+ "aria-controls": void 0
1494
+ });
1495
+ this.#currentTrigger.style.removeProperty("anchor-name");
1496
+ }
1497
+ this.#triggerAbort?.abort();
1498
+ this.#triggerAbort = null;
1499
+ this.#currentTrigger = null;
1500
+ }
1501
+ #syncPositioning() {
1502
+ if (supportsAnchorPositioning()) return;
1503
+ const triggerEl = this.#currentTrigger;
1504
+ if (!triggerEl) return;
1505
+ if (this.#positionAbort && this.#positionTrigger === triggerEl) return;
1506
+ this.#cleanupPositioning();
1507
+ this.#positionAbort = new AbortController();
1508
+ this.#positionTrigger = triggerEl;
1509
+ const { signal } = this.#positionAbort;
1510
+ const reposition = () => {
1511
+ cancelAnimationFrame(this.#positionFrame);
1512
+ this.#positionFrame = requestAnimationFrame(() => {
1513
+ if (signal.aborted) return;
1514
+ this.requestUpdate();
1515
+ });
1516
+ };
1517
+ window.addEventListener("scroll", reposition, {
1518
+ capture: true,
1519
+ passive: true,
1520
+ signal
1521
+ });
1522
+ window.addEventListener("resize", reposition, { signal });
1523
+ if (typeof ResizeObserver === "function") {
1524
+ this.#resizeObserver = new ResizeObserver(() => {
1525
+ reposition();
1526
+ });
1527
+ this.#resizeObserver.observe(triggerEl);
1528
+ this.#resizeObserver.observe(this);
1529
+ }
1530
+ reposition();
1531
+ }
1532
+ #cleanupPositioning() {
1533
+ this.#positionAbort?.abort();
1534
+ this.#positionAbort = null;
1535
+ this.#positionTrigger = null;
1536
+ cancelAnimationFrame(this.#positionFrame);
1537
+ this.#positionFrame = 0;
1538
+ this.#resizeObserver?.disconnect();
1539
+ this.#resizeObserver = null;
1540
+ }
1541
+ };
1542
+
1543
+ //#endregion
1544
+ //#region src/define/ui/popover.ts
1545
+ safeDefine(PopoverElement);
1546
+
1547
+ //#endregion
1548
+ //#region src/ui/seek-button/seek-button-element.ts
1549
+ var SeekButtonElement = class extends MediaButtonElement {
1550
+ constructor(..._args) {
1551
+ super(..._args);
1552
+ this.seconds = SeekButtonCore.defaultProps.seconds;
1553
+ this.core = new SeekButtonCore();
1554
+ this.stateAttrMap = SeekButtonDataAttrs;
1555
+ this.mediaState = new PlayerController(this, playerContext, selectTime);
1556
+ }
1557
+ static {
1558
+ this.tagName = "media-seek-button";
1559
+ }
1560
+ static {
1561
+ this.properties = {
1562
+ ...MediaButtonElement.properties,
1563
+ seconds: { type: Number }
1564
+ };
1565
+ }
1566
+ activate(state) {
1567
+ this.core.seek(state);
1568
+ }
1569
+ };
1570
+
1571
+ //#endregion
1572
+ //#region src/define/ui/seek-button.ts
1573
+ safeDefine(SeekButtonElement);
1574
+
1575
+ //#endregion
1576
+ //#region src/ui/time/time-element.ts
1577
+ var TimeElement = class extends MediaElement {
1578
+ static {
1579
+ this.tagName = "media-time";
1580
+ }
1581
+ static {
1582
+ this.properties = {
1583
+ type: { type: String },
1584
+ negativeSign: {
1585
+ type: String,
1586
+ attribute: "negative-sign"
1587
+ },
1588
+ label: { type: String }
1589
+ };
1590
+ }
1591
+ #core = new TimeCore();
1592
+ #state = new PlayerController(this, playerContext, selectTime);
1593
+ #signSpan = document.createElement("span");
1594
+ #textNode = document.createTextNode("");
1595
+ constructor() {
1596
+ super();
1597
+ this.type = TimeCore.defaultProps.type;
1598
+ this.negativeSign = TimeCore.defaultProps.negativeSign;
1599
+ this.label = TimeCore.defaultProps.label;
1600
+ this.#signSpan.setAttribute("aria-hidden", "true");
1601
+ this.#signSpan.hidden = true;
1602
+ this.appendChild(this.#signSpan);
1603
+ this.appendChild(this.#textNode);
1604
+ }
1605
+ connectedCallback() {
1606
+ super.connectedCallback();
1607
+ if (!this.#state.value) logMissingFeature(this.localName, this.#state.displayName);
1608
+ }
1609
+ willUpdate(changed) {
1610
+ super.willUpdate(changed);
1611
+ this.#core.setProps(this);
1612
+ }
1613
+ update(changed) {
1614
+ super.update(changed);
1615
+ const media = this.#state.value;
1616
+ if (!media) return;
1617
+ this.#core.setMedia(media);
1618
+ const state = this.#core.getState();
1619
+ this.#signSpan.hidden = !state.negative;
1620
+ this.#signSpan.textContent = state.negative ? this.negativeSign : "";
1621
+ this.#textNode.textContent = state.text;
1622
+ applyElementProps(this, this.#core.getAttrs(state));
1623
+ applyStateDataAttrs(this, state, TimeDataAttrs);
1624
+ }
1625
+ };
1626
+
1627
+ //#endregion
1628
+ //#region src/ui/time/time-group-element.ts
1629
+ var TimeGroupElement = class extends MediaElement {
1630
+ static {
1631
+ this.tagName = "media-time-group";
1632
+ }
1633
+ };
1634
+
1635
+ //#endregion
1636
+ //#region src/ui/time/time-separator-element.ts
1637
+ var TimeSeparatorElement = class extends MediaElement {
1638
+ static {
1639
+ this.tagName = "media-time-separator";
1640
+ }
1641
+ connectedCallback() {
1642
+ super.connectedCallback();
1643
+ this.setAttribute("aria-hidden", "true");
1644
+ if (!this.textContent?.trim()) this.textContent = "/";
1645
+ }
1646
+ };
1647
+
1648
+ //#endregion
1649
+ //#region src/define/ui/time.ts
1650
+ safeDefine(TimeElement);
1651
+ safeDefine(TimeGroupElement);
1652
+ safeDefine(TimeSeparatorElement);
1653
+
1654
+ //#endregion
1655
+ //#region src/ui/slider/context.ts
1656
+ const SLIDER_CONTEXT_KEY = Symbol("@videojs/slider");
1657
+ const sliderContext = createContext(SLIDER_CONTEXT_KEY);
1658
+
1659
+ //#endregion
1660
+ //#region src/ui/slider/slider-buffer-element.ts
1661
+ var SliderBufferElement = class extends ContextPartElement {
1662
+ constructor(..._args) {
1663
+ super(..._args);
1664
+ this.consumer = new ContextConsumer(this, {
1665
+ context: sliderContext,
1666
+ subscribe: true
1667
+ });
1668
+ }
1669
+ static {
1670
+ this.tagName = "media-slider-buffer";
1671
+ }
1672
+ };
1673
+
1674
+ //#endregion
1675
+ //#region src/ui/slider/slider-fill-element.ts
1676
+ var SliderFillElement = class extends ContextPartElement {
1677
+ constructor(..._args) {
1678
+ super(..._args);
1679
+ this.consumer = new ContextConsumer(this, {
1680
+ context: sliderContext,
1681
+ subscribe: true
1682
+ });
1683
+ }
1684
+ static {
1685
+ this.tagName = "media-slider-fill";
1686
+ }
1687
+ };
1688
+
1689
+ //#endregion
1690
+ //#region src/ui/slider/slider-preview-element.ts
1691
+ var SliderPreviewElement = class extends MediaElement {
1692
+ constructor(..._args) {
1693
+ super(..._args);
1694
+ this.overflow = "clamp";
1695
+ }
1696
+ static {
1697
+ this.tagName = "media-slider-preview";
1698
+ }
1699
+ static {
1700
+ this.properties = { overflow: { type: String } };
1701
+ }
1702
+ #ctx = new ContextConsumer(this, {
1703
+ context: sliderContext,
1704
+ subscribe: true
1705
+ });
1706
+ #resizeObserver = null;
1707
+ #width = 0;
1708
+ connectedCallback() {
1709
+ super.connectedCallback();
1710
+ this.#resizeObserver = new ResizeObserver(([entry]) => {
1711
+ this.#width = entry.contentRect.width;
1712
+ this.#applyPosition();
1713
+ });
1714
+ this.#resizeObserver.observe(this);
1715
+ }
1716
+ disconnectedCallback() {
1717
+ super.disconnectedCallback();
1718
+ this.#resizeObserver?.disconnect();
1719
+ this.#resizeObserver = null;
1720
+ }
1721
+ #applyPosition() {
1722
+ applyStyles(this, getSliderPreviewStyle(this.#width, this.overflow));
1723
+ }
1724
+ update(_changed) {
1725
+ super.update(_changed);
1726
+ const ctx = this.#ctx.value;
1727
+ if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
1728
+ this.#applyPosition();
1729
+ }
1730
+ };
1731
+
1732
+ //#endregion
1733
+ //#region src/ui/slider/slider-thumb-element.ts
1734
+ var SliderThumbElement = class extends MediaElement {
1735
+ static {
1736
+ this.tagName = "media-slider-thumb";
1737
+ }
1738
+ #ctx = new ContextConsumer(this, {
1739
+ context: sliderContext,
1740
+ subscribe: true
1741
+ });
1742
+ #disconnect = null;
1743
+ #thumbPropsApplied = false;
1744
+ connectedCallback() {
1745
+ super.connectedCallback();
1746
+ this.#disconnect = new AbortController();
1747
+ this.#thumbPropsApplied = false;
1748
+ }
1749
+ disconnectedCallback() {
1750
+ super.disconnectedCallback();
1751
+ this.#disconnect?.abort();
1752
+ this.#disconnect = null;
1753
+ this.#thumbPropsApplied = false;
1754
+ }
1755
+ update(_changed) {
1756
+ super.update(_changed);
1757
+ const ctx = this.#ctx.value;
1758
+ if (!ctx) return;
1759
+ if (!this.#thumbPropsApplied && this.#disconnect) {
1760
+ applyElementProps(this, ctx.thumbProps, { signal: this.#disconnect.signal });
1761
+ this.#thumbPropsApplied = true;
1762
+ }
1763
+ applyElementProps(this, ctx.thumbAttrs);
1764
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
1765
+ }
1766
+ };
1767
+
1768
+ //#endregion
1769
+ //#region src/ui/thumbnail/thumbnail-element.ts
1770
+ const SHADOW_CSS = `\
1771
+ :host {
1772
+ display: inline-block;
1773
+ overflow: hidden;
1774
+ }
1775
+ img {
1776
+ display: block;
1777
+ }`;
1778
+ var ThumbnailElement = class extends MediaElement {
1779
+ static {
1780
+ this.tagName = "media-thumbnail";
1781
+ }
1782
+ static {
1783
+ this.properties = {
1784
+ time: { type: Number },
1785
+ crossOrigin: {
1786
+ type: String,
1787
+ attribute: "crossorigin"
1788
+ },
1789
+ loading: { type: String },
1790
+ fetchPriority: {
1791
+ type: String,
1792
+ attribute: "fetchpriority"
1793
+ }
1794
+ };
1795
+ }
1796
+ #core = new ThumbnailCore();
1797
+ #img = document.createElement("img");
1798
+ #textTracks = new PlayerController(this, playerContext, selectTextTrack);
1799
+ #thumbnails = [];
1800
+ #externalThumbnails;
1801
+ #lastTextTrack;
1802
+ #api = null;
1803
+ constructor() {
1804
+ super();
1805
+ this.time = 0;
1806
+ const shadow = this.attachShadow({ mode: "open" });
1807
+ const style = document.createElement("style");
1808
+ style.textContent = SHADOW_CSS;
1809
+ shadow.appendChild(style);
1810
+ this.#img.alt = "";
1811
+ this.#img.setAttribute("part", "img");
1812
+ this.#img.setAttribute("aria-hidden", "true");
1813
+ this.#img.setAttribute("decoding", "async");
1814
+ shadow.appendChild(this.#img);
1815
+ }
1816
+ /**
1817
+ * Set thumbnail images directly, bypassing the automatic `<track>` detection.
1818
+ * When set, this takes priority over the text track path.
1819
+ */
1820
+ get thumbnails() {
1821
+ return this.#externalThumbnails;
1822
+ }
1823
+ set thumbnails(value) {
1824
+ this.#externalThumbnails = value;
1825
+ this.requestUpdate();
1826
+ }
1827
+ connectedCallback() {
1828
+ super.connectedCallback();
1829
+ if (this.destroyed) return;
1830
+ this.#api = createThumbnail({
1831
+ getContainer: () => this,
1832
+ getImg: () => this.#img,
1833
+ onStateChange: () => this.requestUpdate()
1834
+ });
1835
+ }
1836
+ disconnectedCallback() {
1837
+ super.disconnectedCallback();
1838
+ }
1839
+ destroyCallback() {
1840
+ this.#api?.destroy();
1841
+ super.destroyCallback();
1842
+ }
1843
+ update(changed) {
1844
+ super.update(changed);
1845
+ if (this.#externalThumbnails) this.#thumbnails = this.#externalThumbnails;
1846
+ else {
1847
+ const textTrack = this.#textTracks.value;
1848
+ if (textTrack !== this.#lastTextTrack) {
1849
+ this.#lastTextTrack = textTrack;
1850
+ this.#thumbnails = textTrack && textTrack.thumbnailCues.length > 0 ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? void 0) : [];
1851
+ }
1852
+ }
1853
+ const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);
1854
+ applyElementProps(this.#img, {
1855
+ crossorigin: this.crossOrigin || void 0,
1856
+ loading: this.loading,
1857
+ fetchpriority: this.fetchPriority
1858
+ });
1859
+ this.#api?.updateSrc(thumbnail?.url);
1860
+ if (!thumbnail) {
1861
+ this.#img.removeAttribute("src");
1862
+ this.#resetStyles();
1863
+ const state = this.#core.getState(false, false, void 0);
1864
+ applyElementProps(this, this.#core.getAttrs(state));
1865
+ applyStateDataAttrs(this, state, ThumbnailDataAttrs);
1866
+ return;
1867
+ }
1868
+ if (this.#img.getAttribute("src") !== thumbnail.url) this.#img.src = thumbnail.url;
1869
+ const api = this.#api;
1870
+ const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);
1871
+ applyElementProps(this, this.#core.getAttrs(state));
1872
+ applyStateDataAttrs(this, state, ThumbnailDataAttrs);
1873
+ if (api?.naturalWidth && api.naturalHeight) {
1874
+ const constraints = api.readConstraints();
1875
+ const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);
1876
+ if (result) this.#applyResize(result);
1877
+ }
1878
+ }
1879
+ #applyResize(result) {
1880
+ this.style.width = `${result.containerWidth}px`;
1881
+ this.style.height = `${result.containerHeight}px`;
1882
+ const imgStyle = this.#img.style;
1883
+ imgStyle.width = `${result.imageWidth}px`;
1884
+ imgStyle.height = `${result.imageHeight}px`;
1885
+ imgStyle.maxWidth = "none";
1886
+ imgStyle.transform = result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : "";
1887
+ }
1888
+ #resetStyles() {
1889
+ this.style.width = "";
1890
+ this.style.height = "";
1891
+ const imgStyle = this.#img.style;
1892
+ imgStyle.width = "";
1893
+ imgStyle.height = "";
1894
+ imgStyle.maxWidth = "";
1895
+ imgStyle.transform = "";
1896
+ }
1897
+ };
1898
+
1899
+ //#endregion
1900
+ //#region src/ui/slider/slider-thumbnail-element.ts
1901
+ var SliderThumbnailElement = class extends ThumbnailElement {
1902
+ static {
1903
+ this.tagName = "media-slider-thumbnail";
1904
+ }
1905
+ #ctx = new ContextConsumer(this, {
1906
+ context: sliderContext,
1907
+ subscribe: true
1908
+ });
1909
+ update(changed) {
1910
+ const ctx = this.#ctx.value;
1911
+ if (ctx) this.time = ctx.pointerValue;
1912
+ super.update(changed);
1913
+ }
1914
+ };
1915
+
1916
+ //#endregion
1917
+ //#region src/ui/slider/slider-track-element.ts
1918
+ var SliderTrackElement = class extends ContextPartElement {
1919
+ constructor(..._args) {
1920
+ super(..._args);
1921
+ this.consumer = new ContextConsumer(this, {
1922
+ context: sliderContext,
1923
+ subscribe: true
1924
+ });
1925
+ }
1926
+ static {
1927
+ this.tagName = "media-slider-track";
1928
+ }
1929
+ };
1930
+
1931
+ //#endregion
1932
+ //#region src/ui/slider/slider-value-element.ts
1933
+ var SliderValueElement = class extends MediaElement {
1934
+ constructor(..._args) {
1935
+ super(..._args);
1936
+ this.type = "current";
1937
+ }
1938
+ static {
1939
+ this.tagName = "media-slider-value";
1940
+ }
1941
+ static {
1942
+ this.properties = { type: { type: String } };
1943
+ }
1944
+ #ctx = new ContextConsumer(this, {
1945
+ context: sliderContext,
1946
+ subscribe: true
1947
+ });
1948
+ connectedCallback() {
1949
+ super.connectedCallback();
1950
+ this.setAttribute("aria-live", "off");
1951
+ }
1952
+ update(_changed) {
1953
+ super.update(_changed);
1954
+ const ctx = this.#ctx.value;
1955
+ if (!ctx) return;
1956
+ const value = this.type === "pointer" ? ctx.pointerValue : ctx.state.value;
1957
+ this.textContent = ctx.formatValue ? ctx.formatValue(value, this.type) : String(Math.round(value));
1958
+ applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);
1959
+ }
1960
+ };
1961
+
1962
+ //#endregion
1963
+ //#region src/ui/time-slider/time-slider-element.ts
1964
+ var TimeSliderElement = class extends MediaElement {
1965
+ constructor(..._args) {
1966
+ super(..._args);
1967
+ this.label = TimeSliderCore.defaultProps.label;
1968
+ this.commitThrottle = TimeSliderCore.defaultProps.commitThrottle;
1969
+ this.step = TimeSliderCore.defaultProps.step;
1970
+ this.largeStep = TimeSliderCore.defaultProps.largeStep;
1971
+ this.orientation = TimeSliderCore.defaultProps.orientation;
1972
+ this.disabled = TimeSliderCore.defaultProps.disabled;
1973
+ this.thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;
1974
+ }
1975
+ static {
1976
+ this.tagName = "media-time-slider";
1977
+ }
1978
+ static {
1979
+ this.properties = {
1980
+ label: { type: String },
1981
+ commitThrottle: {
1982
+ type: Number,
1983
+ attribute: "commit-throttle"
1984
+ },
1985
+ step: { type: Number },
1986
+ largeStep: {
1987
+ type: Number,
1988
+ attribute: "large-step"
1989
+ },
1990
+ orientation: { type: String },
1991
+ disabled: { type: Boolean },
1992
+ thumbAlignment: {
1993
+ type: String,
1994
+ attribute: "thumb-alignment"
1995
+ }
1996
+ };
1997
+ }
1998
+ #core = new TimeSliderCore();
1999
+ #provider = new ContextProvider(this, { context: sliderContext });
2000
+ #timeState = new PlayerController(this, playerContext, selectTime);
2001
+ #bufferState = new PlayerController(this, playerContext, selectBuffer);
2002
+ #slider = null;
2003
+ #disconnect = null;
2004
+ connectedCallback() {
2005
+ super.connectedCallback();
2006
+ if (this.destroyed) return;
2007
+ this.#disconnect = new AbortController();
2008
+ const signal = this.#disconnect.signal;
2009
+ this.#slider = createSlider({
2010
+ getElement: () => this,
2011
+ getThumbElement: () => this.querySelector("media-slider-thumb"),
2012
+ getOrientation: () => this.orientation,
2013
+ isRTL: () => isRTL(this),
2014
+ isDisabled: () => this.disabled || !this.#timeState.value,
2015
+ getPercent: () => {
2016
+ const media = this.#timeState.value;
2017
+ if (!media) return 0;
2018
+ return this.#core.percentFromValue(media.currentTime);
2019
+ },
2020
+ getStepPercent: () => this.#core.getStepPercent(),
2021
+ getLargeStepPercent: () => this.#core.getLargeStepPercent(),
2022
+ onValueCommit: (percent) => {
2023
+ const media = this.#timeState.value;
2024
+ if (media) media.seek(this.#core.rawValueFromPercent(percent));
2025
+ },
2026
+ commitThrottle: this.commitThrottle,
2027
+ onDragStart: () => {
2028
+ this.dispatchEvent(new CustomEvent("drag-start", { bubbles: true }));
2029
+ },
2030
+ onDragEnd: () => {
2031
+ this.dispatchEvent(new CustomEvent("drag-end", { bubbles: true }));
2032
+ },
2033
+ adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),
2034
+ onResize: () => this.requestUpdate()
2035
+ });
2036
+ applyElementProps(this, this.#slider.rootProps, { signal });
2037
+ applyStyles(this, this.#slider.rootStyle);
2038
+ this.#slider.input.subscribe(() => this.requestUpdate(), { signal });
2039
+ if (!this.#timeState.value) logMissingFeature(this.localName, this.#timeState.displayName);
2040
+ }
2041
+ disconnectedCallback() {
2042
+ super.disconnectedCallback();
2043
+ this.#disconnect?.abort();
2044
+ this.#disconnect = null;
2045
+ }
2046
+ destroyCallback() {
2047
+ this.#slider?.destroy();
2048
+ super.destroyCallback();
2049
+ }
2050
+ willUpdate(_changed) {
2051
+ super.willUpdate(_changed);
2052
+ this.#core.setProps(this);
2053
+ }
2054
+ update(_changed) {
2055
+ super.update(_changed);
2056
+ if (!this.#slider) return;
2057
+ const time = this.#timeState.value;
2058
+ const buffer = this.#bufferState.value;
2059
+ if (!time) return;
2060
+ this.#core.setInput(this.#slider.input.current);
2061
+ const media = {
2062
+ ...time,
2063
+ ...buffer ?? {
2064
+ buffered: [],
2065
+ seekable: []
2066
+ }
2067
+ };
2068
+ this.#core.setMedia(media);
2069
+ const state = this.#core.getState();
2070
+ const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));
2071
+ applyStyles(this, cssVars);
2072
+ applyStateDataAttrs(this, state, TimeSliderDataAttrs);
2073
+ this.#provider.setValue({
2074
+ state,
2075
+ stateAttrMap: TimeSliderDataAttrs,
2076
+ pointerValue: this.#core.valueFromPercent(state.pointerPercent),
2077
+ thumbAttrs: this.#core.getAttrs(state),
2078
+ thumbProps: this.#slider.thumbProps,
2079
+ formatValue: (value) => formatTime(value, state.duration)
2080
+ });
2081
+ }
2082
+ };
2083
+
2084
+ //#endregion
2085
+ //#region src/define/ui/time-slider.ts
2086
+ safeDefine(TimeSliderElement);
2087
+ safeDefine(SliderBufferElement);
2088
+ safeDefine(SliderFillElement);
2089
+ safeDefine(SliderPreviewElement);
2090
+ safeDefine(SliderThumbElement);
2091
+ safeDefine(SliderThumbnailElement);
2092
+ safeDefine(SliderTrackElement);
2093
+ safeDefine(SliderValueElement);
2094
+
2095
+ //#endregion
2096
+ //#region src/ui/tooltip/context.ts
2097
+ const TOOLTIP_GROUP_CONTEXT_KEY = Symbol("@videojs/tooltip-group");
2098
+ const tooltipGroupContext = createContext(TOOLTIP_GROUP_CONTEXT_KEY);
2099
+
2100
+ //#endregion
2101
+ //#region src/ui/tooltip/tooltip-element.ts
2102
+ var TooltipElement = class extends MediaElement {
2103
+ constructor(..._args) {
2104
+ super(..._args);
2105
+ this.open = TooltipCore.defaultProps.open;
2106
+ this.defaultOpen = TooltipCore.defaultProps.defaultOpen;
2107
+ this.side = TooltipCore.defaultProps.side;
2108
+ this.align = TooltipCore.defaultProps.align;
2109
+ this.delay = TooltipCore.defaultProps.delay;
2110
+ this.closeDelay = TooltipCore.defaultProps.closeDelay;
2111
+ this.disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;
2112
+ this.disabled = TooltipCore.defaultProps.disabled;
2113
+ }
2114
+ static {
2115
+ this.tagName = "media-tooltip";
2116
+ }
2117
+ static {
2118
+ this.properties = {
2119
+ open: { type: Boolean },
2120
+ defaultOpen: {
2121
+ type: Boolean,
2122
+ attribute: "default-open"
2123
+ },
2124
+ side: { type: String },
2125
+ align: { type: String },
2126
+ delay: { type: Number },
2127
+ closeDelay: {
2128
+ type: Number,
2129
+ attribute: "close-delay"
2130
+ },
2131
+ disableHoverablePopup: {
2132
+ type: Boolean,
2133
+ attribute: "disable-hoverable-popup"
2134
+ },
2135
+ disabled: { type: Boolean }
2136
+ };
2137
+ }
2138
+ #core = new TooltipCore();
2139
+ #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
2140
+ #tooltip = null;
2141
+ #snapshot = null;
2142
+ #disconnect = null;
2143
+ #triggerAbort = null;
2144
+ #currentTrigger = null;
2145
+ #positionAbort = null;
2146
+ #positionFrame = 0;
2147
+ #resizeObserver = null;
2148
+ #positionTrigger = null;
2149
+ connectedCallback() {
2150
+ super.connectedCallback();
2151
+ this.#disconnect = new AbortController();
2152
+ this.#tooltip = createTooltip({
2153
+ transition: createTransition(),
2154
+ onOpenChange: (nextOpen, details) => {
2155
+ this.open = nextOpen;
2156
+ this.dispatchEvent(new CustomEvent("open-change", { detail: {
2157
+ open: nextOpen,
2158
+ ...details
2159
+ } }));
2160
+ },
2161
+ delay: () => this.delay,
2162
+ closeDelay: () => this.closeDelay,
2163
+ disableHoverablePopup: () => this.disableHoverablePopup,
2164
+ disabled: () => this.disabled,
2165
+ group: () => this.#groupConsumer.value
2166
+ });
2167
+ this.#tooltip.setPopupElement(this);
2168
+ applyElementProps(this, this.#tooltip.popupProps, { signal: this.#disconnect.signal });
2169
+ if (this.#snapshot) this.#snapshot.track(this.#tooltip.input);
2170
+ else this.#snapshot = new SnapshotController(this, this.#tooltip.input);
2171
+ }
2172
+ firstUpdated(changed) {
2173
+ super.firstUpdated(changed);
2174
+ if (this.defaultOpen && !this.open) this.#tooltip?.open();
2175
+ }
2176
+ disconnectedCallback() {
2177
+ super.disconnectedCallback();
2178
+ this.#cleanupPositioning();
2179
+ this.#cleanupTrigger();
2180
+ this.#tooltip?.destroy();
2181
+ this.#tooltip = null;
2182
+ this.#disconnect?.abort();
2183
+ this.#disconnect = null;
2184
+ }
2185
+ willUpdate(changed) {
2186
+ super.willUpdate(changed);
2187
+ this.#core.setProps(this);
2188
+ if (this.#tooltip && changed.has("open")) {
2189
+ const { active: interactionOpen } = this.#tooltip.input.current;
2190
+ if (this.open !== interactionOpen) if (this.open) this.#tooltip.open();
2191
+ else this.#tooltip.close();
2192
+ }
2193
+ }
2194
+ update(_changed) {
2195
+ super.update(_changed);
2196
+ if (!this.#tooltip) return;
2197
+ const triggerEl = this.#findTrigger();
2198
+ this.#syncTrigger(triggerEl);
2199
+ const input = this.#tooltip.input.current;
2200
+ this.#core.setInput(input);
2201
+ const state = this.#core.getState();
2202
+ applyElementProps(this, this.#core.getPopupAttrs(state));
2203
+ applyStateDataAttrs(this, state, TooltipDataAttrs);
2204
+ if (state.open) tryShowPopover(this);
2205
+ else tryHidePopover(this);
2206
+ if (this.#currentTrigger) {
2207
+ applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));
2208
+ applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
2209
+ }
2210
+ if (!state.open) {
2211
+ this.#cleanupPositioning();
2212
+ return;
2213
+ }
2214
+ const posOpts = {
2215
+ side: state.side,
2216
+ align: state.align
2217
+ };
2218
+ if (supportsAnchorPositioning()) applyStyles(this, getAnchorPositionStyle(this.id, posOpts, void 0, void 0, void 0, void 0, TooltipCSSVars));
2219
+ else {
2220
+ const triggerRect = this.#currentTrigger?.getBoundingClientRect();
2221
+ const selfRect = getPopupPositionRect(this);
2222
+ const boundaryRect = document.documentElement.getBoundingClientRect();
2223
+ const offsets = resolveOffsets(this, TooltipCSSVars);
2224
+ applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars));
2225
+ }
2226
+ this.#syncPositioning();
2227
+ }
2228
+ #findTrigger() {
2229
+ if (!this.id) return null;
2230
+ return this.getRootNode().querySelector(`[commandfor="${this.id}"]`);
2231
+ }
2232
+ #syncTrigger(triggerEl) {
2233
+ if (triggerEl === this.#currentTrigger) return;
2234
+ this.#cleanupPositioning();
2235
+ this.#cleanupTrigger();
2236
+ this.#currentTrigger = triggerEl;
2237
+ this.#tooltip?.setTriggerElement(triggerEl);
2238
+ if (triggerEl && this.#tooltip) {
2239
+ this.#triggerAbort = new AbortController();
2240
+ applyElementProps(triggerEl, this.#tooltip.triggerProps, { signal: this.#triggerAbort.signal });
2241
+ }
2242
+ }
2243
+ #cleanupTrigger() {
2244
+ if (this.#currentTrigger) {
2245
+ applyElementProps(this.#currentTrigger, { "aria-describedby": void 0 });
2246
+ this.#currentTrigger.style.removeProperty("anchor-name");
2247
+ }
2248
+ this.#triggerAbort?.abort();
2249
+ this.#triggerAbort = null;
2250
+ this.#currentTrigger = null;
2251
+ }
2252
+ #syncPositioning() {
2253
+ if (supportsAnchorPositioning()) return;
2254
+ const triggerEl = this.#currentTrigger;
2255
+ if (!triggerEl) return;
2256
+ if (this.#positionAbort && this.#positionTrigger === triggerEl) return;
2257
+ this.#cleanupPositioning();
2258
+ this.#positionAbort = new AbortController();
2259
+ this.#positionTrigger = triggerEl;
2260
+ const { signal } = this.#positionAbort;
2261
+ const reposition = () => {
2262
+ cancelAnimationFrame(this.#positionFrame);
2263
+ this.#positionFrame = requestAnimationFrame(() => {
2264
+ if (signal.aborted) return;
2265
+ this.requestUpdate();
2266
+ });
2267
+ };
2268
+ window.addEventListener("scroll", reposition, {
2269
+ capture: true,
2270
+ passive: true,
2271
+ signal
2272
+ });
2273
+ window.addEventListener("resize", reposition, { signal });
2274
+ if (typeof ResizeObserver === "function") {
2275
+ this.#resizeObserver = new ResizeObserver(() => {
2276
+ reposition();
2277
+ });
2278
+ this.#resizeObserver.observe(triggerEl);
2279
+ this.#resizeObserver.observe(this);
2280
+ }
2281
+ reposition();
2282
+ }
2283
+ #cleanupPositioning() {
2284
+ this.#positionAbort?.abort();
2285
+ this.#positionAbort = null;
2286
+ this.#positionTrigger = null;
2287
+ cancelAnimationFrame(this.#positionFrame);
2288
+ this.#positionFrame = 0;
2289
+ this.#resizeObserver?.disconnect();
2290
+ this.#resizeObserver = null;
2291
+ }
2292
+ };
2293
+
2294
+ //#endregion
2295
+ //#region src/define/ui/tooltip.ts
2296
+ safeDefine(TooltipElement);
2297
+
2298
+ //#endregion
2299
+ //#region src/ui/tooltip/tooltip-group-element.ts
2300
+ var TooltipGroupElement = class extends MediaElement {
2301
+ constructor(..._args) {
2302
+ super(..._args);
2303
+ this.delay = TooltipGroupCore.defaultProps.delay;
2304
+ this.closeDelay = TooltipGroupCore.defaultProps.closeDelay;
2305
+ this.timeout = TooltipGroupCore.defaultProps.timeout;
2306
+ }
2307
+ static {
2308
+ this.tagName = "media-tooltip-group";
2309
+ }
2310
+ static {
2311
+ this.properties = {
2312
+ delay: { type: Number },
2313
+ closeDelay: {
2314
+ type: Number,
2315
+ attribute: "close-delay"
2316
+ },
2317
+ timeout: { type: Number }
2318
+ };
2319
+ }
2320
+ #core = new TooltipGroupCore();
2321
+ #provider = new ContextProvider(this, {
2322
+ context: tooltipGroupContext,
2323
+ initialValue: this.#core
2324
+ });
2325
+ update(_changed) {
2326
+ super.update(_changed);
2327
+ this.#core.setProps(this);
2328
+ this.#provider.setValue(this.#core);
2329
+ }
2330
+ };
2331
+
2332
+ //#endregion
2333
+ //#region src/define/ui/tooltip-group.ts
2334
+ safeDefine(TooltipGroupElement);
2335
+
2336
+ //#endregion
2337
+ //#region src/ui/volume-slider/volume-slider-element.ts
2338
+ var VolumeSliderElement = class extends MediaElement {
2339
+ constructor(..._args) {
2340
+ super(..._args);
2341
+ this.label = VolumeSliderCore.defaultProps.label;
2342
+ this.step = VolumeSliderCore.defaultProps.step;
2343
+ this.largeStep = VolumeSliderCore.defaultProps.largeStep;
2344
+ this.orientation = VolumeSliderCore.defaultProps.orientation;
2345
+ this.disabled = VolumeSliderCore.defaultProps.disabled;
2346
+ this.thumbAlignment = VolumeSliderCore.defaultProps.thumbAlignment;
2347
+ }
2348
+ static {
2349
+ this.tagName = "media-volume-slider";
2350
+ }
2351
+ static {
2352
+ this.properties = {
2353
+ label: { type: String },
2354
+ step: { type: Number },
2355
+ largeStep: {
2356
+ type: Number,
2357
+ attribute: "large-step"
2358
+ },
2359
+ orientation: { type: String },
2360
+ disabled: { type: Boolean },
2361
+ thumbAlignment: {
2362
+ type: String,
2363
+ attribute: "thumb-alignment"
2364
+ }
2365
+ };
2366
+ }
2367
+ #core = new VolumeSliderCore();
2368
+ #provider = new ContextProvider(this, { context: sliderContext });
2369
+ #volumeState = new PlayerController(this, playerContext, selectVolume);
2370
+ #slider = null;
2371
+ #disconnect = null;
2372
+ connectedCallback() {
2373
+ super.connectedCallback();
2374
+ if (this.destroyed) return;
2375
+ this.#disconnect = new AbortController();
2376
+ const signal = this.#disconnect.signal;
2377
+ this.#slider = createSlider({
2378
+ getElement: () => this,
2379
+ getThumbElement: () => this.querySelector("media-slider-thumb"),
2380
+ getOrientation: () => this.orientation,
2381
+ isRTL: () => isRTL(this),
2382
+ isDisabled: () => this.disabled || !this.#volumeState.value,
2383
+ getPercent: () => {
2384
+ const media = this.#volumeState.value;
2385
+ if (!media) return 0;
2386
+ return media.volume * 100;
2387
+ },
2388
+ getStepPercent: () => this.#core.getStepPercent(),
2389
+ getLargeStepPercent: () => this.#core.getLargeStepPercent(),
2390
+ onValueChange: (percent) => {
2391
+ this.#setVolume(percent);
2392
+ },
2393
+ onValueCommit: (percent) => {
2394
+ this.#setVolume(percent);
2395
+ },
2396
+ onDragStart: () => {
2397
+ this.dispatchEvent(new CustomEvent("drag-start", { bubbles: true }));
2398
+ },
2399
+ onDragEnd: () => {
2400
+ this.dispatchEvent(new CustomEvent("drag-end", { bubbles: true }));
2401
+ },
2402
+ adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),
2403
+ onResize: () => this.requestUpdate()
2404
+ });
2405
+ applyElementProps(this, this.#slider.rootProps, { signal });
2406
+ applyStyles(this, this.#slider.rootStyle);
2407
+ this.#slider.input.subscribe(() => this.requestUpdate(), { signal });
2408
+ if (!this.#volumeState.value) logMissingFeature(this.localName, this.#volumeState.displayName);
2409
+ }
2410
+ disconnectedCallback() {
2411
+ super.disconnectedCallback();
2412
+ this.#disconnect?.abort();
2413
+ this.#disconnect = null;
2414
+ }
2415
+ destroyCallback() {
2416
+ this.#slider?.destroy();
2417
+ super.destroyCallback();
2418
+ }
2419
+ willUpdate(_changed) {
2420
+ super.willUpdate(_changed);
2421
+ this.#core.setProps(this);
2422
+ }
2423
+ update(_changed) {
2424
+ super.update(_changed);
2425
+ if (!this.#slider) return;
2426
+ const media = this.#volumeState.value;
2427
+ if (!media) return;
2428
+ this.#core.setInput(this.#slider.input.current);
2429
+ this.#core.setMedia(media);
2430
+ const state = this.#core.getState();
2431
+ const cssVars = getSliderCSSVars(this.#slider.adjustForAlignment(state));
2432
+ applyStyles(this, cssVars);
2433
+ applyStateDataAttrs(this, state, VolumeSliderDataAttrs);
2434
+ this.#provider.setValue({
2435
+ state,
2436
+ stateAttrMap: VolumeSliderDataAttrs,
2437
+ pointerValue: this.#core.valueFromPercent(state.pointerPercent),
2438
+ thumbAttrs: this.#core.getAttrs(state),
2439
+ thumbProps: this.#slider.thumbProps,
2440
+ formatValue: (value) => `${Math.round(value)}%`
2441
+ });
2442
+ }
2443
+ #setVolume(percent) {
2444
+ this.#volumeState.value?.setVolume(this.#core.valueFromPercent(percent) / 100);
2445
+ }
2446
+ };
2447
+
2448
+ //#endregion
2449
+ //#region src/define/ui/volume-slider.ts
2450
+ safeDefine(VolumeSliderElement);
2451
+ safeDefine(SliderFillElement);
2452
+ safeDefine(SliderPreviewElement);
2453
+ safeDefine(SliderThumbElement);
2454
+ safeDefine(SliderTrackElement);
2455
+ safeDefine(SliderValueElement);
2456
+
2457
+ //#endregion
2458
+ export { PiPButtonDataAttrs as a, FullscreenButtonCore as c, CaptionsButtonDataAttrs as d, CaptionsButtonCore as f, createStyles as g, SkinMixin as h, PosterCore as i, ControlsDataAttrs as l, BufferingIndicatorCore as m, MediaButtonElement as n, PiPButtonCore as o, BufferingIndicatorDataAttrs as p, PosterDataAttrs as r, FullscreenButtonDataAttrs as s, ContextPartElement as t, ControlsCore as u };
2459
+ //# sourceMappingURL=volume-slider-D7BOdSDF.js.map