# Examples Progressive journey from simple to fully custom. ## 1. It Works (Minimal) ### React ```tsx import { createPlayer } from '@videojs/react'; import { features } from '@videojs/core/dom'; const { Provider: VideoProvider, Container: VideoContainer } = createPlayer({ features: [...features.video], }); function App() { return ( ); } ``` ### HTML ```ts import '@videojs/html/video/player'; ``` ```html ``` ## 2. It's Pretty (Add Skin) ### React ```tsx import '@videojs/react/video/skin.css'; import { createPlayer } from '@videojs/react'; import { features } from '@videojs/core/dom'; import { VideoSkin } from '@videojs/react/video/skin'; const { Provider: VideoProvider } = createPlayer({ features: [...features.video], }); function App() { return ( ); } ``` ### HTML ```ts import '@videojs/html/video/player'; import '@videojs/html/video/skin.css'; import '@videojs/html/video/skin'; ``` ```html ``` ## 3. I Need a Feature (Chapters) Skin detects chapters feature, shows chapter menu. ### React ```tsx import '@videojs/react/video/skin.css'; import { createPlayer } from '@videojs/react'; import { features, chaptersSlice } from '@videojs/core/dom'; import { VideoSkin } from '@videojs/react/video/skin'; const { Provider: VideoProvider } = createPlayer({ features: [...features.video, chaptersSlice], }); function App() { return ( ); } ``` ### HTML ```ts import '@videojs/html/video/player'; import '@videojs/html/feature/chapters'; import '@videojs/html/video/skin.css'; import '@videojs/html/video/skin'; ``` ```html ``` ## 4. I Need Streaming (HLS) Skin detects streaming features, shows quality/tracks menus. ### React ```tsx import '@videojs/react/video/skin.css'; import { createPlayer } from '@videojs/react'; import { features } from '@videojs/core/dom'; import { HlsVideo } from '@videojs/react/media/hls'; import { VideoSkin } from '@videojs/react/video/skin'; const { Provider: VideoProvider } = createPlayer({ features: [...features.video, ...features.streaming], }); function App() { return ( ); } ``` ### HTML ```ts import '@videojs/html/video/player'; import '@videojs/html/feature/streaming'; import '@videojs/html/media/hls-video'; import '@videojs/html/video/skin.css'; import '@videojs/html/video/skin'; ``` ```html ``` ## 5. I Need Ads Same skin adapts to show ad UI. ### React ```tsx import '@videojs/react/video/skin.css'; import { createPlayer } from '@videojs/react'; import { features } from '@videojs/core/dom'; import { HlsVideo } from '@videojs/react/media/hls'; import { VideoSkin } from '@videojs/react/video/skin'; const { Provider: VideoProvider } = createPlayer({ features: [...features.video, ...features.streaming, ...features.ads], }); function App() { return ( ); } ``` ### HTML ```ts import '@videojs/html/video/player'; import '@videojs/html/feature/streaming'; import '@videojs/html/feature/ads'; import '@videojs/html/media/hls-video'; import '@videojs/html/video/skin.css'; import '@videojs/html/video/skin'; ``` ## 6. Full Custom (Escape Hatch) ### React ```tsx import { createPlayer } from '@videojs/react'; import { defineSlice } from '@videojs/store'; import { features, selectPlayback, selectTime, type PlayerTarget } from '@videojs/core/dom'; import { HlsVideo } from '@videojs/react/media/hls'; const analyticsSlice = defineSlice()({ state: ({ task }) => ({ trackEvent: task('trackEvent', ({ get }, name: string) => { console.log('track', name, get()); }), }), }); const { Provider: VideoProvider, Container: VideoContainer, usePlayer } = createPlayer({ features: [...features.video, ...features.streaming, analyticsSlice], }); function App() { return ( ); } function MyCustomSkin() { const playback = usePlayer(selectPlayback); const time = usePlayer(selectTime); if (!playback || !time) return null; return (
{time.currentTime} / {time.duration}
); } ``` ### HTML ```ts import { createPlayer, MediaElement } from '@videojs/html'; import { features, selectPlayback } from '@videojs/core/dom'; const { PlayerElement, PlayerController, context } = createPlayer({ features: [...features.video, ...features.streaming, myCustomSlice], }); // Define player element customElements.define('my-video-player', PlayerElement); // Custom play button class MyPlayButton extends MediaElement { #playback = new PlayerController(this, context, selectPlayback); override connectedCallback() { super.connectedCallback(); this.addEventListener('click', this.#handleClick); } #handleClick = () => { this.#playback.value?.toggle(); }; override update() { const playback = this.#playback.value; if (!playback) return; this.textContent = playback.paused ? 'Play' : 'Pause'; } } customElements.define('my-play-button', MyPlayButton); ``` ```html ``` ## 7. Configure Media Engine ### HTML ```html ``` ### React ```tsx {}} /> ``` ## 8. Headless (No UI) ### React ```tsx import { createPlayer } from '@videojs/react'; import { features, selectPlayback, selectTime } from '@videojs/core/dom'; const { Provider: AudioProvider, usePlayer } = createPlayer({ features: [...features.audio], }); function AudioController() { const playback = usePlayer(selectPlayback); const time = usePlayer(selectTime); // Programmatic control, no UI useEffect(() => { if (time && time.currentTime > 60) { playback?.pause(); } }, [time?.currentTime, playback]); return