@fayz-ai/ui 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/derive.d.ts +1 -9
- package/dist/analytics/derive.d.ts.map +1 -1
- package/dist/{chunk-DFOAKWYB.js → chunk-5NEADAIP.js} +3 -3
- package/dist/{chunk-DFOAKWYB.js.map → chunk-5NEADAIP.js.map} +1 -1
- package/dist/{chunk-Z2ITFPGL.js → chunk-5WSKZU7M.js} +547 -74
- package/dist/chunk-5WSKZU7M.js.map +1 -0
- package/dist/{chunk-OBIU37AX.js → chunk-6YFPPK7X.js} +28 -14
- package/dist/chunk-6YFPPK7X.js.map +1 -0
- package/dist/{chunk-ZLPYNHXH.js → chunk-ERSX3C7T.js} +3 -3
- package/dist/{chunk-ZLPYNHXH.js.map → chunk-ERSX3C7T.js.map} +1 -1
- package/dist/{chunk-3OVZ5JJQ.js → chunk-GLRLWBBF.js} +4 -3
- package/dist/chunk-GLRLWBBF.js.map +1 -0
- package/dist/{chunk-AASANYXN.js → chunk-OB2ULDBD.js} +6 -4
- package/dist/chunk-OB2ULDBD.js.map +1 -0
- package/dist/chunk-SB6DWHXI.js +199 -0
- package/dist/chunk-SB6DWHXI.js.map +1 -0
- package/dist/dashboard/index.js +2 -2
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -25
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.d.ts +7 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/SaveBar.d.ts +10 -1
- package/dist/layout/SaveBar.d.ts.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/index.js +3 -3
- package/dist/lib/error-message.d.ts +2 -0
- package/dist/lib/error-message.d.ts.map +1 -0
- package/dist/primitives/brand-marks.d.ts +11 -0
- package/dist/primitives/brand-marks.d.ts.map +1 -0
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/dot-badge.d.ts +27 -0
- package/dist/primitives/dot-badge.d.ts.map +1 -0
- package/dist/primitives/draft-commit-bar.d.ts +27 -0
- package/dist/primitives/draft-commit-bar.d.ts.map +1 -0
- package/dist/primitives/filter-check-list.d.ts +65 -0
- package/dist/primitives/filter-check-list.d.ts.map +1 -0
- package/dist/primitives/header-tabs.d.ts +19 -0
- package/dist/primitives/header-tabs.d.ts.map +1 -1
- package/dist/primitives/image-drop.d.ts.map +1 -1
- package/dist/primitives/index.d.ts +6 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -4
- package/dist/primitives/list-chrome.d.ts +5 -1
- package/dist/primitives/list-chrome.d.ts.map +1 -1
- package/dist/primitives/mini-calendar.d.ts +36 -0
- package/dist/primitives/mini-calendar.d.ts.map +1 -0
- package/dist/primitives/multi-select.d.ts +21 -0
- package/dist/primitives/multi-select.d.ts.map +1 -0
- package/dist/primitives/select.d.ts.map +1 -1
- package/dist/primitives/stock-entry-form.d.ts +52 -0
- package/dist/primitives/stock-entry-form.d.ts.map +1 -0
- package/dist/styles.css +100 -0
- package/dist/tailwind.cjs +1 -1
- package/dist/tailwind.cjs.map +1 -1
- package/dist/tailwind.js +1 -1
- package/dist/tailwind.js.map +1 -1
- package/dist/wizard/index.js +2 -2
- package/dist/wizard/useWizard.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-3OVZ5JJQ.js.map +0 -1
- package/dist/chunk-4GK6IHOI.js +0 -177
- package/dist/chunk-4GK6IHOI.js.map +0 -1
- package/dist/chunk-AASANYXN.js.map +0 -1
- package/dist/chunk-OBIU37AX.js.map +0 -1
- package/dist/chunk-Z2ITFPGL.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/icons.ts"],"names":[],"mappings":";;;AAiCA,IAAM,QAAA,GAAuC;AAAA,EAC3C,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,KAAA;AAAA,EAAO,eAAA;AAAA,EAAiB,cAAA;AAAA,EAAgB,cAAA;AAAA,EAAgB,aAAA;AAAA,EAAe,YAAA;AAAA,EAChG,KAAA;AAAA,EAAO,eAAA;AAAA,EAAiB,GAAA;AAAA,EAAK,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,QAAA;AAAA,EAC9D,aAAA;AAAA,EAAe,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,cAAA;AAAA,EAC1E,aAAA;AAAA,EAAe,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,WAAA;AAAA,EACzF,WAAA;AAAA,EAAa,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,cAAA;AAAA,EAAgB,MAAA;AAAA,EAAQ,WAAA;AAAA,EAAa,gBAAA;AAAA,EAAkB,YAAA;AAAA,EAC1F,cAAA;AAAA,EAAgB,aAAA;AAAA,EAChB,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,GAAA;AAAA,EACzE,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,GAAA;AAAA,EAAK,YAAA;AAAA,EAAc,GAAA;AAAA,EAAK,UAAA;AAAA,EAAY,QAAA;AAAA,EAC1D,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,aAAA;AAAA,EAAe,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,SAAA;AAAA,EACpF,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,eAAA;AAAA,EAAiB,cAAA;AAAA,EACtF,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,IAAA;AAAA,EAC1E,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,aAAA;AAAA,EAAe,GAAA;AAAA,EAAK,cAAA;AAAA,EACjE,iBAAA;AAAA,EAAmB,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,QAAA;AAAA,EAClF,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAClE,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,MAAA;AAAA,EAC5E,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,KAAA;AAAA,EAAO,iBAAA;AAAA,EAAmB,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM,GAAA;AAAA,EACxF,eAAA;AAAA,EAAiB,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAC9F,IAAA;AAAA,EAAM,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,YAAA;AAAA,EACxE,MAAA;AAAA,EAAQ,eAAA;AAAA,EAAiB,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,CAAA;AAAA,EAAG,OAAA;AAAA,EACxE;AACF,CAAA;AAGO,SAAS,cAAc,KAAA,EAAyC;AACrE,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAK,CAAA;AAC/B;AAGO,SAAS,cAAc,IAAA,EAAsC;AAClE,EAAA,OAAO,SAAS,IAAI,CAAA;AACtB;AAGO,IAAM,QAAA,GAAW","file":"chunk-4GK6IHOI.js","sourcesContent":["import type { LucideIcon } from 'lucide-react'\nimport {\n Activity, AlertTriangle, Apple, ArrowDownCircle, ArrowDownRight, ArrowLeftRight, ArrowUpCircle, ArrowUpRight,\n Award, BadgeDollarSign, Ban, Banknote, BarChart3, Bell, Bike, BookOpen,\n BookOpenCheck, Box, Boxes, Briefcase, Building2, Calendar, CalendarCheck, CalendarCheck2,\n CalendarClock, CalendarDays, CalendarPlus, CalendarRange, CalendarX, Camera, Cat, Check, CheckCircle,\n CheckSquare, ChefHat, ChevronDown, ChevronsUpDown, Circle, CircleCheck, CircleDollarSign, Clapperboard,\n ClipboardCheck, ClipboardList,\n Clock, Clock3, Command, Compass, Contact, CookingPot, CreditCard, Disc3, Dog,\n DollarSign, DoorOpen, Egg, ExternalLink, Eye, FileCheck2, FileDown,\n FileText, Filter, Flame, FolderOpen, Gauge, Globe, GraduationCap, Handshake, Heart, Hourglass,\n FolderTree, Home, Image, Images, Inbox, Instagram, Landmark, Layers, LayoutDashboard, LayoutTemplate,\n Leaf, LeafyGreen, LineChart, Link, List, ListChecks, ListMusic, ListPlus, Lock,\n Mail, Map, MapPin, Megaphone, MessageCircle, MessageSquare, Mic, MoreHorizontal,\n MousePointerClick, Music, Newspaper, Package, PackageCheck, Palette, PartyPopper, PawPrint,\n Pencil, Percent, Phone, PieChart, Plug, Plus, PlusCircle, Puzzle, Radio,\n Receipt, Repeat, RotateCcw, RotateCw, Ruler, Scale, Search, Send, Settings, Shield,\n ShieldCheck, ShoppingBag, ShoppingCart, Sigma, SlidersHorizontal, Soup, Sparkles, Star, Tag,\n TableProperties, Tags, Target, Timer, ToggleLeft, TreePalm, TrendingDown, TrendingUp, Trophy, Truck,\n User, UserCheck, UserCog, UserPlus, UserX, Users, UsersRound, Utensils, WandSparkles,\n Upload, UtensilsCrossed, Wallet, Warehouse, Wheat, Workflow, Wrench, X, XCircle,\n Zap,\n} from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Central lucide icon registry. The SDK's manifest-driven surfaces resolve\n// icons by string name; a namespace import (`import * as LucideIcons`) defeats\n// tree-shaking and drags all ~1,500 icons (~500 KB min) into every bundle, so\n// the SDK ships this curated set instead — the union of every icon name the\n// SDK, plugins, and app templates reference. Apps using names outside the set\n// call registerIcons({ Name: Component }) with their own named imports.\n// ---------------------------------------------------------------------------\n\nconst registry: Record<string, LucideIcon> = {\n Activity, AlertTriangle, Apple, ArrowDownCircle, ArrowDownRight, ArrowLeftRight, ArrowUpCircle, ArrowUpRight,\n Award, BadgeDollarSign, Ban, Banknote, BarChart3, Bell, Bike, BookOpen,\n BookOpenCheck, Box, Boxes, Briefcase, Building2, Calendar, CalendarCheck, CalendarCheck2,\n CalendarClock, CalendarDays, CalendarPlus, CalendarRange, CalendarX, Camera, Cat, Check, CheckCircle,\n CheckSquare, ChefHat, ChevronDown, ChevronsUpDown, Circle, CircleCheck, CircleDollarSign, Clapperboard,\n ClipboardCheck, ClipboardList,\n Clock, Clock3, Command, Compass, Contact, CookingPot, CreditCard, Disc3, Dog,\n DollarSign, DoorOpen, Egg, ExternalLink, Eye, FileCheck2, FileDown,\n FileText, Filter, Flame, FolderOpen, Gauge, Globe, GraduationCap, Handshake, Heart, Hourglass,\n FolderTree, Home, Image, Images, Inbox, Instagram, Landmark, Layers, LayoutDashboard, LayoutTemplate,\n Leaf, LeafyGreen, LineChart, Link, List, ListChecks, ListMusic, ListPlus, Lock,\n Mail, Map, MapPin, Megaphone, MessageCircle, MessageSquare, Mic, MoreHorizontal,\n MousePointerClick, Music, Newspaper, Package, PackageCheck, Palette, PartyPopper, PawPrint,\n Pencil, Percent, Phone, PieChart, Plug, Plus, PlusCircle, Puzzle, Radio,\n Receipt, Repeat, RotateCcw, RotateCw, Ruler, Scale, Search, Send, Settings, Shield,\n ShieldCheck, ShoppingBag, ShoppingCart, Sigma, SlidersHorizontal, Soup, Sparkles, Star, Tag,\n TableProperties, Tags, Target, Timer, ToggleLeft, TreePalm, TrendingDown, TrendingUp, Trophy, Truck,\n User, UserCheck, UserCog, UserPlus, UserX, Users, UsersRound, Utensils, WandSparkles,\n Upload, UtensilsCrossed, Wallet, Warehouse, Wheat, Workflow, Wrench, X, XCircle,\n Zap,\n}\n\n/** Add or override icons resolvable by string name (e.g. from app manifests). */\nexport function registerIcons(icons: Record<string, LucideIcon>): void {\n Object.assign(registry, icons)\n}\n\n/** Resolve a lucide icon by name; undefined when not registered. */\nexport function getLucideIcon(name: string): LucideIcon | undefined {\n return registry[name]\n}\n\n/** The registered icon map (live reference — do not mutate directly). */\nexport const ICON_MAP = registry\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wizard/logic.ts","../src/wizard/useWizard.ts","../src/wizard/WizardField.tsx","../src/wizard/Wizard.tsx"],"names":["visibleSteps","visibleFields","next","fieldErrors","canAdvance","jsxs","jsx","React2","Loader2"],"mappings":"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","file":"chunk-AASANYXN.js","sourcesContent":["import type { WizardFieldDef, WizardStepDef, WizardValues } from './types'\n\n/**\n * The wizard's decisions, without React.\n *\n * Which steps show, which fields show, what blocks the button — all of it is a\n * function of the answers, so it lives here where it can be tested directly\n * instead of through a rendered component.\n */\n\nexport function isEmpty(value: unknown): boolean {\n if (value === undefined || value === null) return true\n if (typeof value === 'string') return value.trim() === ''\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function visibleSteps(\n steps: ReadonlyArray<WizardStepDef>,\n values: WizardValues,\n): ReadonlyArray<WizardStepDef> {\n return steps.filter((s) => (s.visibleWhen ? s.visibleWhen(values) : true))\n}\n\nexport function visibleFields(\n step: WizardStepDef | undefined,\n values: WizardValues,\n): ReadonlyArray<WizardFieldDef> {\n return (step?.fields ?? []).filter((f) => (f.visibleWhen ? f.visibleWhen(values) : true))\n}\n\n/**\n * Per-field messages for the current step.\n *\n * An untouched required field gets no message: a red line before someone has had\n * a chance to type reads as a failure they caused. The disabled button says the\n * same thing without the accusation — see `canAdvance`.\n */\nexport function fieldErrors(\n fields: ReadonlyArray<WizardFieldDef>,\n values: WizardValues,\n asyncErrors: Record<string, string | null> = {},\n): Record<string, string | null> {\n const out: Record<string, string | null> = {}\n for (const field of fields) {\n const value = values[field.id]\n out[field.id] = (isEmpty(value) ? null : field.validate?.(value, values)) ?? asyncErrors[field.id] ?? null\n }\n return out\n}\n\nexport function canAdvance(\n step: WizardStepDef | undefined,\n fields: ReadonlyArray<WizardFieldDef>,\n values: WizardValues,\n errors: Record<string, string | null>,\n): boolean {\n if (!step) return false\n if (fields.some((f) => f.required && isEmpty(values[f.id]))) return false\n if (Object.values(errors).some(Boolean)) return false\n return !step.validate?.(values)\n}\n\n/**\n * Which of a `suggest`'s answers may actually land.\n *\n * Three refusals, each for its own reason: a field nobody asks about would sit\n * in the answers invisibly and still get submitted; a field the user has\n * answered is theirs, and a slow reply must not overwrite what they typed while\n * waiting for it; an empty value would mark a field as \"suggested\" while\n * changing nothing on screen.\n */\nexport function acceptableSuggestion(\n patch: WizardValues,\n knownFieldIds: ReadonlySet<string>,\n answered: ReadonlySet<string>,\n): WizardValues {\n const accepted: WizardValues = {}\n for (const [id, value] of Object.entries(patch)) {\n if (!knownFieldIds.has(id)) continue\n if (answered.has(id)) continue\n if (isEmpty(value)) continue\n accepted[id] = value\n }\n return accepted\n}\n\n/** Every field id the flow asks about, across all steps — visible or not. */\nexport function allFieldIds(steps: ReadonlyArray<WizardStepDef>): Set<string> {\n return new Set(steps.flatMap((s) => (s.fields ?? []).map((f) => f.id)))\n}\n\nexport interface WizardDraft {\n index: number\n values: WizardValues\n}\n\n/** Tolerant on purpose: a corrupt draft is a fresh start, never a crash. */\nexport function parseDraft(raw: string | null): WizardDraft | null {\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as { index?: unknown; values?: unknown }\n const values = parsed.values && typeof parsed.values === 'object' ? (parsed.values as WizardValues) : {}\n return { index: typeof parsed.index === 'number' ? parsed.index : 0, values }\n } catch {\n return null\n }\n}\n","import * as React from 'react'\nimport {\n acceptableSuggestion,\n allFieldIds,\n canAdvance as computeCanAdvance,\n fieldErrors as computeFieldErrors,\n isEmpty,\n parseDraft,\n visibleFields as computeVisibleFields,\n visibleSteps as computeVisibleSteps,\n type WizardDraft,\n} from './logic'\nimport type { WizardFieldDef, WizardStepDef, WizardValues } from './types'\n\nexport interface UseWizardOptions {\n steps: ReadonlyArray<WizardStepDef>\n initialValues?: WizardValues\n /**\n * localStorage key for the in-progress draft. Someone who closes the tab\n * mid-flow should not have to answer everything again. Omit to keep it in memory.\n */\n draftKey?: string\n onSubmit?: (values: WizardValues) => Promise<void> | void\n}\n\nexport interface UseWizardResult {\n /** Only the steps whose `visibleWhen` passes for the current answers. */\n steps: ReadonlyArray<WizardStepDef>\n step: WizardStepDef | undefined\n index: number\n total: number\n values: WizardValues\n setValue: (id: string, value: unknown) => void\n /** Per-field messages for the current step, keyed by field id. */\n fieldErrors: Record<string, string | null>\n /** The step-level blocking message, or null. Field-level ones live in `fieldErrors`. */\n blocker: string | null\n canAdvance: boolean\n isFirst: boolean\n isLast: boolean\n submitting: boolean\n error: string | null\n next: () => void\n back: () => void\n goTo: (index: number) => void\n submit: () => Promise<void>\n /** True once the user has answered anything, or resumed a draft that had. */\n touched: boolean\n /** Forget the persisted draft — call after a successful submit. */\n clearDraft: () => void\n /** Fields of the current step that pass their own `visibleWhen`. */\n visibleFields: ReadonlyArray<WizardFieldDef>\n /** Id of the field whose `suggest` is in flight, or null. */\n suggesting: string | null\n /** Fields currently holding a suggested answer rather than one the user gave. */\n suggested: ReadonlySet<string>\n /** Drop a suggestion the user disagrees with, and stop marking the field. */\n clearSuggestion: (id: string) => void\n}\n\nfunction readDraft(key: string | undefined): WizardDraft | null {\n if (!key || typeof localStorage === 'undefined') return null\n try {\n return parseDraft(localStorage.getItem(key))\n } catch {\n return null\n }\n}\n\nexport function useWizard({ steps, initialValues, draftKey, onSubmit }: UseWizardOptions): UseWizardResult {\n const [draft] = React.useState(() => readDraft(draftKey))\n const [values, setValues] = React.useState<WizardValues>(() => ({ ...initialValues, ...draft?.values }))\n const [index, setIndex] = React.useState(() => draft?.index ?? 0)\n const [submitting, setSubmitting] = React.useState(false)\n // Whether there is anything to lose. Seeded values (the account's own e-mail)\n // are ours, not theirs — warning about discarding those is warning about\n // nothing. A resumed draft counts: they typed it, just not this session.\n const [touched, setTouched] = React.useState(() => Object.keys(draft?.values ?? {}).length > 0)\n const [error, setError] = React.useState<string | null>(null)\n /** Async field errors (slug taken), keyed by field id. */\n const [asyncErrors, setAsyncErrors] = React.useState<Record<string, string | null>>({})\n const [suggesting, setSuggesting] = React.useState<string | null>(null)\n const [suggested, setSuggested] = React.useState<ReadonlySet<string>>(() => new Set())\n\n const visibleSteps = React.useMemo(() => computeVisibleSteps(steps, values), [steps, values])\n\n // Hiding a step can shorten the flow past where we are standing.\n const safeIndex = Math.min(index, Math.max(visibleSteps.length - 1, 0))\n const step = visibleSteps[safeIndex]\n\n const visibleFields = React.useMemo(() => computeVisibleFields(step, values), [step, values])\n\n // Seed derived fields (the slug from the name) once there is something to\n // derive FROM, then never again — re-deriving would overwrite an edit the\n // user just made. Seeding on an empty source is what silently burned the one\n // chance: it marked the field derived and wrote nothing.\n const derivedRef = React.useRef(new Set<string>())\n React.useEffect(() => {\n const seeds = visibleFields\n .filter((f) => f.derive && !derivedRef.current.has(f.id) && isEmpty(values[f.id]))\n .map((f) => [f, f.derive!(values)] as const)\n .filter(([, derived]) => !isEmpty(derived))\n if (seeds.length === 0) return\n setValues((prev) => {\n const next = { ...prev }\n for (const [field, derived] of seeds) {\n derivedRef.current.add(field.id)\n next[field.id] = derived\n }\n return next\n })\n }, [visibleFields, values])\n\n // Nothing is written until the user actually answers something. Persisting the\n // seeded values on mount left a draft behind for a flow nobody engaged with,\n // and the next session read it back as \"you had progress here\".\n React.useEffect(() => {\n if (!draftKey || !touched || typeof localStorage === 'undefined') return\n try {\n localStorage.setItem(draftKey, JSON.stringify({ index: safeIndex, values }))\n } catch {\n // A full or blocked storage must not break the flow — the draft is a convenience.\n }\n }, [draftKey, touched, safeIndex, values])\n\n // Answering something makes it theirs. A suggestion that arrives afterwards\n // must not land on top of it, and one already on screen stops being marked as\n // a suggestion the moment they edit it.\n const answeredRef = React.useRef(new Set<string>(Object.keys(draft?.values ?? {})))\n\n const setValue = React.useCallback((id: string, value: unknown) => {\n setTouched(true)\n answeredRef.current.add(id)\n setValues((prev) => ({ ...prev, [id]: value }))\n setAsyncErrors((prev) => (prev[id] ? { ...prev, [id]: null } : prev))\n setSuggested((prev) => {\n if (!prev.has(id)) return prev\n const next = new Set(prev)\n next.delete(id)\n return next\n })\n }, [])\n\n const clearSuggestion = React.useCallback((id: string) => {\n answeredRef.current.add(id)\n setValues((prev) => {\n if (!(id in prev)) return prev\n const next = { ...prev }\n delete next[id]\n return next\n })\n setSuggested((prev) => {\n if (!prev.has(id)) return prev\n const next = new Set(prev)\n next.delete(id)\n return next\n })\n }, [])\n\n // Debounced async checks for the fields that declare one.\n const checkable = visibleFields.filter((f) => f.checkAsync)\n const checkSignature = checkable.map((f) => `${f.id}:${String(values[f.id] ?? '')}`).join('|')\n React.useEffect(() => {\n if (checkable.length === 0) return\n let cancelled = false\n const timer = setTimeout(() => {\n for (const field of checkable) {\n const raw = values[field.id]\n if (typeof raw !== 'string' || raw.trim() === '') continue\n void field\n .checkAsync!(raw, values)\n .then((message) => { if (!cancelled) setAsyncErrors((prev) => ({ ...prev, [field.id]: message })) })\n // A failed availability probe must not block the flow — the server\n // still has the unique constraint, and submit surfaces the real error.\n .catch(() => { if (!cancelled) setAsyncErrors((prev) => ({ ...prev, [field.id]: null })) })\n }\n }, 400)\n return () => { cancelled = true; clearTimeout(timer) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [checkSignature])\n\n // A suggestion may answer a field on any step, so the ids it may write are the\n // whole flow's — but only the whole flow's.\n const knownFieldIds = React.useMemo(() => allFieldIds(steps), [steps])\n\n const applySuggestion = React.useCallback(\n (patch: WizardValues) => {\n const accepted = acceptableSuggestion(patch, knownFieldIds, answeredRef.current)\n const ids = Object.keys(accepted)\n if (ids.length === 0) return\n\n // Deliberately does NOT set `touched`. A crawl the user only watched\n // happen is not progress they made, and persisting it would leave a draft\n // behind for a flow nobody engaged with — the same trap the seeded values\n // above already fell into once.\n setValues((prev) => ({ ...prev, ...accepted }))\n setSuggested((prev) => {\n const next = new Set(prev)\n for (const id of ids) next.add(id)\n return next\n })\n },\n [knownFieldIds],\n )\n\n /**\n * Debounced enrichment for the fields that declare one. Slower than\n * `checkAsync`'s 400 ms because this one leaves the building and costs money;\n * a slug probe can afford to fire on every pause, a site crawl cannot.\n */\n const suggestable = visibleFields.filter((f) => f.suggest)\n const suggestSignature = suggestable.map((f) => `${f.id}:${String(values[f.id] ?? '')}`).join('|')\n const suggestedForRef = React.useRef(new Map<string, string>())\n const suggestRunRef = React.useRef(0)\n\n React.useEffect(() => {\n if (suggestable.length === 0) return\n const pending = suggestable.filter((field) => {\n const raw = values[field.id]\n if (typeof raw !== 'string' || raw.trim() === '') return false\n // Stepping back onto the field, or re-rendering, must not buy the same\n // answer twice.\n return suggestedForRef.current.get(field.id) !== raw.trim()\n })\n if (pending.length === 0) return\n\n let cancelled = false\n const timer = setTimeout(() => {\n const run = ++suggestRunRef.current\n for (const field of pending) {\n const raw = String(values[field.id]).trim()\n suggestedForRef.current.set(field.id, raw)\n setSuggesting(field.id)\n\n void field\n .suggest!(raw, values)\n .then((patch) => {\n // A reply for an address they have since changed is stale, and\n // applying it would answer a form about the wrong business.\n if (cancelled || run !== suggestRunRef.current) return\n if (patch) applySuggestion(patch)\n })\n // Enrichment, not a gate: a failed read leaves the form as it was.\n .catch(() => {})\n .finally(() => {\n if (!cancelled && run === suggestRunRef.current) setSuggesting(null)\n })\n }\n }, 900)\n\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [suggestSignature])\n\n const fieldErrors = React.useMemo(\n () => computeFieldErrors(visibleFields, values, asyncErrors),\n [visibleFields, values, asyncErrors],\n )\n\n const blocker = React.useMemo(() => step?.validate?.(values) ?? null, [step, values])\n\n const canAdvance = !submitting && computeCanAdvance(step, visibleFields, values, fieldErrors)\n\n const isLast = safeIndex >= visibleSteps.length - 1\n\n const clearDraft = React.useCallback(() => {\n if (!draftKey || typeof localStorage === 'undefined') return\n try { localStorage.removeItem(draftKey) } catch { /* ignore */ }\n }, [draftKey])\n\n const submit = React.useCallback(async () => {\n if (!onSubmit) return\n setSubmitting(true)\n setError(null)\n try {\n await onSubmit(values)\n clearDraft()\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setSubmitting(false)\n }\n }, [onSubmit, values, clearDraft])\n\n const next = React.useCallback(() => {\n if (!canAdvance) return\n if (isLast) { void submit(); return }\n setIndex((i) => Math.min(i + 1, visibleSteps.length - 1))\n }, [canAdvance, isLast, submit, visibleSteps.length])\n\n const back = React.useCallback(() => setIndex((i) => Math.max(i - 1, 0)), [])\n\n const goTo = React.useCallback(\n (target: number) => setIndex(Math.max(0, Math.min(target, visibleSteps.length - 1))),\n [visibleSteps.length],\n )\n\n return {\n steps: visibleSteps,\n step,\n index: safeIndex,\n total: visibleSteps.length,\n values,\n setValue,\n fieldErrors,\n blocker,\n canAdvance,\n isFirst: safeIndex === 0,\n isLast,\n submitting,\n error,\n next,\n back,\n goTo,\n submit,\n touched,\n clearDraft,\n visibleFields,\n suggesting,\n suggested,\n clearSuggestion,\n }\n}\n","import * as React from 'react'\nimport { Loader2, Sparkles, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { ColorPalette } from '../primitives/color-palette'\nimport { ImageDrop } from '../primitives/image-drop'\nimport { OptionCards, OptionChips } from '../primitives/option-select'\nimport { Switch } from '../primitives/switch'\nimport type { WizardFieldDef, WizardValues } from './types'\n\nexport interface WizardFieldProps {\n field: WizardFieldDef\n values: WizardValues\n onChange: (id: string, value: unknown) => void\n /** Async/validation message resolved by the wizard for this field. */\n error?: string | null\n autoFocus?: boolean\n /** This field owns the 1–9 keys on this step. Only one field may. */\n shortcuts?: boolean\n /** This field's `suggest` is in flight. */\n busy?: boolean\n /** The value on screen came from a suggestion, not from the user. */\n suggested?: boolean\n /** Discard the suggestion. Only rendered when `suggested`. */\n onClearSuggestion?: () => void\n /** Text on the badge that marks a suggested answer. */\n suggestedLabel?: string\n}\n\n/** Wizard fields are the page's main event, so they run bigger than admin density. */\nconst FIELD_CLASS =\n 'h-12 w-full rounded-lg border border-border bg-card px-4 text-base text-foreground placeholder:text-muted-foreground ' +\n 'transition-colors focus:border-foreground/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ' +\n 'focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50'\n\nconst INPUT_TYPE: Partial<Record<WizardFieldDef['kind'], string>> = {\n email: 'email',\n phone: 'tel',\n}\n\nexport function WizardField({\n field,\n values,\n onChange,\n error,\n autoFocus,\n shortcuts,\n busy,\n suggested,\n onClearSuggestion,\n suggestedLabel,\n}: WizardFieldProps) {\n const value = values[field.id]\n const set = (next: unknown) => onChange(field.id, next)\n\n const body = (() => {\n switch (field.kind) {\n case 'palette':\n return (\n <ColorPalette\n value={Array.isArray(value) ? (value as string[]) : undefined}\n onChange={set}\n slots={field.slots}\n />\n )\n case 'cards':\n return (\n <OptionCards\n options={field.options ?? []}\n value={value as string | string[] | undefined}\n onChange={set}\n multi={field.multi}\n columns={field.columns}\n shortcuts={shortcuts}\n aria-label={field.label}\n />\n )\n case 'chips':\n return (\n <OptionChips\n options={field.options ?? []}\n value={value as string | string[] | undefined}\n onChange={set}\n multi={field.multi}\n shortcuts={shortcuts}\n aria-label={field.label}\n />\n )\n case 'toggle':\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-border bg-card px-4 py-3\">\n <span className=\"text-sm text-foreground\">{field.label}</span>\n <Switch checked={Boolean(value)} onCheckedChange={(checked) => set(checked)} />\n </div>\n )\n case 'image':\n return (\n <ImageDrop\n value={typeof value === 'string' ? value : undefined}\n onUpload={field.onUpload}\n onChange={(url) => set(url)}\n label={field.label}\n hint={field.hint}\n />\n )\n case 'textarea':\n return (\n <textarea\n rows={3}\n className={cn(FIELD_CLASS, 'h-auto py-3 leading-relaxed')}\n placeholder={field.placeholder}\n value={typeof value === 'string' ? value : ''}\n autoFocus={autoFocus}\n onChange={(e) => set(e.target.value)}\n />\n )\n default:\n return (\n <div className=\"relative\">\n <input\n type={INPUT_TYPE[field.kind] ?? 'text'}\n className={cn(FIELD_CLASS, busy && 'pr-11', error && 'border-destructive')}\n placeholder={field.placeholder}\n value={typeof value === 'string' ? value : ''}\n autoFocus={autoFocus}\n autoComplete={field.kind === 'email' ? 'email' : 'off'}\n onChange={(e) => set(field.normalize ? field.normalize(e.target.value) : e.target.value)}\n />\n {busy && (\n // The wrapper does the positioning and the icon does nothing but\n // spin. Both on one element fights: `animate-spin`'s keyframe sets\n // a bare `transform: rotate(...)`, which replaces the composed\n // transform that `-translate-y-1/2` lives in — so the icon drops\n // half its height on every frame and the rotation reads as a\n // stutter. `inset-y-0` + `items-center` centres with no transform\n // at all, leaving the animation the only one.\n <span className=\"pointer-events-none absolute inset-y-0 right-4 flex items-center\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </span>\n )}\n </div>\n )\n }\n })()\n\n // The toggle and image fields carry their own label inline; repeating it above\n // would print the question twice.\n const labelAbove = field.label && field.kind !== 'toggle' && field.kind !== 'image'\n\n return (\n <div className=\"space-y-2\">\n {(labelAbove || suggested) && (\n <div className=\"flex items-center justify-between gap-2\">\n {labelAbove ? (\n <label className=\"block text-sm font-medium text-foreground\">{field.label}</label>\n ) : (\n <span />\n )}\n {suggested && suggestedLabel && (\n <SuggestedBadge label={suggestedLabel} onClear={onClearSuggestion} />\n )}\n </div>\n )}\n {body}\n {field.hint && field.kind !== 'image' && !error && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">{field.hint}</p>\n )}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n )\n}\n\n/**\n * Marks an answer nobody gave. It has to be visible enough that the user knows\n * to check it and quiet enough that it doesn't read as an error — this is a head\n * start, not a warning.\n */\nfunction SuggestedBadge({ label, onClear }: { label: string; onClear?: () => void }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[11px] text-muted-foreground\">\n <Sparkles className=\"h-3 w-3\" />\n {label}\n {onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n aria-label={`${label} — descartar`}\n className=\"ml-0.5 rounded-full text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </span>\n )\n}\n","import * as React from 'react'\nimport { ArrowLeft, ArrowRight, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport { ConfirmDialog } from '../primitives/confirm-dialog'\nimport { StepProgress } from '../primitives/step-progress'\nimport { isEmpty as isEmptyAnswer, visibleFields as computeVisibleFields } from './logic'\nimport { useWizard, type UseWizardResult } from './useWizard'\nimport { WizardField } from './WizardField'\nimport type { WizardMedia, WizardStepDef, WizardValues } from './types'\n\nexport interface WizardLabels {\n back: string\n next: string\n finish: string\n exit: string\n stepOf: string\n exitTitle: string\n exitDescription: string\n exitConfirm: string\n exitCancel: string\n /** Badge on a field a `suggest` answered rather than the user. */\n suggested: string\n}\n\nconst DEFAULT_LABELS: WizardLabels = {\n back: 'Back',\n next: 'Continue',\n finish: 'Finish',\n exit: 'Exit',\n // `{current}` and `{total}` are substituted.\n stepOf: 'Step {current} of {total}',\n exitTitle: 'Leave setup?',\n exitDescription: 'You have already started — leaving now loses what you filled in.',\n exitConfirm: 'Leave',\n exitCancel: 'Go back',\n suggested: 'from your site',\n}\n\nexport interface WizardProps {\n steps: ReadonlyArray<WizardStepDef>\n initialValues?: WizardValues\n draftKey?: string\n onSubmit: (values: WizardValues) => Promise<void> | void\n /** Omit to hide the exit affordance — a first-run flow with nowhere to go back to. */\n onExit?: () => void\n /** Brand mark above the question. */\n logo?: React.ReactNode\n /** Panel shown when the current step declares no media of its own. */\n fallbackMedia?: WizardMedia\n labels?: Partial<WizardLabels>\n className?: string\n}\n\n/** Themed panel used when a step ships no artwork, so the split never looks broken. */\nfunction MediaFallback() {\n return (\n <div className=\"relative h-full w-full overflow-hidden bg-sidebar\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-primary/25 via-transparent to-sidebar\" />\n <div className=\"absolute -right-24 -top-24 h-96 w-96 rounded-full bg-primary/20 blur-3xl\" />\n <div className=\"absolute -bottom-32 -left-16 h-96 w-96 rounded-full bg-primary/10 blur-3xl\" />\n </div>\n )\n}\n\nfunction MediaPanel({ media }: { media: WizardMedia | undefined }) {\n if (!media) return <MediaFallback />\n if (media.node) return <div className=\"h-full w-full overflow-auto bg-sidebar\">{media.node}</div>\n if (!media.src) return <MediaFallback />\n return (\n <picture className=\"block h-full w-full\">\n {media.srcDark && <source srcSet={media.srcDark} media=\"(prefers-color-scheme: dark)\" />}\n <img src={media.src} alt={media.alt ?? ''} className=\"h-full w-full object-cover\" />\n </picture>\n )\n}\n\n/**\n * Fullscreen, data-driven wizard: form column on the left, media panel on the right.\n *\n * Steps and fields are plain data (`WizardStepDef[]`), so a flow changes by editing\n * a list rather than a component — which is the whole point for questionnaires that\n * get reworded every time we learn something about a vertical.\n */\nexport function Wizard({\n steps, initialValues, draftKey, onSubmit, onExit, logo, fallbackMedia, labels, className,\n}: WizardProps) {\n const text = { ...DEFAULT_LABELS, ...labels }\n const w: UseWizardResult = useWizard({ steps, initialValues, draftKey, onSubmit })\n const [confirmExit, setConfirmExit] = React.useState(false)\n // Which way the step slid in — forward and back read as opposite motions.\n const [direction, setDirection] = React.useState<'forward' | 'back'>('forward')\n\n const goNext = React.useCallback(() => { setDirection('forward'); w.next() }, [w])\n const goBack = React.useCallback(() => { setDirection('back'); w.back() }, [w])\n\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (confirmExit) return\n const target = e.target as HTMLElement | null\n const typing = target?.tagName === 'TEXTAREA'\n if (e.key === 'Enter' && !typing && !e.shiftKey) { e.preventDefault(); goNext() }\n // ← only when nothing is focused for typing, or it would fight the caret.\n if (e.key === 'ArrowLeft' && target?.tagName !== 'INPUT' && !typing && !w.isFirst) goBack()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [goNext, goBack, w.isFirst, confirmExit])\n\n // The wizard covers the viewport, so anything scrollable behind it is a\n // scrollbar that scrolls nothing — and on a short screen, a page that drifts\n // under a fixed layer.\n React.useEffect(() => {\n if (typeof document === 'undefined') return\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => { document.body.style.overflow = previous }\n }, [])\n\n const requestExit = () => {\n if (!onExit) return\n // Nothing typed yet is nothing to lose — asking would be ceremony.\n if (!w.touched) { onExit(); return }\n setConfirmExit(true)\n }\n\n /**\n * A step that asks one thing, once, moves on by itself.\n *\n * Picking the only answer on the screen and then reaching for \"Continue\" is\n * two gestures for one decision. Auto-advance is deliberately narrow: single\n * choice only (multi is still being built up), nothing else on the step, and\n * never into the submit — a workspace must be created by someone meaning to.\n */\n const [pendingAdvance, setPendingAdvance] = React.useState<string | null>(null)\n\n const setValue = React.useCallback(\n (id: string, value: unknown) => {\n w.setValue(id, value)\n if (w.isLast || !w.step || w.step.render) return\n const field = w.visibleFields.find((f) => f.id === id)\n if (!field || field.multi || (field.kind !== 'cards' && field.kind !== 'chips')) return\n if (w.visibleFields.length !== 1) return\n // The answer may reveal a follow-up (\"which system?\"). Advancing past a\n // box we just put on screen is worse than not advancing at all.\n if (computeVisibleFields(w.step, { ...w.values, [id]: value }).length !== 1) return\n setPendingAdvance(w.step.id)\n },\n [w],\n )\n\n // Armed by the click, fired from here — `next` refuses while `canAdvance` is\n // false, and at click time it still is: the value has not landed yet.\n React.useEffect(() => {\n if (!pendingAdvance) return\n if (pendingAdvance !== w.step?.id) { setPendingAdvance(null); return }\n if (!w.canAdvance) return\n // A beat, so the selection is seen before the screen changes.\n const timer = setTimeout(() => { setPendingAdvance(null); setDirection('forward'); w.next() }, 320)\n return () => clearTimeout(timer)\n }, [pendingAdvance, w.step?.id, w.canAdvance, w.next])\n\n // One field per step owns 1–9: the first unanswered choice group, or the first\n // one when everything is answered. Binding every group would make \"1\" mean\n // several things at once on a step that asks two questions.\n const choiceFields = w.visibleFields.filter((f) => f.kind === 'cards' || f.kind === 'chips')\n const shortcutFieldId = (choiceFields.find((f) => isEmptyAnswer(w.values[f.id])) ?? choiceFields[0])?.id\n\n const step = w.step\n if (!step) return null\n\n const nextLabel = step.nextLabel ?? (w.isLast ? text.finish : text.next)\n\n return (\n <div className={cn('fixed inset-0 z-50 flex bg-background', className)}>\n {/* Form column */}\n <div className=\"flex min-w-0 flex-1 flex-col lg:w-[58%] lg:flex-none lg:basis-[58%]\">\n <div className=\"flex-1 overflow-y-auto px-6 pt-10 sm:px-12 lg:px-16\">\n <div className=\"mx-auto w-full max-w-xl\">\n {logo && <div className=\"mb-8\">{logo}</div>}\n <div\n // Remounting on step change is what replays the entrance animation.\n key={step.id}\n className={direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'}\n >\n {step.eyebrow && (\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-primary\">{step.eyebrow}</p>\n )}\n <h1 className=\"text-3xl font-bold leading-tight tracking-tight text-foreground sm:text-4xl\">\n {step.title}\n </h1>\n {step.subtitle && (\n <p className=\"mt-3 text-base leading-relaxed text-muted-foreground\">{step.subtitle}</p>\n )}\n\n <div className=\"mt-8 space-y-6 pb-10\">\n {step.render\n ? step.render({ values: w.values, setValue, steps: w.steps, index: w.index, submitting: w.submitting })\n : w.visibleFields.map((field, i) => (\n <WizardField\n key={field.id}\n field={field}\n values={w.values}\n onChange={setValue}\n error={w.fieldErrors[field.id]}\n autoFocus={i === 0 && (field.kind === 'text' || field.kind === 'email' || field.kind === 'slug')}\n shortcuts={field.id === shortcutFieldId}\n busy={w.suggesting === field.id}\n suggested={w.suggested.has(field.id)}\n suggestedLabel={text.suggested}\n onClearSuggestion={() => w.clearSuggestion(field.id)}\n />\n ))}\n {w.blocker && <p className=\"text-sm text-destructive\">{w.blocker}</p>}\n {w.error && <p className=\"text-sm text-destructive\">{w.error}</p>}\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer — progress sits directly above it, as one landing strip */}\n <div className=\"border-t border-border/60 px-6 pb-6 pt-4 sm:px-12 lg:px-16\">\n <div className=\"mx-auto w-full max-w-xl\">\n <StepProgress\n total={w.total}\n current={w.index}\n onSelect={(i) => { setDirection('back'); w.goTo(i) }}\n aria-label={text.stepOf\n .replace('{current}', String(w.index + 1))\n .replace('{total}', String(w.total))}\n className=\"mb-4\"\n />\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1\">\n {!w.isFirst && (\n <Button variant=\"outline\" size=\"lg\" onClick={goBack} disabled={w.submitting}>\n <ArrowLeft className=\"h-4 w-4\" />\n {text.back}\n </Button>\n )}\n {onExit && (\n <Button variant=\"ghost\" size=\"lg\" onClick={requestExit} disabled={w.submitting}>\n {text.exit}\n </Button>\n )}\n </div>\n <Button size=\"lg\" onClick={goNext} disabled={!w.canAdvance}>\n {w.submitting ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {nextLabel}\n {!w.submitting && !w.isLast && <ArrowRight className=\"h-4 w-4\" />}\n </Button>\n </div>\n </div>\n </div>\n </div>\n\n {/* Media column — the space images live in. Gone below lg, where the\n form needs the whole width more than the flow needs decoration. */}\n <div className=\"hidden lg:block lg:flex-1\">\n <MediaPanel media={step.media ?? fallbackMedia} />\n </div>\n\n <ConfirmDialog\n open={confirmExit}\n title={text.exitTitle}\n description={text.exitDescription}\n confirmLabel={text.exitConfirm}\n cancelLabel={text.exitCancel}\n variant=\"warning\"\n // The dialog says the progress is lost, so it has to be. The draft is\n // for a closed tab or a reload, not for overriding an explicit discard —\n // keeping it here would drop the next person who opens the flow onto\n // someone else's abandoned summary screen.\n onConfirm={() => { setConfirmExit(false); w.clearDraft(); onExit?.() }}\n onCancel={() => setConfirmExit(false)}\n />\n </div>\n )\n}\n"]}
|