@videojs/html 10.0.0-beta.27 → 10.0.0-beta.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cdn/audio-headless.dev.js +1 -1
- package/cdn/audio-headless.js +1 -1
- package/cdn/audio-minimal-ui.dev.js +1 -1
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +4 -4
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +1 -1
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +4 -4
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background-video-WKumpp49.js +59 -0
- package/cdn/background-video-WKumpp49.js.map +1 -0
- package/cdn/background-video-YHY_3-lX.js +2 -0
- package/cdn/background-video-YHY_3-lX.js.map +1 -0
- package/cdn/background.dev.js +3 -56
- package/cdn/background.dev.js.map +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/bn-CcLIScl6.js +108 -0
- package/cdn/bn-CcLIScl6.js.map +1 -0
- package/cdn/bn-KcCmQhYd.js +2 -0
- package/cdn/bn-KcCmQhYd.js.map +1 -0
- package/cdn/compounds-BEO1d3ZM.js +8 -0
- package/cdn/compounds-BEO1d3ZM.js.map +1 -0
- package/cdn/{compounds-CCvdpvge.js → compounds-nk9RJtBK.js} +8 -15
- package/cdn/compounds-nk9RJtBK.js.map +1 -0
- package/cdn/container-element-Dd0ZCdhK.js +14 -0
- package/cdn/container-element-Dd0ZCdhK.js.map +1 -0
- package/cdn/container-element-HHK_KZOE.js +376 -0
- package/cdn/container-element-HHK_KZOE.js.map +1 -0
- package/cdn/{create-player-BHFyOnWi.js → create-player-DK9WOywd.js} +19 -379
- package/cdn/create-player-DK9WOywd.js.map +1 -0
- package/cdn/create-player-hSdQMP5p.js +2 -0
- package/cdn/create-player-hSdQMP5p.js.map +1 -0
- package/cdn/embed-params-D2e8u0d4.js +2 -0
- package/cdn/embed-params-D2e8u0d4.js.map +1 -0
- package/cdn/embed-params-W6T88S8x.js +39 -0
- package/cdn/embed-params-W6T88S8x.js.map +1 -0
- package/cdn/{gesture-element-CG-Sx_5t.js → gesture-element-6Ld1YwIL.js} +3 -3
- package/cdn/{gesture-element-CG-Sx_5t.js.map → gesture-element-6Ld1YwIL.js.map} +1 -1
- package/cdn/gesture-element-BC48ucj9.js +2 -0
- package/cdn/{gesture-element-BNfMI8eh.js.map → gesture-element-BC48ucj9.js.map} +1 -1
- package/cdn/{hls-js-g1zdcyvE.js → hls-js-BEuVm0u9.js} +3 -2
- package/cdn/{hls-js-g1zdcyvE.js.map → hls-js-BEuVm0u9.js.map} +1 -1
- package/cdn/hls-js-C4P_b2tT.js +2 -0
- package/cdn/{hls-js-6lW7L4th.js.map → hls-js-C4P_b2tT.js.map} +1 -1
- package/cdn/hls-js-CATW7NBm.js +2 -0
- package/cdn/{hls-js-DCQzjzB5.js.map → hls-js-CATW7NBm.js.map} +1 -1
- package/cdn/{hls-js-Cwj8UBx9.js → hls-js-WCNy9MVh.js} +3 -2
- package/cdn/{hls-js-Cwj8UBx9.js.map → hls-js-WCNy9MVh.js.map} +1 -1
- package/cdn/i18n-CE4KxKuj.js +2 -0
- package/cdn/i18n-CE4KxKuj.js.map +1 -0
- package/cdn/{i18n-Mtlmj1AA.js → i18n-Ch4t6EjV.js} +2 -2
- package/cdn/{i18n-Mtlmj1AA.js.map → i18n-Ch4t6EjV.js.map} +1 -1
- package/cdn/i18n-Dc7WM2xd.js +2 -0
- package/cdn/{i18n-DfKGl5Rh.js.map → i18n-Dc7WM2xd.js.map} +1 -1
- package/cdn/i18n-DyF_NfCk.js +157 -0
- package/cdn/i18n-DyF_NfCk.js.map +1 -0
- package/cdn/i18n.dev.js +3 -152
- package/cdn/i18n.dev.js.map +1 -1
- package/cdn/i18n.js +1 -1
- package/cdn/i18n.js.map +1 -1
- package/cdn/{live-button-element-B_y-ZJBy.js → live-button-element-Bae44kBN.js} +5 -4
- package/cdn/live-button-element-Bae44kBN.js.map +1 -0
- package/cdn/live-button-element-DaHgnYdw.js +2 -0
- package/cdn/{live-button-element-CWfkQUoy.js.map → live-button-element-DaHgnYdw.js.map} +1 -1
- package/cdn/live-video-minimal.dev.js +8 -8
- package/cdn/live-video-minimal.dev.js.map +1 -1
- package/cdn/live-video-minimal.js +1 -1
- package/cdn/live-video-minimal.js.map +1 -1
- package/cdn/live-video.dev.js +9 -9
- package/cdn/live-video.dev.js.map +1 -1
- package/cdn/live-video.js +1 -1
- package/cdn/live-video.js.map +1 -1
- package/cdn/locales/bn.dev.js +1 -1
- package/cdn/locales/bn.js +1 -1
- package/cdn/media/background-video.dev.d.ts +1 -0
- package/cdn/media/background-video.dev.js +3 -0
- package/cdn/media/background-video.js +1 -0
- package/cdn/media/cloudflare-video.dev.d.ts +1 -0
- package/cdn/media/cloudflare-video.dev.js +668 -0
- package/cdn/media/cloudflare-video.dev.js.map +1 -0
- package/cdn/media/cloudflare-video.js +2 -0
- package/cdn/media/cloudflare-video.js.map +1 -0
- package/cdn/media/container.dev.d.ts +1 -0
- package/cdn/media/container.dev.js +8 -0
- package/cdn/media/container.dev.js.map +1 -0
- package/cdn/media/container.js +2 -0
- package/cdn/media/container.js.map +1 -0
- package/cdn/media/dash-video.dev.js +2 -1
- package/cdn/media/dash-video.js +2 -2
- package/cdn/media/dash-video.js.map +1 -1
- package/cdn/media/google-cast.dev.js +2 -31
- package/cdn/media/google-cast.dev.js.map +1 -1
- package/cdn/media/google-cast.js +3 -3
- package/cdn/media/google-cast.js.map +1 -1
- package/cdn/media/hls-audio.dev.js +1 -0
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-audio.js.map +1 -1
- package/cdn/media/hls-background-video.dev.js +2 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-background-video.js.map +1 -1
- package/cdn/media/hls-video.dev.js +2 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/hls-video.js.map +1 -1
- package/cdn/media/hlsjs-video.dev.js +2 -1
- package/cdn/media/hlsjs-video.js +1 -1
- package/cdn/media/hlsjs-video.js.map +1 -1
- package/cdn/media/mux-audio/hls-js.dev.js +3 -1
- package/cdn/media/mux-audio/hls-js.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +1 -0
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-audio/spf.js.map +1 -1
- package/cdn/media/mux-audio.dev.js +3 -1
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-background-video.dev.js +2 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-background-video.js.map +1 -1
- package/cdn/media/mux-data.dev.js +2 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +2 -2
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/hls-js.dev.js +3 -1
- package/cdn/media/mux-video/hls-js.js +1 -1
- package/cdn/media/mux-video/spf.dev.js +2 -1
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/mux-video/spf.js.map +1 -1
- package/cdn/media/mux-video.dev.js +3 -1
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/native-hls-video.dev.js +1 -0
- package/cdn/media/native-hls-video.js +1 -1
- package/cdn/media/native-hls-video.js.map +1 -1
- package/cdn/media/spotify-audio.dev.d.ts +1 -0
- package/cdn/media/spotify-audio.dev.js +605 -0
- package/cdn/media/spotify-audio.dev.js.map +1 -0
- package/cdn/media/spotify-audio.js +2 -0
- package/cdn/media/spotify-audio.js.map +1 -0
- package/cdn/media/tiktok-video.dev.d.ts +1 -0
- package/cdn/media/tiktok-video.dev.js +636 -0
- package/cdn/media/tiktok-video.dev.js.map +1 -0
- package/cdn/media/tiktok-video.js +2 -0
- package/cdn/media/tiktok-video.js.map +1 -0
- package/cdn/media/twitch-video.dev.d.ts +1 -0
- package/cdn/media/twitch-video.dev.js +627 -0
- package/cdn/media/twitch-video.dev.js.map +1 -0
- package/cdn/media/twitch-video.js +2 -0
- package/cdn/media/twitch-video.js.map +1 -0
- package/cdn/media/vimeo-video.dev.d.ts +1 -0
- package/cdn/media/vimeo-video.dev.js +2989 -0
- package/cdn/media/vimeo-video.dev.js.map +1 -0
- package/cdn/media/vimeo-video.js +16 -0
- package/cdn/media/vimeo-video.js.map +1 -0
- package/cdn/media/youtube-video.dev.d.ts +1 -0
- package/cdn/media/youtube-video.dev.js +713 -0
- package/cdn/media/youtube-video.dev.js.map +1 -0
- package/cdn/media/youtube-video.js +2 -0
- package/cdn/media/youtube-video.js.map +1 -0
- package/cdn/{media-Cp3acYc8.js → media-BavrGKqa.js} +274 -5
- package/cdn/media-BavrGKqa.js.map +1 -0
- package/cdn/media-Bmablv4g.js +2 -0
- package/cdn/media-Bmablv4g.js.map +1 -0
- package/cdn/{media-B_gQXwri.js → media-COIe3uI5.js} +12 -3
- package/cdn/media-COIe3uI5.js.map +1 -0
- package/cdn/{media-CbWsJJhU.js → media-CPVSKLdk.js} +2 -2
- package/cdn/{media-CbWsJJhU.js.map → media-CPVSKLdk.js.map} +1 -1
- package/cdn/media-CanBm0Jh.js +41 -0
- package/cdn/media-CanBm0Jh.js.map +1 -0
- package/cdn/{media-Dq4zmIJa2.js → media-Dq4zmIJa.js} +1 -1
- package/cdn/media-Dq4zmIJa.js.map +1 -0
- package/cdn/{media-DRo3n8tM.js → media-oa3nyL2o.js} +3 -3
- package/cdn/{media-DRo3n8tM.js.map → media-oa3nyL2o.js.map} +1 -1
- package/cdn/media-played-ranges-CM2zeOGr.js +2 -0
- package/cdn/media-played-ranges-CM2zeOGr.js.map +1 -0
- package/cdn/media-played-ranges-Yd9acuMt.js +156 -0
- package/cdn/media-played-ranges-Yd9acuMt.js.map +1 -0
- package/cdn/{media-suYcjCG22.js → media-suYcjCG2.js} +1 -1
- package/cdn/media-suYcjCG2.js.map +1 -0
- package/cdn/minimal-ui-8iRZf_72.js +2 -0
- package/cdn/{minimal-ui-AFk6Ut5f.js.map → minimal-ui-8iRZf_72.js.map} +1 -1
- package/cdn/{minimal-ui--JsmpU2q.js → minimal-ui-BpHxIo4z.js} +5 -5
- package/cdn/{minimal-ui--JsmpU2q.js.map → minimal-ui-BpHxIo4z.js.map} +1 -1
- package/cdn/{minimal-ui-Bxcpf5Mb.js → minimal-ui-CRKvUmB8.js} +9 -9
- package/cdn/{minimal-ui-Bxcpf5Mb.js.map → minimal-ui-CRKvUmB8.js.map} +1 -1
- package/cdn/minimal-ui-Et2Wcn7r.js +2 -0
- package/cdn/{minimal-ui-BVKu9LWj.js.map → minimal-ui-Et2Wcn7r.js.map} +1 -1
- package/cdn/mixin-BqN0V06a.js +2 -0
- package/cdn/{mixin-DiB7dIef.js.map → mixin-BqN0V06a.js.map} +1 -1
- package/cdn/{mixin-CkNZwQXF.js → mixin-C193v40v.js} +67 -67
- package/cdn/mixin-C193v40v.js.map +1 -0
- package/cdn/noop-BxkeRIz9.js +6 -0
- package/cdn/noop-BxkeRIz9.js.map +1 -0
- package/cdn/noop-Ch0IHcOP.js +2 -0
- package/cdn/noop-Ch0IHcOP.js.map +1 -0
- package/cdn/{player-D4fdOLLk.js → player-B2oraRyD.js} +3 -2
- package/cdn/{player-D4fdOLLk.js.map → player-B2oraRyD.js.map} +1 -1
- package/cdn/player-BRQLp5bX.js +2 -0
- package/cdn/{player-srq1RGTj.js.map → player-BRQLp5bX.js.map} +1 -1
- package/cdn/player-BloX4l6F.js +2 -0
- package/cdn/{player-iIewo8Y9.js.map → player-BloX4l6F.js.map} +1 -1
- package/cdn/{player-B0qnepD5.js → player-CKTAtwit.js} +3 -2
- package/cdn/{player-B0qnepD5.js.map → player-CKTAtwit.js.map} +1 -1
- package/cdn/{player-C4ix6TQq.js → player-DM9rUXg-.js} +3 -2
- package/cdn/{player-C4ix6TQq.js.map → player-DM9rUXg-.js.map} +1 -1
- package/cdn/player-rCFqzWrA.js +2 -0
- package/cdn/{player-B0ccW5-n.js.map → player-rCFqzWrA.js.map} +1 -1
- package/cdn/{poster-element-BP1Ypgbf.js → poster-element-BGr1VQJB.js} +16 -4
- package/cdn/poster-element-BGr1VQJB.js.map +1 -0
- package/cdn/poster-element-DBmgOyep.js +2 -0
- package/cdn/poster-element-DBmgOyep.js.map +1 -0
- package/cdn/script-D3ZkiqwO.js +2 -0
- package/cdn/script-D3ZkiqwO.js.map +1 -0
- package/cdn/script-erPJaaTz.js +33 -0
- package/cdn/script-erPJaaTz.js.map +1 -0
- package/cdn/seek-button-element-FlgBVoGM.js +2 -0
- package/cdn/seek-button-element-FlgBVoGM.js.map +1 -0
- package/cdn/{seek-button-element-TErrbilI.js → seek-button-element-XMTLIxZj.js} +6 -5
- package/cdn/seek-button-element-XMTLIxZj.js.map +1 -0
- package/cdn/{skin-element-wPSb4AAs.js → skin-element-DL-Kqa5f.js} +2 -2
- package/cdn/{skin-element-wPSb4AAs.js.map → skin-element-DL-Kqa5f.js.map} +1 -1
- package/cdn/{skin-element-1_MG2zgS.js → skin-element-DNytI-uu.js} +2 -2
- package/cdn/{skin-element-1_MG2zgS.js.map → skin-element-DNytI-uu.js.map} +1 -1
- package/cdn/{text-element-DTB9_2HX.js → text-element-D88ArbZz.js} +3 -3
- package/cdn/{text-element-DTB9_2HX.js.map → text-element-D88ArbZz.js.map} +1 -1
- package/cdn/text-element-DeWBNKXb.js +2 -0
- package/cdn/{text-element-Bsyglab8.js.map → text-element-DeWBNKXb.js.map} +1 -1
- package/cdn/{time-slider-chapters-element-DPgaLdBt.js → time-slider-chapters-element-DJ0abZXI.js} +5 -4
- package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +1 -0
- package/cdn/time-slider-chapters-element-DW8YyJn8.js +2 -0
- package/cdn/{time-slider-chapters-element-MdlcovBu.js.map → time-slider-chapters-element-DW8YyJn8.js.map} +1 -1
- package/cdn/{translate-text-DP0CzUCC.js → translate-text-BWvoW5-r.js} +2 -7
- package/cdn/translate-text-BWvoW5-r.js.map +1 -0
- package/cdn/translate-text-TzSgu_oe.js +2 -0
- package/cdn/translate-text-TzSgu_oe.js.map +1 -0
- package/cdn/{ui-D0AokGxw.js → ui-BU3_2gDQ.js} +8 -8
- package/cdn/{ui-D0AokGxw.js.map → ui-BU3_2gDQ.js.map} +1 -1
- package/cdn/{ui-p36Szn71.js → ui-BsaWWE4y.js} +10 -10
- package/cdn/{ui-p36Szn71.js.map → ui-BsaWWE4y.js.map} +1 -1
- package/cdn/ui-C0isALTQ.js +2 -0
- package/cdn/{ui-CecDxhTX.js.map → ui-C0isALTQ.js.map} +1 -1
- package/cdn/ui-DVpkE1MN.js +2 -0
- package/cdn/{ui-ChWM6Xz2.js.map → ui-DVpkE1MN.js.map} +1 -1
- package/cdn/video-headless.dev.js +1 -1
- package/cdn/video-headless.js +1 -1
- package/cdn/video-minimal-ui.dev.js +1 -1
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +4 -4
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +1 -1
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +5 -5
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +16 -19
- package/dist/default/define/audio/skin.css +27 -30
- package/dist/default/define/live-audio/minimal-skin.css +16 -19
- package/dist/default/define/live-audio/skin.css +27 -30
- package/dist/default/define/live-video/minimal-skin.css +20 -19
- package/dist/default/define/live-video/skin.css +31 -30
- package/dist/default/define/video/minimal-skin.css +20 -19
- package/dist/default/define/video/skin.css +31 -30
- package/dist/default/media/tiktok-video/media.js +3 -2
- package/dist/default/media/tiktok-video/media.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +6 -6
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +4 -4
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +16 -19
- package/dist/dev/define/audio/skin.css +27 -30
- package/dist/dev/define/live-audio/minimal-skin.css +16 -19
- package/dist/dev/define/live-audio/skin.css +27 -30
- package/dist/dev/define/live-video/minimal-skin.css +20 -19
- package/dist/dev/define/live-video/skin.css +31 -30
- package/dist/dev/define/video/minimal-skin.css +20 -19
- package/dist/dev/define/video/skin.css +31 -30
- package/dist/dev/media/tiktok-video/media.d.ts.map +1 -1
- package/dist/dev/media/tiktok-video/media.js +10 -7
- package/dist/dev/media/tiktok-video/media.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +6 -6
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +4 -4
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/features.md +2 -2
- package/docs/concepts/media-sources.md +79 -1
- package/docs/concepts/skins.md +31 -30
- package/docs/how-to/build-your-own-component.md +1 -1
- package/docs/how-to/customize-skins.md +94 -98
- package/docs/how-to/migrate-from-media-chrome.md +359 -0
- package/docs/how-to/migrate-from-mux-player.md +535 -0
- package/docs/how-to/migrate-from-plyr.md +394 -0
- package/docs/how-to/migrate-from-video-js-8.md +594 -0
- package/docs/llms.txt +9 -0
- package/docs/reference/feature-volume.md +3 -1
- package/docs/reference/mute-button.md +34 -0
- package/docs/reference/volume-slider.md +1 -1
- package/package.json +10 -9
- package/cdn/bn-DdelKD_n.js +0 -108
- package/cdn/bn-DdelKD_n.js.map +0 -1
- package/cdn/bn-YS8ruMcO.js +0 -2
- package/cdn/bn-YS8ruMcO.js.map +0 -1
- package/cdn/compounds-CCvdpvge.js.map +0 -1
- package/cdn/compounds-CJ6SbYAh.js +0 -8
- package/cdn/compounds-CJ6SbYAh.js.map +0 -1
- package/cdn/create-player-BHFyOnWi.js.map +0 -1
- package/cdn/create-player-CbpxjDaZ.js +0 -14
- package/cdn/create-player-CbpxjDaZ.js.map +0 -1
- package/cdn/gesture-element-BNfMI8eh.js +0 -2
- package/cdn/hls-js-6lW7L4th.js +0 -2
- package/cdn/hls-js-DCQzjzB5.js +0 -2
- package/cdn/i18n-DfKGl5Rh.js +0 -2
- package/cdn/live-button-element-B_y-ZJBy.js.map +0 -1
- package/cdn/live-button-element-CWfkQUoy.js +0 -2
- package/cdn/media-5ODYtX1-.js +0 -2
- package/cdn/media-5ODYtX1-.js.map +0 -1
- package/cdn/media-B_gQXwri.js.map +0 -1
- package/cdn/media-CPWNSZFX.js +0 -41
- package/cdn/media-CPWNSZFX.js.map +0 -1
- package/cdn/media-Cp3acYc8.js.map +0 -1
- package/cdn/media-Dq4zmIJa2.js.map +0 -1
- package/cdn/media-suYcjCG22.js.map +0 -1
- package/cdn/minimal-ui-AFk6Ut5f.js +0 -2
- package/cdn/minimal-ui-BVKu9LWj.js +0 -2
- package/cdn/mixin-CkNZwQXF.js.map +0 -1
- package/cdn/mixin-DiB7dIef.js +0 -2
- package/cdn/player-B0ccW5-n.js +0 -2
- package/cdn/player-iIewo8Y9.js +0 -2
- package/cdn/player-srq1RGTj.js +0 -2
- package/cdn/poster-element-BP1Ypgbf.js.map +0 -1
- package/cdn/poster-element-S-rr412t.js +0 -2
- package/cdn/poster-element-S-rr412t.js.map +0 -1
- package/cdn/seek-button-element-DxLmm58Y.js +0 -2
- package/cdn/seek-button-element-DxLmm58Y.js.map +0 -1
- package/cdn/seek-button-element-TErrbilI.js.map +0 -1
- package/cdn/text-element-Bsyglab8.js +0 -2
- package/cdn/time-slider-chapters-element-DPgaLdBt.js.map +0 -1
- package/cdn/time-slider-chapters-element-MdlcovBu.js +0 -2
- package/cdn/translate-text-BPMWpzFm.js +0 -2
- package/cdn/translate-text-BPMWpzFm.js.map +0 -1
- package/cdn/translate-text-DP0CzUCC.js.map +0 -1
- package/cdn/ui-CecDxhTX.js +0 -2
- package/cdn/ui-ChWM6Xz2.js +0 -2
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
# Migrate from Video.js 8
|
|
2
|
+
|
|
3
|
+
Move a Video.js 8 integration to v10, mapping the options object, techs, plugins, and player API onto composed components
|
|
4
|
+
|
|
5
|
+
Same name, different shape. Video.js 8 gives you one function, `videojs()`, and one big options object. You enhance a `<video>` element, pass configuration, and get back a player with a control bar, a plugin system, and a component tree you can reach into.
|
|
6
|
+
|
|
7
|
+
Video.js v10 is a rebuild rather than a release. There’s no `videojs()` call, no options object, and no plugin registry. You compose a player out of a few named pieces instead, and the result is smaller, easier to restyle, and a lot easier to use from React.
|
|
8
|
+
|
|
9
|
+
Caution
|
|
10
|
+
|
|
11
|
+
This isn’t a version bump you can do with a find-and-replace. Plan it as a rewrite of your player setup, and read this guide before you estimate it.
|
|
12
|
+
|
|
13
|
+
Video.js 8 lives on at its [repo](https://github.com/videojs/video.js) and [docs](https://legacy.videojs.org).
|
|
14
|
+
|
|
15
|
+
## Three pieces instead of one
|
|
16
|
+
|
|
17
|
+
In v8 the player was everything: playback, UI, and the skin on top of it. Options configured all three, which is why the options object grew so large.
|
|
18
|
+
|
|
19
|
+
v10 splits those jobs up. Learning the three names first makes the rest of this guide much shorter.
|
|
20
|
+
|
|
21
|
+
**The player** is the outer element. It holds state and hands that state to everything inside it, and it draws nothing. This is the closest thing to a v8 `player` instance, but it owns state rather than DOM. Which state it holds depends on the [features](../concepts/features.md) it’s built from.
|
|
22
|
+
|
|
23
|
+
**The media** is the thing that plays the video. This is where v8’s *tech* went. A plain `<video>` plays progressive files, and there’s a [media component](../concepts/media-sources.md) for HLS, DASH, YouTube, Vimeo, and Mux. Swapping one for another is a tag change, and the rest of your player keeps working.
|
|
24
|
+
|
|
25
|
+
**The skin** is the UI: the controls, the poster, the captions, the settings menu, the keyboard shortcuts. It’s the v8 control bar and skin combined, except [skins](../concepts/skins.md) are plain trees of components you can read and edit rather than a class hierarchy you subclass.
|
|
26
|
+
|
|
27
|
+
So a v8 embed becomes a player wrapped around a skin wrapped around a media:
|
|
28
|
+
|
|
29
|
+
html
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
<video-player>
|
|
33
|
+
<video-skin>
|
|
34
|
+
<video src="/video.mp4"></video>
|
|
35
|
+
</video-skin>
|
|
36
|
+
</video-player>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Most of this guide is about which of those three a given v8 option now belongs to.
|
|
40
|
+
|
|
41
|
+
## Your first player
|
|
42
|
+
|
|
43
|
+
Here’s a standard v8 setup: one file, captions, a poster, and the default skin.
|
|
44
|
+
|
|
45
|
+
html
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
<link href="https://vjs.zencdn.net/8.x/video-js.css" rel="stylesheet" />
|
|
49
|
+
|
|
50
|
+
<video
|
|
51
|
+
id="my-video"
|
|
52
|
+
class="video-js"
|
|
53
|
+
controls
|
|
54
|
+
preload="auto"
|
|
55
|
+
poster="/poster.jpg"
|
|
56
|
+
data-setup="{}"
|
|
57
|
+
>
|
|
58
|
+
<source src="/video.mp4" type="video/mp4" />
|
|
59
|
+
<track kind="captions" src="/captions/en.vtt" srclang="en" label="English" default />
|
|
60
|
+
</video>
|
|
61
|
+
|
|
62
|
+
<script src="https://vjs.zencdn.net/8.x/video.min.js"></script>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
v10 ships web components, so the migration keeps its declarative feel. One script from the CDN gives you the video [preset](../concepts/presets.md): a player, a skin, and a media element that already fit together.
|
|
66
|
+
|
|
67
|
+
html
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html/cdn/video.js"></script>
|
|
71
|
+
|
|
72
|
+
<video-player>
|
|
73
|
+
<video-skin class="aspect-video">
|
|
74
|
+
<video src="/video.mp4" preload="auto" playsinline>
|
|
75
|
+
<track kind="captions" src="/captions/en.vtt" srclang="en" label="English" default />
|
|
76
|
+
<track kind="metadata" src="/storyboard.vtt" label="thumbnails" default />
|
|
77
|
+
</video>
|
|
78
|
+
|
|
79
|
+
<img slot="poster" src="/poster.jpg" alt="" />
|
|
80
|
+
</video-skin>
|
|
81
|
+
</video-player>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
With a bundler, the same thing is three imports:
|
|
85
|
+
|
|
86
|
+
js
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
import '@videojs/html/video/player';
|
|
90
|
+
import '@videojs/html/video/skin';
|
|
91
|
+
import '@videojs/html/video/skin.css';
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Four differences worth understanding, because each one is a pattern you’ll see again:
|
|
95
|
+
|
|
96
|
+
* **No `class="video-js"`, no `data-setup`, no `videojs()` call.** The custom elements register themselves and wire up when the browser upgrades them. Nothing scans the page looking for players.
|
|
97
|
+
* **No `controls` attribute.** The skin *is* the controls. Including a skin is how you ask for them, which is also how you opt out: leave it out and you get a player with no UI.
|
|
98
|
+
* **The poster is a slotted image, not an attribute.** That’s what lets the skin control how it appears, rather than the browser.
|
|
99
|
+
* **Your `<track>` elements don’t change.** Captions, subtitles, chapters, and thumbnails are all still tracks, and the skin shows the matching controls when it finds them.
|
|
100
|
+
|
|
101
|
+
There’s also a minimal skin, closer to v8’s control bar if the default’s frosted look is too much of a change. Swap `cdn/video.js` for `cdn/video-minimal.js`.
|
|
102
|
+
|
|
103
|
+
## Where your options went
|
|
104
|
+
|
|
105
|
+
The v8 options object is gone, and its contents scattered in four directions. This is the biggest conceptual step, so it’s worth understanding the four buckets before you go looking for a specific option.
|
|
106
|
+
|
|
107
|
+
1. **Media attributes.** Anything the browser itself understands stays exactly where it was, on your media element.
|
|
108
|
+
2. **Skin attributes.** The poster belongs to the skin, because the skin is what paints it.
|
|
109
|
+
3. **Your CSS.** Sizing, aspect ratio, and responsive behavior are layout, and layout is yours.
|
|
110
|
+
4. **Composition.** Which controls exist, which shortcuts fire, which language you’re in. You express these by choosing components rather than by setting flags.
|
|
111
|
+
|
|
112
|
+
### Media attributes
|
|
113
|
+
|
|
114
|
+
Port these across untouched. They’re native attributes and always were.
|
|
115
|
+
|
|
116
|
+
Video.js 8
|
|
117
|
+
|
|
118
|
+
Video.js v10
|
|
119
|
+
|
|
120
|
+
`autoplay`, `muted`, `loop`, `preload`, `playsinline`, `crossorigin`
|
|
121
|
+
|
|
122
|
+
the same attributes on your media
|
|
123
|
+
|
|
124
|
+
`sources: [{ src, type }]`
|
|
125
|
+
|
|
126
|
+
`src`, or `<source>` children for progressive fallback
|
|
127
|
+
|
|
128
|
+
`disablePictureInPicture`
|
|
129
|
+
|
|
130
|
+
`disablepictureinpicture`
|
|
131
|
+
|
|
132
|
+
### Skin attributes
|
|
133
|
+
|
|
134
|
+
Video.js 8
|
|
135
|
+
|
|
136
|
+
Video.js v10
|
|
137
|
+
|
|
138
|
+
`poster`
|
|
139
|
+
|
|
140
|
+
the skin’s poster
|
|
141
|
+
|
|
142
|
+
`posterImage: false`
|
|
143
|
+
|
|
144
|
+
leave the poster unset
|
|
145
|
+
|
|
146
|
+
the title in `TitleBar`
|
|
147
|
+
|
|
148
|
+
`content-title` on the player, with no built-in UI yet
|
|
149
|
+
|
|
150
|
+
The poster belongs to the skin rather than the media, which is what lets the skin control how it appears:
|
|
151
|
+
|
|
152
|
+
html
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
<video-skin>
|
|
156
|
+
<video src="/video.mp4"></video>
|
|
157
|
+
<img slot="poster" src="/poster.jpg" alt="" />
|
|
158
|
+
</video-skin>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
`content-title` is the closest thing to v8’s `TitleBar`, and it does reach player state, so your own UI can read it. No packaged skin draws it, so v8’s `TitleBar` has no visual equivalent ([#1123](https://github.com/videojs/v10/issues/1123)). See the [Poster](../reference/poster.md) reference for the poster component itself.
|
|
162
|
+
|
|
163
|
+
### Your CSS
|
|
164
|
+
|
|
165
|
+
v8 had a small sizing language of its own. v10 doesn’t, because CSS already has one.
|
|
166
|
+
|
|
167
|
+
Video.js 8
|
|
168
|
+
|
|
169
|
+
Video.js v10
|
|
170
|
+
|
|
171
|
+
`fluid: true`
|
|
172
|
+
|
|
173
|
+
`width: 100%` on the skin
|
|
174
|
+
|
|
175
|
+
`responsive: true`
|
|
176
|
+
|
|
177
|
+
the skins already adapt their layout to their own width
|
|
178
|
+
|
|
179
|
+
`aspectRatio: '16:9'`
|
|
180
|
+
|
|
181
|
+
`aspect-ratio: 16 / 9`
|
|
182
|
+
|
|
183
|
+
`width`, `height`
|
|
184
|
+
|
|
185
|
+
`width`, `height`
|
|
186
|
+
|
|
187
|
+
`fill: true`
|
|
188
|
+
|
|
189
|
+
`width: 100%; height: 100%`
|
|
190
|
+
|
|
191
|
+
`breakpoints`
|
|
192
|
+
|
|
193
|
+
the skins use container queries internally; use your own for your layout
|
|
194
|
+
|
|
195
|
+
### Composition
|
|
196
|
+
|
|
197
|
+
These are the ones that need a decision rather than a rename, so each has a section below.
|
|
198
|
+
|
|
199
|
+
Video.js 8
|
|
200
|
+
|
|
201
|
+
Where it lives now
|
|
202
|
+
|
|
203
|
+
`techOrder`, `html5.vhs.*`
|
|
204
|
+
|
|
205
|
+
[Techs become media components](#techs-become-media-components)
|
|
206
|
+
|
|
207
|
+
`children`, `controlBar: { … }`
|
|
208
|
+
|
|
209
|
+
[Customize your player](#customize-your-player)
|
|
210
|
+
|
|
211
|
+
`userActions.hotkeys`, `userActions.click`, `userActions.doubleClick`
|
|
212
|
+
|
|
213
|
+
[Customize your player](#customize-your-player)
|
|
214
|
+
|
|
215
|
+
`plugins`, `videojs.registerPlugin`
|
|
216
|
+
|
|
217
|
+
[Plugins](#plugins)
|
|
218
|
+
|
|
219
|
+
`languages`, `language`, `videojs.addLanguage`
|
|
220
|
+
|
|
221
|
+
[Languages](#languages)
|
|
222
|
+
|
|
223
|
+
`liveui`, `liveTracker`
|
|
224
|
+
|
|
225
|
+
[Live and audio-only](#live-and-audio-only)
|
|
226
|
+
|
|
227
|
+
`audioOnlyMode`, `audioPosterMode`
|
|
228
|
+
|
|
229
|
+
[Live and audio-only](#live-and-audio-only)
|
|
230
|
+
|
|
231
|
+
`playbackRates`
|
|
232
|
+
|
|
233
|
+
not configurable yet ([#1404](https://github.com/videojs/v10/issues/1404))
|
|
234
|
+
|
|
235
|
+
`textTrackSettings`
|
|
236
|
+
|
|
237
|
+
no equivalent; see [Known gaps](#known-gaps)
|
|
238
|
+
|
|
239
|
+
`spatialNavigation`
|
|
240
|
+
|
|
241
|
+
no equivalent; see [Known gaps](#known-gaps)
|
|
242
|
+
|
|
243
|
+
`inactivityTimeout`
|
|
244
|
+
|
|
245
|
+
not configurable yet ([#1728](https://github.com/videojs/v10/issues/1728))
|
|
246
|
+
|
|
247
|
+
`errorDisplay`, `notSupportedMessage`
|
|
248
|
+
|
|
249
|
+
the skins include an error dialog
|
|
250
|
+
|
|
251
|
+
## Techs become media components
|
|
252
|
+
|
|
253
|
+
v8’s tech system was one of its harder ideas: an abstraction layer with a registry, a resolution order, and source handlers on top. Getting HLS meant getting VHS, which meant reasoning about `overrideNative` and hoping the right thing won.
|
|
254
|
+
|
|
255
|
+
v10 replaces the whole mechanism with a choice you make in markup. You pick the [media component](../concepts/media-sources.md) that plays your format, and that’s the tech decision.
|
|
256
|
+
|
|
257
|
+
What you’re playing
|
|
258
|
+
|
|
259
|
+
Video.js 8
|
|
260
|
+
|
|
261
|
+
Video.js v10
|
|
262
|
+
|
|
263
|
+
MP4, WebM
|
|
264
|
+
|
|
265
|
+
`techOrder: ['html5']`
|
|
266
|
+
|
|
267
|
+
a plain `<video>`
|
|
268
|
+
|
|
269
|
+
HLS
|
|
270
|
+
|
|
271
|
+
VHS
|
|
272
|
+
|
|
273
|
+
[HLS video](../reference/hls-video.md)
|
|
274
|
+
|
|
275
|
+
HLS, needing hls.js directly
|
|
276
|
+
|
|
277
|
+
`videojs.Vhs`
|
|
278
|
+
|
|
279
|
+
[hls.js video](../reference/hlsjs-video.md)
|
|
280
|
+
|
|
281
|
+
HLS, native only
|
|
282
|
+
|
|
283
|
+
`html5.vhs.overrideNative: false`
|
|
284
|
+
|
|
285
|
+
[native HLS video](../reference/native-hls-video.md)
|
|
286
|
+
|
|
287
|
+
DASH
|
|
288
|
+
|
|
289
|
+
VHS
|
|
290
|
+
|
|
291
|
+
[DASH video](../reference/dash-video.md)
|
|
292
|
+
|
|
293
|
+
YouTube, Vimeo
|
|
294
|
+
|
|
295
|
+
a tech plugin
|
|
296
|
+
|
|
297
|
+
the YouTube and Vimeo components
|
|
298
|
+
|
|
299
|
+
Mux
|
|
300
|
+
|
|
301
|
+
a tech plugin
|
|
302
|
+
|
|
303
|
+
[Mux Video](../reference/mux-video.md)
|
|
304
|
+
|
|
305
|
+
Each needs its own import.
|
|
306
|
+
|
|
307
|
+
For HLS from the CDN:
|
|
308
|
+
|
|
309
|
+
html
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/html/cdn/media/hls-video.js"></script>
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Then swap the tag:
|
|
316
|
+
|
|
317
|
+
html
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
<video-player>
|
|
321
|
+
<video-skin>
|
|
322
|
+
<hls-video src="/stream.m3u8" playsinline></hls-video>
|
|
323
|
+
</video-skin>
|
|
324
|
+
</video-player>
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Two things to know when you pick between the HLS options. The default HLS component runs on SPF, Video.js’s own playback engine, and it’s the reason v10 can be as small as it is. The hls.js one is a much larger download but supports more, including TS-packaged media and DRM. Start with the default and move to hls.js if you hit something it doesn’t handle.
|
|
328
|
+
|
|
329
|
+
Your VHS tuning options don’t have direct equivalents. Rendition capping, bandwidth hints, and the rest are engine-specific, so they belong to whichever engine you chose rather than to a shared options object.
|
|
330
|
+
|
|
331
|
+
## Customize your player
|
|
332
|
+
|
|
333
|
+
In v8, customizing meant three different techniques depending on what you wanted: options for some things, `addChild` and component subclassing for others, and CSS overrides on `.vjs-*` selectors for the look. v10 has one path with three levels of commitment. Try them in order.
|
|
334
|
+
|
|
335
|
+
### Level 1: pick a skin
|
|
336
|
+
|
|
337
|
+
The default skin is a modern, frosted look. The minimal skin is closer to v8’s control bar. Both bring controls, tooltips, captions, keyboard shortcuts, touch gestures, and a settings menu that appears when there’s something to put in it. See [Skins](../concepts/skins.md).
|
|
338
|
+
|
|
339
|
+
Both also include AirPlay and [Cast](../concepts/cast.md) buttons, which v8 had no answer for. Remote playback is a feature you compose in rather than a plugin you install.
|
|
340
|
+
|
|
341
|
+
### Level 2: restyle it
|
|
342
|
+
|
|
343
|
+
v8 customization meant writing selectors against internal class names and hoping they survived the next release. v10 skins expose custom properties instead, which are part of the public surface:
|
|
344
|
+
|
|
345
|
+
css
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
/* Video.js 8 */
|
|
349
|
+
.video-js .vjs-play-progress {
|
|
350
|
+
background-color: rebeccapurple;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* Video.js v10 */
|
|
354
|
+
video-player {
|
|
355
|
+
--media-accent-color: rebeccapurple;
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
`--media-accent-color` reaches the sliders, the active buttons, and the accent surfaces at once. Video.js derives a readable text color to sit on top of it; override that with `--media-accent-text-color` if you’d rather choose. `--media-border-radius` rounds the player, and `--media-scale-unit` scales the whole control bar, which is the closest thing to v8’s `font-size` trick for sizing controls. [Customize skins](./customize-skins.md) has the full list.
|
|
360
|
+
|
|
361
|
+
### Level 3: eject
|
|
362
|
+
|
|
363
|
+
**Ejecting** means copying the skin’s source into your project and editing it, the way you would a shadcn component. The packaged skin isn’t compiled magic; it’s a tree of components, so ejecting starts as copy and paste. [Customize skins](./customize-skins.md) has copy-paste-ready implementations for every packaged skin.
|
|
364
|
+
|
|
365
|
+
This is where v8’s `controlBar` config and `addChild` calls end up, and honestly it’s the better trade. Instead of `controlBar: { pictureInPictureToggle: false }`, you delete a line. Instead of subclassing a component to change its behavior, you edit the markup.
|
|
366
|
+
|
|
367
|
+
Swap the skin import for `video/ui`, which registers the player, the container, and every UI element without wrapping them in a skin:
|
|
368
|
+
|
|
369
|
+
js
|
|
370
|
+
|
|
371
|
+
```
|
|
372
|
+
import '@videojs/html/video/ui';
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Then write the layout yourself:
|
|
376
|
+
|
|
377
|
+
html
|
|
378
|
+
|
|
379
|
+
```
|
|
380
|
+
<video-player>
|
|
381
|
+
<media-container>
|
|
382
|
+
<video src="/video.mp4" playsinline></video>
|
|
383
|
+
|
|
384
|
+
<media-poster><img src="/poster.jpg" alt="" decoding="async" /></media-poster>
|
|
385
|
+
|
|
386
|
+
<media-controls>
|
|
387
|
+
<media-play-button></media-play-button>
|
|
388
|
+
<media-mute-button></media-mute-button>
|
|
389
|
+
<media-volume-slider></media-volume-slider>
|
|
390
|
+
<media-time type="current"></media-time>
|
|
391
|
+
<media-time-slider>
|
|
392
|
+
<media-slider-track>
|
|
393
|
+
<media-slider-fill></media-slider-fill>
|
|
394
|
+
<media-slider-buffer></media-slider-buffer>
|
|
395
|
+
</media-slider-track>
|
|
396
|
+
<media-slider-thumb></media-slider-thumb>
|
|
397
|
+
</media-time-slider>
|
|
398
|
+
<media-time type="duration"></media-time>
|
|
399
|
+
<media-fullscreen-button></media-fullscreen-button>
|
|
400
|
+
<!-- No media-pip-button, so no picture-in-picture control renders. -->
|
|
401
|
+
</media-controls>
|
|
402
|
+
|
|
403
|
+
<media-hotkey keys="Space" action="togglePaused"></media-hotkey>
|
|
404
|
+
<media-hotkey keys="f" action="toggleFullscreen"></media-hotkey>
|
|
405
|
+
<media-hotkey keys="ArrowRight" action="seekStep" value="5"></media-hotkey>
|
|
406
|
+
<media-hotkey keys="ArrowLeft" action="seekStep" value="-5"></media-hotkey>
|
|
407
|
+
|
|
408
|
+
<media-gesture type="tap" action="togglePaused" pointer="mouse" region="center"></media-gesture>
|
|
409
|
+
</media-container>
|
|
410
|
+
</video-player>
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
Those hotkey and gesture declarations are where `userActions` went. v8’s `userActions.hotkeys` was a function you wrote; here each shortcut is a component with a key and an action, and `userActions.click` and `doubleClick` become gestures with a region. The packaged skins already include a sensible set of both, which is why you don’t see them in the earlier examples.
|
|
414
|
+
|
|
415
|
+
Ejecting is also where you take on the skin’s CSS. The packaged skins ship styles for everything above; a bare layout renders unstyled until you bring those along, which is why [Customize skins](./customize-skins.md) hands you the CSS next to the markup.
|
|
416
|
+
|
|
417
|
+
## Plugins
|
|
418
|
+
|
|
419
|
+
v10 has no plugin system. There’s no `videojs.registerPlugin`, no `player.myPlugin()`, and no plugin lifecycle.
|
|
420
|
+
|
|
421
|
+
That’s a deliberate choice rather than a missing feature. v8 plugins existed largely because there was no other way in: to add a control, change a behavior, or support a format, you had to reach into player internals through the one door the plugin API provided. v10 gives you the front door instead: components you can add, skins you can eject, media elements you can swap. Most of what plugins did is now ordinary composition.
|
|
422
|
+
|
|
423
|
+
Audit your plugins and sort them into four piles:
|
|
424
|
+
|
|
425
|
+
* **Formats and techs** (`videojs-contrib-*`, YouTube, Vimeo, Mux). Replace with the matching media component. See [Techs become media components](#techs-become-media-components).
|
|
426
|
+
* **UI additions** (extra buttons, overlays, custom control bars). Rebuild as components in an ejected skin, or with [your own component](./build-your-own-component.md). This is usually less code than the plugin was.
|
|
427
|
+
* **Workarounds** for v8 limitations. Check whether the limitation still exists before you port anything.
|
|
428
|
+
* **Genuinely missing features** (ads, playlists). These need real work, and some have no home yet. Get them on the list early, because they’ll drive your timeline.
|
|
429
|
+
|
|
430
|
+
That last pile is the honest risk in a v8 migration. If your player depends on an ads plugin, there’s no v10 answer today.
|
|
431
|
+
|
|
432
|
+
## Read player state
|
|
433
|
+
|
|
434
|
+
### Events
|
|
435
|
+
|
|
436
|
+
Your media element is a real media element, so every event you already listen for still fires on it. The listeners port directly; only where you attach them changes.
|
|
437
|
+
|
|
438
|
+
js
|
|
439
|
+
|
|
440
|
+
```
|
|
441
|
+
// Video.js 8
|
|
442
|
+
const player = videojs('my-video');
|
|
443
|
+
player.on('timeupdate', () => console.log(player.currentTime()));
|
|
444
|
+
|
|
445
|
+
// Video.js v10
|
|
446
|
+
const video = document.querySelector('video');
|
|
447
|
+
video.addEventListener('timeupdate', () => console.log(video.currentTime));
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
One category doesn’t survive that translation, because those were never media events. v8’s UI events (`useractive`, `userinactive`, `playerresize`, `texttrackchange`) were the player’s own. Read the equivalent from player state instead.
|
|
451
|
+
|
|
452
|
+
### Player state
|
|
453
|
+
|
|
454
|
+
Use [`PlayerController`](../reference/player-controller.md) inside a custom element. Give it a selector for the feature you care about and it keeps your element in sync as that state changes:
|
|
455
|
+
|
|
456
|
+
js
|
|
457
|
+
|
|
458
|
+
```
|
|
459
|
+
import { PlayerController, playerContext, ReactiveElement, selectTime } from '@videojs/html';
|
|
460
|
+
|
|
461
|
+
class MyElapsed extends ReactiveElement {
|
|
462
|
+
#time = new PlayerController(this, playerContext, selectTime);
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Drive playback
|
|
467
|
+
|
|
468
|
+
v8 used accessor methods for everything: `player.currentTime()` to read, `player.currentTime(10)` to write. v10 splits the difference by owner. Anything the browser owns you set on the media, as a plain property. Anything it doesn’t — fullscreen, captions, quality — goes through the player, because the player is what tracks it.
|
|
469
|
+
|
|
470
|
+
Video.js 8
|
|
471
|
+
|
|
472
|
+
Video.js v10
|
|
473
|
+
|
|
474
|
+
`player.play()`, `player.pause()`
|
|
475
|
+
|
|
476
|
+
`media.play()`, `media.pause()`, or the player’s `togglePaused`
|
|
477
|
+
|
|
478
|
+
`player.currentTime()` / `player.currentTime(10)`
|
|
479
|
+
|
|
480
|
+
`media.currentTime`
|
|
481
|
+
|
|
482
|
+
`player.duration()`
|
|
483
|
+
|
|
484
|
+
`media.duration`, or `duration` in player state
|
|
485
|
+
|
|
486
|
+
`player.volume()`, `player.muted()`
|
|
487
|
+
|
|
488
|
+
`media.volume`, `media.muted`
|
|
489
|
+
|
|
490
|
+
`player.playbackRate()`
|
|
491
|
+
|
|
492
|
+
`media.playbackRate`, or the player’s `setPlaybackRate`
|
|
493
|
+
|
|
494
|
+
`player.src({ src, type })`
|
|
495
|
+
|
|
496
|
+
set `src` on the media
|
|
497
|
+
|
|
498
|
+
`player.requestFullscreen()`, `exitFullscreen()`
|
|
499
|
+
|
|
500
|
+
the player’s `enterFullscreen`, `exitFullscreen`, `toggleFullscreen`
|
|
501
|
+
|
|
502
|
+
`player.textTracks()`, `addRemoteTextTrack()`
|
|
503
|
+
|
|
504
|
+
`<track>` elements, and `textTrackList` in player state
|
|
505
|
+
|
|
506
|
+
`player.audioTracks()`
|
|
507
|
+
|
|
508
|
+
`audioTracks` in player state
|
|
509
|
+
|
|
510
|
+
`player.error()`
|
|
511
|
+
|
|
512
|
+
`error` in player state
|
|
513
|
+
|
|
514
|
+
`player.dispose()`
|
|
515
|
+
|
|
516
|
+
remove the element, or unmount the component
|
|
517
|
+
|
|
518
|
+
`player.tech()`
|
|
519
|
+
|
|
520
|
+
`.host.engine` on engine-backed media, where one exists
|
|
521
|
+
|
|
522
|
+
`videojs.getPlayer(id)`
|
|
523
|
+
|
|
524
|
+
hold a reference to the element
|
|
525
|
+
|
|
526
|
+
Swapping sources is the change most likely to surprise you. There’s no `player.src()`; you set `src` on the media element, or replace the media element entirely, and the UI follows. Changing formats is changing tags.
|
|
527
|
+
|
|
528
|
+
## Languages
|
|
529
|
+
|
|
530
|
+
v8 shipped one language and asked you to register more with `videojs.addLanguage`. v10 ships locale packs for around 50 languages, so most apps need no setup at all. See [Internationalization](../concepts/i18n.md).
|
|
531
|
+
|
|
532
|
+
To override individual strings:
|
|
533
|
+
|
|
534
|
+
js
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
import { registerI18n } from '@videojs/html/i18n';
|
|
538
|
+
|
|
539
|
+
registerI18n('en', {
|
|
540
|
+
buttons: { play: 'Start video', pause: 'Pause video' },
|
|
541
|
+
menu: { settings: 'Options' },
|
|
542
|
+
});
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
See [Override translations](./i18n-override-translations.md).
|
|
546
|
+
|
|
547
|
+
## Live and audio-only
|
|
548
|
+
|
|
549
|
+
v8 turned live UI on with a `liveui` flag, and audio-only on with `audioOnlyMode`. In v10 these are different players with different skins, because live and audio-only have different state and a genuinely different UI. See [Presets](../concepts/presets.md).
|
|
550
|
+
|
|
551
|
+
html
|
|
552
|
+
|
|
553
|
+
```
|
|
554
|
+
<live-video-player>
|
|
555
|
+
<live-video-skin>
|
|
556
|
+
<hls-video src="/live.m3u8"></hls-video>
|
|
557
|
+
</live-video-skin>
|
|
558
|
+
</live-video-player>
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
For audio, use the audio player with the audio skin, or the live audio pair. There’s also a background video player for muted, chrome-free background video, which v8 had no answer for.
|
|
562
|
+
|
|
563
|
+
You get `streamType`, `targetLiveWindow`, and `liveEdgeStart` in state, plus a live button that jumps to the live edge. v8’s `liveTracker` tuning has no equivalent ([#1730](https://github.com/videojs/v10/issues/1730)).
|
|
564
|
+
|
|
565
|
+
The live composition is deliberately narrower than the video one. It leaves out playback rate, quality, and audio-track state, so those controls don’t appear in a live skin’s settings menu. If you need one of them on a live player, build your own player from a feature list rather than taking the preset’s.
|
|
566
|
+
|
|
567
|
+
That’s what [`createPlayer`](../reference/html-create-player.md) is for. Hand it a feature list and you get back the mixins to define your own player element.
|
|
568
|
+
|
|
569
|
+
## Known gaps
|
|
570
|
+
|
|
571
|
+
Ordered roughly by how likely each is to block a v8 migration.
|
|
572
|
+
|
|
573
|
+
* **No ads support.** v8’s IMA and ad-plugin ecosystem has no v10 equivalent. This is the most common hard blocker.
|
|
574
|
+
* **No playlist support.** No `videojs-playlist` equivalent.
|
|
575
|
+
* **No plugin system**, by design. Budget for rebuilding UI plugins as components. See [Plugins](#plugins).
|
|
576
|
+
* No skin draws `content-title`, so v8’s `TitleBar` has no visual equivalent ([#1123](https://github.com/videojs/v10/issues/1123)).
|
|
577
|
+
* Playback rates are a fixed set — `0.2`, `0.5`, `0.7`, `1`, `1.2`, `1.5`, `1.7`, `2` — so v8’s `playbackRates` has no equivalent yet ([#1404](https://github.com/videojs/v10/issues/1404)).
|
|
578
|
+
* No text-track settings dialog. v8’s `textTrackSettings` let viewers restyle captions; v10 exposes only the positioning custom properties its skins define.
|
|
579
|
+
* No spatial navigation. v8’s `spatialNavigation` for TV and D-pad remotes has no equivalent.
|
|
580
|
+
* Nothing persists between sessions: volume, captions language, speed, quality. That’s out of scope for GA ([#944](https://github.com/videojs/v10/issues/944)). Default subtitle language is tracked at [#1423](https://github.com/videojs/v10/issues/1423).
|
|
581
|
+
* No VHS-equivalent tuning surface. Engine settings belong to the engine you chose, and the default HLS component deliberately exposes few of them.
|
|
582
|
+
* Chapters render in the time slider from a `<track kind="chapters">`, but there’s no chapter menu to navigate from and no active-chapter state, so v8’s chapters menu has no equivalent ([#1873](https://github.com/videojs/v10/issues/1873)). Cue points aren’t implemented ([#1442](https://github.com/videojs/v10/issues/1442)).
|
|
583
|
+
* The controls auto-hide delay isn’t configurable, so v8’s `inactivityTimeout` has no equivalent ([#1728](https://github.com/videojs/v10/issues/1728)).
|
|
584
|
+
* No full-window fullscreen fallback. v8 had one for browsers without the Fullscreen API; [support is around 96%](https://caniuse.com/fullscreen) now.
|
|
585
|
+
* Multiple `<source>` elements with `size` metadata don’t become a quality menu. Use HLS or DASH for adaptive quality; picking renditions by resolution won’t be added ([#1415](https://github.com/videojs/v10/issues/1415)).
|
|
586
|
+
* Two skins, and no runtime theme switch.
|
|
587
|
+
* Native controls are not automatically removed when custom controls load ([#1160](https://github.com/videojs/v10/issues/1160)).
|
|
588
|
+
* Smaller conveniences without homes yet: debug mode ([#1406](https://github.com/videojs/v10/issues/1406)) and autoplay with a muted fallback ([#1039](https://github.com/videojs/v10/issues/1039)).
|
|
589
|
+
|
|
590
|
+
## See also
|
|
591
|
+
|
|
592
|
+
* [Features](../concepts/features.md) and [Presets](../concepts/presets.md)
|
|
593
|
+
* [Media sources](../concepts/media-sources.md)
|
|
594
|
+
* [Skins](../concepts/skins.md) and [Customize skins](./customize-skins.md)
|
package/docs/llms.txt
CHANGED
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
Installation, project setup, and introductory guides.
|
|
6
6
|
|
|
7
7
|
- [Installation](./how-to/installation.md): Install Video.js and build your first player with streaming support and accessible controls
|
|
8
|
+
### Migrate to Video.js 10
|
|
9
|
+
|
|
10
|
+
Guides for moving an existing player integration to Video.js v10, one per player you might be coming from.
|
|
11
|
+
|
|
12
|
+
- [Migrate from Video.js 8](./how-to/migrate-from-video-js-8.md): Move a Video.js 8 integration to v10, mapping the options object, techs, plugins, and player API onto composed components
|
|
13
|
+
- [Migrate from Mux Player](./how-to/migrate-from-mux-player.md): Move a Mux Player embed to Video.js v10, splitting one element into a player, a media, and a skin
|
|
14
|
+
- [Migrate from Plyr](./how-to/migrate-from-plyr.md): Move an existing Plyr integration to Video.js v10, mapping Plyr options and its instance API onto components and player state
|
|
15
|
+
- [Migrate from Media Chrome](./how-to/migrate-from-media-chrome.md): Map Media Chrome's controller, elements, and attributes onto Video.js v10, where most of the work is renaming and reshaping rather than rewriting
|
|
16
|
+
|
|
8
17
|
- [Why Video.js?](./concepts/why-videojs.md): The open-source video player for React and HTML. Lightweight, accessible components built for performance and streaming.
|
|
9
18
|
- [Overview](./concepts/overview.md): How Video.js players are structured — state, UI, and media
|
|
10
19
|
- [Build with AI](./how-to/build-with-ai.md): How to give AI tools the context they need to build Video.js players alongside you
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Volume level and mute state for the player store
|
|
4
4
|
|
|
5
|
-
Controls volume level and mute state.
|
|
5
|
+
Controls volume level and mute state. These capabilities have independent availability values because media can support mute without supporting volume-level changes.
|
|
6
6
|
|
|
7
7
|
## API Reference
|
|
8
8
|
|
|
@@ -86,6 +86,8 @@ Toggle mute state. Returns the new muted value.
|
|
|
86
86
|
|
|
87
87
|
Pass `selectVolume` to [`PlayerController`](./player-controller.md) to subscribe to volume state. Returns `undefined` if the volume feature is not configured.
|
|
88
88
|
|
|
89
|
+
Check `volumeAvailability` before showing a volume-level control, and check `mutedAvailability` before showing a mute control.
|
|
90
|
+
|
|
89
91
|
volume-slider.ts
|
|
90
92
|
|
|
91
93
|
```
|
|
@@ -14,8 +14,40 @@ html
|
|
|
14
14
|
|
|
15
15
|
Toggles mute on and off, and exposes a derived `volumeLevel` based on the current volume and mute state.
|
|
16
16
|
|
|
17
|
+
Mute availability is separate from volume-level availability because some media can accept a mute command without supporting volume changes. When mute is unavailable or unsupported, the HTML custom element receives the native `hidden` attribute and the React component returns `null`. Toggling is also ignored while mute is unavailable.
|
|
18
|
+
|
|
17
19
|
## Styling
|
|
18
20
|
|
|
21
|
+
Attribute
|
|
22
|
+
|
|
23
|
+
Values
|
|
24
|
+
|
|
25
|
+
Description
|
|
26
|
+
|
|
27
|
+
`data-muted`
|
|
28
|
+
|
|
29
|
+
Present / absent
|
|
30
|
+
|
|
31
|
+
Present when the media is muted
|
|
32
|
+
|
|
33
|
+
`data-volume-level`
|
|
34
|
+
|
|
35
|
+
`"off"` | `"low"` | `"medium"` | `"high"`
|
|
36
|
+
|
|
37
|
+
Current volume level
|
|
38
|
+
|
|
39
|
+
`data-availability`
|
|
40
|
+
|
|
41
|
+
`"available"` | `"unavailable"` | `"unsupported"`
|
|
42
|
+
|
|
43
|
+
Whether the media can be muted
|
|
44
|
+
|
|
45
|
+
`data-hidden`
|
|
46
|
+
|
|
47
|
+
Present / absent
|
|
48
|
+
|
|
49
|
+
Present on the HTML element while mute is unavailable or unsupported
|
|
50
|
+
|
|
19
51
|
Style the button based on muted state:
|
|
20
52
|
|
|
21
53
|
css
|
|
@@ -36,6 +68,8 @@ media-mute-button[data-volume-level="medium"] .icon-medium { display: inline; }
|
|
|
36
68
|
media-mute-button[data-volume-level="high"] .icon-high { display: inline; }
|
|
37
69
|
```
|
|
38
70
|
|
|
71
|
+
Unavailable and unsupported buttons are hidden automatically. No availability selector or extra hiding CSS is required.
|
|
72
|
+
|
|
39
73
|
## Accessibility
|
|
40
74
|
|
|
41
75
|
Renders a `<button>` with an automatic `aria-label`: “Unmute” when muted, “Mute” when unmuted. Override with the `label` prop. Keyboard activation: Enter / Space.
|
|
@@ -12,7 +12,7 @@ html
|
|
|
12
12
|
|
|
13
13
|
## Behavior
|
|
14
14
|
|
|
15
|
-
Controls the media volume level. The slider maps its 0–100 internal range to the media’s 0–1 volume scale. When the media is muted, the fill level drops to 0 regardless of the stored volume value. When
|
|
15
|
+
Controls the media volume level. The slider maps its 0–100 internal range to the media’s 0–1 volume scale. When the media is muted, the fill level drops to 0 regardless of the stored volume value. When `volumeAvailability` is not `"available"`, the HTML custom element receives native `hidden`, `data-hidden`, and disabled ARIA semantics; the React component returns `null`. This is independent of `mutedAvailability`, which controls whether the mute button is shown.
|
|
16
16
|
|
|
17
17
|
## Styling
|
|
18
18
|
|