@videojs/html 10.0.0-beta.28 → 10.0.0-beta.29
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.
- package/cdn/{adapter-XTen-YVQ.js → adapter-CEnNWvii.js} +17 -4
- package/cdn/adapter-CEnNWvii.js.map +1 -0
- package/cdn/adapter-DaKW8NzI.js +2 -0
- package/cdn/adapter-DaKW8NzI.js.map +1 -0
- package/cdn/audio-headless.dev.js +1 -1
- package/cdn/audio-headless.js +1 -1
- package/cdn/audio-minimal-ui.dev.js +2 -2
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +5 -5
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +2 -2
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +5 -5
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background.dev.js +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/compounds-C4YYLyL2.js +8 -0
- package/cdn/compounds-C4YYLyL2.js.map +1 -0
- package/cdn/{compounds-nk9RJtBK.js → compounds-C73u1MeO.js} +63 -59
- package/cdn/compounds-C73u1MeO.js.map +1 -0
- package/cdn/create-player-BU8LDJDL.js +2 -0
- package/cdn/create-player-BU8LDJDL.js.map +1 -0
- package/cdn/{create-player-DK9WOywd.js → create-player-Db1CIvlK.js} +58 -46
- package/cdn/create-player-Db1CIvlK.js.map +1 -0
- package/cdn/{default-BqQDVloS.js → default-A3aM0skz.js} +2 -2
- package/cdn/default-A3aM0skz.js.map +1 -0
- package/cdn/default-BDyhiTCm.js +2 -0
- package/cdn/default-BDyhiTCm.js.map +1 -0
- package/cdn/{default-I2LasfxC.js → default-C1_k1NeB.js} +2 -2
- package/cdn/default-C1_k1NeB.js.map +1 -0
- package/cdn/default-DHrMd4ie.js +2 -0
- package/cdn/default-DHrMd4ie.js.map +1 -0
- package/cdn/error-surface-BID4D3DW.js +59 -0
- package/cdn/error-surface-BID4D3DW.js.map +1 -0
- package/cdn/{select-tracks-nRPBa1NC.js → error-surface-D0bo71gD.js} +442 -48
- package/cdn/error-surface-D0bo71gD.js.map +1 -0
- package/cdn/gesture-element-CeRy1IVs.js +2 -0
- package/cdn/gesture-element-CeRy1IVs.js.map +1 -0
- package/cdn/{gesture-element-6Ld1YwIL.js → gesture-element-DB67OYCE.js} +3 -3
- package/cdn/gesture-element-DB67OYCE.js.map +1 -0
- package/cdn/{hls-js-C4P_b2tT.js → hls-js-CiE4wOrG.js} +2 -2
- package/cdn/{hls-js-C4P_b2tT.js.map → hls-js-CiE4wOrG.js.map} +1 -1
- package/cdn/{hls-js-CATW7NBm.js → hls-js-DBKRCbQm.js} +2 -2
- package/cdn/{hls-js-CATW7NBm.js.map → hls-js-DBKRCbQm.js.map} +1 -1
- package/cdn/{hls-js-BEuVm0u9.js → hls-js-DX2NGCAr.js} +2 -2
- package/cdn/{hls-js-BEuVm0u9.js.map → hls-js-DX2NGCAr.js.map} +1 -1
- package/cdn/{hls-js-WCNy9MVh.js → hls-js-JeH8yvsP.js} +2 -2
- package/cdn/{hls-js-WCNy9MVh.js.map → hls-js-JeH8yvsP.js.map} +1 -1
- package/cdn/i18n-CpBDXf6M.js +2 -0
- package/cdn/{i18n-Dc7WM2xd.js.map → i18n-CpBDXf6M.js.map} +1 -1
- package/cdn/{i18n-Ch4t6EjV.js → i18n-D0nhPa0m.js} +2 -2
- package/cdn/{i18n-Ch4t6EjV.js.map → i18n-D0nhPa0m.js.map} +1 -1
- package/cdn/{live-button-element-DaHgnYdw.js → live-button-element-Co8z2LkI.js} +2 -2
- package/cdn/{live-button-element-DaHgnYdw.js.map → live-button-element-Co8z2LkI.js.map} +1 -1
- package/cdn/{live-button-element-Bae44kBN.js → live-button-element-zE-8uoR2.js} +3 -3
- package/cdn/{live-button-element-Bae44kBN.js.map → live-button-element-zE-8uoR2.js.map} +1 -1
- package/cdn/live-video-minimal.dev.js +11 -9
- package/cdn/live-video-minimal.dev.js.map +1 -1
- package/cdn/live-video-minimal.js +1 -1
- package/cdn/live-video-minimal.js.map +1 -1
- package/cdn/live-video.dev.js +12 -10
- package/cdn/live-video.dev.js.map +1 -1
- package/cdn/live-video.js +1 -1
- package/cdn/live-video.js.map +1 -1
- package/cdn/media/hls-audio.dev.js +1 -1
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-background-video.dev.js +1 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-video.dev.js +1 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/mux-audio/hls-js.dev.js +1 -1
- package/cdn/media/mux-audio/hls-js.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +2 -2
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-audio.dev.js +1 -1
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-background-video.dev.js +1 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-data.dev.js +1 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +1 -1
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/hls-js.dev.js +1 -1
- package/cdn/media/mux-video/hls-js.js +1 -1
- package/cdn/media/mux-video/spf.dev.js +2 -2
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/mux-video.dev.js +1 -1
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/vimeo-video.dev.js +27 -5
- package/cdn/media/vimeo-video.dev.js.map +1 -1
- package/cdn/media/vimeo-video.js +1 -1
- package/cdn/media/vimeo-video.js.map +1 -1
- package/cdn/{media-Uxm0d3Vx.js → media-BI8caj07.js} +3 -3
- package/cdn/{media-Uxm0d3Vx.js.map → media-BI8caj07.js.map} +1 -1
- package/cdn/{media-COIe3uI5.js → media-BNuI0Im7.js} +19 -6
- package/cdn/media-BNuI0Im7.js.map +1 -0
- package/cdn/media-CQxFuDcv.js +2 -0
- package/cdn/{media-CPVSKLdk.js.map → media-CQxFuDcv.js.map} +1 -1
- package/cdn/media-D4tG62L5.js +2 -0
- package/cdn/{media-BTipOcKo.js.map → media-D4tG62L5.js.map} +1 -1
- package/cdn/{media-oa3nyL2o.js → media-DI6DvYm3.js} +3 -3
- package/cdn/{media-oa3nyL2o.js.map → media-DI6DvYm3.js.map} +1 -1
- package/cdn/media-DU3Xf5XR.js +2 -0
- package/cdn/media-DU3Xf5XR.js.map +1 -0
- package/cdn/media-mYKOAsk3.js +825 -0
- package/cdn/media-mYKOAsk3.js.map +1 -0
- package/cdn/media-zReLnePj.js +2 -0
- package/cdn/media-zReLnePj.js.map +1 -0
- package/cdn/{minimal-DQCLKRyR.js → minimal-3OmH0xQS.js} +2 -2
- package/cdn/minimal-3OmH0xQS.js.map +1 -0
- package/cdn/{minimal-DLosvq31.js → minimal-6w_Vyyl9.js} +2 -2
- package/cdn/minimal-6w_Vyyl9.js.map +1 -0
- package/cdn/minimal-BWLTn7oQ.js +2 -0
- package/cdn/minimal-BWLTn7oQ.js.map +1 -0
- package/cdn/minimal-DIGrklyh.js +2 -0
- package/cdn/minimal-DIGrklyh.js.map +1 -0
- package/cdn/{minimal-ui-CRKvUmB8.js → minimal-ui-BCIESK8f.js} +8 -8
- package/cdn/{minimal-ui-CRKvUmB8.js.map → minimal-ui-BCIESK8f.js.map} +1 -1
- package/cdn/minimal-ui-BXrq3z4U.js +2 -0
- package/cdn/{minimal-ui-Et2Wcn7r.js.map → minimal-ui-BXrq3z4U.js.map} +1 -1
- package/cdn/{minimal-ui-BpHxIo4z.js → minimal-ui-DEalpMk6.js} +4 -4
- package/cdn/{minimal-ui-BpHxIo4z.js.map → minimal-ui-DEalpMk6.js.map} +1 -1
- package/cdn/{minimal-ui-8iRZf_72.js → minimal-ui-vY3QgohH.js} +2 -2
- package/cdn/{minimal-ui-8iRZf_72.js.map → minimal-ui-vY3QgohH.js.map} +1 -1
- package/cdn/{player-DM9rUXg-.js → player-B3GlPF90.js} +2 -2
- package/cdn/{player-DM9rUXg-.js.map → player-B3GlPF90.js.map} +1 -1
- package/cdn/player-CtTC7qa5.js +2 -0
- package/cdn/{player-rCFqzWrA.js.map → player-CtTC7qa5.js.map} +1 -1
- package/cdn/player-DKkph8UM.js +2 -0
- package/cdn/{player-BRQLp5bX.js.map → player-DKkph8UM.js.map} +1 -1
- package/cdn/{player-CKTAtwit.js → player-DPDmTRvg.js} +2 -2
- package/cdn/{player-CKTAtwit.js.map → player-DPDmTRvg.js.map} +1 -1
- package/cdn/player-DrDd7LJi.js +2 -0
- package/cdn/{player-BloX4l6F.js.map → player-DrDd7LJi.js.map} +1 -1
- package/cdn/{player-B2oraRyD.js → player-L5UpZmT4.js} +2 -2
- package/cdn/{player-B2oraRyD.js.map → player-L5UpZmT4.js.map} +1 -1
- package/cdn/{poster-element-BGr1VQJB.js → poster-element-B5tdJ2ub.js} +179 -38
- package/cdn/poster-element-B5tdJ2ub.js.map +1 -0
- package/cdn/poster-element-B8QwXSU_.js +2 -0
- package/cdn/poster-element-B8QwXSU_.js.map +1 -0
- package/cdn/{error-surface-drmCvBVW.js → relocation-pipelines-Dh8CcgHw.js} +5 -343
- package/cdn/relocation-pipelines-Dh8CcgHw.js.map +1 -0
- package/cdn/relocation-pipelines-DunE4gcV.js +2 -0
- package/cdn/relocation-pipelines-DunE4gcV.js.map +1 -0
- package/cdn/{seek-button-element-XMTLIxZj.js → seek-button-element-5co-k0Dx.js} +4 -4
- package/cdn/seek-button-element-5co-k0Dx.js.map +1 -0
- package/cdn/{seek-button-element-FlgBVoGM.js → seek-button-element-B8TkILg-.js} +2 -2
- package/cdn/{seek-button-element-FlgBVoGM.js.map → seek-button-element-B8TkILg-.js.map} +1 -1
- package/cdn/shallow-equal-C7S8rj2f.js +16 -0
- package/cdn/shallow-equal-C7S8rj2f.js.map +1 -0
- package/cdn/shallow-equal-KV1zFqZi.js +2 -0
- package/cdn/shallow-equal-KV1zFqZi.js.map +1 -0
- package/cdn/{skin-element-DL-Kqa5f.js → skin-element-DrkI8xuM.js} +2 -2
- package/cdn/{skin-element-DL-Kqa5f.js.map → skin-element-DrkI8xuM.js.map} +1 -1
- package/cdn/{skin-element-DNytI-uu.js → skin-element-DvX6Bxsv.js} +2 -2
- package/cdn/{skin-element-DNytI-uu.js.map → skin-element-DvX6Bxsv.js.map} +1 -1
- package/cdn/{text-element-DeWBNKXb.js → text-element-BoY6AhMn.js} +2 -2
- package/cdn/{text-element-DeWBNKXb.js.map → text-element-BoY6AhMn.js.map} +1 -1
- package/cdn/{text-element-D88ArbZz.js → text-element-cg6l21cd.js} +2 -2
- package/cdn/{text-element-D88ArbZz.js.map → text-element-cg6l21cd.js.map} +1 -1
- package/cdn/time-slider-chapters-element-BfLjdnU4.js +2 -0
- package/cdn/time-slider-chapters-element-BfLjdnU4.js.map +1 -0
- package/cdn/{time-slider-chapters-element-DJ0abZXI.js → time-slider-chapters-element-CznFQWFm.js} +5 -5
- package/cdn/time-slider-chapters-element-CznFQWFm.js.map +1 -0
- package/cdn/{ui-BU3_2gDQ.js → ui-BwzqkJNK.js} +7 -7
- package/cdn/{ui-BU3_2gDQ.js.map → ui-BwzqkJNK.js.map} +1 -1
- package/cdn/ui-DayfItun.js +2 -0
- package/cdn/{ui-C0isALTQ.js.map → ui-DayfItun.js.map} +1 -1
- package/cdn/ui-PSnD-pv8.js +2 -0
- package/cdn/{ui-DVpkE1MN.js.map → ui-PSnD-pv8.js.map} +1 -1
- package/cdn/{ui-BsaWWE4y.js → ui-fnKp94a7.js} +9 -9
- package/cdn/{ui-BsaWWE4y.js.map → ui-fnKp94a7.js.map} +1 -1
- package/cdn/video-headless.dev.js +1 -1
- package/cdn/video-headless.js +1 -1
- package/cdn/video-minimal-ui.dev.js +2 -2
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +8 -6
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +2 -2
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +9 -7
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/dist/default/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/default/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/default/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/default/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/default/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/default/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/default/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/default/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/default/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/default/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/default/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/default/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/default/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/default/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/default/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/default/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/default/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/default/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/default/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/default/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/default/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/default/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/default/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/default/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/default/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +103 -101
- package/dist/default/define/audio/skin.css +68 -69
- package/dist/default/define/live-audio/minimal-skin.css +103 -101
- package/dist/default/define/live-audio/skin.css +68 -69
- package/dist/default/define/live-video/minimal-skin.css +140 -120
- package/dist/default/define/live-video/minimal-skin.js +1 -1
- package/dist/default/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/live-video/skin.css +89 -76
- package/dist/default/define/live-video/skin.js +1 -1
- package/dist/default/define/live-video/skin.js.map +1 -1
- package/dist/default/define/live-video/skin.tailwind.js +1 -1
- package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/default/define/ui/gesture.js +7 -0
- package/dist/default/define/ui/gesture.js.map +1 -0
- package/dist/default/define/video/minimal-skin.css +140 -120
- package/dist/default/define/video/minimal-skin.js +1 -1
- package/dist/default/define/video/minimal-skin.js.map +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/video/skin.css +89 -76
- package/dist/default/define/video/skin.js +1 -1
- package/dist/default/define/video/skin.js.map +1 -1
- package/dist/default/define/video/skin.tailwind.js +1 -1
- package/dist/default/define/video/skin.tailwind.js.map +1 -1
- package/dist/default/icons/dist/element/default/icons.js +1 -1
- package/dist/default/icons/dist/element/default/icons.js.map +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/render/default/index.js +1 -1
- package/dist/default/icons/dist/render/default/index.js.map +1 -1
- package/dist/default/icons/dist/render/minimal/index.js +1 -1
- package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/default/media/hls-background-video/media.js +18 -0
- package/dist/default/media/hls-background-video/media.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +10 -10
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/default/store/provider-mixin.js +22 -8
- package/dist/default/store/provider-mixin.js.map +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/default/ui/gesture/gesture-element.js.map +1 -1
- package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/default/ui/menu/context.js.map +1 -1
- package/dist/default/ui/menu/menu-element.js +28 -27
- package/dist/default/ui/menu/menu-element.js.map +1 -1
- package/dist/default/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/default/ui/poster/poster-element.js +138 -8
- package/dist/default/ui/poster/poster-element.js.map +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
- package/dist/dev/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/dev/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/dev/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/dev/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/dev/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/dev/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/dev/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/dev/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/dev/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/dev/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/dev/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/dev/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +103 -101
- package/dist/dev/define/audio/skin.css +68 -69
- package/dist/dev/define/live-audio/minimal-skin.css +103 -101
- package/dist/dev/define/live-audio/skin.css +68 -69
- package/dist/dev/define/live-video/minimal-skin.css +140 -120
- package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-video/skin.css +89 -76
- package/dist/dev/define/live-video/skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.js +3 -1
- package/dist/dev/define/live-video/skin.js.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.js +4 -2
- package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/dev/define/ui/gesture.d.ts +8 -0
- package/dist/dev/define/ui/gesture.d.ts.map +1 -0
- package/dist/dev/define/ui/gesture.js +7 -0
- package/dist/dev/define/ui/gesture.js.map +1 -0
- package/dist/dev/define/video/minimal-skin.css +140 -120
- package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.js +3 -1
- package/dist/dev/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/video/skin.css +89 -76
- package/dist/dev/define/video/skin.d.ts.map +1 -1
- package/dist/dev/define/video/skin.js +3 -1
- package/dist/dev/define/video/skin.js.map +1 -1
- package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/skin.tailwind.js +4 -2
- package/dist/dev/define/video/skin.tailwind.js.map +1 -1
- package/dist/dev/media/hls-background-video/media.d.ts +16 -0
- package/dist/dev/media/hls-background-video/media.d.ts.map +1 -1
- package/dist/dev/media/hls-background-video/media.js +18 -0
- package/dist/dev/media/hls-background-video/media.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +10 -10
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/dev/store/provider-mixin.d.ts.map +1 -1
- package/dist/dev/store/provider-mixin.js +24 -8
- package/dist/dev/store/provider-mixin.js.map +1 -1
- package/dist/dev/store/types.d.ts +2 -2
- package/dist/dev/store/types.d.ts.map +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.d.ts +7 -7
- package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.d.ts +6 -6
- package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/dev/ui/menu/context.d.ts +8 -8
- package/dist/dev/ui/menu/context.d.ts.map +1 -1
- package/dist/dev/ui/menu/context.js.map +1 -1
- package/dist/dev/ui/menu/menu-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-element.js +28 -27
- package/dist/dev/ui/menu/menu-element.js.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/dev/ui/poster/poster-element.d.ts +20 -18
- package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster-element.js +145 -8
- package/dist/dev/ui/poster/poster-element.js.map +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.d.ts +2 -2
- package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/skins.md +91 -78
- package/docs/how-to/customize-skins.md +411 -377
- package/docs/reference/menu.md +3 -19
- package/docs/reference/popover.md +2 -2
- package/docs/reference/poster.md +211 -21
- package/docs/reference/slider.md +1 -1
- package/docs/reference/time-slider.md +1 -1
- package/docs/reference/tooltip.md +6 -6
- package/docs/reference/volume-slider.md +1 -1
- package/package.json +14 -9
- package/cdn/adapter-Bk03SAxn.js +0 -2
- package/cdn/adapter-Bk03SAxn.js.map +0 -1
- package/cdn/adapter-XTen-YVQ.js.map +0 -1
- package/cdn/compounds-BEO1d3ZM.js +0 -8
- package/cdn/compounds-BEO1d3ZM.js.map +0 -1
- package/cdn/compounds-nk9RJtBK.js.map +0 -1
- package/cdn/create-player-DK9WOywd.js.map +0 -1
- package/cdn/create-player-hSdQMP5p.js +0 -2
- package/cdn/create-player-hSdQMP5p.js.map +0 -1
- package/cdn/default-BqQDVloS.js.map +0 -1
- package/cdn/default-CXWVp2oG.js +0 -2
- package/cdn/default-CXWVp2oG.js.map +0 -1
- package/cdn/default-Dw6cIEqT.js +0 -2
- package/cdn/default-Dw6cIEqT.js.map +0 -1
- package/cdn/default-I2LasfxC.js.map +0 -1
- package/cdn/error-surface-DCT1m2p1.js +0 -2
- package/cdn/error-surface-DCT1m2p1.js.map +0 -1
- package/cdn/error-surface-drmCvBVW.js.map +0 -1
- package/cdn/gesture-element-6Ld1YwIL.js.map +0 -1
- package/cdn/gesture-element-BC48ucj9.js +0 -2
- package/cdn/gesture-element-BC48ucj9.js.map +0 -1
- package/cdn/i18n-Dc7WM2xd.js +0 -2
- package/cdn/media-BTipOcKo.js +0 -2
- package/cdn/media-Bmablv4g.js +0 -2
- package/cdn/media-Bmablv4g.js.map +0 -1
- package/cdn/media-COIe3uI5.js.map +0 -1
- package/cdn/media-CPVSKLdk.js +0 -2
- package/cdn/media-Dq4zmIJa.js +0 -2
- package/cdn/media-Dq4zmIJa.js.map +0 -1
- package/cdn/media-suYcjCG2.js +0 -445
- package/cdn/media-suYcjCG2.js.map +0 -1
- package/cdn/minimal-BedCvMBG.js +0 -2
- package/cdn/minimal-BedCvMBG.js.map +0 -1
- package/cdn/minimal-BoP112ye.js +0 -2
- package/cdn/minimal-BoP112ye.js.map +0 -1
- package/cdn/minimal-DLosvq31.js.map +0 -1
- package/cdn/minimal-DQCLKRyR.js.map +0 -1
- package/cdn/minimal-ui-Et2Wcn7r.js +0 -2
- package/cdn/player-BRQLp5bX.js +0 -2
- package/cdn/player-BloX4l6F.js +0 -2
- package/cdn/player-rCFqzWrA.js +0 -2
- package/cdn/poster-element-BGr1VQJB.js.map +0 -1
- package/cdn/poster-element-DBmgOyep.js +0 -2
- package/cdn/poster-element-DBmgOyep.js.map +0 -1
- package/cdn/seek-button-element-XMTLIxZj.js.map +0 -1
- package/cdn/select-tracks-nRPBa1NC.js.map +0 -1
- package/cdn/select-tracks-xV1s28xD.js +0 -59
- package/cdn/select-tracks-xV1s28xD.js.map +0 -1
- package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +0 -1
- package/cdn/time-slider-chapters-element-DW8YyJn8.js +0 -2
- package/cdn/time-slider-chapters-element-DW8YyJn8.js.map +0 -1
- package/cdn/ui-C0isALTQ.js +0 -2
- package/cdn/ui-DVpkE1MN.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-element.js","names":["#menu","#parentCtx","#triggerMetadata","#core","#provider","#position","#controlsState","#containerCtx","#popupGroupCtx","#disconnect","#handleContentKeyDown","#handleContentFocusOut","#snapshot","#releaseControlsVisibilityLock","#cleanupSizeObserver","#syncTriggerMetadata","#cleanupTrigger","#cleanupParentRegistration","#registeredParentMenu","#syncParentRegistration","#releaseControlsLock","#updateAsSubmenu","#updateAsRoot","#setTriggerMetadata","#syncTrigger","#currentTrigger","#submenuActive","#metadataTrigger","#clearTriggerMetadata","#triggerAbort"],"sources":["../../../../src/ui/menu/menu-element.ts"],"sourcesContent":["import { MenuCore, MenuDataAttrs, type MenuInput, POPUP_HOST_ATTR } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createTransition,\n getRootPositionOptions,\n isMenuNavigationKey,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n MenuPositioningCSSVars,\n observeMenuSize,\n type PositioningBoundary,\n selectControls,\n syncMenuSizeChain,\n type UIFocusEvent,\n type UIKeyboardEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { MediaElement } from '../media-element';\nimport { PositionController } from '../position-controller';\nimport { type MenuContextValue, type MenuTriggerMetadata, menuContext } from './context';\n\nconst defaultTriggerMetadata: MenuTriggerMetadata = {\n hint: '',\n disabled: false,\n};\n\nexport class MenuElement extends MediaElement {\n static readonly tagName: string = 'media-menu';\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 closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<\n 'open' | 'defaultOpen' | 'side' | 'align' | 'closeOnEscape' | 'closeOnOutsideClick' | 'boundary'\n >;\n\n open = MenuCore.defaultProps.open;\n defaultOpen = MenuCore.defaultProps.defaultOpen;\n side = MenuCore.defaultProps.side;\n align = MenuCore.defaultProps.align;\n closeOnEscape = MenuCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = MenuCore.defaultProps.closeOnOutsideClick;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new MenuCore();\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #position = new PositionController(this);\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n // Consume parent menu context — present when this is a nested (submenu) element.\n readonly #parentCtx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n #menu: MenuApi | null = null;\n #snapshot: SnapshotController<MenuInput> | null = null;\n #submenuActive = false;\n\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #cleanupSizeObserver: (() => void) | null = null;\n #currentTrigger: HTMLElement | null = null;\n #metadataTrigger: HTMLElement | null = null;\n #triggerMetadata = defaultTriggerMetadata;\n #releaseControlsLock: (() => void) | null = null;\n #registeredParentMenu: MenuApi | null = null;\n #cleanupParentRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n\n this.#disconnect = new AbortController();\n\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n group: () => (this.#parentCtx.value ? undefined : this.#popupGroupCtx.value),\n });\n\n // The element itself is the content (popup) for root menus.\n // Submenu detection happens in update() once parent context is available.\n this.#menu.setContentElement(this);\n\n applyElementProps(\n this,\n { onKeyDown: this.#handleContentKeyDown, onFocusOut: this.#handleContentFocusOut },\n { signal: this.#disconnect.signal }\n );\n\n if (this.#snapshot) {\n this.#snapshot.track(this.#menu.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#menu.input);\n }\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n super.disconnectedCallback();\n this.#cleanupSizeObserver?.();\n this.#cleanupSizeObserver = null;\n this.#syncTriggerMetadata(null);\n this.#cleanupTrigger();\n this.#cleanupParentRegistration?.();\n this.#cleanupParentRegistration = null;\n this.#registeredParentMenu = null;\n this.#menu?.destroy();\n this.#menu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n const parentCtx = this.#parentCtx.value ?? null;\n const isSubmenu = parentCtx !== null;\n this.#syncParentRegistration(parentCtx);\n\n this.#core.setProps({\n open: this.open,\n defaultOpen: this.defaultOpen,\n side: this.side,\n align: this.align,\n closeOnEscape: this.closeOnEscape,\n closeOnOutsideClick: this.closeOnOutsideClick,\n isSubmenu,\n });\n\n if (this.#menu && changed.has('open')) {\n this.#menu.syncOpen(this.open);\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#menu) return;\n\n const parentCtx = this.#parentCtx.value ?? null;\n const isSubmenu = parentCtx !== null;\n\n const input = this.#menu.input.current;\n this.#core.setInput(input);\n const state = this.#core.getState();\n\n if (!isSubmenu && state.open) {\n this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n } else {\n this.#releaseControlsVisibilityLock();\n }\n\n if (isSubmenu && parentCtx) {\n this.#updateAsSubmenu(state, parentCtx);\n } else {\n this.#updateAsRoot(state);\n }\n\n // Provide context to child parts.\n this.#provider.setValue({\n menu: this.#menu,\n state,\n stateAttrMap: MenuDataAttrs,\n setTriggerMetadata: this.#setTriggerMetadata,\n });\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n #syncParentRegistration(parentCtx: MenuContextValue | null): void {\n const parentMenu = parentCtx?.menu ?? null;\n if (parentMenu === this.#registeredParentMenu || !this.#menu) return;\n\n this.#cleanupParentRegistration?.();\n this.#registeredParentMenu = parentMenu;\n this.#cleanupParentRegistration = parentMenu?.registerSubmenu(this.#menu) ?? null;\n }\n\n #updateAsRoot(state: ReturnType<MenuCore['getState']>): void {\n if (!this.#menu) return;\n\n const triggerElement = this.#position.findTrigger();\n this.#syncTrigger(triggerElement);\n\n applyElementProps(this, {\n ...this.#core.getContentAttrs(state),\n });\n applyStateDataAttrs(this, state, MenuDataAttrs);\n\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n }\n\n if (!state.open) {\n this.#cleanupSizeObserver?.();\n this.#cleanupSizeObserver = null;\n this.#position.cleanup();\n return;\n }\n\n this.#cleanupSizeObserver?.();\n const syncSize = () => syncMenuSizeChain(this);\n syncSize();\n this.#cleanupSizeObserver = observeMenuSize(this, syncSize);\n\n const positionOptions = getRootPositionOptions(state.side, state.align);\n if (!positionOptions || !this.#currentTrigger) return;\n\n this.#position.sync({\n anchorName: this.id,\n position: positionOptions,\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n cssVars: MenuPositioningCSSVars,\n onSideChange: (side) => this.setAttribute(MenuDataAttrs.side, side),\n });\n }\n\n #updateAsSubmenu(state: ReturnType<MenuCore['getState']>, parentCtx: MenuContextValue): void {\n const isActive = state.open || state.status === 'ending';\n const triggerElement = this.parentElement?.querySelector<HTMLElement>(\n `[data-has-submenu][commandfor=\"${this.id}\"]`\n );\n\n this.#menu?.setTriggerElement(triggerElement ?? null);\n if (triggerElement) applyElementProps(triggerElement, this.#core.getTriggerAttrs(state, this.id));\n this.#syncTriggerMetadata(triggerElement ?? null);\n\n this.removeAttribute(MenuDataAttrs.side);\n this.removeAttribute(MenuDataAttrs.align);\n applyStateDataAttrs(this, state, MenuDataAttrs);\n\n applyElementProps(this, {\n hidden: !isActive,\n role: 'menu',\n tabIndex: -1,\n });\n\n this.#cleanupSizeObserver?.();\n const parentContentElement = parentCtx.menu.contentElement;\n const syncSize = () => syncMenuSizeChain(parentContentElement);\n syncSize();\n this.#cleanupSizeObserver =\n isActive && parentContentElement ? observeMenuSize(parentContentElement, syncSize) : null;\n\n if (isActive && !this.#submenuActive) {\n this.#menu?.highlightFirstItem({ preventScroll: true });\n } else if (!isActive && this.#submenuActive) {\n this.#menu?.restoreFocus({ preventScroll: true });\n }\n\n this.#submenuActive = isActive;\n }\n\n #handleContentKeyDown = (event: UIKeyboardEvent): void => {\n const isNavigationKey = isMenuNavigationKey(event);\n const defaultPreventedBeforeMenu = event.defaultPrevented;\n\n this.#menu?.contentProps.onKeyDown(event);\n\n const parentCtx = this.#parentCtx.value ?? null;\n\n if (!parentCtx) {\n if (event.key === 'Escape') return;\n if (isNavigationKey) {\n event.stopPropagation();\n }\n return;\n }\n\n const isBackNavigationKey = event.key === 'ArrowLeft' || event.key === 'Escape';\n\n if (isBackNavigationKey && !defaultPreventedBeforeMenu) {\n event.preventDefault();\n this.#menu?.close('escape');\n }\n\n if (isNavigationKey) event.stopPropagation();\n };\n\n #handleContentFocusOut = (event: UIFocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #setTriggerMetadata = (metadata: MenuTriggerMetadata): void => {\n if (\n metadata.hint === this.#triggerMetadata.hint &&\n metadata.disabled === this.#triggerMetadata.disabled &&\n metadata.availability === this.#triggerMetadata.availability\n ) {\n return;\n }\n\n this.#triggerMetadata = metadata;\n if (metadata.disabled && this.open && this.#parentCtx.value) this.close('imperative-action');\n this.requestUpdate();\n };\n\n #syncTriggerMetadata(trigger: HTMLElement | null): void {\n if (trigger !== this.#metadataTrigger) {\n this.#clearTriggerMetadata();\n this.#metadataTrigger = trigger;\n }\n\n if (!trigger) return;\n\n const disabled = this.#triggerMetadata.disabled || isTriggerExplicitlyDisabled(trigger);\n applyElementProps(trigger, {\n 'aria-disabled': disabled ? 'true' : undefined,\n 'data-availability': this.#triggerMetadata.availability,\n });\n\n const hint = trigger.querySelector<HTMLElement>('[data-part~=\"hint\"]');\n if (hint && hint.textContent !== this.#triggerMetadata.hint) hint.textContent = this.#triggerMetadata.hint;\n }\n\n #clearTriggerMetadata(): void {\n const trigger = this.#metadataTrigger;\n if (!trigger) return;\n\n applyElementProps(trigger, {\n 'aria-disabled': isTriggerExplicitlyDisabled(trigger) ? 'true' : undefined,\n 'data-availability': undefined,\n });\n\n const hint = trigger.querySelector<HTMLElement>('[data-part~=\"hint\"]');\n if (hint?.textContent) hint.textContent = '';\n this.#metadataTrigger = null;\n }\n\n #syncTrigger(triggerElement: HTMLElement | null): void {\n if (triggerElement === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerElement;\n this.#menu?.setTriggerElement(triggerElement);\n\n if (triggerElement && this.#menu) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerElement, this.#menu.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"menu-element.js","names":["#menu","#parentCtx","#triggerState","#core","#provider","#position","#controlsState","#containerCtx","#popupGroupCtx","#disconnect","#handleContentKeyDown","#handleContentFocusOut","#snapshot","#releaseControlsVisibilityLock","#cleanupSizeObserver","#syncTriggerState","#cleanupTrigger","#cleanupParentRegistration","#registeredParentMenu","#syncParentRegistration","#releaseControlsLock","#updateAsSubmenu","#updateAsRoot","#setTriggerState","#syncTrigger","#currentTrigger","#submenuActive","#stateTrigger","#clearTriggerState","#triggerAbort"],"sources":["../../../../src/ui/menu/menu-element.ts"],"sourcesContent":["import { MenuCore, MenuDataAttrs, type MenuInput, POPUP_HOST_ATTR } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createMenu,\n createTransition,\n getRootPositionOptions,\n isMenuNavigationKey,\n type MenuApi,\n type MenuChangeDetails,\n type MenuOpenChangeReason,\n MenuPositioningCSSVars,\n observeMenuSize,\n type PositioningBoundary,\n selectControls,\n syncMenuSizeChain,\n type UIFocusEvent,\n type UIKeyboardEvent,\n} from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer, ContextProvider } from '@videojs/element/context';\nimport { SnapshotController } from '@videojs/store/html';\nimport { tryHidePopover, tryShowPopover } from '@videojs/utils/dom';\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { popupGroupContext } from '../../player/popup-group-context';\nimport { MediaElement } from '../media-element';\nimport { PositionController } from '../position-controller';\nimport { type MenuContextValue, type MenuTriggerState, menuContext } from './context';\n\nconst defaultTriggerState: MenuTriggerState = {\n hint: '',\n disabled: false,\n};\n\nexport class MenuElement extends MediaElement {\n static readonly tagName: string = 'media-menu';\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 closeOnEscape: { type: Boolean, attribute: 'close-on-escape' },\n closeOnOutsideClick: { type: Boolean, attribute: 'close-on-outside-click' },\n boundary: { type: String },\n } satisfies PropertyDeclarationMap<\n 'open' | 'defaultOpen' | 'side' | 'align' | 'closeOnEscape' | 'closeOnOutsideClick' | 'boundary'\n >;\n\n open = MenuCore.defaultProps.open;\n defaultOpen = MenuCore.defaultProps.defaultOpen;\n side = MenuCore.defaultProps.side;\n align = MenuCore.defaultProps.align;\n closeOnEscape = MenuCore.defaultProps.closeOnEscape;\n closeOnOutsideClick = MenuCore.defaultProps.closeOnOutsideClick;\n boundary: PositioningBoundary = 'container';\n\n readonly #core = new MenuCore();\n readonly #provider = new ContextProvider(this, { context: menuContext });\n readonly #position = new PositionController(this);\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });\n readonly #popupGroupCtx = new ContextConsumer(this, { context: popupGroupContext });\n // Consume parent menu context — present when this is a nested (submenu) element.\n readonly #parentCtx = new ContextConsumer(this, { context: menuContext, subscribe: true });\n #menu: MenuApi | null = null;\n #snapshot: SnapshotController<MenuInput> | null = null;\n #submenuActive = false;\n\n #disconnect: AbortController | null = null;\n #triggerAbort: AbortController | null = null;\n #cleanupSizeObserver: (() => void) | null = null;\n #currentTrigger: HTMLElement | null = null;\n #stateTrigger: HTMLElement | null = null;\n #triggerState = defaultTriggerState;\n #releaseControlsLock: (() => void) | null = null;\n #registeredParentMenu: MenuApi | null = null;\n #cleanupParentRegistration: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.setAttribute(POPUP_HOST_ATTR, '');\n\n this.#disconnect = new AbortController();\n\n this.#menu = createMenu({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: MenuChangeDetails) => {\n const accepted = this.dispatchEvent(\n new CustomEvent('open-change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { open: nextOpen, ...details },\n })\n );\n if (accepted) this.open = nextOpen;\n },\n closeOnEscape: () => this.closeOnEscape,\n closeOnOutsideClick: () => this.closeOnOutsideClick,\n group: () => (this.#parentCtx.value ? undefined : this.#popupGroupCtx.value),\n });\n\n // The element itself is the content (popup) for root menus.\n // Submenu detection happens in update() once parent context is available.\n this.#menu.setContentElement(this);\n\n applyElementProps(\n this,\n { onKeyDown: this.#handleContentKeyDown, onFocusOut: this.#handleContentFocusOut },\n { signal: this.#disconnect.signal }\n );\n\n if (this.#snapshot) {\n this.#snapshot.track(this.#menu.input);\n } else {\n this.#snapshot = new SnapshotController(this, this.#menu.input);\n }\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n super.disconnectedCallback();\n this.#cleanupSizeObserver?.();\n this.#cleanupSizeObserver = null;\n this.#syncTriggerState(null);\n this.#cleanupTrigger();\n this.#cleanupParentRegistration?.();\n this.#cleanupParentRegistration = null;\n this.#registeredParentMenu = null;\n this.#menu?.destroy();\n this.#menu = null;\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n close(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.close(reason);\n }\n\n openMenu(reason: MenuOpenChangeReason = 'imperative-action'): void {\n this.#menu?.open(reason);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;\n\n const parentCtx = this.#parentCtx.value ?? null;\n this.#syncParentRegistration(parentCtx);\n\n this.#core.setProps({\n open: this.open,\n defaultOpen: this.defaultOpen,\n side: this.side,\n align: this.align,\n closeOnEscape: this.closeOnEscape,\n closeOnOutsideClick: this.closeOnOutsideClick,\n });\n\n if (this.#menu && changed.has('open')) {\n this.#menu.syncOpen(this.open);\n }\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n if (!this.#menu) return;\n\n const parentCtx = this.#parentCtx.value ?? null;\n const isSubmenu = parentCtx !== null;\n\n const input = this.#menu.input.current;\n this.#core.setInput({ ...input, isSubmenu });\n const state = this.#core.getState();\n\n if (!isSubmenu && state.open) {\n this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n } else {\n this.#releaseControlsVisibilityLock();\n }\n\n if (isSubmenu && parentCtx) {\n this.#updateAsSubmenu(state, parentCtx);\n } else {\n this.#updateAsRoot(state);\n }\n\n // Provide context to child parts.\n this.#provider.setValue({\n menu: this.#menu,\n state,\n stateAttrMap: MenuDataAttrs,\n setTriggerState: this.#setTriggerState,\n });\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n #syncParentRegistration(parentCtx: MenuContextValue | null): void {\n const parentMenu = parentCtx?.menu ?? null;\n if (parentMenu === this.#registeredParentMenu || !this.#menu) return;\n\n this.#cleanupParentRegistration?.();\n this.#registeredParentMenu = parentMenu;\n this.#cleanupParentRegistration = parentMenu?.registerSubmenu(this.#menu) ?? null;\n }\n\n #updateAsRoot(state: ReturnType<MenuCore['getState']>): void {\n if (!this.#menu) return;\n\n const triggerElement = this.#position.findTrigger();\n this.#syncTrigger(triggerElement);\n\n applyElementProps(this, {\n ...this.#core.getContentAttrs(state),\n });\n applyStateDataAttrs(this, state, MenuDataAttrs);\n\n if (state.open) {\n tryShowPopover(this);\n } else {\n tryHidePopover(this);\n }\n\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, this.#core.getTriggerAttrs(state, this.id));\n }\n\n if (!state.open) {\n this.#cleanupSizeObserver?.();\n this.#cleanupSizeObserver = null;\n this.#position.cleanup();\n return;\n }\n\n this.#cleanupSizeObserver?.();\n const syncSize = () => syncMenuSizeChain(this);\n syncSize();\n this.#cleanupSizeObserver = observeMenuSize(this, syncSize);\n\n const positionOptions = getRootPositionOptions(state.side, state.align);\n if (!positionOptions || !this.#currentTrigger) return;\n\n this.#position.sync({\n anchorName: this.id,\n position: positionOptions,\n trigger: this.#currentTrigger,\n boundary: this.boundary,\n container: this.#containerCtx.value?.container ?? null,\n cssVars: MenuPositioningCSSVars,\n onSideChange: (side) => this.setAttribute(MenuDataAttrs.side, side),\n });\n }\n\n #updateAsSubmenu(state: ReturnType<MenuCore['getState']>, parentCtx: MenuContextValue): void {\n const isActive = state.open || state.status === 'ending';\n const triggerElement = this.parentElement?.querySelector<HTMLElement>(\n `[data-has-submenu][commandfor=\"${this.id}\"]`\n );\n\n this.#menu?.setTriggerElement(triggerElement ?? null);\n if (triggerElement) applyElementProps(triggerElement, this.#core.getTriggerAttrs(state, this.id));\n this.#syncTriggerState(triggerElement ?? null);\n\n this.removeAttribute(MenuDataAttrs.side);\n this.removeAttribute(MenuDataAttrs.align);\n applyStateDataAttrs(this, state, MenuDataAttrs);\n\n applyElementProps(this, {\n hidden: !isActive,\n role: 'menu',\n tabIndex: -1,\n });\n\n this.#cleanupSizeObserver?.();\n const parentContentElement = parentCtx.menu.contentElement;\n const syncSize = () => syncMenuSizeChain(parentContentElement);\n syncSize();\n this.#cleanupSizeObserver =\n isActive && parentContentElement ? observeMenuSize(parentContentElement, syncSize) : null;\n\n if (isActive && !this.#submenuActive) {\n this.#menu?.highlightFirstItem({ preventScroll: true });\n } else if (!isActive && this.#submenuActive) {\n this.#menu?.restoreFocus({ preventScroll: true });\n }\n\n this.#submenuActive = isActive;\n }\n\n #handleContentKeyDown = (event: UIKeyboardEvent): void => {\n const isNavigationKey = isMenuNavigationKey(event);\n const defaultPreventedBeforeMenu = event.defaultPrevented;\n\n this.#menu?.contentProps.onKeyDown(event);\n\n const parentCtx = this.#parentCtx.value ?? null;\n\n if (!parentCtx) {\n if (event.key === 'Escape') return;\n if (isNavigationKey) {\n event.stopPropagation();\n }\n return;\n }\n\n const isBackNavigationKey = event.key === 'ArrowLeft' || event.key === 'Escape';\n\n if (isBackNavigationKey && !defaultPreventedBeforeMenu) {\n event.preventDefault();\n this.#menu?.close('escape');\n }\n\n if (isNavigationKey) event.stopPropagation();\n };\n\n #handleContentFocusOut = (event: UIFocusEvent): void => {\n this.#menu?.contentProps.onFocusOut(event);\n };\n\n #setTriggerState = (triggerState: MenuTriggerState): void => {\n if (\n triggerState.hint === this.#triggerState.hint &&\n triggerState.disabled === this.#triggerState.disabled &&\n triggerState.availability === this.#triggerState.availability\n ) {\n return;\n }\n\n this.#triggerState = triggerState;\n if (triggerState.disabled && this.open && this.#parentCtx.value) this.close('imperative-action');\n this.requestUpdate();\n };\n\n #syncTriggerState(trigger: HTMLElement | null): void {\n if (trigger !== this.#stateTrigger) {\n this.#clearTriggerState();\n this.#stateTrigger = trigger;\n }\n\n if (!trigger) return;\n\n const disabled = this.#triggerState.disabled || isTriggerExplicitlyDisabled(trigger);\n applyElementProps(trigger, {\n 'aria-disabled': disabled ? 'true' : undefined,\n 'data-availability': this.#triggerState.availability,\n });\n\n const hint = trigger.querySelector<HTMLElement>('[data-part~=\"hint\"]');\n if (hint && hint.textContent !== this.#triggerState.hint) hint.textContent = this.#triggerState.hint;\n }\n\n #clearTriggerState(): void {\n const trigger = this.#stateTrigger;\n if (!trigger) return;\n\n applyElementProps(trigger, {\n 'aria-disabled': isTriggerExplicitlyDisabled(trigger) ? 'true' : undefined,\n 'data-availability': undefined,\n });\n\n const hint = trigger.querySelector<HTMLElement>('[data-part~=\"hint\"]');\n if (hint?.textContent) hint.textContent = '';\n this.#stateTrigger = null;\n }\n\n #syncTrigger(triggerElement: HTMLElement | null): void {\n if (triggerElement === this.#currentTrigger) return;\n\n this.#position.cleanup();\n this.#cleanupTrigger();\n this.#currentTrigger = triggerElement;\n this.#menu?.setTriggerElement(triggerElement);\n\n if (triggerElement && this.#menu) {\n this.#triggerAbort = new AbortController();\n applyElementProps(triggerElement, this.#menu.triggerProps, { signal: this.#triggerAbort.signal });\n }\n }\n\n #cleanupTrigger(): void {\n if (this.#currentTrigger) {\n applyElementProps(this.#currentTrigger, {\n 'aria-expanded': undefined,\n 'aria-haspopup': undefined,\n 'aria-controls': undefined,\n });\n }\n\n this.#triggerAbort?.abort();\n this.#triggerAbort = null;\n this.#currentTrigger = null;\n }\n}\n\nfunction isTriggerExplicitlyDisabled(trigger: HTMLElement): boolean {\n return (\n trigger.hasAttribute('disabled') ||\n ('disabled' in trigger && (trigger as HTMLElement & { disabled?: boolean }).disabled === true)\n );\n}\n"],"mappings":"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"}
|
|
@@ -15,10 +15,10 @@ var MenuRadioGroupElement = class extends RadioGroupElement {
|
|
|
15
15
|
subscribe: true
|
|
16
16
|
});
|
|
17
17
|
#ariaLabel = null;
|
|
18
|
-
#
|
|
19
|
-
#
|
|
18
|
+
#triggerMenu = null;
|
|
19
|
+
#setTriggerState = null;
|
|
20
20
|
disconnectedCallback() {
|
|
21
|
-
this.#
|
|
21
|
+
this.#clearMenuTriggerState();
|
|
22
22
|
super.disconnectedCallback();
|
|
23
23
|
}
|
|
24
24
|
update(changed) {
|
|
@@ -38,29 +38,29 @@ var MenuRadioGroupElement = class extends RadioGroupElement {
|
|
|
38
38
|
this.#ariaLabel = label;
|
|
39
39
|
this.setAttribute("aria-label", label);
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
publishMenuTriggerState(disabled, availability) {
|
|
42
42
|
const context = this.#menu.value ?? null;
|
|
43
|
-
if (context?.menu !== this.#
|
|
44
|
-
this.#
|
|
45
|
-
this.#
|
|
46
|
-
this.#
|
|
43
|
+
if (context?.menu !== this.#triggerMenu) {
|
|
44
|
+
this.#clearMenuTriggerState();
|
|
45
|
+
this.#triggerMenu = context?.menu ?? null;
|
|
46
|
+
this.#setTriggerState = context?.setTriggerState ?? null;
|
|
47
47
|
}
|
|
48
|
-
if (!this.#
|
|
48
|
+
if (!this.#setTriggerState) return;
|
|
49
49
|
const selectedItem = findElementChild(this, (item) => item instanceof MenuRadioItemElement && item.value === this.value);
|
|
50
50
|
const hint = selectedItem?.querySelector("[data-part~=\"label\"]")?.textContent ?? selectedItem?.textContent?.trim() ?? "";
|
|
51
|
-
this.#
|
|
51
|
+
this.#setTriggerState({
|
|
52
52
|
hint,
|
|
53
53
|
disabled,
|
|
54
54
|
availability
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
#
|
|
58
|
-
this.#
|
|
57
|
+
#clearMenuTriggerState() {
|
|
58
|
+
this.#setTriggerState?.({
|
|
59
59
|
hint: "",
|
|
60
60
|
disabled: false
|
|
61
61
|
});
|
|
62
|
-
this.#
|
|
63
|
-
this.#
|
|
62
|
+
this.#triggerMenu = null;
|
|
63
|
+
this.#setTriggerState = null;
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-radio-group-element.js","names":["#group","#menu","#
|
|
1
|
+
{"version":3,"file":"menu-radio-group-element.js","names":["#group","#menu","#clearMenuTriggerState","#ariaLabel","#triggerMenu","#setTriggerState"],"sources":["../../../../src/ui/menu/menu-radio-group-element.ts"],"sourcesContent":["import type { PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { findElementChild } from '@videojs/utils/dom';\n\nimport { RadioGroupElement } from '../radio-group/radio-group-element';\nimport { type MenuContextValue, type MenuTriggerState, menuContext } from './context';\nimport { MenuGroupController } from './menu-group-controller';\nimport { MenuRadioItemElement } from './menu-radio-item-element';\n\nexport class MenuRadioGroupElement extends RadioGroupElement {\n static readonly tagName: string = 'media-menu-radio-group';\n\n readonly #group = new MenuGroupController(this);\n readonly #menu = new ContextConsumer(this, { context: menuContext, subscribe: true });\n #ariaLabel: string | null = null;\n #triggerMenu: MenuContextValue['menu'] | null = null;\n #setTriggerState: ((state: MenuTriggerState) => void) | null = null;\n\n override disconnectedCallback(): void {\n this.#clearMenuTriggerState();\n super.disconnectedCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n this.#group.applyProps();\n }\n\n protected setItemLabel(item: MenuRadioItemElement, label: string): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n } else {\n item.textContent = label;\n }\n }\n\n /** Applies a generated fallback without replacing an author-provided accessible name. */\n protected applyDefaultAriaLabel(label: string): void {\n if (this.hasAttribute('aria-labelledby')) return;\n\n const current = this.getAttribute('aria-label');\n if (current !== null && current !== this.#ariaLabel) return;\n\n this.#ariaLabel = label;\n this.setAttribute('aria-label', label);\n }\n\n protected publishMenuTriggerState(\n disabled: boolean,\n availability?: 'available' | 'unavailable' | 'unsupported'\n ): void {\n const context = this.#menu.value ?? null;\n\n if (context?.menu !== this.#triggerMenu) {\n this.#clearMenuTriggerState();\n this.#triggerMenu = context?.menu ?? null;\n this.#setTriggerState = context?.setTriggerState ?? null;\n }\n\n if (!this.#setTriggerState) return;\n\n const selectedItem = findElementChild(\n this,\n (item): item is MenuRadioItemElement => item instanceof MenuRadioItemElement && item.value === this.value\n );\n const label = selectedItem?.querySelector<HTMLElement>('[data-part~=\"label\"]')?.textContent;\n const hint = label ?? selectedItem?.textContent?.trim() ?? '';\n\n this.#setTriggerState({ hint, disabled, availability });\n }\n\n #clearMenuTriggerState(): void {\n this.#setTriggerState?.({ hint: '', disabled: false });\n this.#triggerMenu = null;\n this.#setTriggerState = null;\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,wBAAb,cAA2C,kBAAkB;;EACzB,KAAA,UAAA;;CAElC,SAAkB,IAAI,oBAAoB,IAAI;CAC9C,QAAiB,IAAI,gBAAgB,MAAM;EAAE,SAAS;EAAa,WAAW;CAAK,CAAC;CACpF,aAA4B;CAC5B,eAAgD;CAChD,mBAA+D;CAE/D,uBAAsC;EACpC,KAAKE,uBAAuB;EAC5B,MAAM,qBAAqB;CAC7B;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,KAAKF,OAAO,WAAW;CACzB;CAEA,aAAuB,MAA4B,OAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;OAExB,KAAK,cAAc;CAEvB;;CAGA,sBAAgC,OAAqB;EACnD,IAAI,KAAK,aAAa,iBAAiB,GAAG;EAE1C,MAAM,UAAU,KAAK,aAAa,YAAY;EAC9C,IAAI,YAAY,QAAQ,YAAY,KAAKG,YAAY;EAErD,KAAKA,aAAa;EAClB,KAAK,aAAa,cAAc,KAAK;CACvC;CAEA,wBACE,UACA,cACM;EACN,MAAM,UAAU,KAAKF,MAAM,SAAS;EAEpC,IAAI,SAAS,SAAS,KAAKG,cAAc;GACvC,KAAKF,uBAAuB;GAC5B,KAAKE,eAAe,SAAS,QAAQ;GACrC,KAAKC,mBAAmB,SAAS,mBAAmB;EACtD;EAEA,IAAI,CAAC,KAAKA,kBAAkB;EAE5B,MAAM,eAAe,iBACnB,OACC,SAAuC,gBAAgB,wBAAwB,KAAK,UAAU,KAAK,KACtG;EAEA,MAAM,OADQ,cAAc,cAA2B,wBAAsB,CAAC,EAAE,eAC1D,cAAc,aAAa,KAAK,KAAK;EAE3D,KAAKA,iBAAiB;GAAE;GAAM;GAAU;EAAa,CAAC;CACxD;CAEA,yBAA+B;EAC7B,KAAKA,mBAAmB;GAAE,MAAM;GAAI,UAAU;EAAM,CAAC;EACrD,KAAKD,eAAe;EACpB,KAAKC,mBAAmB;CAC1B;AACF"}
|
|
@@ -53,7 +53,7 @@ var PlaybackRateRadioGroupElement = class extends MenuRadioGroupElement {
|
|
|
53
53
|
state = this.#core.getState();
|
|
54
54
|
this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state)));
|
|
55
55
|
this.#options.sync(state, this.#i18n.value, this.#i18n.locale);
|
|
56
|
-
this.
|
|
56
|
+
this.publishMenuTriggerState(state.disabled, state.availability);
|
|
57
57
|
}
|
|
58
58
|
super.update(changed);
|
|
59
59
|
if (state) applyStateDataAttrs(this, state, PlaybackRateRadioGroupDataAttrs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback-rate-radio-group-element.js","names":["#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/playback-rate-radio-group/playback-rate-radio-group-element.ts"],"sourcesContent":["import {\n PlaybackRateRadioGroupCore,\n PlaybackRateRadioGroupDataAttrs,\n type PlaybackRateRadioGroupOption,\n} from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectPlaybackRate } from '@videojs/core/dom';\nimport { translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MenuRadioGroupElement } from '../menu/menu-radio-group-element';\nimport { RadioOptionsController } from '../radio-options/radio-options-controller';\n\nexport class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-playback-rate-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n disabled = false;\n formatRate = PlaybackRateRadioGroupCore.defaultProps.formatRate;\n\n readonly #core = new PlaybackRateRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n readonly #options = new RadioOptionsController<PlaybackRateRadioGroupOption>(this, {\n setItemAttributes: (item, option) => item.setAttribute('data-rate', option.value),\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: PlaybackRateRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRate: this.formatRate, disabled: this.disabled });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(\n translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state))\n );\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.
|
|
1
|
+
{"version":3,"file":"playback-rate-radio-group-element.js","names":["#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/playback-rate-radio-group/playback-rate-radio-group-element.ts"],"sourcesContent":["import {\n PlaybackRateRadioGroupCore,\n PlaybackRateRadioGroupDataAttrs,\n type PlaybackRateRadioGroupOption,\n} from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectPlaybackRate } from '@videojs/core/dom';\nimport { translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MenuRadioGroupElement } from '../menu/menu-radio-group-element';\nimport { RadioOptionsController } from '../radio-options/radio-options-controller';\n\nexport class PlaybackRateRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-playback-rate-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n } satisfies PropertyDeclarationMap<'value' | 'disabled'>;\n\n disabled = false;\n formatRate = PlaybackRateRadioGroupCore.defaultProps.formatRate;\n\n readonly #core = new PlaybackRateRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectPlaybackRate);\n readonly #options = new RadioOptionsController<PlaybackRateRadioGroupOption>(this, {\n setItemAttributes: (item, option) => item.setAttribute('data-rate', option.value),\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: PlaybackRateRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRate: this.formatRate, disabled: this.disabled });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(\n translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state))\n );\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuTriggerState(state.disabled, state.availability);\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, PlaybackRateRadioGroupDataAttrs);\n }\n}\n\nexport namespace PlaybackRateRadioGroupElement {\n export type State = PlaybackRateRadioGroupCore.State;\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAa,gCAAb,cAAmD,sBAAsB;;;EAQ5D,KAAA,WAAA;EACE,KAAA,aAAA,2BAA2B,aAAa;EAEpC,KAAA,QAAA,IAAI,2BAA2B;EAC/B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,kBAAkB;EAC/D,KAAA,WAAA,IAAI,uBAAqD,MAAM;GACjF,oBAAoB,MAAM,WAAW,KAAK,aAAa,aAAa,OAAO,KAAK;GAChF,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAKA,YAAY;IAC/B,IAAI,OAAO,KAAKC,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EAnBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;EAC5B;;CAKA;CACA;CACA;CACA;CAQA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,IAAI,KAAK,WAAW;CAKtB;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAKD,YAAY;EAC/B,IAAI,QAAiD;EAErD,IAAI,OAAO;GACT,KAAKC,MAAM,SAAS;IAAE,YAAY,KAAK;IAAY,UAAU,KAAK;GAAS,CAAC;GAC5E,KAAKA,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAKA,MAAM,SAAS;GAE5B,KAAK,sBACH,cAAc,KAAKA,MAAM,SAAS,KAAK,GAAG,KAAKC,MAAM,OAAO,KAAKD,MAAM,eAAe,KAAK,CAAC,CAC9F;GACA,KAAKE,SAAS,KAAK,OAAO,KAAKD,MAAM,OAAO,KAAKA,MAAM,MAAM;GAC7D,KAAK,wBAAwB,MAAM,UAAU,MAAM,YAAY;EACjE;EAEA,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,+BAA+B;CAC7E;AACF"}
|
|
@@ -1,27 +1,157 @@
|
|
|
1
1
|
import { playerContext } from "../../player/context.js";
|
|
2
|
+
import { MediaElement } from "../media-element.js";
|
|
2
3
|
import { PlayerController } from "../../player/player-controller.js";
|
|
3
|
-
import {
|
|
4
|
-
import { selectPlayback } from "@videojs/core/dom";
|
|
4
|
+
import { applyStateDataAttrs, selectMetadata, selectPlayback } from "@videojs/core/dom";
|
|
5
5
|
import { PosterCore, PosterDataAttrs } from "@videojs/core";
|
|
6
6
|
//#region src/ui/poster/poster-element.ts
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.mediaState = new PlayerController(this, playerContext, selectPlayback);
|
|
7
|
+
/** What an element composes: whatever fills a slot, or the element's own children. */
|
|
8
|
+
function composedChildren(element) {
|
|
9
|
+
if (element instanceof HTMLSlotElement) {
|
|
10
|
+
const assigned = element.assignedElements();
|
|
11
|
+
if (assigned.length > 0) return assigned;
|
|
13
12
|
}
|
|
13
|
+
return [...element.children];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The first image an element composes. A skin forwards its own
|
|
17
|
+
* `<slot name="poster">` in, so the image is a slot or two down and may be
|
|
18
|
+
* wrapped in a `<picture>` or a framework image component.
|
|
19
|
+
*/
|
|
20
|
+
function findImage(element) {
|
|
21
|
+
for (const child of composedChildren(element)) {
|
|
22
|
+
if (child instanceof HTMLImageElement) return child;
|
|
23
|
+
const nested = findImage(child);
|
|
24
|
+
if (nested) return nested;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether anything already points this image somewhere, which answers both
|
|
30
|
+
* whether the author owns the source and whether there is a download to wait
|
|
31
|
+
* for. A `<source>` counts: inside a `<picture>` it can win over the `src`.
|
|
32
|
+
*/
|
|
33
|
+
function hasSource(img) {
|
|
34
|
+
if (img.hasAttribute("src") || img.hasAttribute("srcset")) return true;
|
|
35
|
+
const parent = img.parentElement;
|
|
36
|
+
return parent?.localName === "picture" && parent.querySelector("source") !== null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether `complete` on this image describes a request. It is also true for one
|
|
40
|
+
* that omits both `src` and `srcset`, whatever a parent `<picture>` is fetching
|
|
41
|
+
* on its behalf, so only an image sourced from its own attributes can be read.
|
|
42
|
+
*/
|
|
43
|
+
function hasOwnSource(img) {
|
|
44
|
+
return !!img.getAttribute("src") || img.hasAttribute("srcset");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `<media-poster>` — sets `src` on a poster image it does not own.
|
|
48
|
+
*
|
|
49
|
+
* The image is a child, as in `<picture>`, but sourcing runs the other way
|
|
50
|
+
* around: `<picture>` treats the `src` on its `<img>` as the fallback, while
|
|
51
|
+
* here an image with no source of its own is the one this element fills in.
|
|
52
|
+
* Give the child a `src`, a `srcset`, or `<source>` candidates and it is yours,
|
|
53
|
+
* left alone.
|
|
54
|
+
*
|
|
55
|
+
* Renders no image of its own, so include one:
|
|
56
|
+
* `<media-poster><img alt=""></media-poster>`. Inside a skin, an
|
|
57
|
+
* `<img slot="poster">` of yours replaces the one the skin carries.
|
|
58
|
+
*/
|
|
59
|
+
var PosterElement = class extends MediaElement {
|
|
14
60
|
static {
|
|
15
61
|
this.tagName = "media-poster";
|
|
16
62
|
}
|
|
17
63
|
static get observedAttributes() {
|
|
18
64
|
return [...super.observedAttributes, "placeholdersrc"];
|
|
19
65
|
}
|
|
66
|
+
#core = new PosterCore();
|
|
67
|
+
#children = new MutationObserver(() => this.requestUpdate());
|
|
68
|
+
#playback = new PlayerController(this, playerContext, selectPlayback);
|
|
69
|
+
#metadata = new PlayerController(this, playerContext, selectMetadata);
|
|
70
|
+
#image = null;
|
|
71
|
+
/** Whether `#image` had no source of its own when it became active. */
|
|
72
|
+
#owned = false;
|
|
73
|
+
#imageLoadState = "pending";
|
|
74
|
+
#imageEvents = null;
|
|
75
|
+
#disconnect = null;
|
|
76
|
+
#warnedMissingImage = false;
|
|
77
|
+
connectedCallback() {
|
|
78
|
+
super.connectedCallback();
|
|
79
|
+
if (this.destroyed) return;
|
|
80
|
+
this.#disconnect = new AbortController();
|
|
81
|
+
const { signal } = this.#disconnect;
|
|
82
|
+
this.addEventListener("slotchange", () => this.requestUpdate(), { signal });
|
|
83
|
+
this.#children.observe(this, {
|
|
84
|
+
childList: true,
|
|
85
|
+
subtree: true
|
|
86
|
+
});
|
|
87
|
+
}
|
|
20
88
|
attributeChangedCallback(attr, oldValue, newValue) {
|
|
21
89
|
super.attributeChangedCallback(attr, oldValue, newValue);
|
|
22
90
|
if (attr === "placeholdersrc") if (newValue) this.style.setProperty("--media-poster-placeholder", `url(${newValue})`);
|
|
23
91
|
else this.style.removeProperty("--media-poster-placeholder");
|
|
24
92
|
}
|
|
93
|
+
disconnectedCallback() {
|
|
94
|
+
super.disconnectedCallback();
|
|
95
|
+
this.#adopt(null);
|
|
96
|
+
this.#children.disconnect();
|
|
97
|
+
this.#disconnect?.abort();
|
|
98
|
+
this.#disconnect = null;
|
|
99
|
+
}
|
|
100
|
+
get #loadState() {
|
|
101
|
+
if (!this.#image || !hasSource(this.#image)) return "none";
|
|
102
|
+
return this.#imageLoadState === "pending" ? "loading" : this.#imageLoadState;
|
|
103
|
+
}
|
|
104
|
+
update(changed) {
|
|
105
|
+
super.update(changed);
|
|
106
|
+
const playback = this.#playback.value;
|
|
107
|
+
if (!playback) return;
|
|
108
|
+
this.#core.setMedia({
|
|
109
|
+
started: playback.started,
|
|
110
|
+
poster: this.#metadata.value?.poster ?? ""
|
|
111
|
+
});
|
|
112
|
+
const { src } = this.#core.getState();
|
|
113
|
+
this.#adopt(findImage(this));
|
|
114
|
+
this.#applySource(src);
|
|
115
|
+
this.#core.setImageLoadState(this.#loadState);
|
|
116
|
+
applyStateDataAttrs(this, this.#core.getState(), PosterDataAttrs);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Ownership is settled once, when an image becomes active: after the first fill
|
|
120
|
+
* the `src` we set would itself look authored. Re-slot an image with a source
|
|
121
|
+
* to hand it back, the way React decides a field is controlled at mount.
|
|
122
|
+
*/
|
|
123
|
+
#adopt(next) {
|
|
124
|
+
if (next === this.#image) return;
|
|
125
|
+
if (this.#owned) this.#image?.removeAttribute("src");
|
|
126
|
+
this.#imageEvents?.abort();
|
|
127
|
+
this.#imageEvents = null;
|
|
128
|
+
this.#image = next;
|
|
129
|
+
this.#owned = next !== null && !hasSource(next);
|
|
130
|
+
this.#imageLoadState = "pending";
|
|
131
|
+
if (!next) return;
|
|
132
|
+
if (next.naturalWidth > 0) this.#imageLoadState = "loaded";
|
|
133
|
+
else if (next.complete && hasOwnSource(next)) this.#imageLoadState = "error";
|
|
134
|
+
this.#imageEvents = new AbortController();
|
|
135
|
+
const { signal } = this.#imageEvents;
|
|
136
|
+
const settle = (loadState) => () => {
|
|
137
|
+
this.#imageLoadState = loadState;
|
|
138
|
+
this.requestUpdate();
|
|
139
|
+
};
|
|
140
|
+
next.addEventListener("load", settle("loaded"), { signal });
|
|
141
|
+
next.addEventListener("error", settle("error"), { signal });
|
|
142
|
+
}
|
|
143
|
+
#applySource(src) {
|
|
144
|
+
const img = this.#image;
|
|
145
|
+
if (!img) return;
|
|
146
|
+
if (!this.#owned) return;
|
|
147
|
+
if (!src) {
|
|
148
|
+
this.#imageLoadState = "pending";
|
|
149
|
+
img.removeAttribute("src");
|
|
150
|
+
} else if (img.getAttribute("src") !== src) {
|
|
151
|
+
this.#imageLoadState = "pending";
|
|
152
|
+
img.setAttribute("src", src);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
25
155
|
};
|
|
26
156
|
//#endregion
|
|
27
157
|
export { PosterElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poster-element.js","names":[],"sources":["../../../../src/ui/poster/poster-element.ts"],"sourcesContent":["import { PosterCore, PosterDataAttrs } from '@videojs/core';\nimport { selectPlayback } from '@videojs/core/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaUIElement } from '../media-ui-element';\n\nexport class PosterElement extends MediaUIElement<PosterCore> {\n static readonly tagName = 'media-poster';\n\n static get observedAttributes(): string[] {\n // biome-ignore lint/complexity/noThisInStatic: intentional use of super\n return [...super.observedAttributes, 'placeholdersrc'];\n }\n\n protected readonly core = new PosterCore();\n protected readonly stateAttrMap = PosterDataAttrs;\n protected readonly mediaState = new PlayerController(this, playerContext, selectPlayback);\n\n override attributeChangedCallback(attr: string, oldValue: string | null, newValue: string | null): void {\n super.attributeChangedCallback(attr, oldValue, newValue);\n\n if (attr === 'placeholdersrc') {\n if (newValue) {\n this.style.setProperty('--media-poster-placeholder', `url(${newValue})`);\n } else {\n this.style.removeProperty('--media-poster-placeholder');\n }\n }\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,gBAAb,cAAmC,eAA2B;;;EAQlC,KAAA,OAAA,IAAI,WAAW;EACP,KAAA,eAAA;EACF,KAAA,aAAA,IAAI,iBAAiB,MAAM,eAAe,cAAc;;;EAT9D,KAAA,UAAA;;CAE1B,WAAW,qBAA+B;EAExC,OAAO,CAAC,GAAG,MAAM,oBAAoB,gBAAgB;CACvD;CAMA,yBAAkC,MAAc,UAAyB,UAA+B;EACtG,MAAM,yBAAyB,MAAM,UAAU,QAAQ;EAEvD,IAAI,SAAS,kBACX,IAAI,UACF,KAAK,MAAM,YAAY,8BAA8B,OAAO,SAAS,EAAE;OAEvE,KAAK,MAAM,eAAe,4BAA4B;CAG5D;AACF"}
|
|
1
|
+
{"version":3,"file":"poster-element.js","names":["#core","#children","#playback","#metadata","#disconnect","#adopt","#loadState","#image","#imageLoadState","#applySource","#owned","#imageEvents"],"sources":["../../../../src/ui/poster/poster-element.ts"],"sourcesContent":["import { PosterCore, PosterDataAttrs, type PosterImageLoadState } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectMetadata, selectPlayback } from '@videojs/core/dom';\nimport type { PropertyValues } from '@videojs/element';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\n/** What an element composes: whatever fills a slot, or the element's own children. */\nfunction composedChildren(element: Element): Element[] {\n if (element instanceof HTMLSlotElement) {\n const assigned = element.assignedElements();\n if (assigned.length > 0) return assigned;\n }\n\n return [...element.children];\n}\n\n/**\n * The first image an element composes. A skin forwards its own\n * `<slot name=\"poster\">` in, so the image is a slot or two down and may be\n * wrapped in a `<picture>` or a framework image component.\n */\nfunction findImage(element: Element): HTMLImageElement | null {\n for (const child of composedChildren(element)) {\n if (child instanceof HTMLImageElement) return child;\n\n const nested = findImage(child);\n if (nested) return nested;\n }\n\n return null;\n}\n\n/**\n * Whether anything already points this image somewhere, which answers both\n * whether the author owns the source and whether there is a download to wait\n * for. A `<source>` counts: inside a `<picture>` it can win over the `src`.\n */\nfunction hasSource(img: HTMLImageElement): boolean {\n if (img.hasAttribute('src') || img.hasAttribute('srcset')) return true;\n\n const parent = img.parentElement;\n return parent?.localName === 'picture' && parent.querySelector('source') !== null;\n}\n\n/**\n * Whether `complete` on this image describes a request. It is also true for one\n * that omits both `src` and `srcset`, whatever a parent `<picture>` is fetching\n * on its behalf, so only an image sourced from its own attributes can be read.\n */\nfunction hasOwnSource(img: HTMLImageElement): boolean {\n return !!img.getAttribute('src') || img.hasAttribute('srcset');\n}\n\n/** How the current source is faring. */\ntype ImageLoadState = 'pending' | 'loaded' | 'error';\n\n/**\n * `<media-poster>` — sets `src` on a poster image it does not own.\n *\n * The image is a child, as in `<picture>`, but sourcing runs the other way\n * around: `<picture>` treats the `src` on its `<img>` as the fallback, while\n * here an image with no source of its own is the one this element fills in.\n * Give the child a `src`, a `srcset`, or `<source>` candidates and it is yours,\n * left alone.\n *\n * Renders no image of its own, so include one:\n * `<media-poster><img alt=\"\"></media-poster>`. Inside a skin, an\n * `<img slot=\"poster\">` of yours replaces the one the skin carries.\n */\nexport class PosterElement extends MediaElement {\n static readonly tagName = 'media-poster';\n\n static get observedAttributes(): string[] {\n // biome-ignore lint/complexity/noThisInStatic: intentional use of super\n return [...super.observedAttributes, 'placeholdersrc'];\n }\n\n readonly #core = new PosterCore();\n readonly #children = new MutationObserver(() => this.requestUpdate());\n\n readonly #playback = new PlayerController(this, playerContext, selectPlayback);\n readonly #metadata = new PlayerController(this, playerContext, selectMetadata);\n\n #image: HTMLImageElement | null = null;\n /** Whether `#image` had no source of its own when it became active. */\n #owned = false;\n #imageLoadState: ImageLoadState = 'pending';\n\n #imageEvents: AbortController | null = null;\n #disconnect: AbortController | null = null;\n #warnedMissingImage = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const { signal } = this.#disconnect;\n\n // Two ways the image can change: a skin's forwarding slot fills or empties,\n // which bubbles here, or a child is added or removed, which announces nothing.\n this.addEventListener('slotchange', () => this.requestUpdate(), { signal });\n this.#children.observe(this, { childList: true, subtree: true });\n\n if (__DEV__ && !this.#playback.value) {\n logMissingFeature(this.localName, this.#playback.displayName ?? 'playback');\n }\n }\n\n override attributeChangedCallback(attr: string, oldValue: string | null, newValue: string | null): void {\n super.attributeChangedCallback(attr, oldValue, newValue);\n\n if (attr === 'placeholdersrc') {\n if (newValue) {\n this.style.setProperty('--media-poster-placeholder', `url(${newValue})`);\n } else {\n this.style.removeProperty('--media-poster-placeholder');\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.#adopt(null);\n this.#children.disconnect();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n get #loadState(): PosterImageLoadState {\n if (!this.#image || !hasSource(this.#image)) return 'none';\n return this.#imageLoadState === 'pending' ? 'loading' : this.#imageLoadState;\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const playback = this.#playback.value;\n if (!playback) return;\n\n // `metadata` is optional: without it nothing resolves a URL, and this stays\n // a visibility wrapper around whatever the author supplied.\n this.#core.setMedia({\n started: playback.started,\n poster: this.#metadata.value?.poster ?? '',\n });\n\n const { src } = this.#core.getState();\n\n this.#adopt(findImage(this));\n this.#applySource(src);\n\n this.#core.setImageLoadState(this.#loadState);\n applyStateDataAttrs(this, this.#core.getState(), PosterDataAttrs);\n }\n\n /**\n * Ownership is settled once, when an image becomes active: after the first fill\n * the `src` we set would itself look authored. Re-slot an image with a source\n * to hand it back, the way React decides a field is controlled at mount.\n */\n #adopt(next: HTMLImageElement | null): void {\n if (next === this.#image) return;\n\n // An image that steps aside keeps downloading whatever we pointed it at.\n if (this.#owned) this.#image?.removeAttribute('src');\n this.#imageEvents?.abort();\n this.#imageEvents = null;\n\n this.#image = next;\n this.#owned = next !== null && !hasSource(next);\n this.#imageLoadState = 'pending';\n\n if (!next) return;\n\n // An image that finished before we started listening never fires again, so\n // its load state has to be read off it. Decoded pixels stand on their own;\n // the absence of them only means failure once `complete` can be trusted.\n if (next.naturalWidth > 0) this.#imageLoadState = 'loaded';\n else if (next.complete && hasOwnSource(next)) this.#imageLoadState = 'error';\n\n this.#imageEvents = new AbortController();\n const { signal } = this.#imageEvents;\n const settle = (loadState: ImageLoadState) => () => {\n this.#imageLoadState = loadState;\n this.requestUpdate();\n };\n\n next.addEventListener('load', settle('loaded'), { signal });\n next.addEventListener('error', settle('error'), { signal });\n }\n\n #applySource(src: string): void {\n const img = this.#image;\n\n if (!img) {\n if (__DEV__ && src && !this.#warnedMissingImage) {\n this.#warnedMissingImage = true;\n console.warn(\n `<${this.localName}> resolved a poster but has no image to put it in. ` +\n `Add one as a child: <${this.localName}><img alt=\"\"></${this.localName}>`\n );\n }\n return;\n }\n\n if (!this.#owned) return;\n\n if (!src) {\n this.#imageLoadState = 'pending';\n img.removeAttribute('src');\n } else if (img.getAttribute('src') !== src) {\n // Reset before the write, not after: how the last source fared says\n // nothing about this one, and the write itself can settle it.\n this.#imageLoadState = 'pending';\n img.setAttribute('src', src);\n }\n }\n}\n"],"mappings":";;;;;;;AASA,SAAS,iBAAiB,SAA6B;CACrD,IAAI,mBAAmB,iBAAiB;EACtC,MAAM,WAAW,QAAQ,iBAAiB;EAC1C,IAAI,SAAS,SAAS,GAAG,OAAO;CAClC;CAEA,OAAO,CAAC,GAAG,QAAQ,QAAQ;AAC7B;;;;;;AAOA,SAAS,UAAU,SAA2C;CAC5D,KAAK,MAAM,SAAS,iBAAiB,OAAO,GAAG;EAC7C,IAAI,iBAAiB,kBAAkB,OAAO;EAE9C,MAAM,SAAS,UAAU,KAAK;EAC9B,IAAI,QAAQ,OAAO;CACrB;CAEA,OAAO;AACT;;;;;;AAOA,SAAS,UAAU,KAAgC;CACjD,IAAI,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,QAAQ,GAAG,OAAO;CAElE,MAAM,SAAS,IAAI;CACnB,OAAO,QAAQ,cAAc,aAAa,OAAO,cAAc,QAAQ,MAAM;AAC/E;;;;;;AAOA,SAAS,aAAa,KAAgC;CACpD,OAAO,CAAC,CAAC,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,QAAQ;AAC/D;;;;;;;;;;;;;;AAkBA,IAAa,gBAAb,cAAmC,aAAa;;EACpB,KAAA,UAAA;;CAE1B,WAAW,qBAA+B;EAExC,OAAO,CAAC,GAAG,MAAM,oBAAoB,gBAAgB;CACvD;CAEA,QAAiB,IAAI,WAAW;CAChC,YAAqB,IAAI,uBAAuB,KAAK,cAAc,CAAC;CAEpE,YAAqB,IAAI,iBAAiB,MAAM,eAAe,cAAc;CAC7E,YAAqB,IAAI,iBAAiB,MAAM,eAAe,cAAc;CAE7E,SAAkC;;CAElC,SAAS;CACT,kBAAkC;CAElC,eAAuC;CACvC,cAAsC;CACtC,sBAAsB;CAEtB,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,IAAI,KAAK,WAAW;EAEpB,KAAKI,cAAc,IAAI,gBAAgB;EACvC,MAAM,EAAE,WAAW,KAAKA;EAIxB,KAAK,iBAAiB,oBAAoB,KAAK,cAAc,GAAG,EAAE,OAAO,CAAC;EAC1E,KAAKH,UAAU,QAAQ,MAAM;GAAE,WAAW;GAAM,SAAS;EAAK,CAAC;CAKjE;CAEA,yBAAkC,MAAc,UAAyB,UAA+B;EACtG,MAAM,yBAAyB,MAAM,UAAU,QAAQ;EAEvD,IAAI,SAAS,kBACX,IAAI,UACF,KAAK,MAAM,YAAY,8BAA8B,OAAO,SAAS,EAAE;OAEvE,KAAK,MAAM,eAAe,4BAA4B;CAG5D;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAE3B,KAAKI,OAAO,IAAI;EAChB,KAAKJ,UAAU,WAAW;EAC1B,KAAKG,aAAa,MAAM;EACxB,KAAKA,cAAc;CACrB;CAEA,IAAIE,aAAmC;EACrC,IAAI,CAAC,KAAKC,UAAU,CAAC,UAAU,KAAKA,MAAM,GAAG,OAAO;EACpD,OAAO,KAAKC,oBAAoB,YAAY,YAAY,KAAKA;CAC/D;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAEpB,MAAM,WAAW,KAAKN,UAAU;EAChC,IAAI,CAAC,UAAU;EAIf,KAAKF,MAAM,SAAS;GAClB,SAAS,SAAS;GAClB,QAAQ,KAAKG,UAAU,OAAO,UAAU;EAC1C,CAAC;EAED,MAAM,EAAE,QAAQ,KAAKH,MAAM,SAAS;EAEpC,KAAKK,OAAO,UAAU,IAAI,CAAC;EAC3B,KAAKI,aAAa,GAAG;EAErB,KAAKT,MAAM,kBAAkB,KAAKM,UAAU;EAC5C,oBAAoB,MAAM,KAAKN,MAAM,SAAS,GAAG,eAAe;CAClE;;;;;;CAOA,OAAO,MAAqC;EAC1C,IAAI,SAAS,KAAKO,QAAQ;EAG1B,IAAI,KAAKG,QAAQ,KAAKH,QAAQ,gBAAgB,KAAK;EACnD,KAAKI,cAAc,MAAM;EACzB,KAAKA,eAAe;EAEpB,KAAKJ,SAAS;EACd,KAAKG,SAAS,SAAS,QAAQ,CAAC,UAAU,IAAI;EAC9C,KAAKF,kBAAkB;EAEvB,IAAI,CAAC,MAAM;EAKX,IAAI,KAAK,eAAe,GAAG,KAAKA,kBAAkB;OAC7C,IAAI,KAAK,YAAY,aAAa,IAAI,GAAG,KAAKA,kBAAkB;EAErE,KAAKG,eAAe,IAAI,gBAAgB;EACxC,MAAM,EAAE,WAAW,KAAKA;EACxB,MAAM,UAAU,oBAAoC;GAClD,KAAKH,kBAAkB;GACvB,KAAK,cAAc;EACrB;EAEA,KAAK,iBAAiB,QAAQ,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC;EAC1D,KAAK,iBAAiB,SAAS,OAAO,OAAO,GAAG,EAAE,OAAO,CAAC;CAC5D;CAEA,aAAa,KAAmB;EAC9B,MAAM,MAAM,KAAKD;EAEjB,IAAI,CAAC,KAQH;EAGF,IAAI,CAAC,KAAKG,QAAQ;EAElB,IAAI,CAAC,KAAK;GACR,KAAKF,kBAAkB;GACvB,IAAI,gBAAgB,KAAK;EAC3B,OAAO,IAAI,IAAI,aAAa,KAAK,MAAM,KAAK;GAG1C,KAAKA,kBAAkB;GACvB,IAAI,aAAa,OAAO,GAAG;EAC7B;CACF;AACF"}
|
|
@@ -58,7 +58,7 @@ var QualityRadioGroupElement = class extends MenuRadioGroupElement {
|
|
|
58
58
|
state = this.#core.getState();
|
|
59
59
|
this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value));
|
|
60
60
|
this.#options.sync(state, this.#i18n.value, this.#i18n.locale);
|
|
61
|
-
this.
|
|
61
|
+
this.publishMenuTriggerState(state.disabled, state.availability);
|
|
62
62
|
}
|
|
63
63
|
super.update(changed);
|
|
64
64
|
if (state) applyStateDataAttrs(this, state, QualityRadioGroupDataAttrs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-radio-group-element.js","names":["#setContent","#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/quality-radio-group/quality-radio-group-element.ts"],"sourcesContent":["import { QualityRadioGroupCore, QualityRadioGroupDataAttrs, type QualityRadioGroupOption } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectQuality } from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MenuRadioGroupElement } from '../menu/menu-radio-group-element';\nimport type { MenuRadioItemElement } from '../menu/menu-radio-item-element';\nimport { RadioOptionsController } from '../radio-options/radio-options-controller';\n\nexport class QualityRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-quality-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n label: { type: String },\n } satisfies PropertyDeclarationMap<'value' | 'label' | 'disabled'>;\n\n disabled = false;\n label: Text | string = '';\n formatRendition = QualityRadioGroupCore.defaultProps.formatRendition;\n\n readonly #core = new QualityRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectQuality);\n readonly #options = new RadioOptionsController<QualityRadioGroupOption>(this, {\n renderItem: (item, label, option) => this.#setContent(item, label, option.tier, option.badge),\n setItemAttributes: (item, option) => item.setAttribute('data-rendition', option.value),\n getOptionCacheKey: (option) => `${option.tier ?? ''}:${option.badge ?? ''}`,\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: QualityRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRendition: this.formatRendition, disabled: this.disabled, label: this.label });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value));\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.
|
|
1
|
+
{"version":3,"file":"quality-radio-group-element.js","names":["#setContent","#mediaState","#core","#i18n","#options"],"sources":["../../../../src/ui/quality-radio-group/quality-radio-group-element.ts"],"sourcesContent":["import { QualityRadioGroupCore, QualityRadioGroupDataAttrs, type QualityRadioGroupOption } from '@videojs/core';\nimport { applyStateDataAttrs, logMissingFeature, selectQuality } from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MenuRadioGroupElement } from '../menu/menu-radio-group-element';\nimport type { MenuRadioItemElement } from '../menu/menu-radio-item-element';\nimport { RadioOptionsController } from '../radio-options/radio-options-controller';\n\nexport class QualityRadioGroupElement extends MenuRadioGroupElement {\n static override readonly tagName = 'media-quality-radio-group';\n\n static override properties = {\n ...MenuRadioGroupElement.properties,\n disabled: { type: Boolean },\n label: { type: String },\n } satisfies PropertyDeclarationMap<'value' | 'label' | 'disabled'>;\n\n disabled = false;\n label: Text | string = '';\n formatRendition = QualityRadioGroupCore.defaultProps.formatRendition;\n\n readonly #core = new QualityRadioGroupCore();\n readonly #i18n = new I18nController(this, i18nContext);\n readonly #mediaState = new PlayerController(this, playerContext, selectQuality);\n readonly #options = new RadioOptionsController<QualityRadioGroupOption>(this, {\n renderItem: (item, label, option) => this.#setContent(item, label, option.tier, option.badge),\n setItemAttributes: (item, option) => item.setAttribute('data-rendition', option.value),\n getOptionCacheKey: (option) => `${option.tier ?? ''}:${option.badge ?? ''}`,\n onValueChange: (value) => {\n const media = this.#mediaState.value;\n if (media) this.#core.selectValue(media, value);\n },\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n if (__DEV__ && !this.#mediaState.value && this.#mediaState.displayName) {\n logMissingFeature(this.localName, this.#mediaState.displayName);\n }\n }\n\n protected override update(changed: PropertyValues): void {\n const media = this.#mediaState.value;\n let state: QualityRadioGroupCore.State | null = null;\n\n if (media) {\n this.#core.setProps({ formatRendition: this.formatRendition, disabled: this.disabled, label: this.label });\n this.#core.setMedia(media);\n state = this.#core.getState();\n\n this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value));\n this.#options.sync(state, this.#i18n.value, this.#i18n.locale);\n this.publishMenuTriggerState(state.disabled, state.availability);\n }\n\n super.update(changed);\n\n if (state) applyStateDataAttrs(this, state, QualityRadioGroupDataAttrs);\n }\n\n #setContent(item: MenuRadioItemElement, label: string, tier: string | undefined, badge: string | undefined): void {\n const labelPart = item.querySelector<HTMLElement>('[data-part~=\"label\"]');\n const tierPart = item.querySelector<HTMLElement>('[data-part~=\"tier\"]');\n const badgePart = item.querySelector<HTMLElement>('[data-part~=\"badge\"]');\n\n if (labelPart) {\n labelPart.textContent = label;\n }\n\n if (tierPart) {\n tierPart.textContent = tier ?? '';\n tierPart.hidden = !tier;\n }\n\n if (badgePart) {\n badgePart.textContent = badge ?? '';\n badgePart.hidden = !badge;\n }\n\n if (!labelPart && !tierPart && !badgePart) {\n item.textContent = [label, tier, badge].filter(Boolean).join(' ');\n }\n }\n}\n\nexport namespace QualityRadioGroupElement {\n export type State = QualityRadioGroupCore.State;\n}\n"],"mappings":";;;;;;;;;;AAYA,IAAa,2BAAb,cAA8C,sBAAsB;;;EASvD,KAAA,WAAA;EACY,KAAA,QAAA;EACL,KAAA,kBAAA,sBAAsB,aAAa;EAEpC,KAAA,QAAA,IAAI,sBAAsB;EAC1B,KAAA,QAAA,IAAI,eAAe,MAAM,WAAW;EAC9B,KAAA,cAAA,IAAI,iBAAiB,MAAM,eAAe,aAAa;EAC1D,KAAA,WAAA,IAAI,uBAAgD,MAAM;GAC5E,aAAa,MAAM,OAAO,WAAW,KAAKA,YAAY,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK;GAC5F,oBAAoB,MAAM,WAAW,KAAK,aAAa,kBAAkB,OAAO,KAAK;GACrF,oBAAoB,WAAW,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO,SAAS;GACvE,gBAAgB,UAAU;IACxB,MAAM,QAAQ,KAAKC,YAAY;IAC/B,IAAI,OAAO,KAAKC,MAAM,YAAY,OAAO,KAAK;GAChD;EACF,CAAC;;;EAvBkC,KAAA,UAAA;;;EAEN,KAAA,aAAA;GAC3B,GAAG,sBAAsB;GACzB,UAAU,EAAE,MAAM,QAAQ;GAC1B,OAAO,EAAE,MAAM,OAAO;EACxB;;CAMA;CACA;CACA;CACA;CAUA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,IAAI,KAAK,WAAW;CAKtB;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAKD,YAAY;EAC/B,IAAI,QAA4C;EAEhD,IAAI,OAAO;GACT,KAAKC,MAAM,SAAS;IAAE,iBAAiB,KAAK;IAAiB,UAAU,KAAK;IAAU,OAAO,KAAK;GAAM,CAAC;GACzG,KAAKA,MAAM,SAAS,KAAK;GACzB,QAAQ,KAAKA,MAAM,SAAS;GAE5B,KAAK,sBAAsB,cAAc,KAAKA,MAAM,SAAS,KAAK,GAAG,KAAKC,MAAM,KAAK,CAAC;GACtF,KAAKC,SAAS,KAAK,OAAO,KAAKD,MAAM,OAAO,KAAKA,MAAM,MAAM;GAC7D,KAAK,wBAAwB,MAAM,UAAU,MAAM,YAAY;EACjE;EAEA,MAAM,OAAO,OAAO;EAEpB,IAAI,OAAO,oBAAoB,MAAM,OAAO,0BAA0B;CACxE;CAEA,YAAY,MAA4B,OAAe,MAA0B,OAAiC;EAChH,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EACxE,MAAM,WAAW,KAAK,cAA2B,uBAAqB;EACtE,MAAM,YAAY,KAAK,cAA2B,wBAAsB;EAExE,IAAI,WACF,UAAU,cAAc;EAG1B,IAAI,UAAU;GACZ,SAAS,cAAc,QAAQ;GAC/B,SAAS,SAAS,CAAC;EACrB;EAEA,IAAI,WAAW;GACb,UAAU,cAAc,SAAS;GACjC,UAAU,SAAS,CAAC;EACtB;EAEA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAC9B,KAAK,cAAc;GAAC;GAAO;GAAM;EAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEpE;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider-preview-element.js","names":["#ctx","#stopObservingResize","#width","#applyPosition"],"sources":["../../../../src/ui/slider/slider-preview-element.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"slider-preview-element.js","names":["#ctx","#stopObservingResize","#width","#applyPosition"],"sources":["../../../../src/ui/slider/slider-preview-element.ts"],"sourcesContent":["import type { SliderPreviewProps } from '@videojs/core';\nimport { applyStateDataAttrs, getSliderPreviewStyle } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport { applyStyles, observeResize } 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: NonNullable<SliderPreviewProps['overflow']> = 'clamp';\n\n readonly #ctx = new ContextConsumer(this, {\n context: sliderContext,\n subscribe: true,\n });\n\n #stopObservingResize: (() => void) | null = null;\n #width = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n this.#stopObservingResize = observeResize(this, ([entry]) => {\n this.#width = entry!.contentRect.width;\n this.#applyPosition();\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#stopObservingResize?.();\n this.#stopObservingResize = 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;;;EAOG,KAAA,WAAA;EAExC,KAAA,OAAA,IAAI,gBAAgB,MAAM;GACxC,SAAS;GACT,WAAW;EACb,CAAC;EAE2C,KAAA,uBAAA;EACnC,KAAA,SAAA;;;EAdiB,KAAA,UAAA;;;EAEG,KAAA,aAAA,EAC3B,UAAU,EAAE,MAAM,OAAO,EAC3B;;CAIA;CAKA;CACA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EAExB,KAAKC,uBAAuB,cAAc,OAAO,CAAC,WAAW;GAC3D,KAAKC,SAAS,MAAO,YAAY;GACjC,KAAKC,eAAe;EACtB,CAAC;CACH;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKF,uBAAuB;EAC5B,KAAKA,uBAAuB;CAC9B;CAEA,iBAAuB;EACrB,YAAY,MAAM,sBAAsB,KAAKC,QAAQ,KAAK,QAAQ,CAAC;CACrE;CAEA,OAA0B,UAAgC;EACxD,MAAM,OAAO,QAAQ;EAErB,MAAM,MAAM,KAAKF,KAAK;EACtB,IAAI,KAAK,oBAAoB,MAAM,IAAI,OAAO,IAAI,YAAY;EAE9D,KAAKG,eAAe;CACtB;AACF"}
|