@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":"hotkey-element.js","names":["#player","#container","#register","#unregister","#cleanup"],"sources":["../../../../src/ui/hotkey/hotkey-element.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"hotkey-element.js","names":["#player","#container","#register","#unregister","#cleanup"],"sources":["../../../../src/ui/hotkey/hotkey-element.ts"],"sourcesContent":["import type { HotkeyProps } from '@videojs/core';\nimport { createHotkey, isHotkeyToggleAction, resolveHotkeyAction } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\n\nimport { containerContext, playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\nexport class HotkeyElement extends MediaElement {\n static readonly tagName = 'media-hotkey';\n\n static override properties: PropertyDeclarationMap = {\n keys: { type: String },\n action: { type: String },\n value: { type: Number },\n disabled: { type: Boolean },\n target: { type: String },\n };\n\n keys: HotkeyProps['keys'] = '';\n action: HotkeyProps['action'] = '';\n value: HotkeyProps['value'] = undefined;\n disabled: NonNullable<HotkeyProps['disabled']> = false;\n target: NonNullable<HotkeyProps['target']> = 'player';\n\n readonly #player = new PlayerController(this, playerContext);\n readonly #container = new ContextConsumer(this, {\n context: containerContext,\n callback: () => this.requestUpdate(),\n subscribe: true,\n });\n #cleanup: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.display = 'none';\n this.#register();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#unregister();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n // Re-register when attributes change.\n if (this.isConnected) {\n this.#unregister();\n this.#register();\n }\n }\n\n #register(): void {\n const store = this.#player.value;\n const container = this.#container.value?.container;\n if (!this.keys || !this.action || !store || !container) return;\n\n const resolver = resolveHotkeyAction(this.action);\n if (!resolver) return;\n\n const { value, action } = this;\n\n this.#cleanup = createHotkey(container, {\n keys: this.keys,\n action,\n value,\n target: this.target,\n disabled: this.disabled,\n repeatable: !isHotkeyToggleAction(action),\n onActivate: (_event, key) => {\n resolver({ store, key, value });\n },\n });\n }\n\n #unregister(): void {\n this.#cleanup?.();\n this.#cleanup = null;\n }\n}\n"],"mappings":";;;;;;AASA,IAAa,gBAAb,cAAmC,aAAa;;;EAWlB,KAAA,OAAA;EACI,KAAA,SAAA;EACF,KAAA,QAAA,KAAA;EACmB,KAAA,WAAA;EACJ,KAAA,SAAA;EAE1B,KAAA,UAAA,IAAI,iBAAiB,MAAM,aAAa;EACrC,KAAA,aAAA,IAAI,gBAAgB,MAAM;GAC9C,SAAS;GACT,gBAAgB,KAAK,cAAc;GACnC,WAAW;EACb,CAAC;EAC+B,KAAA,WAAA;;;EAtBN,KAAA,UAAA;;;EAE2B,KAAA,aAAA;GACnD,MAAM,EAAE,MAAM,OAAO;GACrB,QAAQ,EAAE,MAAM,OAAO;GACvB,OAAO,EAAE,MAAM,OAAO;GACtB,UAAU,EAAE,MAAM,QAAQ;GAC1B,QAAQ,EAAE,MAAM,OAAO;EACzB;;CAQA;CACA;CAKA;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,MAAM,UAAU;EACrB,KAAKE,UAAU;CACjB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAKC,YAAY;CACnB;CAEA,OAA0B,SAA+B;EACvD,MAAM,OAAO,OAAO;EAGpB,IAAI,KAAK,aAAa;GACpB,KAAKA,YAAY;GACjB,KAAKD,UAAU;EACjB;CACF;CAEA,YAAkB;EAChB,MAAM,QAAQ,KAAKF,QAAQ;EAC3B,MAAM,YAAY,KAAKC,WAAW,OAAO;EACzC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,WAAW;EAExD,MAAM,WAAW,oBAAoB,KAAK,MAAM;EAChD,IAAI,CAAC,UAAU;EAEf,MAAM,EAAE,OAAO,WAAW;EAE1B,KAAKG,WAAW,aAAa,WAAW;GACtC,MAAM,KAAK;GACX;GACA;GACA,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,YAAY,CAAC,qBAAqB,MAAM;GACxC,aAAa,QAAQ,QAAQ;IAC3B,SAAS;KAAE;KAAO;KAAK;IAAM,CAAC;GAChC;EACF,CAAC;CACH;CAEA,cAAoB;EAClB,KAAKA,WAAW;EAChB,KAAKA,WAAW;CAClB;AACF"}
|
|
@@ -2,17 +2,17 @@ import { RadioGroupContextValue, radioGroupContext } from "../radio-group/contex
|
|
|
2
2
|
import { MenuApi } from "@videojs/core/dom";
|
|
3
3
|
import { MenuState, StateAttrMap } from "@videojs/core";
|
|
4
4
|
//#region src/ui/menu/context.d.ts
|
|
5
|
+
interface MenuTriggerState {
|
|
6
|
+
hint: string;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
availability?: 'available' | 'unavailable' | 'unsupported' | undefined;
|
|
9
|
+
}
|
|
5
10
|
interface MenuContextValue {
|
|
6
11
|
menu: MenuApi;
|
|
7
12
|
state: MenuState;
|
|
8
13
|
stateAttrMap: StateAttrMap<MenuState>;
|
|
9
|
-
/** Publish
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
interface MenuTriggerMetadata {
|
|
13
|
-
hint: string;
|
|
14
|
-
disabled: boolean;
|
|
15
|
-
availability?: 'available' | 'unavailable' | 'unsupported' | undefined;
|
|
14
|
+
/** Publish display and interaction state to this submenu's trigger. */
|
|
15
|
+
setTriggerState: (state: MenuTriggerState) => void;
|
|
16
16
|
}
|
|
17
17
|
interface MenuGroupContextValue {
|
|
18
18
|
registerLabel: (id: string) => () => void;
|
|
@@ -24,5 +24,5 @@ declare const menuGroupContext: {
|
|
|
24
24
|
__context__: MenuGroupContextValue;
|
|
25
25
|
};
|
|
26
26
|
//#endregion
|
|
27
|
-
export { MenuContextValue, MenuGroupContextValue, type RadioGroupContextValue as MenuRadioGroupContextValue,
|
|
27
|
+
export { MenuContextValue, MenuGroupContextValue, type RadioGroupContextValue as MenuRadioGroupContextValue, MenuTriggerState, menuContext, menuGroupContext, radioGroupContext as menuRadioGroupContext };
|
|
28
28
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","names":[],"sources":["../../../../src/ui/menu/context.ts"],"mappings":";;;;UAIiB;EACf,MAAM;EACN,OAAO;EACP,cAAc,aAAa;;EAE3B,
|
|
1
|
+
{"version":3,"file":"context.d.ts","names":[],"sources":["../../../../src/ui/menu/context.ts"],"mappings":";;;;UAIiB;EACf;EACA;EACA;;UAGe;EACf,MAAM;EACN,OAAO;EACP,cAAc,aAAa;;EAE3B,kBAAkB,OAAO;;UAGV;EACf,gBAAgB;;cAML;eAAA;;cACA;eAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/menu/context.ts"],"sourcesContent":["import type { MenuState, StateAttrMap } from '@videojs/core';\nimport type { MenuApi } from '@videojs/core/dom';\nimport { createContext } from '@videojs/element/context';\n\nexport interface MenuContextValue {\n menu: MenuApi;\n state: MenuState;\n stateAttrMap: StateAttrMap<MenuState>;\n /** Publish
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/menu/context.ts"],"sourcesContent":["import type { MenuState, StateAttrMap } from '@videojs/core';\nimport type { MenuApi } from '@videojs/core/dom';\nimport { createContext } from '@videojs/element/context';\n\nexport interface MenuTriggerState {\n hint: string;\n disabled: boolean;\n availability?: 'available' | 'unavailable' | 'unsupported' | undefined;\n}\n\nexport interface MenuContextValue {\n menu: MenuApi;\n state: MenuState;\n stateAttrMap: StateAttrMap<MenuState>;\n /** Publish display and interaction state to this submenu's trigger. */\n setTriggerState: (state: MenuTriggerState) => void;\n}\n\nexport interface MenuGroupContextValue {\n registerLabel: (id: string) => () => void;\n}\n\nconst MENU_CONTEXT_KEY = Symbol('@videojs/menu');\nconst MENU_GROUP_CONTEXT_KEY = Symbol('@videojs/menu-group');\n\nexport const menuContext = createContext<MenuContextValue>(MENU_CONTEXT_KEY);\nexport const menuGroupContext = createContext<MenuGroupContextValue>(MENU_GROUP_CONTEXT_KEY);\n\nexport {\n type RadioGroupContextValue as MenuRadioGroupContextValue,\n radioGroupContext as menuRadioGroupContext,\n} from '../radio-group/context';\n"],"mappings":";;;AAsBA,MAAM,mBAAmB,OAAO,eAAe;AAC/C,MAAM,yBAAyB,OAAO,qBAAqB;AAE3D,MAAa,cAAc,cAAgC,gBAAgB;AAC3E,MAAa,mBAAmB,cAAqC,sBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-element.d.ts","names":[],"sources":["../../../../src/ui/menu/menu-element.ts"],"mappings":";;;;cAmCa,oBAAoB;;kBACf;SAEA;;MACN,MAAI;;;MACG,MAAI;MAAW;;;MACtB,MAAI;;;MACH,MAAI;;;MACI,MAAI;MAAW;;;MACT,MAAI;MAAW;;;MAC1B,MAAI;;;EAKlB;EACA;EACA,8BAAI;EACJ,+BAAK;EACL;EACA;EACA,UAAU;EAwBD;EA2CA;EAgBT,MAAM,SAAQ;EAId,SAAS,SAAQ;YAIE,WAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"menu-element.d.ts","names":[],"sources":["../../../../src/ui/menu/menu-element.ts"],"mappings":";;;;cAmCa,oBAAoB;;kBACf;SAEA;;MACN,MAAI;;;MACG,MAAI;MAAW;;;MACtB,MAAI;;;MACH,MAAI;;;MACI,MAAI;MAAW;;;MACT,MAAI;MAAW;;;MAC1B,MAAI;;;EAKlB;EACA;EACA,8BAAI;EACJ,+BAAK;EACL;EACA;EACA,UAAU;EAwBD;EA2CA;EAgBT,MAAM,SAAQ;EAId,SAAS,SAAQ;YAIE,WAAW,SAAS;YAsBpB,OAAO,UAAU"}
|
|
@@ -10,7 +10,7 @@ import { tryHidePopover, tryShowPopover } from "@videojs/utils/dom";
|
|
|
10
10
|
import { SnapshotController } from "@videojs/store/html";
|
|
11
11
|
import { MenuCore, MenuDataAttrs, POPUP_HOST_ATTR } from "@videojs/core";
|
|
12
12
|
//#region src/ui/menu/menu-element.ts
|
|
13
|
-
const
|
|
13
|
+
const defaultTriggerState = {
|
|
14
14
|
hint: "",
|
|
15
15
|
disabled: false
|
|
16
16
|
};
|
|
@@ -44,8 +44,8 @@ var MenuElement = class extends MediaElement {
|
|
|
44
44
|
this.#triggerAbort = null;
|
|
45
45
|
this.#cleanupSizeObserver = null;
|
|
46
46
|
this.#currentTrigger = null;
|
|
47
|
-
this.#
|
|
48
|
-
this.#
|
|
47
|
+
this.#stateTrigger = null;
|
|
48
|
+
this.#triggerState = defaultTriggerState;
|
|
49
49
|
this.#releaseControlsLock = null;
|
|
50
50
|
this.#registeredParentMenu = null;
|
|
51
51
|
this.#cleanupParentRegistration = null;
|
|
@@ -67,10 +67,10 @@ var MenuElement = class extends MediaElement {
|
|
|
67
67
|
this.#handleContentFocusOut = (event) => {
|
|
68
68
|
this.#menu?.contentProps.onFocusOut(event);
|
|
69
69
|
};
|
|
70
|
-
this.#
|
|
71
|
-
if (
|
|
72
|
-
this.#
|
|
73
|
-
if (
|
|
70
|
+
this.#setTriggerState = (triggerState) => {
|
|
71
|
+
if (triggerState.hint === this.#triggerState.hint && triggerState.disabled === this.#triggerState.disabled && triggerState.availability === this.#triggerState.availability) return;
|
|
72
|
+
this.#triggerState = triggerState;
|
|
73
|
+
if (triggerState.disabled && this.open && this.#parentCtx.value) this.close("imperative-action");
|
|
74
74
|
this.requestUpdate();
|
|
75
75
|
};
|
|
76
76
|
}
|
|
@@ -111,8 +111,8 @@ var MenuElement = class extends MediaElement {
|
|
|
111
111
|
#triggerAbort;
|
|
112
112
|
#cleanupSizeObserver;
|
|
113
113
|
#currentTrigger;
|
|
114
|
-
#
|
|
115
|
-
#
|
|
114
|
+
#stateTrigger;
|
|
115
|
+
#triggerState;
|
|
116
116
|
#releaseControlsLock;
|
|
117
117
|
#registeredParentMenu;
|
|
118
118
|
#cleanupParentRegistration;
|
|
@@ -151,7 +151,7 @@ var MenuElement = class extends MediaElement {
|
|
|
151
151
|
super.disconnectedCallback();
|
|
152
152
|
this.#cleanupSizeObserver?.();
|
|
153
153
|
this.#cleanupSizeObserver = null;
|
|
154
|
-
this.#
|
|
154
|
+
this.#syncTriggerState(null);
|
|
155
155
|
this.#cleanupTrigger();
|
|
156
156
|
this.#cleanupParentRegistration?.();
|
|
157
157
|
this.#cleanupParentRegistration = null;
|
|
@@ -171,7 +171,6 @@ var MenuElement = class extends MediaElement {
|
|
|
171
171
|
super.willUpdate(changed);
|
|
172
172
|
if (!this.hasUpdated && this.defaultOpen && !this.open) this.open = true;
|
|
173
173
|
const parentCtx = this.#parentCtx.value ?? null;
|
|
174
|
-
const isSubmenu = parentCtx !== null;
|
|
175
174
|
this.#syncParentRegistration(parentCtx);
|
|
176
175
|
this.#core.setProps({
|
|
177
176
|
open: this.open,
|
|
@@ -179,8 +178,7 @@ var MenuElement = class extends MediaElement {
|
|
|
179
178
|
side: this.side,
|
|
180
179
|
align: this.align,
|
|
181
180
|
closeOnEscape: this.closeOnEscape,
|
|
182
|
-
closeOnOutsideClick: this.closeOnOutsideClick
|
|
183
|
-
isSubmenu
|
|
181
|
+
closeOnOutsideClick: this.closeOnOutsideClick
|
|
184
182
|
});
|
|
185
183
|
if (this.#menu && changed.has("open")) this.#menu.syncOpen(this.open);
|
|
186
184
|
}
|
|
@@ -190,7 +188,10 @@ var MenuElement = class extends MediaElement {
|
|
|
190
188
|
const parentCtx = this.#parentCtx.value ?? null;
|
|
191
189
|
const isSubmenu = parentCtx !== null;
|
|
192
190
|
const input = this.#menu.input.current;
|
|
193
|
-
this.#core.setInput(
|
|
191
|
+
this.#core.setInput({
|
|
192
|
+
...input,
|
|
193
|
+
isSubmenu
|
|
194
|
+
});
|
|
194
195
|
const state = this.#core.getState();
|
|
195
196
|
if (!isSubmenu && state.open) this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;
|
|
196
197
|
else this.#releaseControlsVisibilityLock();
|
|
@@ -200,7 +201,7 @@ var MenuElement = class extends MediaElement {
|
|
|
200
201
|
menu: this.#menu,
|
|
201
202
|
state,
|
|
202
203
|
stateAttrMap: MenuDataAttrs,
|
|
203
|
-
|
|
204
|
+
setTriggerState: this.#setTriggerState
|
|
204
205
|
});
|
|
205
206
|
}
|
|
206
207
|
#releaseControlsVisibilityLock() {
|
|
@@ -250,7 +251,7 @@ var MenuElement = class extends MediaElement {
|
|
|
250
251
|
const triggerElement = this.parentElement?.querySelector(`[data-has-submenu][commandfor="${this.id}"]`);
|
|
251
252
|
this.#menu?.setTriggerElement(triggerElement ?? null);
|
|
252
253
|
if (triggerElement) applyElementProps(triggerElement, this.#core.getTriggerAttrs(state, this.id));
|
|
253
|
-
this.#
|
|
254
|
+
this.#syncTriggerState(triggerElement ?? null);
|
|
254
255
|
this.removeAttribute(MenuDataAttrs.side);
|
|
255
256
|
this.removeAttribute(MenuDataAttrs.align);
|
|
256
257
|
applyStateDataAttrs(this, state, MenuDataAttrs);
|
|
@@ -270,22 +271,22 @@ var MenuElement = class extends MediaElement {
|
|
|
270
271
|
}
|
|
271
272
|
#handleContentKeyDown;
|
|
272
273
|
#handleContentFocusOut;
|
|
273
|
-
#
|
|
274
|
-
#
|
|
275
|
-
if (trigger !== this.#
|
|
276
|
-
this.#
|
|
277
|
-
this.#
|
|
274
|
+
#setTriggerState;
|
|
275
|
+
#syncTriggerState(trigger) {
|
|
276
|
+
if (trigger !== this.#stateTrigger) {
|
|
277
|
+
this.#clearTriggerState();
|
|
278
|
+
this.#stateTrigger = trigger;
|
|
278
279
|
}
|
|
279
280
|
if (!trigger) return;
|
|
280
281
|
applyElementProps(trigger, {
|
|
281
|
-
"aria-disabled": this.#
|
|
282
|
-
"data-availability": this.#
|
|
282
|
+
"aria-disabled": this.#triggerState.disabled || isTriggerExplicitlyDisabled(trigger) ? "true" : void 0,
|
|
283
|
+
"data-availability": this.#triggerState.availability
|
|
283
284
|
});
|
|
284
285
|
const hint = trigger.querySelector("[data-part~=\"hint\"]");
|
|
285
|
-
if (hint && hint.textContent !== this.#
|
|
286
|
+
if (hint && hint.textContent !== this.#triggerState.hint) hint.textContent = this.#triggerState.hint;
|
|
286
287
|
}
|
|
287
|
-
#
|
|
288
|
-
const trigger = this.#
|
|
288
|
+
#clearTriggerState() {
|
|
289
|
+
const trigger = this.#stateTrigger;
|
|
289
290
|
if (!trigger) return;
|
|
290
291
|
applyElementProps(trigger, {
|
|
291
292
|
"aria-disabled": isTriggerExplicitlyDisabled(trigger) ? "true" : void 0,
|
|
@@ -293,7 +294,7 @@ var MenuElement = class extends MediaElement {
|
|
|
293
294
|
});
|
|
294
295
|
const hint = trigger.querySelector("[data-part~=\"hint\"]");
|
|
295
296
|
if (hint?.textContent) hint.textContent = "";
|
|
296
|
-
this.#
|
|
297
|
+
this.#stateTrigger = null;
|
|
297
298
|
}
|
|
298
299
|
#syncTrigger(triggerElement) {
|
|
299
300
|
if (triggerElement === this.#currentTrigger) return;
|
|
@@ -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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"}
|
|
@@ -10,7 +10,7 @@ declare class MenuRadioGroupElement extends RadioGroupElement {
|
|
|
10
10
|
protected setItemLabel(item: MenuRadioItemElement, label: string): void;
|
|
11
11
|
/** Applies a generated fallback without replacing an author-provided accessible name. */
|
|
12
12
|
protected applyDefaultAriaLabel(label: string): void;
|
|
13
|
-
protected
|
|
13
|
+
protected publishMenuTriggerState(disabled: boolean, availability?: 'available' | 'unavailable' | 'unsupported'): void;
|
|
14
14
|
}
|
|
15
15
|
//#endregion
|
|
16
16
|
export { MenuRadioGroupElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-radio-group-element.d.ts","names":[],"sources":["../../../../src/ui/menu/menu-radio-group-element.ts"],"mappings":";;;;cASa,8BAA8B;;kBACzB;EAQP;YAKU,OAAO,SAAS;YAMzB,aAAa,MAAM,sBAAsB;;YAWzC,sBAAsB;YAUtB,
|
|
1
|
+
{"version":3,"file":"menu-radio-group-element.d.ts","names":[],"sources":["../../../../src/ui/menu/menu-radio-group-element.ts"],"mappings":";;;;cASa,8BAA8B;;kBACzB;EAQP;YAKU,OAAO,SAAS;YAMzB,aAAa,MAAM,sBAAsB;;YAWzC,sBAAsB;YAUtB,wBACR,mBACA"}
|
|
@@ -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"}
|
|
@@ -54,7 +54,7 @@ var PlaybackRateRadioGroupElement = class extends MenuRadioGroupElement {
|
|
|
54
54
|
state = this.#core.getState();
|
|
55
55
|
this.applyDefaultAriaLabel(translateText(this.#core.getLabel(state), this.#i18n.value, this.#core.getLabelParams(state)));
|
|
56
56
|
this.#options.sync(state, this.#i18n.value, this.#i18n.locale);
|
|
57
|
-
this.
|
|
57
|
+
this.publishMenuTriggerState(state.disabled, state.availability);
|
|
58
58
|
}
|
|
59
59
|
super.update(changed);
|
|
60
60
|
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;EAEpB,IAAe,CAAC,KAAKD,YAAY,SAAS,KAAKA,YAAY,aACzD,kBAAkB,KAAK,WAAW,KAAKA,YAAY,WAAW;CAElE;CAEA,OAA0B,SAA+B;EACvD,MAAM,QAAQ,KAAKA,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,25 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { index_d_exports } from "../../index.js";
|
|
4
|
-
import { PosterCore } from "@videojs/core";
|
|
1
|
+
import { MediaElement } from "../media-element.js";
|
|
2
|
+
import { PropertyValues } from "@videojs/element";
|
|
5
3
|
//#region src/ui/poster/poster-element.d.ts
|
|
6
|
-
|
|
4
|
+
/**
|
|
5
|
+
* `<media-poster>` — sets `src` on a poster image it does not own.
|
|
6
|
+
*
|
|
7
|
+
* The image is a child, as in `<picture>`, but sourcing runs the other way
|
|
8
|
+
* around: `<picture>` treats the `src` on its `<img>` as the fallback, while
|
|
9
|
+
* here an image with no source of its own is the one this element fills in.
|
|
10
|
+
* Give the child a `src`, a `srcset`, or `<source>` candidates and it is yours,
|
|
11
|
+
* left alone.
|
|
12
|
+
*
|
|
13
|
+
* Renders no image of its own, so include one:
|
|
14
|
+
* `<media-poster><img alt=""></media-poster>`. Inside a skin, an
|
|
15
|
+
* `<img slot="poster">` of yours replaces the one the skin carries.
|
|
16
|
+
*/
|
|
17
|
+
declare class PosterElement extends MediaElement {
|
|
18
|
+
#private;
|
|
7
19
|
static readonly tagName = "media-poster";
|
|
8
20
|
static get observedAttributes(): string[];
|
|
9
|
-
|
|
10
|
-
protected readonly stateAttrMap: {
|
|
11
|
-
readonly visible: 'data-visible';
|
|
12
|
-
};
|
|
13
|
-
protected readonly mediaState: PlayerController<index_d_exports.AnyPlayerStore, {
|
|
14
|
-
paused: boolean;
|
|
15
|
-
ended: boolean;
|
|
16
|
-
started: boolean;
|
|
17
|
-
waiting: boolean;
|
|
18
|
-
play: () => Promise<void>;
|
|
19
|
-
pause: () => void;
|
|
20
|
-
togglePaused: () => boolean;
|
|
21
|
-
} | undefined>;
|
|
21
|
+
connectedCallback(): void;
|
|
22
22
|
attributeChangedCallback(attr: string, oldValue: string | null, newValue: string | null): void;
|
|
23
|
+
disconnectedCallback(): void;
|
|
24
|
+
protected update(changed: PropertyValues): void;
|
|
23
25
|
}
|
|
24
26
|
//#endregion
|
|
25
27
|
export { PosterElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poster-element.d.ts","names":[],"sources":["../../../../src/ui/poster/poster-element.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"poster-element.d.ts","names":[],"sources":["../../../../src/ui/poster/poster-element.ts"],"mappings":";;;;;;;;;;;;;;;;cAuEa,sBAAsB;;kBACjB;aAEL;EAoBF;EAiBA,yBAAyB,cAAc,yBAAyB;EAYhE;YAcU,OAAO,SAAS"}
|