mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-11 09:51:40 +00:00
* feat: add rhea * fix: blocks * feat: build chat example * fix * fix: sidebar * fix * feat: update home * fix * fix * fix * feat: optimizine fonts * feat * fix * fix * fix * fix * fix * fix * fix: font in preview * fix
120 lines
5.0 KiB
TypeScript
120 lines
5.0 KiB
TypeScript
"use client"
|
|
|
|
import * as React from "react"
|
|
import dynamic from "next/dynamic"
|
|
import { type RegistryItem } from "shadcn/schema"
|
|
|
|
import { useIsMobile } from "@/hooks/use-mobile"
|
|
import { getThemesForBaseColor, STYLES } from "@/registry/config"
|
|
import {
|
|
Card,
|
|
CardContent,
|
|
CardFooter,
|
|
CardHeader,
|
|
} from "@/styles/base-nova/ui/card"
|
|
import { FieldGroup, FieldSeparator } from "@/styles/base-nova/ui/field"
|
|
import { MenuAccentPicker } from "@/app/(app)/create/components/accent-picker"
|
|
import { ActionMenu } from "@/app/(app)/create/components/action-menu"
|
|
import { BaseColorPicker } from "@/app/(app)/create/components/base-color-picker"
|
|
import { BasePicker } from "@/app/(app)/create/components/base-picker"
|
|
import { ChartColorPicker } from "@/app/(app)/create/components/chart-color-picker"
|
|
import { CopyPreset } from "@/app/(app)/create/components/copy-preset"
|
|
import { FontPicker } from "@/app/(app)/create/components/font-picker"
|
|
import { IconLibraryPicker } from "@/app/(app)/create/components/icon-library-picker"
|
|
import { MainMenu } from "@/app/(app)/create/components/main-menu"
|
|
import { MenuColorPicker } from "@/app/(app)/create/components/menu-picker"
|
|
import { OpenPreset } from "@/app/(app)/create/components/open-preset"
|
|
import { RadiusPicker } from "@/app/(app)/create/components/radius-picker"
|
|
import { RandomButton } from "@/app/(app)/create/components/random-button"
|
|
import { ResetDialog } from "@/app/(app)/create/components/reset-button"
|
|
import { StylePicker } from "@/app/(app)/create/components/style-picker"
|
|
import { ThemePicker } from "@/app/(app)/create/components/theme-picker"
|
|
import { FONT_HEADING_OPTIONS, FONTS } from "@/app/(app)/create/lib/fonts"
|
|
import { useDesignSystemSearchParams } from "@/app/(app)/create/lib/search-params"
|
|
|
|
// Only visible when user clicks "Create Project".
|
|
const ProjectForm = dynamic(() =>
|
|
import("@/app/(app)/create/components/project-form").then(
|
|
(m) => m.ProjectForm
|
|
)
|
|
)
|
|
|
|
export function Customizer({
|
|
itemsByBase,
|
|
}: {
|
|
itemsByBase: Record<string, Pick<RegistryItem, "name" | "title" | "type">[]>
|
|
}) {
|
|
const [params] = useDesignSystemSearchParams()
|
|
const isMobile = useIsMobile()
|
|
const anchorRef = React.useRef<HTMLDivElement | null>(null)
|
|
|
|
const availableThemes = React.useMemo(
|
|
() => getThemesForBaseColor(params.baseColor),
|
|
[params.baseColor]
|
|
)
|
|
|
|
return (
|
|
<Card
|
|
className="dark top-24 right-12 isolate z-10 max-h-full min-h-0 w-full self-start rounded-2xl bg-card/90 backdrop-blur-xl md:w-(--customizer-width)"
|
|
ref={anchorRef}
|
|
size="sm"
|
|
>
|
|
<CardHeader className="hidden items-center justify-between gap-2 border-b group-data-reversed/layout:flex-row-reverse md:flex">
|
|
<MainMenu />
|
|
</CardHeader>
|
|
<CardContent className="no-scrollbar min-h-0 flex-1 overflow-x-auto overflow-y-hidden md:overflow-y-auto">
|
|
<FieldGroup className="flex-row gap-2.5 py-px **:data-[slot=field-separator]:-mx-4 **:data-[slot=field-separator]:w-auto md:flex-col md:gap-3.25">
|
|
<StylePicker
|
|
styles={STYLES}
|
|
isMobile={isMobile}
|
|
anchorRef={anchorRef}
|
|
/>
|
|
<FieldSeparator className="hidden md:block" />
|
|
<BaseColorPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
<ThemePicker
|
|
themes={availableThemes}
|
|
isMobile={isMobile}
|
|
anchorRef={anchorRef}
|
|
/>
|
|
<ChartColorPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
<FieldSeparator className="hidden md:block" />
|
|
<FontPicker
|
|
label="Heading"
|
|
param="fontHeading"
|
|
fonts={FONT_HEADING_OPTIONS}
|
|
isMobile={isMobile}
|
|
anchorRef={anchorRef}
|
|
/>
|
|
<FontPicker
|
|
label="Font"
|
|
param="font"
|
|
fonts={FONTS}
|
|
isMobile={isMobile}
|
|
anchorRef={anchorRef}
|
|
/>
|
|
<FieldSeparator className="hidden md:block" />
|
|
<IconLibraryPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
<RadiusPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
<FieldSeparator className="hidden md:block" />
|
|
<MenuColorPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
<MenuAccentPicker isMobile={isMobile} anchorRef={anchorRef} />
|
|
{isMobile && <BasePicker isMobile={isMobile} anchorRef={anchorRef} />}
|
|
</FieldGroup>
|
|
</CardContent>
|
|
<CardFooter className="flex min-w-0 gap-2 md:flex-col md:rounded-b-none md:**:[button,a]:w-full">
|
|
<CopyPreset className="min-w-0 flex-1 md:flex-none" />
|
|
<OpenPreset
|
|
className="max-w-20 min-w-0 flex-1 sm:max-w-none md:flex-none"
|
|
label={isMobile ? "Open" : "Open Preset"}
|
|
/>
|
|
<RandomButton className="max-w-20 min-w-0 flex-1 sm:max-w-none md:flex-none" />
|
|
<ActionMenu itemsByBase={itemsByBase} />
|
|
<ResetDialog />
|
|
</CardFooter>
|
|
<CardFooter className="-mt-3 hidden min-w-0 gap-2 md:flex md:flex-col md:**:[button,a]:w-full">
|
|
<ProjectForm />
|
|
</CardFooter>
|
|
</Card>
|
|
)
|
|
}
|