From 351a3e8bda3dc323d66d9e0b64fd1d4f1c4900bd Mon Sep 17 00:00:00 2001 From: Ronald Urbina <140639086+ronalduQualabs@users.noreply.github.com> Date: Fri, 6 Mar 2026 19:19:27 -0300 Subject: [PATCH] feat(site): new home page, docs, and design system (#566) Co-authored-by: Darius Cepulis Co-authored-by: Claude Opus 4.6 --- .claude/skills/api-reference/SKILL.md | 4 +- .../api-reference/references/demo-patterns.md | 8 +- .claude/skills/docs/patterns/code-examples.md | 8 +- .prettierignore | 4 + .prettierrc.json | 14 + .vscode/extensions.json | 1 + .vscode/settings.json | 9 +- .zed/settings.json | 4 +- biome.json | 17 + package.json | 5 + .../sandbox/templates/html-tailwind/main.ts | 2 +- packages/sandbox/templates/html/main.ts | 2 +- .../sandbox/templates/react-tailwind/main.tsx | 2 +- pnpm-lock.yaml | 149 ++++++- site/CLAUDE.md | 3 +- site/astro.config.mjs | 7 +- site/env.d.ts | 1 + site/package.json | 9 +- .../public/built-bg-horizontal-line-black.svg | 3 + site/public/built-bg-horizontal-line-gray.svg | 3 + site/public/data-bar-black.svg | 3 + site/public/data-bar-orange.svg | 3 + site/public/data-bar-white.svg | 3 + site/public/docs/demos/thumbnail/basic.vtt | 6 +- site/public/horizontal-bar-orange.svg | 3 + site/public/horizontal-bar-white.svg | 3 + site/src/components/Aside.astro | 34 +- site/src/components/Code/Shared.tsx | 4 +- site/src/components/Code/createHighlighter.ts | 4 +- site/src/components/CopyMarkdownButton.tsx | 4 +- site/src/components/DialNav.tsx | 104 +++++ site/src/components/FilmGrain/FilmGrain.tsx | 2 +- site/src/components/Footer.astro | 104 +++-- site/src/components/FooterDocs.astro | 92 ++++ site/src/components/FooterEasterEgg.astro | 34 +- site/src/components/FormattedDate.astro | 8 +- site/src/components/HomePageDemo/index.tsx | 28 -- site/src/components/ImageRadioGroup.tsx | 15 +- site/src/components/NavBar/MobileNav.tsx | 81 ++-- site/src/components/NavBar/NavBar.astro | 73 ++-- site/src/components/NavBar/NavBarDocs.astro | 98 +++++ site/src/components/Search/Search.astro | 62 +-- site/src/components/Search/Search.tsx | 4 +- site/src/components/Select.tsx | 17 +- site/src/components/Tabs.tsx | 79 +++- site/src/components/ThemeInit.astro | 30 +- site/src/components/ThemeToggle.tsx | 12 +- site/src/components/ToggleGroup.tsx | 62 ++- site/src/components/Tooltip.tsx | 3 +- .../src/components/blog/AuthorSocialLinks.tsx | 2 +- site/src/components/blog/BlogPagination.astro | 21 +- site/src/components/blog/BlogPostCard.astro | 34 +- site/src/components/docs/DocsNavigation.astro | 14 +- site/src/components/docs/DocsSidebar.astro | 8 +- .../docs/DocsSidebarRestoration.astro | 44 +- site/src/components/docs/EditPageButton.astro | 9 +- site/src/components/docs/FrameworkCase.astro | 4 +- site/src/components/docs/Selectors.tsx | 6 +- site/src/components/docs/SidebarItem.astro | 47 ++- site/src/components/docs/StyleCase.astro | 14 +- site/src/components/docs/StyleInit.astro | 32 +- .../TableOfContents.desktop.tsx | 9 +- .../TableOfContents.mobile.tsx | 4 +- .../docs/api-reference/ApiCSSVarsTable.astro | 34 +- .../api-reference/ApiDataAttrsTable.astro | 40 +- .../docs/api-reference/ApiPropsTable.astro | 46 +- .../docs/api-reference/ApiStateTable.astro | 40 +- .../docs/api-reference/CSSVarRow.astro | 6 +- .../api-reference/ComponentReference.astro | 231 ++++++---- .../docs/api-reference/DataAttrRow.astro | 21 +- .../docs/api-reference/DetailRow.astro | 156 ++++--- .../docs/api-reference/PropRow.astro | 37 +- .../docs/api-reference/StateRow.astro | 21 +- .../docs/api-reference/UtilParamsTable.astro | 46 +- .../docs/api-reference/UtilReference.astro | 106 +++-- .../docs/api-reference/UtilReturnTable.astro | 100 ++--- site/src/components/docs/demos/Demo.astro | 36 +- .../html/css/BasicUsage.astro | 2 +- .../html/css/BasicUsage.html | 2 +- .../react/css/BasicUsage.tsx | 2 +- .../demos/controls/html/css/BasicUsage.astro | 2 +- .../demos/controls/html/css/BasicUsage.html | 2 +- .../demos/controls/react/css/BasicUsage.tsx | 2 +- .../create-player/react/css/BasicUsage.tsx | 2 +- .../html/css/BasicUsage.astro | 2 +- .../html/css/BasicUsage.html | 2 +- .../react/css/BasicUsage.tsx | 2 +- .../html/css/BasicUsage.astro | 2 +- .../html/css/BasicUsage.html | 2 +- .../mute-button/html/css/BasicUsage.astro | 2 +- .../mute-button/html/css/BasicUsage.html | 2 +- .../mute-button/html/css/VolumeLevels.astro | 2 +- .../mute-button/html/css/VolumeLevels.html | 2 +- .../mute-button/react/css/BasicUsage.tsx | 2 +- .../mute-button/react/css/VolumeLevels.tsx | 2 +- .../pip-button/html/css/BasicUsage.astro | 2 +- .../demos/pip-button/html/css/BasicUsage.html | 2 +- .../demos/pip-button/react/css/BasicUsage.tsx | 2 +- .../play-button/html/css/BasicUsage.astro | 2 +- .../play-button/html/css/BasicUsage.html | 2 +- .../play-button/react/css/BasicUsage.tsx | 2 +- .../html/css/BasicUsage.astro | 2 +- .../html/css/BasicUsage.html | 2 +- .../react/css/BasicUsage.tsx | 2 +- .../html/css/BasicUsage.astro | 2 +- .../html/css/BasicUsage.html | 2 +- .../demos/popover/html/css/BasicUsage.astro | 2 +- .../demos/popover/html/css/BasicUsage.html | 2 +- .../demos/popover/react/css/BasicUsage.tsx | 2 +- .../demos/poster/html/css/BasicUsage.astro | 2 +- .../demos/poster/html/css/BasicUsage.html | 4 +- .../demos/poster/react/css/BasicUsage.tsx | 4 +- .../seek-button/html/css/BasicUsage.astro | 2 +- .../seek-button/html/css/BasicUsage.html | 2 +- .../seek-button/react/css/BasicUsage.tsx | 2 +- .../demos/thumbnail/html/css/BasicUsage.astro | 2 +- .../demos/thumbnail/html/css/BasicUsage.html | 2 +- .../thumbnail/html/css/JsonSpriteUsage.astro | 2 +- .../thumbnail/html/css/JsonSpriteUsage.ts | 6 +- .../demos/thumbnail/html/css/JsonUsage.astro | 2 +- .../demos/thumbnail/html/css/JsonUsage.ts | 6 +- .../demos/thumbnail/react/css/BasicUsage.tsx | 2 +- .../thumbnail/react/css/JsonSpriteUsage.tsx | 6 +- .../demos/thumbnail/react/css/JsonUsage.tsx | 6 +- .../time-slider/html/css/WithParts.astro | 2 +- .../demos/time-slider/html/css/WithParts.html | 2 +- .../demos/time-slider/react/css/WithParts.tsx | 2 +- .../demos/time/html/css/CurrentDuration.astro | 2 +- .../demos/time/html/css/CurrentDuration.html | 2 +- .../demos/time/html/css/CurrentTime.astro | 2 +- .../docs/demos/time/html/css/CurrentTime.html | 2 +- .../time/html/css/CustomNegativeSign.astro | 2 +- .../time/html/css/CustomNegativeSign.html | 2 +- .../demos/time/html/css/CustomSeparator.astro | 2 +- .../demos/time/html/css/CustomSeparator.html | 2 +- .../docs/demos/time/html/css/Remaining.astro | 2 +- .../docs/demos/time/html/css/Remaining.html | 2 +- .../demos/time/react/css/CurrentDuration.tsx | 2 +- .../docs/demos/time/react/css/CurrentTime.tsx | 2 +- .../time/react/css/CustomNegativeSign.tsx | 2 +- .../demos/time/react/css/CustomSeparator.tsx | 2 +- .../docs/demos/time/react/css/Remaining.tsx | 2 +- .../demos/use-media/react/css/BasicUsage.tsx | 2 +- .../demos/use-player/react/css/Selector.tsx | 2 +- .../use-player/react/css/StoreAccess.tsx | 2 +- .../demos/use-store/react/css/Selector.tsx | 2 +- .../demos/use-store/react/css/StoreAccess.tsx | 2 +- .../volume-slider/html/css/WithParts.astro | 2 +- .../volume-slider/html/css/WithParts.html | 2 +- .../volume-slider/react/css/WithParts.tsx | 2 +- site/src/components/frames/ContentWidth.astro | 4 +- site/src/components/frames/Minimal.astro | 4 +- site/src/components/home/AnimatedBars.tsx | 13 + .../components/home/Built/BuiltSection.astro | 35 ++ site/src/components/home/Built/DataViz.astro | 83 ++++ site/src/components/home/Built/Intro.astro | 17 + site/src/components/home/Built/Marquee.astro | 26 ++ .../components/home/Built/SocialProof.astro | 57 +++ .../{HomePageDemo => home/Demo}/Base.tsx | 18 +- site/src/components/home/Demo/Demo.tsx | 38 ++ .../{HomePageDemo => home/Demo}/Eject.tsx | 37 +- site/src/components/home/FrameworkControl.tsx | 22 + .../components/home/GetStartedBanner.astro | 48 +++ site/src/components/home/Header.astro | 64 +++ site/src/components/home/HeroVideo.tsx | 21 +- site/src/components/home/HomePageControls.tsx | 47 --- site/src/components/home/Roadmap.astro | 127 ++++++ site/src/components/home/SkinControl.tsx | 22 + site/src/components/home/Sponsors.astro | 106 +++++ site/src/components/icons/Discord.tsx | 19 - site/src/components/icons/GitHub.tsx | 23 - .../src/components/icons/SocialProofLogos.tsx | 209 +++++++++ site/src/components/icons/arrow.svg | 4 + site/src/components/icons/check.svg | 3 + site/src/components/icons/computer.svg | 5 + site/src/components/icons/copy-icon.svg | 7 + site/src/components/icons/dial-inner.svg | 7 + site/src/components/icons/dial-outer.svg | 7 + site/src/components/icons/discord.svg | 4 + site/src/components/icons/dropdown-arrow.svg | 3 + site/src/components/icons/github.svg | 8 + site/src/components/icons/logo-docs.svg | 13 + site/src/components/icons/logo-mono.svg | 16 + site/src/components/icons/logo.svg | 9 + site/src/components/icons/moon.svg | 6 + site/src/components/icons/mux-logo-small.svg | 21 + site/src/components/icons/mux-logo.svg | 14 + .../components/icons/sponsors/brightcove.svg | 22 + .../icons/sponsors/browserstack.svg | 34 ++ site/src/components/icons/sponsors/fastly.svg | 6 + .../src/components/icons/sponsors/netlify.svg | 8 + site/src/components/icons/sun.svg | 7 + site/src/components/icons/triangle-arrow.svg | 3 + .../installation/HTMLInstallTabs.tsx | 2 +- .../installation/MuxUploaderPanel.tsx | 8 +- .../installation/RendererPicker.tsx | 4 +- .../installation/RendererSelect.tsx | 6 +- .../installation/SkinPickerSection.astro | 6 +- .../installation/UploaderOverlay.tsx | 20 +- site/src/components/typography/A.astro | 4 +- .../components/typography/Blockquote.astro | 8 +- site/src/components/typography/Em.astro | 4 +- site/src/components/typography/H1.astro | 10 +- .../src/components/typography/H1Warning.astro | 3 +- site/src/components/typography/H2.astro | 11 +- .../components/typography/H2Markdown.astro | 10 +- site/src/components/typography/H3.astro | 11 +- .../components/typography/H3Markdown.astro | 6 +- site/src/components/typography/H4.astro | 5 +- .../components/typography/H4Markdown.astro | 6 +- site/src/components/typography/H5.astro | 4 +- .../components/typography/H5Markdown.astro | 6 +- site/src/components/typography/H6.astro | 7 +- .../components/typography/H6Markdown.astro | 6 +- site/src/components/typography/Hr.astro | 13 +- site/src/components/typography/Img.astro | 4 +- site/src/components/typography/Li.astro | 4 +- .../components/typography/MarkdownCode.astro | 20 +- site/src/components/typography/Ol.astro | 16 +- site/src/components/typography/P.astro | 7 +- site/src/components/typography/Pre.astro | 8 +- site/src/components/typography/Strong.astro | 4 +- site/src/components/typography/Table.astro | 34 +- site/src/components/typography/Tbody.astro | 2 +- site/src/components/typography/Td.astro | 4 +- site/src/components/typography/Th.astro | 7 +- site/src/components/typography/Thead.astro | 10 +- site/src/components/typography/Tr.astro | 10 +- site/src/components/typography/Ul.astro | 16 +- site/src/components/typography/styles.ts | 8 +- site/src/consts.ts | 7 + site/src/content/docs/reference/thumbnail.mdx | 4 +- .../docs/reference/write-references.mdx | 4 +- .../react/FrostedSkin/FrostedSkinDemo.tsx | 6 +- .../react/MinimalSkin/MinimalSkinDemo.tsx | 6 +- site/src/hooks/useIntersection.ts | 27 ++ site/src/layouts/AuthResult.astro | 6 +- site/src/layouts/Base.astro | 65 ++- site/src/layouts/Blog.astro | 4 +- site/src/layouts/Docs.astro | 45 +- site/src/layouts/ErrorPage.astro | 47 ++- site/src/layouts/Markdown.astro | 8 +- site/src/pages/404.astro | 7 +- site/src/pages/500.astro | 7 +- site/src/pages/auth/error.astro | 41 +- site/src/pages/auth/success.astro | 28 +- site/src/pages/blog/[...page].astro | 35 +- site/src/pages/blog/[...slug].astro | 33 +- site/src/pages/blog/authors/[author].astro | 31 +- .../framework/[framework]/[...slug].astro | 36 +- site/src/pages/index.astro | 109 +---- site/src/styles/globals.css | 396 ++++++++++++------ .../__tests__/renderInlineMarkdown.test.ts | 6 +- site/src/utils/docs/renderInlineMarkdown.ts | 2 +- site/src/utils/twMerge.ts | 21 + 255 files changed, 3574 insertions(+), 1532 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 site/public/built-bg-horizontal-line-black.svg create mode 100644 site/public/built-bg-horizontal-line-gray.svg create mode 100644 site/public/data-bar-black.svg create mode 100644 site/public/data-bar-orange.svg create mode 100644 site/public/data-bar-white.svg create mode 100644 site/public/horizontal-bar-orange.svg create mode 100644 site/public/horizontal-bar-white.svg create mode 100644 site/src/components/DialNav.tsx create mode 100644 site/src/components/FooterDocs.astro delete mode 100644 site/src/components/HomePageDemo/index.tsx create mode 100644 site/src/components/NavBar/NavBarDocs.astro create mode 100644 site/src/components/home/AnimatedBars.tsx create mode 100644 site/src/components/home/Built/BuiltSection.astro create mode 100644 site/src/components/home/Built/DataViz.astro create mode 100644 site/src/components/home/Built/Intro.astro create mode 100644 site/src/components/home/Built/Marquee.astro create mode 100644 site/src/components/home/Built/SocialProof.astro rename site/src/components/{HomePageDemo => home/Demo}/Base.tsx (74%) create mode 100644 site/src/components/home/Demo/Demo.tsx rename site/src/components/{HomePageDemo => home/Demo}/Eject.tsx (50%) create mode 100644 site/src/components/home/FrameworkControl.tsx create mode 100644 site/src/components/home/GetStartedBanner.astro create mode 100644 site/src/components/home/Header.astro delete mode 100644 site/src/components/home/HomePageControls.tsx create mode 100644 site/src/components/home/Roadmap.astro create mode 100644 site/src/components/home/SkinControl.tsx create mode 100644 site/src/components/home/Sponsors.astro delete mode 100644 site/src/components/icons/Discord.tsx delete mode 100644 site/src/components/icons/GitHub.tsx create mode 100644 site/src/components/icons/SocialProofLogos.tsx create mode 100644 site/src/components/icons/arrow.svg create mode 100644 site/src/components/icons/check.svg create mode 100644 site/src/components/icons/computer.svg create mode 100644 site/src/components/icons/copy-icon.svg create mode 100644 site/src/components/icons/dial-inner.svg create mode 100644 site/src/components/icons/dial-outer.svg create mode 100644 site/src/components/icons/discord.svg create mode 100644 site/src/components/icons/dropdown-arrow.svg create mode 100644 site/src/components/icons/github.svg create mode 100644 site/src/components/icons/logo-docs.svg create mode 100644 site/src/components/icons/logo-mono.svg create mode 100644 site/src/components/icons/logo.svg create mode 100644 site/src/components/icons/moon.svg create mode 100644 site/src/components/icons/mux-logo-small.svg create mode 100644 site/src/components/icons/mux-logo.svg create mode 100644 site/src/components/icons/sponsors/brightcove.svg create mode 100644 site/src/components/icons/sponsors/browserstack.svg create mode 100644 site/src/components/icons/sponsors/fastly.svg create mode 100644 site/src/components/icons/sponsors/netlify.svg create mode 100644 site/src/components/icons/sun.svg create mode 100644 site/src/components/icons/triangle-arrow.svg create mode 100644 site/src/hooks/useIntersection.ts create mode 100644 site/src/utils/twMerge.ts diff --git a/.claude/skills/api-reference/SKILL.md b/.claude/skills/api-reference/SKILL.md index ebf0a95e..88de6a6d 100644 --- a/.claude/skills/api-reference/SKILL.md +++ b/.claude/skills/api-reference/SKILL.md @@ -80,8 +80,8 @@ Create at least a BasicUsage demo in both HTML and React. Load `references/demo- - Follow BEM naming: `{framework}-{component}-{variant}__{element}` - CSS uses data-attribute selectors for state-based styling - React uses `render` prop for state-based rendering -- Video source: `https://stream.mux.com/lhnU49l1VGi3zrTAZhDm9LUUxSjpaPW9BL4jY25Kwo4/highest.mp4` -- Poster image: `https://image.mux.com/lhnU49l1VGi3zrTAZhDm9LUUxSjpaPW9BL4jY25Kwo4/thumbnail.jpg` +- Video source: `https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4` +- Poster image: `https://image.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/thumbnail.jpg` - Consider additional demos for features not covered by BasicUsage ### Step 5: Create MDX reference page diff --git a/.claude/skills/api-reference/references/demo-patterns.md b/.claude/skills/api-reference/references/demo-patterns.md index 56535131..5f599d7d 100644 --- a/.claude/skills/api-reference/references/demo-patterns.md +++ b/.claude/skills/api-reference/references/demo-patterns.md @@ -52,7 +52,7 @@ The `.astro` wrapper is required because only Astro ` diff --git a/site/src/components/Search/Search.tsx b/site/src/components/Search/Search.tsx index 6c58483b..e766865f 100644 --- a/site/src/components/Search/Search.tsx +++ b/site/src/components/Search/Search.tsx @@ -72,12 +72,12 @@ export default function Search({ children, className, baseUrl, bundlePath, searc {children} - + { value: T | null; @@ -31,7 +32,7 @@ export function Select({ ({   - + @@ -49,7 +50,7 @@ export function Select({ ({ 'flex items-center gap-2 p-2', option.disabled ? 'opacity-50 cursor-default' - : 'cursor-pointer intent:bg-light-80 dark:intent:bg-dark-100', - option.value === value && 'bg-light-80 dark:bg-dark-100' + : 'cursor-pointer intent:bg-manila-75 dark:intent:bg-warm-gray', + option.value === value && 'bg-manila-75 dark:bg-warm-gray' )} > {option.label} - + ))} diff --git a/site/src/components/Tabs.tsx b/site/src/components/Tabs.tsx index 20c94500..3fa701d6 100644 --- a/site/src/components/Tabs.tsx +++ b/site/src/components/Tabs.tsx @@ -16,21 +16,25 @@ import clsx from 'clsx'; -import { Check, Copy } from 'lucide-react'; +import { Check } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; -import { twMerge } from 'tailwind-merge'; +import { twMerge } from '@/utils/twMerge'; import useIsHydrated from '@/utils/useIsHydrated'; import CopyButton from './CopyButton'; +import CopyIcon from './icons/copy-icon.svg?react'; + +export type TabsVariant = 'expanded' | 'compact'; interface TabsRootProps { children: React.ReactNode; maxWidth?: boolean; className?: string; id?: string; + variant?: TabsVariant; } -export function TabsRoot({ children, maxWidth = true, className, id: propId }: TabsRootProps) { +export function TabsRoot({ children, maxWidth = true, className, id: propId, variant = 'compact' }: TabsRootProps) { const ref = useRef(null); const isHydrated = useIsHydrated(); /** @@ -71,9 +75,8 @@ export function TabsRoot({ children, maxWidth = true, className, id: propId }: T ref={ref} className={twMerge( clsx( - 'rounded-lg overflow-hidden border border-light-40 dark:border-dark-80', - 'bg-light-100 dark:bg-dark-110 flex flex-col', - 'my-6', + 'overflow-hidden flex flex-col my-6 border border-faded-black dark:border-manila-dark rounded-xs bg-manila-light dark:bg-faded-black', + variant === 'compact' && 'border px-2.5 pb-2.5', maxWidth && 'w-full max-w-3xl mx-auto', className ) @@ -88,11 +91,19 @@ export function TabsRoot({ children, maxWidth = true, className, id: propId }: T interface TabsListProps { label: string; children: React.ReactNode; + variant?: TabsVariant; } -export function TabsList({ label, children }: TabsListProps) { +export function TabsList({ label, children, variant = 'compact' }: TabsListProps) { return ( -
-
    +
    +
      {children}
    } + className={clsx( + 'ml-auto sticky right-0 h-7 px-2.5 flex items-center justify-center cursor-pointer disabled:cursor-wait intent:bg-warm-gray rounded-xs' + )} + copied={} > - +
    ); @@ -113,8 +126,9 @@ interface TabProps { value: string; children: React.ReactNode; initial?: boolean; + variant?: TabsVariant; } -export function Tab({ value, children, initial }: TabProps) { +export function Tab({ value, children, initial, variant = 'compact' }: TabProps) { const isHydrated = useIsHydrated(); const ref = useRef(null); const [isActive, setIsActive] = useState(initial); @@ -207,7 +221,7 @@ export function Tab({ value, children, initial }: TabProps) { }, []); return ( -
  • +
  • ); @@ -236,8 +267,9 @@ interface TabsPanelProps { children: React.ReactNode; initial?: boolean; className?: string; + variant?: TabsVariant; } -export function TabsPanel({ value, children, initial, className }: TabsPanelProps) { +export function TabsPanel({ value, children, initial, className, variant = 'compact' }: TabsPanelProps) { const ref = useRef(null); const [isActive, setIsActive] = useState(initial); @@ -272,7 +304,10 @@ export function TabsPanel({ value, children, initial, className }: TabsPanelProp role="tabpanel" hidden={!isActive} data-value={value} - className={twMerge(clsx('overflow-scroll p-6 max-h-96 flex-1'), className)} + className={twMerge( + clsx('overflow-scroll p-6 max-h-96 flex-1', variant === 'compact' && 'bg-faded-black dark:bg-soot'), + className + )} > {children}
diff --git a/site/src/components/ThemeInit.astro b/site/src/components/ThemeInit.astro index 4640865d..e750e2ff 100644 --- a/site/src/components/ThemeInit.astro +++ b/site/src/components/ThemeInit.astro @@ -5,29 +5,35 @@ import { THEME_KEY } from '@/consts'; {/* Dark mode initialization script - runs before paint to prevent FOUC */} diff --git a/site/src/components/ThemeToggle.tsx b/site/src/components/ThemeToggle.tsx index 50bbd731..c6a05301 100644 --- a/site/src/components/ThemeToggle.tsx +++ b/site/src/components/ThemeToggle.tsx @@ -1,16 +1,17 @@ -import { Monitor, Moon, Sun } from 'lucide-react'; - import { useEffect, useState } from 'react'; import { THEME_KEY } from '@/consts'; +import Computer from './icons/computer.svg?react'; +import Moon from './icons/moon.svg?react'; +import Sun from './icons/sun.svg?react'; import ToggleGroup from './ToggleGroup'; type Preference = 'system' | 'light' | 'dark'; type Theme = 'light' | 'dark'; const themeOptions = [ - { value: 'system' as const, label: