UNPKG

@7sage/vidstack

Version:

UI component library for building high-quality, accessible video and audio experiences on the web.

108 lines (103 loc) 2.85 kB
import { createContext, useContext, Component, provideContext, signal, createDisposalBin, effect } from './vidstack-BGSTndAW.js'; import { useMediaContext } from './vidstack-DJDnh4xT.js'; const plyrLayoutContext = createContext(); function usePlyrLayoutContext() { return useContext(plyrLayoutContext); } const plyrLayoutProps = { clickToPlay: true, clickToFullscreen: true, controls: [ "play-large", "play", "progress", "current-time", "mute+volume", "captions", "settings", "pip", "airplay", "fullscreen" ], customIcons: false, displayDuration: false, download: null, markers: null, invertTime: true, thumbnails: null, toggleTime: true, translations: null, seekTime: 10, speed: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4] }; class PlyrLayout extends Component { static props = plyrLayoutProps; #media; onSetup() { this.#media = useMediaContext(); provideContext(plyrLayoutContext, { ...this.$props, previewTime: signal(0) }); } } function usePlyrLayoutClasses(el, media) { const { canAirPlay, canFullscreen, canPictureInPicture, controlsHidden, currentTime, fullscreen, hasCaptions, isAirPlayConnected, paused, pictureInPicture, playing, pointer, poster, textTrack, viewType, waiting } = media.$state; el.classList.add("plyr"); el.classList.add("plyr--full-ui"); const classes = { "plyr--airplay-active": isAirPlayConnected, "plyr--airplay-supported": canAirPlay, "plyr--fullscreen-active": fullscreen, "plyr--fullscreen-enabled": canFullscreen, "plyr--hide-controls": controlsHidden, "plyr--is-touch": () => pointer() === "coarse", "plyr--loading": waiting, "plyr--paused": paused, "plyr--pip-active": pictureInPicture, "plyr--pip-enabled": canPictureInPicture, "plyr--playing": playing, "plyr__poster-enabled": poster, "plyr--stopped": () => paused() && currentTime() === 0, "plyr--captions-active": textTrack, "plyr--captions-enabled": hasCaptions }; const disposal = createDisposalBin(); for (const token of Object.keys(classes)) { disposal.add(effect(() => void el.classList.toggle(token, !!classes[token]()))); } disposal.add( effect(() => { const token = `plyr--${viewType()}`; el.classList.add(token); return () => el.classList.remove(token); }), effect(() => { const { $provider } = media, type = $provider()?.type, token = `plyr--${isHTMLProvider(type) ? "html5" : type}`; el.classList.toggle(token, !!type); return () => el.classList.remove(token); }) ); return () => disposal.empty(); } function isHTMLProvider(type) { return type === "audio" || type === "video"; } export { PlyrLayout, usePlyrLayoutClasses, usePlyrLayoutContext };