"use client"; import type { ReactNode } from "react"; import { Button } from "@/ui"; /** * The onboarding stage: one focal surface at a time, generous negative space, a ghost * glyph behind the content. Replaces the 18rem stepper rail + dense two-column layout — * progress is a quiet eyebrow ("STEP 1 OF 3") and three dots, nothing more. */ export interface SetupSurface { readonly eyebrow: string; readonly title: string; readonly sub?: string; } export function SetupShell({ surfaceIndex, surfaceCount, surface, onSkip, children, }: { surfaceIndex: number; surfaceCount: number; surface: SetupSurface; onSkip: () => void; children: ReactNode; }) { return (
{/* Ghost glyph, Grok-style: enormous, barely-there. Fixed in its own clipping layer so it neither scrolls with the content nor blocks scrolling. */}
LS
{surface.eyebrow} {Array.from({ length: surfaceCount }, (_, index) => ( ))}

{surface.title}

{surface.sub ? (

{surface.sub}

) : null}
{children}
); } /* ── checklist primitives (the Grok "get you up and running" card) ────────── */ export type ChecklistState = "pending" | "active" | "done"; export function ChecklistRow({ state, title, meta, action, children, }: { state: ChecklistState; title: string; /** Right-aligned quiet detail shown when the row is not expanded. */ meta?: ReactNode; /** Compact action shown in the row head while active. */ action?: ReactNode; /** Expanded body, rendered only while active. */ children?: ReactNode; }) { return (
{title} {state !== "active" && meta ? ( {meta} ) : null} {state === "active" && action ? {action} : null}
{state === "active" && children ? (
{children}
) : null}
); } function ChecklistMark({ state }: { state: ChecklistState }) { if (state === "done") { return ( ); } return ( ); }