Skip to content

Commit 7c2353a

Browse files
committed
docs(site): add "No Skin" option to installation skin picker
1 parent e3c1b28 commit 7c2353a

4 files changed

Lines changed: 82 additions & 36 deletions

File tree

site/src/components/installation/SkinPicker.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useStore } from '@nanostores/react';
2-
import { Minus, Sparkles } from 'lucide-react';
2+
import { Code2, Minus, Sparkles } from 'lucide-react';
33
import { useEffect } from 'react';
44
import type { ImageRadioOption } from '@/components/ImageRadioGroup';
55
import ImageRadioGroup from '@/components/ImageRadioGroup';
@@ -9,11 +9,13 @@ import type { Skin } from '@/utils/installation/types';
99
const VIDEO_SKINS: ImageRadioOption<Skin>[] = [
1010
{ value: 'video', label: 'Default', image: <Sparkles size={32} /> },
1111
{ value: 'minimal-video', label: 'Minimal', image: <Minus size={32} /> },
12+
{ value: 'none', label: 'No Skin', image: <Code2 size={32} /> },
1213
];
1314

1415
const AUDIO_SKINS: ImageRadioOption<Skin>[] = [
1516
{ value: 'audio', label: 'Default', image: <Sparkles size={32} /> },
1617
{ value: 'minimal-audio', label: 'Minimal', image: <Minus size={32} /> },
18+
{ value: 'none', label: 'No Skin', image: <Code2 size={32} /> },
1719
];
1820

