From 8c4964f94d24f75958e6dc34d19d48e7956ce7f3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 04:45:45 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Add=20Home=20land=E2=86=92setup=E2=86=92lea?= =?UTF-8?q?rn=20hierarchy=20with=20frozen=20wallet=20copy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feature Make a Wallet Fast as the Home setup strip (Devnet-first, official install URLs only), keep the hero to two text CTAs, and move Walk the Loop into Learn Fast so the tools grid is Grade / Ship / Explorer only. Co-authored-by: Phoenix --- src/components/continue-learning.tsx | 43 +++++ src/components/site-chrome.tsx | 45 ++--- src/components/wallet-setup-strip.tsx | 113 ++++++++++++ src/lib/brand.ts | 22 ++- src/lib/learn-progress.ts | 75 ++++++++ src/lib/site-catalog.ts | 19 +- src/routes/index.tsx | 251 ++++++++++---------------- src/routes/learn.tsx | 110 ++++++----- 8 files changed, 435 insertions(+), 243 deletions(-) create mode 100644 src/components/continue-learning.tsx create mode 100644 src/components/wallet-setup-strip.tsx create mode 100644 src/lib/learn-progress.ts diff --git a/src/components/continue-learning.tsx b/src/components/continue-learning.tsx new file mode 100644 index 0000000..00bc246 --- /dev/null +++ b/src/components/continue-learning.tsx @@ -0,0 +1,43 @@ +import { useEffect, useState } from "react"; +import { ArrowRight } from "lucide-react"; +import { getLearnProgress, type LearnProgress } from "@/lib/learn-progress"; +import { cn } from "@/lib/utils"; + +/** + * Renders only when localStorage already has a learn path. + * First visit stays empty — never a decorative Continue chip. + */ +export function ContinueLearningChip({ + hideIfPath, + className, +}: { + hideIfPath?: string; + className?: string; +}) { + const [progress, setProgress] = useState(null); + + useEffect(() => { + const next = getLearnProgress(); + if (next && hideIfPath && next.path === hideIfPath) { + setProgress(null); + return; + } + setProgress(next); + }, [hideIfPath]); + + if (!progress) return null; + + return ( + + Continue Learning + · {progress.title} + + + ); +} diff --git a/src/components/site-chrome.tsx b/src/components/site-chrome.tsx index 2a16a22..3f87ffe 100644 --- a/src/components/site-chrome.tsx +++ b/src/components/site-chrome.tsx @@ -1,21 +1,20 @@ -import type { ReactNode } from "react"; +import { useEffect, type ReactNode } from "react"; import { Link } from "@tanstack/react-router"; import { BrandMark } from "@/components/brand-mark"; import { SupportNudge } from "@/components/support-nudge"; import { BRAND, NAV_LINKS } from "@/lib/brand"; +import { markLearnProgress } from "@/lib/learn-progress"; import { LEARNING_PATH } from "@/lib/learning-path"; import { cn } from "@/lib/utils"; /** Marketing / docs chrome — shipx402.com product site */ -export function SiteChrome({ - children, - activePath, -}: { - children: ReactNode; - activePath?: string; -}) { +export function SiteChrome({ children, activePath }: { children: ReactNode; activePath?: string }) { const guideLinks = LEARNING_PATH.filter((i) => i.path.startsWith("/guides/")); + useEffect(() => { + if (activePath) markLearnProgress(activePath); + }, [activePath]); + return (
-