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

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 (436) hide show
  1. package/cdn/{abort-C9UiBdVU.js → abort-0nUH9HXc.js} +1 -1
  2. package/cdn/{abort-C9UiBdVU.js.map → abort-0nUH9HXc.js.map} +1 -1
  3. package/cdn/{abort-DsTff8mS.js → abort-DQxwCs92.js} +1 -1
  4. package/cdn/{abort-DsTff8mS.js.map → abort-DQxwCs92.js.map} +1 -1
  5. package/cdn/audio-minimal-ui.dev.js +1 -4
  6. package/cdn/audio-minimal-ui.js +1 -1
  7. package/cdn/audio-minimal.dev.js +5 -7
  8. package/cdn/audio-minimal.dev.js.map +1 -1
  9. package/cdn/audio-minimal.js +1 -1
  10. package/cdn/audio-minimal.js.map +1 -1
  11. package/cdn/audio-ui.dev.js +1 -4
  12. package/cdn/audio-ui.js +1 -1
  13. package/cdn/audio.dev.js +4 -6
  14. package/cdn/audio.dev.js.map +1 -1
  15. package/cdn/audio.js +1 -1
  16. package/cdn/audio.js.map +1 -1
  17. package/cdn/background.dev.js +3 -3
  18. package/cdn/background.js +1 -1
  19. package/cdn/background.js.map +1 -1
  20. package/cdn/{compounds-DD3MYkSc.js → compounds-BHHGcL_P.js} +146 -64
  21. package/cdn/compounds-BHHGcL_P.js.map +1 -0
  22. package/cdn/compounds-DJyzXLOB.js +8 -0
  23. package/cdn/compounds-DJyzXLOB.js.map +1 -0
  24. package/cdn/{create-player-BKLw7l1a.js → create-player-B-gVAMdr.js} +200 -175
  25. package/cdn/create-player-B-gVAMdr.js.map +1 -0
  26. package/cdn/create-player-C5ui1T2i.js +7 -0
  27. package/cdn/create-player-C5ui1T2i.js.map +1 -0
  28. package/cdn/hls-DEP0AzDp.js +41 -0
  29. package/cdn/hls-DEP0AzDp.js.map +1 -0
  30. package/cdn/{hls-CcSAx_3I.js → hls-DR-Xxpxv.js} +161 -21
  31. package/cdn/hls-DR-Xxpxv.js.map +1 -0
  32. package/cdn/hotkey-element-BvI78DTc.js +2 -0
  33. package/cdn/{hotkey-element-DWWkfH3A.js.map → hotkey-element-BvI78DTc.js.map} +1 -1
  34. package/cdn/{hotkey-element-BONs_FyJ.js → hotkey-element-oEdY8YLl.js} +24 -18
  35. package/cdn/{hotkey-element-BONs_FyJ.js.map → hotkey-element-oEdY8YLl.js.map} +1 -1
  36. package/cdn/live-video-minimal.dev.d.ts +1 -0
  37. package/cdn/live-video-minimal.dev.js +115 -0
  38. package/cdn/live-video-minimal.dev.js.map +1 -0
  39. package/cdn/live-video-minimal.js +2 -0
  40. package/cdn/live-video-minimal.js.map +1 -0
  41. package/cdn/live-video.dev.d.ts +1 -0
  42. package/cdn/live-video.dev.js +130 -0
  43. package/cdn/live-video.dev.js.map +1 -0
  44. package/cdn/live-video.js +2 -0
  45. package/cdn/live-video.js.map +1 -0
  46. package/cdn/media/dash-video.dev.js +8 -7
  47. package/cdn/media/dash-video.dev.js.map +1 -1
  48. package/cdn/media/dash-video.js +6 -6
  49. package/cdn/media/dash-video.js.map +1 -1
  50. package/cdn/media/hls-video.dev.js +4 -4
  51. package/cdn/media/hls-video.js +1 -1
  52. package/cdn/media/hls-video.js.map +1 -1
  53. package/cdn/media/mux-audio.dev.js +8 -6
  54. package/cdn/media/mux-audio.dev.js.map +1 -1
  55. package/cdn/media/mux-audio.js +1 -1
  56. package/cdn/media/mux-audio.js.map +1 -1
  57. package/cdn/media/mux-video.dev.js +8 -6
  58. package/cdn/media/mux-video.dev.js.map +1 -1
  59. package/cdn/media/mux-video.js +1 -1
  60. package/cdn/media/mux-video.js.map +1 -1
  61. package/cdn/media/native-hls-video.dev.js +4 -4
  62. package/cdn/media/native-hls-video.js +1 -1
  63. package/cdn/media/native-hls-video.js.map +1 -1
  64. package/cdn/media/simple-hls-video.dev.js +11 -5
  65. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  66. package/cdn/media/simple-hls-video.js +6 -6
  67. package/cdn/media/simple-hls-video.js.map +1 -1
  68. package/cdn/media-attach-mixin-DuquRhAk.js +2 -0
  69. package/cdn/{media-attach-mixin-C2wz0Qbd.js.map → media-attach-mixin-DuquRhAk.js.map} +1 -1
  70. package/cdn/{media-attach-mixin-CYoNe7Sh.js → media-attach-mixin-pV8deGiO.js} +2 -2
  71. package/cdn/{media-attach-mixin-CYoNe7Sh.js.map → media-attach-mixin-pV8deGiO.js.map} +1 -1
  72. package/cdn/{minimal-AX_y2YBU.js → minimal-CciG7Fsu.js} +1 -1
  73. package/cdn/{minimal-AX_y2YBU.js.map → minimal-CciG7Fsu.js.map} +1 -1
  74. package/cdn/{minimal-Bc74CFqg.js → minimal-DSLrhnDm.js} +1 -1
  75. package/cdn/{minimal-Bc74CFqg.js.map → minimal-DSLrhnDm.js.map} +1 -1
  76. package/cdn/{minimal-ui-yKur3jyD.js → minimal-ui-Bx-_SggT.js} +5 -5
  77. package/cdn/{minimal-ui-yKur3jyD.js.map → minimal-ui-Bx-_SggT.js.map} +1 -1
  78. package/cdn/minimal-ui-CFO4ssL8.js +2 -0
  79. package/cdn/{minimal-ui-hC8-_9_F.js.map → minimal-ui-CFO4ssL8.js.map} +1 -1
  80. package/cdn/minimal-ui-D6Pvbx1R.js +2 -0
  81. package/cdn/{minimal-ui-lnw8AjaS.js.map → minimal-ui-D6Pvbx1R.js.map} +1 -1
  82. package/cdn/{minimal-ui-CE1sVxKB.js → minimal-ui-Dl-8ZL53.js} +5 -5
  83. package/cdn/{minimal-ui-CE1sVxKB.js.map → minimal-ui-Dl-8ZL53.js.map} +1 -1
  84. package/cdn/{mux-BhHIeG3e.js → mux-D5M5HL6A.js} +55 -20
  85. package/cdn/mux-D5M5HL6A.js.map +1 -0
  86. package/cdn/{mux-BgWl50KW.js → mux-DH3Kxyot.js} +10 -10
  87. package/cdn/mux-DH3Kxyot.js.map +1 -0
  88. package/cdn/native-hls-DN_aWn2z.js +2 -0
  89. package/cdn/native-hls-DN_aWn2z.js.map +1 -0
  90. package/cdn/native-hls-ak4v9DN6.js +371 -0
  91. package/cdn/native-hls-ak4v9DN6.js.map +1 -0
  92. package/cdn/player-BKKCelEs.js +2 -0
  93. package/cdn/player-BKKCelEs.js.map +1 -0
  94. package/cdn/{player-DX5Ka0vt.js → player-C_6YjMl7.js} +16 -12
  95. package/cdn/player-C_6YjMl7.js.map +1 -0
  96. package/cdn/player-CtegNw3g.js +2 -0
  97. package/cdn/{player-ChdQN3H5.js.map → player-CtegNw3g.js.map} +1 -1
  98. package/cdn/{player-BVGWmIbQ.js → player-D468sScc.js} +3 -3
  99. package/cdn/{player-BVGWmIbQ.js.map → player-D468sScc.js.map} +1 -1
  100. package/cdn/{context-0rI_P6jf.js → predicate-BOcV_HDG.js} +23 -2
  101. package/cdn/predicate-BOcV_HDG.js.map +1 -0
  102. package/cdn/{context-CEFisYD0.js → predicate-Cad5WV4q.js} +2 -2
  103. package/cdn/predicate-Cad5WV4q.js.map +1 -0
  104. package/cdn/{shallow-equal-xh6Wj-hj.js → shallow-equal-D-fthE54.js} +1 -1
  105. package/cdn/{shallow-equal-xh6Wj-hj.js.map → shallow-equal-D-fthE54.js.map} +1 -1
  106. package/cdn/{shallow-equal-Daj3-_LC.js → shallow-equal-DSpD9PMp.js} +1 -1
  107. package/cdn/{shallow-equal-Daj3-_LC.js.map → shallow-equal-DSpD9PMp.js.map} +1 -1
  108. package/cdn/{skin-element-D3iVinGP.js → skin-element-BcbrkgGs.js} +2 -2
  109. package/cdn/{skin-element-D3iVinGP.js.map → skin-element-BcbrkgGs.js.map} +1 -1
  110. package/cdn/{skin-element-DM82PPxz.js → skin-element-DesLkJKs.js} +2 -2
  111. package/cdn/{skin-element-DM82PPxz.js.map → skin-element-DesLkJKs.js.map} +1 -1
  112. package/cdn/types-B_4Es-UH.js +20 -0
  113. package/cdn/types-B_4Es-UH.js.map +1 -0
  114. package/cdn/types-DRezN4yy.js +2 -0
  115. package/cdn/types-DRezN4yy.js.map +1 -0
  116. package/cdn/{ui-CZ4yl3t3.js → ui-CzxKbsyb.js} +6 -6
  117. package/cdn/{ui-CZ4yl3t3.js.map → ui-CzxKbsyb.js.map} +1 -1
  118. package/cdn/ui-D6DV-Emw.js +2 -0
  119. package/cdn/{ui-BGvi0TNr.js.map → ui-D6DV-Emw.js.map} +1 -1
  120. package/cdn/ui-Dw-n2AMs.js +2 -0
  121. package/cdn/{ui-BN57BxYZ.js.map → ui-Dw-n2AMs.js.map} +1 -1
  122. package/cdn/{ui-CKR6dVbQ.js → ui-S_eLj4ur.js} +6 -6
  123. package/cdn/{ui-CKR6dVbQ.js.map → ui-S_eLj4ur.js.map} +1 -1
  124. package/cdn/{video-host-BtD61mpF.js → video-host-BR_2vUZH.js} +29 -16
  125. package/cdn/{video-host-BtD61mpF.js.map → video-host-BR_2vUZH.js.map} +1 -1
  126. package/cdn/{video-host-LeB1FKfO.js → video-host-Bkh2OyyP.js} +10 -10
  127. package/cdn/{video-host-LeB1FKfO.js.map → video-host-Bkh2OyyP.js.map} +1 -1
  128. package/cdn/video-minimal-ui.dev.js +1 -4
  129. package/cdn/video-minimal-ui.js +1 -1
  130. package/cdn/video-minimal.dev.js +5 -7
  131. package/cdn/video-minimal.dev.js.map +1 -1
  132. package/cdn/video-minimal.js +1 -1
  133. package/cdn/video-minimal.js.map +1 -1
  134. package/cdn/video-ui.dev.js +1 -4
  135. package/cdn/video-ui.js +1 -1
  136. package/cdn/video.dev.js +4 -6
  137. package/cdn/video.dev.js.map +1 -1
  138. package/cdn/video.js +1 -1
  139. package/cdn/video.js.map +1 -1
  140. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  141. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  142. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  143. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  144. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +6 -0
  145. package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -0
  146. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +6 -0
  147. package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -0
  148. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +6 -0
  149. package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -0
  150. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +6 -0
  151. package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -0
  152. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  153. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  154. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  155. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  156. package/dist/default/define/audio/minimal-skin.css +2 -1
  157. package/dist/default/define/audio/skin.css +2 -1
  158. package/dist/default/define/background/skin.js +1 -1
  159. package/dist/default/define/live-audio/minimal-skin.css +779 -0
  160. package/dist/default/define/live-audio/minimal-skin.js +26 -0
  161. package/dist/default/define/live-audio/minimal-skin.js.map +1 -0
  162. package/dist/default/define/live-audio/minimal-skin.tailwind.js +29 -0
  163. package/dist/default/define/live-audio/minimal-skin.tailwind.js.map +1 -0
  164. package/dist/default/define/live-audio/skin.css +795 -0
  165. package/dist/default/define/live-audio/skin.js +26 -0
  166. package/dist/default/define/live-audio/skin.js.map +1 -0
  167. package/dist/default/define/live-audio/skin.tailwind.js +28 -0
  168. package/dist/default/define/live-audio/skin.tailwind.js.map +1 -0
  169. package/dist/default/define/live-video/minimal-skin.css +1170 -0
  170. package/dist/default/define/live-video/minimal-skin.js +26 -0
  171. package/dist/default/define/live-video/minimal-skin.js.map +1 -0
  172. package/dist/default/define/live-video/minimal-skin.tailwind.js +30 -0
  173. package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -0
  174. package/dist/default/define/live-video/skin.css +1160 -0
  175. package/dist/default/define/live-video/skin.js +26 -0
  176. package/dist/default/define/live-video/skin.js.map +1 -0
  177. package/dist/default/define/live-video/skin.tailwind.js +29 -0
  178. package/dist/default/define/live-video/skin.tailwind.js.map +1 -0
  179. package/dist/default/define/skin-element.js +1 -1
  180. package/dist/default/define/video/minimal-skin.css +2 -1
  181. package/dist/default/define/video/skin.css +2 -1
  182. package/dist/default/index.js +2 -1
  183. package/dist/default/media/mux-audio/index.js +4 -1
  184. package/dist/default/media/mux-audio/index.js.map +1 -1
  185. package/dist/default/media/mux-video/index.js +4 -1
  186. package/dist/default/media/mux-video/index.js.map +1 -1
  187. package/dist/default/presets/live-audio.js +6 -0
  188. package/dist/default/presets/live-video.js +6 -0
  189. package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
  190. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  191. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  192. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  193. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js +7 -5
  194. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  195. package/dist/default/ui/alert-dialog/alert-dialog-element.js +12 -6
  196. package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  197. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +6 -3
  198. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  199. package/dist/default/ui/cast-button/cast-button-element.js +2 -2
  200. package/dist/default/ui/cast-button/cast-button-element.js.map +1 -1
  201. package/dist/default/ui/error-dialog/error-dialog-element.js +4 -1
  202. package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -1
  203. package/dist/default/ui/gesture/gesture-element.js +10 -7
  204. package/dist/default/ui/gesture/gesture-element.js.map +1 -1
  205. package/dist/default/ui/hotkey/hotkey-element.js +10 -7
  206. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
  207. package/dist/default/ui/media-button-element.js +4 -2
  208. package/dist/default/ui/media-button-element.js.map +1 -1
  209. package/dist/default/ui/popover/popover-element.js +14 -7
  210. package/dist/default/ui/popover/popover-element.js.map +1 -1
  211. package/dist/default/ui/slider/slider-element.js +8 -4
  212. package/dist/default/ui/slider/slider-element.js.map +1 -1
  213. package/dist/default/ui/slider/slider-preview-element.js +9 -6
  214. package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
  215. package/dist/default/ui/slider/slider-value-element.js +5 -4
  216. package/dist/default/ui/slider/slider-value-element.js.map +1 -1
  217. package/dist/default/ui/thumbnail/thumbnail-element.js +10 -5
  218. package/dist/default/ui/thumbnail/thumbnail-element.js.map +1 -1
  219. package/dist/default/ui/time/time-element.js +8 -4
  220. package/dist/default/ui/time/time-element.js.map +1 -1
  221. package/dist/default/ui/time-slider/time-slider-element.js +12 -6
  222. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  223. package/dist/default/ui/tooltip/tooltip-element.js +16 -8
  224. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  225. package/dist/default/ui/tooltip/tooltip-group-element.js +7 -5
  226. package/dist/default/ui/tooltip/tooltip-group-element.js.map +1 -1
  227. package/dist/default/ui/volume-slider/volume-slider-element.js +10 -5
  228. package/dist/default/ui/volume-slider/volume-slider-element.js.map +1 -1
  229. package/dist/dev/_virtual/_rolldown/runtime.js +27 -0
  230. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  231. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  232. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  233. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  234. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +6 -0
  235. package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -0
  236. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +6 -0
  237. package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -0
  238. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +6 -0
  239. package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -0
  240. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +6 -0
  241. package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -0
  242. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  243. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  244. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  245. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  246. package/dist/dev/define/audio/minimal-skin.css +2 -1
  247. package/dist/dev/define/audio/minimal-skin.d.ts +2 -2
  248. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  249. package/dist/dev/define/audio/player.d.ts +2 -2
  250. package/dist/dev/define/audio/skin.css +2 -1
  251. package/dist/dev/define/audio/skin.d.ts +2 -2
  252. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  253. package/dist/dev/define/background/player.d.ts +2 -2
  254. package/dist/dev/define/background/skin.d.ts.map +1 -1
  255. package/dist/dev/define/background/skin.js +1 -1
  256. package/dist/dev/define/live-audio/minimal-skin.css +779 -0
  257. package/dist/dev/define/live-audio/minimal-skin.d.ts +17 -0
  258. package/dist/dev/define/live-audio/minimal-skin.d.ts.map +1 -0
  259. package/dist/dev/define/live-audio/minimal-skin.js +76 -0
  260. package/dist/dev/define/live-audio/minimal-skin.js.map +1 -0
  261. package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts +14 -0
  262. package/dist/dev/define/live-audio/minimal-skin.tailwind.d.ts.map +1 -0
  263. package/dist/dev/define/live-audio/minimal-skin.tailwind.js +79 -0
  264. package/dist/dev/define/live-audio/minimal-skin.tailwind.js.map +1 -0
  265. package/dist/dev/define/live-audio/skin.css +795 -0
  266. package/dist/dev/define/live-audio/skin.d.ts +17 -0
  267. package/dist/dev/define/live-audio/skin.d.ts.map +1 -0
  268. package/dist/dev/define/live-audio/skin.js +83 -0
  269. package/dist/dev/define/live-audio/skin.js.map +1 -0
  270. package/dist/dev/define/live-audio/skin.tailwind.d.ts +14 -0
  271. package/dist/dev/define/live-audio/skin.tailwind.d.ts.map +1 -0
  272. package/dist/dev/define/live-audio/skin.tailwind.js +78 -0
  273. package/dist/dev/define/live-audio/skin.tailwind.js.map +1 -0
  274. package/dist/dev/define/live-video/minimal-skin.css +1170 -0
  275. package/dist/dev/define/live-video/minimal-skin.d.ts +17 -0
  276. package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -0
  277. package/dist/dev/define/live-video/minimal-skin.js +112 -0
  278. package/dist/dev/define/live-video/minimal-skin.js.map +1 -0
  279. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts +14 -0
  280. package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -0
  281. package/dist/dev/define/live-video/minimal-skin.tailwind.js +110 -0
  282. package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -0
  283. package/dist/dev/define/live-video/skin.css +1160 -0
  284. package/dist/dev/define/live-video/skin.d.ts +17 -0
  285. package/dist/dev/define/live-video/skin.d.ts.map +1 -0
  286. package/dist/dev/define/live-video/skin.js +127 -0
  287. package/dist/dev/define/live-video/skin.js.map +1 -0
  288. package/dist/dev/define/live-video/skin.tailwind.d.ts +14 -0
  289. package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -0
  290. package/dist/dev/define/live-video/skin.tailwind.js +111 -0
  291. package/dist/dev/define/live-video/skin.tailwind.js.map +1 -0
  292. package/dist/dev/define/skin-element.d.ts +1 -1
  293. package/dist/dev/define/skin-element.d.ts.map +1 -1
  294. package/dist/dev/define/skin-element.js +1 -1
  295. package/dist/dev/define/video/minimal-skin.css +2 -1
  296. package/dist/dev/define/video/minimal-skin.d.ts +2 -2
  297. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  298. package/dist/dev/define/video/player.d.ts +2 -2
  299. package/dist/dev/define/video/skin.css +2 -1
  300. package/dist/dev/define/video/skin.d.ts +2 -2
  301. package/dist/dev/define/video/skin.d.ts.map +1 -1
  302. package/dist/dev/index.d.ts +12 -3
  303. package/dist/dev/index.d.ts.map +1 -0
  304. package/dist/dev/index.js +2 -1
  305. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  306. package/dist/dev/media/container-element.d.ts +2 -2
  307. package/dist/dev/media/dash-video/index.d.ts +2 -2
  308. package/dist/dev/media/hls-video/index.d.ts +2 -2
  309. package/dist/dev/media/mux-audio/index.d.ts +2 -2
  310. package/dist/dev/media/mux-audio/index.js +4 -1
  311. package/dist/dev/media/mux-audio/index.js.map +1 -1
  312. package/dist/dev/media/mux-video/index.d.ts +2 -2
  313. package/dist/dev/media/mux-video/index.js +4 -1
  314. package/dist/dev/media/mux-video/index.js.map +1 -1
  315. package/dist/dev/media/native-hls-video/index.d.ts +2 -2
  316. package/dist/dev/media/simple-hls-video/index.d.ts +2 -2
  317. package/dist/dev/player/context.d.ts +1 -1
  318. package/dist/dev/player/player-controller.d.ts +1 -1
  319. package/dist/dev/player/player-controller.d.ts.map +1 -1
  320. package/dist/dev/presets/live-audio.d.ts +6 -0
  321. package/dist/dev/presets/live-audio.js +6 -0
  322. package/dist/dev/presets/live-video.d.ts +6 -0
  323. package/dist/dev/presets/live-video.js +6 -0
  324. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +1 -1
  325. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  326. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  327. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  328. package/dist/dev/store/container-mixin.d.ts +1 -1
  329. package/dist/dev/store/provider-mixin.d.ts +1 -1
  330. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.d.ts.map +1 -1
  331. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js +7 -5
  332. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  333. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.d.ts +2 -2
  334. package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
  335. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +12 -6
  336. package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  337. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.d.ts +2 -2
  338. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
  339. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +6 -3
  340. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  341. package/dist/dev/ui/captions-button/captions-button-element.d.ts +4 -4
  342. package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
  343. package/dist/dev/ui/cast-button/cast-button-element.d.ts +6 -6
  344. package/dist/dev/ui/cast-button/cast-button-element.d.ts.map +1 -1
  345. package/dist/dev/ui/cast-button/cast-button-element.js +2 -2
  346. package/dist/dev/ui/cast-button/cast-button-element.js.map +1 -1
  347. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -1
  348. package/dist/dev/ui/error-dialog/error-dialog-element.js +4 -1
  349. package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -1
  350. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +4 -4
  351. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
  352. package/dist/dev/ui/gesture/gesture-element.js +10 -7
  353. package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
  354. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -1
  355. package/dist/dev/ui/hotkey/hotkey-element.js +10 -7
  356. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
  357. package/dist/dev/ui/media-button-element.d.ts +1 -1
  358. package/dist/dev/ui/media-button-element.js +4 -2
  359. package/dist/dev/ui/media-button-element.js.map +1 -1
  360. package/dist/dev/ui/media-element.d.ts +2 -2
  361. package/dist/dev/ui/mute-button/mute-button-element.d.ts +4 -4
  362. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
  363. package/dist/dev/ui/pip-button/pip-button-element.d.ts +4 -4
  364. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
  365. package/dist/dev/ui/play-button/play-button-element.d.ts +5 -5
  366. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
  367. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts +3 -3
  368. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
  369. package/dist/dev/ui/popover/popover-element.d.ts +3 -3
  370. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  371. package/dist/dev/ui/popover/popover-element.js +14 -7
  372. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  373. package/dist/dev/ui/poster/poster-element.d.ts +4 -4
  374. package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
  375. package/dist/dev/ui/seek-button/seek-button-element.d.ts +4 -4
  376. package/dist/dev/ui/seek-button/seek-button-element.d.ts.map +1 -1
  377. package/dist/dev/ui/slider/slider-element.d.ts +2 -2
  378. package/dist/dev/ui/slider/slider-element.d.ts.map +1 -1
  379. package/dist/dev/ui/slider/slider-element.js +8 -4
  380. package/dist/dev/ui/slider/slider-element.js.map +1 -1
  381. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
  382. package/dist/dev/ui/slider/slider-preview-element.js +9 -6
  383. package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
  384. package/dist/dev/ui/slider/slider-value-element.d.ts.map +1 -1
  385. package/dist/dev/ui/slider/slider-value-element.js +5 -4
  386. package/dist/dev/ui/slider/slider-value-element.js.map +1 -1
  387. package/dist/dev/ui/thumbnail/thumbnail-element.d.ts.map +1 -1
  388. package/dist/dev/ui/thumbnail/thumbnail-element.js +10 -5
  389. package/dist/dev/ui/thumbnail/thumbnail-element.js.map +1 -1
  390. package/dist/dev/ui/time/time-element.d.ts +2 -2
  391. package/dist/dev/ui/time/time-element.d.ts.map +1 -1
  392. package/dist/dev/ui/time/time-element.js +8 -4
  393. package/dist/dev/ui/time/time-element.js.map +1 -1
  394. package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
  395. package/dist/dev/ui/time-slider/time-slider-element.d.ts.map +1 -1
  396. package/dist/dev/ui/time-slider/time-slider-element.js +12 -6
  397. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  398. package/dist/dev/ui/tooltip/tooltip-element.d.ts +3 -3
  399. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  400. package/dist/dev/ui/tooltip/tooltip-element.js +16 -8
  401. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  402. package/dist/dev/ui/tooltip/tooltip-group-element.d.ts.map +1 -1
  403. package/dist/dev/ui/tooltip/tooltip-group-element.js +7 -5
  404. package/dist/dev/ui/tooltip/tooltip-group-element.js.map +1 -1
  405. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts +2 -2
  406. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts.map +1 -1
  407. package/dist/dev/ui/volume-slider/volume-slider-element.js +10 -5
  408. package/dist/dev/ui/volume-slider/volume-slider-element.js.map +1 -1
  409. package/package.json +31 -10
  410. package/cdn/compounds-CCgS3IGo.js +0 -8
  411. package/cdn/compounds-CCgS3IGo.js.map +0 -1
  412. package/cdn/compounds-DD3MYkSc.js.map +0 -1
  413. package/cdn/context-0rI_P6jf.js.map +0 -1
  414. package/cdn/context-CEFisYD0.js.map +0 -1
  415. package/cdn/create-player-B-PGzhq2.js +0 -7
  416. package/cdn/create-player-B-PGzhq2.js.map +0 -1
  417. package/cdn/create-player-BKLw7l1a.js.map +0 -1
  418. package/cdn/hls-CcSAx_3I.js.map +0 -1
  419. package/cdn/hls-Dl2v35sW.js +0 -41
  420. package/cdn/hls-Dl2v35sW.js.map +0 -1
  421. package/cdn/hotkey-element-DWWkfH3A.js +0 -2
  422. package/cdn/media-attach-mixin-C2wz0Qbd.js +0 -2
  423. package/cdn/minimal-ui-hC8-_9_F.js +0 -2
  424. package/cdn/minimal-ui-lnw8AjaS.js +0 -2
  425. package/cdn/mux-BgWl50KW.js.map +0 -1
  426. package/cdn/mux-BhHIeG3e.js.map +0 -1
  427. package/cdn/native-hls-lhip4tV9.js +0 -123
  428. package/cdn/native-hls-lhip4tV9.js.map +0 -1
  429. package/cdn/native-hls-odPBXxK7.js +0 -2
  430. package/cdn/native-hls-odPBXxK7.js.map +0 -1
  431. package/cdn/player-B7jISTmQ.js +0 -2
  432. package/cdn/player-B7jISTmQ.js.map +0 -1
  433. package/cdn/player-ChdQN3H5.js +0 -2
  434. package/cdn/player-DX5Ka0vt.js.map +0 -1
  435. package/cdn/ui-BGvi0TNr.js +0 -2
  436. package/cdn/ui-BN57BxYZ.js +0 -2
