> = {
+ 'hls-video': 'hls-video',
+ 'simple-hls-video': 'simple-hls-video',
+ 'dash-video': 'dash-video',
+ audio: 'audio',
+ 'background-video': 'background-video',
+ };
+
+ return tags[preset] ?? 'video';
+}
+
+function loadStylesheets(preset: Preset, skin: Skin) {
+ if (preset === 'audio') loadAudioStylesheets(skin);
+ else if (preset !== 'background-video') loadVideoStylesheets(skin);
+ // Background CSS is loaded via dynamic import in loadCdnPreset.
+}
+
+function isVideoPreset(preset: Preset): boolean {
+ return preset === 'video' || preset === 'hls-video' || preset === 'simple-hls-video' || preset === 'dash-video';
+}
+
+async function render() {
+ await loadLatest(async () => {
+ await loadCdnPreset(preset, state.skin);
+ await loadCdnMedia(preset);
+ });
+
+ loadStylesheets(preset, state.skin);
+
+ const root = document.getElementById('root')!;
+ const playerTag = getPlayerTag(preset);
+ const skinTag = getSkinTag(preset, state.skin);
+ const mediaTag = getMediaTag(preset);
+ const src = preset === 'background-video' ? BACKGROUND_VIDEO_SRC : SOURCES[state.source].url;
+ const storyboard = isVideoPreset(preset) ? getStoryboardSrc(state.source) : undefined;
+ const poster = isVideoPreset(preset) ? getPosterSrc(state.source) : undefined;
+
+ // Background video needs viewport dimensions instead of flex centering.
+ if (preset === 'background-video') {
+ root.className = '';
+ root.style.cssText = 'width: 100vw; height: 100vh;';
+ }
+
+ if (preset === 'background-video') {
+ root.innerHTML = html`
+ <${playerTag}>
+ <${skinTag}>
+ <${mediaTag} src="${src}">${mediaTag}>
+ ${skinTag}>
+ ${playerTag}>
+ `;
+ return;
+ }
+
+ if (preset === 'audio') {
+ root.innerHTML = html`
+
+ <${playerTag}>
+ <${skinTag}>
+ <${mediaTag} src="${src}">${mediaTag}>
+ ${skinTag}>
+ ${playerTag}>
+
+ `;
+ return;
+ }
+
+ root.innerHTML = html`
+ <${playerTag}>
+ <${skinTag} class="w-full aspect-video max-w-4xl mx-auto">
+ <${mediaTag} src="${src}" playsinline crossorigin="anonymous">
+ ${renderStoryboard(storyboard)}
+ ${mediaTag}>
+ ${poster ? html`
` : ''}
+ ${skinTag}>
+ ${playerTag}>
+ `;
+}
+
+render();
+
+onSkinChange((skin) => {
+ state.skin = skin;
+ render();
+});
+
+onSourceChange((source) => {
+ state.source = source;
+ render();
+});
diff --git a/turbo.json b/turbo.json
index e4032f1c..9c7edde3 100644
--- a/turbo.json
+++ b/turbo.json
@@ -5,7 +5,7 @@
"globalEnv": ["CONTEXT", "DEPLOY_PRIME_URL"],
"tasks": {
"build": {
- "dependsOn": ["^build"],
+ "dependsOn": ["^build", "^build:cdn"],
"outputs": ["dist/**", ".netlify/**"]
},
"build:cdn": {