From 3aa50ddc9d8fb219c53a958099e2fc4af9f0fbc8 Mon Sep 17 00:00:00 2001 From: shadcn Date: Fri, 6 Mar 2026 16:05:01 +0400 Subject: [PATCH] feat: update create page --- .../app/(create)/components/accent-picker.tsx | 2 +- .../(create)/components/base-color-picker.tsx | 2 +- .../app/(create)/components/base-picker.tsx | 2 +- .../components/design-system-provider.tsx | 32 +++++++++++++++---- .../app/(create)/components/font-picker.tsx | 2 +- .../components/icon-library-picker.tsx | 2 +- apps/v4/app/(create)/components/main-menu.tsx | 2 +- .../app/(create)/components/menu-picker.tsx | 2 +- apps/v4/app/(create)/components/picker.tsx | 2 +- .../app/(create)/components/radius-picker.tsx | 2 +- .../app/(create)/components/style-picker.tsx | 2 +- .../app/(create)/components/theme-picker.tsx | 2 +- .../v4/app/(create)/hooks/use-iframe-sync.tsx | 10 ++++-- apps/v4/app/(create)/hooks/use-random.tsx | 22 ++++++++++--- 14 files changed, 63 insertions(+), 23 deletions(-) diff --git a/apps/v4/app/(create)/components/accent-picker.tsx b/apps/v4/app/(create)/components/accent-picker.tsx index 992c5b6217..ae83121779 100644 --- a/apps/v4/app/(create)/components/accent-picker.tsx +++ b/apps/v4/app/(create)/components/accent-picker.tsx @@ -35,7 +35,7 @@ export function MenuAccentPicker({ {currentAccent?.label} -
+
)} diff --git a/apps/v4/app/(create)/components/base-picker.tsx b/apps/v4/app/(create)/components/base-picker.tsx index c63de06dc7..f43b11460d 100644 --- a/apps/v4/app/(create)/components/base-picker.tsx +++ b/apps/v4/app/(create)/components/base-picker.tsx @@ -51,7 +51,7 @@ export function BasePicker({
{currentBase?.meta?.logo && (
{ + setLiveSearchParams(searchParams) + }, [searchParams]) + + const handleDesignSystemMessage = React.useCallback( + (nextParams: DesignSystemSearchParams) => { + setLiveSearchParams(nextParams) + setSearchParams(nextParams) + }, + [setSearchParams] + ) + + useIframeMessageListener("design-system-params", handleDesignSystemMessage) + React.useEffect(() => { if (style === "lyra" && radius !== "none") { + setLiveSearchParams((prev) => ({ + ...prev, + radius: "none", + })) setSearchParams({ radius: "none" as RadiusValue }) } }, [style, radius, setSearchParams]) diff --git a/apps/v4/app/(create)/components/font-picker.tsx b/apps/v4/app/(create)/components/font-picker.tsx index f271e9e01a..895b735429 100644 --- a/apps/v4/app/(create)/components/font-picker.tsx +++ b/apps/v4/app/(create)/components/font-picker.tsx @@ -69,7 +69,7 @@ export function FontPicker({
Aa diff --git a/apps/v4/app/(create)/components/icon-library-picker.tsx b/apps/v4/app/(create)/components/icon-library-picker.tsx index e5f80727ac..302bbc6fe3 100644 --- a/apps/v4/app/(create)/components/icon-library-picker.tsx +++ b/apps/v4/app/(create)/components/icon-library-picker.tsx @@ -133,7 +133,7 @@ export function IconLibraryPicker({ {currentIconLibrary?.title}
-
+
{logos[currentIconLibrary?.name as keyof typeof logos]}
diff --git a/apps/v4/app/(create)/components/main-menu.tsx b/apps/v4/app/(create)/components/main-menu.tsx index 302cc7a5ee..9e8fd11d3c 100644 --- a/apps/v4/app/(create)/components/main-menu.tsx +++ b/apps/v4/app/(create)/components/main-menu.tsx @@ -52,7 +52,7 @@ export function MainMenu({ className }: React.ComponentProps) { - Quick actions{" "} + Navigate... {isMac ? "⌘P" : "Ctrl+P"} diff --git a/apps/v4/app/(create)/components/menu-picker.tsx b/apps/v4/app/(create)/components/menu-picker.tsx index 2b442e2c10..df37d715c6 100644 --- a/apps/v4/app/(create)/components/menu-picker.tsx +++ b/apps/v4/app/(create)/components/menu-picker.tsx @@ -128,7 +128,7 @@ export function MenuColorPicker({ {currentMenu?.label}
-
+
{currentMenu?.icon}
diff --git a/apps/v4/app/(create)/components/picker.tsx b/apps/v4/app/(create)/components/picker.tsx index a5d29dd3dc..8e2775389f 100644 --- a/apps/v4/app/(create)/components/picker.tsx +++ b/apps/v4/app/(create)/components/picker.tsx @@ -19,7 +19,7 @@ function PickerTrigger({ className, ...props }: MenuPrimitive.Trigger.Props) {
-
+
{currentStyle?.icon && ( -
+
{React.cloneElement(currentStyle.icon, { className: "size-4", })} diff --git a/apps/v4/app/(create)/components/theme-picker.tsx b/apps/v4/app/(create)/components/theme-picker.tsx index 532d2ecd1e..00a7f52eaf 100644 --- a/apps/v4/app/(create)/components/theme-picker.tsx +++ b/apps/v4/app/(create)/components/theme-picker.tsx @@ -64,7 +64,7 @@ export function ThemePicker({ ], } as React.CSSProperties } - className="pointer-events-none absolute top-1/2 right-4 size-4 -translate-y-1/2 rounded-full bg-(--color) select-none md:right-2" + className="pointer-events-none absolute top-1/2 right-4 size-4 -translate-y-1/2 rounded-full bg-(--color) select-none md:right-2.5" /> )} diff --git a/apps/v4/app/(create)/hooks/use-iframe-sync.tsx b/apps/v4/app/(create)/hooks/use-iframe-sync.tsx index b914f7c77b..ec0bc70ad3 100644 --- a/apps/v4/app/(create)/hooks/use-iframe-sync.tsx +++ b/apps/v4/app/(create)/hooks/use-iframe-sync.tsx @@ -23,6 +23,12 @@ export function useIframeMessageListener< messageType: MessageType, onMessage: (data: Extract["data"]) => void ) { + const onMessageRef = React.useRef(onMessage) + + React.useEffect(() => { + onMessageRef.current = onMessage + }, [onMessage]) + React.useEffect(() => { if (!isInIframe()) { return @@ -30,7 +36,7 @@ export function useIframeMessageListener< const handleMessage = (event: MessageEvent) => { if (event.data.type === messageType) { - onMessage(event.data.data) + onMessageRef.current(event.data.data) } } @@ -38,7 +44,7 @@ export function useIframeMessageListener< return () => { window.removeEventListener("message", handleMessage) } - }, [messageType, onMessage]) + }, [messageType]) } export function sendToIframe< diff --git a/apps/v4/app/(create)/hooks/use-random.tsx b/apps/v4/app/(create)/hooks/use-random.tsx index 45a1f43986..b15d29140b 100644 --- a/apps/v4/app/(create)/hooks/use-random.tsx +++ b/apps/v4/app/(create)/hooks/use-random.tsx @@ -79,7 +79,7 @@ export function useRandom() { context.font = selectedFont context.radius = selectedRadius - setParams({ + const nextParams = { style: selectedStyle, baseColor, theme: selectedTheme, @@ -88,9 +88,23 @@ export function useRandom() { menuAccent: selectedMenuAccent, menuColor: selectedMenuColor, radius: selectedRadius, - }) + } + + // Keep the ref in sync so rapid repeats use the latest randomized state + // even before the URL state finishes committing. + paramsRef.current = { + ...paramsRef.current, + ...nextParams, + } + + setParams(nextParams) }, [setParams, locks]) + const randomizeRef = React.useRef(randomize) + React.useEffect(() => { + randomizeRef.current = randomize + }, [randomize]) + React.useEffect(() => { const down = (e: KeyboardEvent) => { if ((e.key === "r" || e.key === "R") && !e.metaKey && !e.ctrlKey) { @@ -104,7 +118,7 @@ export function useRandom() { } e.preventDefault() - randomize() + randomizeRef.current() } } @@ -112,7 +126,7 @@ export function useRandom() { return () => { document.removeEventListener("keydown", down) } - }, [randomize]) + }, []) return { randomize } }