1921
export default function SkinPicker() {

site/src/utils/installation/cdn-code.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const CDN_BASE = 'https://cdn.jsdelivr.net/npm/@videojs/html/cdn';
44

55
function getCdnFileName(useCase: UseCase, skin: Skin): string {
66
if (useCase === 'background-video') return 'background';
7+
if (skin === 'none') return useCase === 'default-audio' ? 'audio-player' : 'video-player';
78
if (skin === 'minimal-video') return 'video-minimal';
89
if (skin === 'minimal-audio') return 'audio-minimal';
910
return skin;

site/src/utils/installation/codegen.ts

Lines changed: 77 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ function isVideoLikeRenderer(renderer: Renderer): boolean {
3737
return renderer === 'html5-video' || renderer === 'hls' || renderer === 'background-video';
3838
}
3939

40-
function getSkinImportParts(skin: Skin): { group: string; skinFile: string } {
40+
function getGroupFromUseCase(useCase: UseCase): string {
41+
return useCase === 'default-audio' ? 'audio' : 'video';
42+
}
43+
44+
function getSkinImportParts(skin: Exclude<Skin, 'none'>): { group: string; skinFile: string } {
4145
if (skin === 'minimal-video') return { group: 'video', skinFile: 'minimal-skin' };
4246
if (skin === 'minimal-audio') return { group: 'audio', skinFile: 'minimal-skin' };
4347
return { group: skin, skinFile: 'skin' };
@@ -102,11 +106,11 @@ function getProviderTag(useCase: UseCase): string {
102106
return map[useCase];
103107
}
104108

105-
function getSkinTag(useCase: UseCase, skin: Skin): string {
109+
function getSkinTag(useCase: UseCase, skin: Exclude<Skin, 'none'>): string {
106110
if (useCase === 'background-video') {
107111
return 'background-video-skin';
108112
}
109-
const map: Record<Skin, string> = {
113+
const map: Record<Exclude<Skin, 'none'>, string> = {
110114
video: 'video-skin',
111115
audio: 'audio-skin',
112116
'minimal-video': 'video-minimal-skin',
@@ -117,28 +121,40 @@ function getSkinTag(useCase: UseCase, skin: Skin): string {
117121

118122
function generateHTMLMarkup(useCase: UseCase, skin: Skin, renderer: Renderer, url: string): string {
119123
const providerTag = getProviderTag(useCase);
120-
const skinTag = getSkinTag(useCase, skin);
121124
const tag = getRendererTag(renderer);
122125
const src = resolveSourceUrl(url, renderer);
123126
const playsInline = isVideoLikeRenderer(renderer) ? ' playsinline' : '';
124127

125-
return `<!--
128+
const mediaComment = ` <!--
129+
Media are players without UIs, handling networking
130+
and display of the media. They are easily swappable
131+
to handle different sources.
132+
-->`;
133+
134+
const providerComment = `<!--
126135
The PlayerProvider passes state between the UI components
127136
and Media, and makes fully custom UIs possible.
128137
It does not have layout by default (display:contents)
129-
-->
138+
-->`;
139+
140+
if (skin === 'none') {
141+
return `${providerComment}
142+
<${providerTag}>
143+
${mediaComment}
144+
<${tag} src="${src}"${playsInline}></${tag}>
145+
</${providerTag}>`;
146+
}
147+
148+
const skinTag = getSkinTag(useCase, skin);
149+
return `${providerComment}
130150
<${providerTag}>
131151
<!--
132152
Skins contain the entire player UI and are easily swappable.
133153
They can each be "ejected" for full control and customization
134154
of UI components.
135155
-->
136156
<${skinTag}>
137-
<!--
138-
Media are players without UIs, handling networking
139-
and display of the media. They are easily swappable
140-
to handle different sources.
141-
-->
157+
${mediaComment}
142158
<${tag} src="${src}"${playsInline}></${tag}>
143159
</${skinTag}>
144160
</${providerTag}>`;
@@ -152,9 +168,13 @@ function generateHTMLJSImports(useCase: UseCase, skin: Skin, renderer: Renderer)
152168
import '@videojs/html/background/skin';
153169
import '@videojs/html/background/video';${mediaImport}`;
154170
}
155-
const { group, skinFile } = getSkinImportParts(skin);
171+
const group = skin === 'none' ? getGroupFromUseCase(useCase) : getSkinImportParts(skin).group;
156172
const mediaSubpath = getMediaImportSubpath(renderer);
157173
const mediaImport = mediaSubpath ? `\nimport '@videojs/html/media/${mediaSubpath}';` : '';
174+
if (skin === 'none') {
175+
return `import '@videojs/html/${group}/player';${mediaImport}`;
176+
}
177+
const { skinFile } = getSkinImportParts(skin);
158178
return `import '@videojs/html/${group}/player';
159179
import '@videojs/html/${group}/${skinFile}';${mediaImport}`;
160180
}
@@ -181,8 +201,8 @@ function getRendererComponent(renderer: Renderer): string {
181201
return map[renderer];
182202
}
183203

184-
function getSkinComponent(skin: Skin): string {
185-
const map: Record<Skin, string> = {
204+
function getSkinComponent(skin: Exclude<Skin, 'none'>): string {
205+
const map: Record<Exclude<Skin, 'none'>, string> = {
186206
video: 'VideoSkin',
187207
audio: 'AudioSkin',
188208
'minimal-video': 'MinimalVideoSkin',
@@ -219,31 +239,58 @@ export function generateReactCreateCode(
219239
const featureType = getUseCaseFeatures(useCase);
220240

221241
const isBackgroundVideo = useCase === 'background-video';
222-
const skinComponent = isBackgroundVideo ? 'BackgroundVideoSkin' : getSkinComponent(skin);
223-
const { group, skinFile } = getSkinImportParts(skin);
224-
const skinCssImport = isBackgroundVideo
225-
? '@videojs/react/background/skin.css'
226-
: `@videojs/react/${group}/${skinFile}.css`;
242+
const isNoSkin = skin === 'none';
243+
const group = isBackgroundVideo
244+
? 'background'
245+
: isNoSkin
246+
? getGroupFromUseCase(useCase)
247+
: getSkinImportParts(skin).group;
227248

228-
const presetSubpath = isBackgroundVideo ? 'background' : group;
249+
const rendererProps = isVideoLikeRenderer(renderer) ? 'src={src} playsInline' : 'src={src}';
250+
const rendererJsx = `<${rendererComponent} ${rendererProps} />`;
229251

230252
let presetImport: string;
231253
let mediaImport: string | null = null;
232-
233-
if (isPresetRenderer(renderer)) {
234-
presetImport = `import { ${skinComponent}, ${rendererComponent} } from '@videojs/react/${presetSubpath}';`;
254+
let skinCssImport: string | null = null;
255+
let skinComponent: string | null = null;
256+
257+
if (isBackgroundVideo) {
258+
skinComponent = 'BackgroundVideoSkin';
259+
skinCssImport = '@videojs/react/background/skin.css';
260+
presetImport = `import { ${skinComponent}, ${rendererComponent} } from '@videojs/react/background';`;
261+
} else if (isNoSkin) {
262+
if (isPresetRenderer(renderer)) {
263+
presetImport = `import { ${rendererComponent} } from '@videojs/react/${group}';`;
264+
} else {
265+
presetImport = '';
266+
mediaImport = `import { ${rendererComponent} } from '@videojs/react/media/${getRendererMediaSubpath(renderer)}';`;
267+
}
235268
} else {
236-
presetImport = `import { ${skinComponent} } from '@videojs/react/${presetSubpath}';`;
237-
mediaImport = `import { ${rendererComponent} } from '@videojs/react/media/${getRendererMediaSubpath(renderer)}';`;
269+
const { skinFile } = getSkinImportParts(skin);
270+
skinComponent = getSkinComponent(skin);
271+
skinCssImport = `@videojs/react/${group}/${skinFile}.css`;
272+
if (isPresetRenderer(renderer)) {
273+
presetImport = `import { ${skinComponent}, ${rendererComponent} } from '@videojs/react/${group}';`;
274+
} else {
275+
presetImport = `import { ${skinComponent} } from '@videojs/react/${group}';`;
276+
mediaImport = `import { ${rendererComponent} } from '@videojs/react/media/${getRendererMediaSubpath(renderer)}';`;
277+
}
238278
}
239279

240-
const rendererProps = isVideoLikeRenderer(renderer) ? 'src={src} playsInline' : 'src={src}';
241-
const rendererJsx = `<${rendererComponent} ${rendererProps} />`;
280+
const playerJsx = skinComponent
281+
? ` <Player.Provider>
282+
<${skinComponent}>
283+
${rendererJsx}
284+
</${skinComponent}>
285+
</Player.Provider>`
286+
: ` <Player.Provider>
287+
${rendererJsx}
288+
</Player.Provider>`;
242289

243290
const imports = [
244-
`import '${skinCssImport}';`,
291+
...(skinCssImport ? [`import '${skinCssImport}';`] : []),
245292
`import { createPlayer, ${featureType} } from '@videojs/react';`,
246-
presetImport,
293+
...(presetImport ? [presetImport] : []),
247294
...(mediaImport ? [mediaImport] : []),
248295
].join('\n');
249296

@@ -260,11 +307,7 @@ interface MyPlayerProps {
260307
261308
export const MyPlayer = ({ src }: MyPlayerProps) => {
262309
return (
263-
<Player.Provider>
264-
<${skinComponent}>
265-
${rendererJsx}
266-
</${skinComponent}>
267-
</Player.Provider>
310+
${playerJsx}
268311
);
269312
};`,
270313
};

site/src/utils/installation/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export type Renderer = 'background-video' | 'hls' | 'html5-audio' | 'html5-video';
22

3-
export type Skin = 'video' | 'audio' | 'minimal-video' | 'minimal-audio';
3+
export type Skin = 'video' | 'audio' | 'minimal-video' | 'minimal-audio' | 'none';
44

55
export type UseCase = 'default-video' | 'default-audio' | 'background-video';
66

0 commit comments

Comments
 (0)