@videojs/html 10.0.0-beta.27 → 10.0.0-beta.28
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/audio-headless.dev.js +1 -1
- package/cdn/audio-headless.js +1 -1
- package/cdn/audio-minimal-ui.dev.js +1 -1
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +4 -4
- 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 +1 -1
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +4 -4
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background-video-WKumpp49.js +59 -0
- package/cdn/background-video-WKumpp49.js.map +1 -0
- package/cdn/background-video-YHY_3-lX.js +2 -0
- package/cdn/background-video-YHY_3-lX.js.map +1 -0
- package/cdn/background.dev.js +3 -56
- package/cdn/background.dev.js.map +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/bn-CcLIScl6.js +108 -0
- package/cdn/bn-CcLIScl6.js.map +1 -0
- package/cdn/bn-KcCmQhYd.js +2 -0
- package/cdn/bn-KcCmQhYd.js.map +1 -0
- package/cdn/compounds-BEO1d3ZM.js +8 -0
- package/cdn/compounds-BEO1d3ZM.js.map +1 -0
- package/cdn/{compounds-CCvdpvge.js → compounds-nk9RJtBK.js} +8 -15
- package/cdn/compounds-nk9RJtBK.js.map +1 -0
- package/cdn/container-element-Dd0ZCdhK.js +14 -0
- package/cdn/container-element-Dd0ZCdhK.js.map +1 -0
- package/cdn/container-element-HHK_KZOE.js +376 -0
- package/cdn/container-element-HHK_KZOE.js.map +1 -0
- package/cdn/{create-player-BHFyOnWi.js → create-player-DK9WOywd.js} +19 -379
- package/cdn/create-player-DK9WOywd.js.map +1 -0
- package/cdn/create-player-hSdQMP5p.js +2 -0
- package/cdn/create-player-hSdQMP5p.js.map +1 -0
- package/cdn/embed-params-D2e8u0d4.js +2 -0
- package/cdn/embed-params-D2e8u0d4.js.map +1 -0
- package/cdn/embed-params-W6T88S8x.js +39 -0
- package/cdn/embed-params-W6T88S8x.js.map +1 -0
- package/cdn/{gesture-element-CG-Sx_5t.js → gesture-element-6Ld1YwIL.js} +3 -3
- package/cdn/{gesture-element-CG-Sx_5t.js.map → gesture-element-6Ld1YwIL.js.map} +1 -1
- package/cdn/gesture-element-BC48ucj9.js +2 -0
- package/cdn/{gesture-element-BNfMI8eh.js.map → gesture-element-BC48ucj9.js.map} +1 -1
- package/cdn/{hls-js-g1zdcyvE.js → hls-js-BEuVm0u9.js} +3 -2
- package/cdn/{hls-js-g1zdcyvE.js.map → hls-js-BEuVm0u9.js.map} +1 -1
- package/cdn/hls-js-C4P_b2tT.js +2 -0
- package/cdn/{hls-js-6lW7L4th.js.map → hls-js-C4P_b2tT.js.map} +1 -1
- package/cdn/hls-js-CATW7NBm.js +2 -0
- package/cdn/{hls-js-DCQzjzB5.js.map → hls-js-CATW7NBm.js.map} +1 -1
- package/cdn/{hls-js-Cwj8UBx9.js → hls-js-WCNy9MVh.js} +3 -2
- package/cdn/{hls-js-Cwj8UBx9.js.map → hls-js-WCNy9MVh.js.map} +1 -1
- package/cdn/i18n-CE4KxKuj.js +2 -0
- package/cdn/i18n-CE4KxKuj.js.map +1 -0
- package/cdn/{i18n-Mtlmj1AA.js → i18n-Ch4t6EjV.js} +2 -2
- package/cdn/{i18n-Mtlmj1AA.js.map → i18n-Ch4t6EjV.js.map} +1 -1
- package/cdn/i18n-Dc7WM2xd.js +2 -0
- package/cdn/{i18n-DfKGl5Rh.js.map → i18n-Dc7WM2xd.js.map} +1 -1
- package/cdn/i18n-DyF_NfCk.js +157 -0
- package/cdn/i18n-DyF_NfCk.js.map +1 -0
- package/cdn/i18n.dev.js +3 -152
- package/cdn/i18n.dev.js.map +1 -1
- package/cdn/i18n.js +1 -1
- package/cdn/i18n.js.map +1 -1
- package/cdn/{live-button-element-B_y-ZJBy.js → live-button-element-Bae44kBN.js} +5 -4
- package/cdn/live-button-element-Bae44kBN.js.map +1 -0
- package/cdn/live-button-element-DaHgnYdw.js +2 -0
- package/cdn/{live-button-element-CWfkQUoy.js.map → live-button-element-DaHgnYdw.js.map} +1 -1
- package/cdn/live-video-minimal.dev.js +8 -8
- 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 +9 -9
- 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/locales/bn.dev.js +1 -1
- package/cdn/locales/bn.js +1 -1
- package/cdn/media/background-video.dev.d.ts +1 -0
- package/cdn/media/background-video.dev.js +3 -0
- package/cdn/media/background-video.js +1 -0
- package/cdn/media/cloudflare-video.dev.d.ts +1 -0
- package/cdn/media/cloudflare-video.dev.js +668 -0
- package/cdn/media/cloudflare-video.dev.js.map +1 -0
- package/cdn/media/cloudflare-video.js +2 -0
- package/cdn/media/cloudflare-video.js.map +1 -0
- package/cdn/media/container.dev.d.ts +1 -0
- package/cdn/media/container.dev.js +8 -0
- package/cdn/media/container.dev.js.map +1 -0
- package/cdn/media/container.js +2 -0
- package/cdn/media/container.js.map +1 -0
- package/cdn/media/dash-video.dev.js +2 -1
- package/cdn/media/dash-video.js +2 -2
- package/cdn/media/dash-video.js.map +1 -1
- package/cdn/media/google-cast.dev.js +2 -31
- package/cdn/media/google-cast.dev.js.map +1 -1
- package/cdn/media/google-cast.js +3 -3
- package/cdn/media/google-cast.js.map +1 -1
- package/cdn/media/hls-audio.dev.js +1 -0
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-audio.js.map +1 -1
- package/cdn/media/hls-background-video.dev.js +2 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-background-video.js.map +1 -1
- package/cdn/media/hls-video.dev.js +2 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/hls-video.js.map +1 -1
- package/cdn/media/hlsjs-video.dev.js +2 -1
- package/cdn/media/hlsjs-video.js +1 -1
- package/cdn/media/hlsjs-video.js.map +1 -1
- package/cdn/media/mux-audio/hls-js.dev.js +3 -1
- package/cdn/media/mux-audio/hls-js.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +1 -0
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-audio/spf.js.map +1 -1
- package/cdn/media/mux-audio.dev.js +3 -1
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-background-video.dev.js +2 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-background-video.js.map +1 -1
- package/cdn/media/mux-data.dev.js +2 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +2 -2
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/hls-js.dev.js +3 -1
- package/cdn/media/mux-video/hls-js.js +1 -1
- package/cdn/media/mux-video/spf.dev.js +2 -1
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/mux-video/spf.js.map +1 -1
- package/cdn/media/mux-video.dev.js +3 -1
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/native-hls-video.dev.js +1 -0
- package/cdn/media/native-hls-video.js +1 -1
- package/cdn/media/native-hls-video.js.map +1 -1
- package/cdn/media/spotify-audio.dev.d.ts +1 -0
- package/cdn/media/spotify-audio.dev.js +605 -0
- package/cdn/media/spotify-audio.dev.js.map +1 -0
- package/cdn/media/spotify-audio.js +2 -0
- package/cdn/media/spotify-audio.js.map +1 -0
- package/cdn/media/tiktok-video.dev.d.ts +1 -0
- package/cdn/media/tiktok-video.dev.js +636 -0
- package/cdn/media/tiktok-video.dev.js.map +1 -0
- package/cdn/media/tiktok-video.js +2 -0
- package/cdn/media/tiktok-video.js.map +1 -0
- package/cdn/media/twitch-video.dev.d.ts +1 -0
- package/cdn/media/twitch-video.dev.js +627 -0
- package/cdn/media/twitch-video.dev.js.map +1 -0
- package/cdn/media/twitch-video.js +2 -0
- package/cdn/media/twitch-video.js.map +1 -0
- package/cdn/media/vimeo-video.dev.d.ts +1 -0
- package/cdn/media/vimeo-video.dev.js +2989 -0
- package/cdn/media/vimeo-video.dev.js.map +1 -0
- package/cdn/media/vimeo-video.js +16 -0
- package/cdn/media/vimeo-video.js.map +1 -0
- package/cdn/media/youtube-video.dev.d.ts +1 -0
- package/cdn/media/youtube-video.dev.js +713 -0
- package/cdn/media/youtube-video.dev.js.map +1 -0
- package/cdn/media/youtube-video.js +2 -0
- package/cdn/media/youtube-video.js.map +1 -0
- package/cdn/{media-Cp3acYc8.js → media-BavrGKqa.js} +274 -5
- package/cdn/media-BavrGKqa.js.map +1 -0
- package/cdn/media-Bmablv4g.js +2 -0
- package/cdn/media-Bmablv4g.js.map +1 -0
- package/cdn/{media-B_gQXwri.js → media-COIe3uI5.js} +12 -3
- package/cdn/media-COIe3uI5.js.map +1 -0
- package/cdn/{media-CbWsJJhU.js → media-CPVSKLdk.js} +2 -2
- package/cdn/{media-CbWsJJhU.js.map → media-CPVSKLdk.js.map} +1 -1
- package/cdn/media-CanBm0Jh.js +41 -0
- package/cdn/media-CanBm0Jh.js.map +1 -0
- package/cdn/{media-Dq4zmIJa2.js → media-Dq4zmIJa.js} +1 -1
- package/cdn/media-Dq4zmIJa.js.map +1 -0
- package/cdn/{media-DRo3n8tM.js → media-oa3nyL2o.js} +3 -3
- package/cdn/{media-DRo3n8tM.js.map → media-oa3nyL2o.js.map} +1 -1
- package/cdn/media-played-ranges-CM2zeOGr.js +2 -0
- package/cdn/media-played-ranges-CM2zeOGr.js.map +1 -0
- package/cdn/media-played-ranges-Yd9acuMt.js +156 -0
- package/cdn/media-played-ranges-Yd9acuMt.js.map +1 -0
- package/cdn/{media-suYcjCG22.js → media-suYcjCG2.js} +1 -1
- package/cdn/media-suYcjCG2.js.map +1 -0
- package/cdn/minimal-ui-8iRZf_72.js +2 -0
- package/cdn/{minimal-ui-AFk6Ut5f.js.map → minimal-ui-8iRZf_72.js.map} +1 -1
- package/cdn/{minimal-ui--JsmpU2q.js → minimal-ui-BpHxIo4z.js} +5 -5
- package/cdn/{minimal-ui--JsmpU2q.js.map → minimal-ui-BpHxIo4z.js.map} +1 -1
- package/cdn/{minimal-ui-Bxcpf5Mb.js → minimal-ui-CRKvUmB8.js} +9 -9
- package/cdn/{minimal-ui-Bxcpf5Mb.js.map → minimal-ui-CRKvUmB8.js.map} +1 -1
- package/cdn/minimal-ui-Et2Wcn7r.js +2 -0
- package/cdn/{minimal-ui-BVKu9LWj.js.map → minimal-ui-Et2Wcn7r.js.map} +1 -1
- package/cdn/mixin-BqN0V06a.js +2 -0
- package/cdn/{mixin-DiB7dIef.js.map → mixin-BqN0V06a.js.map} +1 -1
- package/cdn/{mixin-CkNZwQXF.js → mixin-C193v40v.js} +67 -67
- package/cdn/mixin-C193v40v.js.map +1 -0
- package/cdn/noop-BxkeRIz9.js +6 -0
- package/cdn/noop-BxkeRIz9.js.map +1 -0
- package/cdn/noop-Ch0IHcOP.js +2 -0
- package/cdn/noop-Ch0IHcOP.js.map +1 -0
- package/cdn/{player-D4fdOLLk.js → player-B2oraRyD.js} +3 -2
- package/cdn/{player-D4fdOLLk.js.map → player-B2oraRyD.js.map} +1 -1
- package/cdn/player-BRQLp5bX.js +2 -0
- package/cdn/{player-srq1RGTj.js.map → player-BRQLp5bX.js.map} +1 -1
- package/cdn/player-BloX4l6F.js +2 -0
- package/cdn/{player-iIewo8Y9.js.map → player-BloX4l6F.js.map} +1 -1
- package/cdn/{player-B0qnepD5.js → player-CKTAtwit.js} +3 -2
- package/cdn/{player-B0qnepD5.js.map → player-CKTAtwit.js.map} +1 -1
- package/cdn/{player-C4ix6TQq.js → player-DM9rUXg-.js} +3 -2
- package/cdn/{player-C4ix6TQq.js.map → player-DM9rUXg-.js.map} +1 -1
- package/cdn/player-rCFqzWrA.js +2 -0
- package/cdn/{player-B0ccW5-n.js.map → player-rCFqzWrA.js.map} +1 -1
- package/cdn/{poster-element-BP1Ypgbf.js → poster-element-BGr1VQJB.js} +16 -4
- package/cdn/poster-element-BGr1VQJB.js.map +1 -0
- package/cdn/poster-element-DBmgOyep.js +2 -0
- package/cdn/poster-element-DBmgOyep.js.map +1 -0
- package/cdn/script-D3ZkiqwO.js +2 -0
- package/cdn/script-D3ZkiqwO.js.map +1 -0
- package/cdn/script-erPJaaTz.js +33 -0
- package/cdn/script-erPJaaTz.js.map +1 -0
- package/cdn/seek-button-element-FlgBVoGM.js +2 -0
- package/cdn/seek-button-element-FlgBVoGM.js.map +1 -0
- package/cdn/{seek-button-element-TErrbilI.js → seek-button-element-XMTLIxZj.js} +6 -5
- package/cdn/seek-button-element-XMTLIxZj.js.map +1 -0
- package/cdn/{skin-element-wPSb4AAs.js → skin-element-DL-Kqa5f.js} +2 -2
- package/cdn/{skin-element-wPSb4AAs.js.map → skin-element-DL-Kqa5f.js.map} +1 -1
- package/cdn/{skin-element-1_MG2zgS.js → skin-element-DNytI-uu.js} +2 -2
- package/cdn/{skin-element-1_MG2zgS.js.map → skin-element-DNytI-uu.js.map} +1 -1
- package/cdn/{text-element-DTB9_2HX.js → text-element-D88ArbZz.js} +3 -3
- package/cdn/{text-element-DTB9_2HX.js.map → text-element-D88ArbZz.js.map} +1 -1
- package/cdn/text-element-DeWBNKXb.js +2 -0
- package/cdn/{text-element-Bsyglab8.js.map → text-element-DeWBNKXb.js.map} +1 -1
- package/cdn/{time-slider-chapters-element-DPgaLdBt.js → time-slider-chapters-element-DJ0abZXI.js} +5 -4
- package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +1 -0
- package/cdn/time-slider-chapters-element-DW8YyJn8.js +2 -0
- package/cdn/{time-slider-chapters-element-MdlcovBu.js.map → time-slider-chapters-element-DW8YyJn8.js.map} +1 -1
- package/cdn/{translate-text-DP0CzUCC.js → translate-text-BWvoW5-r.js} +2 -7
- package/cdn/translate-text-BWvoW5-r.js.map +1 -0
- package/cdn/translate-text-TzSgu_oe.js +2 -0
- package/cdn/translate-text-TzSgu_oe.js.map +1 -0
- package/cdn/{ui-D0AokGxw.js → ui-BU3_2gDQ.js} +8 -8
- package/cdn/{ui-D0AokGxw.js.map → ui-BU3_2gDQ.js.map} +1 -1
- package/cdn/{ui-p36Szn71.js → ui-BsaWWE4y.js} +10 -10
- package/cdn/{ui-p36Szn71.js.map → ui-BsaWWE4y.js.map} +1 -1
- package/cdn/ui-C0isALTQ.js +2 -0
- package/cdn/{ui-CecDxhTX.js.map → ui-C0isALTQ.js.map} +1 -1
- package/cdn/ui-DVpkE1MN.js +2 -0
- package/cdn/{ui-ChWM6Xz2.js.map → ui-DVpkE1MN.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 +1 -1
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +4 -4
- 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 +1 -1
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +5 -5
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- 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 +16 -19
- package/dist/default/define/audio/skin.css +27 -30
- package/dist/default/define/live-audio/minimal-skin.css +16 -19
- package/dist/default/define/live-audio/skin.css +27 -30
- package/dist/default/define/live-video/minimal-skin.css +20 -19
- package/dist/default/define/live-video/skin.css +31 -30
- package/dist/default/define/video/minimal-skin.css +20 -19
- package/dist/default/define/video/skin.css +31 -30
- package/dist/default/media/tiktok-video/media.js +3 -2
- package/dist/default/media/tiktok-video/media.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +6 -6
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +4 -4
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- 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 +16 -19
- package/dist/dev/define/audio/skin.css +27 -30
- package/dist/dev/define/live-audio/minimal-skin.css +16 -19
- package/dist/dev/define/live-audio/skin.css +27 -30
- package/dist/dev/define/live-video/minimal-skin.css +20 -19
- package/dist/dev/define/live-video/skin.css +31 -30
- package/dist/dev/define/video/minimal-skin.css +20 -19
- package/dist/dev/define/video/skin.css +31 -30
- package/dist/dev/media/tiktok-video/media.d.ts.map +1 -1
- package/dist/dev/media/tiktok-video/media.js +10 -7
- package/dist/dev/media/tiktok-video/media.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +6 -6
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
- 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/slider.js +4 -4
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/features.md +2 -2
- package/docs/concepts/media-sources.md +79 -1
- package/docs/concepts/skins.md +31 -30
- package/docs/how-to/build-your-own-component.md +1 -1
- package/docs/how-to/customize-skins.md +94 -98
- package/docs/how-to/migrate-from-media-chrome.md +359 -0
- package/docs/how-to/migrate-from-mux-player.md +535 -0
- package/docs/how-to/migrate-from-plyr.md +394 -0
- package/docs/how-to/migrate-from-video-js-8.md +594 -0
- package/docs/llms.txt +9 -0
- package/docs/reference/feature-volume.md +3 -1
- package/docs/reference/mute-button.md +34 -0
- package/docs/reference/volume-slider.md +1 -1
- package/package.json +10 -9
- package/cdn/bn-DdelKD_n.js +0 -108
- package/cdn/bn-DdelKD_n.js.map +0 -1
- package/cdn/bn-YS8ruMcO.js +0 -2
- package/cdn/bn-YS8ruMcO.js.map +0 -1
- package/cdn/compounds-CCvdpvge.js.map +0 -1
- package/cdn/compounds-CJ6SbYAh.js +0 -8
- package/cdn/compounds-CJ6SbYAh.js.map +0 -1
- package/cdn/create-player-BHFyOnWi.js.map +0 -1
- package/cdn/create-player-CbpxjDaZ.js +0 -14
- package/cdn/create-player-CbpxjDaZ.js.map +0 -1
- package/cdn/gesture-element-BNfMI8eh.js +0 -2
- package/cdn/hls-js-6lW7L4th.js +0 -2
- package/cdn/hls-js-DCQzjzB5.js +0 -2
- package/cdn/i18n-DfKGl5Rh.js +0 -2
- package/cdn/live-button-element-B_y-ZJBy.js.map +0 -1
- package/cdn/live-button-element-CWfkQUoy.js +0 -2
- package/cdn/media-5ODYtX1-.js +0 -2
- package/cdn/media-5ODYtX1-.js.map +0 -1
- package/cdn/media-B_gQXwri.js.map +0 -1
- package/cdn/media-CPWNSZFX.js +0 -41
- package/cdn/media-CPWNSZFX.js.map +0 -1
- package/cdn/media-Cp3acYc8.js.map +0 -1
- package/cdn/media-Dq4zmIJa2.js.map +0 -1
- package/cdn/media-suYcjCG22.js.map +0 -1
- package/cdn/minimal-ui-AFk6Ut5f.js +0 -2
- package/cdn/minimal-ui-BVKu9LWj.js +0 -2
- package/cdn/mixin-CkNZwQXF.js.map +0 -1
- package/cdn/mixin-DiB7dIef.js +0 -2
- package/cdn/player-B0ccW5-n.js +0 -2
- package/cdn/player-iIewo8Y9.js +0 -2
- package/cdn/player-srq1RGTj.js +0 -2
- package/cdn/poster-element-BP1Ypgbf.js.map +0 -1
- package/cdn/poster-element-S-rr412t.js +0 -2
- package/cdn/poster-element-S-rr412t.js.map +0 -1
- package/cdn/seek-button-element-DxLmm58Y.js +0 -2
- package/cdn/seek-button-element-DxLmm58Y.js.map +0 -1
- package/cdn/seek-button-element-TErrbilI.js.map +0 -1
- package/cdn/text-element-Bsyglab8.js +0 -2
- package/cdn/time-slider-chapters-element-DPgaLdBt.js.map +0 -1
- package/cdn/time-slider-chapters-element-MdlcovBu.js +0 -2
- package/cdn/translate-text-BPMWpzFm.js +0 -2
- package/cdn/translate-text-BPMWpzFm.js.map +0 -1
- package/cdn/translate-text-DP0CzUCC.js.map +0 -1
- package/cdn/ui-CecDxhTX.js +0 -2
- package/cdn/ui-ChWM6Xz2.js +0 -2
package/cdn/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../../core/dist/default/i18n/locales/en.js","../../utils/dist/object/flatten.js","../../core/dist/default/core/i18n/utils/flatten.js","../../core/dist/default/core/i18n/registry.js","../../core/dist/default/core/i18n/browser-translation.js","../../core/dist/default/core/i18n/load-locale.js","../../core/dist/default/core/i18n/resolve-translation.js","../../core/dist/default/core/i18n/text.js","../../core/dist/default/core/i18n/translator.js"],"sourcesContent":["//#region src/core/i18n/locales/en.ts\nvar en_default = {\n\tbuttons: {\n\t\tplay: \"Play\",\n\t\tpause: \"Pause\",\n\t\treplay: \"Replay\",\n\t\tmute: \"Mute\",\n\t\tunmute: \"Unmute\"\n\t},\n\tseek: {\n\t\tforward: \"Seek forward {seconds} seconds\",\n\t\tbackward: \"Seek backward {seconds} seconds\"\n\t},\n\tfullscreen: {\n\t\tenter: \"Enter fullscreen\",\n\t\texit: \"Exit fullscreen\"\n\t},\n\tcaptions: {\n\t\tenable: \"Enable captions\",\n\t\tdisable: \"Disable captions\"\n\t},\n\tpip: {\n\t\tenter: \"Enter picture-in-picture\",\n\t\texit: \"Exit picture-in-picture\"\n\t},\n\tlive: {\n\t\tplaying: \"Playing live\",\n\t\tseekToEdge: \"Seek to live edge\",\n\t\tbadge: \"Live\"\n\t},\n\tcast: {\n\t\tstart: \"Start casting\",\n\t\tstop: \"Stop casting\",\n\t\tconnecting: \"Connecting\"\n\t},\n\tairplay: {\n\t\tstart: \"Start AirPlay\",\n\t\tstop: \"Stop AirPlay\"\n\t},\n\tslider: { seek: \"Seek\" },\n\ttime: {\n\t\tcurrent: \"Current time\",\n\t\tduration: \"Duration\",\n\t\tremaining: \"Remaining\",\n\t\telapsedSuffix: \"{duration} elapsed\",\n\t\tdurationSuffix: \"{duration} duration\",\n\t\tremainingSuffix: \"{duration} remaining\",\n\t\tshowElapsed: \"Show elapsed time, {duration}.\",\n\t\tshowDuration: \"Show duration, {duration}.\",\n\t\tshowRemaining: \"Show remaining time, {duration}.\",\n\t\ttoggleElapsed: \"Toggle between elapsed and remaining time.\",\n\t\ttoggleDuration: \"Toggle between duration and remaining time.\",\n\t\tposition: \"{current} of {duration}\"\n\t},\n\tplayback: { rate: \"Playback rate {rate}\" },\n\tvolume: {\n\t\tmutedValue: \"{percent}, muted\",\n\t\tmuted: \"Muted\",\n\t\tlabel: \"Volume\",\n\t\tvalue: \"Volume {value}\"\n\t},\n\tstatus: {\n\t\tcaptionsOn: \"Captions on\",\n\t\tcaptionsOff: \"Captions off\",\n\t\tpaused: \"Paused\",\n\t\tplaying: \"Playing\",\n\t\tfullscreen: \"Fullscreen\",\n\t\tpip: \"Picture in picture\",\n\t\texitPip: \"Exit picture in picture\",\n\t\tseekedTo: \"Seeked to {time}\"\n\t},\n\tcontainer: { label: \"Media player\" },\n\terrors: {\n\t\taborted: \"You stopped media playback before it finished.\",\n\t\tnetwork: \"This media could not be loaded due to a network or server issue.\",\n\t\tdecode: \"This media could not be played. It may be corrupted, or your browser may not support its format.\",\n\t\tsource: \"This media could not be loaded. It may be unavailable, or your browser may not support its format.\",\n\t\tencrypted: \"This media could not be played because it could not be decrypted.\",\n\t\tunplayable: \"This media is unsupported by the player.\",\n\t\ttitle: \"Something went wrong.\",\n\t\tunexpected: \"An unexpected error occurred.\"\n\t},\n\tcommon: {\n\t\tempty: \"\",\n\t\tok: \"OK\"\n\t},\n\tmenu: {\n\t\tsettings: \"Settings\",\n\t\tquality: \"Quality\",\n\t\taudio: \"Audio\",\n\t\tdefault: \"Default\",\n\t\tspeed: \"Speed\",\n\t\tcaptions: \"Captions\",\n\t\tplaybackRate: \"Playback rate\",\n\t\tback: \"Back\",\n\t\toff: \"Off\",\n\t\tauto: \"Auto\",\n\t\tautoWithLabel: \"Auto ({label})\",\n\t\tsubtitles: \"Subtitles\"\n\t}\n};\n//#endregion\nexport { en_default as default };\n\n//# sourceMappingURL=en.js.map","//#region src/object/flatten.ts\nfunction flatten(object, options = {}) {\n\tconst { prefix = \"\" } = options;\n\tconst result = {};\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tconst fullKey = prefix ? `${prefix}.${key}` : key;\n\t\tif (value !== null && typeof value === \"object\" && !Array.isArray(value)) Object.assign(result, flatten(value, { prefix: fullKey }));\n\t\telse result[fullKey] = value;\n\t}\n\treturn result;\n}\n//#endregion\nexport { flatten };\n\n//# sourceMappingURL=flatten.js.map","import { flatten } from \"@videojs/utils/object\";\n//#region src/core/i18n/utils/flatten.ts\nfunction flattenTranslations(locale, options = {}) {\n\treturn flatten(locale, options);\n}\n//#endregion\nexport { flattenTranslations };\n\n//# sourceMappingURL=flatten.js.map","import { flattenTranslations } from \"./utils/flatten.js\";\nimport { DEFAULT_LOCALE } from \"@videojs/utils/i18n\";\n//#region src/core/i18n/registry.ts\n/**\n* Well-known key for the shared registry. Its name and value shape are a cross-version contract:\n* every copy of this module in a realm must agree on them, so change the key when the shape changes.\n*/\nconst I18N_REGISTRY_KEY = Symbol.for(\"@videojs/i18n-registry\");\n/**\n* The registry is realm-global rather than module-global so duplicate copies of this module\n* converge on one set of translations.\n*\n* Duplication is normal, not a bug to fix upstream: separately loaded CDN bundles, a pinned and an\n* unpinned URL for the same file, and two bundlers' output on one page all yield distinct module\n* instances. With module-scoped state, a `registerI18n` call on one instance is invisible to the\n* player reading from another, and the locale silently falls back to English.\n*/\nfunction getRegistry() {\n\tconst host = globalThis;\n\tconst existing = host[I18N_REGISTRY_KEY];\n\tif (existing) return existing;\n\tconst registry = {\n\t\tlayers: /* @__PURE__ */ new Map(),\n\t\tsubscribers: /* @__PURE__ */ new Set()\n\t};\n\thost[I18N_REGISTRY_KEY] = registry;\n\treturn registry;\n}\nfunction notify() {\n\tfor (const cb of getRegistry().subscribers) cb();\n}\nfunction normalizeLocaleTag(tag) {\n\treturn tag.trim().replaceAll(\"_\", \"-\").toLowerCase();\n}\n/** Strip unicode locale extension sequences (`-u-…`) before any private-use `-x-` block. */\nfunction stripUnicodeExtensions(tag) {\n\tconst xIdx = tag.indexOf(\"-x-\");\n\tconst uIdx = (xIdx === -1 ? tag : tag.slice(0, xIdx)).indexOf(\"-u-\");\n\tif (uIdx === -1) return tag;\n\treturn tag.slice(0, uIdx) + (xIdx === -1 ? \"\" : tag.slice(xIdx));\n}\nfunction chineseFallback(segments) {\n\tif (segments[0] !== \"zh\") return;\n\tconst script = segments.find((segment) => segment === \"hant\" || segment === \"hans\");\n\treturn script === \"hant\" ? \"zh-tw\" : script === \"hans\" ? \"zh-cn\" : void 0;\n}\n/** Registry map key: normalized tag with unicode extensions removed (same base as {@link findLocaleKeys}). */\nfunction getCanonicalLocaleKey(locale) {\n\treturn stripUnicodeExtensions(normalizeLocaleTag(locale));\n}\n/**\n* Most-specific-first BCP 47 lookup tags (normalized). Always ends with `en` when missing from the truncated chain.\n*\n* @example `es-419-u-nu-latn` → `['es-419', 'es', 'en']`\n*/\nfunction findLocaleKeys(locale) {\n\tconst base = getCanonicalLocaleKey(locale);\n\tif (!base) return [DEFAULT_LOCALE];\n\tconst segments = base.split(\"-\").filter(Boolean);\n\tconst chain = [];\n\tfor (let len = segments.length; len >= 1; len--) chain.push(segments.slice(0, len).join(\"-\"));\n\tconst zhFallback = chineseFallback(segments);\n\tconst zhIndex = chain.indexOf(\"zh\");\n\tif (zhFallback && zhIndex !== -1) chain.splice(zhIndex, 0, zhFallback);\n\tconst out = [];\n\tconst seen = /* @__PURE__ */ new Set();\n\tfor (const tag of chain) if (!seen.has(tag)) {\n\t\tseen.add(tag);\n\t\tout.push(tag);\n\t}\n\tif (!seen.has(DEFAULT_LOCALE)) out.push(DEFAULT_LOCALE);\n\treturn out;\n}\nfunction mergeI18nTranslations(chain) {\n\tconst { layers } = getRegistry();\n\tconst merged = {};\n\tfor (let i = chain.length - 1; i >= 0; i--) {\n\t\tconst tag = chain[i];\n\t\tconst layer = layers.get(tag);\n\t\tif (layer) Object.assign(merged, layer);\n\t}\n\treturn merged;\n}\n/**\n* Register or merge translation strings for a BCP 47 locale tag.\n*\n* @param locale - BCP 47 tag (normalized to lowercase; unicode extensions stripped for the registry key).\n* @param translations - Partial nested locale values; merges with any existing layer for the tag.\n* @public\n*/\nfunction registerI18n(locale, translations) {\n\tconst { layers } = getRegistry();\n\tconst tag = getCanonicalLocaleKey(locale);\n\tconst existing = layers.get(tag) ?? {};\n\tlayers.set(tag, {\n\t\t...existing,\n\t\t...flattenTranslations(translations)\n\t});\n\tnotify();\n}\n/**\n* Return the merged registered translation map for a locale. Built-in English defaults are supplied by text descriptors.\n*\n* @param locale - BCP 47 tag to resolve (e.g. `es-MX`, `zh-Hant-HK`).\n* @public\n*/\nfunction getI18nTranslations(locale) {\n\treturn mergeI18nTranslations(findLocaleKeys(locale));\n}\n/**\n* Subscribe to global registry mutations (for example after `registerI18n` or browser translation prefetch).\n*\n* @param callback - Invoked when any locale layer changes.\n* @public\n*/\nfunction onI18nRegistryChange(callback) {\n\tconst { subscribers } = getRegistry();\n\tsubscribers.add(callback);\n\treturn () => {\n\t\tsubscribers.delete(callback);\n\t};\n}\n/**\n* Whether an exact locale tag has been registered via `registerI18n` (not whether lazy packs exist).\n*\n* @param locale - BCP 47 tag to test.\n* @public\n*/\nfunction hasRegisteredLocale(locale) {\n\treturn getRegistry().layers.has(getCanonicalLocaleKey(locale));\n}\n/** Clears registered locale overlays (test isolation). */\nfunction resetI18nRegistry() {\n\tconst { layers, subscribers } = getRegistry();\n\tlayers.clear();\n\tsubscribers.clear();\n}\n//#endregion\nexport { findLocaleKeys, getCanonicalLocaleKey, getI18nTranslations, hasRegisteredLocale, onI18nRegistryChange, registerI18n, resetI18nRegistry };\n\n//# sourceMappingURL=registry.js.map","import en_default from \"../../i18n/locales/en.js\";\nimport { flattenTranslations } from \"./utils/flatten.js\";\nimport { findLocaleKeys, hasRegisteredLocale } from \"./registry.js\";\nimport { DEFAULT_LOCALE } from \"@videojs/utils/i18n\";\n//#region src/core/i18n/browser-translation.ts\nconst NAMED_PLACEHOLDER = /\\{([^{}]+)\\}/g;\nconst INDEX_PLACEHOLDER = /\\{\\s*(\\d+)\\s*\\}/g;\n/**\n* Replaces `{seconds}` with `{0}`, `{1}`, … so the Browser Translation API sees one full\n* sentence (grammar/word order preserved) while opaque numeric slots are left alone.\n*/\nfunction maskNamedPlaceholders(source) {\n\tconst slots = [];\n\treturn {\n\t\tmasked: source.replace(NAMED_PLACEHOLDER, (_, name) => {\n\t\t\tslots.push(name);\n\t\t\treturn `{${slots.length - 1}}`;\n\t\t}),\n\t\tslots\n\t};\n}\nfunction restoreNamedPlaceholders(translated, slots) {\n\treturn translated.replace(INDEX_PLACEHOLDER, (match, index) => {\n\t\tconst name = slots[Number(index)];\n\t\treturn name !== void 0 ? `{${name}}` : match;\n\t});\n}\nasync function translateProtectingPlaceholders(translator, value) {\n\tconst { masked, slots } = maskNamedPlaceholders(value);\n\tif (slots.length === 0) return translator.translate(value);\n\treturn restoreNamedPlaceholders(await translator.translate(masked), slots);\n}\nconst cache = /* @__PURE__ */ new Map();\nfunction isEnglishLocaleTag(tag) {\n\treturn tag === DEFAULT_LOCALE || tag.startsWith(`${DEFAULT_LOCALE}-`);\n}\nfunction getBrowserTranslator() {\n\tif (!(\"Translator\" in globalThis)) return void 0;\n\treturn globalThis.Translator;\n}\n/** First non-English tag in the lookup chain used as the browser translation target. */\nfunction resolveBrowserTranslationTarget(locale) {\n\tfor (const tag of findLocaleKeys(locale)) if (!isEnglishLocaleTag(tag)) return tag;\n}\n/** Whether to invoke the Browser Translation API for this locale after lazy built-in loading. */\nfunction shouldAttemptBrowserTranslation(locale, loadedLazyTags, translations) {\n\tif (!resolveBrowserTranslationTarget(locale)) return false;\n\tif (loadedLazyTags.some((tag) => !isEnglishLocaleTag(tag))) return translations !== void 0 && hasMissingEnglishTranslations(translations);\n\treturn !findLocaleKeys(locale).some((tag) => !isEnglishLocaleTag(tag) && hasRegisteredLocale(tag));\n}\nfunction hasMissingEnglishTranslations(translations) {\n\tconst english = flattenTranslations(en_default);\n\treturn Object.keys(english).some((key) => translations[key] === void 0);\n}\n/**\n* Translates English registry values via the on-device Browser Translation API when a pre-installed\n* model is available. Results are cached per target language tag.\n*/\nasync function getBrowserTranslations(locale, options) {\n\tconst target = resolveBrowserTranslationTarget(locale);\n\tif (!target) return {};\n\tconst cached = cache.get(target);\n\tif (cached) return cached;\n\tconst Translator = getBrowserTranslator();\n\tif (!Translator) return {};\n\tconst downloadIfNeeded = options?.downloadIfNeeded ?? false;\n\tconst availability = await Translator.availability({\n\t\tsourceLanguage: DEFAULT_LOCALE,\n\t\ttargetLanguage: target\n\t});\n\tif (availability === \"unavailable\") return {};\n\tif (!downloadIfNeeded && availability !== \"available\") return {};\n\tconst needsDownload = downloadIfNeeded && (availability === \"downloadable\" || availability === \"downloading\");\n\tlet downloadStarted = false;\n\tconst notifyDownloadStart = () => {\n\t\tif (!needsDownload || downloadStarted) return;\n\t\tdownloadStarted = true;\n\t\toptions?.onModelDownload?.start?.(target);\n\t};\n\tnotifyDownloadStart();\n\tconst english = flattenTranslations(en_default);\n\tconst keys = Object.keys(english);\n\tconst translator = await Translator.create({\n\t\tsourceLanguage: DEFAULT_LOCALE,\n\t\ttargetLanguage: target,\n\t\t...downloadIfNeeded ? { monitor(monitor) {\n\t\t\tmonitor.addEventListener(\"downloadprogress\", notifyDownloadStart);\n\t\t} } : {}\n\t});\n\tif (downloadStarted) options?.onModelDownload?.finish?.(target);\n\tconst entries = await Promise.all(keys.map(async (key) => {\n\t\tconst value = english[key];\n\t\tif (!value) return [key, \"\"];\n\t\treturn [key, await translateProtectingPlaceholders(translator, value)];\n\t}));\n\tconst result = Object.fromEntries(entries);\n\tcache.set(target, result);\n\treturn result;\n}\n/** Clears the browser translation cache (test isolation). */\nfunction resetBrowserTranslationCacheForTesting() {\n\tcache.clear();\n}\n//#endregion\nexport { getBrowserTranslations, resetBrowserTranslationCacheForTesting, resolveBrowserTranslationTarget, shouldAttemptBrowserTranslation };\n\n//# sourceMappingURL=browser-translation.js.map","import { flattenTranslations } from \"./utils/flatten.js\";\nimport { findLocaleKeys, getCanonicalLocaleKey, hasRegisteredLocale } from \"./registry.js\";\n//#region src/core/i18n/load-locale.ts\nconst loaders = {\n\tar: () => import(\"../../i18n/locales/ar.js\"),\n\taz: () => import(\"../../i18n/locales/az.js\"),\n\tbs: () => import(\"../../i18n/locales/bs.js\"),\n\tbg: () => import(\"../../i18n/locales/bg.js\"),\n\tbn: () => import(\"../../i18n/locales/bn.js\"),\n\tca: () => import(\"../../i18n/locales/ca.js\"),\n\tcs: () => import(\"../../i18n/locales/cs.js\"),\n\tcy: () => import(\"../../i18n/locales/cy.js\"),\n\tda: () => import(\"../../i18n/locales/da.js\"),\n\tde: () => import(\"../../i18n/locales/de.js\"),\n\tel: () => import(\"../../i18n/locales/el.js\"),\n\tes: () => import(\"../../i18n/locales/es.js\"),\n\tet: () => import(\"../../i18n/locales/et.js\"),\n\teu: () => import(\"../../i18n/locales/eu.js\"),\n\tfa: () => import(\"../../i18n/locales/fa.js\"),\n\tfi: () => import(\"../../i18n/locales/fi.js\"),\n\tfr: () => import(\"../../i18n/locales/fr.js\"),\n\tgd: () => import(\"../../i18n/locales/gd.js\"),\n\tgl: () => import(\"../../i18n/locales/gl.js\"),\n\the: () => import(\"../../i18n/locales/he.js\"),\n\thi: () => import(\"../../i18n/locales/hi.js\"),\n\thr: () => import(\"../../i18n/locales/hr.js\"),\n\thu: () => import(\"../../i18n/locales/hu.js\"),\n\tid: () => import(\"../../i18n/locales/id.js\"),\n\tit: () => import(\"../../i18n/locales/it.js\"),\n\tja: () => import(\"../../i18n/locales/ja.js\"),\n\tko: () => import(\"../../i18n/locales/ko.js\"),\n\tlt: () => import(\"../../i18n/locales/lt.js\"),\n\tlv: () => import(\"../../i18n/locales/lv.js\"),\n\tmr: () => import(\"../../i18n/locales/mr.js\"),\n\tnb: () => import(\"../../i18n/locales/nb.js\"),\n\tnl: () => import(\"../../i18n/locales/nl.js\"),\n\tnn: () => import(\"../../i18n/locales/nn.js\"),\n\tne: () => import(\"../../i18n/locales/ne.js\"),\n\toc: () => import(\"../../i18n/locales/oc.js\"),\n\tpl: () => import(\"../../i18n/locales/pl.js\"),\n\t\"pt-br\": () => import(\"../../i18n/locales/pt-BR.js\"),\n\t\"pt-pt\": () => import(\"../../i18n/locales/pt-PT.js\"),\n\tro: () => import(\"../../i18n/locales/ro.js\"),\n\tru: () => import(\"../../i18n/locales/ru.js\"),\n\tsk: () => import(\"../../i18n/locales/sk.js\"),\n\tsl: () => import(\"../../i18n/locales/sl.js\"),\n\tsr: () => import(\"../../i18n/locales/sr.js\"),\n\tsv: () => import(\"../../i18n/locales/sv.js\"),\n\tte: () => import(\"../../i18n/locales/te.js\"),\n\tth: () => import(\"../../i18n/locales/th.js\"),\n\ttr: () => import(\"../../i18n/locales/tr.js\"),\n\tuk: () => import(\"../../i18n/locales/uk.js\"),\n\tvi: () => import(\"../../i18n/locales/vi.js\"),\n\t\"zh-cn\": () => import(\"../../i18n/locales/zh-CN.js\"),\n\t\"zh-tw\": () => import(\"../../i18n/locales/zh-TW.js\"),\n\tpt: () => import(\"../../i18n/locales/pt.js\"),\n\tzh: () => import(\"../../i18n/locales/zh.js\")\n};\n/** Lazy-import a shipped locale pack when the tag is not already in the registry. */\nasync function loadLocale(tag) {\n\tif (hasRegisteredLocale(tag)) return void 0;\n\tfor (const chainTag of findLocaleKeys(tag)) {\n\t\tif (hasRegisteredLocale(chainTag)) return void 0;\n\t\tconst load = loaders[getCanonicalLocaleKey(chainTag)];\n\t\tif (load) return flattenTranslations((await load()).default);\n\t}\n}\n//#endregion\nexport { loadLocale };\n\n//# sourceMappingURL=load-locale.js.map","//#region src/core/i18n/resolve-translation.ts\n/** Resolves a semantic key with optional template params via a translator. */\nfunction resolveTranslation(translator, key, ...args) {\n\tconst [params] = args;\n\tconst translate = translator;\n\treturn params !== void 0 ? translate(key, params) : translate(key);\n}\n//#endregion\nexport { resolveTranslation };\n\n//# sourceMappingURL=resolve-translation.js.map","import { isObject } from \"@videojs/utils/predicate\";\n//#region src/core/i18n/text.ts\nfunction isText(value) {\n\treturn isObject(value) && \"key\" in value && \"text\" in value;\n}\n//#endregion\nexport { isText };\n\n//# sourceMappingURL=text.js.map","import { interpolate } from \"./utils/interpolate.js\";\n//#region src/core/i18n/translator.ts\n/**\n* Builds a typed translator from a resolved translation map (typically from `getI18nTranslations`).\n*\n* @param translations - Merged translation map for the active locale.\n* @param locale - BCP 47 tag associated with the map (reserved for future locale-aware behavior).\n* @public\n*/\nfunction createTranslator(translations, locale) {\n\tconst translate = (input, params) => {\n\t\tconst options = params;\n\t\tconst isDescriptor = typeof input !== \"string\";\n\t\tconst key = isDescriptor ? input.key : input;\n\t\tconst translation = translations[key];\n\t\tconst fallback = options?.default;\n\t\tconst values = options ? { ...options } : void 0;\n\t\tif (values) delete values.default;\n\t\treturn interpolate(translation ?? (isDescriptor ? input.text : fallback) ?? String(key), values);\n\t};\n\treturn translate;\n}\n//#endregion\nexport { createTranslator };\n\n//# sourceMappingURL=translator.js.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"i18n.js","names":[],"sources":["../../core/dist/default/i18n/locales/en.js","../../core/dist/default/core/i18n/browser-translation.js","../../core/dist/default/core/i18n/load-locale.js","../../core/dist/default/core/i18n/resolve-translation.js","../../core/dist/default/core/i18n/text.js","../../core/dist/default/core/i18n/translator.js"],"sourcesContent":["//#region src/core/i18n/locales/en.ts\nvar en_default = {\n\tbuttons: {\n\t\tplay: \"Play\",\n\t\tpause: \"Pause\",\n\t\treplay: \"Replay\",\n\t\tmute: \"Mute\",\n\t\tunmute: \"Unmute\"\n\t},\n\tseek: {\n\t\tforward: \"Seek forward {seconds} seconds\",\n\t\tbackward: \"Seek backward {seconds} seconds\"\n\t},\n\tfullscreen: {\n\t\tenter: \"Enter fullscreen\",\n\t\texit: \"Exit fullscreen\"\n\t},\n\tcaptions: {\n\t\tenable: \"Enable captions\",\n\t\tdisable: \"Disable captions\"\n\t},\n\tpip: {\n\t\tenter: \"Enter picture-in-picture\",\n\t\texit: \"Exit picture-in-picture\"\n\t},\n\tlive: {\n\t\tplaying: \"Playing live\",\n\t\tseekToEdge: \"Seek to live edge\",\n\t\tbadge: \"Live\"\n\t},\n\tcast: {\n\t\tstart: \"Start casting\",\n\t\tstop: \"Stop casting\",\n\t\tconnecting: \"Connecting\"\n\t},\n\tairplay: {\n\t\tstart: \"Start AirPlay\",\n\t\tstop: \"Stop AirPlay\"\n\t},\n\tslider: { seek: \"Seek\" },\n\ttime: {\n\t\tcurrent: \"Current time\",\n\t\tduration: \"Duration\",\n\t\tremaining: \"Remaining\",\n\t\telapsedSuffix: \"{duration} elapsed\",\n\t\tdurationSuffix: \"{duration} duration\",\n\t\tremainingSuffix: \"{duration} remaining\",\n\t\tshowElapsed: \"Show elapsed time, {duration}.\",\n\t\tshowDuration: \"Show duration, {duration}.\",\n\t\tshowRemaining: \"Show remaining time, {duration}.\",\n\t\ttoggleElapsed: \"Toggle between elapsed and remaining time.\",\n\t\ttoggleDuration: \"Toggle between duration and remaining time.\",\n\t\tposition: \"{current} of {duration}\"\n\t},\n\tplayback: { rate: \"Playback rate {rate}\" },\n\tvolume: {\n\t\tmutedValue: \"{percent}, muted\",\n\t\tmuted: \"Muted\",\n\t\tlabel: \"Volume\",\n\t\tvalue: \"Volume {value}\"\n\t},\n\tstatus: {\n\t\tcaptionsOn: \"Captions on\",\n\t\tcaptionsOff: \"Captions off\",\n\t\tpaused: \"Paused\",\n\t\tplaying: \"Playing\",\n\t\tfullscreen: \"Fullscreen\",\n\t\tpip: \"Picture in picture\",\n\t\texitPip: \"Exit picture in picture\",\n\t\tseekedTo: \"Seeked to {time}\"\n\t},\n\tcontainer: { label: \"Media player\" },\n\terrors: {\n\t\taborted: \"You stopped media playback before it finished.\",\n\t\tnetwork: \"This media could not be loaded due to a network or server issue.\",\n\t\tdecode: \"This media could not be played. It may be corrupted, or your browser may not support its format.\",\n\t\tsource: \"This media could not be loaded. It may be unavailable, or your browser may not support its format.\",\n\t\tencrypted: \"This media could not be played because it could not be decrypted.\",\n\t\tunplayable: \"This media is unsupported by the player.\",\n\t\ttitle: \"Something went wrong.\",\n\t\tunexpected: \"An unexpected error occurred.\"\n\t},\n\tcommon: {\n\t\tempty: \"\",\n\t\tok: \"OK\"\n\t},\n\tmenu: {\n\t\tsettings: \"Settings\",\n\t\tquality: \"Quality\",\n\t\taudio: \"Audio\",\n\t\tdefault: \"Default\",\n\t\tspeed: \"Speed\",\n\t\tcaptions: \"Captions\",\n\t\tplaybackRate: \"Playback rate\",\n\t\tback: \"Back\",\n\t\toff: \"Off\",\n\t\tauto: \"Auto\",\n\t\tautoWithLabel: \"Auto ({label})\",\n\t\tsubtitles: \"Subtitles\"\n\t}\n};\n//#endregion\nexport { en_default as default };\n\n//# sourceMappingURL=en.js.map","import en_default from \"../../i18n/locales/en.js\";\nimport { flattenTranslations } from \"./utils/flatten.js\";\nimport { findLocaleKeys, hasRegisteredLocale } from \"./registry.js\";\nimport { DEFAULT_LOCALE } from \"@videojs/utils/i18n\";\n//#region src/core/i18n/browser-translation.ts\nconst NAMED_PLACEHOLDER = /\\{([^{}]+)\\}/g;\nconst INDEX_PLACEHOLDER = /\\{\\s*(\\d+)\\s*\\}/g;\n/**\n* Replaces `{seconds}` with `{0}`, `{1}`, … so the Browser Translation API sees one full\n* sentence (grammar/word order preserved) while opaque numeric slots are left alone.\n*/\nfunction maskNamedPlaceholders(source) {\n\tconst slots = [];\n\treturn {\n\t\tmasked: source.replace(NAMED_PLACEHOLDER, (_, name) => {\n\t\t\tslots.push(name);\n\t\t\treturn `{${slots.length - 1}}`;\n\t\t}),\n\t\tslots\n\t};\n}\nfunction restoreNamedPlaceholders(translated, slots) {\n\treturn translated.replace(INDEX_PLACEHOLDER, (match, index) => {\n\t\tconst name = slots[Number(index)];\n\t\treturn name !== void 0 ? `{${name}}` : match;\n\t});\n}\nasync function translateProtectingPlaceholders(translator, value) {\n\tconst { masked, slots } = maskNamedPlaceholders(value);\n\tif (slots.length === 0) return translator.translate(value);\n\treturn restoreNamedPlaceholders(await translator.translate(masked), slots);\n}\nconst cache = /* @__PURE__ */ new Map();\nfunction isEnglishLocaleTag(tag) {\n\treturn tag === DEFAULT_LOCALE || tag.startsWith(`${DEFAULT_LOCALE}-`);\n}\nfunction getBrowserTranslator() {\n\tif (!(\"Translator\" in globalThis)) return void 0;\n\treturn globalThis.Translator;\n}\n/** First non-English tag in the lookup chain used as the browser translation target. */\nfunction resolveBrowserTranslationTarget(locale) {\n\tfor (const tag of findLocaleKeys(locale)) if (!isEnglishLocaleTag(tag)) return tag;\n}\n/** Whether to invoke the Browser Translation API for this locale after lazy built-in loading. */\nfunction shouldAttemptBrowserTranslation(locale, loadedLazyTags, translations) {\n\tif (!resolveBrowserTranslationTarget(locale)) return false;\n\tif (loadedLazyTags.some((tag) => !isEnglishLocaleTag(tag))) return translations !== void 0 && hasMissingEnglishTranslations(translations);\n\treturn !findLocaleKeys(locale).some((tag) => !isEnglishLocaleTag(tag) && hasRegisteredLocale(tag));\n}\nfunction hasMissingEnglishTranslations(translations) {\n\tconst english = flattenTranslations(en_default);\n\treturn Object.keys(english).some((key) => translations[key] === void 0);\n}\n/**\n* Translates English registry values via the on-device Browser Translation API when a pre-installed\n* model is available. Results are cached per target language tag.\n*/\nasync function getBrowserTranslations(locale, options) {\n\tconst target = resolveBrowserTranslationTarget(locale);\n\tif (!target) return {};\n\tconst cached = cache.get(target);\n\tif (cached) return cached;\n\tconst Translator = getBrowserTranslator();\n\tif (!Translator) return {};\n\tconst downloadIfNeeded = options?.downloadIfNeeded ?? false;\n\tconst availability = await Translator.availability({\n\t\tsourceLanguage: DEFAULT_LOCALE,\n\t\ttargetLanguage: target\n\t});\n\tif (availability === \"unavailable\") return {};\n\tif (!downloadIfNeeded && availability !== \"available\") return {};\n\tconst needsDownload = downloadIfNeeded && (availability === \"downloadable\" || availability === \"downloading\");\n\tlet downloadStarted = false;\n\tconst notifyDownloadStart = () => {\n\t\tif (!needsDownload || downloadStarted) return;\n\t\tdownloadStarted = true;\n\t\toptions?.onModelDownload?.start?.(target);\n\t};\n\tnotifyDownloadStart();\n\tconst english = flattenTranslations(en_default);\n\tconst keys = Object.keys(english);\n\tconst translator = await Translator.create({\n\t\tsourceLanguage: DEFAULT_LOCALE,\n\t\ttargetLanguage: target,\n\t\t...downloadIfNeeded ? { monitor(monitor) {\n\t\t\tmonitor.addEventListener(\"downloadprogress\", notifyDownloadStart);\n\t\t} } : {}\n\t});\n\tif (downloadStarted) options?.onModelDownload?.finish?.(target);\n\tconst entries = await Promise.all(keys.map(async (key) => {\n\t\tconst value = english[key];\n\t\tif (!value) return [key, \"\"];\n\t\treturn [key, await translateProtectingPlaceholders(translator, value)];\n\t}));\n\tconst result = Object.fromEntries(entries);\n\tcache.set(target, result);\n\treturn result;\n}\n/** Clears the browser translation cache (test isolation). */\nfunction resetBrowserTranslationCacheForTesting() {\n\tcache.clear();\n}\n//#endregion\nexport { getBrowserTranslations, resetBrowserTranslationCacheForTesting, resolveBrowserTranslationTarget, shouldAttemptBrowserTranslation };\n\n//# sourceMappingURL=browser-translation.js.map","import { flattenTranslations } from \"./utils/flatten.js\";\nimport { findLocaleKeys, getCanonicalLocaleKey, hasRegisteredLocale } from \"./registry.js\";\n//#region src/core/i18n/load-locale.ts\nconst loaders = {\n\tar: () => import(\"../../i18n/locales/ar.js\"),\n\taz: () => import(\"../../i18n/locales/az.js\"),\n\tbs: () => import(\"../../i18n/locales/bs.js\"),\n\tbg: () => import(\"../../i18n/locales/bg.js\"),\n\tbn: () => import(\"../../i18n/locales/bn.js\"),\n\tca: () => import(\"../../i18n/locales/ca.js\"),\n\tcs: () => import(\"../../i18n/locales/cs.js\"),\n\tcy: () => import(\"../../i18n/locales/cy.js\"),\n\tda: () => import(\"../../i18n/locales/da.js\"),\n\tde: () => import(\"../../i18n/locales/de.js\"),\n\tel: () => import(\"../../i18n/locales/el.js\"),\n\tes: () => import(\"../../i18n/locales/es.js\"),\n\tet: () => import(\"../../i18n/locales/et.js\"),\n\teu: () => import(\"../../i18n/locales/eu.js\"),\n\tfa: () => import(\"../../i18n/locales/fa.js\"),\n\tfi: () => import(\"../../i18n/locales/fi.js\"),\n\tfr: () => import(\"../../i18n/locales/fr.js\"),\n\tgd: () => import(\"../../i18n/locales/gd.js\"),\n\tgl: () => import(\"../../i18n/locales/gl.js\"),\n\the: () => import(\"../../i18n/locales/he.js\"),\n\thi: () => import(\"../../i18n/locales/hi.js\"),\n\thr: () => import(\"../../i18n/locales/hr.js\"),\n\thu: () => import(\"../../i18n/locales/hu.js\"),\n\tid: () => import(\"../../i18n/locales/id.js\"),\n\tit: () => import(\"../../i18n/locales/it.js\"),\n\tja: () => import(\"../../i18n/locales/ja.js\"),\n\tko: () => import(\"../../i18n/locales/ko.js\"),\n\tlt: () => import(\"../../i18n/locales/lt.js\"),\n\tlv: () => import(\"../../i18n/locales/lv.js\"),\n\tmr: () => import(\"../../i18n/locales/mr.js\"),\n\tnb: () => import(\"../../i18n/locales/nb.js\"),\n\tnl: () => import(\"../../i18n/locales/nl.js\"),\n\tnn: () => import(\"../../i18n/locales/nn.js\"),\n\tne: () => import(\"../../i18n/locales/ne.js\"),\n\toc: () => import(\"../../i18n/locales/oc.js\"),\n\tpl: () => import(\"../../i18n/locales/pl.js\"),\n\t\"pt-br\": () => import(\"../../i18n/locales/pt-BR.js\"),\n\t\"pt-pt\": () => import(\"../../i18n/locales/pt-PT.js\"),\n\tro: () => import(\"../../i18n/locales/ro.js\"),\n\tru: () => import(\"../../i18n/locales/ru.js\"),\n\tsk: () => import(\"../../i18n/locales/sk.js\"),\n\tsl: () => import(\"../../i18n/locales/sl.js\"),\n\tsr: () => import(\"../../i18n/locales/sr.js\"),\n\tsv: () => import(\"../../i18n/locales/sv.js\"),\n\tte: () => import(\"../../i18n/locales/te.js\"),\n\tth: () => import(\"../../i18n/locales/th.js\"),\n\ttr: () => import(\"../../i18n/locales/tr.js\"),\n\tuk: () => import(\"../../i18n/locales/uk.js\"),\n\tvi: () => import(\"../../i18n/locales/vi.js\"),\n\t\"zh-cn\": () => import(\"../../i18n/locales/zh-CN.js\"),\n\t\"zh-tw\": () => import(\"../../i18n/locales/zh-TW.js\"),\n\tpt: () => import(\"../../i18n/locales/pt.js\"),\n\tzh: () => import(\"../../i18n/locales/zh.js\")\n};\n/** Lazy-import a shipped locale pack when the tag is not already in the registry. */\nasync function loadLocale(tag) {\n\tif (hasRegisteredLocale(tag)) return void 0;\n\tfor (const chainTag of findLocaleKeys(tag)) {\n\t\tif (hasRegisteredLocale(chainTag)) return void 0;\n\t\tconst load = loaders[getCanonicalLocaleKey(chainTag)];\n\t\tif (load) return flattenTranslations((await load()).default);\n\t}\n}\n//#endregion\nexport { loadLocale };\n\n//# sourceMappingURL=load-locale.js.map","//#region src/core/i18n/resolve-translation.ts\n/** Resolves a semantic key with optional template params via a translator. */\nfunction resolveTranslation(translator, key, ...args) {\n\tconst [params] = args;\n\tconst translate = translator;\n\treturn params !== void 0 ? translate(key, params) : translate(key);\n}\n//#endregion\nexport { resolveTranslation };\n\n//# sourceMappingURL=resolve-translation.js.map","import { isObject } from \"@videojs/utils/predicate\";\n//#region src/core/i18n/text.ts\nfunction isText(value) {\n\treturn isObject(value) && \"key\" in value && \"text\" in value;\n}\n//#endregion\nexport { isText };\n\n//# sourceMappingURL=text.js.map","import { interpolate } from \"./utils/interpolate.js\";\n//#region src/core/i18n/translator.ts\n/**\n* Builds a typed translator from a resolved translation map (typically from `getI18nTranslations`).\n*\n* @param translations - Merged translation map for the active locale.\n* @param locale - BCP 47 tag associated with the map (reserved for future locale-aware behavior).\n* @public\n*/\nfunction createTranslator(translations, locale) {\n\tconst translate = (input, params) => {\n\t\tconst options = params;\n\t\tconst isDescriptor = typeof input !== \"string\";\n\t\tconst key = isDescriptor ? input.key : input;\n\t\tconst translation = translations[key];\n\t\tconst fallback = options?.default;\n\t\tconst values = options ? { ...options } : void 0;\n\t\tif (values) delete values.default;\n\t\treturn interpolate(translation ?? (isDescriptor ? input.text : fallback) ?? String(key), values);\n\t};\n\treturn translate;\n}\n//#endregion\nexport { createTranslator };\n\n//# sourceMappingURL=translator.js.map"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { r as resolveText$1 } from "./translate-text-
|
|
1
|
+
import { B as selectTime, C as applyStateDataAttrs, N as selectLive, O as createButton, S as resolveLabel, T as applyElementProps, j as selectBuffer, rt as defaults, w as logMissingFeature } from "./compounds-nk9RJtBK.js";
|
|
2
|
+
import { k as createState, n as PlayerController } from "./create-player-DK9WOywd.js";
|
|
3
|
+
import { r as resolveText$1 } from "./translate-text-BWvoW5-r.js";
|
|
4
4
|
import { t as MediaElement } from "./media-element-CJY3JIgc.js";
|
|
5
5
|
import { r as playerContext } from "./context-OhQY847V.js";
|
|
6
|
+
import { c as i18nContext, r as I18nController } from "./container-element-HHK_KZOE.js";
|
|
6
7
|
import { resolveText, translateText } from "./i18n.dev.js";
|
|
7
8
|
|
|
8
9
|
//#region ../core/dist/dev/i18n/text/live.js
|
|
@@ -232,4 +233,4 @@ var LiveButtonElement = class extends MediaElement {
|
|
|
232
233
|
|
|
233
234
|
//#endregion
|
|
234
235
|
export { LiveButtonElement as t };
|
|
235
|
-
//# sourceMappingURL=live-button-element-
|
|
236
|
+
//# sourceMappingURL=live-button-element-Bae44kBN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-button-element-Bae44kBN.js","names":["#props","#media","#isAtLiveEdge","resolveText","#i18n","#defaultContent","#disconnect","#getMedia"],"sources":["../../core/dist/dev/i18n/text/live.js","../../core/dist/dev/core/ui/live-button/live-button-core.js","../../core/dist/dev/core/ui/live-button/live-button-data-attrs.js","../src/ui/live-button/live-button-element.ts"],"sourcesContent":["//#region src/core/i18n/text/live.ts\nconst prefix = \"live.\";\nconst playingText = {\n\tkey: `${prefix}playing`,\n\ttext: \"Playing live\"\n};\nconst seekToEdgeText = {\n\tkey: `${prefix}seekToEdge`,\n\ttext: \"Seek to live edge\"\n};\nconst badgeText = {\n\tkey: `${prefix}badge`,\n\ttext: \"Live\"\n};\n//#endregion\nexport { badgeText, playingText, seekToEdgeText };\n\n//# sourceMappingURL=live.js.map","import { resolveText } from \"../../i18n/resolve-text.js\";\nimport { resolveLabel } from \"../utils/resolve-label.js\";\nimport { badgeText, playingText, seekToEdgeText } from \"../../../i18n/text/live.js\";\nimport { createState } from \"@videojs/store\";\nimport { defaults } from \"@videojs/utils/object\";\n//#region src/core/ui/live-button/live-button-core.ts\n/**\n* Fallback offset (in seconds) from the end of the seekable window used to\n* decide \"at live edge\" when `liveEdgeStart` is unavailable.\n*/\nconst LIVE_EDGE_OFFSET = 10;\n/**\n* Grace window (in seconds) before `liveEdgeStart` that still counts as\n* \"at the live edge\". Absorbs the small gap between the player's initial\n* playback position (e.g. hls.js `liveSyncDuration`) and the manifest's\n* `HOLD-BACK`, so autoplay reliably reports live.\n*/\nconst LIVE_EDGE_TOLERANCE = 5;\n/**\n* Core state machine for a \"Live\" button. Indicates whether the player is\n* playing at the live edge and seeks to the Seekable Live Edge when activated.\n*\n* @see https://github.com/video-dev/media-ui-extensions/blob/main/proposals/0007-live-edge.md\n*/\nvar LiveButtonCore = class LiveButtonCore {\n\t/** Default visible text used when no children are provided. */\n\tstatic defaultText = badgeText;\n\tstatic defaultProps = {\n\t\tlabel: \"\",\n\t\tdisabled: false\n\t};\n\tstate = createState({\n\t\tlive: false,\n\t\tliveEdge: false,\n\t\tlabel: \"\"\n\t});\n\t#props = { ...LiveButtonCore.defaultProps };\n\t#media = null;\n\tconstructor(props) {\n\t\tif (props) this.setProps(props);\n\t}\n\tsetProps(props) {\n\t\tthis.#props = defaults(props, LiveButtonCore.defaultProps);\n\t}\n\tgetLabel(state) {\n\t\tconst label = resolveLabel(this.#props.label, state);\n\t\tif (label) return label;\n\t\tif (state.liveEdge) return playingText;\n\t\treturn seekToEdgeText;\n\t}\n\tgetAttrs(state) {\n\t\tconst inactive = this.#props.disabled || state.liveEdge;\n\t\treturn {\n\t\t\t\"aria-label\": this.getLabel(state),\n\t\t\t\"aria-disabled\": inactive ? \"true\" : void 0\n\t\t};\n\t}\n\tsetMedia(media) {\n\t\tthis.#media = media;\n\t}\n\tgetState() {\n\t\tconst media = this.#media;\n\t\tconst live = isLiveMedia(media);\n\t\tconst liveEdge = live && this.#isAtLiveEdge(media);\n\t\tthis.state.patch({\n\t\t\tlive,\n\t\t\tliveEdge\n\t\t});\n\t\tthis.state.patch({ label: resolveText(this.getLabel(this.state.current)) });\n\t\treturn this.state.current;\n\t}\n\t/** Seek to the Seekable Live Edge. No-op when not live or already at edge. */\n\tasync seekToLive(media) {\n\t\tif (this.#props.disabled) return;\n\t\tif (!isLiveMedia(media)) return;\n\t\tif (this.#isAtLiveEdge(media)) return;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return;\n\t\tawait media.seek(target);\n\t}\n\t#isAtLiveEdge(media) {\n\t\tconst { currentTime, liveEdgeStart } = media;\n\t\tif (Number.isFinite(liveEdgeStart)) return currentTime >= liveEdgeStart - LIVE_EDGE_TOLERANCE;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return false;\n\t\treturn currentTime >= target - LIVE_EDGE_OFFSET;\n\t}\n};\nfunction isLiveMedia(media) {\n\treturn !Number.isNaN(media.targetLiveWindow);\n}\nfunction liveEdgeTarget(media) {\n\tconst { seekable } = media;\n\tif (seekable.length === 0) return null;\n\tconst end = seekable[seekable.length - 1][1];\n\treturn Number.isFinite(end) ? end : null;\n}\n//#endregion\nexport { LiveButtonCore };\n\n//# sourceMappingURL=live-button-core.js.map","//#region src/core/ui/live-button/live-button-data-attrs.ts\nconst LiveButtonDataAttrs = {\n\t/** Present when the stream is live (or DVR). */\n\tlive: \"data-live\",\n\t/** Present when playback is at the live edge. */\n\tliveEdge: \"data-live-edge\"\n};\n//#endregion\nexport { LiveButtonDataAttrs };\n\n//# sourceMappingURL=live-button-data-attrs.js.map","import { LiveButtonCore, LiveButtonDataAttrs, type LiveButtonMediaState } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createButton,\n logMissingFeature,\n selectBuffer,\n selectLive,\n selectTime,\n} from '@videojs/core/dom';\nimport { resolveText, type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\n/**\n * `<media-live-button>` — selects from `live`, `time`, and `buffer` features\n * and composes them into the `LiveButtonMediaState` consumed by\n * `LiveButtonCore`.\n *\n * Doesn't extend `MediaButtonElement` because that base couples a button to\n * a single feature selector; the LiveButton needs three.\n */\nexport class LiveButtonElement extends MediaElement {\n static readonly tagName = 'media-live-button';\n\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label: Text | string = '';\n\n protected readonly core = new LiveButtonCore();\n\n protected readonly live = new PlayerController(this, playerContext, selectLive);\n protected readonly time = new PlayerController(this, playerContext, selectTime);\n protected readonly buffer = new PlayerController(this, playerContext, selectBuffer);\n readonly #i18n = new I18nController(this, i18nContext);\n\n get $state(): State<LiveButtonCore.State> {\n return this.core.state;\n }\n\n #defaultContent = false;\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#defaultContent ||= !this.textContent?.trim();\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => {\n const media = this.#getMedia();\n if (media) this.core.seekToLive(media);\n },\n isDisabled: () => this.disabled || !this.#getMedia(),\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.#getMedia()) {\n logMissingFeature(this.localName, this.live.displayName ?? 'live');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label ? resolveText(this.core.state.current.label) : undefined;\n }\n\n /** Resolved label for tooltips and other display surfaces. */\n getResolvedLabel(): string | undefined {\n const media = this.#getMedia();\n if (!media) return undefined;\n const state = this.core.getState();\n return translateText(this.core.getLabel(state), this.#i18n.value);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.core.setProps(this);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n const media = this.#getMedia();\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n const attrs = this.core.getAttrs(state);\n applyElementProps(this, {\n ...attrs,\n 'aria-label': translateText(attrs['aria-label'], this.#i18n.value),\n });\n applyStateDataAttrs(this, state, LiveButtonDataAttrs);\n }\n\n /**\n * Compose the LiveButton media state from the three feature slices.\n * Returns `null` when any are missing so the button stays disabled until\n * all three features are registered on the player.\n */\n #getMedia(): LiveButtonMediaState | null {\n const live = this.live.value;\n const time = this.time.value;\n const buffer = this.buffer.value;\n if (!live || !time || !buffer) return null;\n return {\n currentTime: time.currentTime,\n seek: time.seek,\n seekable: buffer.seekable,\n liveEdgeStart: live.liveEdgeStart,\n targetLiveWindow: live.targetLiveWindow,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{A as e,C as t,D as n,M as r,S as i,nt as a,w as o,z as s}from"./compounds-BEO1d3ZM.js";import{k as c,n as l}from"./create-player-hSdQMP5p.js";import{r as u}from"./translate-text-TzSgu_oe.js";import{t as d}from"./media-element-Cp5PrNre.js";import{r as f}from"./context-C2rsoDxk.js";import{c as p,r as m}from"./container-element-Dd0ZCdhK.js";import{resolveText as h,translateText as g}from"./i18n.js";const _=`live.`,v={key:`${_}playing`,text:`Playing live`},y={key:`${_}seekToEdge`,text:`Seek to live edge`},b={key:`${_}badge`,text:`Live`};var x=class e{static defaultText=b;static defaultProps={label:``,disabled:!1};state=c({live:!1,liveEdge:!1,label:``});#e={...e.defaultProps};#t=null;constructor(e){e&&this.setProps(e)}setProps(t){this.#e=a(t,e.defaultProps)}getLabel(e){return i(this.#e.label,e)||(e.liveEdge?v:y)}getAttrs(e){let t=this.#e.disabled||e.liveEdge;return{"aria-label":this.getLabel(e),"aria-disabled":t?`true`:void 0}}setMedia(e){this.#t=e}getState(){let e=this.#t,t=S(e),n=t&&this.#n(e);return this.state.patch({live:t,liveEdge:n}),this.state.patch({label:u(this.getLabel(this.state.current))}),this.state.current}async seekToLive(e){if(this.#e.disabled||!S(e)||this.#n(e))return;let t=C(e);t!=null&&await e.seek(t)}#n(e){let{currentTime:t,liveEdgeStart:n}=e;if(Number.isFinite(n))return t>=n-5;let r=C(e);return r!=null&&t>=r-10}};function S(e){return!Number.isNaN(e.targetLiveWindow)}function C(e){let{seekable:t}=e;if(t.length===0)return null;let n=t[t.length-1][1];return Number.isFinite(n)?n:null}const w={live:`data-live`,liveEdge:`data-live-edge`};var T=class extends d{constructor(...t){super(...t),this.disabled=!1,this.label=``,this.core=new x,this.live=new l(this,f,r),this.time=new l(this,f,s),this.buffer=new l(this,f,e),this.#e=new m(this,p),this.#t=!1,this.#n=null}static{this.tagName=`media-live-button`}static{this.properties={label:{type:String},disabled:{type:Boolean}}}#e;get $state(){return this.core.state}#t;#n;connectedCallback(){if(super.connectedCallback(),this.destroyed)return;this.#t||=!this.textContent?.trim(),this.#t&&(this.textContent=g(x.defaultText,this.#e.value)),this.#n=new AbortController;let e=n({onActivate:()=>{let e=this.#r();e&&this.core.seekToLive(e)},isDisabled:()=>this.disabled||!this.#r()});o(this,e,{signal:this.#n.signal})}disconnectedCallback(){super.disconnectedCallback(),this.#n?.abort(),this.#n=null}getLabel(){return this.core.state.current.label?h(this.core.state.current.label):void 0}getResolvedLabel(){if(!this.#r())return;let e=this.core.getState();return g(this.core.getLabel(e),this.#e.value)}willUpdate(e){super.willUpdate(e),this.core.setProps(this)}update(e){super.update(e),this.#t&&(this.textContent=g(x.defaultText,this.#e.value));let n=this.#r();if(!n)return;this.core.setMedia(n);let r=this.core.getState(),i=this.core.getAttrs(r);o(this,{...i,"aria-label":g(i[`aria-label`],this.#e.value)}),t(this,r,w)}#r(){let e=this.live.value,t=this.time.value,n=this.buffer.value;return!e||!t||!n?null:{currentTime:t.currentTime,seek:t.seek,seekable:n.seekable,liveEdgeStart:e.liveEdgeStart,targetLiveWindow:e.targetLiveWindow}}};export{T as t};
|
|
2
|
+
//# sourceMappingURL=live-button-element-DaHgnYdw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-button-element-CWfkQUoy.js","names":["#props","#media","#isAtLiveEdge","resolveText","#i18n","#defaultContent","#disconnect","#getMedia"],"sources":["../../core/dist/default/i18n/text/live.js","../../core/dist/default/core/ui/live-button/live-button-core.js","../../core/dist/default/core/ui/live-button/live-button-data-attrs.js","../src/ui/live-button/live-button-element.ts"],"sourcesContent":["//#region src/core/i18n/text/live.ts\nconst prefix = \"live.\";\nconst playingText = {\n\tkey: `${prefix}playing`,\n\ttext: \"Playing live\"\n};\nconst seekToEdgeText = {\n\tkey: `${prefix}seekToEdge`,\n\ttext: \"Seek to live edge\"\n};\nconst badgeText = {\n\tkey: `${prefix}badge`,\n\ttext: \"Live\"\n};\n//#endregion\nexport { badgeText, playingText, seekToEdgeText };\n\n//# sourceMappingURL=live.js.map","import { resolveText } from \"../../i18n/resolve-text.js\";\nimport { resolveLabel } from \"../utils/resolve-label.js\";\nimport { badgeText, playingText, seekToEdgeText } from \"../../../i18n/text/live.js\";\nimport { createState } from \"@videojs/store\";\nimport { defaults } from \"@videojs/utils/object\";\n//#region src/core/ui/live-button/live-button-core.ts\n/**\n* Fallback offset (in seconds) from the end of the seekable window used to\n* decide \"at live edge\" when `liveEdgeStart` is unavailable.\n*/\nconst LIVE_EDGE_OFFSET = 10;\n/**\n* Grace window (in seconds) before `liveEdgeStart` that still counts as\n* \"at the live edge\". Absorbs the small gap between the player's initial\n* playback position (e.g. hls.js `liveSyncDuration`) and the manifest's\n* `HOLD-BACK`, so autoplay reliably reports live.\n*/\nconst LIVE_EDGE_TOLERANCE = 5;\n/**\n* Core state machine for a \"Live\" button. Indicates whether the player is\n* playing at the live edge and seeks to the Seekable Live Edge when activated.\n*\n* @see https://github.com/video-dev/media-ui-extensions/blob/main/proposals/0007-live-edge.md\n*/\nvar LiveButtonCore = class LiveButtonCore {\n\t/** Default visible text used when no children are provided. */\n\tstatic defaultText = badgeText;\n\tstatic defaultProps = {\n\t\tlabel: \"\",\n\t\tdisabled: false\n\t};\n\tstate = createState({\n\t\tlive: false,\n\t\tliveEdge: false,\n\t\tlabel: \"\"\n\t});\n\t#props = { ...LiveButtonCore.defaultProps };\n\t#media = null;\n\tconstructor(props) {\n\t\tif (props) this.setProps(props);\n\t}\n\tsetProps(props) {\n\t\tthis.#props = defaults(props, LiveButtonCore.defaultProps);\n\t}\n\tgetLabel(state) {\n\t\tconst label = resolveLabel(this.#props.label, state);\n\t\tif (label) return label;\n\t\tif (state.liveEdge) return playingText;\n\t\treturn seekToEdgeText;\n\t}\n\tgetAttrs(state) {\n\t\tconst inactive = this.#props.disabled || state.liveEdge;\n\t\treturn {\n\t\t\t\"aria-label\": this.getLabel(state),\n\t\t\t\"aria-disabled\": inactive ? \"true\" : void 0\n\t\t};\n\t}\n\tsetMedia(media) {\n\t\tthis.#media = media;\n\t}\n\tgetState() {\n\t\tconst media = this.#media;\n\t\tconst live = isLiveMedia(media);\n\t\tconst liveEdge = live && this.#isAtLiveEdge(media);\n\t\tthis.state.patch({\n\t\t\tlive,\n\t\t\tliveEdge\n\t\t});\n\t\tthis.state.patch({ label: resolveText(this.getLabel(this.state.current)) });\n\t\treturn this.state.current;\n\t}\n\t/** Seek to the Seekable Live Edge. No-op when not live or already at edge. */\n\tasync seekToLive(media) {\n\t\tif (this.#props.disabled) return;\n\t\tif (!isLiveMedia(media)) return;\n\t\tif (this.#isAtLiveEdge(media)) return;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return;\n\t\tawait media.seek(target);\n\t}\n\t#isAtLiveEdge(media) {\n\t\tconst { currentTime, liveEdgeStart } = media;\n\t\tif (Number.isFinite(liveEdgeStart)) return currentTime >= liveEdgeStart - LIVE_EDGE_TOLERANCE;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return false;\n\t\treturn currentTime >= target - LIVE_EDGE_OFFSET;\n\t}\n};\nfunction isLiveMedia(media) {\n\treturn !Number.isNaN(media.targetLiveWindow);\n}\nfunction liveEdgeTarget(media) {\n\tconst { seekable } = media;\n\tif (seekable.length === 0) return null;\n\tconst end = seekable[seekable.length - 1][1];\n\treturn Number.isFinite(end) ? end : null;\n}\n//#endregion\nexport { LiveButtonCore };\n\n//# sourceMappingURL=live-button-core.js.map","//#region src/core/ui/live-button/live-button-data-attrs.ts\nconst LiveButtonDataAttrs = {\n\t/** Present when the stream is live (or DVR). */\n\tlive: \"data-live\",\n\t/** Present when playback is at the live edge. */\n\tliveEdge: \"data-live-edge\"\n};\n//#endregion\nexport { LiveButtonDataAttrs };\n\n//# sourceMappingURL=live-button-data-attrs.js.map","import { LiveButtonCore, LiveButtonDataAttrs, type LiveButtonMediaState } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createButton,\n logMissingFeature,\n selectBuffer,\n selectLive,\n selectTime,\n} from '@videojs/core/dom';\nimport { resolveText, type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\n/**\n * `<media-live-button>` — selects from `live`, `time`, and `buffer` features\n * and composes them into the `LiveButtonMediaState` consumed by\n * `LiveButtonCore`.\n *\n * Doesn't extend `MediaButtonElement` because that base couples a button to\n * a single feature selector; the LiveButton needs three.\n */\nexport class LiveButtonElement extends MediaElement {\n static readonly tagName = 'media-live-button';\n\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label: Text | string = '';\n\n protected readonly core = new LiveButtonCore();\n\n protected readonly live = new PlayerController(this, playerContext, selectLive);\n protected readonly time = new PlayerController(this, playerContext, selectTime);\n protected readonly buffer = new PlayerController(this, playerContext, selectBuffer);\n readonly #i18n = new I18nController(this, i18nContext);\n\n get $state(): State<LiveButtonCore.State> {\n return this.core.state;\n }\n\n #defaultContent = false;\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#defaultContent ||= !this.textContent?.trim();\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => {\n const media = this.#getMedia();\n if (media) this.core.seekToLive(media);\n },\n isDisabled: () => this.disabled || !this.#getMedia(),\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.#getMedia()) {\n logMissingFeature(this.localName, this.live.displayName ?? 'live');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label ? resolveText(this.core.state.current.label) : undefined;\n }\n\n /** Resolved label for tooltips and other display surfaces. */\n getResolvedLabel(): string | undefined {\n const media = this.#getMedia();\n if (!media) return undefined;\n const state = this.core.getState();\n return translateText(this.core.getLabel(state), this.#i18n.value);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.core.setProps(this);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n const media = this.#getMedia();\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n const attrs = this.core.getAttrs(state);\n applyElementProps(this, {\n ...attrs,\n 'aria-label': translateText(attrs['aria-label'], this.#i18n.value),\n });\n applyStateDataAttrs(this, state, LiveButtonDataAttrs);\n }\n\n /**\n * Compose the LiveButton media state from the three feature slices.\n * Returns `null` when any are missing so the button stays disabled until\n * all three features are registered on the player.\n */\n #getMedia(): LiveButtonMediaState | null {\n const live = this.live.value;\n const time = this.time.value;\n const buffer = this.buffer.value;\n if (!live || !time || !buffer) return null;\n return {\n currentTime: time.currentTime,\n seek: time.seek,\n seekable: buffer.seekable,\n liveEdgeStart: live.liveEdgeStart,\n targetLiveWindow: live.targetLiveWindow,\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"live-button-element-DaHgnYdw.js","names":["#props","#media","#isAtLiveEdge","resolveText","#i18n","#defaultContent","#disconnect","#getMedia"],"sources":["../../core/dist/default/i18n/text/live.js","../../core/dist/default/core/ui/live-button/live-button-core.js","../../core/dist/default/core/ui/live-button/live-button-data-attrs.js","../src/ui/live-button/live-button-element.ts"],"sourcesContent":["//#region src/core/i18n/text/live.ts\nconst prefix = \"live.\";\nconst playingText = {\n\tkey: `${prefix}playing`,\n\ttext: \"Playing live\"\n};\nconst seekToEdgeText = {\n\tkey: `${prefix}seekToEdge`,\n\ttext: \"Seek to live edge\"\n};\nconst badgeText = {\n\tkey: `${prefix}badge`,\n\ttext: \"Live\"\n};\n//#endregion\nexport { badgeText, playingText, seekToEdgeText };\n\n//# sourceMappingURL=live.js.map","import { resolveText } from \"../../i18n/resolve-text.js\";\nimport { resolveLabel } from \"../utils/resolve-label.js\";\nimport { badgeText, playingText, seekToEdgeText } from \"../../../i18n/text/live.js\";\nimport { createState } from \"@videojs/store\";\nimport { defaults } from \"@videojs/utils/object\";\n//#region src/core/ui/live-button/live-button-core.ts\n/**\n* Fallback offset (in seconds) from the end of the seekable window used to\n* decide \"at live edge\" when `liveEdgeStart` is unavailable.\n*/\nconst LIVE_EDGE_OFFSET = 10;\n/**\n* Grace window (in seconds) before `liveEdgeStart` that still counts as\n* \"at the live edge\". Absorbs the small gap between the player's initial\n* playback position (e.g. hls.js `liveSyncDuration`) and the manifest's\n* `HOLD-BACK`, so autoplay reliably reports live.\n*/\nconst LIVE_EDGE_TOLERANCE = 5;\n/**\n* Core state machine for a \"Live\" button. Indicates whether the player is\n* playing at the live edge and seeks to the Seekable Live Edge when activated.\n*\n* @see https://github.com/video-dev/media-ui-extensions/blob/main/proposals/0007-live-edge.md\n*/\nvar LiveButtonCore = class LiveButtonCore {\n\t/** Default visible text used when no children are provided. */\n\tstatic defaultText = badgeText;\n\tstatic defaultProps = {\n\t\tlabel: \"\",\n\t\tdisabled: false\n\t};\n\tstate = createState({\n\t\tlive: false,\n\t\tliveEdge: false,\n\t\tlabel: \"\"\n\t});\n\t#props = { ...LiveButtonCore.defaultProps };\n\t#media = null;\n\tconstructor(props) {\n\t\tif (props) this.setProps(props);\n\t}\n\tsetProps(props) {\n\t\tthis.#props = defaults(props, LiveButtonCore.defaultProps);\n\t}\n\tgetLabel(state) {\n\t\tconst label = resolveLabel(this.#props.label, state);\n\t\tif (label) return label;\n\t\tif (state.liveEdge) return playingText;\n\t\treturn seekToEdgeText;\n\t}\n\tgetAttrs(state) {\n\t\tconst inactive = this.#props.disabled || state.liveEdge;\n\t\treturn {\n\t\t\t\"aria-label\": this.getLabel(state),\n\t\t\t\"aria-disabled\": inactive ? \"true\" : void 0\n\t\t};\n\t}\n\tsetMedia(media) {\n\t\tthis.#media = media;\n\t}\n\tgetState() {\n\t\tconst media = this.#media;\n\t\tconst live = isLiveMedia(media);\n\t\tconst liveEdge = live && this.#isAtLiveEdge(media);\n\t\tthis.state.patch({\n\t\t\tlive,\n\t\t\tliveEdge\n\t\t});\n\t\tthis.state.patch({ label: resolveText(this.getLabel(this.state.current)) });\n\t\treturn this.state.current;\n\t}\n\t/** Seek to the Seekable Live Edge. No-op when not live or already at edge. */\n\tasync seekToLive(media) {\n\t\tif (this.#props.disabled) return;\n\t\tif (!isLiveMedia(media)) return;\n\t\tif (this.#isAtLiveEdge(media)) return;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return;\n\t\tawait media.seek(target);\n\t}\n\t#isAtLiveEdge(media) {\n\t\tconst { currentTime, liveEdgeStart } = media;\n\t\tif (Number.isFinite(liveEdgeStart)) return currentTime >= liveEdgeStart - LIVE_EDGE_TOLERANCE;\n\t\tconst target = liveEdgeTarget(media);\n\t\tif (target == null) return false;\n\t\treturn currentTime >= target - LIVE_EDGE_OFFSET;\n\t}\n};\nfunction isLiveMedia(media) {\n\treturn !Number.isNaN(media.targetLiveWindow);\n}\nfunction liveEdgeTarget(media) {\n\tconst { seekable } = media;\n\tif (seekable.length === 0) return null;\n\tconst end = seekable[seekable.length - 1][1];\n\treturn Number.isFinite(end) ? end : null;\n}\n//#endregion\nexport { LiveButtonCore };\n\n//# sourceMappingURL=live-button-core.js.map","//#region src/core/ui/live-button/live-button-data-attrs.ts\nconst LiveButtonDataAttrs = {\n\t/** Present when the stream is live (or DVR). */\n\tlive: \"data-live\",\n\t/** Present when playback is at the live edge. */\n\tliveEdge: \"data-live-edge\"\n};\n//#endregion\nexport { LiveButtonDataAttrs };\n\n//# sourceMappingURL=live-button-data-attrs.js.map","import { LiveButtonCore, LiveButtonDataAttrs, type LiveButtonMediaState } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createButton,\n logMissingFeature,\n selectBuffer,\n selectLive,\n selectTime,\n} from '@videojs/core/dom';\nimport { resolveText, type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { State } from '@videojs/store';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/player-controller';\nimport { MediaElement } from '../media-element';\n\n/**\n * `<media-live-button>` — selects from `live`, `time`, and `buffer` features\n * and composes them into the `LiveButtonMediaState` consumed by\n * `LiveButtonCore`.\n *\n * Doesn't extend `MediaButtonElement` because that base couples a button to\n * a single feature selector; the LiveButton needs three.\n */\nexport class LiveButtonElement extends MediaElement {\n static readonly tagName = 'media-live-button';\n\n static override properties: PropertyDeclarationMap = {\n label: { type: String },\n disabled: { type: Boolean },\n };\n\n disabled = false;\n label: Text | string = '';\n\n protected readonly core = new LiveButtonCore();\n\n protected readonly live = new PlayerController(this, playerContext, selectLive);\n protected readonly time = new PlayerController(this, playerContext, selectTime);\n protected readonly buffer = new PlayerController(this, playerContext, selectBuffer);\n readonly #i18n = new I18nController(this, i18nContext);\n\n get $state(): State<LiveButtonCore.State> {\n return this.core.state;\n }\n\n #defaultContent = false;\n #disconnect: AbortController | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.destroyed) return;\n\n this.#defaultContent ||= !this.textContent?.trim();\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n this.#disconnect = new AbortController();\n\n const buttonProps = createButton({\n onActivate: () => {\n const media = this.#getMedia();\n if (media) this.core.seekToLive(media);\n },\n isDisabled: () => this.disabled || !this.#getMedia(),\n });\n\n applyElementProps(this, buttonProps, { signal: this.#disconnect.signal });\n\n if (__DEV__ && !this.#getMedia()) {\n logMissingFeature(this.localName, this.live.displayName ?? 'live');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n /** Returns the button's current label derived from media state. */\n getLabel(): string | undefined {\n return this.core.state.current.label ? resolveText(this.core.state.current.label) : undefined;\n }\n\n /** Resolved label for tooltips and other display surfaces. */\n getResolvedLabel(): string | undefined {\n const media = this.#getMedia();\n if (!media) return undefined;\n const state = this.core.getState();\n return translateText(this.core.getLabel(state), this.#i18n.value);\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n this.core.setProps(this);\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n if (this.#defaultContent) {\n this.textContent = translateText(LiveButtonCore.defaultText, this.#i18n.value);\n }\n\n const media = this.#getMedia();\n if (!media) return;\n\n this.core.setMedia(media);\n const state = this.core.getState();\n const attrs = this.core.getAttrs(state);\n applyElementProps(this, {\n ...attrs,\n 'aria-label': translateText(attrs['aria-label'], this.#i18n.value),\n });\n applyStateDataAttrs(this, state, LiveButtonDataAttrs);\n }\n\n /**\n * Compose the LiveButton media state from the three feature slices.\n * Returns `null` when any are missing so the button stays disabled until\n * all three features are registered on the player.\n */\n #getMedia(): LiveButtonMediaState | null {\n const live = this.live.value;\n const time = this.time.value;\n const buffer = this.buffer.value;\n if (!live || !time || !buffer) return null;\n return {\n currentTime: time.currentTime,\n seek: time.seek,\n seekable: buffer.seekable,\n liveEdgeStart: live.liveEdgeStart,\n targetLiveWindow: live.targetLiveWindow,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { i as MediaContainerElement } from "./create-player-BHFyOnWi.js";
|
|
1
|
+
import { Q as createTemplate, c as defineTooltip, d as PopoverElement, f as PlayButtonElement, h as BufferingIndicatorElement, i as defineMenu, l as defineVolumeSlider, m as HotkeyElement, n as defineErrorDialog, o as defineTime, p as MuteButtonElement, r as defineInputIndicators, s as defineTimeSlider, t as defineControls } from "./compounds-nk9RJtBK.js";
|
|
3
2
|
import { i as safeDefine } from "./context-OhQY847V.js";
|
|
3
|
+
import { t as MediaContainerElement } from "./container-element-HHK_KZOE.js";
|
|
4
4
|
import { n as createShadowStyle } from "./shadow-styles-BkjnRJ4e.js";
|
|
5
|
-
import { t as SkinElement } from "./skin-element-
|
|
6
|
-
import { t as GestureElement } from "./gesture-element-
|
|
7
|
-
import { a as CaptionsRadioGroupElement, i as CastButtonElement, n as PiPButtonElement, o as CaptionsButtonElement, r as FullscreenButtonElement, s as AirPlayButtonElement, t as PosterElement } from "./poster-element-
|
|
8
|
-
import { t as LiveButtonElement } from "./live-button-element-
|
|
5
|
+
import { t as SkinElement } from "./skin-element-DNytI-uu.js";
|
|
6
|
+
import { t as GestureElement } from "./gesture-element-6Ld1YwIL.js";
|
|
7
|
+
import { a as CaptionsRadioGroupElement, i as CastButtonElement, n as PiPButtonElement, o as CaptionsButtonElement, r as FullscreenButtonElement, s as AirPlayButtonElement, t as PosterElement } from "./poster-element-BGr1VQJB.js";
|
|
8
|
+
import { t as LiveButtonElement } from "./live-button-element-Bae44kBN.js";
|
|
9
9
|
import { t as renderIcon } from "./minimal-DLosvq31.js";
|
|
10
|
-
import { t as LiveVideoPlayerElement } from "./player-
|
|
10
|
+
import { t as LiveVideoPlayerElement } from "./player-DM9rUXg-.js";
|
|
11
11
|
|
|
12
12
|
//#region inline-css:src/define/live-video/minimal-skin.js
|
|
13
|
-
var minimal_skin_default = "/* -------------------------------------------------------------------------- */\n/* Global styles for the host document, outside of the Shadow DOM */\n/* -------------------------------------------------------------------------- */\n\nvideo-player,\nlive-video-player,\nmedia-i18n {\n display: contents;\n}\n\n/*\nRequired to override any default video and image styles (such as\nTailwind's CSS reset) and ensure they fill the container as expected.\n*/\nvideo-player video,\nvideo-player [slot=\"poster\"],\nlive-video-player video,\nlive-video-player [slot=\"poster\"] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\nvideo-player video::-webkit-media-text-track-container,\nlive-video-player video::-webkit-media-text-track-container {\n z-index: 1;\n font-family: inherit;\n scale: 0.98;\n translate: 0 var(--media-caption-track-y, 0);\n transition: translate var(--media-caption-track-duration, 0) ease-out;\n transition-delay: var(--media-caption-track-delay, 0);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Shared styles for all HTML skins */\n/* -------------------------------------------------------------------------- */\n\nmedia-tooltip-group {\n display: contents;\n}\n\n:host {\n /* `display:grid` fixes a weird issue with Safari when setting aspect-ratio */\n display: grid;\n width: 100%;\n}\n\nmedia-container {\n min-width: 0;\n min-height: 0;\n}\n\n/* Hide the volume popover when its slider is unavailable. */\n.media-popover--volume:has(media-volume-slider[data-hidden]) {\n display: none;\n}\n\n.media-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border: 0;\n clip: rect(0, 0, 0, 0);\n}\n\n\n.media-minimal-skin *,\n.media-minimal-skin *::before,\n.media-minimal-skin *::after {\n box-sizing: border-box;\n}\n.media-minimal-skin img,\n.media-minimal-skin video,\n.media-minimal-skin svg {\n display: block;\n max-width: 100%;\n}\n.media-minimal-skin button {\n font: inherit;\n}\n.media-minimal-skin [hidden][hidden] {\n /* Keep authored templates hidden even when component classes set display. */\n display: none;\n}\n@media (prefers-reduced-motion: no-preference) {\n .media-minimal-skin {\n interpolate-size: allow-keywords;\n }\n}\n\n.media-minimal-skin {\n /* Colors */\n --accent-color: var(--media-accent-color, var(--default-accent-color));\n --accent-contrast-color: contrast-color(var(--accent-color));\n --accent-background-color: var(\n --media-accent-color,\n oklch(from var(--default-accent-color) l c h / calc(alpha * 0.1))\n );\n --accent-text-color: var(--media-accent-text-color, contrast-color(var(--media-accent-color, oklch(0 0 0))));\n --shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));\n --shadow-subtle-current-color: oklch(from var(--shadow-current-color) l c h / calc(alpha * 0.4));\n --scrollbar-thumb-color: oklch(from currentColor l c h / 0.3);\n\n /* Scaling - used in video fullscreen to scale the UI. */\n --scale: 1;\n /* Fixed scaling unit to avoid inheriting the document's root font size. This must be a CSS <length>. */\n --scale-unit: var(--media-scale-unit, 16px);\n --size: calc(var(--scale-unit) * var(--scale));\n /* Create a Tailwind-like spacing unit where 1 equals 4px with default scaling. */\n --spacing: calc(var(--size) / 4);\n\n /* Font sizes */\n --font-size-medium: calc(0.9375 * var(--size)); /* 15px */\n --font-size-base: calc(0.8125 * var(--size)); /* 13px */\n --font-size-small: calc(0.6875 * var(--size)); /* 11px */\n --font-size-tiny: calc(0.5625 * var(--size)); /* 9px */\n --media-icon-size: calc(1.125 * var(--size)); /* 18px */\n\n /* Radii */\n --container-border-radius: var(--media-border-radius, 0.75rem);\n\n position: relative;\n display: block;\n width: 100%;\n height: 100%;\n container: media-root / inline-size;\n font-family:\n Inter Variable,\n Inter,\n ui-sans-serif,\n system-ui,\n sans-serif;\n font-size: var(--font-size-base);\n -webkit-font-smoothing: auto;\n -moz-osx-font-smoothing: auto;\n line-height: 1.5;\n letter-spacing: normal;\n outline: 2px solid transparent;\n outline-offset: -4px;\n scrollbar-color: var(--scrollbar-thumb-color) transparent;\n scrollbar-width: thin;\n border-radius: var(--container-border-radius);\n isolation: isolate;\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n transition-property: outline-offset, outline-color;\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: var(--scrollbar-thumb-color);\n border-radius: 9999px;\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n --scrollbar-thumb-color: oklch(from currentColor l c h / 0.8);\n scrollbar-width: auto;\n }\n}\n\n.media-minimal-skin ::slotted(video),\n.media-minimal-skin video {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n}\n.media-minimal-skin ::slotted(video) {\n border-radius: var(--container-border-radius);\n}\n.media-minimal-skin video {\n border-radius: inherit;\n}\n\n.media-minimal-skin:fullscreen ::slotted(video),\n.media-minimal-skin:fullscreen video {\n object-fit: contain;\n}\n\n.media-minimal-skin .media-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-image: linear-gradient(\n to top,\n oklch(0 0 0 / 0.7),\n oklch(0 0 0 / 0.5) calc(var(--spacing) * 30),\n oklch(0 0 0 / 0)\n );\n border-radius: inherit;\n opacity: 0;\n backdrop-filter: blur(0) saturate(1);\n transition-timing-function: ease-out;\n transition-duration: var(--controls-transition-duration);\n transition-property: opacity, backdrop-filter;\n}\n\n.media-minimal-skin .media-error ~ .media-overlay {\n transition-delay: var(--error-dialog-transition-delay);\n transition-duration: var(--error-dialog-transition-duration);\n}\n\n.media-minimal-skin .media-controls[data-visible] ~ .media-overlay,\n.media-minimal-skin .media-error[data-open] ~ .media-overlay {\n opacity: 1;\n}\n\n.media-minimal-skin .media-buffering-indicator[data-visible] ~ .media-overlay {\n background: oklch(0 0 0 / 0.35);\n opacity: 1;\n backdrop-filter: blur(8px);\n}\n\n.media-minimal-skin .media-error[data-open] ~ .media-overlay {\n backdrop-filter: blur(16px) saturate(1.2);\n}\n\n.media-minimal-skin .media-buffering-indicator {\n position: absolute;\n inset: 0;\n z-index: 10;\n display: none;\n place-content: center;\n color: oklch(1 0 0);\n pointer-events: none;\n\n &:not([data-visible]) {\n --media-spinner-animation: none;\n }\n\n &[data-visible] {\n display: grid;\n }\n\n @media (prefers-reduced-motion: reduce) {\n --media-spinner-animation: none;\n }\n}\n\n.media-minimal-skin .media-error:not([data-open]) {\n display: none;\n}\n\n.media-minimal-skin .media-error__title {\n font-weight: 600;\n line-height: 1.25;\n}\n\n.media-minimal-skin .media-error__description {\n overflow-wrap: anywhere;\n opacity: 0.7;\n}\n\n.media-minimal-skin .media-error__actions {\n display: flex;\n gap: calc(var(--spacing) * 2);\n\n > * {\n flex: 1;\n }\n}\n\n.media-minimal-skin .media-error[data-open] ~ .media-controls * {\n visibility: hidden;\n}\n\n.media-minimal-skin .media-controls {\n --media-popover-side-offset: calc(var(--spacing) * (var(--base-side-offset, 2) + 1));\n --media-tooltip-side-offset: var(--media-popover-side-offset);\n --media-popover-boundary-offset: calc(var(--spacing) * (var(--base-boundary-offset, 0) + 1));\n --media-tooltip-boundary-offset: var(--media-popover-boundary-offset);\n\n display: flex;\n align-items: center;\n padding: calc(var(--spacing) * 1);\n container: media-controls / inline-size;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n background-color: var(--controls-background-color);\n backdrop-filter: var(--controls-backdrop-filter);\n}\n\n.media-minimal-skin .media-time-controls {\n display: flex;\n flex: 1;\n flex-direction: row-reverse;\n gap: calc(var(--spacing) * 3);\n align-items: center;\n container: media-time-controls / inline-size;\n}\n\n.media-minimal-skin .media-time-group {\n display: flex;\n gap: calc(var(--spacing) * 1);\n align-items: center;\n}\n\n.media-minimal-skin .media-time {\n font-variant-numeric: tabular-nums;\n}\n\n.media-minimal-skin .media-time[role=\"button\"] {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border-radius: calc(var(--spacing) * 1);\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n transition-property: outline-color, outline-offset;\n\n @supports (corner-shape: squircle) {\n border-radius: calc(var(--spacing) * 4);\n corner-shape: squircle;\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n}\n\n.media-minimal-skin .media-time--current,\n.media-minimal-skin .media-time-separator {\n display: none;\n}\n\n@container media-root (width > 42rem) {\n .media-minimal-skin .media-time-controls {\n flex-direction: row;\n }\n\n .media-minimal-skin .media-time--duration,\n .media-minimal-skin .media-time-separator {\n color: oklch(from currentColor l c h / 0.6);\n }\n\n .media-minimal-skin .media-time--current,\n .media-minimal-skin .media-time-separator {\n display: inline;\n }\n}\n\n/* Base button */\n.media-minimal-skin .media-button {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n height: calc(var(--spacing) * 9.5);\n min-height: 0;\n padding: calc(var(--spacing) * 2) calc(var(--spacing) * 4);\n text-align: center;\n touch-action: manipulation;\n cursor: pointer;\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border: none;\n border-radius: calc(var(--spacing) * 2);\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: background-color, outline-offset, scale;\n /* Fix weird jumping when clicking on the buttons in Safari. */\n will-change: scale;\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &:active:not([aria-disabled=\"true\"]) {\n scale: 0.97;\n }\n\n &[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n\n@supports (corner-shape: squircle) {\n .media-minimal-skin .media-button {\n border-radius: calc(var(--spacing) * 4);\n corner-shape: squircle;\n }\n}\n\n/* Primary button variant */\n.media-minimal-skin .media-button--primary {\n font-weight: 500;\n color: var(--accent-contrast-color);\n text-shadow: none;\n background: var(--accent-color);\n}\n\n/* Subtle button variant */\n.media-minimal-skin .media-button--subtle {\n color: inherit;\n text-shadow: inherit;\n background: transparent;\n\n &:not([aria-disabled=\"true\"]) {\n &:hover,\n &:focus-visible,\n &[aria-expanded=\"true\"] {\n color: var(--accent-text-color);\n text-decoration: none;\n background-color: var(--accent-background-color);\n }\n }\n}\n\n/* Icon button variant */\n.media-minimal-skin .media-button--icon {\n display: grid;\n aspect-ratio: 1;\n padding: 0;\n\n &:active:not([aria-disabled=\"true\"]) {\n scale: 0.97;\n }\n\n .media-icon__container {\n display: grid;\n }\n\n .media-icon {\n grid-area: 1 / 1;\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, scale;\n }\n}\n\n/* Seek button */\n.media-minimal-skin .media-button--seek {\n .media-icon__label {\n position: absolute;\n right: -1px;\n bottom: -3px;\n font-size: 0.715em; /* 10px */\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n letter-spacing: -0.05em;\n }\n\n &:has(.media-icon--flipped) .media-icon__label {\n right: unset;\n left: -1px;\n }\n}\n\n/* Playback rate button */\n.media-minimal-skin .media-button--playback-rate {\n padding: 0;\n font-variant-numeric: tabular-nums;\n\n &::after {\n width: 4ch;\n content: attr(data-rate) \"\\00D7\";\n }\n\n &[data-inline-rate-label]::after {\n content: none;\n }\n}\n\n/* Settings button */\n.media-minimal-skin .media-button--settings {\n .media-icon--settings {\n transition: transform 150ms ease-in-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition-duration: 0ms;\n }\n }\n\n &[aria-expanded=\"true\"] .media-icon--settings {\n transform: rotate(90deg);\n }\n}\n\n/* Live button — wide pill button with a status dot (gray → red at the live\n edge) rendered via ::before, and \"LIVE\" text rendered as the button's own\n text content. */\n.media-minimal-skin .media-button--live {\n display: inline-flex;\n gap: calc(var(--spacing) * 1.5);\n align-items: center;\n width: auto;\n aspect-ratio: auto;\n padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3);\n font-size: var(--font-size-small);\n font-weight: 600;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &::before {\n display: inline-block;\n flex-shrink: 0;\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n content: \"\";\n background-color: oklch(from currentColor l c h / 0.4);\n border-radius: 50%;\n transition: background-color 150ms ease-out;\n }\n\n &[data-live-edge]::before {\n background-color: oklch(0.65 0.22 27);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .media-minimal-skin .media-button {\n scale: 1;\n transition-property: background-color, outline-offset;\n will-change: auto;\n }\n}\n\n.media-minimal-skin .media-button-group {\n display: flex;\n gap: 1px;\n align-items: center;\n}\n\n.media-minimal-skin .media-badge {\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 1.5);\n font-size: var(--font-size-small);\n font-weight: 500;\n line-height: 1;\n color: oklch(from currentColor l c h / 0.85);\n white-space: nowrap;\n background-color: oklch(from currentColor l c h / 0.1);\n border-radius: calc(var(--spacing) * 1);\n}\n\n.media-minimal-skin .media-icon__container {\n position: relative;\n}\n\n.media-minimal-skin .media-icon {\n flex-shrink: 0;\n width: var(--media-icon-size);\n height: var(--media-icon-size);\n}\n.media-minimal-skin .media-icon--flipped {\n scale: -1 1;\n}\n\n.media-minimal-skin media-poster,\n.media-minimal-skin > img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n transition: opacity 0.25s;\n}\n.media-minimal-skin media-poster:not([data-visible]),\n.media-minimal-skin > img:not([data-visible]),\n.media-minimal-skin > img[data-visible]:not([data-loaded]) {\n opacity: 0;\n}\n.media-minimal-skin media-poster ::slotted(img),\n.media-minimal-skin media-poster img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n border-radius: var(--container-border-radius);\n}\n.media-minimal-skin > img {\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n border-radius: inherit;\n}\n\n/* Blurred placeholder: HTML path targets media-poster::before, React path targets the skin container::before */\n.media-minimal-skin media-poster::before,\n.media-minimal-skin::before {\n position: absolute;\n inset: 0;\n pointer-events: none;\n content: \"\";\n background-image: var(--media-poster-placeholder, none);\n background-repeat: no-repeat;\n background-position: var(--media-object-position, center);\n background-size: var(--media-object-fit, contain);\n filter: blur(var(--media-poster-placeholder-blur, 20px));\n}\n\n/* React path: hidden by default, transitions in while poster loads */\n.media-minimal-skin::before {\n opacity: 0;\n transition: opacity 0.25s;\n}\n/* Show placeholder while the poster is visible but not yet loaded */\n.media-minimal-skin:has(img[data-visible]:not([data-loaded]))::before {\n opacity: 1;\n}\n\n.media-minimal-skin:fullscreen media-poster ::slotted(img),\n.media-minimal-skin:fullscreen media-poster img,\n.media-minimal-skin:fullscreen > img {\n object-fit: contain;\n}\n\n.media-minimal-skin .media-thumbnail {\n position: relative;\n pointer-events: none;\n background-color: oklch(0 0 0 / 0.9);\n border-radius: calc(var(--spacing) * 2);\n\n &::after {\n position: absolute;\n inset: 0;\n content: \"\";\n border-radius: inherit;\n box-shadow:\n 0 0 0 1px oklch(0 0 0 / 0.05),\n 0 1px 3px 0 oklch(0 0 0 / 0.2),\n 0 1px 2px -1px oklch(0 0 0 / 0.2);\n }\n\n .media-thumbnail__image {\n position: relative;\n display: block;\n max-width: var(--thumbnail-max-width);\n max-height: var(--max-height);\n overflow: clip;\n border-radius: inherit;\n }\n\n .media-thumbnail__spinner {\n position: absolute;\n top: 50%;\n left: 50%;\n opacity: 0;\n translate: -50% -50%;\n }\n\n .media-thumbnail__image,\n .media-thumbnail__spinner {\n transition: opacity 150ms ease-out;\n }\n\n &:not(:has(.media-thumbnail__image[data-loading])) {\n .media-thumbnail__spinner {\n --media-spinner-animation: none;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n --media-spinner-animation: none;\n }\n\n &:has(.media-thumbnail__image[data-loading]) {\n width: var(--thumbnail-max-width);\n max-width: 100%;\n aspect-ratio: 16 / 9;\n overflow: hidden;\n\n .media-thumbnail__image {\n opacity: 0;\n }\n .media-thumbnail__spinner {\n opacity: 1;\n }\n }\n}\n\n.media-minimal-skin .media-slider {\n --thumb-size: calc(var(--spacing) * 3);\n --thumb-active-size: calc(var(--spacing) * 3);\n --track-border-radius: calc(Infinity * 1px);\n\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n outline: none;\n border-radius: var(--track-border-radius);\n\n &[data-orientation=\"horizontal\"] {\n width: var(--slider-width, 100%);\n min-width: calc(var(--spacing) * 20);\n height: var(--slider-height, calc(var(--spacing) * 8));\n }\n &[data-orientation=\"vertical\"] {\n width: var(--slider-width, calc(var(--spacing) * 8));\n height: var(--slider-height, calc(var(--spacing) * 20));\n }\n\n /* Track */\n .media-slider__track {\n position: relative;\n overflow: hidden;\n user-select: none;\n background-color: oklch(from currentColor l c h / 0.2);\n border-radius: inherit;\n isolation: isolate;\n\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n height: calc(var(--spacing) * 0.75);\n }\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 0.75);\n height: 100%;\n }\n }\n\n /* Thumb */\n .media-slider__thumb {\n position: absolute;\n z-index: 10;\n width: var(--thumb-size);\n height: var(--thumb-size);\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n background-color: currentColor;\n border-radius: calc(Infinity * 1px);\n box-shadow:\n 0 0 0 1px var(--shadow-current-color, oklch(0 0 0 / 0.15)),\n 0 1px 3px 0 oklch(0 0 0 / 0.15),\n 0 1px 2px -1px oklch(0 0 0 / 0.15);\n opacity: 0;\n transform-origin: center;\n scale: 0.7;\n translate: -50% -50%;\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n\n &[data-orientation=\"horizontal\"] {\n top: 50%;\n left: var(--media-slider-fill);\n }\n &[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-fill));\n left: 50%;\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n }\n\n &:focus-within .media-slider__thumb,\n .media-slider__thumb--persistent {\n width: var(--thumb-active-size);\n height: var(--thumb-active-size);\n opacity: 1;\n scale: 1;\n }\n\n @media (hover: hover) and (pointer: fine) {\n &:hover .media-slider__thumb {\n width: var(--thumb-active-size);\n height: var(--thumb-active-size);\n opacity: 1;\n scale: 1;\n }\n }\n\n /* Shared track fills */\n .media-slider__buffer,\n .media-slider__fill {\n position: absolute;\n pointer-events: none;\n border-radius: inherit;\n\n &[data-orientation=\"horizontal\"] {\n inset-block: 0;\n left: 0;\n width: 100%;\n transition-property: clip-path;\n }\n &[data-orientation=\"vertical\"] {\n inset-inline: 0;\n bottom: 0;\n height: 100%;\n transition-property: clip-path;\n }\n }\n\n /* Buffer */\n .media-slider__buffer {\n background-color: oklch(from currentColor l c h / 0.2);\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-buffer)) 0 0 round var(--track-border-radius));\n }\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-buffer)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n /* Fill */\n .media-slider__fill {\n background-color: var(--accent-color);\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-fill)) 0 0 round var(--track-border-radius));\n }\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-fill)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n /* Chapters */\n .media-slider__chapters {\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n min-height: 0;\n border-radius: inherit;\n\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n height: 100%;\n }\n &[data-orientation=\"vertical\"] {\n flex-direction: column-reverse;\n width: 100%;\n height: 100%;\n }\n }\n\n .media-slider__chapter {\n --chapter-gap: calc(var(--spacing) * 1);\n --chapter-inset-start: 0.5;\n --chapter-inset-end: 0.5;\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n min-height: 0;\n\n &:first-child {\n --chapter-inset-start: 0;\n }\n &:last-child {\n --chapter-inset-end: 0;\n }\n\n .media-slider__chapter-track {\n --chapter-track-size: calc(var(--spacing) * 0.75);\n --chapter-track-highlighted-size: calc(var(--spacing) * 1.25);\n border-radius: var(--track-border-radius);\n\n @media (prefers-reduced-motion: no-preference) {\n transition: 200ms ease-out;\n transition-property: height, width;\n }\n }\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start));\n\n .media-slider__chapter-track {\n height: var(--chapter-track-size);\n clip-path: inset(\n 0 calc(100% - var(--media-slider-chapter-end) + var(--chapter-gap) * var(--chapter-inset-end)) 0\n calc(var(--media-slider-chapter-start) + var(--chapter-gap) * var(--chapter-inset-start)) round\n var(--track-border-radius)\n );\n }\n\n &[data-highlighted] .media-slider__chapter-track {\n height: var(--chapter-track-highlighted-size);\n }\n }\n\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start) 0);\n\n .media-slider__chapter-track {\n width: var(--chapter-track-size);\n clip-path: inset(\n calc(100% - var(--media-slider-chapter-end) + var(--chapter-gap) * var(--chapter-inset-end)) 0\n calc(var(--media-slider-chapter-start) + var(--chapter-gap) * var(--chapter-inset-start)) 0 round\n var(--track-border-radius)\n );\n }\n\n &[data-highlighted] .media-slider__chapter-track {\n width: var(--chapter-track-highlighted-size);\n }\n }\n }\n\n /* Dragging — thumb and fill follow the pointer position */\n &[data-dragging] {\n .media-slider__thumb[data-orientation=\"horizontal\"] {\n left: var(--media-slider-pointer);\n }\n .media-slider__thumb[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-pointer));\n }\n .media-slider__fill[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--track-border-radius));\n }\n .media-slider__fill[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .media-slider__thumb {\n transition-property: opacity, scale, height, width, outline-offset, left, top;\n }\n .media-slider__fill {\n transition-timing-function: linear;\n transition-duration: 200ms;\n }\n .media-slider__buffer {\n transition-timing-function: ease-out;\n transition-duration: 250ms;\n }\n }\n\n &[data-dragging],\n &[data-seeking] {\n .media-slider__thumb,\n .media-slider__fill,\n .media-slider__buffer {\n transition-duration: 0ms;\n }\n }\n\n /* Preview */\n .media-slider__preview {\n --max-width: min(calc(var(--spacing) * 48), 100cqi);\n --max-height: calc(var(--spacing) * 32);\n\n min-width: 100%;\n height: calc(var(--spacing) * 1);\n\n .media-slider__thumbnail,\n .media-slider__value {\n position: absolute;\n left: var(--preview-left, var(--media-slider-pointer));\n max-width: var(--max-width);\n opacity: 0;\n filter: blur(8px);\n transform-origin: bottom;\n scale: 0.8;\n translate: -50% calc(var(--spacing) * 2);\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: filter, opacity, scale;\n }\n\n .media-slider__thumbnail {\n --thumbnail-max-width: var(--max-width);\n bottom: calc(100% + (var(--spacing) * 12));\n }\n\n .media-slider__value {\n bottom: calc(100% + (var(--spacing) * 5));\n display: flex;\n flex-direction: row-reverse;\n gap: calc(var(--spacing) * 2);\n justify-content: center;\n padding-inline: calc(var(--spacing) * 3);\n text-shadow: 0 1px 0 var(--shadow-current-color);\n }\n\n .media-slider__chapter-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:empty {\n display: none;\n }\n }\n\n &::before {\n position: absolute;\n z-index: 1;\n pointer-events: none;\n content: \"\";\n background-color: oklch(from currentColor l c h / 0.35);\n opacity: 0;\n scale: 0.5;\n translate: -50% -50%;\n transition-timing-function: ease-out;\n transition-duration: 200ms;\n transition-property: opacity, scale;\n }\n\n &[data-pointing] .media-slider__value,\n &[data-pointing] .media-slider__thumbnail,\n &[data-interactive]:not([data-pointing]):not([data-dragging]) .media-slider__value,\n &[data-interactive]:not([data-pointing]):not([data-dragging]) .media-slider__thumbnail {\n opacity: 1;\n filter: blur(0);\n scale: 1;\n }\n\n &[data-orientation=\"horizontal\"]::before {\n top: 50%;\n left: var(--media-slider-pointer);\n width: 1px;\n height: calc(var(--spacing) * 5);\n }\n &[data-orientation=\"vertical\"]::before {\n top: calc(100% - var(--media-slider-pointer));\n left: 50%;\n width: calc(var(--spacing) * 5);\n height: 1px;\n }\n\n &[data-pointing]:not([data-dragging])::before {\n opacity: 1;\n scale: 1;\n }\n }\n}\n\n.media-minimal-skin {\n --popup-transition:\n opacity var(--popup-transition-timing-function) var(--popup-transition-duration),\n filter var(--popup-transition-timing-function) var(--popup-transition-duration),\n transform var(--popup-transition-timing-function) var(--popup-transition-duration),\n scale var(--popup-transition-timing-function) var(--popup-transition-duration);\n}\n\n.media-minimal-skin .media-popover,\n.media-minimal-skin .media-tooltip {\n --popup-translate-distance: calc(var(--spacing) * 2);\n margin: 0;\n overflow: visible;\n color: inherit;\n border: 0;\n transition: var(--popup-transition);\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n /* We have to use transform here for translate as the translate property is used for positioning by core. */\n transform: translate(var(--popup-translate-x-distance, 0), var(--popup-translate-y-distance, 0));\n scale: 0.95;\n }\n\n &[data-ending-style] {\n filter: blur(4px);\n transform: none;\n /* Speed up the exit transition. */\n transition-duration: max(0ms, calc(var(--popup-transition-duration) - 50ms));\n }\n\n &[data-side=\"top\"] {\n --popup-translate-y-distance: var(--popup-translate-distance);\n transform-origin: bottom;\n }\n &[data-side=\"bottom\"] {\n --popup-translate-y-distance: calc(var(--popup-translate-distance) * -1);\n transform-origin: top;\n }\n &[data-side=\"left\"] {\n --popup-translate-x-distance: var(--popup-translate-distance);\n transform-origin: right;\n }\n &[data-side=\"right\"] {\n --popup-translate-x-distance: calc(var(--popup-translate-distance) * -1);\n transform-origin: left;\n }\n\n /* Safe area between trigger and popup */\n &::before {\n position: absolute;\n pointer-events: inherit;\n content: \"\";\n }\n\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n inset-inline: 0;\n width: 100%;\n }\n &[data-side=\"top\"]::before {\n top: 100%;\n }\n &[data-side=\"bottom\"]::before {\n bottom: 100%;\n }\n\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n inset-block: 0;\n height: 100%;\n }\n &[data-side=\"left\"]::before {\n left: 100%;\n }\n &[data-side=\"right\"]::before {\n right: 100%;\n }\n}\n\n.media-minimal-skin .media-popover {\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n height: var(--media-popover-side-offset);\n }\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n width: var(--media-popover-side-offset);\n }\n}\n\n.media-minimal-skin .media-tooltip {\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2);\n font-size: var(--font-size-base);\n color: var(--tooltip-text-color);\n white-space: nowrap;\n background-color: var(--tooltip-background-color);\n border-radius: calc(var(--spacing) * 2);\n box-shadow:\n 0 0 0 1px var(--tooltip-border-color),\n 0 4px 6px -1px oklch(0 0 0 / 0.2),\n 0 2px 4px -2px oklch(0 0 0 / 0.2);\n backdrop-filter: var(--tooltip-backdrop-filter);\n\n /* `display: flex` must not apply while closed — it overrides UA `[popover]` hiding. */\n &[data-open] {\n display: flex;\n column-gap: calc(var(--spacing) * 1);\n align-items: center;\n }\n\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n height: var(--media-tooltip-side-offset);\n }\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n width: var(--media-tooltip-side-offset);\n }\n\n .media-tooltip__kbd {\n min-width: 1.5em;\n padding: 0.1em;\n margin-right: calc(var(--spacing) * -1);\n font-family: inherit;\n font-size: var(--font-size-small);\n font-weight: 600;\n line-height: 1.25;\n text-align: center;\n background-color: oklch(from currentColor l c h / 0.15);\n border-radius: calc(var(--spacing) * 1);\n }\n}\n\n.media-minimal-skin .media-popover--volume:has(media-volume-slider[data-hidden]) {\n display: none;\n}\n\n.media-minimal-skin .media-menu {\n --menu-transition-duration: 250ms;\n --menu-max-height: calc(var(--spacing) * 56);\n --menu-padding: calc(var(--spacing) * 1);\n --menu-border-radius: calc(var(--spacing) * 2.5);\n --menu-item-border-radius: calc(var(--menu-border-radius) - var(--menu-padding));\n box-sizing: border-box;\n min-width: max-content;\n max-width: var(--media-popover-available-width, none);\n max-height: min(var(--media-popover-available-height, var(--menu-max-height)), var(--menu-max-height));\n padding: var(--menu-padding);\n overflow: auto;\n overscroll-behavior: none;\n background-color: var(--popover-background-color);\n border-radius: var(--menu-border-radius);\n box-shadow:\n 0 0 0 1px var(--popover-border-color),\n 0 4px 6px -1px oklch(0 0 0 / 0.1),\n 0 2px 4px -2px oklch(0 0 0 / 0.1);\n backdrop-filter: var(--popover-backdrop-filter);\n\n @media (prefers-reduced-motion: reduce) {\n --menu-transition-duration: 0ms;\n }\n\n & > .media-menu__panel {\n position: absolute;\n inset-inline: 0;\n top: 0;\n z-index: 10;\n max-height: inherit;\n padding: var(--menu-padding);\n overflow: auto;\n overscroll-behavior: none;\n outline: none;\n translate: 0 0;\n transition-timing-function: ease-out;\n transition-duration: var(--menu-transition-duration);\n transition-property: translate, filter;\n will-change: translate, filter;\n\n &:where([data-starting-style], [data-ending-style]) {\n overflow: hidden;\n pointer-events: none;\n filter: blur(8px);\n translate: 100% 0;\n }\n }\n\n .media-menu__separator {\n margin: calc(var(--spacing) * 1) 0;\n border-bottom: 1px solid oklch(1 0 0 / 0.1);\n }\n\n .media-menu__group {\n anchor-scope: --menu-item-highlight-anchor;\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 0.5);\n\n @supports (top: anchor(top)) {\n &::before {\n position: absolute;\n position-anchor: --menu-item-highlight-anchor;\n inset: anchor(inside);\n /* Firefox treats the moving highlight as a content shift and re-scrolls\n the menu while hovering. Exclude it from scroll anchoring. */\n overflow-anchor: none;\n pointer-events: none;\n content: \"\";\n background-color: var(--accent-background-color);\n border-radius: var(--menu-item-border-radius);\n transition: inset 100ms ease-in-out;\n }\n\n &:has([data-highlighted=\"\"])::before {\n transition-duration: 0ms;\n }\n }\n }\n\n .media-menu__item,\n .media-menu__back {\n position: relative;\n display: flex;\n gap: calc(var(--spacing) * 1.5);\n align-items: center;\n padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);\n text-align: left;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n cursor: pointer;\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border-radius: var(--menu-item-border-radius);\n transition: background-color, color;\n transition-timing-function: ease-in-out;\n transition-duration: 100ms;\n\n .media-icon {\n flex-shrink: 0;\n color: oklch(from currentColor l c h / 0.5);\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &:hover,\n &[data-highlighted] {\n color: var(--accent-text-color);\n background-color: var(--accent-background-color);\n\n .media-icon {\n color: inherit;\n }\n }\n\n @supports (top: anchor(top)) {\n transition-duration: 50ms;\n\n &:hover,\n &[data-highlighted] {\n transition-duration: 200ms;\n }\n }\n }\n\n .media-menu__indicator {\n flex-shrink: 0;\n margin-right: calc(var(--spacing) * -1);\n margin-left: auto;\n opacity: 0;\n }\n\n .media-menu__item {\n justify-content: space-between;\n font-variant-numeric: tabular-nums;\n color: inherit;\n\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n &[aria-checked=\"true\"] .media-menu__indicator {\n opacity: 1;\n }\n\n &[data-availability=\"unavailable\"],\n &[data-availability=\"unsupported\"] {\n display: none;\n }\n\n &[data-highlighted] {\n @supports (top: anchor(top)) {\n anchor-name: --menu-item-highlight-anchor;\n background-color: transparent;\n }\n }\n }\n\n .media-menu__tier {\n padding-top: 1px;\n padding-left: calc(var(--spacing) * 0.5);\n font-size: var(--font-size-tiny);\n font-weight: 600;\n line-height: 1;\n color: oklch(from currentColor l c h / 0.7);\n }\n\n .media-menu__back {\n width: 100%;\n margin-bottom: calc(var(--spacing) * 0.5);\n }\n\n .media-menu__hint {\n display: inline-flex;\n gap: calc(var(--spacing) * 1);\n align-items: center;\n min-width: 0;\n padding-left: calc(var(--spacing) * 2);\n margin-left: auto;\n color: oklch(from currentColor l c h / 0.65);\n }\n\n .media-menu__hint-label {\n max-width: calc(var(--spacing) * 24);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .media-menu__chevron {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n\n /* Settings menu */\n &.media-menu--settings {\n width: var(--media-menu-width);\n min-width: calc(var(--spacing) * 48);\n height: var(--media-menu-height);\n overflow: hidden;\n /* Only the menu size changes between panels. */\n transition:\n var(--popup-transition),\n width var(--popup-transition-timing-function) var(--menu-transition-duration),\n height var(--popup-transition-timing-function) var(--menu-transition-duration);\n\n & > :not([data-submenu]) {\n translate: 0 0;\n transition:\n translate var(--menu-transition-duration) ease-out,\n filter var(--menu-transition-duration) ease-out;\n will-change: translate, filter;\n }\n\n &[data-submenu-expanded=\"true\"] > :not([data-submenu]) {\n filter: blur(8px);\n translate: -100% 0;\n }\n\n /* WebKit can restart the covered-content transition while the\n anchor-positioned highlight remains active. */\n &[data-submenu-expanded] > :not([data-submenu])::before {\n display: none;\n }\n\n /* Don't transition size on open/close. */\n &[data-starting-style],\n &[data-ending-style] {\n transition: var(--popup-transition);\n }\n }\n}\n\n.media-minimal-skin {\n --media-caption-track-duration: var(--controls-transition-duration);\n --media-caption-track-delay: 25ms;\n --media-caption-track-y: calc(var(--spacing) * -2);\n\n &:has(.media-controls[data-visible]) {\n --media-caption-track-y: calc(var(--spacing) * -18);\n }\n\n @container media-root (width > 42rem) {\n &:has(.media-controls[data-visible]) > * {\n --media-caption-track-y: calc(var(--spacing) * -12);\n }\n }\n}\n\n.media-minimal-skin video::-webkit-media-text-track-container {\n z-index: 1;\n font-family: inherit;\n scale: 0.98;\n translate: 0 var(--media-caption-track-y);\n transition: translate var(--media-caption-track-duration) ease-out;\n transition-delay: var(--media-caption-track-delay);\n}\n\n.media-minimal-skin .media-input-indicator-overlay {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n align-items: center;\n justify-items: center;\n overflow: hidden;\n color: oklch(1 0 0);\n pointer-events: none;\n border-radius: inherit;\n}\n\n.media-minimal-skin {\n .media-volume-indicator,\n .media-status-indicator--state {\n position: absolute;\n inset-inline: 0;\n top: 0;\n display: flex;\n justify-content: center;\n padding-top: calc(var(--spacing) * 3);\n padding-bottom: calc(var(--spacing) * 32);\n color: inherit;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n pointer-events: none;\n background-image: linear-gradient(\n to bottom,\n oklch(0 0 0 / 0.35),\n oklch(0 0 0 / 0.2) calc(var(--spacing) * 12),\n oklch(0 0 0 / 0)\n );\n transform-origin: top center;\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n\n .media-volume-indicator__content,\n .media-status-indicator__content {\n display: flex;\n gap: calc(var(--spacing) * 2);\n align-items: center;\n justify-content: space-between;\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2.5);\n }\n\n .media-icon {\n display: none;\n flex-shrink: 0;\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n }\n\n .media-volume-indicator__value,\n .media-status-indicator__value {\n margin-left: auto;\n }\n\n @media (pointer: fine) {\n transition-property: translate, filter, opacity;\n will-change: translate, filter, opacity;\n }\n\n @media (pointer: coarse) {\n transition-property: translate, opacity;\n will-change: translate, opacity;\n }\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n transition-property: translate, filter, opacity;\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n .media-volume-indicator__content,\n .media-status-indicator__content {\n background: var(--controls-background-color);\n border-radius: calc(var(--spacing) * 2);\n }\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n transition-timing-function: ease-in;\n transition-duration: 400ms;\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n filter: blur(8px);\n }\n }\n\n &[data-ending-style] {\n @media (prefers-reduced-motion: no-preference) {\n translate: 0 -100%;\n }\n }\n }\n\n .media-seek-indicator,\n .media-status-indicator--playback {\n display: grid;\n grid-row: 1;\n grid-column: 2;\n place-content: center;\n padding: calc(var(--spacing) * 4);\n text-align: center;\n }\n}\n\n.media-minimal-skin .media-volume-indicator {\n .media-volume-indicator__content {\n width: min(80%, calc(var(--spacing) * 56));\n transform: translateX(0);\n }\n\n .media-volume-indicator__progress {\n position: relative;\n width: 100%;\n height: calc(var(--spacing) * 0.75);\n background: oklch(from currentColor l c h / 0.2);\n border-radius: calc(Infinity * 1px);\n box-shadow: 0 1px 0 var(--shadow-subtle-current-color);\n\n &::before {\n position: absolute;\n inset-block: 0;\n left: 0;\n width: var(--media-volume-fill, 0%);\n content: \"\";\n background: var(--accent-color);\n border-radius: inherit;\n transition: width 200ms linear;\n }\n }\n\n &[data-level=\"high\"] .media-icon--volume-high,\n &[data-level=\"low\"] .media-icon--volume-low,\n &[data-level=\"off\"] .media-icon--volume-off {\n display: block;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n &[data-min]:not([data-starting-style], [data-ending-style]) .media-volume-indicator__content,\n &[data-max]:not([data-starting-style], [data-ending-style]) .media-volume-indicator__content {\n transform: translateX(0.25px);\n transition: transform 300ms linear(0, -24 20%, 16 40%, -8 60%, 4 80%, 1);\n }\n }\n}\n\n.media-minimal-skin .media-status-indicator--state {\n &[data-status=\"captions-on\"] .media-icon--captions-on,\n &[data-status=\"captions-off\"] .media-icon--captions-off,\n &[data-status=\"fullscreen\"] .media-icon--fullscreen-enter,\n &[data-status=\"exit-fullscreen\"] .media-icon--fullscreen-exit,\n &[data-status=\"pip\"] .media-icon--pip-enter,\n &[data-status=\"exit-pip\"] .media-icon--pip-exit {\n display: block;\n }\n}\n\n.media-minimal-skin .media-status-indicator--playback {\n transition-timing-function: ease-out;\n transition-duration: 200ms;\n transition-property: opacity, scale;\n\n .media-icon {\n grid-area: 1 / 1;\n width: calc(var(--media-icon-size) * 2);\n height: calc(var(--media-icon-size) * 2);\n opacity: 0;\n scale: 0;\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, scale;\n }\n\n &[data-status=\"pause\"] .media-icon--pause,\n &[data-status=\"play\"] .media-icon--play {\n opacity: 1;\n scale: 1;\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n scale: 0.85;\n }\n\n &[data-ending-style] {\n transition-timing-function: ease-in;\n transition-duration: 100ms;\n }\n\n @media (prefers-reduced-motion: reduce) {\n transition-duration: 50ms;\n transition-property: opacity;\n\n &[data-starting-style],\n &[data-ending-style],\n .media-icon {\n scale: 1;\n }\n\n .media-icon {\n transition-duration: 50ms;\n transition-property: opacity;\n }\n }\n}\n\n.media-minimal-skin .media-seek-indicator {\n gap: calc(var(--spacing) * 1);\n\n .media-seek-indicator__value {\n font-variant-numeric: tabular-nums;\n }\n\n @container media-root (width > 24rem) {\n padding: calc(var(--spacing) * 6);\n }\n\n &[data-direction=\"backward\"] {\n grid-column: 1;\n justify-self: left;\n }\n\n &[data-direction=\"forward\"] {\n grid-column: 3;\n justify-self: right;\n }\n\n .media-icon--seek {\n display: block;\n width: calc(var(--media-icon-size) * 1.5);\n height: calc(var(--media-icon-size) * 1.5);\n }\n\n &[data-direction=\"backward\"] .media-icon--seek {\n scale: -1 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .media-icon--seek {\n transition-timing-function: ease-in-out;\n transition-duration: 200ms;\n transition-property: translate, opacity;\n }\n\n &[data-starting-style] .media-icon--seek,\n &[data-ending-style] .media-icon--seek {\n opacity: 0;\n }\n\n &[data-direction=\"forward\"][data-starting-style] .media-icon--seek {\n translate: -60% 0;\n }\n\n &[data-direction=\"backward\"][data-starting-style] .media-icon--seek {\n translate: 60% 0;\n }\n }\n}\n\n/* ==========================================================================\n Icon State Visibility for Video Skins\n\n Data-attribute-driven visibility rules for multi-state icon buttons shared\n by the HTML and React skins.\n ========================================================================== */\n\n/* --- All icons hidden by default --- */\n\n.media-button--play .media-icon,\n.media-button--mute .media-icon,\n.media-button--fullscreen .media-icon,\n.media-button--pip .media-icon,\n.media-button--cast .media-icon,\n.media-button--airplay .media-icon,\n.media-button--captions .media-icon {\n opacity: 0;\n}\n.media-button--play .media-icon {\n scale: 0;\n}\n\n/* --- Active icon per state --- */\n\n/* Play: ended → restart */\n.media-button--play[data-ended] .media-icon--restart,\n/* Play: paused or not yet started (not ended) → play */\n.media-button--play:not([data-ended])[data-paused] .media-icon--play,\n.media-button--play:not([data-ended]):not([data-started]) .media-icon--play,\n/* Play: started and not paused/ended → pause */\n.media-button--play[data-started]:not([data-paused]):not([data-ended]) .media-icon--pause,\n/* Mute: muted → volume off */\n.media-button--mute[data-muted] .media-icon--volume-off,\n/* Mute: volume low (not muted) → volume low */\n.media-button--mute:not([data-muted])[data-volume-level=\"low\"] .media-icon--volume-low,\n/* Mute: volume high (not muted, not low) → volume high */\n.media-button--mute:not([data-muted]):not([data-volume-level=\"low\"]) .media-icon--volume-high,\n/* Fullscreen: not fullscreen → enter */\n.media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,\n/* Fullscreen: fullscreen → exit */\n.media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,\n/* Picture-in-Picture: not active → enter */\n.media-button--pip:not([data-pip]) .media-icon--pip-enter,\n/* Picture-in-Picture: active → exit */\n.media-button--pip[data-pip] .media-icon--pip-exit,\n/* Cast: not connected → enter */\n.media-button--cast:not([data-cast-state=\"connected\"]) .media-icon--cast-enter,\n/* Cast: connected → exit */\n.media-button--cast[data-cast-state=\"connected\"] .media-icon--cast-exit,\n/* AirPlay: not connected → enter */\n.media-button--airplay:not([data-airplay-state=\"connected\"]) .media-icon--airplay-enter,\n/* AirPlay: connected → exit */\n.media-button--airplay[data-airplay-state=\"connected\"] .media-icon--airplay-exit,\n/* Captions: not active → captions off */\n.media-button--captions:not([data-active]) .media-icon--captions-off,\n/* Captions: active → captions on */\n.media-button--captions[data-active] .media-icon--captions-on {\n opacity: 1;\n scale: 1;\n}\n\n/* --- Pause keyframe animations on inactive icons --- */\n\n/* The airplay-exit SVG defines its keyframes against CSS variables (mirroring\n the spinner pattern). When the AirPlay session isn't active the SVG is\n still in the DOM — just `display: none` — so its animations would keep\n running. Set the variables to `none` to short-circuit the keyframes. */\n.media-button--airplay:not([data-airplay-state=\"connected\"]) {\n --media-icon--airplay__fill-animation: none;\n --media-icon--airplay__triangle-animation: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .media-button--airplay {\n --media-icon--airplay__fill-animation: none;\n --media-icon--airplay__triangle-animation: none;\n }\n}\n\n\n/* Container */\n\n.media-minimal-skin--video {\n --default-accent-color: oklch(1 0 0);\n --border-color: light-dark(oklch(0 0 0 / 0.15), oklch(1 0 0 / 0.15));\n --focus-ring-color: light-dark(oklch(0 0 0), oklch(1 0 0));\n --media-video-border-radius: var(--container-border-radius);\n\n --controls-background-color: transparent;\n --controls-transition-duration: 100ms;\n --controls-transition-timing-function: ease-out;\n\n --error-dialog-transition-duration: 150ms;\n --error-dialog-transition-delay: 100ms;\n --error-dialog-transition-timing-function: ease-out;\n\n --popup-transition-duration: 100ms;\n --popup-transition-timing-function: ease-out;\n\n --popover-backdrop-filter: blur(16px) saturate(1.5);\n --popover-background-color: oklch(0 0 0 / 0.5);\n --popover-border-color: oklch(1 0 0 / 0.1);\n\n --tooltip-backdrop-filter: var(--popover-backdrop-filter);\n --tooltip-background-color: var(--popover-background-color);\n --tooltip-border-color: var(--popover-border-color);\n\n --tooltip-text-color: currentColor;\n\n overflow: clip;\n background: oklch(0 0 0);\n\n @media (prefers-reduced-motion: reduce) {\n --error-dialog-transition-duration: 50ms;\n --error-dialog-transition-delay: 0ms;\n --popup-transition-duration: 0ms;\n\n .media-error__dialog {\n scale: 1;\n transition-property: opacity;\n }\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n --controls-background-color: oklch(0 0 0);\n --tooltip-background-color: oklch(0 0 0);\n }\n\n &:has(.media-controls:not([data-visible])) {\n /* Slight delay to hide controls on non-touch devices after interaction */\n @media (pointer: fine) {\n --controls-transition-duration: 300ms;\n }\n @media (pointer: coarse) {\n --controls-transition-duration: 150ms;\n }\n @media (prefers-reduced-motion: reduce) {\n --controls-transition-duration: 50ms;\n }\n }\n\n /* Inner border ring */\n &::after {\n position: absolute;\n inset: 0;\n z-index: 10;\n pointer-events: none;\n content: \"\";\n border-radius: inherit;\n box-shadow: inset 0 0 0 1px var(--border-color);\n }\n\n &:fullscreen {\n --container-border-radius: 0;\n\n &::after {\n display: none;\n }\n\n @media (width >= 1280px) {\n --scale: 1.25;\n }\n @media (width >= 1536px) {\n --scale: 1.5;\n }\n @media (width >= 1920px) {\n --scale: 1.75;\n }\n }\n}\n\n/* Error Dialog */\n\n.media-minimal-skin--video .media-error {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n outline: none;\n}\n\n.media-minimal-skin--video .media-error__dialog {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 3);\n width: 100%;\n max-width: calc(var(--spacing) * 64);\n padding: calc(var(--spacing) * 4);\n color: oklch(1 0 0);\n text-shadow: 0 1px 0 oklch(0 0 0 / 0.5);\n pointer-events: auto;\n transition-delay: var(--error-dialog-transition-delay);\n transition-timing-function: var(--error-dialog-transition-timing-function);\n transition-duration: var(--error-dialog-transition-duration);\n transition-property: opacity, scale;\n}\n\n.media-minimal-skin--video .media-error__content {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n padding: calc(var(--spacing) * 1.5) 0;\n}\n\n.media-minimal-skin--video .media-error__title {\n font-size: var(--font-size-medium);\n}\n\n.media-minimal-skin--video .media-error[data-starting-style] .media-error__dialog,\n.media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {\n opacity: 0;\n scale: 0.95;\n}\n.media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {\n transition-delay: 0ms;\n}\n\n/* Controls (hide/show behavior) */\n\n.media-minimal-skin--video .media-controls {\n --base-side-offset: 5;\n --base-boundary-offset: 1;\n --inset-factor: 1;\n --inset: calc(var(--spacing) * var(--inset-factor));\n\n position: absolute;\n inset-inline: var(--inset);\n bottom: var(--inset);\n z-index: 10;\n flex-wrap: wrap;\n column-gap: calc(var(--spacing) * 2);\n color: oklch(1 0 0);\n border-radius: calc(var(--spacing) * 3);\n transition-timing-function: var(--controls-transition-timing-function);\n /* Speed up the entry transition */\n transition-duration: calc(var(--controls-transition-duration) / 2);\n\n @media (pointer: fine) {\n transition-property: translate, filter, opacity;\n will-change: translate, filter, opacity;\n }\n\n @media (pointer: coarse) {\n transition-property: translate, opacity;\n will-change: translate, opacity;\n }\n\n &:not([data-visible]) {\n pointer-events: none;\n opacity: 0;\n transition-duration: var(--controls-transition-duration);\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n filter: blur(8px);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n translate: 0 100%;\n }\n }\n\n .media-time-controls {\n --slider-height: calc(var(--spacing) * 5);\n\n flex: 0 0 100%;\n order: -1;\n padding-inline: calc(var(--spacing) * 1.5);\n }\n\n .media-button-group:first-child {\n flex: 1;\n text-align: left;\n }\n\n .media-button-group:last-child {\n flex: 1;\n justify-content: end;\n }\n\n @container media-root (width > 42rem) {\n --inset-factor: 2;\n --base-side-offset: 2;\n\n flex-wrap: nowrap;\n\n .media-time-controls {\n --slider-height: calc(var(--spacing) * 8);\n\n flex: 1;\n order: unset;\n }\n\n .media-button-group:first-child,\n .media-button-group:last-child {\n flex: 0 0 auto;\n }\n\n .media-time-controls {\n mask-position: 100% 0;\n mask-size: 200% 100%;\n transition: mask-position 50ms ease-out;\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) .media-time-controls {\n mask-image: linear-gradient(to right, transparent 10%, #000 25%, #000 100%);\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) .media-time-controls {\n mask-position: 0 0;\n }\n }\n}\n\n.media-minimal-skin--video .media-error[data-open] ~ .media-controls {\n display: none;\n}\n\n/* Hide cursor when controls are hidden */\n.media-minimal-skin--video:has(.media-controls:not([data-visible])) {\n cursor: none;\n}\n\n/* Popups & Animations */\n\n.media-minimal-skin--video .media-popover--volume {\n padding: 0;\n background: transparent;\n}\n\n/* Slider preview */\n\n.media-minimal-skin--video .media-slider .media-slider__preview {\n --preview-end-inset: calc(100cqi - 100%);\n --preview-left: clamp(\n calc(var(--max-width) / 2),\n var(--media-slider-pointer),\n calc(100% - var(--max-width) / 2 + var(--preview-end-inset))\n );\n\n @container media-root (width > 42rem) {\n --preview-left: var(--media-slider-pointer);\n }\n}\n\n";
|
|
13
|
+
var minimal_skin_default = "/* -------------------------------------------------------------------------- */\n/* Global styles for the host document, outside of the Shadow DOM */\n/* -------------------------------------------------------------------------- */\n\nvideo-player,\nlive-video-player,\nmedia-i18n {\n display: contents;\n}\n\n/*\nRequired to override any default video and image styles (such as\nTailwind's CSS reset) and ensure they fill the container as expected.\n*/\nvideo-player video,\nvideo-player [slot=\"poster\"],\nlive-video-player video,\nlive-video-player [slot=\"poster\"] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\nvideo-player video::-webkit-media-text-track-container,\nlive-video-player video::-webkit-media-text-track-container {\n z-index: 1;\n font-family: inherit;\n scale: 0.98;\n translate: 0 var(--media-caption-track-y, 0);\n transition: translate var(--media-caption-track-duration, 0) ease-out;\n transition-delay: var(--media-caption-track-delay, 0);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Shared styles for all HTML skins */\n/* -------------------------------------------------------------------------- */\n\nmedia-tooltip-group {\n display: contents;\n}\n\n:host {\n /* `display:grid` fixes a weird issue with Safari when setting aspect-ratio */\n display: grid;\n width: 100%;\n}\n\nmedia-container {\n min-width: 0;\n min-height: 0;\n}\n\n/* Hide the volume popover when its slider is unavailable. */\n.media-popover--volume:has(media-volume-slider[data-hidden]) {\n display: none;\n}\n\n.media-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n white-space: nowrap;\n border: 0;\n clip: rect(0, 0, 0, 0);\n}\n\n\n.media-minimal-skin *,\n.media-minimal-skin *::before,\n.media-minimal-skin *::after {\n box-sizing: border-box;\n}\n.media-minimal-skin img,\n.media-minimal-skin video,\n.media-minimal-skin svg {\n display: block;\n max-width: 100%;\n}\n.media-minimal-skin button {\n font: inherit;\n}\n.media-minimal-skin [hidden][hidden] {\n /* Keep authored templates hidden even when component classes set display. */\n display: none;\n}\n@media (prefers-reduced-motion: no-preference) {\n .media-minimal-skin {\n interpolate-size: allow-keywords;\n }\n}\n\n.media-minimal-skin {\n /* Colors */\n --accent-color: var(--media-accent-color, var(--default-accent-color));\n --accent-contrast-color: contrast-color(var(--accent-color));\n --accent-background-color: var(\n --media-accent-color,\n oklch(from var(--default-accent-color) l c h / calc(alpha * 0.1))\n );\n --accent-text-color: var(--media-accent-text-color, contrast-color(var(--media-accent-color, oklch(0 0 0))));\n --shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));\n --shadow-subtle-current-color: oklch(from var(--shadow-current-color) l c h / calc(alpha * 0.4));\n --scrollbar-thumb-color: oklch(from currentColor l c h / 0.3);\n\n /* Scaling - used in video fullscreen to scale the UI. */\n --scale: 1;\n /* Fixed scaling unit to avoid inheriting the document's root font size. This must be a CSS <length>. */\n --scale-unit: var(--media-scale-unit, 16px);\n --size: calc(var(--scale-unit) * var(--scale));\n /* Create a Tailwind-like spacing unit where 1 equals 4px with default scaling. */\n --spacing: calc(var(--size) / 4);\n\n /* Font sizes */\n --font-size-medium: calc(0.9375 * var(--size)); /* 15px */\n --font-size-base: calc(0.8125 * var(--size)); /* 13px */\n --font-size-small: calc(0.6875 * var(--size)); /* 11px */\n --font-size-tiny: calc(0.5625 * var(--size)); /* 9px */\n --media-icon-size: calc(1.125 * var(--size)); /* 18px */\n\n /* Radii */\n --container-border-radius: var(--media-border-radius, 0.75rem);\n\n position: relative;\n display: block;\n width: 100%;\n height: 100%;\n container: media-root / inline-size;\n font-family:\n Inter Variable,\n Inter,\n ui-sans-serif,\n system-ui,\n sans-serif;\n font-size: var(--font-size-base);\n -webkit-font-smoothing: auto;\n -moz-osx-font-smoothing: auto;\n line-height: 1.5;\n letter-spacing: normal;\n outline: 2px solid transparent;\n outline-offset: -4px;\n scrollbar-color: var(--scrollbar-thumb-color) transparent;\n scrollbar-width: thin;\n border-radius: var(--container-border-radius);\n isolation: isolate;\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n transition-property: outline-offset, outline-color;\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: var(--scrollbar-thumb-color);\n border-radius: 9999px;\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n --scrollbar-thumb-color: oklch(from currentColor l c h / 0.8);\n scrollbar-width: auto;\n }\n}\n\n.media-minimal-skin ::slotted(video),\n.media-minimal-skin video {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n}\n.media-minimal-skin ::slotted(video) {\n border-radius: var(--container-border-radius);\n}\n.media-minimal-skin video {\n border-radius: inherit;\n}\n\n.media-minimal-skin:fullscreen ::slotted(video),\n.media-minimal-skin:fullscreen video {\n object-fit: contain;\n}\n\n.media-minimal-skin .media-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-image: linear-gradient(\n to top,\n oklch(0 0 0 / 0.7),\n oklch(0 0 0 / 0.5) calc(var(--spacing) * 30),\n oklch(0 0 0 / 0)\n );\n border-radius: inherit;\n opacity: 0;\n backdrop-filter: blur(0) saturate(1);\n transition-timing-function: ease-out;\n transition-duration: var(--controls-transition-duration);\n transition-property: opacity, backdrop-filter;\n}\n\n.media-minimal-skin .media-error ~ .media-overlay {\n transition-delay: var(--error-dialog-transition-delay);\n transition-duration: var(--error-dialog-transition-duration);\n}\n\n.media-minimal-skin .media-controls[data-visible] ~ .media-overlay,\n.media-minimal-skin .media-error[data-open] ~ .media-overlay {\n opacity: 1;\n}\n\n.media-minimal-skin .media-buffering-indicator[data-visible] ~ .media-overlay {\n background: oklch(0 0 0 / 0.35);\n opacity: 1;\n backdrop-filter: blur(8px);\n}\n\n.media-minimal-skin .media-error[data-open] ~ .media-overlay {\n backdrop-filter: blur(16px) saturate(1.2);\n}\n\n.media-minimal-skin .media-buffering-indicator {\n position: absolute;\n inset: 0;\n z-index: 10;\n display: none;\n place-content: center;\n color: oklch(1 0 0);\n pointer-events: none;\n\n &:not([data-visible]) {\n --media-spinner-animation: none;\n }\n\n &[data-visible] {\n display: grid;\n }\n\n @media (prefers-reduced-motion: reduce) {\n --media-spinner-animation: none;\n }\n}\n\n.media-minimal-skin .media-error:not([data-open]) {\n display: none;\n}\n\n.media-minimal-skin .media-error__title {\n font-weight: 600;\n line-height: 1.25;\n}\n\n.media-minimal-skin .media-error__description {\n overflow-wrap: anywhere;\n opacity: 0.7;\n}\n\n.media-minimal-skin .media-error__actions {\n display: flex;\n gap: calc(var(--spacing) * 2);\n\n > * {\n flex: 1;\n }\n}\n\n.media-minimal-skin .media-error[data-open] ~ .media-controls * {\n visibility: hidden;\n}\n\n.media-minimal-skin .media-controls {\n --media-popover-side-offset: calc(var(--spacing) * (var(--base-side-offset, 2) + 1));\n --media-tooltip-side-offset: var(--media-popover-side-offset);\n --media-popover-boundary-offset: calc(var(--spacing) * (var(--base-boundary-offset, 0) + 1));\n --media-tooltip-boundary-offset: var(--media-popover-boundary-offset);\n\n display: flex;\n align-items: center;\n padding: calc(var(--spacing) * 1);\n container: media-controls / inline-size;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n background-color: var(--controls-background-color);\n backdrop-filter: var(--controls-backdrop-filter);\n}\n\n.media-minimal-skin .media-time-controls {\n display: flex;\n flex: 1;\n flex-direction: row-reverse;\n gap: calc(var(--spacing) * 3);\n align-items: center;\n container: media-time-controls / inline-size;\n}\n\n.media-minimal-skin .media-time-group {\n display: flex;\n gap: calc(var(--spacing) * 1);\n align-items: center;\n}\n\n.media-minimal-skin .media-time {\n font-variant-numeric: tabular-nums;\n}\n\n.media-minimal-skin .media-time[role=\"button\"] {\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border-radius: calc(var(--spacing) * 1);\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n transition-property: outline-color, outline-offset;\n\n @supports (corner-shape: squircle) {\n border-radius: calc(var(--spacing) * 4);\n corner-shape: squircle;\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n}\n\n.media-minimal-skin .media-time--current,\n.media-minimal-skin .media-time-separator {\n display: none;\n}\n\n@container media-root (width > 42rem) {\n .media-minimal-skin .media-time-controls {\n flex-direction: row;\n }\n\n .media-minimal-skin .media-time--duration,\n .media-minimal-skin .media-time-separator {\n color: oklch(from currentColor l c h / 0.6);\n }\n\n .media-minimal-skin .media-time--current,\n .media-minimal-skin .media-time-separator {\n display: inline;\n }\n}\n\n/* Base button */\n.media-minimal-skin .media-button {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n height: calc(var(--spacing) * 9.5);\n min-height: 0;\n padding: calc(var(--spacing) * 2) calc(var(--spacing) * 4);\n text-align: center;\n touch-action: manipulation;\n cursor: pointer;\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border: none;\n border-radius: calc(var(--spacing) * 2);\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: background-color, outline-offset, scale;\n /* Fix weird jumping when clicking on the buttons in Safari. */\n will-change: scale;\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &:active:not([aria-disabled=\"true\"]) {\n scale: 0.97;\n }\n\n &[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n\n@supports (corner-shape: squircle) {\n .media-minimal-skin .media-button {\n border-radius: calc(var(--spacing) * 4);\n corner-shape: squircle;\n }\n}\n\n/* Primary button variant */\n.media-minimal-skin .media-button--primary {\n font-weight: 500;\n color: var(--accent-contrast-color);\n text-shadow: none;\n background: var(--accent-color);\n}\n\n/* Subtle button variant */\n.media-minimal-skin .media-button--subtle {\n color: inherit;\n text-shadow: inherit;\n background: transparent;\n\n &:not([aria-disabled=\"true\"]) {\n &:hover,\n &:focus-visible,\n &[aria-expanded=\"true\"] {\n color: var(--accent-text-color);\n text-decoration: none;\n background-color: var(--accent-background-color);\n }\n }\n}\n\n/* Icon button variant */\n.media-minimal-skin .media-button--icon {\n display: grid;\n aspect-ratio: 1;\n padding: 0;\n\n &:active:not([aria-disabled=\"true\"]) {\n scale: 0.97;\n }\n\n .media-icon__container {\n display: grid;\n }\n\n .media-icon {\n grid-area: 1 / 1;\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, scale;\n }\n}\n\n/* Seek button */\n.media-minimal-skin .media-button--seek {\n .media-icon__label {\n position: absolute;\n right: -1px;\n bottom: -3px;\n font-size: 0.715em; /* 10px */\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n letter-spacing: -0.05em;\n }\n\n &:has(.media-icon--flipped) .media-icon__label {\n right: unset;\n left: -1px;\n }\n}\n\n/* Playback rate button */\n.media-minimal-skin .media-button--playback-rate {\n padding: 0;\n font-variant-numeric: tabular-nums;\n\n &::after {\n width: 4ch;\n content: attr(data-rate) \"\\00D7\";\n }\n\n &[data-inline-rate-label]::after {\n content: none;\n }\n}\n\n/* Settings button */\n.media-minimal-skin .media-button--settings {\n .media-icon--settings {\n transition: transform 150ms ease-in-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition-duration: 0ms;\n }\n }\n\n &[aria-expanded=\"true\"] .media-icon--settings {\n transform: rotate(90deg);\n }\n}\n\n/* Live button — wide pill button with a status dot (gray → red at the live\n edge) rendered via ::before, and \"LIVE\" text rendered as the button's own\n text content. */\n.media-minimal-skin .media-button--live {\n display: inline-flex;\n gap: calc(var(--spacing) * 1.5);\n align-items: center;\n width: auto;\n aspect-ratio: auto;\n padding: calc(var(--spacing) * 2) calc(var(--spacing) * 3);\n font-size: var(--font-size-small);\n font-weight: 600;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n\n &::before {\n display: inline-block;\n flex-shrink: 0;\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n content: \"\";\n background-color: oklch(from currentColor l c h / 0.4);\n border-radius: 50%;\n transition: background-color 150ms ease-out;\n }\n\n &[data-live-edge]::before {\n background-color: oklch(0.65 0.22 27);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .media-minimal-skin .media-button {\n scale: 1;\n transition-property: background-color, outline-offset;\n will-change: auto;\n }\n}\n\n.media-minimal-skin .media-button-group {\n display: flex;\n gap: 1px;\n align-items: center;\n}\n\n.media-minimal-skin .media-badge {\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 1.5);\n font-size: var(--font-size-small);\n font-weight: 500;\n line-height: 1;\n color: oklch(from currentColor l c h / 0.85);\n white-space: nowrap;\n background-color: oklch(from currentColor l c h / 0.1);\n border-radius: calc(var(--spacing) * 1);\n}\n\n.media-minimal-skin .media-icon__container {\n position: relative;\n}\n\n.media-minimal-skin .media-icon {\n flex-shrink: 0;\n width: var(--media-icon-size);\n height: var(--media-icon-size);\n}\n.media-minimal-skin .media-icon--flipped {\n scale: -1 1;\n}\n\n.media-minimal-skin media-poster,\n.media-minimal-skin > img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n transition: opacity 0.25s;\n}\n.media-minimal-skin media-poster:not([data-visible]),\n.media-minimal-skin > img:not([data-visible]),\n.media-minimal-skin > img[data-visible]:not([data-loaded]) {\n opacity: 0;\n}\n.media-minimal-skin media-poster ::slotted(img),\n.media-minimal-skin media-poster img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n border-radius: var(--container-border-radius);\n}\n.media-minimal-skin > img {\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, center);\n border-radius: inherit;\n}\n\n/* Blurred placeholder: HTML path targets media-poster::before, React path targets the skin container::before */\n.media-minimal-skin media-poster::before,\n.media-minimal-skin::before {\n position: absolute;\n inset: 0;\n pointer-events: none;\n content: \"\";\n background-image: var(--media-poster-placeholder, none);\n background-repeat: no-repeat;\n background-position: var(--media-object-position, center);\n background-size: var(--media-object-fit, contain);\n filter: blur(var(--media-poster-placeholder-blur, 20px));\n}\n\n/* React path: hidden by default, transitions in while poster loads */\n.media-minimal-skin::before {\n opacity: 0;\n transition: opacity 0.25s;\n}\n/* Show placeholder while the poster is visible but not yet loaded */\n.media-minimal-skin:has(img[data-visible]:not([data-loaded]))::before {\n opacity: 1;\n}\n\n.media-minimal-skin:fullscreen media-poster ::slotted(img),\n.media-minimal-skin:fullscreen media-poster img,\n.media-minimal-skin:fullscreen > img {\n object-fit: contain;\n}\n\n.media-minimal-skin .media-thumbnail {\n position: relative;\n pointer-events: none;\n background-color: oklch(0 0 0 / 0.9);\n border-radius: calc(var(--spacing) * 2);\n\n &::after {\n position: absolute;\n inset: 0;\n content: \"\";\n border-radius: inherit;\n box-shadow:\n 0 0 0 1px oklch(0 0 0 / 0.05),\n 0 1px 3px 0 oklch(0 0 0 / 0.2),\n 0 1px 2px -1px oklch(0 0 0 / 0.2);\n }\n\n .media-thumbnail__image {\n position: relative;\n display: block;\n max-width: var(--thumbnail-max-width);\n max-height: var(--max-height);\n overflow: clip;\n border-radius: inherit;\n }\n\n .media-thumbnail__spinner {\n position: absolute;\n top: 50%;\n left: 50%;\n opacity: 0;\n translate: -50% -50%;\n }\n\n .media-thumbnail__image,\n .media-thumbnail__spinner {\n transition: opacity 150ms ease-out;\n }\n\n &:not(:has(.media-thumbnail__image[data-loading])) {\n .media-thumbnail__spinner {\n --media-spinner-animation: none;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n --media-spinner-animation: none;\n }\n\n &:has(.media-thumbnail__image[data-loading]) {\n width: var(--thumbnail-max-width);\n max-width: 100%;\n aspect-ratio: 16 / 9;\n overflow: hidden;\n\n .media-thumbnail__image {\n opacity: 0;\n }\n .media-thumbnail__spinner {\n opacity: 1;\n }\n }\n}\n\n.media-minimal-skin .media-slider {\n --thumb-size: calc(var(--spacing) * 3);\n --thumb-active-size: calc(var(--spacing) * 3);\n --track-border-radius: calc(Infinity * 1px);\n\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n outline: none;\n border-radius: var(--track-border-radius);\n\n &[data-orientation=\"horizontal\"] {\n width: var(--slider-width, 100%);\n min-width: calc(var(--spacing) * 20);\n height: var(--slider-height, calc(var(--spacing) * 8));\n }\n &[data-orientation=\"vertical\"] {\n width: var(--slider-width, calc(var(--spacing) * 8));\n height: var(--slider-height, calc(var(--spacing) * 20));\n }\n\n /* Track */\n .media-slider__track {\n position: relative;\n overflow: hidden;\n user-select: none;\n background-color: oklch(from currentColor l c h / 0.2);\n border-radius: inherit;\n isolation: isolate;\n\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n height: calc(var(--spacing) * 0.75);\n }\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 0.75);\n height: 100%;\n }\n }\n\n /* Thumb */\n .media-slider__thumb {\n position: absolute;\n z-index: 10;\n width: var(--thumb-size);\n height: var(--thumb-size);\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n background-color: currentColor;\n border-radius: calc(Infinity * 1px);\n box-shadow:\n 0 0 0 1px var(--shadow-current-color, oklch(0 0 0 / 0.15)),\n 0 1px 3px 0 oklch(0 0 0 / 0.15),\n 0 1px 2px -1px oklch(0 0 0 / 0.15);\n opacity: 0;\n transform-origin: center;\n scale: 0.7;\n translate: -50% -50%;\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n\n &[data-orientation=\"horizontal\"] {\n top: 50%;\n left: var(--media-slider-fill);\n }\n &[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-fill));\n left: 50%;\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n }\n\n &:focus-within .media-slider__thumb,\n .media-slider__thumb--persistent {\n width: var(--thumb-active-size);\n height: var(--thumb-active-size);\n opacity: 1;\n scale: 1;\n }\n\n @media (hover: hover) and (pointer: fine) {\n &:hover .media-slider__thumb {\n width: var(--thumb-active-size);\n height: var(--thumb-active-size);\n opacity: 1;\n scale: 1;\n }\n }\n\n /* Shared track fills */\n .media-slider__buffer,\n .media-slider__fill {\n position: absolute;\n pointer-events: none;\n border-radius: inherit;\n\n &[data-orientation=\"horizontal\"] {\n inset-block: 0;\n left: 0;\n width: 100%;\n transition-property: clip-path;\n }\n &[data-orientation=\"vertical\"] {\n inset-inline: 0;\n bottom: 0;\n height: 100%;\n transition-property: clip-path;\n }\n }\n\n /* Buffer */\n .media-slider__buffer {\n background-color: oklch(from currentColor l c h / 0.2);\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-buffer)) 0 0 round var(--track-border-radius));\n }\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-buffer)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n /* Fill */\n .media-slider__fill {\n background-color: var(--accent-color);\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-fill)) 0 0 round var(--track-border-radius));\n }\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-fill)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n /* Chapters */\n .media-slider__chapters {\n position: relative;\n display: flex;\n flex: 1;\n align-items: center;\n min-width: 0;\n min-height: 0;\n border-radius: inherit;\n\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n height: 100%;\n }\n &[data-orientation=\"vertical\"] {\n flex-direction: column-reverse;\n width: 100%;\n height: 100%;\n }\n }\n\n .media-slider__chapter {\n --chapter-gap: calc(var(--spacing) * 1);\n --chapter-inset-start: calc(var(--chapter-gap) / 2);\n --chapter-inset-end: calc(var(--chapter-gap) / 2);\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n min-height: 0;\n\n &:first-child {\n --chapter-inset-start: 0px;\n }\n &:last-child {\n --chapter-inset-end: 0px;\n }\n\n .media-slider__chapter-track {\n --chapter-track-size: calc(var(--spacing) * 0.75);\n --chapter-track-highlighted-size: calc(var(--spacing) * 1.25);\n border-radius: var(--track-border-radius);\n\n @media (prefers-reduced-motion: no-preference) {\n transition: 200ms ease-out;\n transition-property: height, width;\n }\n }\n\n &[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start));\n\n .media-slider__chapter-track {\n height: var(--chapter-track-size);\n clip-path: inset(\n 0 calc(100% - var(--media-slider-chapter-end) + var(--chapter-inset-end)) 0\n calc(var(--media-slider-chapter-start) + var(--chapter-inset-start)) round var(--track-border-radius)\n );\n }\n\n &[data-highlighted] .media-slider__chapter-track {\n height: var(--chapter-track-highlighted-size);\n }\n }\n\n &[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-chapter-end)) 0 var(--media-slider-chapter-start) 0);\n\n .media-slider__chapter-track {\n width: var(--chapter-track-size);\n clip-path: inset(\n calc(100% - var(--media-slider-chapter-end) + var(--chapter-inset-end)) 0\n calc(var(--media-slider-chapter-start) + var(--chapter-inset-start)) 0 round var(--track-border-radius)\n );\n }\n\n &[data-highlighted] .media-slider__chapter-track {\n width: var(--chapter-track-highlighted-size);\n }\n }\n }\n\n /* Dragging — thumb and fill follow the pointer position */\n &[data-dragging] {\n .media-slider__thumb[data-orientation=\"horizontal\"] {\n left: var(--media-slider-pointer);\n }\n .media-slider__thumb[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-pointer));\n }\n .media-slider__fill[data-orientation=\"horizontal\"] {\n clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--track-border-radius));\n }\n .media-slider__fill[data-orientation=\"vertical\"] {\n clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--track-border-radius));\n }\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .media-slider__thumb {\n transition-property: opacity, scale, height, width, outline-offset, left, top;\n }\n .media-slider__fill {\n transition-timing-function: linear;\n transition-duration: 200ms;\n }\n .media-slider__buffer {\n transition-timing-function: ease-out;\n transition-duration: 250ms;\n }\n }\n\n &[data-dragging],\n &[data-seeking] {\n .media-slider__thumb,\n .media-slider__fill,\n .media-slider__buffer {\n transition-duration: 0ms;\n }\n }\n\n /* Preview */\n .media-slider__preview {\n --max-width: min(calc(var(--spacing) * 48), 100cqi);\n --max-height: calc(var(--spacing) * 32);\n\n min-width: 100%;\n height: calc(var(--spacing) * 1);\n\n .media-slider__thumbnail,\n .media-slider__value {\n position: absolute;\n left: var(--preview-left, var(--media-slider-pointer));\n max-width: var(--max-width);\n opacity: 0;\n filter: blur(8px);\n transform-origin: bottom;\n scale: 0.8;\n translate: -50% calc(var(--spacing) * 2);\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: filter, opacity, scale;\n }\n\n .media-slider__thumbnail {\n --thumbnail-max-width: var(--max-width);\n bottom: calc(100% + (var(--spacing) * 12));\n }\n\n .media-slider__value {\n bottom: calc(100% + (var(--spacing) * 5));\n display: flex;\n flex-direction: row-reverse;\n gap: calc(var(--spacing) * 2);\n justify-content: center;\n padding-inline: calc(var(--spacing) * 3);\n text-shadow: 0 1px 0 var(--shadow-current-color);\n }\n\n .media-slider__chapter-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:empty {\n display: none;\n }\n }\n\n &::before {\n position: absolute;\n z-index: 1;\n pointer-events: none;\n content: \"\";\n background-color: oklch(from currentColor l c h / 0.35);\n opacity: 0;\n scale: 0.5;\n translate: -50% -50%;\n transition-timing-function: ease-out;\n transition-duration: 200ms;\n transition-property: opacity, scale;\n }\n\n &[data-orientation=\"horizontal\"]::before {\n top: 50%;\n left: var(--media-slider-pointer);\n width: 1px;\n height: calc(var(--spacing) * 5);\n }\n &[data-orientation=\"vertical\"]::before {\n top: calc(100% - var(--media-slider-pointer));\n left: 50%;\n width: calc(var(--spacing) * 5);\n height: 1px;\n }\n\n &[data-pointing]:not([data-dragging])::before {\n opacity: 1;\n scale: 1;\n }\n }\n\n &:is([data-pointing], :has(:focus-visible))\n .media-slider__preview\n :is(.media-slider__value, .media-slider__thumbnail) {\n opacity: 1;\n filter: blur(0);\n scale: 1;\n }\n}\n\n.media-minimal-skin {\n --popup-transition:\n opacity var(--popup-transition-timing-function) var(--popup-transition-duration),\n filter var(--popup-transition-timing-function) var(--popup-transition-duration),\n transform var(--popup-transition-timing-function) var(--popup-transition-duration),\n scale var(--popup-transition-timing-function) var(--popup-transition-duration);\n}\n\n.media-minimal-skin .media-popover,\n.media-minimal-skin .media-tooltip {\n --popup-translate-distance: calc(var(--spacing) * 2);\n margin: 0;\n overflow: visible;\n color: inherit;\n border: 0;\n transition: var(--popup-transition);\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n /* We have to use transform here for translate as the translate property is used for positioning by core. */\n transform: translate(var(--popup-translate-x-distance, 0), var(--popup-translate-y-distance, 0));\n scale: 0.95;\n }\n\n &[data-ending-style] {\n filter: blur(4px);\n transform: none;\n /* Speed up the exit transition. */\n transition-duration: max(0ms, calc(var(--popup-transition-duration) - 50ms));\n }\n\n &[data-side=\"top\"] {\n --popup-translate-y-distance: var(--popup-translate-distance);\n transform-origin: bottom;\n }\n &[data-side=\"bottom\"] {\n --popup-translate-y-distance: calc(var(--popup-translate-distance) * -1);\n transform-origin: top;\n }\n &[data-side=\"left\"] {\n --popup-translate-x-distance: var(--popup-translate-distance);\n transform-origin: right;\n }\n &[data-side=\"right\"] {\n --popup-translate-x-distance: calc(var(--popup-translate-distance) * -1);\n transform-origin: left;\n }\n\n /* Safe area between trigger and popup */\n &::before {\n position: absolute;\n pointer-events: inherit;\n content: \"\";\n }\n\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n inset-inline: 0;\n width: 100%;\n }\n &[data-side=\"top\"]::before {\n top: 100%;\n }\n &[data-side=\"bottom\"]::before {\n bottom: 100%;\n }\n\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n inset-block: 0;\n height: 100%;\n }\n &[data-side=\"left\"]::before {\n left: 100%;\n }\n &[data-side=\"right\"]::before {\n right: 100%;\n }\n}\n\n.media-minimal-skin .media-popover {\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n height: var(--media-popover-side-offset);\n }\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n width: var(--media-popover-side-offset);\n }\n}\n\n.media-minimal-skin .media-tooltip {\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2);\n font-size: var(--font-size-base);\n color: var(--tooltip-text-color);\n white-space: nowrap;\n background-color: var(--tooltip-background-color);\n border-radius: calc(var(--spacing) * 2);\n box-shadow:\n 0 0 0 1px var(--tooltip-border-color),\n 0 4px 6px -1px oklch(0 0 0 / 0.2),\n 0 2px 4px -2px oklch(0 0 0 / 0.2);\n backdrop-filter: var(--tooltip-backdrop-filter);\n\n /* `display: flex` must not apply while closed — it overrides UA `[popover]` hiding. */\n &[data-open] {\n display: flex;\n column-gap: calc(var(--spacing) * 1);\n align-items: center;\n }\n\n &[data-side=\"top\"]::before,\n &[data-side=\"bottom\"]::before {\n height: var(--media-tooltip-side-offset);\n }\n &[data-side=\"left\"]::before,\n &[data-side=\"right\"]::before {\n width: var(--media-tooltip-side-offset);\n }\n\n .media-tooltip__kbd {\n min-width: 1.5em;\n padding: 0.1em;\n margin-right: calc(var(--spacing) * -1);\n font-family: inherit;\n font-size: var(--font-size-small);\n font-weight: 600;\n line-height: 1.25;\n text-align: center;\n background-color: oklch(from currentColor l c h / 0.15);\n border-radius: calc(var(--spacing) * 1);\n }\n}\n\n.media-minimal-skin .media-popover--volume:has(media-volume-slider[data-hidden]) {\n display: none;\n}\n\n.media-minimal-skin .media-menu {\n --menu-transition-duration: 250ms;\n --menu-max-height: calc(var(--spacing) * 56);\n --menu-padding: calc(var(--spacing) * 1);\n --menu-border-radius: calc(var(--spacing) * 2.5);\n --menu-item-border-radius: calc(var(--menu-border-radius) - var(--menu-padding));\n box-sizing: border-box;\n min-width: max-content;\n max-width: var(--media-popover-available-width, none);\n max-height: min(var(--media-popover-available-height, var(--menu-max-height)), var(--menu-max-height));\n padding: var(--menu-padding);\n overflow: auto;\n overscroll-behavior: none;\n background-color: var(--popover-background-color);\n border-radius: var(--menu-border-radius);\n box-shadow:\n 0 0 0 1px var(--popover-border-color),\n 0 4px 6px -1px oklch(0 0 0 / 0.1),\n 0 2px 4px -2px oklch(0 0 0 / 0.1);\n backdrop-filter: var(--popover-backdrop-filter);\n\n @media (prefers-reduced-motion: reduce) {\n --menu-transition-duration: 0ms;\n }\n\n & > .media-menu__panel {\n position: absolute;\n inset-inline: 0;\n top: 0;\n z-index: 10;\n max-height: inherit;\n padding: var(--menu-padding);\n overflow: auto;\n overscroll-behavior: none;\n outline: none;\n translate: 0 0;\n transition-timing-function: ease-out;\n transition-duration: var(--menu-transition-duration);\n transition-property: translate, filter;\n will-change: translate, filter;\n\n &:where([data-starting-style], [data-ending-style]) {\n overflow: hidden;\n pointer-events: none;\n filter: blur(8px);\n translate: 100% 0;\n }\n }\n\n .media-menu__separator {\n margin: calc(var(--spacing) * 1) 0;\n border-bottom: 1px solid oklch(1 0 0 / 0.1);\n }\n\n .media-menu__group {\n anchor-scope: --menu-item-highlight-anchor;\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 0.5);\n\n @supports (top: anchor(top)) {\n &::before {\n position: absolute;\n position-anchor: --menu-item-highlight-anchor;\n inset: anchor(inside);\n /* Firefox treats the moving highlight as a content shift and re-scrolls\n the menu while hovering. Exclude it from scroll anchoring. */\n overflow-anchor: none;\n pointer-events: none;\n content: \"\";\n background-color: var(--accent-background-color);\n border-radius: var(--menu-item-border-radius);\n transition: inset 100ms ease-in-out;\n }\n\n &:has([data-highlighted=\"\"])::before {\n transition-duration: 0ms;\n }\n }\n }\n\n .media-menu__item,\n .media-menu__back {\n position: relative;\n display: flex;\n gap: calc(var(--spacing) * 1.5);\n align-items: center;\n padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);\n text-align: left;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n cursor: pointer;\n user-select: none;\n outline: 2px solid transparent;\n outline-offset: -2px;\n border-radius: var(--menu-item-border-radius);\n transition: background-color, color;\n transition-timing-function: ease-in-out;\n transition-duration: 100ms;\n\n .media-icon {\n flex-shrink: 0;\n color: oklch(from currentColor l c h / 0.5);\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n }\n\n &:focus-visible {\n outline-color: var(--focus-ring-color);\n outline-offset: 2px;\n }\n\n &:hover,\n &[data-highlighted] {\n color: var(--accent-text-color);\n background-color: var(--accent-background-color);\n\n .media-icon {\n color: inherit;\n }\n }\n\n @supports (top: anchor(top)) {\n transition-duration: 50ms;\n\n &:hover,\n &[data-highlighted] {\n transition-duration: 200ms;\n }\n }\n }\n\n .media-menu__indicator {\n flex-shrink: 0;\n margin-right: calc(var(--spacing) * -1);\n margin-left: auto;\n opacity: 0;\n }\n\n .media-menu__item {\n justify-content: space-between;\n font-variant-numeric: tabular-nums;\n color: inherit;\n\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n &[aria-checked=\"true\"] .media-menu__indicator {\n opacity: 1;\n }\n\n &[data-availability=\"unavailable\"],\n &[data-availability=\"unsupported\"] {\n display: none;\n }\n\n &[data-highlighted] {\n @supports (top: anchor(top)) {\n anchor-name: --menu-item-highlight-anchor;\n background-color: transparent;\n }\n }\n }\n\n .media-menu__tier {\n padding-top: 1px;\n padding-left: calc(var(--spacing) * 0.5);\n font-size: var(--font-size-tiny);\n font-weight: 600;\n line-height: 1;\n color: oklch(from currentColor l c h / 0.7);\n }\n\n .media-menu__back {\n width: 100%;\n margin-bottom: calc(var(--spacing) * 0.5);\n }\n\n .media-menu__hint {\n display: inline-flex;\n gap: calc(var(--spacing) * 1);\n align-items: center;\n min-width: 0;\n padding-left: calc(var(--spacing) * 2);\n margin-left: auto;\n color: oklch(from currentColor l c h / 0.65);\n }\n\n .media-menu__hint-label {\n max-width: calc(var(--spacing) * 24);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .media-menu__chevron {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n\n /* Settings menu */\n &.media-menu--settings {\n width: var(--media-menu-width);\n min-width: calc(var(--spacing) * 48);\n height: var(--media-menu-height);\n overflow: hidden;\n /* Only the menu size changes between panels. */\n transition:\n var(--popup-transition),\n width var(--popup-transition-timing-function) var(--menu-transition-duration),\n height var(--popup-transition-timing-function) var(--menu-transition-duration);\n\n & > :not([data-submenu]) {\n translate: 0 0;\n transition:\n translate var(--menu-transition-duration) ease-out,\n filter var(--menu-transition-duration) ease-out;\n will-change: translate, filter;\n }\n\n &[data-submenu-expanded=\"true\"] > :not([data-submenu]) {\n filter: blur(8px);\n translate: -100% 0;\n }\n\n /* WebKit can restart the covered-content transition while the\n anchor-positioned highlight remains active. */\n &[data-submenu-expanded] > :not([data-submenu])::before {\n display: none;\n }\n\n /* Don't transition size on open/close. */\n &[data-starting-style],\n &[data-ending-style] {\n transition: var(--popup-transition);\n }\n }\n}\n\n.media-minimal-skin {\n --media-caption-track-duration: var(--controls-transition-duration);\n --media-caption-track-delay: 25ms;\n --media-caption-track-y: calc(var(--spacing) * -2);\n\n &:has(.media-controls[data-visible]) {\n --media-caption-track-y: calc(var(--spacing) * -18);\n }\n\n @container media-root (width > 42rem) {\n &:has(.media-controls[data-visible]) > * {\n --media-caption-track-y: calc(var(--spacing) * -12);\n }\n }\n}\n\n.media-minimal-skin video::-webkit-media-text-track-container {\n z-index: 1;\n font-family: inherit;\n scale: 0.98;\n translate: 0 var(--media-caption-track-y);\n transition: translate var(--media-caption-track-duration) ease-out;\n transition-delay: var(--media-caption-track-delay);\n}\n\n.media-minimal-skin .media-input-indicator-overlay {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n align-items: center;\n justify-items: center;\n overflow: hidden;\n color: oklch(1 0 0);\n pointer-events: none;\n border-radius: inherit;\n}\n\n.media-minimal-skin {\n .media-volume-indicator,\n .media-status-indicator--state {\n position: absolute;\n inset-inline: 0;\n top: 0;\n display: flex;\n justify-content: center;\n padding-top: calc(var(--spacing) * 3);\n padding-bottom: calc(var(--spacing) * 32);\n color: inherit;\n text-shadow: 0 1px 0 var(--shadow-current-color);\n pointer-events: none;\n background-image: linear-gradient(\n to bottom,\n oklch(0 0 0 / 0.35),\n oklch(0 0 0 / 0.2) calc(var(--spacing) * 12),\n oklch(0 0 0 / 0)\n );\n transform-origin: top center;\n transition-timing-function: ease-out;\n transition-duration: 100ms;\n\n .media-volume-indicator__content,\n .media-status-indicator__content {\n display: flex;\n gap: calc(var(--spacing) * 2);\n align-items: center;\n justify-content: space-between;\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2.5);\n }\n\n .media-icon {\n display: none;\n flex-shrink: 0;\n filter: drop-shadow(0 1px 0 var(--shadow-current-color));\n }\n\n .media-volume-indicator__value,\n .media-status-indicator__value {\n margin-left: auto;\n }\n\n @media (pointer: fine) {\n transition-property: translate, filter, opacity;\n will-change: translate, filter, opacity;\n }\n\n @media (pointer: coarse) {\n transition-property: translate, opacity;\n will-change: translate, opacity;\n }\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n transition-property: translate, filter, opacity;\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n .media-volume-indicator__content,\n .media-status-indicator__content {\n background: var(--controls-background-color);\n border-radius: calc(var(--spacing) * 2);\n }\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n transition-timing-function: ease-in;\n transition-duration: 400ms;\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n filter: blur(8px);\n }\n }\n\n &[data-ending-style] {\n @media (prefers-reduced-motion: no-preference) {\n translate: 0 -100%;\n }\n }\n }\n\n .media-seek-indicator,\n .media-status-indicator--playback {\n display: grid;\n grid-row: 1;\n grid-column: 2;\n place-content: center;\n padding: calc(var(--spacing) * 4);\n text-align: center;\n }\n}\n\n.media-minimal-skin .media-volume-indicator {\n .media-volume-indicator__content {\n width: min(80%, calc(var(--spacing) * 56));\n transform: translateX(0);\n }\n\n .media-volume-indicator__progress {\n position: relative;\n width: 100%;\n height: calc(var(--spacing) * 0.75);\n background: oklch(from currentColor l c h / 0.2);\n border-radius: calc(Infinity * 1px);\n box-shadow: 0 1px 0 var(--shadow-subtle-current-color);\n\n &::before {\n position: absolute;\n inset-block: 0;\n left: 0;\n width: var(--media-volume-fill, 0%);\n content: \"\";\n background: var(--accent-color);\n border-radius: inherit;\n transition: width 200ms linear;\n }\n }\n\n &[data-level=\"high\"] .media-icon--volume-high,\n &[data-level=\"low\"] .media-icon--volume-low,\n &[data-level=\"off\"] .media-icon--volume-off {\n display: block;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n &[data-min]:not([data-starting-style], [data-ending-style]) .media-volume-indicator__content,\n &[data-max]:not([data-starting-style], [data-ending-style]) .media-volume-indicator__content {\n transform: translateX(0.25px);\n transition: transform 300ms linear(0, -24 20%, 16 40%, -8 60%, 4 80%, 1);\n }\n }\n}\n\n.media-minimal-skin .media-status-indicator--state {\n &[data-status=\"captions-on\"] .media-icon--captions-on,\n &[data-status=\"captions-off\"] .media-icon--captions-off,\n &[data-status=\"fullscreen\"] .media-icon--fullscreen-enter,\n &[data-status=\"exit-fullscreen\"] .media-icon--fullscreen-exit,\n &[data-status=\"pip\"] .media-icon--pip-enter,\n &[data-status=\"exit-pip\"] .media-icon--pip-exit {\n display: block;\n }\n}\n\n.media-minimal-skin .media-status-indicator--playback {\n transition-timing-function: ease-out;\n transition-duration: 200ms;\n transition-property: opacity, scale;\n\n .media-icon {\n grid-area: 1 / 1;\n width: calc(var(--media-icon-size) * 2);\n height: calc(var(--media-icon-size) * 2);\n opacity: 0;\n scale: 0;\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, scale;\n }\n\n &[data-status=\"pause\"] .media-icon--pause,\n &[data-status=\"play\"] .media-icon--play {\n opacity: 1;\n scale: 1;\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n opacity: 0;\n scale: 0.85;\n }\n\n &[data-ending-style] {\n transition-timing-function: ease-in;\n transition-duration: 100ms;\n }\n\n @media (prefers-reduced-motion: reduce) {\n transition-duration: 50ms;\n transition-property: opacity;\n\n &[data-starting-style],\n &[data-ending-style],\n .media-icon {\n scale: 1;\n }\n\n .media-icon {\n transition-duration: 50ms;\n transition-property: opacity;\n }\n }\n}\n\n.media-minimal-skin .media-seek-indicator {\n gap: calc(var(--spacing) * 1);\n\n .media-seek-indicator__value {\n font-variant-numeric: tabular-nums;\n }\n\n @container media-root (width > 24rem) {\n padding: calc(var(--spacing) * 6);\n }\n\n &[data-direction=\"backward\"] {\n grid-column: 1;\n justify-self: left;\n }\n\n &[data-direction=\"forward\"] {\n grid-column: 3;\n justify-self: right;\n }\n\n .media-icon--seek {\n display: block;\n width: calc(var(--media-icon-size) * 1.5);\n height: calc(var(--media-icon-size) * 1.5);\n }\n\n &[data-direction=\"backward\"] .media-icon--seek {\n scale: -1 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .media-icon--seek {\n transition-timing-function: ease-in-out;\n transition-duration: 200ms;\n transition-property: translate, opacity;\n }\n\n &[data-starting-style] .media-icon--seek,\n &[data-ending-style] .media-icon--seek {\n opacity: 0;\n }\n\n &[data-direction=\"forward\"][data-starting-style] .media-icon--seek {\n translate: -60% 0;\n }\n\n &[data-direction=\"backward\"][data-starting-style] .media-icon--seek {\n translate: 60% 0;\n }\n }\n}\n\n/* ==========================================================================\n Icon State Visibility for Video Skins\n\n Data-attribute-driven visibility rules for multi-state icon buttons shared\n by the HTML and React skins.\n ========================================================================== */\n\n/* --- All icons hidden by default --- */\n\n.media-button--play .media-icon,\n.media-button--mute .media-icon,\n.media-button--fullscreen .media-icon,\n.media-button--pip .media-icon,\n.media-button--cast .media-icon,\n.media-button--airplay .media-icon,\n.media-button--captions .media-icon {\n opacity: 0;\n}\n.media-button--play .media-icon {\n scale: 0;\n}\n\n/* --- Active icon per state --- */\n\n/* Play: ended → restart */\n.media-button--play[data-ended] .media-icon--restart,\n/* Play: paused or not yet started (not ended) → play */\n.media-button--play:not([data-ended])[data-paused] .media-icon--play,\n.media-button--play:not([data-ended]):not([data-started]) .media-icon--play,\n/* Play: started and not paused/ended → pause */\n.media-button--play[data-started]:not([data-paused]):not([data-ended]) .media-icon--pause,\n/* Mute: muted → volume off */\n.media-button--mute[data-muted] .media-icon--volume-off,\n/* Mute: volume low (not muted) → volume low */\n.media-button--mute:not([data-muted])[data-volume-level=\"low\"] .media-icon--volume-low,\n/* Mute: volume high (not muted, not low) → volume high */\n.media-button--mute:not([data-muted]):not([data-volume-level=\"low\"]) .media-icon--volume-high,\n/* Fullscreen: not fullscreen → enter */\n.media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,\n/* Fullscreen: fullscreen → exit */\n.media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,\n/* Picture-in-Picture: not active → enter */\n.media-button--pip:not([data-pip]) .media-icon--pip-enter,\n/* Picture-in-Picture: active → exit */\n.media-button--pip[data-pip] .media-icon--pip-exit,\n/* Cast: not connected → enter */\n.media-button--cast:not([data-cast-state=\"connected\"]) .media-icon--cast-enter,\n/* Cast: connected → exit */\n.media-button--cast[data-cast-state=\"connected\"] .media-icon--cast-exit,\n/* AirPlay: not connected → enter */\n.media-button--airplay:not([data-airplay-state=\"connected\"]) .media-icon--airplay-enter,\n/* AirPlay: connected → exit */\n.media-button--airplay[data-airplay-state=\"connected\"] .media-icon--airplay-exit,\n/* Captions: not active → captions off */\n.media-button--captions:not([data-active]) .media-icon--captions-off,\n/* Captions: active → captions on */\n.media-button--captions[data-active] .media-icon--captions-on {\n opacity: 1;\n scale: 1;\n}\n\n/* --- Pause keyframe animations on inactive icons --- */\n\n/* The airplay-exit SVG defines its keyframes against CSS variables (mirroring\n the spinner pattern). When the AirPlay session isn't active the SVG is\n still in the DOM — just `display: none` — so its animations would keep\n running. Set the variables to `none` to short-circuit the keyframes. */\n.media-button--airplay:not([data-airplay-state=\"connected\"]) {\n --media-icon--airplay__fill-animation: none;\n --media-icon--airplay__triangle-animation: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .media-button--airplay {\n --media-icon--airplay__fill-animation: none;\n --media-icon--airplay__triangle-animation: none;\n }\n}\n\n\n/* Container */\n\n.media-minimal-skin--video {\n --default-accent-color: oklch(1 0 0);\n --border-color: light-dark(oklch(0 0 0 / 0.15), oklch(1 0 0 / 0.15));\n --focus-ring-color: light-dark(oklch(0 0 0), oklch(1 0 0));\n --media-video-border-radius: var(--container-border-radius);\n\n --controls-background-color: transparent;\n --controls-transition-duration: 100ms;\n --controls-transition-timing-function: ease-out;\n\n --error-dialog-transition-duration: 150ms;\n --error-dialog-transition-delay: 100ms;\n --error-dialog-transition-timing-function: ease-out;\n\n --popup-transition-duration: 100ms;\n --popup-transition-timing-function: ease-out;\n\n --popover-backdrop-filter: blur(16px) saturate(1.5);\n --popover-background-color: oklch(0 0 0 / 0.5);\n --popover-border-color: oklch(1 0 0 / 0.1);\n\n --tooltip-backdrop-filter: var(--popover-backdrop-filter);\n --tooltip-background-color: var(--popover-background-color);\n --tooltip-border-color: var(--popover-border-color);\n\n --tooltip-text-color: currentColor;\n\n overflow: clip;\n background: oklch(0 0 0);\n\n @media (prefers-reduced-motion: reduce) {\n --error-dialog-transition-duration: 50ms;\n --error-dialog-transition-delay: 0ms;\n --popup-transition-duration: 0ms;\n\n .media-error__dialog {\n scale: 1;\n transition-property: opacity;\n }\n }\n\n @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {\n --controls-background-color: oklch(0 0 0);\n --tooltip-background-color: oklch(0 0 0);\n }\n\n &:has(.media-controls:not([data-visible])) {\n /* Slight delay to hide controls on non-touch devices after interaction */\n @media (pointer: fine) {\n --controls-transition-duration: 300ms;\n }\n @media (pointer: coarse) {\n --controls-transition-duration: 150ms;\n }\n @media (prefers-reduced-motion: reduce) {\n --controls-transition-duration: 50ms;\n }\n }\n\n /* Inner border ring */\n &::after {\n position: absolute;\n inset: 0;\n z-index: 10;\n pointer-events: none;\n content: \"\";\n border-radius: inherit;\n box-shadow: inset 0 0 0 1px var(--border-color);\n }\n\n &:fullscreen {\n --container-border-radius: 0;\n\n &::after {\n display: none;\n }\n\n @media (width >= 1280px) {\n --scale: 1.25;\n }\n @media (width >= 1536px) {\n --scale: 1.5;\n }\n @media (width >= 1920px) {\n --scale: 1.75;\n }\n }\n\n * {\n --focus-ring-color: oklch(1 0 0);\n }\n}\n\n/* Error Dialog */\n\n.media-minimal-skin--video .media-error {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n outline: none;\n}\n\n.media-minimal-skin--video .media-error__dialog {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 3);\n width: 100%;\n max-width: calc(var(--spacing) * 64);\n padding: calc(var(--spacing) * 4);\n color: oklch(1 0 0);\n text-shadow: 0 1px 0 oklch(0 0 0 / 0.5);\n pointer-events: auto;\n transition-delay: var(--error-dialog-transition-delay);\n transition-timing-function: var(--error-dialog-transition-timing-function);\n transition-duration: var(--error-dialog-transition-duration);\n transition-property: opacity, scale;\n}\n\n.media-minimal-skin--video .media-error__content {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n padding: calc(var(--spacing) * 1.5) 0;\n}\n\n.media-minimal-skin--video .media-error__title {\n font-size: var(--font-size-medium);\n}\n\n.media-minimal-skin--video .media-error[data-starting-style] .media-error__dialog,\n.media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {\n opacity: 0;\n scale: 0.95;\n}\n.media-minimal-skin--video .media-error[data-ending-style] .media-error__dialog {\n transition-delay: 0ms;\n}\n\n/* Controls (hide/show behavior) */\n\n.media-minimal-skin--video .media-controls {\n --base-side-offset: 5;\n --base-boundary-offset: 1;\n --inset-factor: 1;\n --inset: calc(var(--spacing) * var(--inset-factor));\n\n position: absolute;\n inset-inline: var(--inset);\n bottom: var(--inset);\n z-index: 10;\n flex-wrap: wrap;\n column-gap: calc(var(--spacing) * 2);\n color: oklch(1 0 0);\n border-radius: calc(var(--spacing) * 3);\n transition-timing-function: var(--controls-transition-timing-function);\n /* Speed up the entry transition */\n transition-duration: calc(var(--controls-transition-duration) / 2);\n\n @media (pointer: fine) {\n transition-property: translate, filter, opacity;\n will-change: translate, filter, opacity;\n }\n\n @media (pointer: coarse) {\n transition-property: translate, opacity;\n will-change: translate, opacity;\n }\n\n &:not([data-visible]) {\n pointer-events: none;\n opacity: 0;\n transition-duration: var(--controls-transition-duration);\n\n @media (pointer: fine) and (prefers-reduced-motion: no-preference) {\n filter: blur(8px);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n translate: 0 100%;\n }\n }\n\n .media-time-controls {\n --slider-height: calc(var(--spacing) * 5);\n\n flex: 0 0 100%;\n order: -1;\n padding-inline: calc(var(--spacing) * 1.5);\n }\n\n .media-button-group:first-child {\n flex: 1;\n text-align: left;\n }\n\n .media-button-group:last-child {\n flex: 1;\n justify-content: end;\n }\n\n @container media-root (width > 42rem) {\n --inset-factor: 2;\n --base-side-offset: 2;\n\n flex-wrap: nowrap;\n\n .media-time-controls {\n --slider-height: calc(var(--spacing) * 8);\n\n flex: 1;\n order: unset;\n }\n\n .media-button-group:first-child,\n .media-button-group:last-child {\n flex: 0 0 auto;\n }\n\n .media-time-controls {\n mask-position: 100% 0;\n mask-size: 200% 100%;\n transition: mask-position 50ms ease-out;\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) .media-time-controls {\n mask-image: linear-gradient(to right, transparent 10%, #000 25%, #000 100%);\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) .media-time-controls {\n mask-position: 0 0;\n }\n }\n}\n\n.media-minimal-skin--video .media-error[data-open] ~ .media-controls {\n display: none;\n}\n\n/* Hide cursor when controls are hidden */\n.media-minimal-skin--video:has(.media-controls:not([data-visible])) {\n cursor: none;\n}\n\n/* Popups & Animations */\n\n.media-minimal-skin--video .media-popover--volume {\n padding: 0;\n background: transparent;\n}\n\n/* Slider preview */\n\n.media-minimal-skin--video .media-slider .media-slider__preview {\n --preview-end-inset: calc(100cqi - 100%);\n --preview-left: clamp(\n calc(var(--max-width) / 2),\n var(--media-slider-pointer),\n calc(100% - var(--max-width) / 2 + var(--preview-end-inset))\n );\n\n @container media-root (width > 42rem) {\n --preview-left: var(--media-slider-pointer);\n }\n}\n\n";
|
|
14
14
|
|
|
15
15
|
//#endregion
|
|
16
16
|
//#region src/define/live-video/minimal-ui.ts
|