(null);
+
+ // Observe tab changes and sync to installMethod store
+ useEffect(() => {
+ const root = ref.current?.querySelector('[data-tabs-root]');
+ if (!root) return;
+
+ const observer = new MutationObserver(() => {
+ const activeTab = root.querySelector('[role="tab"][data-tab-active="true"]');
+ if (activeTab) {
+ const value = activeTab.getAttribute('data-value');
+ if (value) {
+ installMethod.set(value as InstallMethod);
+ }
+ }
+ });
+
+ // Observe all tab elements for attribute changes
+ const tabs = root.querySelectorAll('[role="tab"]');
+ tabs.forEach((tab) => {
+ observer.observe(tab, { attributes: true, attributeFilter: ['data-tab-active'] });
+ });
+
+ return () => observer.disconnect();
+ }, []);
+
+ return (
+
+
+
+
+ cdn
+
+ npm
+ pnpm
+ yarn
+ bun
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/site/src/components/installation/HTMLUsageCodeBlock.tsx b/site/src/components/installation/HTMLUsageCodeBlock.tsx
index 14d8c5e8..71e7a0ab 100644
--- a/site/src/components/installation/HTMLUsageCodeBlock.tsx
+++ b/site/src/components/installation/HTMLUsageCodeBlock.tsx
@@ -2,18 +2,21 @@ import { useStore } from '@nanostores/react';
import ClientCode from '@/components/Code/ClientCode';
import { Tab, TabsList, TabsPanel, TabsRoot } from '@/components/Tabs';
import type { Renderer, Skin, UseCase } from '@/stores/installation';
-import { muxPlaybackId, renderer, skin, useCase } from '@/stores/installation';
+import { installMethod, muxPlaybackId, renderer, skin, useCase } from '@/stores/installation';
function getRendererTag(renderer: Renderer): string {
const map: Record = {
+ 'background-video': 'background-video',
cloudflare: 'cloudflare-video',
dash: 'dash-video',
hls: 'hls-video',
'html5-audio': 'audio',
'html5-video': 'video',
jwplayer: 'jwplayer-video',
- mux: 'mux-video',
- shaka: 'shaka-video',
+ 'mux-audio': 'mux-audio',
+ 'mux-background-video': 'mux-background-video',
+ 'mux-video': 'mux-video',
+ // shaka: 'shaka-video',
spotify: 'spotify-audio',
vimeo: 'vimeo-video',
wistia: 'wistia-video',
@@ -31,11 +34,16 @@ function getProviderTag(useCase: UseCase): string {
return map[useCase];
}
-function getSkinTag(skin: Skin): string {
+function getSkinTag(useCase: UseCase, skin: Skin): string {
+ // Background video has fixed skin
+ if (useCase === 'background-video') {
+ return 'background-video-skin';
+ }
const map: Record = {
- 'default-video': 'video-skin',
- 'default-audio': 'audio-skin',
- minimal: 'minimal-video-skin',
+ video: 'video-skin',
+ audio: 'audio-skin',
+ 'minimal-video': 'minimal-video-skin',
+ 'minimal-audio': 'minimal-audio-skin',
};
return map[skin];
}
@@ -43,8 +51,8 @@ function getSkinTag(skin: Skin): string {
function getRendererElement(renderer: Renderer, playbackId: string | null): string {
const tag = getRendererTag(renderer);
- // When renderer is 'mux' and we have a playback ID, use playback-id attribute
- if (renderer === 'mux' && playbackId) {
+ // When renderer is a mux variant and we have a playback ID, use playback-id attribute
+ if ((renderer === 'mux-video' || renderer === 'mux-audio' || renderer === 'mux-background-video') && playbackId) {
return `<${tag} playback-id="${playbackId}">${tag}>`;
}
@@ -54,7 +62,7 @@ function getRendererElement(renderer: Renderer, playbackId: string | null): stri
function generateHTMLCode(useCase: UseCase, skin: Skin, renderer: Renderer, playbackId: string | null): string {
const providerTag = getProviderTag(useCase);
- const skinTag = getSkinTag(skin);
+ const skinTag = getSkinTag(useCase, skin);
const rendererElement = getRendererElement(renderer, playbackId);
return `