@videojs/html 10.0.0-beta.14 → 10.0.0-beta.16

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 (301) hide show
  1. package/cdn/audio-minimal-ui.dev.js +4 -5
  2. package/cdn/audio-minimal-ui.js +1 -1
  3. package/cdn/audio-minimal.dev.js +7 -8
  4. package/cdn/audio-minimal.dev.js.map +1 -1
  5. package/cdn/audio-minimal.js +1 -1
  6. package/cdn/audio-minimal.js.map +1 -1
  7. package/cdn/audio-ui.dev.js +5 -5
  8. package/cdn/audio-ui.js +1 -1
  9. package/cdn/audio.dev.js +23 -7
  10. package/cdn/audio.dev.js.map +1 -1
  11. package/cdn/audio.js +1 -1
  12. package/cdn/audio.js.map +1 -1
  13. package/cdn/background.dev.js +3 -3
  14. package/cdn/background.js +1 -1
  15. package/cdn/background.js.map +1 -1
  16. package/cdn/context-C-IpVHEt.js +14 -0
  17. package/cdn/context-C-IpVHEt.js.map +1 -0
  18. package/cdn/{context-BjrbhiSk.js → context-CvJ83xGk.js} +2 -83
  19. package/cdn/context-CvJ83xGk.js.map +1 -0
  20. package/cdn/create-player-B_oNyyb5.js +7 -0
  21. package/cdn/create-player-B_oNyyb5.js.map +1 -0
  22. package/cdn/{create-player-Cz5Y4DmL.js → create-player-DckZq-sE.js} +59 -1419
  23. package/cdn/create-player-DckZq-sE.js.map +1 -0
  24. package/cdn/{hls-DwNUcXDb.js → hls-CJCXZSGG.js} +43 -5
  25. package/cdn/hls-CJCXZSGG.js.map +1 -0
  26. package/cdn/{hls-A02jAc_G.js → hls-lPH0rWmB.js} +3 -3
  27. package/cdn/hls-lPH0rWmB.js.map +1 -0
  28. package/cdn/hotkey-B7OaweHa.js +154 -0
  29. package/cdn/hotkey-B7OaweHa.js.map +1 -0
  30. package/cdn/hotkey-BLEt77Z0.js +2 -0
  31. package/cdn/hotkey-BLEt77Z0.js.map +1 -0
  32. package/cdn/media/dash-video.dev.js +3 -4
  33. package/cdn/media/dash-video.dev.js.map +1 -1
  34. package/cdn/media/dash-video.js +2 -2
  35. package/cdn/media/hls-video.dev.js +4 -5
  36. package/cdn/media/hls-video.dev.js.map +1 -1
  37. package/cdn/media/hls-video.js +1 -1
  38. package/cdn/media/hls-video.js.map +1 -1
  39. package/cdn/media/mux-audio.dev.d.ts +1 -0
  40. package/cdn/media/mux-audio.dev.js +29 -0
  41. package/cdn/media/mux-audio.dev.js.map +1 -0
  42. package/cdn/media/mux-audio.js +2 -0
  43. package/cdn/media/mux-audio.js.map +1 -0
  44. package/cdn/media/mux-video.dev.js +5 -3099
  45. package/cdn/media/mux-video.dev.js.map +1 -1
  46. package/cdn/media/mux-video.js +1 -24
  47. package/cdn/media/mux-video.js.map +1 -1
  48. package/cdn/media/native-hls-video.dev.js +4 -4
  49. package/cdn/media/native-hls-video.js +1 -1
  50. package/cdn/media/simple-hls-video.dev.js +965 -680
  51. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  52. package/cdn/media/simple-hls-video.js +6 -6
  53. package/cdn/media/simple-hls-video.js.map +1 -1
  54. package/cdn/{media-attach-mixin-DfKkofgF.js → media-attach-mixin-CMH1ziXP.js} +2 -2
  55. package/cdn/{media-attach-mixin-DfKkofgF.js.map → media-attach-mixin-CMH1ziXP.js.map} +1 -1
  56. package/cdn/{media-attach-mixin-Dv2D43tb.js → media-attach-mixin-DUzmXEJ3.js} +2 -2
  57. package/cdn/{media-attach-mixin-Dv2D43tb.js.map → media-attach-mixin-DUzmXEJ3.js.map} +1 -1
  58. package/cdn/{media-props-mixin-CNJVvHAH.js → media-props-mixin-CZLZIhGT.js} +100 -9
  59. package/cdn/media-props-mixin-CZLZIhGT.js.map +1 -0
  60. package/cdn/media-props-mixin-DrjlZybt.js +47 -0
  61. package/cdn/media-props-mixin-DrjlZybt.js.map +1 -0
  62. package/cdn/{minimal-BUUGNZK7.js → minimal-D9Dw-L2P.js} +1 -1
  63. package/cdn/{minimal-BUUGNZK7.js.map → minimal-D9Dw-L2P.js.map} +1 -1
  64. package/cdn/{minimal-CJGOJ6pE.js → minimal-Dc5nNl_-.js} +1 -1
  65. package/cdn/{minimal-CJGOJ6pE.js.map → minimal-Dc5nNl_-.js.map} +1 -1
  66. package/cdn/mux-CBXn2z5k.js +3102 -0
  67. package/cdn/mux-CBXn2z5k.js.map +1 -0
  68. package/cdn/mux-DmGzBNIq.js +25 -0
  69. package/cdn/mux-DmGzBNIq.js.map +1 -0
  70. package/cdn/{native-hls-CPgjPTAQ.js → native-hls-BCOLtRUl.js} +2 -3
  71. package/cdn/{native-hls-CPgjPTAQ.js.map → native-hls-BCOLtRUl.js.map} +1 -1
  72. package/cdn/native-hls-BU8--1Kg.js +2 -0
  73. package/cdn/{native-hls-Db2TurPW.js.map → native-hls-BU8--1Kg.js.map} +1 -1
  74. package/cdn/player-DAmuLGE1.js +2 -0
  75. package/cdn/{player-DlGhe0FD.js.map → player-DAmuLGE1.js.map} +1 -1
  76. package/cdn/{player-XArb4DyB.js → player-Dbl1MUJ2.js} +3 -3
  77. package/cdn/{player-XArb4DyB.js.map → player-Dbl1MUJ2.js.map} +1 -1
  78. package/cdn/poster-B9COb7AR.js +2 -0
  79. package/cdn/poster-B9COb7AR.js.map +1 -0
  80. package/cdn/poster-qAhnKWea.js +480 -0
  81. package/cdn/poster-qAhnKWea.js.map +1 -0
  82. package/cdn/{skin-element-Dk_f7DE8.js → skin-element-DbmY-ske.js} +2 -2
  83. package/cdn/{skin-element-Dk_f7DE8.js.map → skin-element-DbmY-ske.js.map} +1 -1
  84. package/cdn/{skin-element-D40glySA.js → skin-element-ih3VrnYx.js} +2 -2
  85. package/cdn/{skin-element-D40glySA.js.map → skin-element-ih3VrnYx.js.map} +1 -1
  86. package/cdn/video-minimal-ui.dev.js +4 -5
  87. package/cdn/video-minimal-ui.js +1 -1
  88. package/cdn/video-minimal.dev.js +7 -8
  89. package/cdn/video-minimal.dev.js.map +1 -1
  90. package/cdn/video-minimal.js +1 -1
  91. package/cdn/video-minimal.js.map +1 -1
  92. package/cdn/video-ui.dev.js +5 -5
  93. package/cdn/video-ui.js +1 -1
  94. package/cdn/video.dev.js +26 -7
  95. package/cdn/video.dev.js.map +1 -1
  96. package/cdn/video.js +1 -1
  97. package/cdn/video.js.map +1 -1
  98. package/cdn/volume-slider-BbIc1N4U.js +8 -0
  99. package/cdn/volume-slider-BbIc1N4U.js.map +1 -0
  100. package/cdn/{volume-slider-CxGbFVVX.js → volume-slider-C6ek7oC9.js} +1855 -386
  101. package/cdn/volume-slider-C6ek7oC9.js.map +1 -0
  102. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  103. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  104. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  105. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  106. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  107. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  108. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  109. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  110. package/dist/default/define/audio/minimal-skin.css +23 -0
  111. package/dist/default/define/audio/skin.css +23 -0
  112. package/dist/default/define/audio/skin.js +1 -1
  113. package/dist/default/define/audio/skin.js.map +1 -1
  114. package/dist/default/define/audio/ui.js +1 -0
  115. package/dist/default/define/background/skin.js +1 -1
  116. package/dist/default/define/media/mux-audio.js +13 -0
  117. package/dist/default/define/media/mux-audio.js.map +1 -0
  118. package/dist/default/define/skin-element.js +1 -1
  119. package/dist/default/define/ui/hotkey.js +7 -0
  120. package/dist/default/define/ui/hotkey.js.map +1 -0
  121. package/dist/default/define/ui/slider.js +1 -1
  122. package/dist/default/define/ui/time-slider.js +1 -1
  123. package/dist/default/define/ui/volume-slider.js +1 -1
  124. package/dist/default/define/video/minimal-skin.css +23 -0
  125. package/dist/default/define/video/skin.css +23 -0
  126. package/dist/default/define/video/skin.js +1 -1
  127. package/dist/default/define/video/skin.js.map +1 -1
  128. package/dist/default/define/video/ui.js +1 -0
  129. package/dist/default/index.js +5 -1
  130. package/dist/default/media/container-element.js +16 -0
  131. package/dist/default/media/container-element.js.map +1 -1
  132. package/dist/default/media/mux-audio/index.js +18 -0
  133. package/dist/default/media/mux-audio/index.js.map +1 -0
  134. package/dist/default/player/context.js.map +1 -1
  135. package/dist/default/ui/alert-dialog/alert-dialog-element.js +1 -0
  136. package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  137. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +1 -0
  138. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  139. package/dist/default/ui/captions-button/captions-button-element.js +1 -0
  140. package/dist/default/ui/captions-button/captions-button-element.js.map +1 -1
  141. package/dist/default/ui/error-dialog/error-dialog-element.js +1 -0
  142. package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -1
  143. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +1 -0
  144. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  145. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  146. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  147. package/dist/default/ui/hotkey/hotkey-element.js +81 -0
  148. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -0
  149. package/dist/default/ui/media-button-element.js +9 -1
  150. package/dist/default/ui/media-button-element.js.map +1 -1
  151. package/dist/default/ui/mute-button/mute-button-element.js +1 -0
  152. package/dist/default/ui/mute-button/mute-button-element.js.map +1 -1
  153. package/dist/default/ui/pip-button/pip-button-element.js +1 -0
  154. package/dist/default/ui/pip-button/pip-button-element.js.map +1 -1
  155. package/dist/default/ui/play-button/play-button-element.js +1 -0
  156. package/dist/default/ui/play-button/play-button-element.js.map +1 -1
  157. package/dist/default/ui/popover/popover-element.js +7 -55
  158. package/dist/default/ui/popover/popover-element.js.map +1 -1
  159. package/dist/default/ui/position-controller.js +76 -0
  160. package/dist/default/ui/position-controller.js.map +1 -0
  161. package/dist/default/ui/slider/slider-element.js +1 -1
  162. package/dist/default/ui/slider/slider-preview-element.js +1 -1
  163. package/dist/default/ui/time-slider/time-slider-element.js +5 -5
  164. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  165. package/dist/default/ui/tooltip/tooltip-element.js +8 -54
  166. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  167. package/dist/default/ui/volume-slider/volume-slider-element.js +1 -1
  168. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  169. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  170. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  171. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  172. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  173. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  174. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  175. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  176. package/dist/dev/define/audio/minimal-skin.css +23 -0
  177. package/dist/dev/define/audio/skin.css +23 -0
  178. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  179. package/dist/dev/define/audio/skin.js +16 -0
  180. package/dist/dev/define/audio/skin.js.map +1 -1
  181. package/dist/dev/define/audio/ui.js +1 -0
  182. package/dist/dev/define/background/skin.js +1 -1
  183. package/dist/dev/define/media/mux-audio.d.ts +14 -0
  184. package/dist/dev/define/media/mux-audio.d.ts.map +1 -0
  185. package/dist/dev/define/media/mux-audio.js +13 -0
  186. package/dist/dev/define/media/mux-audio.js.map +1 -0
  187. package/dist/dev/define/skin-element.d.ts +1 -1
  188. package/dist/dev/define/skin-element.js +1 -1
  189. package/dist/dev/define/ui/hotkey.d.ts +9 -0
  190. package/dist/dev/define/ui/hotkey.d.ts.map +1 -0
  191. package/dist/dev/define/ui/hotkey.js +7 -0
  192. package/dist/dev/define/ui/hotkey.js.map +1 -0
  193. package/dist/dev/define/ui/slider.js +1 -1
  194. package/dist/dev/define/ui/time-slider.js +1 -1
  195. package/dist/dev/define/ui/volume-slider.js +1 -1
  196. package/dist/dev/define/video/minimal-skin.css +23 -0
  197. package/dist/dev/define/video/skin.css +23 -0
  198. package/dist/dev/define/video/skin.d.ts.map +1 -1
  199. package/dist/dev/define/video/skin.js +19 -0
  200. package/dist/dev/define/video/skin.js.map +1 -1
  201. package/dist/dev/define/video/ui.js +1 -0
  202. package/dist/dev/index.d.ts +6 -2
  203. package/dist/dev/index.js +5 -1
  204. package/dist/dev/media/container-element.d.ts +3 -0
  205. package/dist/dev/media/container-element.d.ts.map +1 -1
  206. package/dist/dev/media/container-element.js +16 -0
  207. package/dist/dev/media/container-element.js.map +1 -1
  208. package/dist/dev/media/mux-audio/index.d.ts +11 -0
  209. package/dist/dev/media/mux-audio/index.d.ts.map +1 -0
  210. package/dist/dev/media/mux-audio/index.js +18 -0
  211. package/dist/dev/media/mux-audio/index.js.map +1 -0
  212. package/dist/dev/player/context.d.ts +4 -2
  213. package/dist/dev/player/context.d.ts.map +1 -1
  214. package/dist/dev/player/context.js.map +1 -1
  215. package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
  216. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +1 -0
  217. package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  218. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
  219. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +1 -0
  220. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  221. package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -0
  222. package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
  223. package/dist/dev/ui/captions-button/captions-button-element.js +1 -0
  224. package/dist/dev/ui/captions-button/captions-button-element.js.map +1 -1
  225. package/dist/dev/ui/context-part-element.d.ts +1 -1
  226. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -1
  227. package/dist/dev/ui/error-dialog/error-dialog-element.js +1 -0
  228. package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -1
  229. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +1 -0
  230. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
  231. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +1 -0
  232. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  233. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +15 -0
  234. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -0
  235. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  236. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  237. package/dist/dev/ui/hotkey/hotkey-element.d.ts +21 -0
  238. package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -0
  239. package/dist/dev/ui/hotkey/hotkey-element.js +81 -0
  240. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -0
  241. package/dist/dev/ui/media-button-element.d.ts +2 -0
  242. package/dist/dev/ui/media-button-element.d.ts.map +1 -1
  243. package/dist/dev/ui/media-button-element.js +9 -1
  244. package/dist/dev/ui/media-button-element.js.map +1 -1
  245. package/dist/dev/ui/mute-button/mute-button-element.d.ts +1 -0
  246. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
  247. package/dist/dev/ui/mute-button/mute-button-element.js +1 -0
  248. package/dist/dev/ui/mute-button/mute-button-element.js.map +1 -1
  249. package/dist/dev/ui/pip-button/pip-button-element.d.ts +1 -0
  250. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
  251. package/dist/dev/ui/pip-button/pip-button-element.js +1 -0
  252. package/dist/dev/ui/pip-button/pip-button-element.js.map +1 -1
  253. package/dist/dev/ui/play-button/play-button-element.d.ts +1 -0
  254. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
  255. package/dist/dev/ui/play-button/play-button-element.js +1 -0
  256. package/dist/dev/ui/play-button/play-button-element.js.map +1 -1
  257. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  258. package/dist/dev/ui/popover/popover-element.js +7 -55
  259. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  260. package/dist/dev/ui/position-controller.js +76 -0
  261. package/dist/dev/ui/position-controller.js.map +1 -0
  262. package/dist/dev/ui/slider/slider-element.js +1 -1
  263. package/dist/dev/ui/slider/slider-preview-element.d.ts +21 -0
  264. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -0
  265. package/dist/dev/ui/slider/slider-preview-element.js +1 -1
  266. package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
  267. package/dist/dev/ui/time-slider/time-slider-element.js +5 -5
  268. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  269. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  270. package/dist/dev/ui/tooltip/tooltip-element.js +8 -54
  271. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  272. package/dist/dev/ui/volume-slider/volume-slider-element.js +1 -1
  273. package/package.json +8 -8
  274. package/cdn/context-BjrbhiSk.js.map +0 -1
  275. package/cdn/context-CdkhXQEw.js +0 -14
  276. package/cdn/context-CdkhXQEw.js.map +0 -1
  277. package/cdn/create-player-Cz5Y4DmL.js.map +0 -1
  278. package/cdn/create-player-DSGjDLpM.js +0 -7
  279. package/cdn/create-player-DSGjDLpM.js.map +0 -1
  280. package/cdn/delegate-B626t_Va.js +0 -2
  281. package/cdn/delegate-B626t_Va.js.map +0 -1
  282. package/cdn/delegate-BCw-LjP_.js +0 -56
  283. package/cdn/delegate-BCw-LjP_.js.map +0 -1
  284. package/cdn/hls-A02jAc_G.js.map +0 -1
  285. package/cdn/hls-DwNUcXDb.js.map +0 -1
  286. package/cdn/media-props-mixin-CNJVvHAH.js.map +0 -1
  287. package/cdn/media-props-mixin-CmboksUe.js +0 -47
  288. package/cdn/media-props-mixin-CmboksUe.js.map +0 -1
  289. package/cdn/native-hls-Db2TurPW.js +0 -2
  290. package/cdn/player-DlGhe0FD.js +0 -2
  291. package/cdn/poster-BUuGv2Va.js +0 -215
  292. package/cdn/poster-BUuGv2Va.js.map +0 -1
  293. package/cdn/poster-Crn2YX3_.js +0 -2
  294. package/cdn/poster-Crn2YX3_.js.map +0 -1
  295. package/cdn/volume-slider-BSbnD5gg.js +0 -8
  296. package/cdn/volume-slider-BSbnD5gg.js.map +0 -1
  297. package/cdn/volume-slider-CxGbFVVX.js.map +0 -1
  298. /package/cdn/{minimal-ui-BL9eBXck.js → minimal-ui-DXFwjywa.js} +0 -0
  299. /package/cdn/{minimal-ui-a1UOKF79.js → minimal-ui-jrmrxIOn.js} +0 -0
  300. /package/cdn/{ui-CFIgmrlA.js → ui-18UYtw8D.js} +0 -0
  301. /package/cdn/{ui-Ccp_LyCf.js → ui-8HVY3XSt.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-controller.js","names":["#host","#abort","#trigger","#frame","#resizeObserver"],"sources":["../../../src/ui/position-controller.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\n\nexport type PositionControllerHost = ReactiveControllerHost & HTMLElement;\n\n/**\n * Reactive controller that manages JS-fallback positioning for floating\n * popup elements (tooltips, popovers). Tracks scroll, resize, and\n * ResizeObserver events to keep the popup aligned with its trigger.\n *\n * When native CSS Anchor Positioning is supported, `sync()` is a no-op.\n */\nexport class PositionController implements ReactiveController {\n readonly #host: PositionControllerHost;\n\n #abort: AbortController | null = null;\n #frame = 0;\n #resizeObserver: ResizeObserver | null = null;\n #trigger: HTMLElement | null = null;\n\n constructor(host: PositionControllerHost) {\n this.#host = host;\n host.addController(this);\n }\n\n /** Discover a trigger element linked via `commandfor` attribute. */\n findTrigger(): HTMLElement | null {\n if (!this.#host.id) return null;\n const root = this.#host.getRootNode() as Document | ShadowRoot;\n return root.querySelector<HTMLElement>(`[commandfor=\"${this.#host.id}\"]`);\n }\n\n /** Start or update position tracking for the given trigger. */\n sync(trigger: HTMLElement | null): void {\n if (supportsAnchorPositioning()) return;\n if (!trigger) return;\n if (this.#abort && this.#trigger === trigger) return;\n\n this.cleanup();\n this.#abort = new AbortController();\n this.#trigger = trigger;\n const { signal } = this.#abort;\n\n const reposition = () => {\n cancelAnimationFrame(this.#frame);\n this.#frame = requestAnimationFrame(() => {\n if (signal.aborted) return;\n this.#host.requestUpdate();\n });\n };\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true, signal });\n window.addEventListener('resize', reposition, { signal });\n\n if (typeof ResizeObserver === 'function') {\n this.#resizeObserver = new ResizeObserver(() => {\n reposition();\n });\n this.#resizeObserver.observe(trigger);\n this.#resizeObserver.observe(this.#host);\n }\n\n reposition();\n }\n\n /** Stop all position tracking. */\n cleanup(): void {\n this.#abort?.abort();\n this.#abort = null;\n this.#trigger = null;\n cancelAnimationFrame(this.#frame);\n this.#frame = 0;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n hostDestroyed(): void {\n this.cleanup();\n }\n}\n"],"mappings":";;;;;;;;;AAYA,IAAa,qBAAb,MAA8D;CAC5D;CAEA,SAAiC;CACjC,SAAS;CACT,kBAAyC;CACzC,WAA+B;CAE/B,YAAY,MAA8B;AACxC,QAAA,OAAa;AACb,OAAK,cAAc,KAAK;;;CAI1B,cAAkC;AAChC,MAAI,CAAC,MAAA,KAAW,GAAI,QAAO;AAE3B,SADa,MAAA,KAAW,aAAa,CACzB,cAA2B,gBAAgB,MAAA,KAAW,GAAG,IAAI;;;CAI3E,KAAK,SAAmC;AACtC,MAAI,2BAA2B,CAAE;AACjC,MAAI,CAAC,QAAS;AACd,MAAI,MAAA,SAAe,MAAA,YAAkB,QAAS;AAE9C,OAAK,SAAS;AACd,QAAA,QAAc,IAAI,iBAAiB;AACnC,QAAA,UAAgB;EAChB,MAAM,EAAE,WAAW,MAAA;EAEnB,MAAM,mBAAmB;AACvB,wBAAqB,MAAA,MAAY;AACjC,SAAA,QAAc,4BAA4B;AACxC,QAAI,OAAO,QAAS;AACpB,UAAA,KAAW,eAAe;KAC1B;;AAGJ,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM;GAAQ,CAAC;AACvF,SAAO,iBAAiB,UAAU,YAAY,EAAE,QAAQ,CAAC;AAEzD,MAAI,OAAO,mBAAmB,YAAY;AACxC,SAAA,iBAAuB,IAAI,qBAAqB;AAC9C,gBAAY;KACZ;AACF,SAAA,eAAqB,QAAQ,QAAQ;AACrC,SAAA,eAAqB,QAAQ,MAAA,KAAW;;AAG1C,cAAY;;;CAId,UAAgB;AACd,QAAA,OAAa,OAAO;AACpB,QAAA,QAAc;AACd,QAAA,UAAgB;AAChB,uBAAqB,MAAA,MAAY;AACjC,QAAA,QAAc;AACd,QAAA,gBAAsB,YAAY;AAClC,QAAA,iBAAuB;;CAGzB,mBAAyB;AACvB,OAAK,SAAS;;CAGhB,gBAAsB;AACpB,OAAK,SAAS"}
@@ -2,8 +2,8 @@ import { MediaElement } from "../media-element.js";
2
2
  import { sliderContext } from "./context.js";
3
3
  import { SliderCore, SliderDataAttrs } from "@videojs/core";
4
4
  import { applyElementProps, applyStateDataAttrs, createSlider, getSliderCSSVars } from "@videojs/core/dom";
5
- import { ContextProvider } from "@videojs/element/context";
6
5
  import { applyStyles, isRTL } from "@videojs/utils/dom";
6
+ import { ContextProvider } from "@videojs/element/context";
7
7
  //#region src/ui/slider/slider-element.ts
8
8
  var SliderElement = class extends MediaElement {
9
9
  constructor(..._args) {
@@ -0,0 +1,21 @@
1
+ import { MediaElement } from "../media-element.js";
2
+ import { SliderPreviewOverflow } from "@videojs/core/dom";
3
+ import { PropertyValues } from "@videojs/element";
4
+
5
+ //#region src/ui/slider/slider-preview-element.d.ts
6
+ declare class SliderPreviewElement extends MediaElement {
7
+ #private;
8
+ static readonly tagName = "media-slider-preview";
9
+ static properties: {
10
+ overflow: {
11
+ type: StringConstructor;
12
+ };
13
+ };
14
+ overflow: SliderPreviewOverflow;
15
+ connectedCallback(): void;
16
+ disconnectedCallback(): void;
17
+ protected update(_changed: PropertyValues): void;
18
+ }
19
+ //#endregion
20
+ export { SliderPreviewElement };
21
+ //# sourceMappingURL=slider-preview-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-preview-element.d.ts","names":[],"sources":["../../../../src/ui/slider/slider-preview-element.ts"],"mappings":";;;;;cASa,oBAAA,SAA6B,YAAA;EAAA;kBACxB,OAAA;EAAA,OAEA,UAAA;;;;;EAIhB,QAAA,EAAU,qBAAA;EAUD,iBAAA,CAAA;EAWA,oBAAA,CAAA;EAAA,UAUU,MAAA,CAAO,QAAA,EAAU,cAAA;AAAA"}
@@ -1,8 +1,8 @@
1
1
  import { MediaElement } from "../media-element.js";
2
2
  import { sliderContext } from "./context.js";
3
3
  import { applyStateDataAttrs, getSliderPreviewStyle } from "@videojs/core/dom";
4
- import { ContextConsumer } from "@videojs/element/context";
5
4
  import { applyStyles } from "@videojs/utils/dom";
5
+ import { ContextConsumer } from "@videojs/element/context";
6
6
  //#region src/ui/slider/slider-preview-element.ts
7
7
  var SliderPreviewElement = class extends MediaElement {
8
8
  constructor(..._args) {
@@ -10,7 +10,7 @@ declare class TimeSliderElement extends MediaElement {
10
10
  label: {
11
11
  type: StringConstructor;
12
12
  };
13
- commitThrottle: {
13
+ changeThrottle: {
14
14
  type: NumberConstructor;
15
15
  attribute: string;
16
16
  };
@@ -33,7 +33,7 @@ declare class TimeSliderElement extends MediaElement {
33
33
  };
34
34
  };
35
35
  label: string | ((state: _videojs_core0.SliderState) => string);
36
- commitThrottle: number;
36
+ changeThrottle: number;
37
37
  step: number;
38
38
  largeStep: number;
39
39
  orientation: "horizontal" | "vertical";
@@ -4,15 +4,15 @@ import { PlayerController } from "../../player/player-controller.js";
4
4
  import { sliderContext } from "../slider/context.js";
5
5
  import { TimeSliderCore, TimeSliderDataAttrs } from "@videojs/core";
6
6
  import { applyElementProps, applyStateDataAttrs, createSlider, getTimeSliderCSSVars, logMissingFeature, selectBuffer, selectTime } from "@videojs/core/dom";
7
- import { ContextProvider } from "@videojs/element/context";
8
7
  import { applyStyles, isRTL } from "@videojs/utils/dom";
8
+ import { ContextProvider } from "@videojs/element/context";
9
9
  import { formatTime } from "@videojs/utils/time";
10
10
  //#region src/ui/time-slider/time-slider-element.ts
11
11
  var TimeSliderElement = class extends MediaElement {
12
12
  constructor(..._args) {
13
13
  super(..._args);
14
14
  this.label = TimeSliderCore.defaultProps.label;
15
- this.commitThrottle = TimeSliderCore.defaultProps.commitThrottle;
15
+ this.changeThrottle = TimeSliderCore.defaultProps.changeThrottle;
16
16
  this.step = TimeSliderCore.defaultProps.step;
17
17
  this.largeStep = TimeSliderCore.defaultProps.largeStep;
18
18
  this.orientation = TimeSliderCore.defaultProps.orientation;
@@ -25,9 +25,9 @@ var TimeSliderElement = class extends MediaElement {
25
25
  static {
26
26
  this.properties = {
27
27
  label: { type: String },
28
- commitThrottle: {
28
+ changeThrottle: {
29
29
  type: Number,
30
- attribute: "commit-throttle"
30
+ attribute: "change-throttle"
31
31
  },
32
32
  step: { type: Number },
33
33
  largeStep: {
@@ -70,7 +70,7 @@ var TimeSliderElement = class extends MediaElement {
70
70
  const media = this.#timeState.value;
71
71
  if (media) media.seek(this.#core.rawValueFromPercent(percent));
72
72
  },
73
- commitThrottle: this.commitThrottle,
73
+ changeThrottle: this.changeThrottle,
74
74
  onDragStart: () => {
75
75
  this.dispatchEvent(new CustomEvent("drag-start", { bubbles: true }));
76
76
  },
@@ -1 +1 @@
1
- {"version":3,"file":"time-slider-element.js","names":["#core","#provider","#timeState","#bufferState","#disconnect","#slider"],"sources":["../../../../src/ui/time-slider/time-slider-element.ts"],"sourcesContent":["import { TimeSliderCore, TimeSliderDataAttrs } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n getTimeSliderCSSVars,\n logMissingFeature,\n type SliderApi,\n selectBuffer,\n selectTime,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\nimport { applyStyles, isRTL } from '@videojs/utils/dom';\nimport { formatTime } from '@videojs/utils/time';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from '../slider/context';\n\nexport class TimeSliderElement extends MediaElement {\n static readonly tagName = 'media-time-slider';\n\n static override properties = {\n label: { type: String },\n commitThrottle: { type: Number, attribute: 'commit-throttle' },\n step: { type: Number },\n largeStep: { type: Number, attribute: 'large-step' },\n orientation: { type: String },\n disabled: { type: Boolean },\n thumbAlignment: { type: String, attribute: 'thumb-alignment' },\n } satisfies PropertyDeclarationMap<Exclude<keyof TimeSliderCore.Props, 'value' | 'min' | 'max'>>;\n\n label = TimeSliderCore.defaultProps.label;\n commitThrottle = TimeSliderCore.defaultProps.commitThrottle;\n step = TimeSliderCore.defaultProps.step;\n largeStep = TimeSliderCore.defaultProps.largeStep;\n orientation = TimeSliderCore.defaultProps.orientation;\n disabled = TimeSliderCore.defaultProps.disabled;\n thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;\n\n readonly #core = new TimeSliderCore();\n readonly #provider = new ContextProvider(this, { context: sliderContext });\n readonly #timeState = new PlayerController(this, playerContext, selectTime);\n readonly #bufferState = new PlayerController(this, playerContext, selectBuffer);\n\n #slider: SliderApi | null = null;\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const signal = this.#disconnect.signal;\n\n this.#slider = createSlider({\n getElement: () => this,\n getThumbElement: () => this.querySelector<HTMLElement>('media-slider-thumb'),\n getOrientation: () => this.orientation,\n isRTL: () => isRTL(this),\n isDisabled: () => this.disabled || !this.#timeState.value,\n getPercent: () => {\n const media = this.#timeState.value;\n if (!media) return 0;\n return this.#core.percentFromValue(media.currentTime);\n },\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueCommit: (percent) => {\n const media = this.#timeState.value;\n if (media) media.seek(this.#core.rawValueFromPercent(percent));\n },\n commitThrottle: this.commitThrottle,\n onDragStart: () => {\n this.dispatchEvent(new CustomEvent('drag-start', { bubbles: true }));\n },\n onDragEnd: () => {\n this.dispatchEvent(new CustomEvent('drag-end', { bubbles: true }));\n },\n adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),\n onResize: () => this.requestUpdate(),\n });\n\n applyElementProps(this, this.#slider.rootProps, { signal });\n applyStyles(this, this.#slider.rootStyle);\n this.#slider.input.subscribe(() => this.requestUpdate(), { signal });\n\n if (__DEV__ && !this.#timeState.value) {\n logMissingFeature(this.localName, this.#timeState.displayName!);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#slider?.destroy();\n super.destroyCallback();\n }\n\n protected override willUpdate(_changed: PropertyValues): void {\n super.willUpdate(_changed);\n this.#core.setProps(this);\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#slider) return;\n\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n if (!time) return;\n\n this.#core.setInput(this.#slider.input.current);\n const media = { ...time, ...(buffer ?? { buffered: [], seekable: [] }) };\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));\n\n applyStyles(this, cssVars);\n\n // Domain-specific data attributes on root (includes data-seeking).\n applyStateDataAttrs(this, state, TimeSliderDataAttrs);\n\n // Provide context to child elements with base slider data attrs.\n this.#provider.setValue({\n state,\n stateAttrMap: TimeSliderDataAttrs,\n pointerValue: this.#core.valueFromPercent(state.pointerPercent),\n thumbAttrs: this.#core.getAttrs(state),\n thumbProps: this.#slider.thumbProps,\n formatValue: (value) => formatTime(value, state.duration),\n });\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,oBAAb,cAAuC,aAAa;;;eAa1C,eAAe,aAAa;wBACnB,eAAe,aAAa;cACtC,eAAe,aAAa;mBACvB,eAAe,aAAa;qBAC1B,eAAe,aAAa;kBAC/B,eAAe,aAAa;wBACtB,eAAe,aAAa;;;iBAlBnB;;;oBAEG;GAC3B,OAAO,EAAE,MAAM,QAAQ;GACvB,gBAAgB;IAAE,MAAM;IAAQ,WAAW;IAAmB;GAC9D,MAAM,EAAE,MAAM,QAAQ;GACtB,WAAW;IAAE,MAAM;IAAQ,WAAW;IAAc;GACpD,aAAa,EAAE,MAAM,QAAQ;GAC7B,UAAU,EAAE,MAAM,SAAS;GAC3B,gBAAgB;IAAE,MAAM;IAAQ,WAAW;IAAmB;GAC/D;;CAUD,QAAiB,IAAI,gBAAgB;CACrC,YAAqB,IAAI,gBAAgB,MAAM,EAAE,SAAS,eAAe,CAAC;CAC1E,aAAsB,IAAI,iBAAiB,MAAM,eAAe,WAAW;CAC3E,eAAwB,IAAI,iBAAiB,MAAM,eAAe,aAAa;CAE/E,UAA4B;CAC5B,cAAsC;CAEtC,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,MAAI,KAAK,UAAW;AAEpB,QAAA,aAAmB,IAAI,iBAAiB;EACxC,MAAM,SAAS,MAAA,WAAiB;AAEhC,QAAA,SAAe,aAAa;GAC1B,kBAAkB;GAClB,uBAAuB,KAAK,cAA2B,qBAAqB;GAC5E,sBAAsB,KAAK;GAC3B,aAAa,MAAM,KAAK;GACxB,kBAAkB,KAAK,YAAY,CAAC,MAAA,UAAgB;GACpD,kBAAkB;IAChB,MAAM,QAAQ,MAAA,UAAgB;AAC9B,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAA,KAAW,iBAAiB,MAAM,YAAY;;GAEvD,sBAAsB,MAAA,KAAW,gBAAgB;GACjD,2BAA2B,MAAA,KAAW,qBAAqB;GAC3D,gBAAgB,YAAY;IAC1B,MAAM,QAAQ,MAAA,UAAgB;AAC9B,QAAI,MAAO,OAAM,KAAK,MAAA,KAAW,oBAAoB,QAAQ,CAAC;;GAEhE,gBAAgB,KAAK;GACrB,mBAAmB;AACjB,SAAK,cAAc,IAAI,YAAY,cAAc,EAAE,SAAS,MAAM,CAAC,CAAC;;GAEtE,iBAAiB;AACf,SAAK,cAAc,IAAI,YAAY,YAAY,EAAE,SAAS,MAAM,CAAC,CAAC;;GAEpE,gBAAgB,KAAK,WAAW,cAAc,MAAA,KAAW,0BAA0B,KAAK,WAAW,UAAU;GAC7G,gBAAgB,KAAK,eAAe;GACrC,CAAC;AAEF,oBAAkB,MAAM,MAAA,OAAa,WAAW,EAAE,QAAQ,CAAC;AAC3D,cAAY,MAAM,MAAA,OAAa,UAAU;AACzC,QAAA,OAAa,MAAM,gBAAgB,KAAK,eAAe,EAAE,EAAE,QAAQ,CAAC;AAEpE,MAAe,CAAC,MAAA,UAAgB,MAC9B,mBAAkB,KAAK,WAAW,MAAA,UAAgB,YAAa;;CAInE,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;CAGrB,kBAAiC;AAC/B,QAAA,QAAc,SAAS;AACvB,QAAM,iBAAiB;;CAGzB,WAA8B,UAAgC;AAC5D,QAAM,WAAW,SAAS;AAC1B,QAAA,KAAW,SAAS,KAAK;;CAG3B,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,MAAA,OAAc;EAEnB,MAAM,OAAO,MAAA,UAAgB;EAC7B,MAAM,SAAS,MAAA,YAAkB;AACjC,MAAI,CAAC,KAAM;AAEX,QAAA,KAAW,SAAS,MAAA,OAAa,MAAM,QAAQ;EAC/C,MAAM,QAAQ;GAAE,GAAG;GAAM,GAAI,UAAU;IAAE,UAAU,EAAE;IAAE,UAAU,EAAE;IAAE;GAAG;AACxE,QAAA,KAAW,SAAS,MAAM;EAC1B,MAAM,QAAQ,MAAA,KAAW,UAAU;EAEnC,MAAM,UAAU,qBAAqB,MAAA,OAAa,mBAAmB,MAAM,CAAC;AAE5E,cAAY,MAAM,QAAQ;AAG1B,sBAAoB,MAAM,OAAO,oBAAoB;AAGrD,QAAA,SAAe,SAAS;GACtB;GACA,cAAc;GACd,cAAc,MAAA,KAAW,iBAAiB,MAAM,eAAe;GAC/D,YAAY,MAAA,KAAW,SAAS,MAAM;GACtC,YAAY,MAAA,OAAa;GACzB,cAAc,UAAU,WAAW,OAAO,MAAM,SAAS;GAC1D,CAAC"}
1
+ {"version":3,"file":"time-slider-element.js","names":["#core","#provider","#timeState","#bufferState","#disconnect","#slider"],"sources":["../../../../src/ui/time-slider/time-slider-element.ts"],"sourcesContent":["import { TimeSliderCore, TimeSliderDataAttrs } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n getTimeSliderCSSVars,\n logMissingFeature,\n type SliderApi,\n selectBuffer,\n selectTime,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\nimport { applyStyles, isRTL } from '@videojs/utils/dom';\nimport { formatTime } from '@videojs/utils/time';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from '../slider/context';\n\nexport class TimeSliderElement extends MediaElement {\n static readonly tagName = 'media-time-slider';\n\n static override properties = {\n label: { type: String },\n changeThrottle: { type: Number, attribute: 'change-throttle' },\n step: { type: Number },\n largeStep: { type: Number, attribute: 'large-step' },\n orientation: { type: String },\n disabled: { type: Boolean },\n thumbAlignment: { type: String, attribute: 'thumb-alignment' },\n } satisfies PropertyDeclarationMap<Exclude<keyof TimeSliderCore.Props, 'value' | 'min' | 'max'>>;\n\n label = TimeSliderCore.defaultProps.label;\n changeThrottle = TimeSliderCore.defaultProps.changeThrottle;\n step = TimeSliderCore.defaultProps.step;\n largeStep = TimeSliderCore.defaultProps.largeStep;\n orientation = TimeSliderCore.defaultProps.orientation;\n disabled = TimeSliderCore.defaultProps.disabled;\n thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;\n\n readonly #core = new TimeSliderCore();\n readonly #provider = new ContextProvider(this, { context: sliderContext });\n readonly #timeState = new PlayerController(this, playerContext, selectTime);\n readonly #bufferState = new PlayerController(this, playerContext, selectBuffer);\n\n #slider: SliderApi | null = null;\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const signal = this.#disconnect.signal;\n\n this.#slider = createSlider({\n getElement: () => this,\n getThumbElement: () => this.querySelector<HTMLElement>('media-slider-thumb'),\n getOrientation: () => this.orientation,\n isRTL: () => isRTL(this),\n isDisabled: () => this.disabled || !this.#timeState.value,\n getPercent: () => {\n const media = this.#timeState.value;\n if (!media) return 0;\n return this.#core.percentFromValue(media.currentTime);\n },\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueCommit: (percent) => {\n const media = this.#timeState.value;\n if (media) media.seek(this.#core.rawValueFromPercent(percent));\n },\n changeThrottle: this.changeThrottle,\n onDragStart: () => {\n this.dispatchEvent(new CustomEvent('drag-start', { bubbles: true }));\n },\n onDragEnd: () => {\n this.dispatchEvent(new CustomEvent('drag-end', { bubbles: true }));\n },\n adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),\n onResize: () => this.requestUpdate(),\n });\n\n applyElementProps(this, this.#slider.rootProps, { signal });\n applyStyles(this, this.#slider.rootStyle);\n this.#slider.input.subscribe(() => this.requestUpdate(), { signal });\n\n if (__DEV__ && !this.#timeState.value) {\n logMissingFeature(this.localName, this.#timeState.displayName!);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#slider?.destroy();\n super.destroyCallback();\n }\n\n protected override willUpdate(_changed: PropertyValues): void {\n super.willUpdate(_changed);\n this.#core.setProps(this);\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#slider) return;\n\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n if (!time) return;\n\n this.#core.setInput(this.#slider.input.current);\n const media = { ...time, ...(buffer ?? { buffered: [], seekable: [] }) };\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));\n\n applyStyles(this, cssVars);\n\n // Domain-specific data attributes on root (includes data-seeking).\n applyStateDataAttrs(this, state, TimeSliderDataAttrs);\n\n // Provide context to child elements with base slider data attrs.\n this.#provider.setValue({\n state,\n stateAttrMap: TimeSliderDataAttrs,\n pointerValue: this.#core.valueFromPercent(state.pointerPercent),\n thumbAttrs: this.#core.getAttrs(state),\n thumbProps: this.#slider.thumbProps,\n formatValue: (value) => formatTime(value, state.duration),\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-element.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-element.ts"],"mappings":";;;;;cA+Ba,cAAA,SAAuB,YAAA;EAAA;kBAClB,OAAA;EAAA,OAEA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWhB,IAAA;EACA,WAAA;EACA,IAAA,iBAAI,WAAA;EACJ,KAAA,EADI,cAAA,CACC,YAAA;EACL,KAAA;EACA,UAAA;EACA,qBAAA;EACA,QAAA;EAgBS,iBAAA,CAAA;EAAA,UAgCU,YAAA,CAAa,OAAA,EAAS,cAAA;EAUhC,oBAAA,CAAA;EAAA,UAUU,UAAA,CAAW,OAAA,EAAS,cAAA;EAAA,UAiBpB,MAAA,CAAO,QAAA,EAAU,cAAA;AAAA"}
1
+ {"version":3,"file":"tooltip-element.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-element.ts"],"mappings":";;;;;cAgCa,cAAA,SAAuB,YAAA;EAAA;kBAClB,OAAA;EAAA,OAEA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWhB,IAAA;EACA,WAAA;EACA,IAAA,iBAAI,WAAA;EACJ,KAAA,EADI,cAAA,CACC,YAAA;EACL,KAAA;EACA,UAAA;EACA,qBAAA;EACA,QAAA;EAaS,iBAAA,CAAA;EAAA,UAkCU,YAAA,CAAa,OAAA,EAAS,cAAA;EAUhC,oBAAA,CAAA;EAAA,UASU,UAAA,CAAW,OAAA,EAAS,cAAA;EAAA,UAiBpB,MAAA,CAAO,QAAA,EAAU,cAAA;AAAA"}
@@ -1,10 +1,11 @@
1
1
  import { MediaElement } from "../media-element.js";
2
+ import { PositionController } from "../position-controller.js";
2
3
  import { tooltipGroupContext } from "./context.js";
3
4
  import { TooltipCSSVars, TooltipCore, TooltipDataAttrs } from "@videojs/core";
4
5
  import { applyElementProps, applyStateDataAttrs, createTooltip, createTransition, getAnchorNameStyle, getAnchorPositionStyle, getPopupPositionRect, resolveOffsets } from "@videojs/core/dom";
6
+ import { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from "@videojs/utils/dom";
5
7
  import { ContextConsumer } from "@videojs/element/context";
6
8
  import { SnapshotController } from "@videojs/store/html";
7
- import { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from "@videojs/utils/dom";
8
9
  //#region src/ui/tooltip/tooltip-element.ts
9
10
  function isLabelTrigger(el) {
10
11
  return "$state" in el;
@@ -47,17 +48,15 @@ var TooltipElement = class extends MediaElement {
47
48
  }
48
49
  #core = new TooltipCore();
49
50
  #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
51
+ #position = new PositionController(this);
50
52
  #tooltip = null;
51
53
  #snapshot = null;
52
54
  #disconnect = null;
53
55
  #triggerAbort = null;
54
56
  #currentTrigger = null;
55
- #positionAbort = null;
56
- #positionFrame = 0;
57
- #resizeObserver = null;
58
- #positionTrigger = null;
59
57
  connectedCallback() {
60
58
  super.connectedCallback();
59
+ if (this.destroyed) return;
61
60
  this.#disconnect = new AbortController();
62
61
  this.#tooltip = createTooltip({
63
62
  transition: createTransition(),
@@ -85,7 +84,6 @@ var TooltipElement = class extends MediaElement {
85
84
  }
86
85
  disconnectedCallback() {
87
86
  super.disconnectedCallback();
88
- this.#cleanupPositioning();
89
87
  this.#cleanupTrigger();
90
88
  this.#tooltip?.destroy();
91
89
  this.#tooltip = null;
@@ -104,7 +102,7 @@ var TooltipElement = class extends MediaElement {
104
102
  update(_changed) {
105
103
  super.update(_changed);
106
104
  if (!this.#tooltip) return;
107
- const triggerEl = this.#findTrigger();
105
+ const triggerEl = this.#position.findTrigger();
108
106
  this.#syncTrigger(triggerEl);
109
107
  const input = this.#tooltip.input.current;
110
108
  this.#core.setInput(input);
@@ -115,7 +113,7 @@ var TooltipElement = class extends MediaElement {
115
113
  else tryHidePopover(this);
116
114
  if (this.#currentTrigger) applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));
117
115
  if (!state.open) {
118
- this.#cleanupPositioning();
116
+ this.#position.cleanup();
119
117
  return;
120
118
  }
121
119
  const posOpts = {
@@ -130,15 +128,11 @@ var TooltipElement = class extends MediaElement {
130
128
  const offsets = resolveOffsets(this, TooltipCSSVars);
131
129
  applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars));
132
130
  }
133
- this.#syncPositioning();
134
- }
135
- #findTrigger() {
136
- if (!this.id) return null;
137
- return this.getRootNode().querySelector(`[commandfor="${this.id}"]`);
131
+ this.#position.sync(this.#currentTrigger);
138
132
  }
139
133
  #syncTrigger(triggerEl) {
140
134
  if (triggerEl === this.#currentTrigger) return;
141
- this.#cleanupPositioning();
135
+ this.#position.cleanup();
142
136
  this.#cleanupTrigger();
143
137
  this.#currentTrigger = triggerEl;
144
138
  this.#tooltip?.setTriggerElement(triggerEl);
@@ -160,46 +154,6 @@ var TooltipElement = class extends MediaElement {
160
154
  this.#triggerAbort = null;
161
155
  this.#currentTrigger = null;
162
156
  }
163
- #syncPositioning() {
164
- if (supportsAnchorPositioning()) return;
165
- const triggerEl = this.#currentTrigger;
166
- if (!triggerEl) return;
167
- if (this.#positionAbort && this.#positionTrigger === triggerEl) return;
168
- this.#cleanupPositioning();
169
- this.#positionAbort = new AbortController();
170
- this.#positionTrigger = triggerEl;
171
- const { signal } = this.#positionAbort;
172
- const reposition = () => {
173
- cancelAnimationFrame(this.#positionFrame);
174
- this.#positionFrame = requestAnimationFrame(() => {
175
- if (signal.aborted) return;
176
- this.requestUpdate();
177
- });
178
- };
179
- window.addEventListener("scroll", reposition, {
180
- capture: true,
181
- passive: true,
182
- signal
183
- });
184
- window.addEventListener("resize", reposition, { signal });
185
- if (typeof ResizeObserver === "function") {
186
- this.#resizeObserver = new ResizeObserver(() => {
187
- reposition();
188
- });
189
- this.#resizeObserver.observe(triggerEl);
190
- this.#resizeObserver.observe(this);
191
- }
192
- reposition();
193
- }
194
- #cleanupPositioning() {
195
- this.#positionAbort?.abort();
196
- this.#positionAbort = null;
197
- this.#positionTrigger = null;
198
- cancelAnimationFrame(this.#positionFrame);
199
- this.#positionFrame = 0;
200
- this.#resizeObserver?.disconnect();
201
- this.#resizeObserver = null;
202
- }
203
157
  };
204
158
  //#endregion
205
159
  export { TooltipElement };
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-element.js","names":["#core","#groupConsumer","#disconnect","#tooltip","#snapshot","#cleanupPositioning","#cleanupTrigger","#findTrigger","#syncTrigger","#currentTrigger","#syncPositioning","#triggerAbort","#syncContent","#positionAbort","#positionTrigger","#positionFrame","#resizeObserver"],"sources":["../../../../src/ui/tooltip/tooltip-element.ts"],"sourcesContent":["import { type ButtonState, TooltipCore, TooltipCSSVars, TooltipDataAttrs, type TooltipInput } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createTooltip,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n resolveOffsets,\n type TooltipApi,\n type TooltipChangeDetails,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport type { State } from '@videojs/store';\nimport { SnapshotController } from '@videojs/store/html';\nimport { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\nimport { tooltipGroupContext } from './context';\n\ntype TriggerElement = HTMLElement & {\n getLabel(): string | undefined;\n $state: State<ButtonState>;\n};\n\nfunction isLabelTrigger(el: HTMLElement): el is TriggerElement {\n return '$state' in el;\n}\n\nexport class TooltipElement extends MediaElement {\n static readonly tagName = 'media-tooltip';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n disableHoverablePopup: { type: Boolean, attribute: 'disable-hoverable-popup' },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<keyof TooltipCore.Props>;\n\n open = TooltipCore.defaultProps.open;\n defaultOpen = TooltipCore.defaultProps.defaultOpen;\n side = TooltipCore.defaultProps.side;\n align = TooltipCore.defaultProps.align;\n delay = TooltipCore.defaultProps.delay;\n closeDelay = TooltipCore.defaultProps.closeDelay;\n disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;\n disabled = TooltipCore.defaultProps.disabled;\n\n readonly #core = new TooltipCore();\n readonly #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });\n #tooltip: TooltipApi | null = null;\n #snapshot: SnapshotController<TooltipInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n #positionAbort: AbortController | null = null;\n #positionFrame = 0;\n #resizeObserver: ResizeObserver | null = null;\n #positionTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#disconnect = new AbortController();\n\n this.#tooltip = createTooltip({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: TooltipChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n disableHoverablePopup: () => this.disableHoverablePopup,\n disabled: () => this.disabled,\n // Lazy getter — group may arrive after connect via context.\n group: () => this.#groupConsumer.value,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#tooltip.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#tooltip.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n if (this.#snapshot) {\n this.#snapshot.track(this.#tooltip.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#tooltip.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#tooltip?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupPositioning();\n this.#cleanupTrigger();\n this.#tooltip?.destroy();\n this.#tooltip = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#tooltip && changed.has('open')) {\n const { active: interactionOpen } = this.#tooltip.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#tooltip.open();\n } else {\n this.#tooltip.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#tooltip) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#findTrigger();\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#tooltip.input.current;\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, TooltipDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply anchor-name to the discovered trigger for CSS positioning.\n if (this.#currentTrigger) {\n applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#cleanupPositioning();\n return;\n }\n\n // Apply positioning styles to self.\n const posOpts = { side: state.side, align: state.align };\n\n if (supportsAnchorPositioning()) {\n // Native CSS Anchor Positioning — no JS rect measurements needed.\n applyStyles(\n this,\n getAnchorPositionStyle(this.id, posOpts, undefined, undefined, undefined, undefined, TooltipCSSVars)\n );\n } else {\n // JS fallback: measure rects and resolve CSS var offsets.\n const triggerRect = this.#currentTrigger?.getBoundingClientRect();\n const selfRect = getPopupPositionRect(this);\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(this, TooltipCSSVars);\n applyStyles(\n this,\n getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars)\n );\n }\n\n this.#syncPositioning();\n }\n\n // --- Trigger discovery ---\n\n #findTrigger(): HTMLElement | null {\n if (!this.id) return null;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.querySelector<HTMLElement>(`[commandfor=\"${this.id}\"]`);\n }\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#cleanupPositioning();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#tooltip?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#tooltip) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#tooltip.triggerProps, { signal: this.#triggerAbort.signal });\n\n if (isLabelTrigger(triggerEl)) {\n this.#syncContent(triggerEl);\n triggerEl.$state.subscribe(() => this.#syncContent(triggerEl), {\n signal: this.#triggerAbort.signal,\n });\n }\n }\n }\n\n #syncContent(triggerEl: TriggerElement): void {\n this.textContent = triggerEl.getLabel() ?? '';\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n this.#currentTrigger.style.removeProperty('anchor-name');\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n\n #syncPositioning(): void {\n if (supportsAnchorPositioning()) return;\n\n const triggerEl = this.#currentTrigger;\n\n if (!triggerEl) return;\n if (this.#positionAbort && this.#positionTrigger === triggerEl) return;\n\n this.#cleanupPositioning();\n this.#positionAbort = new AbortController();\n this.#positionTrigger = triggerEl;\n const { signal } = this.#positionAbort;\n\n const reposition = () => {\n cancelAnimationFrame(this.#positionFrame);\n this.#positionFrame = requestAnimationFrame(() => {\n if (signal.aborted) return;\n this.requestUpdate();\n });\n };\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true, signal });\n window.addEventListener('resize', reposition, { signal });\n\n if (typeof ResizeObserver === 'function') {\n this.#resizeObserver = new ResizeObserver(() => {\n reposition();\n });\n this.#resizeObserver.observe(triggerEl);\n this.#resizeObserver.observe(this);\n }\n\n reposition();\n }\n\n #cleanupPositioning(): void {\n this.#positionAbort?.abort();\n this.#positionAbort = null;\n this.#positionTrigger = null;\n cancelAnimationFrame(this.#positionFrame);\n this.#positionFrame = 0;\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n}\n"],"mappings":";;;;;;;;AA2BA,SAAS,eAAe,IAAuC;AAC7D,QAAO,YAAY;;AAGrB,IAAa,iBAAb,cAAoC,aAAa;;;cAcxC,YAAY,aAAa;qBAClB,YAAY,aAAa;cAChC,YAAY,aAAa;eACxB,YAAY,aAAa;eACzB,YAAY,aAAa;oBACpB,YAAY,aAAa;+BACd,YAAY,aAAa;kBACtC,YAAY,aAAa;;;iBApBV;;;oBAEG;GAC3B,MAAM,EAAE,MAAM,SAAS;GACvB,aAAa;IAAE,MAAM;IAAS,WAAW;IAAgB;GACzD,MAAM,EAAE,MAAM,QAAQ;GACtB,OAAO,EAAE,MAAM,QAAQ;GACvB,OAAO,EAAE,MAAM,QAAQ;GACvB,YAAY;IAAE,MAAM;IAAQ,WAAW;IAAe;GACtD,uBAAuB;IAAE,MAAM;IAAS,WAAW;IAA2B;GAC9E,UAAU,EAAE,MAAM,SAAS;GAC5B;;CAWD,QAAiB,IAAI,aAAa;CAClC,iBAA0B,IAAI,gBAAgB,MAAM,EAAE,SAAS,qBAAqB,CAAC;CACrF,WAA8B;CAC9B,YAAqD;CAGrD,cAAsC;CACtC,gBAAwC;CACxC,kBAAsC;CACtC,iBAAyC;CACzC,iBAAiB;CACjB,kBAAyC;CACzC,mBAAuC;CAEvC,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,QAAA,aAAmB,IAAI,iBAAiB;AAExC,QAAA,UAAgB,cAAc;GAC5B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI,YAAY,eAAe,EAAE,QAAQ;KAAE,MAAM;KAAU,GAAG;KAAS,EAAE,CAAC,CAAC;;GAEhG,aAAa,KAAK;GAClB,kBAAkB,KAAK;GACvB,6BAA6B,KAAK;GAClC,gBAAgB,KAAK;GAErB,aAAa,MAAA,cAAoB;GAClC,CAAC;AAGF,QAAA,QAAc,gBAAgB,KAAK;AAGnC,oBAAkB,MAAM,MAAA,QAAc,YAAY,EAAE,QAAQ,MAAA,WAAiB,QAAQ,CAAC;AAGtF,MAAI,MAAA,SACF,OAAA,SAAe,MAAM,MAAA,QAAc,MAAM;MAEzC,OAAA,WAAiB,IAAI,mBAAmB,MAAM,MAAA,QAAc,MAAM;;CAItE,aAAgC,SAA+B;AAC7D,QAAM,aAAa,QAAQ;AAI3B,MAAI,KAAK,eAAe,CAAC,KAAK,KAC5B,OAAA,SAAe,MAAM;;CAIzB,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,oBAA0B;AAC1B,QAAA,gBAAsB;AACtB,QAAA,SAAe,SAAS;AACxB,QAAA,UAAgB;AAChB,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;CAGrB,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,QAAA,KAAW,SAAS,KAAK;AAGzB,MAAI,MAAA,WAAiB,QAAQ,IAAI,OAAO,EAAE;GACxC,MAAM,EAAE,QAAQ,oBAAoB,MAAA,QAAc,MAAM;AACxD,OAAI,KAAK,SAAS,gBAChB,KAAI,KAAK,KACP,OAAA,QAAc,MAAM;OAEpB,OAAA,QAAc,OAAO;;;CAM7B,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,MAAA,QAAe;EAGpB,MAAM,YAAY,MAAA,aAAmB;AACrC,QAAA,YAAkB,UAAU;EAG5B,MAAM,QAAQ,MAAA,QAAc,MAAM;AAClC,QAAA,KAAW,SAAS,MAAM;EAC1B,MAAM,QAAQ,MAAA,KAAW,UAAU;AAGnC,oBAAkB,MAAM,MAAA,KAAW,cAAc,MAAM,CAAC;AACxD,sBAAoB,MAAM,OAAO,iBAAiB;AAIlD,MAAI,MAAM,KACR,gBAAe,KAAK;MAEpB,gBAAe,KAAK;AAItB,MAAI,MAAA,eACF,aAAY,MAAA,gBAAsB,mBAAmB,KAAK,GAAG,CAAC;AAIhE,MAAI,CAAC,MAAM,MAAM;AACf,SAAA,oBAA0B;AAC1B;;EAIF,MAAM,UAAU;GAAE,MAAM,MAAM;GAAM,OAAO,MAAM;GAAO;AAExD,MAAI,2BAA2B,CAE7B,aACE,MACA,uBAAuB,KAAK,IAAI,SAAS,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,eAAe,CACrG;OACI;GAEL,MAAM,cAAc,MAAA,gBAAsB,uBAAuB;GACjE,MAAM,WAAW,qBAAqB,KAAK;GAC3C,MAAM,eAAe,SAAS,gBAAgB,uBAAuB;GACrE,MAAM,UAAU,eAAe,MAAM,eAAe;AACpD,eACE,MACA,uBAAuB,KAAK,IAAI,SAAS,aAAa,UAAU,cAAc,SAAS,eAAe,CACvG;;AAGH,QAAA,iBAAuB;;CAKzB,eAAmC;AACjC,MAAI,CAAC,KAAK,GAAI,QAAO;AAErB,SADa,KAAK,aAAa,CACnB,cAA2B,gBAAgB,KAAK,GAAG,IAAI;;CAGrE,aAAa,WAAqC;AAChD,MAAI,cAAc,MAAA,eAAsB;AAExC,QAAA,oBAA0B;AAC1B,QAAA,gBAAsB;AACtB,QAAA,iBAAuB;AACvB,QAAA,SAAe,kBAAkB,UAAU;AAE3C,MAAI,aAAa,MAAA,SAAe;AAC9B,SAAA,eAAqB,IAAI,iBAAiB;AAC1C,qBAAkB,WAAW,MAAA,QAAc,cAAc,EAAE,QAAQ,MAAA,aAAmB,QAAQ,CAAC;AAE/F,OAAI,eAAe,UAAU,EAAE;AAC7B,UAAA,YAAkB,UAAU;AAC5B,cAAU,OAAO,gBAAgB,MAAA,YAAkB,UAAU,EAAE,EAC7D,QAAQ,MAAA,aAAmB,QAC5B,CAAC;;;;CAKR,aAAa,WAAiC;AAC5C,OAAK,cAAc,UAAU,UAAU,IAAI;;CAG7C,kBAAwB;AACtB,MAAI,MAAA,eACF,OAAA,eAAqB,MAAM,eAAe,cAAc;AAG1D,QAAA,cAAoB,OAAO;AAC3B,QAAA,eAAqB;AACrB,QAAA,iBAAuB;;CAGzB,mBAAyB;AACvB,MAAI,2BAA2B,CAAE;EAEjC,MAAM,YAAY,MAAA;AAElB,MAAI,CAAC,UAAW;AAChB,MAAI,MAAA,iBAAuB,MAAA,oBAA0B,UAAW;AAEhE,QAAA,oBAA0B;AAC1B,QAAA,gBAAsB,IAAI,iBAAiB;AAC3C,QAAA,kBAAwB;EACxB,MAAM,EAAE,WAAW,MAAA;EAEnB,MAAM,mBAAmB;AACvB,wBAAqB,MAAA,cAAoB;AACzC,SAAA,gBAAsB,4BAA4B;AAChD,QAAI,OAAO,QAAS;AACpB,SAAK,eAAe;KACpB;;AAGJ,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM;GAAQ,CAAC;AACvF,SAAO,iBAAiB,UAAU,YAAY,EAAE,QAAQ,CAAC;AAEzD,MAAI,OAAO,mBAAmB,YAAY;AACxC,SAAA,iBAAuB,IAAI,qBAAqB;AAC9C,gBAAY;KACZ;AACF,SAAA,eAAqB,QAAQ,UAAU;AACvC,SAAA,eAAqB,QAAQ,KAAK;;AAGpC,cAAY;;CAGd,sBAA4B;AAC1B,QAAA,eAAqB,OAAO;AAC5B,QAAA,gBAAsB;AACtB,QAAA,kBAAwB;AACxB,uBAAqB,MAAA,cAAoB;AACzC,QAAA,gBAAsB;AACtB,QAAA,gBAAsB,YAAY;AAClC,QAAA,iBAAuB"}
1
+ {"version":3,"file":"tooltip-element.js","names":["#core","#groupConsumer","#position","#disconnect","#tooltip","#snapshot","#cleanupTrigger","#syncTrigger","#currentTrigger","#triggerAbort","#syncContent"],"sources":["../../../../src/ui/tooltip/tooltip-element.ts"],"sourcesContent":["import { type ButtonState, TooltipCore, TooltipCSSVars, TooltipDataAttrs, type TooltipInput } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createTooltip,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n resolveOffsets,\n type TooltipApi,\n type TooltipChangeDetails,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport type { State } from '@videojs/store';\nimport { SnapshotController } from '@videojs/store/html';\nimport { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\nimport { PositionController } from '../position-controller';\nimport { tooltipGroupContext } from './context';\n\ntype TriggerElement = HTMLElement & {\n getLabel(): string | undefined;\n $state: State<ButtonState>;\n};\n\nfunction isLabelTrigger(el: HTMLElement): el is TriggerElement {\n return '$state' in el;\n}\n\nexport class TooltipElement extends MediaElement {\n static readonly tagName = 'media-tooltip';\n\n static override properties = {\n open: { type: Boolean },\n defaultOpen: { type: Boolean, attribute: 'default-open' },\n side: { type: String },\n align: { type: String },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n disableHoverablePopup: { type: Boolean, attribute: 'disable-hoverable-popup' },\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<keyof TooltipCore.Props>;\n\n open = TooltipCore.defaultProps.open;\n defaultOpen = TooltipCore.defaultProps.defaultOpen;\n side = TooltipCore.defaultProps.side;\n align = TooltipCore.defaultProps.align;\n delay = TooltipCore.defaultProps.delay;\n closeDelay = TooltipCore.defaultProps.closeDelay;\n disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;\n disabled = TooltipCore.defaultProps.disabled;\n\n readonly #core = new TooltipCore();\n readonly #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });\n readonly #position = new PositionController(this);\n #tooltip: TooltipApi | null = null;\n #snapshot: SnapshotController<TooltipInput> | null = null;\n\n // Cleanup controllers\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #currentTrigger: HTMLElement | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n\n this.#tooltip = createTooltip({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: TooltipChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n disableHoverablePopup: () => this.disableHoverablePopup,\n disabled: () => this.disabled,\n // Lazy getter — group may arrive after connect via context.\n group: () => this.#groupConsumer.value,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#tooltip.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#tooltip.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n if (this.#snapshot) {\n this.#snapshot.track(this.#tooltip.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#tooltip.input);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n\n // Uncontrolled mode: open if `defaultOpen` is set. Controlled `open`\n // is already synced by `willUpdate` on the first render cycle.\n if (this.defaultOpen && !this.open) {\n this.#tooltip?.open();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#cleanupTrigger();\n this.#tooltip?.destroy();\n this.#tooltip = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.#core.setProps(this);\n\n // Sync controlled open state\n if (this.#tooltip && changed.has('open')) {\n const { active: interactionOpen } = this.#tooltip.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#tooltip.open();\n } else {\n this.#tooltip.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#tooltip) return;\n\n // Discover trigger via commandfor linkage.\n const triggerEl = this.#position.findTrigger();\n this.#syncTrigger(triggerEl);\n\n // Derive state from core + input.\n const input = this.#tooltip.input.current;\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n // Apply popup ARIA and data attributes to self.\n applyElementProps(this, this.#core.getPopupAttrs(state));\n applyStateDataAttrs(this, state, TooltipDataAttrs);\n\n // Show/hide via Popover API AFTER data attributes are applied so\n // `data-starting-style` is present before the first visible frame.\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n // Apply anchor-name to the discovered trigger for CSS positioning.\n if (this.#currentTrigger) {\n applyStyles(this.#currentTrigger, getAnchorNameStyle(this.id));\n }\n\n // Skip positioning when closed — no rects to measure.\n if (!state.open) {\n this.#position.cleanup();\n return;\n }\n\n // Apply positioning styles to self.\n const posOpts = { side: state.side, align: state.align };\n\n if (supportsAnchorPositioning()) {\n // Native CSS Anchor Positioning — no JS rect measurements needed.\n applyStyles(\n this,\n getAnchorPositionStyle(this.id, posOpts, undefined, undefined, undefined, undefined, TooltipCSSVars)\n );\n } else {\n // JS fallback: measure rects and resolve CSS var offsets.\n const triggerRect = this.#currentTrigger?.getBoundingClientRect();\n const selfRect = getPopupPositionRect(this);\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(this, TooltipCSSVars);\n applyStyles(\n this,\n getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets, TooltipCSSVars)\n );\n }\n\n this.#position.sync(this.#currentTrigger);\n }\n\n // --- Trigger management ---\n\n #syncTrigger(triggerEl: HTMLElement | null): void {\n if (triggerEl === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerEl;\n this.#tooltip?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#tooltip) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#tooltip.triggerProps, { signal: this.#triggerAbort.signal });\n\n if (isLabelTrigger(triggerEl)) {\n this.#syncContent(triggerEl);\n triggerEl.$state.subscribe(() => this.#syncContent(triggerEl), {\n signal: this.#triggerAbort.signal,\n });\n }\n }\n }\n\n #syncContent(triggerEl: TriggerElement): void {\n this.textContent = triggerEl.getLabel() ?? '';\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n this.#currentTrigger.style.removeProperty('anchor-name');\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n"],"mappings":";;;;;;;;;AA4BA,SAAS,eAAe,IAAuC;AAC7D,QAAO,YAAY;;AAGrB,IAAa,iBAAb,cAAoC,aAAa;;;cAcxC,YAAY,aAAa;qBAClB,YAAY,aAAa;cAChC,YAAY,aAAa;eACxB,YAAY,aAAa;eACzB,YAAY,aAAa;oBACpB,YAAY,aAAa;+BACd,YAAY,aAAa;kBACtC,YAAY,aAAa;;;iBApBV;;;oBAEG;GAC3B,MAAM,EAAE,MAAM,SAAS;GACvB,aAAa;IAAE,MAAM;IAAS,WAAW;IAAgB;GACzD,MAAM,EAAE,MAAM,QAAQ;GACtB,OAAO,EAAE,MAAM,QAAQ;GACvB,OAAO,EAAE,MAAM,QAAQ;GACvB,YAAY;IAAE,MAAM;IAAQ,WAAW;IAAe;GACtD,uBAAuB;IAAE,MAAM;IAAS,WAAW;IAA2B;GAC9E,UAAU,EAAE,MAAM,SAAS;GAC5B;;CAWD,QAAiB,IAAI,aAAa;CAClC,iBAA0B,IAAI,gBAAgB,MAAM,EAAE,SAAS,qBAAqB,CAAC;CACrF,YAAqB,IAAI,mBAAmB,KAAK;CACjD,WAA8B;CAC9B,YAAqD;CAGrD,cAAsC;CACtC,gBAAwC;CACxC,kBAAsC;CAEtC,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,MAAI,KAAK,UAAW;AAEpB,QAAA,aAAmB,IAAI,iBAAiB;AAExC,QAAA,UAAgB,cAAc;GAC5B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI,YAAY,eAAe,EAAE,QAAQ;KAAE,MAAM;KAAU,GAAG;KAAS,EAAE,CAAC,CAAC;;GAEhG,aAAa,KAAK;GAClB,kBAAkB,KAAK;GACvB,6BAA6B,KAAK;GAClC,gBAAgB,KAAK;GAErB,aAAa,MAAA,cAAoB;GAClC,CAAC;AAGF,QAAA,QAAc,gBAAgB,KAAK;AAGnC,oBAAkB,MAAM,MAAA,QAAc,YAAY,EAAE,QAAQ,MAAA,WAAiB,QAAQ,CAAC;AAGtF,MAAI,MAAA,SACF,OAAA,SAAe,MAAM,MAAA,QAAc,MAAM;MAEzC,OAAA,WAAiB,IAAI,mBAAmB,MAAM,MAAA,QAAc,MAAM;;CAItE,aAAgC,SAA+B;AAC7D,QAAM,aAAa,QAAQ;AAI3B,MAAI,KAAK,eAAe,CAAC,KAAK,KAC5B,OAAA,SAAe,MAAM;;CAIzB,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,gBAAsB;AACtB,QAAA,SAAe,SAAS;AACxB,QAAA,UAAgB;AAChB,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;CAGrB,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,QAAA,KAAW,SAAS,KAAK;AAGzB,MAAI,MAAA,WAAiB,QAAQ,IAAI,OAAO,EAAE;GACxC,MAAM,EAAE,QAAQ,oBAAoB,MAAA,QAAc,MAAM;AACxD,OAAI,KAAK,SAAS,gBAChB,KAAI,KAAK,KACP,OAAA,QAAc,MAAM;OAEpB,OAAA,QAAc,OAAO;;;CAM7B,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,MAAA,QAAe;EAGpB,MAAM,YAAY,MAAA,SAAe,aAAa;AAC9C,QAAA,YAAkB,UAAU;EAG5B,MAAM,QAAQ,MAAA,QAAc,MAAM;AAClC,QAAA,KAAW,SAAS,MAAM;EAC1B,MAAM,QAAQ,MAAA,KAAW,UAAU;AAGnC,oBAAkB,MAAM,MAAA,KAAW,cAAc,MAAM,CAAC;AACxD,sBAAoB,MAAM,OAAO,iBAAiB;AAIlD,MAAI,MAAM,KACR,gBAAe,KAAK;MAEpB,gBAAe,KAAK;AAItB,MAAI,MAAA,eACF,aAAY,MAAA,gBAAsB,mBAAmB,KAAK,GAAG,CAAC;AAIhE,MAAI,CAAC,MAAM,MAAM;AACf,SAAA,SAAe,SAAS;AACxB;;EAIF,MAAM,UAAU;GAAE,MAAM,MAAM;GAAM,OAAO,MAAM;GAAO;AAExD,MAAI,2BAA2B,CAE7B,aACE,MACA,uBAAuB,KAAK,IAAI,SAAS,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,eAAe,CACrG;OACI;GAEL,MAAM,cAAc,MAAA,gBAAsB,uBAAuB;GACjE,MAAM,WAAW,qBAAqB,KAAK;GAC3C,MAAM,eAAe,SAAS,gBAAgB,uBAAuB;GACrE,MAAM,UAAU,eAAe,MAAM,eAAe;AACpD,eACE,MACA,uBAAuB,KAAK,IAAI,SAAS,aAAa,UAAU,cAAc,SAAS,eAAe,CACvG;;AAGH,QAAA,SAAe,KAAK,MAAA,eAAqB;;CAK3C,aAAa,WAAqC;AAChD,MAAI,cAAc,MAAA,eAAsB;AAExC,QAAA,SAAe,SAAS;AACxB,QAAA,gBAAsB;AACtB,QAAA,iBAAuB;AACvB,QAAA,SAAe,kBAAkB,UAAU;AAE3C,MAAI,aAAa,MAAA,SAAe;AAC9B,SAAA,eAAqB,IAAI,iBAAiB;AAC1C,qBAAkB,WAAW,MAAA,QAAc,cAAc,EAAE,QAAQ,MAAA,aAAmB,QAAQ,CAAC;AAE/F,OAAI,eAAe,UAAU,EAAE;AAC7B,UAAA,YAAkB,UAAU;AAC5B,cAAU,OAAO,gBAAgB,MAAA,YAAkB,UAAU,EAAE,EAC7D,QAAQ,MAAA,aAAmB,QAC5B,CAAC;;;;CAKR,aAAa,WAAiC;AAC5C,OAAK,cAAc,UAAU,UAAU,IAAI;;CAG7C,kBAAwB;AACtB,MAAI,MAAA,eACF,OAAA,eAAqB,MAAM,eAAe,cAAc;AAG1D,QAAA,cAAoB,OAAO;AAC3B,QAAA,eAAqB;AACrB,QAAA,iBAAuB"}
@@ -4,8 +4,8 @@ import { PlayerController } from "../../player/player-controller.js";
4
4
  import { sliderContext } from "../slider/context.js";
5
5
  import { VolumeSliderCore, VolumeSliderDataAttrs } from "@videojs/core";
6
6
  import { applyElementProps, applyStateDataAttrs, createSlider, createWheelStep, getSliderCSSVars, logMissingFeature, selectVolume } from "@videojs/core/dom";
7
- import { ContextProvider } from "@videojs/element/context";
8
7
  import { applyStyles, isRTL } from "@videojs/utils/dom";
8
+ import { ContextProvider } from "@videojs/element/context";
9
9
  //#region src/ui/volume-slider/volume-slider-element.ts
10
10
  var VolumeSliderElement = class extends MediaElement {
11
11
  constructor(..._args) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@videojs/html",
3
3
  "type": "module",
4
- "version": "10.0.0-beta.14",
4
+ "version": "10.0.0-beta.16",
5
5
  "description": "HTML library for building media players",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -92,11 +92,11 @@
92
92
  }
93
93
  },
94
94
  "dependencies": {
95
- "@videojs/core": "10.0.0-beta.14",
96
- "@videojs/element": "10.0.0-beta.14",
97
- "@videojs/spf": "10.0.0-beta.14",
98
- "@videojs/store": "10.0.0-beta.14",
99
- "@videojs/utils": "10.0.0-beta.14"
95
+ "@videojs/core": "10.0.0-beta.16",
96
+ "@videojs/element": "10.0.0-beta.16",
97
+ "@videojs/store": "10.0.0-beta.16",
98
+ "@videojs/spf": "10.0.0-beta.16",
99
+ "@videojs/utils": "10.0.0-beta.16"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@testing-library/dom": "^10.4.0",
@@ -104,8 +104,8 @@
104
104
  "tsdown": "^0.21.4",
105
105
  "typescript": "^6.0.2",
106
106
  "vitest": "^4.1.0",
107
- "@videojs/icons": "10.0.0-beta.14",
108
- "@videojs/skins": "10.0.0-beta.14"
107
+ "@videojs/icons": "10.0.0-beta.16",
108
+ "@videojs/skins": "10.0.0-beta.16"
109
109
  },
110
110
  "publishConfig": {
111
111
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-BjrbhiSk.js","names":["#target","#types","#forwardEvent"],"sources":["../src/define/safe-define.ts","../../core/dist/dev/core/utils/define-class-prop-hooks.js","../../core/dist/dev/core/media/proxy.js","../../core/dist/dev/dom/media/proxy.js","../../../node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/development/lib/context-request-event.js","../../../node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/development/lib/create-context.js","../src/player/context.ts"],"sourcesContent":["type DefinableElement = CustomElementConstructor & { tagName: string };\n\n/** Define a custom element only if not already registered. */\nexport function safeDefine(element: DefinableElement): void {\n const registry = globalThis.customElements;\n if (!registry || registry.get(element.tagName)) return;\n\n registry.define(element.tagName, element);\n}\n","//#region src/core/utils/define-class-prop-hooks.ts\nfunction defineClassPropHooks(Class, BaseClassProto) {\n\tfor (const prop of Object.getOwnPropertyNames(BaseClassProto)) {\n\t\tif (prop in Class.prototype || prop.startsWith(\"_\")) continue;\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(BaseClassProto, prop);\n\t\tif (!descriptor) continue;\n\t\tconst config = {};\n\t\tif (typeof descriptor.value === \"function\") config.value = function(...args) {\n\t\t\treturn this.call?.(prop, ...args);\n\t\t};\n\t\telse if (descriptor.get) {\n\t\t\tconfig.get = function() {\n\t\t\t\treturn this.get?.(prop);\n\t\t\t};\n\t\t\tif (descriptor.set) config.set = function(val) {\n\t\t\t\tthis.set?.(prop, val);\n\t\t\t};\n\t\t}\n\t\tObject.defineProperty(Class.prototype, prop, config);\n\t}\n}\n//#endregion\nexport { defineClassPropHooks };\n\n//# sourceMappingURL=define-class-prop-hooks.js.map","import { defineClassPropHooks } from \"../utils/define-class-prop-hooks.js\";\n//#region src/core/media/proxy.ts\n/**\n* This mixin creates an API from the passed classes and proxies the methods and properties to the attached target.\n*\n* Many methods and properties will need no translation and are proxied directly to the attached target.\n* For example, the `play` and `pause` methods are proxied directly to the attached target.\n*\n* Child classes can override the proxied methods and properties to provide custom behavior.\n* For example, the `src` property for HLS media is proxied to the HLS engine, not the target itself.\n*\n* The `get`, `set`, and `call` methods can be overridden to provide catch-all custom behavior.\n*/\nconst ProxyMixin = (BaseClass) => {\n\tclass MediaProxyImpl extends EventTarget {\n\t\t#target = null;\n\t\t#types = /* @__PURE__ */ new Set();\n\t\tget target() {\n\t\t\treturn this.#target;\n\t\t}\n\t\tget(prop) {\n\t\t\treturn this.target?.[prop];\n\t\t}\n\t\tset(prop, val) {\n\t\t\tif (this.target) this.target[prop] = val;\n\t\t}\n\t\tcall(prop, ...args) {\n\t\t\treturn (this.target?.[prop])?.apply(this.target, args);\n\t\t}\n\t\tattach(target) {\n\t\t\tif (!target || this.#target === target) return;\n\t\t\tthis.#target = target;\n\t\t\tfor (const type of this.#types) target.addEventListener(type, this.#forwardEvent);\n\t\t}\n\t\tdetach() {\n\t\t\tif (!this.#target) return;\n\t\t\tfor (const type of this.#types) this.#target.removeEventListener(type, this.#forwardEvent);\n\t\t\tthis.#target = null;\n\t\t}\n\t\taddEventListener(type, listener, options) {\n\t\t\tif (!this.#types.has(type)) {\n\t\t\t\tthis.#types.add(type);\n\t\t\t\tthis.#target?.addEventListener(type, this.#forwardEvent);\n\t\t\t}\n\t\t\tsuper.addEventListener(type, listener, options);\n\t\t}\n\t\t#forwardEvent = (event) => {\n\t\t\tthis.dispatchEvent(new event.constructor(event.type, event));\n\t\t};\n\t}\n\tfor (let proto = BaseClass.prototype; proto && !Object.prototype.isPrototypeOf.call(proto, MediaProxyImpl.prototype); proto = Object.getPrototypeOf(proto)) defineClassPropHooks(MediaProxyImpl, proto);\n\treturn MediaProxyImpl;\n};\n//#endregion\nexport { ProxyMixin };\n\n//# sourceMappingURL=proxy.js.map","import { ProxyMixin } from \"../../core/media/proxy.js\";\n//#region src/dom/media/proxy.ts\nconst VideoProxy = ProxyMixin(globalThis.HTMLVideoElement ?? class {});\n//#endregion\nexport { VideoProxy };\n\n//# sourceMappingURL=proxy.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * An event fired by a context requester to signal it desires a specified context with the given key.\n *\n * A provider should inspect the `context` property of the event to determine if it has a value that can\n * satisfy the request, calling the `callback` with the requested value if so.\n *\n * If the requested context event contains a truthy `subscribe` value, then a provider can call the callback\n * multiple times if the value is changed, if this is the case the provider should pass an `unsubscribe`\n * method to the callback which consumers can invoke to indicate they no longer wish to receive these updates.\n *\n * If no `subscribe` value is present in the event, then the provider can assume that this is a 'one time'\n * request for the context and can therefore not track the consumer.\n */\nexport class ContextRequestEvent extends Event {\n /**\n *\n * @param context the context key to request\n * @param contextTarget the original context target of the requester\n * @param callback the callback that should be invoked when the context with the specified key is available\n * @param subscribe when, true indicates we want to subscribe to future updates\n */\n constructor(context, contextTarget, callback, subscribe) {\n super('context-request', { bubbles: true, composed: true });\n this.context = context;\n this.contextTarget = contextTarget;\n this.callback = callback;\n this.subscribe = subscribe ?? false;\n }\n}\n//# sourceMappingURL=context-request-event.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/**\n * Creates a typed Context.\n *\n * Contexts are compared with strict equality.\n *\n * If you want two separate `createContext()` calls to referer to the same\n * context, then use a key that will by equal under strict equality like a\n * string for `Symbol.for()`:\n *\n * ```ts\n * // true\n * createContext('my-context') === createContext('my-context')\n * // true\n * createContext(Symbol.for('my-context')) === createContext(Symbol.for('my-context'))\n * ```\n *\n * If you want a context to be unique so that it's guaranteed to not collide\n * with other contexts, use a key that's unique under strict equality, like\n * a `Symbol()` or object.:\n *\n * ```\n * // false\n * createContext({}) === createContext({})\n * // false\n * createContext(Symbol('my-context')) === createContext(Symbol('my-context'))\n * ```\n *\n * @param key a context key value\n * @template ValueType the type of value that can be provided by this context.\n * @returns the context key value cast to `Context<K, ValueType>`\n */\nexport function createContext(key) {\n return key;\n}\n//# sourceMappingURL=create-context.js.map","import type { AnyPlayerStore, Media, MediaContainer, PlayerStore } from '@videojs/core/dom';\nimport { type Context, createContext } from '@videojs/element/context';\n\n// ----------------------------------------\n// Player Context\n// ----------------------------------------\n\nexport const PLAYER_CONTEXT_KEY = Symbol.for('@videojs/player');\n\nexport type PlayerContextValue<Store extends PlayerStore = AnyPlayerStore> = Store;\n\nexport type PlayerContext<Store extends PlayerStore = AnyPlayerStore> = Context<\n typeof PLAYER_CONTEXT_KEY,\n PlayerContextValue<Store>\n>;\n\n/**\n * The default player context instance for consuming the player store in controllers.\n *\n * @public\n */\nexport const playerContext = createContext<PlayerContextValue, typeof PLAYER_CONTEXT_KEY>(PLAYER_CONTEXT_KEY);\n\n// ----------------------------------------\n// Media Context\n// ----------------------------------------\n\nexport const MEDIA_CONTEXT_KEY = Symbol.for('@videojs/media');\n\nexport interface MediaContextValue {\n media: Media | null;\n setMedia: (media: Media | null) => void;\n}\n\nexport type MediaContext = Context<typeof MEDIA_CONTEXT_KEY, MediaContextValue>;\n\nexport const mediaContext = createContext<MediaContextValue, typeof MEDIA_CONTEXT_KEY>(MEDIA_CONTEXT_KEY);\n\n// ----------------------------------------\n// Container Context\n// ----------------------------------------\n\nexport const CONTAINER_CONTEXT_KEY = Symbol.for('@videojs/container');\n\nexport interface ContainerContextValue {\n container: MediaContainer | null;\n setContainer: (container: MediaContainer | null) => void;\n}\n\nexport type ContainerContext = Context<typeof CONTAINER_CONTEXT_KEY, ContainerContextValue>;\n\nexport const containerContext = createContext<ContainerContextValue, typeof CONTAINER_CONTEXT_KEY>(\n CONTAINER_CONTEXT_KEY\n);\n"],"x_google_ignoreList":[4,5],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- function e(e){let t=globalThis.customElements;!t||t.get(e.tagName)||t.define(e.tagName,e)}function t(e,t){for(let n of Object.getOwnPropertyNames(t)){if(n in e.prototype||n.startsWith(`_`))continue;let r=Object.getOwnPropertyDescriptor(t,n);if(!r)continue;let i={};typeof r.value==`function`?i.value=function(...e){return this.call?.(n,...e)}:r.get&&(i.get=function(){return this.get?.(n)},r.set&&(i.set=function(e){this.set?.(n,e)})),Object.defineProperty(e.prototype,n,i)}}(e=>{class n extends EventTarget{#e=null;#t=new Set;get target(){return this.#e}get(e){return this.target?.[e]}set(e,t){this.target&&(this.target[e]=t)}call(e,...t){return(this.target?.[e])?.apply(this.target,t)}attach(e){if(!(!e||this.#e===e)){this.#e=e;for(let t of this.#t)e.addEventListener(t,this.#n)}}detach(){if(this.#e){for(let e of this.#t)this.#e.removeEventListener(e,this.#n);this.#e=null}}addEventListener(e,t,n){this.#t.has(e)||(this.#t.add(e),this.#e?.addEventListener(e,this.#n)),super.addEventListener(e,t,n)}#n=e=>{this.dispatchEvent(new e.constructor(e.type,e))}}for(let r=e.prototype;r&&!Object.prototype.isPrototypeOf.call(r,n.prototype);r=Object.getPrototypeOf(r))t(n,r);return n})(globalThis.HTMLVideoElement??class{});
2
- /**
3
- * @license
4
- * Copyright 2021 Google LLC
5
- * SPDX-License-Identifier: BSD-3-Clause
6
- */
7
- var n=class extends Event{constructor(e,t,n,r){super(`context-request`,{bubbles:!0,composed:!0}),this.context=e,this.contextTarget=t,this.callback=n,this.subscribe=r??!1}};
8
- /**
9
- * @license
10
- * Copyright 2021 Google LLC
11
- * SPDX-License-Identifier: BSD-3-Clause
12
- */
13
- function r(e){return e}const i=r(Symbol.for(`@videojs/player`)),a=r(Symbol.for(`@videojs/media`)),o=r(Symbol.for(`@videojs/container`));export{n as a,r as i,a as n,t as o,i as r,e as s,o as t};
14
- //# sourceMappingURL=context-CdkhXQEw.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-CdkhXQEw.js","names":["#target","#types","#forwardEvent","createContext"],"sources":["../src/define/safe-define.ts","../../core/dist/default/core/utils/define-class-prop-hooks.js","../../core/dist/default/core/media/proxy.js","../../core/dist/default/dom/media/proxy.js","../../../node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/context-request-event.js","../../../node_modules/.pnpm/@lit+context@1.1.6/node_modules/@lit/context/lib/create-context.js","../src/player/context.ts"],"sourcesContent":["type DefinableElement = CustomElementConstructor & { tagName: string };\n\n/** Define a custom element only if not already registered. */\nexport function safeDefine(element: DefinableElement): void {\n const registry = globalThis.customElements;\n if (!registry || registry.get(element.tagName)) return;\n\n registry.define(element.tagName, element);\n}\n","//#region src/core/utils/define-class-prop-hooks.ts\nfunction defineClassPropHooks(Class, BaseClassProto) {\n\tfor (const prop of Object.getOwnPropertyNames(BaseClassProto)) {\n\t\tif (prop in Class.prototype || prop.startsWith(\"_\")) continue;\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(BaseClassProto, prop);\n\t\tif (!descriptor) continue;\n\t\tconst config = {};\n\t\tif (typeof descriptor.value === \"function\") config.value = function(...args) {\n\t\t\treturn this.call?.(prop, ...args);\n\t\t};\n\t\telse if (descriptor.get) {\n\t\t\tconfig.get = function() {\n\t\t\t\treturn this.get?.(prop);\n\t\t\t};\n\t\t\tif (descriptor.set) config.set = function(val) {\n\t\t\t\tthis.set?.(prop, val);\n\t\t\t};\n\t\t}\n\t\tObject.defineProperty(Class.prototype, prop, config);\n\t}\n}\n//#endregion\nexport { defineClassPropHooks };\n\n//# sourceMappingURL=define-class-prop-hooks.js.map","import { defineClassPropHooks } from \"../utils/define-class-prop-hooks.js\";\n//#region src/core/media/proxy.ts\n/**\n* This mixin creates an API from the passed classes and proxies the methods and properties to the attached target.\n*\n* Many methods and properties will need no translation and are proxied directly to the attached target.\n* For example, the `play` and `pause` methods are proxied directly to the attached target.\n*\n* Child classes can override the proxied methods and properties to provide custom behavior.\n* For example, the `src` property for HLS media is proxied to the HLS engine, not the target itself.\n*\n* The `get`, `set`, and `call` methods can be overridden to provide catch-all custom behavior.\n*/\nconst ProxyMixin = (BaseClass) => {\n\tclass MediaProxyImpl extends EventTarget {\n\t\t#target = null;\n\t\t#types = /* @__PURE__ */ new Set();\n\t\tget target() {\n\t\t\treturn this.#target;\n\t\t}\n\t\tget(prop) {\n\t\t\treturn this.target?.[prop];\n\t\t}\n\t\tset(prop, val) {\n\t\t\tif (this.target) this.target[prop] = val;\n\t\t}\n\t\tcall(prop, ...args) {\n\t\t\treturn (this.target?.[prop])?.apply(this.target, args);\n\t\t}\n\t\tattach(target) {\n\t\t\tif (!target || this.#target === target) return;\n\t\t\tthis.#target = target;\n\t\t\tfor (const type of this.#types) target.addEventListener(type, this.#forwardEvent);\n\t\t}\n\t\tdetach() {\n\t\t\tif (!this.#target) return;\n\t\t\tfor (const type of this.#types) this.#target.removeEventListener(type, this.#forwardEvent);\n\t\t\tthis.#target = null;\n\t\t}\n\t\taddEventListener(type, listener, options) {\n\t\t\tif (!this.#types.has(type)) {\n\t\t\t\tthis.#types.add(type);\n\t\t\t\tthis.#target?.addEventListener(type, this.#forwardEvent);\n\t\t\t}\n\t\t\tsuper.addEventListener(type, listener, options);\n\t\t}\n\t\t#forwardEvent = (event) => {\n\t\t\tthis.dispatchEvent(new event.constructor(event.type, event));\n\t\t};\n\t}\n\tfor (let proto = BaseClass.prototype; proto && !Object.prototype.isPrototypeOf.call(proto, MediaProxyImpl.prototype); proto = Object.getPrototypeOf(proto)) defineClassPropHooks(MediaProxyImpl, proto);\n\treturn MediaProxyImpl;\n};\n//#endregion\nexport { ProxyMixin };\n\n//# sourceMappingURL=proxy.js.map","import { ProxyMixin } from \"../../core/media/proxy.js\";\n//#region src/dom/media/proxy.ts\nconst VideoProxy = ProxyMixin(globalThis.HTMLVideoElement ?? class {});\n//#endregion\nexport { VideoProxy };\n\n//# sourceMappingURL=proxy.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s extends Event{constructor(s,t,e,o){super(\"context-request\",{bubbles:!0,composed:!0}),this.context=s,this.contextTarget=t,this.callback=e,this.subscribe=o??!1}}export{s as ContextRequestEvent};\n//# sourceMappingURL=context-request-event.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nfunction n(n){return n}export{n as createContext};\n//# sourceMappingURL=create-context.js.map\n","import type { AnyPlayerStore, Media, MediaContainer, PlayerStore } from '@videojs/core/dom';\nimport { type Context, createContext } from '@videojs/element/context';\n\n// ----------------------------------------\n// Player Context\n// ----------------------------------------\n\nexport const PLAYER_CONTEXT_KEY = Symbol.for('@videojs/player');\n\nexport type PlayerContextValue<Store extends PlayerStore = AnyPlayerStore> = Store;\n\nexport type PlayerContext<Store extends PlayerStore = AnyPlayerStore> = Context<\n typeof PLAYER_CONTEXT_KEY,\n PlayerContextValue<Store>\n>;\n\n/**\n * The default player context instance for consuming the player store in controllers.\n *\n * @public\n */\nexport const playerContext = createContext<PlayerContextValue, typeof PLAYER_CONTEXT_KEY>(PLAYER_CONTEXT_KEY);\n\n// ----------------------------------------\n// Media Context\n// ----------------------------------------\n\nexport const MEDIA_CONTEXT_KEY = Symbol.for('@videojs/media');\n\nexport interface MediaContextValue {\n media: Media | null;\n setMedia: (media: Media | null) => void;\n}\n\nexport type MediaContext = Context<typeof MEDIA_CONTEXT_KEY, MediaContextValue>;\n\nexport const mediaContext = createContext<MediaContextValue, typeof MEDIA_CONTEXT_KEY>(MEDIA_CONTEXT_KEY);\n\n// ----------------------------------------\n// Container Context\n// ----------------------------------------\n\nexport const CONTAINER_CONTEXT_KEY = Symbol.for('@videojs/container');\n\nexport interface ContainerContextValue {\n container: MediaContainer | null;\n setContainer: (container: MediaContainer | null) => void;\n}\n\nexport type ContainerContext = Context<typeof CONTAINER_CONTEXT_KEY, ContainerContextValue>;\n\nexport const containerContext = createContext<ContainerContextValue, typeof CONTAINER_CONTEXT_KEY>(\n CONTAINER_CONTEXT_KEY\n);\n"],"x_google_ignoreList":[4,5],"mappings":"AAGA,SAAgB,EAAW,EAAiC,CAC1D,IAAM,EAAW,WAAW,eACxB,CAAC,GAAY,EAAS,IAAI,EAAQ,QAAQ,EAE9C,EAAS,OAAO,EAAQ,QAAS,EAAQ,CCN3C,SAAS,EAAqB,EAAO,EAAgB,CACpD,IAAK,IAAM,KAAQ,OAAO,oBAAoB,EAAe,CAAE,CAC9D,GAAI,KAAQ,EAAM,WAAa,EAAK,WAAW,IAAI,CAAE,SACrD,IAAM,EAAa,OAAO,yBAAyB,EAAgB,EAAK,CACxE,GAAI,CAAC,EAAY,SACjB,IAAM,EAAS,EAAE,CACb,OAAO,EAAW,OAAU,WAAY,EAAO,MAAQ,SAAS,GAAG,EAAM,CAC5E,OAAO,KAAK,OAAO,EAAM,GAAG,EAAK,EAEzB,EAAW,MACnB,EAAO,IAAM,UAAW,CACvB,OAAO,KAAK,MAAM,EAAK,EAEpB,EAAW,MAAK,EAAO,IAAM,SAAS,EAAK,CAC9C,KAAK,MAAM,EAAM,EAAI,IAGvB,OAAO,eAAe,EAAM,UAAW,EAAM,EAAO,GCLlC,GAAc,CACjC,MAAM,UAAuB,WAAY,CACxC,GAAU,KACV,GAAyB,IAAI,IAC7B,IAAI,QAAS,CACZ,OAAO,MAAA,EAER,IAAI,EAAM,CACT,OAAO,KAAK,SAAS,GAEtB,IAAI,EAAM,EAAK,CACV,KAAK,SAAQ,KAAK,OAAO,GAAQ,GAEtC,KAAK,EAAM,GAAG,EAAM,CACnB,OAAQ,KAAK,SAAS,KAAQ,MAAM,KAAK,OAAQ,EAAK,CAEvD,OAAO,EAAQ,CACV,MAAC,GAAU,MAAA,IAAiB,GAChC,OAAA,EAAe,EACf,IAAK,IAAM,KAAQ,MAAA,EAAa,EAAO,iBAAiB,EAAM,MAAA,EAAmB,EAElF,QAAS,CACH,SAAA,EACL,KAAK,IAAM,KAAQ,MAAA,EAAa,MAAA,EAAa,oBAAoB,EAAM,MAAA,EAAmB,CAC1F,MAAA,EAAe,MAEhB,iBAAiB,EAAM,EAAU,EAAS,CACpC,MAAA,EAAY,IAAI,EAAK,GACzB,MAAA,EAAY,IAAI,EAAK,CACrB,MAAA,GAAc,iBAAiB,EAAM,MAAA,EAAmB,EAEzD,MAAM,iBAAiB,EAAM,EAAU,EAAQ,CAEhD,GAAiB,GAAU,CAC1B,KAAK,cAAc,IAAI,EAAM,YAAY,EAAM,KAAM,EAAM,CAAC,EAG9D,IAAK,IAAI,EAAQ,EAAU,UAAW,GAAS,CAAC,OAAO,UAAU,cAAc,KAAK,EAAO,EAAe,UAAU,CAAE,EAAQ,OAAO,eAAe,EAAM,CAAE,EAAqB,EAAgB,EAAM,CACvM,OAAO,ICjDsB,WAAW,kBAAoB,KAAM,GAAG;;;;;;ACGtE,IAAM,EAAN,cAAgB,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,GAAG,CAAC;;;;;;ACApK,SAAS,EAAE,EAAE,CAAC,OAAO,ECgBrB,MAAa,EAAgBG,EAdK,OAAO,IAAI,kBAAkB,CAc8C,CAehG,EAAeA,EATK,OAAO,IAAI,iBAAiB,CAS4C,CAe5F,EAAmBA,EATK,OAAO,IAAI,qBAAqB,CAWpE"}