diff --git a/website/src/components/ClientCode.tsx b/website/src/components/ClientCode.tsx index 6eefa3ac..4e44027e 100644 --- a/website/src/components/ClientCode.tsx +++ b/website/src/components/ClientCode.tsx @@ -5,6 +5,11 @@ import html from 'shiki/langs/html.mjs'; import tsx from 'shiki/langs/tsx.mjs'; import gruvboxLightHard from 'shiki/themes/gruvbox-light-hard.mjs'; +// If you try importing more than one island with ClientCode in it, +// Safari MAY throw a hydration error because of this top-level await. +// https://github.com/withastro/astro/issues/10055 +// consolidate the ClientCodes into a single island to work around... for now :( + // eslint-disable-next-line antfu/no-top-level-await const highlighter: Highlighter = await createHighlighter({ themes: [gruvboxLightHard], diff --git a/website/src/components/HomePageBaseDemo.tsx b/website/src/components/HomePageDemo/Base.tsx similarity index 94% rename from website/src/components/HomePageBaseDemo.tsx rename to website/src/components/HomePageDemo/Base.tsx index acbbedae..8da65787 100644 --- a/website/src/components/HomePageBaseDemo.tsx +++ b/website/src/components/HomePageDemo/Base.tsx @@ -1,7 +1,7 @@ import type { Media, Skin } from '@/stores/homePageDemos'; import { useStore } from '@nanostores/react'; import { framework, media, skin } from '@/stores/homePageDemos'; -import ClientCode from './ClientCode'; +import ClientCode from '../ClientCode'; function generateHTMLCode(skin: Skin, media: Media): string { const skinTag = `${skin}-skin`; @@ -38,7 +38,7 @@ export const VideoPlayer = () => { interface Props { className?: string; } -export default function HomePageBaseDemo({ className }: Props) { +export default function BaseDemo({ className }: Props) { const $framework = useStore(framework); const $skin = useStore(skin); const $media = useStore(media); diff --git a/website/src/components/HomePageDemo/Eject.tsx b/website/src/components/HomePageDemo/Eject.tsx new file mode 100644 index 00000000..0c92a45f --- /dev/null +++ b/website/src/components/HomePageDemo/Eject.tsx @@ -0,0 +1,33 @@ +import type { Media, Skin } from '@/stores/homePageDemos'; +import { useStore } from '@nanostores/react'; +import { framework, media, skin } from '@/stores/homePageDemos'; +import ClientCode from '../ClientCode'; + +// eslint-disable-next-line unused-imports/no-unused-vars +function generateHTMLCode(skin: Skin, media: Media): string { + return `Coming soon`; +} + +// eslint-disable-next-line unused-imports/no-unused-vars +function generateReactCode(skin: Skin, media: Media): string { + return `Coming soon`; +} + +interface Props { + className?: string; +} +export default function EjectDemo({ className }: Props) { + const $framework = useStore(framework); + const $skin = useStore(skin); + const $media = useStore(media); + + const code = $framework === 'html' + ? generateHTMLCode($skin, $media) + : generateReactCode($skin, $media); + + const lang = $framework === 'html' ? 'html' : 'tsx'; + + return ( + + ); +} diff --git a/website/src/components/HomePageDemo/index.tsx b/website/src/components/HomePageDemo/index.tsx new file mode 100644 index 00000000..bf7f3356 --- /dev/null +++ b/website/src/components/HomePageDemo/index.tsx @@ -0,0 +1,28 @@ +import clsx from 'clsx'; +import BaseDemo from './Base'; +import EjectDemo from './Eject'; + +interface Props { + className?: string; +} + +export default function HomePageDemo({ className }: Props) { + return ( +
+
+
+

Assemble your player

+

Feel at home with your framework, skin, and media source

+
+ +
+
+
+

Take full control

+

Make your player truly your own with fully-editable components

+
+ +
+
+ ); +} diff --git a/website/src/components/HomePageEjectDemo.tsx b/website/src/components/HomePageEjectDemo.tsx deleted file mode 100644 index 82b25ed9..00000000 --- a/website/src/components/HomePageEjectDemo.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import type { Media, Skin } from '@/stores/homePageDemos'; -import { useStore } from '@nanostores/react'; -import { framework, media, skin } from '@/stores/homePageDemos'; -import ClientCode from './ClientCode'; - -function generateHTMLCode(skin: Skin, media: Media): string { - const skinTag = `${skin}-skin`; - const mediaTag = media; - const videoExtension = media === 'hls-video' ? 'm3u8' : 'mp4'; - - return ` - <${skinTag}> - <${mediaTag} src="https://example.com/video.${videoExtension}"> - -`; -} - -function generateReactCode(skin: Skin, media: Media): string { - const skinComponent = skin === 'frosted' ? 'FrostedSkin' : 'MinimalSkin'; - const mediaComponent = media === 'video' ? 'Video' : 'HLSVideo'; - const skinImport = skin === 'frosted' ? 'frosted' : 'minimal'; - const videoExtension = media === 'hls-video' ? 'm3u8' : 'mp4'; - - return `import { VideoProvider, ${mediaComponent} } from '@vjs-10/react'; -import { ${skinComponent} } from '@vjs-10/react/skins/${skinImport}'; - -export const VideoPlayer = () => { - return ( - - <${skinComponent}> - <${mediaComponent} src="https://example.com/video.${videoExtension}" /> - - - ); -};`; -} - -interface Props { - className?: string; -} -export default function HomePageEjectDemo({ className }: Props) { - const $framework = useStore(framework); - const $skin = useStore(skin); - const $media = useStore(media); - - const code = $framework === 'html' - ? generateHTMLCode($skin, $media) - : generateReactCode($skin, $media); - - const lang = $framework === 'html' ? 'html' : 'tsx'; - - return ( - - ); -} diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 630969e8..b05e3916 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -6,8 +6,7 @@ import NavBar from '@/components/NavBar/NavBar.astro'; import Footer from '@/components/Footer.astro'; import { SITE_DESCRIPTION, SITE_TITLE } from '@/consts'; import Base from '@/layouts/Base.astro'; -import HomePageBaseDemo from '@/components/HomePageBaseDemo'; -import HomePageEjectDemo from '@/components/HomePageEjectDemo'; +import HomePageDemo from '@/components/HomePageDemo'; import HomePageControls from '@/components/home/HomePageControls'; import { PLAYBACK_ID } from '@/components/home/config'; import { CircleCheck, Clock } from 'lucide-react'; @@ -44,22 +43,7 @@ const poster = `https://image.mux.com/${PLAYBACK_ID}/thumbnail.webp?time=0`;
-
-
-
-

Assemble your player

-

Feel at home with your framework, skin, and media source

-
- -
-
-
-

Take full control

-

Make your player truly your own with fully-editable components

-
- -
-
+

Under construction