diff --git a/apps/v4/app/(create)/lib/search-params.ts b/apps/v4/app/(create)/lib/search-params.ts index 6c766ad7ed..1fbd44bd68 100644 --- a/apps/v4/app/(create)/lib/search-params.ts +++ b/apps/v4/app/(create)/lib/search-params.ts @@ -133,7 +133,11 @@ export function useDesignSystemSearchParams(options: Options = {}) { // Use ref so setParams callback stays stable across renders. const paramsRef = React.useRef(params) - paramsRef.current = params + React.useEffect(() => { + paramsRef.current = params + }, [params]) + + type RawSetParamsInput = Parameters[0] const setParams = React.useCallback( ( @@ -153,7 +157,7 @@ export function useDesignSystemSearchParams(options: Options = {}) { if (!hasDesignSystemUpdate) { // No design system change, pass through directly. - return rawSetParams(resolvedUpdates as any, setOptions) + return rawSetParams(resolvedUpdates as RawSetParamsInput, setOptions) } // Merge current decoded values with updates. @@ -187,7 +191,7 @@ export function useDesignSystemSearchParams(options: Options = {}) { } } - return rawSetParams(rawUpdate as any, setOptions) + return rawSetParams(rawUpdate as RawSetParamsInput, setOptions) }, [rawSetParams] ) diff --git a/apps/v4/lib/explore.ts b/apps/v4/lib/explore.ts index 0d737fa863..0768962363 100644 --- a/apps/v4/lib/explore.ts +++ b/apps/v4/lib/explore.ts @@ -1,11 +1,11 @@ export const EXPLORE_PRESETS: string[] = [ - "AuFzoPZ", - "A1zDJJ", - "A1DN5Lx2", - "AbZIu0W", - "AL1Qw4", - "A2He4G", - "A1DOCw6i", - "A1D5CKfo", - "AbYAmrx", + "auFzoPZ", + "a1zDJJ", + "a1DN5Lx2", + "abZIu0W", + "a2r6bw", + "a2He4G", + "a1DOCw6i", + "a1D5CKfo", + "abYAmrx", ] diff --git a/apps/v4/public/presets/A1D5CKfo-dark.png b/apps/v4/public/presets/A1D5CKfo-dark.png index ef702a9527..af680260d5 100644 Binary files a/apps/v4/public/presets/A1D5CKfo-dark.png and b/apps/v4/public/presets/A1D5CKfo-dark.png differ diff --git a/apps/v4/public/presets/A1D5CKfo-light.png b/apps/v4/public/presets/A1D5CKfo-light.png index c7d8be3d68..ac1f3e74ce 100644 Binary files a/apps/v4/public/presets/A1D5CKfo-light.png and b/apps/v4/public/presets/A1D5CKfo-light.png differ diff --git a/apps/v4/public/presets/A1DN5Lx2-dark.png b/apps/v4/public/presets/A1DN5Lx2-dark.png index 2bb41afad9..c21103fb4e 100644 Binary files a/apps/v4/public/presets/A1DN5Lx2-dark.png and b/apps/v4/public/presets/A1DN5Lx2-dark.png differ diff --git a/apps/v4/public/presets/A1DN5Lx2-light.png b/apps/v4/public/presets/A1DN5Lx2-light.png index 16c645d360..190d57ca35 100644 Binary files a/apps/v4/public/presets/A1DN5Lx2-light.png and b/apps/v4/public/presets/A1DN5Lx2-light.png differ diff --git a/apps/v4/public/presets/A1DOCw6i-dark.png b/apps/v4/public/presets/A1DOCw6i-dark.png index 14c0df2d98..9cff9845b0 100644 Binary files a/apps/v4/public/presets/A1DOCw6i-dark.png and b/apps/v4/public/presets/A1DOCw6i-dark.png differ diff --git a/apps/v4/public/presets/A1DOCw6i-light.png b/apps/v4/public/presets/A1DOCw6i-light.png index 4e714dc2ab..337ba41a9b 100644 Binary files a/apps/v4/public/presets/A1DOCw6i-light.png and b/apps/v4/public/presets/A1DOCw6i-light.png differ diff --git a/apps/v4/public/presets/A1zDJJ-dark.png b/apps/v4/public/presets/A1zDJJ-dark.png index 4f2bbde7aa..8af0077c75 100644 Binary files a/apps/v4/public/presets/A1zDJJ-dark.png and b/apps/v4/public/presets/A1zDJJ-dark.png differ diff --git a/apps/v4/public/presets/A1zDJJ-light.png b/apps/v4/public/presets/A1zDJJ-light.png index 51e325144c..9372f34e52 100644 Binary files a/apps/v4/public/presets/A1zDJJ-light.png and b/apps/v4/public/presets/A1zDJJ-light.png differ diff --git a/apps/v4/public/presets/A2He4G-dark.png b/apps/v4/public/presets/A2He4G-dark.png index c9021ab7ad..bdfa513c67 100644 Binary files a/apps/v4/public/presets/A2He4G-dark.png and b/apps/v4/public/presets/A2He4G-dark.png differ diff --git a/apps/v4/public/presets/A2He4G-light.png b/apps/v4/public/presets/A2He4G-light.png index c17dbb3646..42e509bd9f 100644 Binary files a/apps/v4/public/presets/A2He4G-light.png and b/apps/v4/public/presets/A2He4G-light.png differ diff --git a/apps/v4/public/presets/AbYAmrx-dark.png b/apps/v4/public/presets/AbYAmrx-dark.png index 701c1e405d..e6d166b3ea 100644 Binary files a/apps/v4/public/presets/AbYAmrx-dark.png and b/apps/v4/public/presets/AbYAmrx-dark.png differ diff --git a/apps/v4/public/presets/AbYAmrx-light.png b/apps/v4/public/presets/AbYAmrx-light.png index 3bcdce5a9c..4ecf7cf442 100644 Binary files a/apps/v4/public/presets/AbYAmrx-light.png and b/apps/v4/public/presets/AbYAmrx-light.png differ diff --git a/apps/v4/public/presets/AbZIu0W-dark.png b/apps/v4/public/presets/AbZIu0W-dark.png index 8fc47c9b92..de4a7f8119 100644 Binary files a/apps/v4/public/presets/AbZIu0W-dark.png and b/apps/v4/public/presets/AbZIu0W-dark.png differ diff --git a/apps/v4/public/presets/AbZIu0W-light.png b/apps/v4/public/presets/AbZIu0W-light.png index 063252fcce..ac82c4590e 100644 Binary files a/apps/v4/public/presets/AbZIu0W-light.png and b/apps/v4/public/presets/AbZIu0W-light.png differ diff --git a/apps/v4/public/presets/AuFzoPZ-dark.png b/apps/v4/public/presets/AuFzoPZ-dark.png index 4fde9f252f..7c4b0a7950 100644 Binary files a/apps/v4/public/presets/AuFzoPZ-dark.png and b/apps/v4/public/presets/AuFzoPZ-dark.png differ diff --git a/apps/v4/public/presets/AuFzoPZ-light.png b/apps/v4/public/presets/AuFzoPZ-light.png index 9b4ba70edf..2763f654da 100644 Binary files a/apps/v4/public/presets/AuFzoPZ-light.png and b/apps/v4/public/presets/AuFzoPZ-light.png differ diff --git a/apps/v4/public/presets/a2r6bw-dark.png b/apps/v4/public/presets/a2r6bw-dark.png new file mode 100644 index 0000000000..ffbed0e134 Binary files /dev/null and b/apps/v4/public/presets/a2r6bw-dark.png differ diff --git a/apps/v4/public/presets/a2r6bw-light.png b/apps/v4/public/presets/a2r6bw-light.png new file mode 100644 index 0000000000..53d9595f3d Binary files /dev/null and b/apps/v4/public/presets/a2r6bw-light.png differ diff --git a/apps/v4/public/r/styles/base-lyra/preview.json b/apps/v4/public/r/styles/base-lyra/preview.json index 5655949c07..6d5bf41a72 100644 --- a/apps/v4/public/r/styles/base-lyra/preview.json +++ b/apps/v4/public/r/styles/base-lyra/preview.json @@ -34,7 +34,7 @@ "files": [ { "path": "registry/base-lyra/blocks/preview.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Bar, BarChart, CartesianGrid, XAxis } from \"recharts\"\nimport { type IconLibraryName } from \"shadcn/icons\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@/registry/base-lyra/ui/alert-dialog\"\nimport { Badge } from \"@/registry/base-lyra/ui/badge\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\nimport { Checkbox } from \"@/registry/base-lyra/ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\nimport { Field } from \"@/registry/base-lyra/ui/field\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport {\n Item,\n ItemActions,\n ItemContent,\n ItemDescription,\n ItemTitle,\n} from \"@/registry/base-lyra/ui/item\"\nimport {\n RadioGroup,\n RadioGroupItem,\n} from \"@/registry/base-lyra/ui/radio-group\"\nimport { Slider } from \"@/registry/base-lyra/ui/slider\"\nimport { Switch } from \"@/registry/base-lyra/ui/switch\"\nimport { Textarea } from \"@/registry/base-lyra/ui/textarea\"\nimport { RADII } from \"@/registry/config\"\nimport { STYLES } from \"@/registry/styles\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\nimport { FONTS } from \"@/app/(create)/lib/fonts\"\nimport { useDesignSystemSearchParams } from \"@/app/(create)/lib/search-params\"\n\nconst PREVIEW_ICONS = [\n {\n lucide: \"CopyIcon\",\n tabler: \"IconCopy\",\n hugeicons: \"Copy01Icon\",\n phosphor: \"CopyIcon\",\n remixicon: \"RiFileCopyLine\",\n },\n {\n lucide: \"CircleAlertIcon\",\n tabler: \"IconExclamationCircle\",\n hugeicons: \"AlertCircleIcon\",\n phosphor: \"WarningCircleIcon\",\n remixicon: \"RiErrorWarningLine\",\n },\n {\n lucide: \"TrashIcon\",\n tabler: \"IconTrash\",\n hugeicons: \"Delete02Icon\",\n phosphor: \"TrashIcon\",\n remixicon: \"RiDeleteBinLine\",\n },\n {\n lucide: \"ShareIcon\",\n tabler: \"IconShare\",\n hugeicons: \"Share03Icon\",\n phosphor: \"ShareIcon\",\n remixicon: \"RiShareLine\",\n },\n {\n lucide: \"ShoppingBagIcon\",\n tabler: \"IconShoppingBag\",\n hugeicons: \"ShoppingBag01Icon\",\n phosphor: \"BagIcon\",\n remixicon: \"RiShoppingBagLine\",\n },\n {\n lucide: \"MoreHorizontalIcon\",\n tabler: \"IconDots\",\n hugeicons: \"MoreHorizontalCircle01Icon\",\n phosphor: \"DotsThreeIcon\",\n remixicon: \"RiMoreLine\",\n },\n {\n lucide: \"Loader2Icon\",\n tabler: \"IconLoader\",\n hugeicons: \"Loading03Icon\",\n phosphor: \"SpinnerIcon\",\n remixicon: \"RiLoaderLine\",\n },\n {\n lucide: \"PlusIcon\",\n tabler: \"IconPlus\",\n hugeicons: \"PlusSignIcon\",\n phosphor: \"PlusIcon\",\n remixicon: \"RiAddLine\",\n },\n {\n lucide: \"MinusIcon\",\n tabler: \"IconMinus\",\n hugeicons: \"MinusSignIcon\",\n phosphor: \"MinusIcon\",\n remixicon: \"RiSubtractLine\",\n },\n {\n lucide: \"ArrowLeftIcon\",\n tabler: \"IconArrowLeft\",\n hugeicons: \"ArrowLeft02Icon\",\n phosphor: \"ArrowLeftIcon\",\n remixicon: \"RiArrowLeftLine\",\n },\n {\n lucide: \"ArrowRightIcon\",\n tabler: \"IconArrowRight\",\n hugeicons: \"ArrowRight02Icon\",\n phosphor: \"ArrowRightIcon\",\n remixicon: \"RiArrowRightLine\",\n },\n {\n lucide: \"CheckIcon\",\n tabler: \"IconCheck\",\n hugeicons: \"Tick02Icon\",\n phosphor: \"CheckIcon\",\n remixicon: \"RiCheckLine\",\n },\n {\n lucide: \"ChevronDownIcon\",\n tabler: \"IconChevronDown\",\n hugeicons: \"ArrowDown01Icon\",\n phosphor: \"CaretDownIcon\",\n remixicon: \"RiArrowDownSLine\",\n },\n {\n lucide: \"ChevronRightIcon\",\n tabler: \"IconChevronRight\",\n hugeicons: \"ArrowRight01Icon\",\n phosphor: \"CaretRightIcon\",\n remixicon: \"RiArrowRightSLine\",\n },\n] satisfies Record[]\n\nconst barChartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst barChartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--chart-1)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--chart-2)\",\n },\n} satisfies ChartConfig\n\nexport default function PreviewExample() {\n const [params] = useDesignSystemSearchParams()\n\n const currentFont = React.useMemo(\n () => FONTS.find((font) => font.value === params.font),\n [params.font]\n )\n\n const currentStyle = React.useMemo(\n () => STYLES.find((style) => style.name === params.style),\n [params.style]\n )\n\n const radiusValue = React.useMemo(() => {\n const radius = RADII.find((r) => r.name === params.radius)\n return radius?.value ?? \"\"\n }, [params.radius])\n\n return (\n \n \n \n
\n \n \n
\n
\n {currentStyle?.title} - {currentFont?.name}\n
\n
\n Designers love packing quirky glyphs into test phrases. This\n is a preview of the typography styles.\n
\n
\n
\n {[\n \"Background\",\n \"Primary\",\n \"Secondary\",\n \"Muted\",\n \"Accent\",\n \"Destructive\",\n ].map((variant) => (\n \n \n
\n {variant}\n
\n
\n ))}\n
\n \n \n \n \n \n \n \n value.slice(0, 3)}\n />\n }\n />\n \n \n \n \n \n \n \n
\n \n \n
\n {PREVIEW_ICONS.map((icon, index) => (\n \n \n \n ))}\n
\n
\n
\n \n \n
\n
\n \n \n \n \n
\n \n \n Two-factor authentication\n \n Verify via email or phone number.\n \n \n \n \n \n \n
\n Badge\n Secondary\n Outline\n
\n \n \n \n \n \n
\n \n \n
\n
\n
\n
\n \n \n \n \n