@videojs/html 10.0.0-beta.29 → 10.0.0-beta.30
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/{ar-BgO-vdw6.js → ar-BbHGxPgW.js} +2 -2
- package/cdn/{ar-BgO-vdw6.js.map → ar-BbHGxPgW.js.map} +1 -1
- package/cdn/{ar-DGKbeOEU.js → ar-DsPINVvV.js} +2 -2
- package/cdn/{ar-DGKbeOEU.js.map → ar-DsPINVvV.js.map} +1 -1
- 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/{az-BXA58gAV.js → az-BNG9I9VB.js} +2 -2
- package/cdn/{az-BXA58gAV.js.map → az-BNG9I9VB.js.map} +1 -1
- package/cdn/{az-BT93Xmvh.js → az-q6l4N3j1.js} +2 -2
- package/cdn/{az-BT93Xmvh.js.map → az-q6l4N3j1.js.map} +1 -1
- package/cdn/background.dev.js +1 -1
- package/cdn/background.js +1 -1
- package/cdn/{bg-CNMY77ir.js → bg-BdKU1ynW.js} +2 -2
- package/cdn/{bg-CNMY77ir.js.map → bg-BdKU1ynW.js.map} +1 -1
- package/cdn/{bg-B3I4SlRq.js → bg-DCWtl1c4.js} +2 -2
- package/cdn/{bg-B3I4SlRq.js.map → bg-DCWtl1c4.js.map} +1 -1
- package/cdn/{bn-KcCmQhYd.js → bn-BbmORCrv.js} +2 -2
- package/cdn/{bn-KcCmQhYd.js.map → bn-BbmORCrv.js.map} +1 -1
- package/cdn/{bn-CcLIScl6.js → bn-DZmQ9OJ-.js} +2 -2
- package/cdn/{bn-CcLIScl6.js.map → bn-DZmQ9OJ-.js.map} +1 -1
- package/cdn/{bs-BGd6Lc0X.js → bs-BvptjSqN.js} +2 -2
- package/cdn/{bs-BGd6Lc0X.js.map → bs-BvptjSqN.js.map} +1 -1
- package/cdn/{bs-CS5F7Fa6.js → bs-Cw5PmwUl.js} +2 -2
- package/cdn/{bs-CS5F7Fa6.js.map → bs-Cw5PmwUl.js.map} +1 -1
- package/cdn/{ca-BIdQJZV-.js → ca-Cn5dI2Qs.js} +2 -2
- package/cdn/{ca-BIdQJZV-.js.map → ca-Cn5dI2Qs.js.map} +1 -1
- package/cdn/{ca-tFUfQ2mI.js → ca-CoCZNriH.js} +2 -2
- package/cdn/{ca-tFUfQ2mI.js.map → ca-CoCZNriH.js.map} +1 -1
- package/cdn/compounds-CHlzbAKu.js +8 -0
- package/cdn/compounds-CHlzbAKu.js.map +1 -0
- package/cdn/{compounds-C73u1MeO.js → compounds-D1FPw7jg.js} +99 -109
- package/cdn/compounds-D1FPw7jg.js.map +1 -0
- package/cdn/{create-player-Db1CIvlK.js → create-player-5UrHNqBI.js} +704 -704
- package/cdn/create-player-5UrHNqBI.js.map +1 -0
- package/cdn/create-player-LjvbIxIq.js +2 -0
- package/cdn/create-player-LjvbIxIq.js.map +1 -0
- package/cdn/{cs-B9lsmY_k.js → cs-BV3Sx3fM.js} +2 -2
- package/cdn/{cs-B9lsmY_k.js.map → cs-BV3Sx3fM.js.map} +1 -1
- package/cdn/{cs-CGi94LND.js → cs-D5U7GOvT.js} +2 -2
- package/cdn/{cs-CGi94LND.js.map → cs-D5U7GOvT.js.map} +1 -1
- package/cdn/{cy-m5eMZq7d.js → cy-C1ARfOdw.js} +2 -2
- package/cdn/{cy-m5eMZq7d.js.map → cy-C1ARfOdw.js.map} +1 -1
- package/cdn/{cy-DW6qAdUj.js → cy-DudRluPj.js} +2 -2
- package/cdn/{cy-DW6qAdUj.js.map → cy-DudRluPj.js.map} +1 -1
- package/cdn/{da-B5RntG8L.js → da-B7ZwuW3M.js} +2 -2
- package/cdn/{da-B5RntG8L.js.map → da-B7ZwuW3M.js.map} +1 -1
- package/cdn/{da-BW7obU8g.js → da-II10K6Ey.js} +2 -2
- package/cdn/{da-BW7obU8g.js.map → da-II10K6Ey.js.map} +1 -1
- package/cdn/{de-D3KzJ5Tz.js → de-B6OPMaJ5.js} +2 -2
- package/cdn/{de-D3KzJ5Tz.js.map → de-B6OPMaJ5.js.map} +1 -1
- package/cdn/{de-B1BbfHoj.js → de-Dp0rNs6I.js} +2 -2
- package/cdn/{de-B1BbfHoj.js.map → de-Dp0rNs6I.js.map} +1 -1
- package/cdn/device-pixel-ratio-BuD3pqk8.js +2 -0
- package/cdn/device-pixel-ratio-BuD3pqk8.js.map +1 -0
- package/cdn/device-pixel-ratio-mmUkCbE0.js +48 -0
- package/cdn/device-pixel-ratio-mmUkCbE0.js.map +1 -0
- package/cdn/{el-DpHi5eUV.js → el-EOboxCMK.js} +2 -2
- package/cdn/{el-DpHi5eUV.js.map → el-EOboxCMK.js.map} +1 -1
- package/cdn/{el-B0opiKbz.js → el-KnLx85RQ.js} +2 -2
- package/cdn/{el-B0opiKbz.js.map → el-KnLx85RQ.js.map} +1 -1
- package/cdn/{error-surface-D0bo71gD.js → error-surface-BOIu7qNS.js} +30 -13
- package/cdn/error-surface-BOIu7qNS.js.map +1 -0
- package/cdn/{error-surface-BID4D3DW.js → error-surface-CK9nYgD5.js} +2 -2
- package/cdn/error-surface-CK9nYgD5.js.map +1 -0
- package/cdn/{es-DPmLLGjd.js → es--93P_KGd.js} +2 -2
- package/cdn/{es-DPmLLGjd.js.map → es--93P_KGd.js.map} +1 -1
- package/cdn/{es-R4DSKG7w.js → es-COk6VYCt.js} +2 -2
- package/cdn/{es-R4DSKG7w.js.map → es-COk6VYCt.js.map} +1 -1
- package/cdn/{et-DQHjBg68.js → et-B_7oInYP.js} +2 -2
- package/cdn/{et-DQHjBg68.js.map → et-B_7oInYP.js.map} +1 -1
- package/cdn/{et-Ba6ZgMTe.js → et-aUy-aqQn.js} +2 -2
- package/cdn/{et-Ba6ZgMTe.js.map → et-aUy-aqQn.js.map} +1 -1
- package/cdn/{eu-CBUcm8xq.js → eu-B6ITLPO5.js} +2 -2
- package/cdn/{eu-CBUcm8xq.js.map → eu-B6ITLPO5.js.map} +1 -1
- package/cdn/{eu-DXctohCN.js → eu-BG9wftF5.js} +2 -2
- package/cdn/{eu-DXctohCN.js.map → eu-BG9wftF5.js.map} +1 -1
- package/cdn/{fa-BSekhYli.js → fa-Dh0ufSh-.js} +2 -2
- package/cdn/{fa-BSekhYli.js.map → fa-Dh0ufSh-.js.map} +1 -1
- package/cdn/{fa-DVErbQrK.js → fa-Vvr1px4j.js} +2 -2
- package/cdn/{fa-DVErbQrK.js.map → fa-Vvr1px4j.js.map} +1 -1
- package/cdn/{fi-CvnyRW00.js → fi-BG_ciEXf.js} +2 -2
- package/cdn/{fi-CvnyRW00.js.map → fi-BG_ciEXf.js.map} +1 -1
- package/cdn/{fi-CFpiNsK2.js → fi-XtLm7xkM.js} +2 -2
- package/cdn/{fi-CFpiNsK2.js.map → fi-XtLm7xkM.js.map} +1 -1
- package/cdn/{fr-V1tRQlCS.js → fr-BXWr8Jqu.js} +2 -2
- package/cdn/{fr-V1tRQlCS.js.map → fr-BXWr8Jqu.js.map} +1 -1
- package/cdn/{fr-DFpP-osm.js → fr-CHcVddjH.js} +2 -2
- package/cdn/{fr-DFpP-osm.js.map → fr-CHcVddjH.js.map} +1 -1
- package/cdn/{gd-BSg8cDZO.js → gd-4GF6aH0c.js} +2 -2
- package/cdn/{gd-BSg8cDZO.js.map → gd-4GF6aH0c.js.map} +1 -1
- package/cdn/{gd-qpj49Ajf.js → gd-DjfDHZSD.js} +2 -2
- package/cdn/{gd-qpj49Ajf.js.map → gd-DjfDHZSD.js.map} +1 -1
- package/cdn/{gesture-element-CeRy1IVs.js → gesture-element-BbNy1Pjt.js} +2 -2
- package/cdn/{gesture-element-CeRy1IVs.js.map → gesture-element-BbNy1Pjt.js.map} +1 -1
- package/cdn/{gesture-element-DB67OYCE.js → gesture-element-KdpjbbBD.js} +3 -3
- package/cdn/{gesture-element-DB67OYCE.js.map → gesture-element-KdpjbbBD.js.map} +1 -1
- package/cdn/{gl-BkUKK3Id.js → gl-CMgj66_6.js} +2 -2
- package/cdn/{gl-BkUKK3Id.js.map → gl-CMgj66_6.js.map} +1 -1
- package/cdn/{gl-9SEblv-S.js → gl-D9ioIzwX.js} +2 -2
- package/cdn/{gl-9SEblv-S.js.map → gl-D9ioIzwX.js.map} +1 -1
- package/cdn/{he-1PXxurjR.js → he-CfWrcfG4.js} +2 -2
- package/cdn/{he-1PXxurjR.js.map → he-CfWrcfG4.js.map} +1 -1
- package/cdn/{he-DA_NFjk3.js → he-DfwOOgbT.js} +2 -2
- package/cdn/{he-DA_NFjk3.js.map → he-DfwOOgbT.js.map} +1 -1
- package/cdn/{hi-u7gnYTbQ.js → hi-BZ3n5dDB.js} +2 -2
- package/cdn/{hi-u7gnYTbQ.js.map → hi-BZ3n5dDB.js.map} +1 -1
- package/cdn/{hi-qm1t0A8G.js → hi-D3c9qx7l.js} +2 -2
- package/cdn/{hi-qm1t0A8G.js.map → hi-D3c9qx7l.js.map} +1 -1
- package/cdn/{hr-BlnRGxrs.js → hr-DEA0U32S.js} +2 -2
- package/cdn/{hr-BlnRGxrs.js.map → hr-DEA0U32S.js.map} +1 -1
- package/cdn/{hr-YlMHxjnx.js → hr-WZJQxYNC.js} +2 -2
- package/cdn/{hr-YlMHxjnx.js.map → hr-WZJQxYNC.js.map} +1 -1
- package/cdn/{hu-Cpl4civp.js → hu-Ci9TDNn-.js} +2 -2
- package/cdn/{hu-Cpl4civp.js.map → hu-Ci9TDNn-.js.map} +1 -1
- package/cdn/{hu-CfmcttWR.js → hu-XOjo5JlM.js} +2 -2
- package/cdn/{hu-CfmcttWR.js.map → hu-XOjo5JlM.js.map} +1 -1
- package/cdn/{i18n-D0nhPa0m.js → i18n-DeI9j-ko.js} +2 -2
- package/cdn/{i18n-D0nhPa0m.js.map → i18n-DeI9j-ko.js.map} +1 -1
- package/cdn/i18n-R3TQ8P2f.js +2 -0
- package/cdn/{i18n-CpBDXf6M.js.map → i18n-R3TQ8P2f.js.map} +1 -1
- package/cdn/i18n.dev.js +53 -53
- package/cdn/i18n.js +1 -1
- package/cdn/{id-COi2HloV.js → id-D2Z0jj2m.js} +2 -2
- package/cdn/{id-COi2HloV.js.map → id-D2Z0jj2m.js.map} +1 -1
- package/cdn/{id-Be_i6jhO.js → id-D9XC3sJi.js} +2 -2
- package/cdn/{id-Be_i6jhO.js.map → id-D9XC3sJi.js.map} +1 -1
- package/cdn/{it-B18weK94.js → it-CDVRQsJC.js} +2 -2
- package/cdn/{it-B18weK94.js.map → it-CDVRQsJC.js.map} +1 -1
- package/cdn/{it-DKKYDPD1.js → it-tbmwIgns.js} +2 -2
- package/cdn/{it-DKKYDPD1.js.map → it-tbmwIgns.js.map} +1 -1
- package/cdn/{ja-CeZwzavz.js → ja-Di4sbE9W.js} +2 -2
- package/cdn/{ja-CeZwzavz.js.map → ja-Di4sbE9W.js.map} +1 -1
- package/cdn/{ja-Bk6dXsfM.js → ja-DuWgmes7.js} +2 -2
- package/cdn/{ja-Bk6dXsfM.js.map → ja-DuWgmes7.js.map} +1 -1
- package/cdn/{ko-DpALhNiw.js → ko-BX5hcvm_.js} +2 -2
- package/cdn/{ko-DpALhNiw.js.map → ko-BX5hcvm_.js.map} +1 -1
- package/cdn/{ko-DzP46eEm.js → ko-CvalpIGs.js} +2 -2
- package/cdn/{ko-DzP46eEm.js.map → ko-CvalpIGs.js.map} +1 -1
- package/cdn/{live-button-element-Co8z2LkI.js → live-button-element-C-WypudK.js} +2 -2
- package/cdn/{live-button-element-Co8z2LkI.js.map → live-button-element-C-WypudK.js.map} +1 -1
- package/cdn/{live-button-element-zE-8uoR2.js → live-button-element-CylfQD0v.js} +3 -3
- package/cdn/{live-button-element-zE-8uoR2.js.map → live-button-element-CylfQD0v.js.map} +1 -1
- package/cdn/live-video-minimal.dev.js +7 -7
- 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 +8 -8
- 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/ar.dev.js +1 -1
- package/cdn/locales/ar.js +1 -1
- package/cdn/locales/az.dev.js +1 -1
- package/cdn/locales/az.js +1 -1
- package/cdn/locales/bg.dev.js +1 -1
- package/cdn/locales/bg.js +1 -1
- package/cdn/locales/bn.dev.js +1 -1
- package/cdn/locales/bn.js +1 -1
- package/cdn/locales/bs.dev.js +1 -1
- package/cdn/locales/bs.js +1 -1
- package/cdn/locales/ca.dev.js +1 -1
- package/cdn/locales/ca.js +1 -1
- package/cdn/locales/cs.dev.js +1 -1
- package/cdn/locales/cs.js +1 -1
- package/cdn/locales/cy.dev.js +1 -1
- package/cdn/locales/cy.js +1 -1
- package/cdn/locales/da.dev.js +1 -1
- package/cdn/locales/da.js +1 -1
- package/cdn/locales/de.dev.js +1 -1
- package/cdn/locales/de.js +1 -1
- package/cdn/locales/el.dev.js +1 -1
- package/cdn/locales/el.js +1 -1
- package/cdn/locales/es.dev.js +1 -1
- package/cdn/locales/es.js +1 -1
- package/cdn/locales/et.dev.js +1 -1
- package/cdn/locales/et.js +1 -1
- package/cdn/locales/eu.dev.js +1 -1
- package/cdn/locales/eu.js +1 -1
- package/cdn/locales/fa.dev.js +1 -1
- package/cdn/locales/fa.js +1 -1
- package/cdn/locales/fi.dev.js +1 -1
- package/cdn/locales/fi.js +1 -1
- package/cdn/locales/fr.dev.js +1 -1
- package/cdn/locales/fr.js +1 -1
- package/cdn/locales/gd.dev.js +1 -1
- package/cdn/locales/gd.js +1 -1
- package/cdn/locales/gl.dev.js +1 -1
- package/cdn/locales/gl.js +1 -1
- package/cdn/locales/he.dev.js +1 -1
- package/cdn/locales/he.js +1 -1
- package/cdn/locales/hi.dev.js +1 -1
- package/cdn/locales/hi.js +1 -1
- package/cdn/locales/hr.dev.js +1 -1
- package/cdn/locales/hr.js +1 -1
- package/cdn/locales/hu.dev.js +1 -1
- package/cdn/locales/hu.js +1 -1
- package/cdn/locales/id.dev.js +1 -1
- package/cdn/locales/id.js +1 -1
- package/cdn/locales/it.dev.js +1 -1
- package/cdn/locales/it.js +1 -1
- package/cdn/locales/ja.dev.js +1 -1
- package/cdn/locales/ja.js +1 -1
- package/cdn/locales/ko.dev.js +1 -1
- package/cdn/locales/ko.js +1 -1
- package/cdn/locales/lt.dev.js +1 -1
- package/cdn/locales/lt.js +1 -1
- package/cdn/locales/lv.dev.js +1 -1
- package/cdn/locales/lv.js +1 -1
- package/cdn/locales/mr.dev.js +1 -1
- package/cdn/locales/mr.js +1 -1
- package/cdn/locales/nb.dev.js +1 -1
- package/cdn/locales/nb.js +1 -1
- package/cdn/locales/ne.dev.js +1 -1
- package/cdn/locales/ne.js +1 -1
- package/cdn/locales/nl.dev.js +1 -1
- package/cdn/locales/nl.js +1 -1
- package/cdn/locales/nn.dev.js +1 -1
- package/cdn/locales/nn.js +1 -1
- package/cdn/locales/oc.dev.js +1 -1
- package/cdn/locales/oc.js +1 -1
- package/cdn/locales/pl.dev.js +1 -1
- package/cdn/locales/pl.js +1 -1
- package/cdn/locales/pt-BR.dev.js +1 -1
- package/cdn/locales/pt-BR.js +1 -1
- package/cdn/locales/pt-PT.dev.js +1 -1
- package/cdn/locales/pt-PT.js +1 -1
- package/cdn/locales/pt.dev.js +1 -1
- package/cdn/locales/pt.js +1 -1
- package/cdn/locales/ro.dev.js +1 -1
- package/cdn/locales/ro.js +1 -1
- package/cdn/locales/ru.dev.js +1 -1
- package/cdn/locales/ru.js +1 -1
- package/cdn/locales/sk.dev.js +1 -1
- package/cdn/locales/sk.js +1 -1
- package/cdn/locales/sl.dev.js +1 -1
- package/cdn/locales/sl.js +1 -1
- package/cdn/locales/sr.dev.js +1 -1
- package/cdn/locales/sr.js +1 -1
- package/cdn/locales/sv.dev.js +1 -1
- package/cdn/locales/sv.js +1 -1
- package/cdn/locales/te.dev.js +1 -1
- package/cdn/locales/te.js +1 -1
- package/cdn/locales/th.dev.js +1 -1
- package/cdn/locales/th.js +1 -1
- package/cdn/locales/tr.dev.js +1 -1
- package/cdn/locales/tr.js +1 -1
- package/cdn/locales/uk.dev.js +1 -1
- package/cdn/locales/uk.js +1 -1
- package/cdn/locales/vi.dev.js +1 -1
- package/cdn/locales/vi.js +1 -1
- package/cdn/locales/zh-CN.dev.js +1 -1
- package/cdn/locales/zh-CN.js +1 -1
- package/cdn/locales/zh-TW.dev.js +1 -1
- package/cdn/locales/zh-TW.js +1 -1
- package/cdn/locales/zh.dev.js +1 -1
- package/cdn/locales/zh.js +1 -1
- package/cdn/{lt-CJC2CVhF.js → lt-DLXeAqcs.js} +2 -2
- package/cdn/{lt-CJC2CVhF.js.map → lt-DLXeAqcs.js.map} +1 -1
- package/cdn/{lt-y_SCQZXc.js → lt-ZQzwrnWQ.js} +2 -2
- package/cdn/{lt-y_SCQZXc.js.map → lt-ZQzwrnWQ.js.map} +1 -1
- package/cdn/{lv-E4LvfHSK.js → lv-CsVQVy3v.js} +2 -2
- package/cdn/{lv-E4LvfHSK.js.map → lv-CsVQVy3v.js.map} +1 -1
- package/cdn/{lv-CfdIbjKR.js → lv-RRA9zY_N.js} +2 -2
- package/cdn/{lv-CfdIbjKR.js.map → lv-RRA9zY_N.js.map} +1 -1
- package/cdn/media/cloudflare-video.dev.js +2 -2
- package/cdn/media/cloudflare-video.js +1 -1
- package/cdn/media/hls-audio.dev.js +1 -1
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-background-video.dev.js +1 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-video.dev.js +1 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +1 -1
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-background-video.dev.js +1 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-data.dev.js +1 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +1 -1
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/spf.dev.js +1 -1
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/shaka-video.dev.d.ts +1 -0
- package/cdn/media/shaka-video.dev.js +35132 -0
- package/cdn/media/shaka-video.dev.js.map +1 -0
- package/cdn/media/shaka-video.js +55 -0
- package/cdn/media/shaka-video.js.map +1 -0
- package/cdn/media/spotify-audio.dev.js +2 -2
- package/cdn/media/spotify-audio.js +1 -1
- package/cdn/media/tiktok-video.dev.js +2 -2
- package/cdn/media/tiktok-video.js +1 -1
- package/cdn/media/twitch-video.dev.js +1 -1
- package/cdn/media/twitch-video.js +1 -1
- package/cdn/media/vimeo-video.dev.js +2 -2
- package/cdn/media/vimeo-video.js +2 -2
- package/cdn/media/youtube-video.dev.js +2 -2
- package/cdn/media/youtube-video.js +1 -1
- package/cdn/{media-mYKOAsk3.js → media-B4uT13xV.js} +13 -29
- package/cdn/media-B4uT13xV.js.map +1 -0
- package/cdn/{media-DI6DvYm3.js → media-B6LoDnMy.js} +57 -3
- package/cdn/media-B6LoDnMy.js.map +1 -0
- package/cdn/media-D6Xer97u.js +2 -0
- package/cdn/media-D6Xer97u.js.map +1 -0
- package/cdn/media-DdApyCAP.js +2 -0
- package/cdn/media-DdApyCAP.js.map +1 -0
- package/cdn/{media-D4tG62L5.js → media-YTtOjoEw.js} +2 -2
- package/cdn/{media-D4tG62L5.js.map → media-YTtOjoEw.js.map} +1 -1
- package/cdn/{media-BI8caj07.js → media-aZ7x4gGL.js} +3 -3
- package/cdn/{media-BI8caj07.js.map → media-aZ7x4gGL.js.map} +1 -1
- package/cdn/minimal-ui-D3XCtSx_.js +2 -0
- package/cdn/{minimal-ui-BXrq3z4U.js.map → minimal-ui-D3XCtSx_.js.map} +1 -1
- package/cdn/{minimal-ui-BCIESK8f.js → minimal-ui-KUzZkG_3.js} +8 -8
- package/cdn/{minimal-ui-BCIESK8f.js.map → minimal-ui-KUzZkG_3.js.map} +1 -1
- package/cdn/{minimal-ui-DEalpMk6.js → minimal-ui-ajeAXABk.js} +4 -4
- package/cdn/{minimal-ui-DEalpMk6.js.map → minimal-ui-ajeAXABk.js.map} +1 -1
- package/cdn/{minimal-ui-vY3QgohH.js → minimal-ui-p9QCZfCz.js} +2 -2
- package/cdn/{minimal-ui-vY3QgohH.js.map → minimal-ui-p9QCZfCz.js.map} +1 -1
- package/cdn/{mr-C4OijKV_.js → mr-CZ7oMzua.js} +2 -2
- package/cdn/{mr-C4OijKV_.js.map → mr-CZ7oMzua.js.map} +1 -1
- package/cdn/{mr-DmbgkSem.js → mr-CgFYVcpx.js} +2 -2
- package/cdn/{mr-DmbgkSem.js.map → mr-CgFYVcpx.js.map} +1 -1
- package/cdn/{nb-Bx5aKqbD.js → nb-DWtHJLYf.js} +2 -2
- package/cdn/{nb-Bx5aKqbD.js.map → nb-DWtHJLYf.js.map} +1 -1
- package/cdn/{nb-DQ3Nq1ZC.js → nb-ahqFuIy4.js} +2 -2
- package/cdn/{nb-DQ3Nq1ZC.js.map → nb-ahqFuIy4.js.map} +1 -1
- package/cdn/{ne-DTL8Y04V.js → ne-CFkutVHH.js} +2 -2
- package/cdn/{ne-DTL8Y04V.js.map → ne-CFkutVHH.js.map} +1 -1
- package/cdn/{ne-BM_WgrGC.js → ne-DQx0S7DC.js} +2 -2
- package/cdn/{ne-BM_WgrGC.js.map → ne-DQx0S7DC.js.map} +1 -1
- package/cdn/{nl-C7CWKQe5.js → nl-BbWS-uoT.js} +2 -2
- package/cdn/{nl-C7CWKQe5.js.map → nl-BbWS-uoT.js.map} +1 -1
- package/cdn/{nl-DMt-nkiN.js → nl-V4DJd2nd.js} +2 -2
- package/cdn/{nl-DMt-nkiN.js.map → nl-V4DJd2nd.js.map} +1 -1
- package/cdn/{nn-BOoGZjkf.js → nn-BoY6X0bu.js} +2 -2
- package/cdn/{nn-BOoGZjkf.js.map → nn-BoY6X0bu.js.map} +1 -1
- package/cdn/{nn-CT846E14.js → nn-Bp2EWBHZ.js} +2 -2
- package/cdn/{nn-CT846E14.js.map → nn-Bp2EWBHZ.js.map} +1 -1
- package/cdn/observe-elements-B4q3zaDw.js +79 -0
- package/cdn/observe-elements-B4q3zaDw.js.map +1 -0
- package/cdn/observe-elements-BivD4tHs.js +2 -0
- package/cdn/observe-elements-BivD4tHs.js.map +1 -0
- package/cdn/{oc-DQgnGeb2.js → oc-BJrdQkma.js} +2 -2
- package/cdn/{oc-DQgnGeb2.js.map → oc-BJrdQkma.js.map} +1 -1
- package/cdn/{oc-ClJwr9d0.js → oc-Dto6NU-U.js} +2 -2
- package/cdn/{oc-ClJwr9d0.js.map → oc-Dto6NU-U.js.map} +1 -1
- package/cdn/{pl-B7SFuF8C.js → pl-BmUKjVFU.js} +2 -2
- package/cdn/{pl-B7SFuF8C.js.map → pl-BmUKjVFU.js.map} +1 -1
- package/cdn/{pl-DWVOOhfp.js → pl-HlPnZjYT.js} +2 -2
- package/cdn/{pl-DWVOOhfp.js.map → pl-HlPnZjYT.js.map} +1 -1
- package/cdn/{player-B3GlPF90.js → player-B5zkgqwT.js} +2 -2
- package/cdn/{player-B3GlPF90.js.map → player-B5zkgqwT.js.map} +1 -1
- package/cdn/{player-DPDmTRvg.js → player-BXQMSpgR.js} +2 -2
- package/cdn/{player-DPDmTRvg.js.map → player-BXQMSpgR.js.map} +1 -1
- package/cdn/{player-CtTC7qa5.js → player-BuxifKSM.js} +2 -2
- package/cdn/{player-CtTC7qa5.js.map → player-BuxifKSM.js.map} +1 -1
- package/cdn/{player-DrDd7LJi.js → player-CngT-cVQ.js} +2 -2
- package/cdn/{player-DrDd7LJi.js.map → player-CngT-cVQ.js.map} +1 -1
- package/cdn/{player-L5UpZmT4.js → player-DMP2pc3L.js} +2 -2
- package/cdn/{player-L5UpZmT4.js.map → player-DMP2pc3L.js.map} +1 -1
- package/cdn/{player-DKkph8UM.js → player-POHYt5tr.js} +2 -2
- package/cdn/{player-DKkph8UM.js.map → player-POHYt5tr.js.map} +1 -1
- package/cdn/{poster-element-B5tdJ2ub.js → poster-element-CuCEBVr3.js} +3 -11
- package/cdn/poster-element-CuCEBVr3.js.map +1 -0
- package/cdn/{poster-element-B8QwXSU_.js → poster-element-Djlm5fwC.js} +2 -2
- package/cdn/{poster-element-B8QwXSU_.js.map → poster-element-Djlm5fwC.js.map} +1 -1
- package/cdn/{pt-BR-Dx0zZKM6.js → pt-BR-Cfv1ox9K.js} +2 -2
- package/cdn/{pt-BR-Dx0zZKM6.js.map → pt-BR-Cfv1ox9K.js.map} +1 -1
- package/cdn/{pt-BR-BweixWSY.js → pt-BR-j4XWQBdJ.js} +2 -2
- package/cdn/{pt-BR-BweixWSY.js.map → pt-BR-j4XWQBdJ.js.map} +1 -1
- package/cdn/{pt-C0Z9dXhV.js → pt-BUBSLaBp.js} +3 -3
- package/cdn/{pt-C0Z9dXhV.js.map → pt-BUBSLaBp.js.map} +1 -1
- package/cdn/{pt-PT-Di4o8ntw.js → pt-PT-DQ0otVWH.js} +2 -2
- package/cdn/{pt-PT-Di4o8ntw.js.map → pt-PT-DQ0otVWH.js.map} +1 -1
- package/cdn/{pt-PT-DlHt57Eg.js → pt-PT-DdJVXfMB.js} +2 -2
- package/cdn/{pt-PT-DlHt57Eg.js.map → pt-PT-DdJVXfMB.js.map} +1 -1
- package/cdn/pt-akbpk7gG.js +2 -0
- package/cdn/{pt-ohZp6iM5.js.map → pt-akbpk7gG.js.map} +1 -1
- package/cdn/relocation-pipelines-CBzRuD_s.js +2 -0
- package/cdn/relocation-pipelines-CBzRuD_s.js.map +1 -0
- package/cdn/{relocation-pipelines-Dh8CcgHw.js → relocation-pipelines-R2UVEy5p.js} +38 -2
- package/cdn/relocation-pipelines-R2UVEy5p.js.map +1 -0
- package/cdn/resolution-C4bCDOw4.js +2 -0
- package/cdn/resolution-C4bCDOw4.js.map +1 -0
- package/cdn/resolution-DPr_vTWF.js +29 -0
- package/cdn/resolution-DPr_vTWF.js.map +1 -0
- package/cdn/{ro-BB4KBp_W.js → ro-BiexogxI.js} +2 -2
- package/cdn/{ro-BB4KBp_W.js.map → ro-BiexogxI.js.map} +1 -1
- package/cdn/{ro-BU9kKrWV.js → ro-X-mft-iF.js} +2 -2
- package/cdn/{ro-BU9kKrWV.js.map → ro-X-mft-iF.js.map} +1 -1
- package/cdn/rolldown-runtime-KW3qVizi.js +42 -0
- package/cdn/rolldown-runtime-QTnfLwEv.js +1 -0
- package/cdn/{ru-CajU7FT2.js → ru-15_5g81L.js} +2 -2
- package/cdn/{ru-CajU7FT2.js.map → ru-15_5g81L.js.map} +1 -1
- package/cdn/{ru-BrWt8VXI.js → ru-GHEfsz_c.js} +2 -2
- package/cdn/{ru-BrWt8VXI.js.map → ru-GHEfsz_c.js.map} +1 -1
- package/cdn/{seek-button-element-5co-k0Dx.js → seek-button-element-BD2caCd5.js} +3 -3
- package/cdn/{seek-button-element-5co-k0Dx.js.map → seek-button-element-BD2caCd5.js.map} +1 -1
- package/cdn/{seek-button-element-B8TkILg-.js → seek-button-element-CgaXVFPS.js} +2 -2
- package/cdn/{seek-button-element-B8TkILg-.js.map → seek-button-element-CgaXVFPS.js.map} +1 -1
- package/cdn/{sk-DOZafohX.js → sk-BEvGx8AE.js} +2 -2
- package/cdn/{sk-DOZafohX.js.map → sk-BEvGx8AE.js.map} +1 -1
- package/cdn/{sk-XGkesNm5.js → sk-CbZOx0Xf.js} +2 -2
- package/cdn/{sk-XGkesNm5.js.map → sk-CbZOx0Xf.js.map} +1 -1
- package/cdn/{skin-element-DrkI8xuM.js → skin-element-DE8OodF5.js} +2 -2
- package/cdn/skin-element-DE8OodF5.js.map +1 -0
- package/cdn/{skin-element-DvX6Bxsv.js → skin-element-PDwjO4v0.js} +2 -10
- package/cdn/{skin-element-DvX6Bxsv.js.map → skin-element-PDwjO4v0.js.map} +1 -1
- package/cdn/{sl-CHuwx211.js → sl-BqYDAX6g.js} +2 -2
- package/cdn/{sl-CHuwx211.js.map → sl-BqYDAX6g.js.map} +1 -1
- package/cdn/{sl-CuZgo3JI.js → sl-D7uEXtkn.js} +2 -2
- package/cdn/{sl-CuZgo3JI.js.map → sl-D7uEXtkn.js.map} +1 -1
- package/cdn/{sr-BsZrd40u.js → sr-CBBykxkN.js} +2 -2
- package/cdn/{sr-BsZrd40u.js.map → sr-CBBykxkN.js.map} +1 -1
- package/cdn/{sr-CzT_52m8.js → sr-D10ir4DL.js} +2 -2
- package/cdn/{sr-CzT_52m8.js.map → sr-D10ir4DL.js.map} +1 -1
- package/cdn/{sv-CsISpTMM.js → sv-BGcohnZb.js} +2 -2
- package/cdn/{sv-CsISpTMM.js.map → sv-BGcohnZb.js.map} +1 -1
- package/cdn/{sv-hxsarb6k.js → sv-he8gk9up.js} +2 -2
- package/cdn/{sv-hxsarb6k.js.map → sv-he8gk9up.js.map} +1 -1
- package/cdn/{te-DUaUnw1d.js → te-DhEDBJ0Q.js} +2 -2
- package/cdn/{te-DUaUnw1d.js.map → te-DhEDBJ0Q.js.map} +1 -1
- package/cdn/{te-CG0NRKuG.js → te-Dw2hLtHG.js} +2 -2
- package/cdn/{te-CG0NRKuG.js.map → te-Dw2hLtHG.js.map} +1 -1
- package/cdn/{text-element-BoY6AhMn.js → text-element-BJyj7nLo.js} +2 -2
- package/cdn/{text-element-BoY6AhMn.js.map → text-element-BJyj7nLo.js.map} +1 -1
- package/cdn/{text-element-cg6l21cd.js → text-element-dyiwucQB.js} +2 -2
- package/cdn/{text-element-cg6l21cd.js.map → text-element-dyiwucQB.js.map} +1 -1
- package/cdn/{th-BYS5ZpYb.js → th-B3iYzmd5.js} +2 -2
- package/cdn/{th-BYS5ZpYb.js.map → th-B3iYzmd5.js.map} +1 -1
- package/cdn/{th-Bx_CvtvC.js → th-BMZDRGQ7.js} +2 -2
- package/cdn/{th-Bx_CvtvC.js.map → th-BMZDRGQ7.js.map} +1 -1
- package/cdn/{time-slider-chapters-element-CznFQWFm.js → time-slider-chapters-element-BTMqnBhM.js} +3 -3
- package/cdn/{time-slider-chapters-element-CznFQWFm.js.map → time-slider-chapters-element-BTMqnBhM.js.map} +1 -1
- package/cdn/{time-slider-chapters-element-BfLjdnU4.js → time-slider-chapters-element-b6oeaZtJ.js} +2 -2
- package/cdn/{time-slider-chapters-element-BfLjdnU4.js.map → time-slider-chapters-element-b6oeaZtJ.js.map} +1 -1
- package/cdn/{tr-5Cegmhcj.js → tr-BJOEOizJ.js} +2 -2
- package/cdn/{tr-5Cegmhcj.js.map → tr-BJOEOizJ.js.map} +1 -1
- package/cdn/{tr-BV5YcpOy.js → tr-CdLz59Rt.js} +2 -2
- package/cdn/{tr-BV5YcpOy.js.map → tr-CdLz59Rt.js.map} +1 -1
- package/cdn/{ui-BwzqkJNK.js → ui-BsUcH4YJ.js} +7 -7
- package/cdn/{ui-BwzqkJNK.js.map → ui-BsUcH4YJ.js.map} +1 -1
- package/cdn/{ui-fnKp94a7.js → ui-CtONjPC2.js} +9 -9
- package/cdn/{ui-fnKp94a7.js.map → ui-CtONjPC2.js.map} +1 -1
- package/cdn/ui-CxftD4RF.js +2 -0
- package/cdn/{ui-DayfItun.js.map → ui-CxftD4RF.js.map} +1 -1
- package/cdn/ui-DLvwCbsU.js +2 -0
- package/cdn/{ui-PSnD-pv8.js.map → ui-DLvwCbsU.js.map} +1 -1
- package/cdn/{uk-DsHkf0ZB.js → uk-BTa1prcg.js} +2 -2
- package/cdn/{uk-DsHkf0ZB.js.map → uk-BTa1prcg.js.map} +1 -1
- package/cdn/{uk-D2WGhYFz.js → uk-BW53WsQa.js} +2 -2
- package/cdn/{uk-D2WGhYFz.js.map → uk-BW53WsQa.js.map} +1 -1
- package/cdn/{vi-DBLOO1G4.js → vi-CGDf02ms.js} +2 -2
- package/cdn/{vi-DBLOO1G4.js.map → vi-CGDf02ms.js.map} +1 -1
- package/cdn/{vi-CORn5e7t.js → vi-CcOG_Tlw.js} +2 -2
- package/cdn/{vi-CORn5e7t.js.map → vi-CcOG_Tlw.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/cdn/{zh-R2vnxJiQ.js → zh-34ObMhvt.js} +3 -3
- package/cdn/{zh-R2vnxJiQ.js.map → zh-34ObMhvt.js.map} +1 -1
- package/cdn/{zh-CN-Cga4L1h3.js → zh-CN-C_IU0JUw.js} +2 -2
- package/cdn/{zh-CN-Cga4L1h3.js.map → zh-CN-C_IU0JUw.js.map} +1 -1
- package/cdn/{zh-CN-xq6taoBE.js → zh-CN-rZeJec8v.js} +2 -2
- package/cdn/{zh-CN-xq6taoBE.js.map → zh-CN-rZeJec8v.js.map} +1 -1
- package/cdn/zh-Cf3NSZs8.js +2 -0
- package/cdn/{zh-CtBcRYRs.js.map → zh-Cf3NSZs8.js.map} +1 -1
- package/cdn/{zh-TW-DWI1-WUt.js → zh-TW-5fFrgVzt.js} +2 -2
- package/cdn/{zh-TW-DWI1-WUt.js.map → zh-TW-5fFrgVzt.js.map} +1 -1
- package/cdn/{zh-TW-Dca2WbyD.js → zh-TW-BvuhCu_U.js} +2 -2
- package/cdn/{zh-TW-Dca2WbyD.js.map → zh-TW-BvuhCu_U.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 +1 -3
- package/dist/default/define/audio/skin.css +1 -3
- package/dist/default/define/live-audio/minimal-skin.css +1 -3
- package/dist/default/define/live-audio/skin.css +1 -3
- package/dist/default/define/live-video/minimal-skin.css +2 -31
- package/dist/default/define/live-video/skin.css +2 -33
- package/dist/default/define/media/shaka-video.js +13 -0
- package/dist/default/define/media/shaka-video.js.map +1 -0
- package/dist/default/define/skin-element.js +0 -8
- package/dist/default/define/skin-element.js.map +1 -1
- package/dist/default/define/ui/title.js +7 -0
- package/dist/default/define/ui/title.js.map +1 -0
- package/dist/default/define/video/minimal-skin.css +2 -31
- package/dist/default/define/video/skin.css +2 -33
- package/dist/default/index.js +2 -1
- package/dist/default/media/shaka-video/media.js +9 -0
- package/dist/default/media/shaka-video/media.js.map +1 -0
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/menu.js +2 -2
- package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js +1 -7
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
- package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/ui/poster/poster-element.js +0 -8
- package/dist/default/ui/poster/poster-element.js.map +1 -1
- package/dist/default/ui/thumbnail/thumbnail-element.js +22 -7
- package/dist/default/ui/thumbnail/thumbnail-element.js.map +1 -1
- package/dist/default/ui/time/time-element.js +2 -3
- package/dist/default/ui/time/time-element.js.map +1 -1
- package/dist/default/ui/title/title-element.js +37 -0
- package/dist/default/ui/title/title-element.js.map +1 -0
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +1 -3
- package/dist/dev/define/audio/skin.css +1 -3
- package/dist/dev/define/live-audio/minimal-skin.css +1 -3
- package/dist/dev/define/live-audio/skin.css +1 -3
- package/dist/dev/define/live-video/minimal-skin.css +2 -31
- package/dist/dev/define/live-video/skin.css +2 -33
- package/dist/dev/define/media/shaka-video.d.ts +14 -0
- package/dist/dev/define/media/shaka-video.d.ts.map +1 -0
- package/dist/dev/define/media/shaka-video.js +13 -0
- package/dist/dev/define/media/shaka-video.js.map +1 -0
- package/dist/dev/define/skin-element.d.ts +0 -2
- package/dist/dev/define/skin-element.d.ts.map +1 -1
- package/dist/dev/define/skin-element.js +0 -8
- package/dist/dev/define/skin-element.js.map +1 -1
- package/dist/dev/define/ui/title.d.ts +8 -0
- package/dist/dev/define/ui/title.d.ts.map +1 -0
- package/dist/dev/define/ui/title.js +7 -0
- package/dist/dev/define/ui/title.js.map +1 -0
- package/dist/dev/define/video/minimal-skin.css +2 -31
- package/dist/dev/define/video/skin.css +2 -33
- package/dist/dev/index.d.ts +3 -2
- package/dist/dev/index.js +2 -1
- package/dist/dev/media/shaka-video/index.d.ts +2 -0
- package/dist/dev/media/shaka-video/media.d.ts +19 -0
- package/dist/dev/media/shaka-video/media.d.ts.map +1 -0
- package/dist/dev/media/shaka-video/media.js +9 -0
- package/dist/dev/media/shaka-video/media.js.map +1 -0
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js +2 -2
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js +1 -7
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +1 -10
- 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/button.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js +2 -2
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js +1 -7
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -10
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -0
- package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster-element.d.ts +0 -2
- package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster-element.js +0 -8
- package/dist/dev/ui/poster/poster-element.js.map +1 -1
- package/dist/dev/ui/thumbnail/thumbnail-element.d.ts.map +1 -1
- package/dist/dev/ui/thumbnail/thumbnail-element.js +22 -7
- package/dist/dev/ui/thumbnail/thumbnail-element.js.map +1 -1
- package/dist/dev/ui/time/time-element.d.ts.map +1 -1
- package/dist/dev/ui/time/time-element.js +2 -3
- package/dist/dev/ui/time/time-element.js.map +1 -1
- package/dist/dev/ui/title/title-element.d.ts +18 -0
- package/dist/dev/ui/title/title-element.d.ts.map +1 -0
- package/dist/dev/ui/title/title-element.js +38 -0
- package/dist/dev/ui/title/title-element.js.map +1 -0
- package/docs/README.md +1 -1
- package/docs/concepts/presets.md +4 -4
- package/docs/concepts/skins.md +6 -37
- package/docs/how-to/add-a-poster-placeholder.md +52 -0
- package/docs/how-to/customize-skins.md +6 -70
- package/docs/how-to/migrate-from-mux-player.md +12 -6
- package/docs/llms.txt +3 -0
- package/docs/reference/feature-fullscreen.md +7 -8
- package/docs/reference/feature-metadata.md +141 -0
- package/docs/reference/feature-orientation-lock.md +99 -7
- package/docs/reference/feature-text-tracks.md +10 -0
- package/docs/reference/menu.md +0 -1
- package/docs/reference/thumbnail.md +4 -0
- package/docs/reference/title.md +211 -0
- package/package.json +9 -9
- package/cdn/compounds-C4YYLyL2.js +0 -8
- package/cdn/compounds-C4YYLyL2.js.map +0 -1
- package/cdn/compounds-C73u1MeO.js.map +0 -1
- package/cdn/create-player-BU8LDJDL.js +0 -2
- package/cdn/create-player-BU8LDJDL.js.map +0 -1
- package/cdn/create-player-Db1CIvlK.js.map +0 -1
- package/cdn/error-surface-BID4D3DW.js.map +0 -1
- package/cdn/error-surface-D0bo71gD.js.map +0 -1
- package/cdn/i18n-CpBDXf6M.js +0 -2
- package/cdn/media-CQxFuDcv.js +0 -2
- package/cdn/media-CQxFuDcv.js.map +0 -1
- package/cdn/media-DI6DvYm3.js.map +0 -1
- package/cdn/media-mYKOAsk3.js.map +0 -1
- package/cdn/media-zReLnePj.js +0 -2
- package/cdn/media-zReLnePj.js.map +0 -1
- package/cdn/minimal-ui-BXrq3z4U.js +0 -2
- package/cdn/poster-element-B5tdJ2ub.js.map +0 -1
- package/cdn/pt-ohZp6iM5.js +0 -2
- package/cdn/relocation-pipelines-Dh8CcgHw.js.map +0 -1
- package/cdn/relocation-pipelines-DunE4gcV.js +0 -2
- package/cdn/relocation-pipelines-DunE4gcV.js.map +0 -1
- package/cdn/rolldown-runtime-DK3Fl9T5.js +0 -1
- package/cdn/rolldown-runtime-w6R9maHv.js +0 -18
- package/cdn/skin-element-DrkI8xuM.js.map +0 -1
- package/cdn/ui-DayfItun.js +0 -2
- package/cdn/ui-PSnD-pv8.js +0 -2
- package/cdn/zh-CtBcRYRs.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko-
|
|
1
|
+
{"version":3,"file":"ko-CvalpIGs.js","names":[],"sources":["../../core/dist/dev/i18n/locales/ko.js"],"sourcesContent":["//#region src/core/i18n/locales/ko.ts\nvar ko_default = {\n\tbuttons: {\n\t\tplay: \"재생\",\n\t\tpause: \"일시중지\",\n\t\treplay: \"다시 재생\",\n\t\tmute: \"음소거\",\n\t\tunmute: \"소리 활성화하기\"\n\t},\n\tseek: {\n\t\tforward: \"{seconds}초 앞으로\",\n\t\tbackward: \"{seconds}초 뒤로\"\n\t},\n\tfullscreen: {\n\t\tenter: \"전체 화면\",\n\t\texit: \"전체 화면 종료\"\n\t},\n\tcaptions: {\n\t\tenable: \"자막 켜기\",\n\t\tdisable: \"자막 끄기\"\n\t},\n\tpip: {\n\t\tenter: \"화면 속 화면\",\n\t\texit: \"화면 속 화면 종료\"\n\t},\n\tlive: {\n\t\tplaying: \"라이브 재생 중\",\n\t\tseekToEdge: \"라이브 지점으로 이동\",\n\t\tbadge: \"라이브\"\n\t},\n\tcast: {\n\t\tstart: \"전송 시작\",\n\t\tstop: \"전송 중지\",\n\t\tconnecting: \"연결 중\"\n\t},\n\tairplay: {\n\t\tstart: \"AirPlay 시작\",\n\t\tstop: \"AirPlay 중지\"\n\t},\n\tslider: { seek: \"탐색\" },\n\ttime: {\n\t\tcurrent: \"현재 시간\",\n\t\tduration: \"지정 기간\",\n\t\tremaining: \"남은 시간\",\n\t\telapsedSuffix: \"{duration} 경과 시간\",\n\t\tdurationSuffix: \"{duration} 재생 시간\",\n\t\tremainingSuffix: \"{duration} 남음\",\n\t\tshowElapsed: \"경과 시간 표시, {duration}.\",\n\t\tshowDuration: \"길이 표시, {duration}.\",\n\t\tshowRemaining: \"남은 시간 표시, {duration}.\",\n\t\ttoggleElapsed: \"경과 시간과 남은 시간 사이를 전환합니다.\",\n\t\ttoggleDuration: \"재생 시간과 남은 시간 사이를 전환합니다.\",\n\t\tposition: \"{duration} 중 {current}\"\n\t},\n\tplayback: { rate: \"재생 속도 {rate}\" },\n\tvolume: {\n\t\tmutedValue: \"{percent}, 음소거\",\n\t\tmuted: \"음소거\",\n\t\tlabel: \"볼륨\",\n\t\tvalue: \"볼륨 {value}\"\n\t},\n\tstatus: {\n\t\tcaptionsOn: \"자막 켜짐\",\n\t\tcaptionsOff: \"자막 꺼짐\",\n\t\tpaused: \"일시정지\",\n\t\tplaying: \"재생 중\",\n\t\tfullscreen: \"전체 화면\",\n\t\tpip: \"화면 속 화면\",\n\t\texitPip: \"화면 속 화면 종료\",\n\t\tseekedTo: \"이동 위치: {time}\"\n\t},\n\tcontainer: { label: \"미디어 플레이어\" },\n\terrors: {\n\t\taborted: \"비디오 재생을 취소했습니다.\",\n\t\tnetwork: \"네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.\",\n\t\tdecode: \"비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.\",\n\t\tsource: \"비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.\",\n\t\tencrypted: \"미디어는 암호화되어 있으며 이를 해독할 키를 갖고 있지 않습니다.\",\n\t\tunplayable: \"이 미디어는 플레이어에서 지원되지 않습니다.\",\n\t\ttitle: \"문제가 발생했습니다.\",\n\t\tunexpected: \"오류가 발생했습니다. 다시 시도해 주세요.\"\n\t},\n\tcommon: {\n\t\tempty: \"\",\n\t\tok: \"닫기\"\n\t},\n\tmenu: {\n\t\tsettings: \"설정\",\n\t\tquality: \"품질\",\n\t\taudio: \"오디오\",\n\t\tdefault: \"기본값\",\n\t\tspeed: \"속도\",\n\t\tcaptions: \"캡션\",\n\t\tplaybackRate: \"재생 속도\",\n\t\tback: \"뒤로\",\n\t\toff: \"끄기\",\n\t\tauto: \"자동\",\n\t\tautoWithLabel: \"자동 ({label})\",\n\t\tsubtitles: \"자막\"\n\t}\n};\n//#endregion\nexport { ko_default as default };\n\n//# sourceMappingURL=ko.js.map"],"mappings":";;;;AACA,IAAI,aAAa;CAChB,SAAS;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;CACT;CACA,MAAM;EACL,SAAS;EACT,UAAU;CACX;CACA,YAAY;EACX,OAAO;EACP,MAAM;CACP;CACA,UAAU;EACT,QAAQ;EACR,SAAS;CACV;CACA,KAAK;EACJ,OAAO;EACP,MAAM;CACP;CACA,MAAM;EACL,SAAS;EACT,YAAY;EACZ,OAAO;CACR;CACA,MAAM;EACL,OAAO;EACP,MAAM;EACN,YAAY;CACb;CACA,SAAS;EACR,OAAO;EACP,MAAM;CACP;CACA,QAAQ,EAAE,MAAM,KAAK;CACrB,MAAM;EACL,SAAS;EACT,UAAU;EACV,WAAW;EACX,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,aAAa;EACb,cAAc;EACd,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,UAAU;CACX;CACA,UAAU,EAAE,MAAM,eAAe;CACjC,QAAQ;EACP,YAAY;EACZ,OAAO;EACP,OAAO;EACP,OAAO;CACR;CACA,QAAQ;EACP,YAAY;EACZ,aAAa;EACb,QAAQ;EACR,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,UAAU;CACX;CACA,WAAW,EAAE,OAAO,WAAW;CAC/B,QAAQ;EACP,SAAS;EACT,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,OAAO;EACP,YAAY;CACb;CACA,QAAQ;EACP,OAAO;EACP,IAAI;CACL;CACA,MAAM;EACL,UAAU;EACV,SAAS;EACT,OAAO;EACP,SAAS;EACT,OAAO;EACP,UAAU;EACV,cAAc;EACd,MAAM;EACN,KAAK;EACL,MAAM;EACN,eAAe;EACf,WAAW;CACZ;AACD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,D as r,M as i,S as a,rt as o,w as s}from"./compounds-
|
|
2
|
-
//# sourceMappingURL=live-button-element-
|
|
1
|
+
import{A as e,B as t,C as n,D as r,M as i,S as a,rt as o,w as s}from"./compounds-CHlzbAKu.js";import{r as c}from"./translate-text-TzSgu_oe.js";import{t as l}from"./media-element-Cp5PrNre.js";import{r as u}from"./context-C2rsoDxk.js";import{c as d,r as f}from"./container-element-Dd0ZCdhK.js";import{c as p,n as m}from"./create-player-LjvbIxIq.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=p({live:!1,liveEdge:!1,label:``});#e={...e.defaultProps};#t=null;constructor(e){e&&this.setProps(e)}setProps(t){this.#e=o(t,e.defaultProps)}getLabel(e){return a(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:c(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 l{constructor(...n){super(...n),this.disabled=!1,this.label=``,this.core=new x,this.live=new m(this,u,i),this.time=new m(this,u,t),this.buffer=new m(this,u,e),this.#e=new f(this,d),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=r({onActivate:()=>{let e=this.#r();e&&this.core.seekToLive(e)},isDisabled:()=>this.disabled||!this.#r()});s(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 t=this.#r();if(!t)return;this.core.setMedia(t);let r=this.core.getState(),i=this.core.getAttrs(r);s(this,{...i,"aria-label":g(i[`aria-label`],this.#e.value)}),n(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-C-WypudK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-button-element-Co8z2LkI.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-C-WypudK.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,9 +1,9 @@
|
|
|
1
|
-
import { C as applyStateDataAttrs, N as selectLive, O as createButton, S as resolveLabel, T as applyElementProps, V as selectTime, it as defaults, j as selectBuffer, w as logMissingFeature } from "./compounds-
|
|
1
|
+
import { C as applyStateDataAttrs, N as selectLive, O as createButton, S as resolveLabel, T as applyElementProps, V as selectTime, it as defaults, j as selectBuffer, w as logMissingFeature } from "./compounds-D1FPw7jg.js";
|
|
2
2
|
import { r as resolveText$1 } from "./translate-text-BWvoW5-r.js";
|
|
3
3
|
import { t as MediaElement } from "./media-element-CJY3JIgc.js";
|
|
4
4
|
import { r as playerContext } from "./context-OhQY847V.js";
|
|
5
5
|
import { c as i18nContext, r as I18nController } from "./container-element-HHK_KZOE.js";
|
|
6
|
-
import {
|
|
6
|
+
import { c as createState, n as PlayerController } from "./create-player-5UrHNqBI.js";
|
|
7
7
|
import { resolveText, translateText } from "./i18n.dev.js";
|
|
8
8
|
|
|
9
9
|
//#region ../core/dist/dev/i18n/text/live.js
|
|
@@ -233,4 +233,4 @@ var LiveButtonElement = class extends MediaElement {
|
|
|
233
233
|
|
|
234
234
|
//#endregion
|
|
235
235
|
export { LiveButtonElement as t };
|
|
236
|
-
//# sourceMappingURL=live-button-element-
|
|
236
|
+
//# sourceMappingURL=live-button-element-CylfQD0v.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-button-element-zE-8uoR2.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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"}
|
|
1
|
+
{"version":3,"file":"live-button-element-CylfQD0v.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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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { $ 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-
|
|
1
|
+
import { $ 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-D1FPw7jg.js";
|
|
2
2
|
import { i as safeDefine } from "./context-OhQY847V.js";
|
|
3
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-PDwjO4v0.js";
|
|
6
|
+
import { t as GestureElement } from "./gesture-element-KdpjbbBD.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-CuCEBVr3.js";
|
|
8
|
+
import { t as LiveButtonElement } from "./live-button-element-CylfQD0v.js";
|
|
9
9
|
import { t as renderIcon } from "./minimal-6w_Vyyl9.js";
|
|
10
|
-
import { t as LiveVideoPlayerElement } from "./player-
|
|
10
|
+
import { t as LiveVideoPlayerElement } from "./player-B5zkgqwT.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(--thumbnail-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 --track-size: calc(var(--spacing) * 1);\n --track-highlighted-size: calc(var(--spacing) * 1.75);\n --track-border-radius: 99px;\n --thumb-size: calc(var(--spacing) * 3);\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\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: var(--track-size);\n }\n &[data-orientation=\"vertical\"] {\n width: var(--track-size);\n height: 100%;\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 }\n &[data-orientation=\"vertical\"] {\n inset-inline: 0;\n bottom: 0;\n height: 100%;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition: clip-path 200ms ease-out;\n }\n }\n &[data-dragging],\n &[data-seeking] {\n .media-slider__fill,\n .media-slider__buffer {\n transition-duration: 0ms;\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 &[data-dragging] {\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 /* 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 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 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(--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(--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(--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(--track-highlighted-size);\n }\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\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 &:focus-visible,\n &.media-slider__thumb--persistent {\n opacity: 1;\n scale: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, outline-offset, left, top, scale;\n }\n }\n\n @media (hover: hover) and (pointer: fine) {\n &:hover .media-slider__thumb {\n opacity: 1;\n scale: 1;\n }\n }\n\n &[data-dragging] .media-slider__thumb {\n opacity: 1;\n scale: 0.9;\n\n @media (prefers-reduced-motion: no-preference) {\n transition-property: opacity, outline-offset, scale;\n }\n\n &[data-orientation=\"horizontal\"] {\n left: var(--media-slider-pointer);\n }\n &[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-pointer));\n }\n }\n\n /* Preview */\n .media-slider__preview {\n --max-size-factor: 28;\n --max-size: min(calc(var(--spacing) * var(--max-size-factor)), 100cqi);\n\n min-width: 100%;\n height: calc(var(--spacing) * 1);\n\n @container media-root (width > 32rem) {\n --max-size-factor: 36;\n }\n\n @container media-root (width > 42rem) {\n --max-size-factor: 48;\n }\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-size);\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-size);\n --thumbnail-max-height: var(--max-size);\n bottom: calc(100% + (var(--spacing) * 11));\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 --volume-mask: linear-gradient(to right, transparent 10%, #000 25%, #000 100%);\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 :is(.media-time-controls, .media-button-group:last-child) {\n mask-image: var(--volume-mask-image, none);\n mask-repeat: no-repeat;\n mask-position: var(--volume-mask-position, 100% 0);\n mask-size: var(--volume-mask-size, 200% 100%);\n transition: mask-position 50ms ease-out;\n }\n\n @container media-root (width <= 42rem) {\n .media-popover--volume {\n --media-popover-side-offset: calc(var(--spacing) * 3);\n }\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) {\n @container media-root (width <= 42rem) {\n .media-button-group:last-child {\n --volume-mask-image: var(--volume-mask);\n --volume-mask-position: 0 0;\n --volume-mask-size: 400% 100%;\n }\n }\n\n @container media-root (width > 42rem) {\n .media-time-controls {\n --volume-mask-image: var(--volume-mask);\n --volume-mask-position: 0 0;\n }\n }\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}\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-size) / 2),\n var(--media-slider-pointer),\n calc(100% - var(--max-size) / 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;\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 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.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(--thumbnail-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 --track-size: calc(var(--spacing) * 1);\n --track-highlighted-size: calc(var(--spacing) * 1.75);\n --track-border-radius: 99px;\n --thumb-size: calc(var(--spacing) * 3);\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\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: var(--track-size);\n }\n &[data-orientation=\"vertical\"] {\n width: var(--track-size);\n height: 100%;\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 }\n &[data-orientation=\"vertical\"] {\n inset-inline: 0;\n bottom: 0;\n height: 100%;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition: clip-path 200ms ease-out;\n }\n }\n &[data-dragging],\n &[data-seeking] {\n .media-slider__fill,\n .media-slider__buffer {\n transition-duration: 0ms;\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 &[data-dragging] {\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 /* 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 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 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(--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(--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(--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(--track-highlighted-size);\n }\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\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 &:focus-visible,\n &.media-slider__thumb--persistent {\n opacity: 1;\n scale: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n transition-timing-function: ease-out;\n transition-duration: 150ms;\n transition-property: opacity, outline-offset, left, top, scale;\n }\n }\n\n @media (hover: hover) and (pointer: fine) {\n &:hover .media-slider__thumb {\n opacity: 1;\n scale: 1;\n }\n }\n\n &[data-dragging] .media-slider__thumb {\n opacity: 1;\n scale: 0.9;\n\n @media (prefers-reduced-motion: no-preference) {\n transition-property: opacity, outline-offset, scale;\n }\n\n &[data-orientation=\"horizontal\"] {\n left: var(--media-slider-pointer);\n }\n &[data-orientation=\"vertical\"] {\n top: calc(100% - var(--media-slider-pointer));\n }\n }\n\n /* Preview */\n .media-slider__preview {\n --max-size-factor: 28;\n --max-size: min(calc(var(--spacing) * var(--max-size-factor)), 100cqi);\n\n min-width: 100%;\n height: calc(var(--spacing) * 1);\n\n @container media-root (width > 32rem) {\n --max-size-factor: 36;\n }\n\n @container media-root (width > 42rem) {\n --max-size-factor: 48;\n }\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-size);\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-size);\n --thumbnail-max-height: var(--max-size);\n bottom: calc(100% + (var(--spacing) * 11));\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\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 }\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 --volume-mask: linear-gradient(to right, transparent 10%, #000 25%, #000 100%);\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 }\n\n @media (pointer: coarse) {\n transition-property: 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 :is(.media-time-controls, .media-button-group:last-child) {\n mask-image: var(--volume-mask-image, none);\n mask-repeat: no-repeat;\n mask-position: var(--volume-mask-position, 100% 0);\n mask-size: var(--volume-mask-size, 200% 100%);\n transition: mask-position 50ms ease-out;\n }\n\n @container media-root (width <= 42rem) {\n .media-popover--volume {\n --media-popover-side-offset: calc(var(--spacing) * 3);\n }\n }\n\n &:has(.media-button--mute[aria-expanded=\"true\"]) {\n @container media-root (width <= 42rem) {\n .media-button-group:last-child {\n --volume-mask-image: var(--volume-mask);\n --volume-mask-position: 0 0;\n --volume-mask-size: 400% 100%;\n }\n }\n\n @container media-root (width > 42rem) {\n .media-time-controls {\n --volume-mask-image: var(--volume-mask);\n --volume-mask-position: 0 0;\n }\n }\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}\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-size) / 2),\n var(--media-slider-pointer),\n calc(100% - var(--max-size) / 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
|