@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
JavaScript
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 };