@@ -9,6 +9,8 @@ var MediaButtonElement = class extends MediaElement {
9
9
  this.disabled = false;
10
10
  this.label = "";
11
11
  this.hotkeyAction = void 0;
12
+ this.#disconnect = null;
13
+ this.#hotkeyRegistry = null;
12
14
  }
13
15
  static {
14
16
  this.properties = {
@@ -19,8 +21,8 @@ var MediaButtonElement = class extends MediaElement {
19
21
  get $state() {
20
22
  return this.core.state;
21
23
  }
22
- #disconnect = null;
23
- #hotkeyRegistry = null;
24
+ #disconnect;
25
+ #hotkeyRegistry;
24
26
  connectedCallback() {
25
27
  super.connectedCallback();
26
28
  if (this.destroyed) return;
@@ -1 +1 @@
1
- {"version":3,"file":"media-button-element.js","names":["#hotkeyRegistry","#disconnect"],"sources":["../../../src/ui/media-button-element.ts"],"sourcesContent":["import type {\n ButtonState,\n InferComponentState,\n InferMediaState,\n MediaButtonComponent,\n StateAttrMap,\n} from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, createButton, logMissingFeature } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport type { PlayerController } from '../player/player-controller';\nimport { AriaKeyShortcutsController } from './hotkey/aria-key-shortcuts-controller';\nimport { MediaElement } from './media-element';\n\n/** Abstract base for HTML custom elements that render a media-control button. */\nexport abstract class MediaButtonElement<Core extends MediaButtonComponent> extends MediaElement {\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label = '';\n\n protected abstract readonly core: Core;\n protected abstract readonly stateAttrMap: StateAttrMap<InferComponentState<Core>>;\n protected abstract readonly mediaState: PlayerController<any, InferMediaState<Core> | undefined>;\n\n protected abstract activate(state: InferMediaState<Core>): void;\n\n /** Override to set the hotkey action name for `aria-keyshortcuts`. */\n protected readonly hotkeyAction: string | undefined = undefined;\n\n get $state(): State<ButtonState> {\n return this.core.state;\n }\n\n #disconnect: AbortController | null = null;\n #hotkeyRegistry: AriaKeyShortcutsController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (this.hotkeyAction && !this.#hotkeyRegistry) {\n this.#hotkeyRegistry = new AriaKeyShortcutsController(this, this.hotkeyAction);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => this.activate(this.mediaState.value!),\n isDisabled: () => this.disabled || !this.mediaState.value,\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.mediaState.value && this.mediaState.displayName) {\n logMissingFeature(this.localName, this.mediaState.displayName);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label || undefined;\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\n const media = this.mediaState.value;\n\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n applyElementProps(this, {\n ...this.core.getAttrs?.(state),\n 'aria-keyshortcuts': this.#hotkeyRegistry?.value,\n });\n applyStateDataAttrs(this, state, this.stateAttrMap);\n }\n}\n"],"mappings":";;;;;AAgBA,IAAsB,qBAAtB,cAAoF,aAAa;;;kBAMpF;eACH;sBAS8C,KAAA;;;oBAfD;GACnD,OAAO,EAAE,MAAM,QAAQ;GACvB,UAAU,EAAE,MAAM,SAAS;GAC5B;;CAcD,IAAI,SAA6B;AAC/B,SAAO,KAAK,KAAK;;CAGnB,cAAsC;CACtC,kBAAqD;CAErD,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,MAAI,KAAK,UAAW;AAEpB,MAAI,KAAK,gBAAgB,CAAC,MAAA,eACxB,OAAA,iBAAuB,IAAI,2BAA2B,MAAM,KAAK,aAAa;AAGhF,QAAA,aAAmB,IAAI,iBAAiB;EAExC,MAAM,cAAc,aAAa;GAC/B,kBAAkB,KAAK,SAAS,KAAK,WAAW,MAAO;GACvD,kBAAkB,KAAK,YAAY,CAAC,KAAK,WAAW;GACrD,CAAC;AAEF,oBAAkB,MAAM,aAAa,EAAE,QAAQ,MAAA,WAAiB,QAAQ,CAAC;;CAO3E,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;;CAIrB,WAA+B;AAC7B,SAAO,KAAK,KAAK,MAAM,QAAQ,SAAS,KAAA;;CAG1C,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,OAAK,KAAK,WAAW,KAAK;;CAG5B,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;EAErB,MAAM,QAAQ,KAAK,WAAW;AAE9B,MAAI,CAAC,MAAO;AAEZ,OAAK,KAAK,SAAS,MAAM;EACzB,MAAM,QAAQ,KAAK,KAAK,UAAU;AAClC,oBAAkB,MAAM;GACtB,GAAG,KAAK,KAAK,WAAW,MAAM;GAC9B,qBAAqB,MAAA,gBAAsB;GAC5C,CAAC;AACF,sBAAoB,MAAM,OAAO,KAAK,aAAa"}
1
+ {"version":3,"file":"media-button-element.js","names":["#hotkeyRegistry","#disconnect"],"sources":["../../../src/ui/media-button-element.ts"],"sourcesContent":["import type {\n ButtonState,\n InferComponentState,\n InferMediaState,\n MediaButtonComponent,\n StateAttrMap,\n} from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, createButton, logMissingFeature } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport type { PlayerController } from '../player/player-controller';\nimport { AriaKeyShortcutsController } from './hotkey/aria-key-shortcuts-controller';\nimport { MediaElement } from './media-element';\n\n/** Abstract base for HTML custom elements that render a media-control button. */\nexport abstract class MediaButtonElement<Core extends MediaButtonComponent> extends MediaElement {\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label = '';\n\n protected abstract readonly core: Core;\n protected abstract readonly stateAttrMap: StateAttrMap<InferComponentState<Core>>;\n protected abstract readonly mediaState: PlayerController<any, InferMediaState<Core> | undefined>;\n\n protected abstract activate(state: InferMediaState<Core>): void;\n\n /** Override to set the hotkey action name for `aria-keyshortcuts`. */\n protected readonly hotkeyAction: string | undefined = undefined;\n\n get $state(): State<ButtonState> {\n return this.core.state;\n }\n\n #disconnect: AbortController | null = null;\n #hotkeyRegistry: AriaKeyShortcutsController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (this.hotkeyAction && !this.#hotkeyRegistry) {\n this.#hotkeyRegistry = new AriaKeyShortcutsController(this, this.hotkeyAction);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => this.activate(this.mediaState.value!),\n isDisabled: () => this.disabled || !this.mediaState.value,\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.mediaState.value && this.mediaState.displayName) {\n logMissingFeature(this.localName, this.mediaState.displayName);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label || undefined;\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\n const media = this.mediaState.value;\n\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n applyElementProps(this, {\n ...this.core.getAttrs?.(state),\n 'aria-keyshortcuts': this.#hotkeyRegistry?.value,\n });\n applyStateDataAttrs(this, state, this.stateAttrMap);\n }\n}\n"],"mappings":";;;;;AAgBA,IAAsB,qBAAtB,cAAoF,aAAa;;;kBAMpF;eACH;sBAS8C,KAAA;qBAMhB;yBACe;;;oBAtBA;GACnD,OAAO,EAAE,MAAM,QAAQ;GACvB,UAAU,EAAE,MAAM,SAAS;GAC5B;;CAcD,IAAI,SAA6B;AAC/B,SAAO,KAAK,KAAK;;CAGnB;CACA;CAEA,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,MAAI,KAAK,UAAW;AAEpB,MAAI,KAAK,gBAAgB,CAAC,MAAA,eACxB,OAAA,iBAAuB,IAAI,2BAA2B,MAAM,KAAK,aAAa;AAGhF,QAAA,aAAmB,IAAI,iBAAiB;EAExC,MAAM,cAAc,aAAa;GAC/B,kBAAkB,KAAK,SAAS,KAAK,WAAW,MAAO;GACvD,kBAAkB,KAAK,YAAY,CAAC,KAAK,WAAW;GACrD,CAAC;AAEF,oBAAkB,MAAM,aAAa,EAAE,QAAQ,MAAA,WAAiB,QAAQ,CAAC;;CAO3E,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB;;;CAIrB,WAA+B;AAC7B,SAAO,KAAK,KAAK,MAAM,QAAQ,SAAS,KAAA;;CAG1C,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,OAAK,KAAK,WAAW,KAAK;;CAG5B,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;EAErB,MAAM,QAAQ,KAAK,WAAW;AAE9B,MAAI,CAAC,MAAO;AAEZ,OAAK,KAAK,SAAS,MAAM;EACzB,MAAM,QAAQ,KAAK,KAAK,UAAU;AAClC,oBAAkB,MAAM;GACtB,GAAG,KAAK,KAAK,WAAW,MAAM;GAC9B,qBAAqB,MAAA,gBAAsB;GAC5C,CAAC;AACF,sBAAoB,MAAM,OAAO,KAAK,aAAa"}
@@ -18,6 +18,13 @@ var PopoverElement = class extends MediaElement {
18
18
  this.openOnHover = PopoverCore.defaultProps.openOnHover;
19
19
  this.delay = PopoverCore.defaultProps.delay;
20
20
  this.closeDelay = PopoverCore.defaultProps.closeDelay;
21
+ this.#core = new PopoverCore();
22
+ this.#position = new PositionController(this);
23
+ this.#popover = null;
24
+ this.#snapshot = null;
25
+ this.#disconnect = null;
26
+ this.#triggerAbort = null;
27
+ this.#currentTrigger = null;
21
28
  }
22
29
  static {
23
30
  this.tagName = "media-popover";
@@ -51,13 +58,13 @@ var PopoverElement = class extends MediaElement {
51
58
  }
52
59
  };
53
60
  }
54
- #core = new PopoverCore();
55
- #position = new PositionController(this);
56
- #popover = null;
57
- #snapshot = null;
58
- #disconnect = null;
59
- #triggerAbort = null;
60
- #currentTrigger = null;
61
+ #core;
62
+ #position;
63
+ #popover;
64
+ #snapshot;
65
+ #disconnect;
66
+ #triggerAbort;
67
+ #currentTrigger;
61
68
  connectedCallback() {
62
69
  super.connectedCallback();
63
70
  if (this.destroyed) return;
@@ -1 +1 @@
1
- {"version":3,"file":"popover-element.js","names":["#core","#position","#disconnect","#popover","#snapshot","#cleanupTrigger","#syncTrigger","#currentTrigger","#triggerAbort"],"sources":["../../../../src/ui/popover/popover-element.ts"],"sourcesContent":["import { PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n type PopoverApi,\n type PopoverChangeDetails,\n resolveOffsets,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\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';\n\nexport class PopoverElement extends MediaElement {\n static readonly tagName = 'media-popover';\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 modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n } satisfies PropertyDeclarationMap<keyof PopoverCore.Props>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n\n readonly #core = new PopoverCore();\n readonly #position = new PositionController(this);\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | 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.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.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.#popover?.open();\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.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\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.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#popover) 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.#popover.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, PopoverDataAttrs);\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 trigger ARIA and anchor-name to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\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(this, getAnchorPositionStyle(this.id, posOpts));\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);\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));\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.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n // Remove ARIA attributes and anchor-name style from the old trigger.\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\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":"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"}
1
+ {"version":3,"file":"popover-element.js","names":["#core","#position","#disconnect","#popover","#snapshot","#cleanupTrigger","#syncTrigger","#currentTrigger","#triggerAbort"],"sources":["../../../../src/ui/popover/popover-element.ts"],"sourcesContent":["import { PopoverCore, PopoverDataAttrs, type PopoverInput, type PopoverProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createPopover,\n createTransition,\n getAnchorNameStyle,\n getAnchorPositionStyle,\n getPopupPositionRect,\n type PopoverApi,\n type PopoverChangeDetails,\n resolveOffsets,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\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';\n\nexport class PopoverElement extends MediaElement {\n static readonly tagName = 'media-popover';\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 modal: { type: Boolean },\n closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n openOnHover: { type: Boolean, attribute: 'open-on-hover' },\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n } satisfies PropertyDeclarationMap<keyof PopoverCore.Props>;\n\n open = PopoverCore.defaultProps.open;\n defaultOpen = PopoverCore.defaultProps.defaultOpen;\n side = PopoverCore.defaultProps.side;\n align = PopoverCore.defaultProps.align;\n modal: PopoverProps['modal'] = PopoverCore.defaultProps.modal;\n closeOnEscape = PopoverCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = PopoverCore.defaultProps.closeOnOutsideClick;\n openOnHover = PopoverCore.defaultProps.openOnHover;\n delay = PopoverCore.defaultProps.delay;\n closeDelay = PopoverCore.defaultProps.closeDelay;\n\n readonly #core = new PopoverCore();\n readonly #position = new PositionController(this);\n #popover: PopoverApi | null = null;\n #snapshot: SnapshotController<PopoverInput> | 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.#popover = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n this.open = nextOpen;\n this.dispatchEvent(new CustomEvent('open-change', { detail: { open: nextOpen, ...details } }));\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n openOnHover: () => this.openOnHover,\n delay: () => this.delay,\n closeDelay: () => this.closeDelay,\n });\n\n // Register self as the popup element — the element IS the popup.\n this.#popover.setPopupElement(this);\n\n // Apply popup event handlers (pointerenter/leave, focusout) to self.\n applyElementProps(this, this.#popover.popupProps, { signal: this.#disconnect.signal });\n\n // Subscribe to interaction state for reactive updates.\n // Reuse the controller across connect/disconnect cycles to avoid\n // leaking stale controllers in the host's controller set.\n if (this.#snapshot) {\n this.#snapshot.track(this.#popover.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#popover.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.#popover?.open();\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.#cleanupTrigger();\n this.#popover?.destroy();\n super.destroyCallback();\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.#popover && changed.has('open')) {\n const { active: interactionOpen } = this.#popover.input.current;\n if (this.open !== interactionOpen) {\n if (this.open) {\n this.#popover.open();\n } else {\n this.#popover.close();\n }\n }\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#popover) 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.#popover.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, PopoverDataAttrs);\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 trigger ARIA and anchor-name to the discovered trigger.\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\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(this, getAnchorPositionStyle(this.id, posOpts));\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);\n applyStyles(this, getAnchorPositionStyle(this.id, posOpts, triggerRect, selfRect, boundaryRect, offsets));\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.#popover?.setTriggerElement(triggerEl);\n\n if (triggerEl && this.#popover) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerEl, this.#popover.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n // Remove ARIA attributes and anchor-name style from the old trigger.\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\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":"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"}
@@ -17,6 +17,10 @@ var SliderElement = class extends MediaElement {
17
17
  this.orientation = SliderCore.defaultProps.orientation;
18
18
  this.disabled = SliderCore.defaultProps.disabled;
19
19
  this.thumbAlignment = SliderCore.defaultProps.thumbAlignment;
20
+ this.#core = new SliderCore();
21
+ this.#provider = new ContextProvider(this, { context: sliderContext });
22
+ this.#slider = null;
23
+ this.#disconnect = null;
20
24
  }
21
25
  static {
22
26
  this.tagName = "media-slider";
@@ -40,10 +44,10 @@ var SliderElement = class extends MediaElement {
40
44
  }
41
45
  };
42
46
  }
43
- #core = new SliderCore();
44
- #provider = new ContextProvider(this, { context: sliderContext });
45
- #slider = null;
46
- #disconnect = null;
47
+ #core;
48
+ #provider;
49
+ #slider;
50
+ #disconnect;
47
51
  connectedCallback() {
48
52
  super.connectedCallback();
49
53
  if (this.destroyed) return;
@@ -1 +1 @@
1
- {"version":3,"file":"slider-element.js","names":["#core","#provider","#disconnect","#slider"],"sources":["../../../../src/ui/slider/slider-element.ts"],"sourcesContent":["import { SliderCore, SliderDataAttrs } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n getSliderCSSVars,\n type SliderApi,\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';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderElement extends MediaElement {\n static readonly tagName = 'media-slider';\n\n static override properties = {\n label: { type: String },\n value: { type: Number },\n min: { type: Number },\n max: { type: Number },\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<keyof SliderCore.Props>;\n\n label = SliderCore.defaultProps.label;\n value = SliderCore.defaultProps.value;\n min = SliderCore.defaultProps.min;\n max = SliderCore.defaultProps.max;\n step = SliderCore.defaultProps.step;\n largeStep = SliderCore.defaultProps.largeStep;\n orientation = SliderCore.defaultProps.orientation;\n disabled = SliderCore.defaultProps.disabled;\n thumbAlignment = SliderCore.defaultProps.thumbAlignment;\n\n readonly #core = new SliderCore();\n readonly #provider = new ContextProvider(this, { context: sliderContext });\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,\n getPercent: () => this.#core.percentFromValue(this.value),\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueChange: (percent) => {\n this.value = this.#core.valueFromPercent(percent);\n this.dispatchEvent(new CustomEvent('value-change', { detail: { value: this.value }, bubbles: true }));\n },\n onValueCommit: (percent) => {\n this.value = this.#core.valueFromPercent(percent);\n this.dispatchEvent(new CustomEvent('value-commit', { detail: { value: this.value }, bubbles: true }));\n },\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\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 this.#core.setInput(this.#slider.input.current);\n const state = this.#core.getSliderState(this.value);\n\n const cssVars = getSliderCSSVars(this.#slider.adjustForAlignment(state));\n\n applyStyles(this, cssVars);\n\n // Apply state data attributes to the root element.\n applyStateDataAttrs(this, state, SliderDataAttrs);\n\n // Provide context to child elements (thumb, value, track, etc.).\n this.#provider.setValue({\n state,\n stateAttrMap: SliderDataAttrs,\n pointerValue: this.#core.valueFromPercent(state.pointerPercent),\n thumbAttrs: this.#core.getAttrs(state),\n thumbProps: this.#slider.thumbProps,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"slider-element.js","names":["#core","#provider","#disconnect","#slider"],"sources":["../../../../src/ui/slider/slider-element.ts"],"sourcesContent":["import { SliderCore, SliderDataAttrs } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n getSliderCSSVars,\n type SliderApi,\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';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderElement extends MediaElement {\n static readonly tagName = 'media-slider';\n\n static override properties = {\n label: { type: String },\n value: { type: Number },\n min: { type: Number },\n max: { type: Number },\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<keyof SliderCore.Props>;\n\n label = SliderCore.defaultProps.label;\n value = SliderCore.defaultProps.value;\n min = SliderCore.defaultProps.min;\n max = SliderCore.defaultProps.max;\n step = SliderCore.defaultProps.step;\n largeStep = SliderCore.defaultProps.largeStep;\n orientation = SliderCore.defaultProps.orientation;\n disabled = SliderCore.defaultProps.disabled;\n thumbAlignment = SliderCore.defaultProps.thumbAlignment;\n\n readonly #core = new SliderCore();\n readonly #provider = new ContextProvider(this, { context: sliderContext });\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,\n getPercent: () => this.#core.percentFromValue(this.value),\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueChange: (percent) => {\n this.value = this.#core.valueFromPercent(percent);\n this.dispatchEvent(new CustomEvent('value-change', { detail: { value: this.value }, bubbles: true }));\n },\n onValueCommit: (percent) => {\n this.value = this.#core.valueFromPercent(percent);\n this.dispatchEvent(new CustomEvent('value-commit', { detail: { value: this.value }, bubbles: true }));\n },\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\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 this.#core.setInput(this.#slider.input.current);\n const state = this.#core.getSliderState(this.value);\n\n const cssVars = getSliderCSSVars(this.#slider.adjustForAlignment(state));\n\n applyStyles(this, cssVars);\n\n // Apply state data attributes to the root element.\n applyStateDataAttrs(this, state, SliderDataAttrs);\n\n // Provide context to child elements (thumb, value, track, etc.).\n this.#provider.setValue({\n state,\n stateAttrMap: SliderDataAttrs,\n pointerValue: this.#core.valueFromPercent(state.pointerPercent),\n thumbAttrs: this.#core.getAttrs(state),\n thumbProps: this.#slider.thumbProps,\n });\n }\n}\n"],"mappings":";;;;;;;AAeA,IAAa,gBAAb,cAAmC,aAAa;;;eAetC,WAAW,aAAa;eACxB,WAAW,aAAa;aAC1B,WAAW,aAAa;aACxB,WAAW,aAAa;cACvB,WAAW,aAAa;mBACnB,WAAW,aAAa;qBACtB,WAAW,aAAa;kBAC3B,WAAW,aAAa;wBAClB,WAAW,aAAa;eAExB,IAAI,YAAY;mBACZ,IAAI,gBAAgB,MAAM,EAAE,SAAS,eAAe,CAAC;iBAE9C;qBACU;;;iBA5BZ;;;oBAEG;GAC3B,OAAO,EAAE,MAAM,QAAQ;GACvB,OAAO,EAAE,MAAM,QAAQ;GACvB,KAAK,EAAE,MAAM,QAAQ;GACrB,KAAK,EAAE,MAAM,QAAQ;GACrB,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;;CAYD;CACA;CAEA;CACA;CAEA,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;GACvB,kBAAkB,MAAA,KAAW,iBAAiB,KAAK,MAAM;GACzD,sBAAsB,MAAA,KAAW,gBAAgB;GACjD,2BAA2B,MAAA,KAAW,qBAAqB;GAC3D,gBAAgB,YAAY;AAC1B,SAAK,QAAQ,MAAA,KAAW,iBAAiB,QAAQ;AACjD,SAAK,cAAc,IAAI,YAAY,gBAAgB;KAAE,QAAQ,EAAE,OAAO,KAAK,OAAO;KAAE,SAAS;KAAM,CAAC,CAAC;;GAEvG,gBAAgB,YAAY;AAC1B,SAAK,QAAQ,MAAA,KAAW,iBAAiB,QAAQ;AACjD,SAAK,cAAc,IAAI,YAAY,gBAAgB;KAAE,QAAQ,EAAE,OAAO,KAAK,OAAO;KAAE,SAAS;KAAM,CAAC,CAAC;;GAEvG,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;;CAGtE,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;AAEnB,QAAA,KAAW,SAAS,MAAA,OAAa,MAAM,QAAQ;EAC/C,MAAM,QAAQ,MAAA,KAAW,eAAe,KAAK,MAAM;EAEnD,MAAM,UAAU,iBAAiB,MAAA,OAAa,mBAAmB,MAAM,CAAC;AAExE,cAAY,MAAM,QAAQ;AAG1B,sBAAoB,MAAM,OAAO,gBAAgB;AAGjD,QAAA,SAAe,SAAS;GACtB;GACA,cAAc;GACd,cAAc,MAAA,KAAW,iBAAiB,MAAM,eAAe;GAC/D,YAAY,MAAA,KAAW,SAAS,MAAM;GACtC,YAAY,MAAA,OAAa;GAC1B,CAAC"}
@@ -8,6 +8,12 @@ var SliderPreviewElement = class extends MediaElement {
8
8
  constructor(..._args) {
9
9
  super(..._args);
10
10
  this.overflow = "clamp";
11
+ this.#ctx = new ContextConsumer(this, {
12
+ context: sliderContext,
13
+ subscribe: true
14
+ });
15
+ this.#resizeObserver = null;
16
+ this.#width = 0;
11
17
  }
12
18
  static {
13
19
  this.tagName = "media-slider-preview";
@@ -15,12 +21,9 @@ var SliderPreviewElement = class extends MediaElement {
15
21
  static {
16
22
  this.properties = { overflow: { type: String } };
17
23
  }
18
- #ctx = new ContextConsumer(this, {
19
- context: sliderContext,
20
- subscribe: true
21
- });
22
- #resizeObserver = null;
23
- #width = 0;
24
+ #ctx;
25
+ #resizeObserver;
26
+ #width;
24
27
  connectedCallback() {
25
28
  super.connectedCallback();
26
29
  this.#resizeObserver = new ResizeObserver(([entry]) => {
@@ -1 +1 @@
1
- {"version":3,"file":"slider-preview-element.js","names":["#ctx","#resizeObserver","#width","#applyPosition"],"sources":["../../../../src/ui/slider/slider-preview-element.ts"],"sourcesContent":["import type { SliderPreviewOverflow } from '@videojs/core/dom';\nimport { applyStateDataAttrs, getSliderPreviewStyle } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { applyStyles } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderPreviewElement extends MediaElement {\n static readonly tagName = 'media-slider-preview';\n\n static override properties = {\n overflow: { type: String },\n } satisfies PropertyDeclarationMap<'overflow'>;\n\n overflow: SliderPreviewOverflow = 'clamp';\n\n readonly #ctx = new ContextConsumer(this, {\n context: sliderContext,\n subscribe: true,\n });\n\n #resizeObserver: ResizeObserver | null = null;\n #width = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.#resizeObserver = new ResizeObserver(([entry]) => {\n this.#width = entry!.contentRect.width;\n this.#applyPosition();\n });\n\n this.#resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n #applyPosition(): void {\n applyStyles(this, getSliderPreviewStyle(this.#width, this.overflow));\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);\n\n this.#applyPosition();\n }\n}\n"],"mappings":";;;;;;AASA,IAAa,uBAAb,cAA0C,aAAa;;;kBAOnB;;;iBANR;;;oBAEG,EAC3B,UAAU,EAAE,MAAM,QAAQ,EAC3B;;CAID,OAAgB,IAAI,gBAAgB,MAAM;EACxC,SAAS;EACT,WAAW;EACZ,CAAC;CAEF,kBAAyC;CACzC,SAAS;CAET,oBAAmC;AACjC,QAAM,mBAAmB;AAEzB,QAAA,iBAAuB,IAAI,gBAAgB,CAAC,WAAW;AACrD,SAAA,QAAc,MAAO,YAAY;AACjC,SAAA,eAAqB;IACrB;AAEF,QAAA,eAAqB,QAAQ,KAAK;;CAGpC,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,gBAAsB,YAAY;AAClC,QAAA,iBAAuB;;CAGzB,iBAAuB;AACrB,cAAY,MAAM,sBAAsB,MAAA,OAAa,KAAK,SAAS,CAAC;;CAGtE,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;EAEtB,MAAM,MAAM,MAAA,IAAU;AACtB,MAAI,IAAK,qBAAoB,MAAM,IAAI,OAAO,IAAI,aAAa;AAE/D,QAAA,eAAqB"}
1
+ {"version":3,"file":"slider-preview-element.js","names":["#ctx","#resizeObserver","#width","#applyPosition"],"sources":["../../../../src/ui/slider/slider-preview-element.ts"],"sourcesContent":["import type { SliderPreviewOverflow } from '@videojs/core/dom';\nimport { applyStateDataAttrs, getSliderPreviewStyle } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { applyStyles } from '@videojs/utils/dom';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderPreviewElement extends MediaElement {\n static readonly tagName = 'media-slider-preview';\n\n static override properties = {\n overflow: { type: String },\n } satisfies PropertyDeclarationMap<'overflow'>;\n\n overflow: SliderPreviewOverflow = 'clamp';\n\n readonly #ctx = new ContextConsumer(this, {\n context: sliderContext,\n subscribe: true,\n });\n\n #resizeObserver: ResizeObserver | null = null;\n #width = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.#resizeObserver = new ResizeObserver(([entry]) => {\n this.#width = entry!.contentRect.width;\n this.#applyPosition();\n });\n\n this.#resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n }\n\n #applyPosition(): void {\n applyStyles(this, getSliderPreviewStyle(this.#width, this.overflow));\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (ctx) applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);\n\n this.#applyPosition();\n }\n}\n"],"mappings":";;;;;;AASA,IAAa,uBAAb,cAA0C,aAAa;;;kBAOnB;cAElB,IAAI,gBAAgB,MAAM;GACxC,SAAS;GACT,WAAW;GACZ,CAAC;yBAEuC;gBAChC;;;iBAdiB;;;oBAEG,EAC3B,UAAU,EAAE,MAAM,QAAQ,EAC3B;;CAID;CAKA;CACA;CAEA,oBAAmC;AACjC,QAAM,mBAAmB;AAEzB,QAAA,iBAAuB,IAAI,gBAAgB,CAAC,WAAW;AACrD,SAAA,QAAc,MAAO,YAAY;AACjC,SAAA,eAAqB;IACrB;AAEF,QAAA,eAAqB,QAAQ,KAAK;;CAGpC,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,QAAA,gBAAsB,YAAY;AAClC,QAAA,iBAAuB;;CAGzB,iBAAuB;AACrB,cAAY,MAAM,sBAAsB,MAAA,OAAa,KAAK,SAAS,CAAC;;CAGtE,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;EAEtB,MAAM,MAAM,MAAA,IAAU;AACtB,MAAI,IAAK,qBAAoB,MAAM,IAAI,OAAO,IAAI,aAAa;AAE/D,QAAA,eAAqB"}
@@ -7,6 +7,10 @@ var SliderValueElement = class extends MediaElement {
7
7
  constructor(..._args) {
8
8
  super(..._args);
9
9
  this.type = "current";
10
+ this.#ctx = new ContextConsumer(this, {
11
+ context: sliderContext,
12
+ subscribe: true
13
+ });
10
14
  }
11
15
  static {
12
16
  this.tagName = "media-slider-value";
@@ -14,10 +18,7 @@ var SliderValueElement = class extends MediaElement {
14
18
  static {
15
19
  this.properties = { type: { type: String } };
16
20
  }
17
- #ctx = new ContextConsumer(this, {
18
- context: sliderContext,
19
- subscribe: true
20
- });
21
+ #ctx;
21
22
  connectedCallback() {
22
23
  super.connectedCallback();
23
24
  this.setAttribute("aria-live", "off");
@@ -1 +1 @@
1
- {"version":3,"file":"slider-value-element.js","names":["#ctx"],"sources":["../../../../src/ui/slider/slider-value-element.ts"],"sourcesContent":["import { applyStateDataAttrs } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderValueElement extends MediaElement {\n static readonly tagName = 'media-slider-value';\n\n static override properties = {\n type: { type: String },\n } satisfies PropertyDeclarationMap<'type'>;\n\n type: 'current' | 'pointer' = 'current';\n\n readonly #ctx = new ContextConsumer(this, {\n context: sliderContext,\n subscribe: true,\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('aria-live', 'off');\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx) return;\n\n const value = this.type === 'pointer' ? ctx.pointerValue : ctx.state.value;\n\n this.textContent = ctx.formatValue ? ctx.formatValue(value, this.type) : String(Math.round(value));\n\n applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,qBAAb,cAAwC,aAAa;;;cAOrB;;;iBANJ;;;oBAEG,EAC3B,MAAM,EAAE,MAAM,QAAQ,EACvB;;CAID,OAAgB,IAAI,gBAAgB,MAAM;EACxC,SAAS;EACT,WAAW;EACZ,CAAC;CAEF,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,OAAK,aAAa,aAAa,MAAM;;CAGvC,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;EAEtB,MAAM,MAAM,MAAA,IAAU;AACtB,MAAI,CAAC,IAAK;EAEV,MAAM,QAAQ,KAAK,SAAS,YAAY,IAAI,eAAe,IAAI,MAAM;AAErE,OAAK,cAAc,IAAI,cAAc,IAAI,YAAY,OAAO,KAAK,KAAK,GAAG,OAAO,KAAK,MAAM,MAAM,CAAC;AAElG,sBAAoB,MAAM,IAAI,OAAO,IAAI,aAAa"}
1
+ {"version":3,"file":"slider-value-element.js","names":["#ctx"],"sources":["../../../../src/ui/slider/slider-value-element.ts"],"sourcesContent":["import { applyStateDataAttrs } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { MediaElement } from '../media-element';\nimport { sliderContext } from './context';\n\nexport class SliderValueElement extends MediaElement {\n static readonly tagName = 'media-slider-value';\n\n static override properties = {\n type: { type: String },\n } satisfies PropertyDeclarationMap<'type'>;\n\n type: 'current' | 'pointer' = 'current';\n\n readonly #ctx = new ContextConsumer(this, {\n context: sliderContext,\n subscribe: true,\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('aria-live', 'off');\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n const ctx = this.#ctx.value;\n if (!ctx) return;\n\n const value = this.type === 'pointer' ? ctx.pointerValue : ctx.state.value;\n\n this.textContent = ctx.formatValue ? ctx.formatValue(value, this.type) : String(Math.round(value));\n\n applyStateDataAttrs(this, ctx.state, ctx.stateAttrMap);\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,qBAAb,cAAwC,aAAa;;;cAOrB;cAEd,IAAI,gBAAgB,MAAM;GACxC,SAAS;GACT,WAAW;GACZ,CAAC;;;iBAXwB;;;oBAEG,EAC3B,MAAM,EAAE,MAAM,QAAQ,EACvB;;CAID;CAKA,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,OAAK,aAAa,aAAa,MAAM;;CAGvC,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;EAEtB,MAAM,MAAM,MAAA,IAAU;AACtB,MAAI,CAAC,IAAK;EAEV,MAAM,QAAQ,KAAK,SAAS,YAAY,IAAI,eAAe,IAAI,MAAM;AAErE,OAAK,cAAc,IAAI,cAAc,IAAI,YAAY,OAAO,KAAK,KAAK,GAAG,OAAO,KAAK,MAAM,MAAM,CAAC;AAElG,sBAAoB,MAAM,IAAI,OAAO,IAAI,aAAa"}
@@ -30,16 +30,21 @@ var ThumbnailElement = class extends MediaElement {
30
30
  }
31
31
  };
32
32
  }
33
- #core = new ThumbnailCore();
34
- #img = document.createElement("img");
35
- #textTracks = new PlayerController(this, playerContext, selectTextTrack);
36
- #thumbnails = [];
33
+ #core;
34
+ #img;
35
+ #textTracks;
36
+ #thumbnails;
37
37
  #externalThumbnails;
38
38
  #lastTextTrack;
39
- #api = null;
39
+ #api;
40
40
  constructor() {
41
41
  super();
42
42
  this.time = 0;
43
+ this.#core = new ThumbnailCore();
44
+ this.#img = document.createElement("img");
45
+ this.#textTracks = new PlayerController(this, playerContext, selectTextTrack);
46
+ this.#thumbnails = [];
47
+ this.#api = null;
43
48
  const shadow = this.attachShadow({ mode: "open" });
44
49
  const style = document.createElement("style");
45
50
  style.textContent = SHADOW_CSS;
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail-element.js","names":["#core","#img","#textTracks","#externalThumbnails","#api","#thumbnails","#lastTextTrack","#resetStyles","#applyResize"],"sources":["../../../../src/ui/thumbnail/thumbnail-element.ts"],"sourcesContent":["import {\n type MediaTextTrackState,\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailImage,\n type ThumbnailResizeResult,\n} from '@videojs/core';\nimport type { ThumbnailApi } from '@videojs/core/dom';\nimport { applyElementProps, applyStateDataAttrs, createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: inline-block;\n overflow: hidden;\n}\nimg {\n display: block;\n}`;\n\nexport class ThumbnailElement extends MediaElement {\n static readonly tagName = 'media-thumbnail';\n\n static override properties = {\n time: { type: Number },\n crossOrigin: { type: String, attribute: 'crossorigin' },\n loading: { type: String },\n fetchPriority: { type: String, attribute: 'fetchpriority' },\n } satisfies PropertyDeclarationMap<keyof ThumbnailCore.Props>;\n\n time = 0;\n crossOrigin: ThumbnailCore.Props['crossOrigin'];\n loading: ThumbnailCore.Props['loading'];\n fetchPriority: ThumbnailCore.Props['fetchPriority'];\n\n readonly #core = new ThumbnailCore();\n readonly #img = document.createElement('img');\n readonly #textTracks = new PlayerController(this, playerContext, selectTextTrack);\n\n #thumbnails: ThumbnailImage[] = [];\n #externalThumbnails: ThumbnailImage[] | undefined;\n #lastTextTrack: MediaTextTrackState | undefined;\n #api: ThumbnailApi | null = null;\n\n constructor() {\n super();\n\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = SHADOW_CSS;\n shadow.appendChild(style);\n\n this.#img.alt = '';\n this.#img.setAttribute('part', 'img');\n this.#img.setAttribute('aria-hidden', 'true');\n this.#img.setAttribute('decoding', 'async');\n shadow.appendChild(this.#img);\n }\n\n /**\n * Set thumbnail images directly, bypassing the automatic `<track>` detection.\n * When set, this takes priority over the text track path.\n */\n get thumbnails(): ThumbnailImage[] | undefined {\n return this.#externalThumbnails;\n }\n\n set thumbnails(value: ThumbnailImage[] | undefined) {\n this.#externalThumbnails = value;\n this.requestUpdate();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#api = createThumbnail({\n getContainer: () => this,\n getImg: () => this.#img,\n onStateChange: () => this.requestUpdate(),\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n }\n\n override destroyCallback(): void {\n this.#api?.destroy();\n super.destroyCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n if (this.#externalThumbnails) {\n this.#thumbnails = this.#externalThumbnails;\n } else {\n const textTrack = this.#textTracks.value;\n\n if (textTrack !== this.#lastTextTrack) {\n this.#lastTextTrack = textTrack;\n this.#thumbnails =\n textTrack && textTrack.thumbnailCues.length > 0\n ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined)\n : [];\n }\n }\n\n const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);\n\n // Sync img attributes from element properties.\n applyElementProps(this.#img, {\n crossorigin: this.crossOrigin || undefined,\n loading: this.loading,\n fetchpriority: this.fetchPriority,\n });\n\n // Track src changes via the thumbnail API.\n this.#api?.updateSrc(thumbnail?.url);\n\n if (!thumbnail) {\n this.#img.removeAttribute('src');\n this.#resetStyles();\n\n const state = this.#core.getState(false, false, undefined);\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n return;\n }\n\n // Set the img src directly (imperative DOM).\n if (this.#img.getAttribute('src') !== thumbnail.url) {\n this.#img.src = thumbnail.url;\n }\n\n const api = this.#api;\n const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n\n if (api?.naturalWidth && api.naturalHeight) {\n const constraints = api.readConstraints();\n const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);\n\n if (result) {\n this.#applyResize(result);\n }\n }\n }\n\n #applyResize(result: ThumbnailResizeResult): void {\n this.style.width = `${result.containerWidth}px`;\n this.style.height = `${result.containerHeight}px`;\n\n const imgStyle = this.#img.style;\n imgStyle.width = `${result.imageWidth}px`;\n imgStyle.height = `${result.imageHeight}px`;\n imgStyle.maxWidth = 'none';\n imgStyle.transform =\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : '';\n }\n\n #resetStyles(): void {\n this.style.width = '';\n this.style.height = '';\n\n const imgStyle = this.#img.style;\n imgStyle.width = '';\n imgStyle.height = '';\n imgStyle.maxWidth = '';\n imgStyle.transform = '';\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thumbnail-element.js","names":["#core","#img","#textTracks","#externalThumbnails","#api","#thumbnails","#lastTextTrack","#resetStyles","#applyResize"],"sources":["../../../../src/ui/thumbnail/thumbnail-element.ts"],"sourcesContent":["import {\n type MediaTextTrackState,\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailImage,\n type ThumbnailResizeResult,\n} from '@videojs/core';\nimport type { ThumbnailApi } from '@videojs/core/dom';\nimport { applyElementProps, applyStateDataAttrs, createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: inline-block;\n overflow: hidden;\n}\nimg {\n display: block;\n}`;\n\nexport class ThumbnailElement extends MediaElement {\n static readonly tagName = 'media-thumbnail';\n\n static override properties = {\n time: { type: Number },\n crossOrigin: { type: String, attribute: 'crossorigin' },\n loading: { type: String },\n fetchPriority: { type: String, attribute: 'fetchpriority' },\n } satisfies PropertyDeclarationMap<keyof ThumbnailCore.Props>;\n\n time = 0;\n crossOrigin: ThumbnailCore.Props['crossOrigin'];\n loading: ThumbnailCore.Props['loading'];\n fetchPriority: ThumbnailCore.Props['fetchPriority'];\n\n readonly #core = new ThumbnailCore();\n readonly #img = document.createElement('img');\n readonly #textTracks = new PlayerController(this, playerContext, selectTextTrack);\n\n #thumbnails: ThumbnailImage[] = [];\n #externalThumbnails: ThumbnailImage[] | undefined;\n #lastTextTrack: MediaTextTrackState | undefined;\n #api: ThumbnailApi | null = null;\n\n constructor() {\n super();\n\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = SHADOW_CSS;\n shadow.appendChild(style);\n\n this.#img.alt = '';\n this.#img.setAttribute('part', 'img');\n this.#img.setAttribute('aria-hidden', 'true');\n this.#img.setAttribute('decoding', 'async');\n shadow.appendChild(this.#img);\n }\n\n /**\n * Set thumbnail images directly, bypassing the automatic `<track>` detection.\n * When set, this takes priority over the text track path.\n */\n get thumbnails(): ThumbnailImage[] | undefined {\n return this.#externalThumbnails;\n }\n\n set thumbnails(value: ThumbnailImage[] | undefined) {\n this.#externalThumbnails = value;\n this.requestUpdate();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#api = createThumbnail({\n getContainer: () => this,\n getImg: () => this.#img,\n onStateChange: () => this.requestUpdate(),\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n }\n\n override destroyCallback(): void {\n this.#api?.destroy();\n super.destroyCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n if (this.#externalThumbnails) {\n this.#thumbnails = this.#externalThumbnails;\n } else {\n const textTrack = this.#textTracks.value;\n\n if (textTrack !== this.#lastTextTrack) {\n this.#lastTextTrack = textTrack;\n this.#thumbnails =\n textTrack && textTrack.thumbnailCues.length > 0\n ? mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined)\n : [];\n }\n }\n\n const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);\n\n // Sync img attributes from element properties.\n applyElementProps(this.#img, {\n crossorigin: this.crossOrigin || undefined,\n loading: this.loading,\n fetchpriority: this.fetchPriority,\n });\n\n // Track src changes via the thumbnail API.\n this.#api?.updateSrc(thumbnail?.url);\n\n if (!thumbnail) {\n this.#img.removeAttribute('src');\n this.#resetStyles();\n\n const state = this.#core.getState(false, false, undefined);\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n return;\n }\n\n // Set the img src directly (imperative DOM).\n if (this.#img.getAttribute('src') !== thumbnail.url) {\n this.#img.src = thumbnail.url;\n }\n\n const api = this.#api;\n const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n\n if (api?.naturalWidth && api.naturalHeight) {\n const constraints = api.readConstraints();\n const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);\n\n if (result) {\n this.#applyResize(result);\n }\n }\n }\n\n #applyResize(result: ThumbnailResizeResult): void {\n this.style.width = `${result.containerWidth}px`;\n this.style.height = `${result.containerHeight}px`;\n\n const imgStyle = this.#img.style;\n imgStyle.width = `${result.imageWidth}px`;\n imgStyle.height = `${result.imageHeight}px`;\n imgStyle.maxWidth = 'none';\n imgStyle.transform =\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : '';\n }\n\n #resetStyles(): void {\n this.style.width = '';\n this.style.height = '';\n\n const imgStyle = this.#img.style;\n imgStyle.width = '';\n imgStyle.height = '';\n imgStyle.maxWidth = '';\n imgStyle.transform = '';\n }\n}\n"],"mappings":"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"}
@@ -10,6 +10,10 @@ var TimeElement = class extends MediaElement {
10
10
  this.type = TimeCore.defaultProps.type;
11
11
  this.negativeSign = TimeCore.defaultProps.negativeSign;
12
12
  this.label = TimeCore.defaultProps.label;
13
+ this.#core = new TimeCore();
14
+ this.#state = new PlayerController(this, playerContext, selectTime);
15
+ this.#signSpan = document.createElement("span");
16
+ this.#textNode = document.createTextNode("");
13
17
  }
14
18
  static {
15
19
  this.tagName = "media-time";
@@ -24,10 +28,10 @@ var TimeElement = class extends MediaElement {
24
28
  label: { type: String }
25
29
  };
26
30
  }
27
- #core = new TimeCore();
28
- #state = new PlayerController(this, playerContext, selectTime);
29
- #signSpan = document.createElement("span");
30
- #textNode = document.createTextNode("");
31
+ #core;
32
+ #state;
33
+ #signSpan;
34
+ #textNode;
31
35
  connectedCallback() {
32
36
  super.connectedCallback();
33
37
  if (!this.#signSpan.parentNode) {
@@ -1 +1 @@
1
- {"version":3,"file":"time-element.js","names":["#core","#state","#signSpan","#textNode"],"sources":["../../../../src/ui/time/time-element.ts"],"sourcesContent":["import { TimeCore, TimeDataAttrs, type TimeType } from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, logMissingFeature, selectTime } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nexport class TimeElement extends MediaElement {\n static readonly tagName = 'media-time';\n\n static override properties = {\n type: { type: String },\n negativeSign: { type: String, attribute: 'negative-sign' },\n label: { type: String },\n } satisfies PropertyDeclarationMap<keyof TimeCore.Props>;\n\n type: TimeType = TimeCore.defaultProps.type;\n negativeSign = TimeCore.defaultProps.negativeSign;\n label = TimeCore.defaultProps.label;\n\n readonly #core = new TimeCore();\n readonly #state = new PlayerController(this, playerContext, selectTime);\n\n readonly #signSpan = document.createElement('span');\n readonly #textNode = document.createTextNode('');\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (!this.#signSpan.parentNode) {\n this.#signSpan.setAttribute('aria-hidden', 'true');\n this.#signSpan.hidden = true;\n this.appendChild(this.#signSpan);\n this.appendChild(this.#textNode);\n }\n\n if (__DEV__ && !this.#state.value) {\n logMissingFeature(this.localName, this.#state.displayName!);\n }\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\n const media = this.#state.value;\n\n if (!media) return;\n\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n this.#signSpan.hidden = !state.negative;\n this.#signSpan.textContent = state.negative ? this.negativeSign : '';\n this.#textNode.textContent = state.text;\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, TimeDataAttrs);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,cAAb,cAAiC,aAAa;;;cAS3B,SAAS,aAAa;sBACxB,SAAS,aAAa;eAC7B,SAAS,aAAa;;;iBAVJ;;;oBAEG;GAC3B,MAAM,EAAE,MAAM,QAAQ;GACtB,cAAc;IAAE,MAAM;IAAQ,WAAW;IAAiB;GAC1D,OAAO,EAAE,MAAM,QAAQ;GACxB;;CAMD,QAAiB,IAAI,UAAU;CAC/B,SAAkB,IAAI,iBAAiB,MAAM,eAAe,WAAW;CAEvE,YAAqB,SAAS,cAAc,OAAO;CACnD,YAAqB,SAAS,eAAe,GAAG;CAEhD,oBAAmC;AACjC,QAAM,mBAAmB;AAEzB,MAAI,CAAC,MAAA,SAAe,YAAY;AAC9B,SAAA,SAAe,aAAa,eAAe,OAAO;AAClD,SAAA,SAAe,SAAS;AACxB,QAAK,YAAY,MAAA,SAAe;AAChC,QAAK,YAAY,MAAA,SAAe;;;CAQpC,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,QAAA,KAAW,SAAS,KAAK;;CAG3B,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;EAErB,MAAM,QAAQ,MAAA,MAAY;AAE1B,MAAI,CAAC,MAAO;AAEZ,QAAA,KAAW,SAAS,MAAM;EAC1B,MAAM,QAAQ,MAAA,KAAW,UAAU;AAEnC,QAAA,SAAe,SAAS,CAAC,MAAM;AAC/B,QAAA,SAAe,cAAc,MAAM,WAAW,KAAK,eAAe;AAClE,QAAA,SAAe,cAAc,MAAM;AAEnC,oBAAkB,MAAM,MAAA,KAAW,SAAS,MAAM,CAAC;AACnD,sBAAoB,MAAM,OAAO,cAAc"}
1
+ {"version":3,"file":"time-element.js","names":["#core","#state","#signSpan","#textNode"],"sources":["../../../../src/ui/time/time-element.ts"],"sourcesContent":["import { TimeCore, TimeDataAttrs, type TimeType } from '@videojs/core';\nimport { applyElementProps, applyStateDataAttrs, logMissingFeature, selectTime } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nexport class TimeElement extends MediaElement {\n static readonly tagName = 'media-time';\n\n static override properties = {\n type: { type: String },\n negativeSign: { type: String, attribute: 'negative-sign' },\n label: { type: String },\n } satisfies PropertyDeclarationMap<keyof TimeCore.Props>;\n\n type: TimeType = TimeCore.defaultProps.type;\n negativeSign = TimeCore.defaultProps.negativeSign;\n label = TimeCore.defaultProps.label;\n\n readonly #core = new TimeCore();\n readonly #state = new PlayerController(this, playerContext, selectTime);\n\n readonly #signSpan = document.createElement('span');\n readonly #textNode = document.createTextNode('');\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (!this.#signSpan.parentNode) {\n this.#signSpan.setAttribute('aria-hidden', 'true');\n this.#signSpan.hidden = true;\n this.appendChild(this.#signSpan);\n this.appendChild(this.#textNode);\n }\n\n if (__DEV__ && !this.#state.value) {\n logMissingFeature(this.localName, this.#state.displayName!);\n }\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\n const media = this.#state.value;\n\n if (!media) return;\n\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n this.#signSpan.hidden = !state.negative;\n this.#signSpan.textContent = state.negative ? this.negativeSign : '';\n this.#textNode.textContent = state.text;\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, TimeDataAttrs);\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,cAAb,cAAiC,aAAa;;;cAS3B,SAAS,aAAa;sBACxB,SAAS,aAAa;eAC7B,SAAS,aAAa;eAEb,IAAI,UAAU;gBACb,IAAI,iBAAiB,MAAM,eAAe,WAAW;mBAElD,SAAS,cAAc,OAAO;mBAC9B,SAAS,eAAe,GAAG;;;iBAhBtB;;;oBAEG;GAC3B,MAAM,EAAE,MAAM,QAAQ;GACtB,cAAc;IAAE,MAAM;IAAQ,WAAW;IAAiB;GAC1D,OAAO,EAAE,MAAM,QAAQ;GACxB;;CAMD;CACA;CAEA;CACA;CAEA,oBAAmC;AACjC,QAAM,mBAAmB;AAEzB,MAAI,CAAC,MAAA,SAAe,YAAY;AAC9B,SAAA,SAAe,aAAa,eAAe,OAAO;AAClD,SAAA,SAAe,SAAS;AACxB,QAAK,YAAY,MAAA,SAAe;AAChC,QAAK,YAAY,MAAA,SAAe;;;CAQpC,WAA8B,SAA+B;AAC3D,QAAM,WAAW,QAAQ;AACzB,QAAA,KAAW,SAAS,KAAK;;CAG3B,OAA0B,SAA+B;AACvD,QAAM,OAAO,QAAQ;EAErB,MAAM,QAAQ,MAAA,MAAY;AAE1B,MAAI,CAAC,MAAO;AAEZ,QAAA,KAAW,SAAS,MAAM;EAC1B,MAAM,QAAQ,MAAA,KAAW,UAAU;AAEnC,QAAA,SAAe,SAAS,CAAC,MAAM;AAC/B,QAAA,SAAe,cAAc,MAAM,WAAW,KAAK,eAAe;AAClE,QAAA,SAAe,cAAc,MAAM;AAEnC,oBAAkB,MAAM,MAAA,KAAW,SAAS,MAAM,CAAC;AACnD,sBAAoB,MAAM,OAAO,cAAc"}
@@ -18,6 +18,12 @@ var TimeSliderElement = class extends MediaElement {
18
18
  this.orientation = TimeSliderCore.defaultProps.orientation;
19
19
  this.disabled = TimeSliderCore.defaultProps.disabled;
20
20
  this.thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;
21
+ this.#core = new TimeSliderCore();
22
+ this.#provider = new ContextProvider(this, { context: sliderContext });
23
+ this.#timeState = new PlayerController(this, playerContext, selectTime);
24
+ this.#bufferState = new PlayerController(this, playerContext, selectBuffer);
25
+ this.#slider = null;
26
+ this.#disconnect = null;
21
27
  }
22
28
  static {
23
29
  this.tagName = "media-time-slider";
@@ -42,12 +48,12 @@ var TimeSliderElement = class extends MediaElement {
42
48
  }
43
49
  };
44
50
  }
45
- #core = new TimeSliderCore();
46
- #provider = new ContextProvider(this, { context: sliderContext });
47
- #timeState = new PlayerController(this, playerContext, selectTime);
48
- #bufferState = new PlayerController(this, playerContext, selectBuffer);
49
- #slider = null;
50
- #disconnect = null;
51
+ #core;
52
+ #provider;
53
+ #timeState;
54
+ #bufferState;
55
+ #slider;
56
+ #disconnect;
51
57
  connectedCallback() {
52
58
  super.connectedCallback();
53
59
  if (this.destroyed) return;
@@ -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 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
+ {"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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"}
@@ -21,6 +21,14 @@ var TooltipElement = class extends MediaElement {
21
21
  this.closeDelay = TooltipCore.defaultProps.closeDelay;
22
22
  this.disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup;
23
23
  this.disabled = TooltipCore.defaultProps.disabled;
24
+ this.#core = new TooltipCore();
25
+ this.#groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
26
+ this.#position = new PositionController(this);
27
+ this.#tooltip = null;
28
+ this.#snapshot = null;
29
+ this.#disconnect = null;
30
+ this.#triggerAbort = null;
31
+ this.#currentTrigger = null;
24
32
  }
25
33
  static {
26
34
  this.tagName = "media-tooltip";
@@ -46,14 +54,14 @@ var TooltipElement = class extends MediaElement {
46
54
  disabled: { type: Boolean }
47
55
  };
48
56
  }
49
- #core = new TooltipCore();
50
- #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
51
- #position = new PositionController(this);
52
- #tooltip = null;
53
- #snapshot = null;
54
- #disconnect = null;
55
- #triggerAbort = null;
56
- #currentTrigger = null;
57
+ #core;
58
+ #groupConsumer;
59
+ #position;
60
+ #tooltip;
61
+ #snapshot;
62
+ #disconnect;
63
+ #triggerAbort;
64
+ #currentTrigger;
57
65
  connectedCallback() {
58
66
  super.connectedCallback();
59
67
  if (this.destroyed) return;
@@ -1 +1 @@
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":"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"}
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":"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"}
@@ -9,6 +9,11 @@ var TooltipGroupElement = class extends MediaElement {
9
9
  this.delay = TooltipGroupCore.defaultProps.delay;
10
10
  this.closeDelay = TooltipGroupCore.defaultProps.closeDelay;
11
11
  this.timeout = TooltipGroupCore.defaultProps.timeout;
12
+ this.#core = new TooltipGroupCore();
13
+ this.#provider = new ContextProvider(this, {
14
+ context: tooltipGroupContext,
15
+ initialValue: this.#core
16
+ });
12
17
  }
13
18
  static {
14
19
  this.tagName = "media-tooltip-group";
@@ -23,11 +28,8 @@ var TooltipGroupElement = class extends MediaElement {
23
28
  timeout: { type: Number }
24
29
  };
25
30
  }
26
- #core = new TooltipGroupCore();
27
- #provider = new ContextProvider(this, {
28
- context: tooltipGroupContext,
29
- initialValue: this.#core
30
- });
31
+ #core;
32
+ #provider;
31
33
  update(_changed) {
32
34
  super.update(_changed);
33
35
  this.#core.setProps(this);
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-group-element.js","names":["#core","#provider"],"sources":["../../../../src/ui/tooltip/tooltip-group-element.ts"],"sourcesContent":["import { TooltipGroupCore } from '@videojs/core';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport { MediaElement } from '../media-element';\nimport { tooltipGroupContext } from './context';\n\nexport class TooltipGroupElement extends MediaElement {\n static readonly tagName = 'media-tooltip-group';\n\n static override properties = {\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n timeout: { type: Number },\n } satisfies PropertyDeclarationMap<keyof TooltipGroupCore.Props>;\n\n delay = TooltipGroupCore.defaultProps.delay;\n closeDelay = TooltipGroupCore.defaultProps.closeDelay;\n timeout = TooltipGroupCore.defaultProps.timeout;\n\n readonly #core = new TooltipGroupCore();\n readonly #provider = new ContextProvider(this, { context: tooltipGroupContext, initialValue: this.#core });\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n this.#core.setProps(this);\n this.#provider.setValue(this.#core);\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,sBAAb,cAAyC,aAAa;;;eAS5C,iBAAiB,aAAa;oBACzB,iBAAiB,aAAa;iBACjC,iBAAiB,aAAa;;;iBAVd;;;oBAEG;GAC3B,OAAO,EAAE,MAAM,QAAQ;GACvB,YAAY;IAAE,MAAM;IAAQ,WAAW;IAAe;GACtD,SAAS,EAAE,MAAM,QAAQ;GAC1B;;CAMD,QAAiB,IAAI,kBAAkB;CACvC,YAAqB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAqB,cAAc,MAAA;EAAY,CAAC;CAE1G,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;AACtB,QAAA,KAAW,SAAS,KAAK;AACzB,QAAA,SAAe,SAAS,MAAA,KAAW"}
1
+ {"version":3,"file":"tooltip-group-element.js","names":["#core","#provider"],"sources":["../../../../src/ui/tooltip/tooltip-group-element.ts"],"sourcesContent":["import { TooltipGroupCore } from '@videojs/core';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\n\nimport { MediaElement } from '../media-element';\nimport { tooltipGroupContext } from './context';\n\nexport class TooltipGroupElement extends MediaElement {\n static readonly tagName = 'media-tooltip-group';\n\n static override properties = {\n delay: { type: Number },\n closeDelay: { type: Number, attribute: 'close-delay' },\n timeout: { type: Number },\n } satisfies PropertyDeclarationMap<keyof TooltipGroupCore.Props>;\n\n delay = TooltipGroupCore.defaultProps.delay;\n closeDelay = TooltipGroupCore.defaultProps.closeDelay;\n timeout = TooltipGroupCore.defaultProps.timeout;\n\n readonly #core = new TooltipGroupCore();\n readonly #provider = new ContextProvider(this, { context: tooltipGroupContext, initialValue: this.#core });\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n this.#core.setProps(this);\n this.#provider.setValue(this.#core);\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,sBAAb,cAAyC,aAAa;;;eAS5C,iBAAiB,aAAa;oBACzB,iBAAiB,aAAa;iBACjC,iBAAiB,aAAa;eAEvB,IAAI,kBAAkB;mBAClB,IAAI,gBAAgB,MAAM;GAAE,SAAS;GAAqB,cAAc,MAAA;GAAY,CAAC;;;iBAbhF;;;oBAEG;GAC3B,OAAO,EAAE,MAAM,QAAQ;GACvB,YAAY;IAAE,MAAM;IAAQ,WAAW;IAAe;GACtD,SAAS,EAAE,MAAM,QAAQ;GAC1B;;CAMD;CACA;CAEA,OAA0B,UAAgC;AACxD,QAAM,OAAO,SAAS;AACtB,QAAA,KAAW,SAAS,KAAK;AACzB,QAAA,SAAe,SAAS,MAAA,KAAW"}