@fayz-ai/ui 0.18.0 → 0.21.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.
Files changed (81) hide show
  1. package/dist/analytics/derive.d.ts +1 -9
  2. package/dist/analytics/derive.d.ts.map +1 -1
  3. package/dist/chunk-AIUHVTVK.js +205 -0
  4. package/dist/chunk-AIUHVTVK.js.map +1 -0
  5. package/dist/{chunk-OBIU37AX.js → chunk-EGHEU3U5.js} +156 -48
  6. package/dist/chunk-EGHEU3U5.js.map +1 -0
  7. package/dist/{chunk-3OVZ5JJQ.js → chunk-GLRLWBBF.js} +4 -3
  8. package/dist/chunk-GLRLWBBF.js.map +1 -0
  9. package/dist/{chunk-ZLPYNHXH.js → chunk-MBGTFL4I.js} +3 -3
  10. package/dist/{chunk-ZLPYNHXH.js.map → chunk-MBGTFL4I.js.map} +1 -1
  11. package/dist/{chunk-AASANYXN.js → chunk-OB2ULDBD.js} +6 -4
  12. package/dist/chunk-OB2ULDBD.js.map +1 -0
  13. package/dist/{chunk-Z2ITFPGL.js → chunk-OYH7CEMB.js} +609 -173
  14. package/dist/chunk-OYH7CEMB.js.map +1 -0
  15. package/dist/{chunk-DFOAKWYB.js → chunk-P3YTL3MF.js} +140 -16
  16. package/dist/chunk-P3YTL3MF.js.map +1 -0
  17. package/dist/dashboard/index.js +2 -2
  18. package/dist/icons.d.ts.map +1 -1
  19. package/dist/icons.js +1 -1
  20. package/dist/index.d.ts +3 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +11 -25
  23. package/dist/index.js.map +1 -1
  24. package/dist/layout/AppShell.d.ts +9 -1
  25. package/dist/layout/AppShell.d.ts.map +1 -1
  26. package/dist/layout/ModulePage.d.ts +13 -0
  27. package/dist/layout/ModulePage.d.ts.map +1 -1
  28. package/dist/layout/SaveBar.d.ts +10 -1
  29. package/dist/layout/SaveBar.d.ts.map +1 -1
  30. package/dist/layout/Sidebar.d.ts +7 -1
  31. package/dist/layout/Sidebar.d.ts.map +1 -1
  32. package/dist/layout/Takeover.d.ts +31 -0
  33. package/dist/layout/Takeover.d.ts.map +1 -0
  34. package/dist/layout/index.d.ts +1 -0
  35. package/dist/layout/index.d.ts.map +1 -1
  36. package/dist/layout/index.js +3 -3
  37. package/dist/lib/error-message.d.ts +2 -0
  38. package/dist/lib/error-message.d.ts.map +1 -0
  39. package/dist/primitives/brand-marks.d.ts +11 -0
  40. package/dist/primitives/brand-marks.d.ts.map +1 -0
  41. package/dist/primitives/button.d.ts +1 -1
  42. package/dist/primitives/dot-badge.d.ts +27 -0
  43. package/dist/primitives/dot-badge.d.ts.map +1 -0
  44. package/dist/primitives/draft-commit-bar.d.ts +27 -0
  45. package/dist/primitives/draft-commit-bar.d.ts.map +1 -0
  46. package/dist/primitives/filter-check-list.d.ts +65 -0
  47. package/dist/primitives/filter-check-list.d.ts.map +1 -0
  48. package/dist/primitives/header-tabs.d.ts +35 -0
  49. package/dist/primitives/header-tabs.d.ts.map +1 -1
  50. package/dist/primitives/image-drop.d.ts.map +1 -1
  51. package/dist/primitives/index.d.ts +6 -0
  52. package/dist/primitives/index.d.ts.map +1 -1
  53. package/dist/primitives/index.js +4 -4
  54. package/dist/primitives/list-chrome.d.ts +5 -1
  55. package/dist/primitives/list-chrome.d.ts.map +1 -1
  56. package/dist/primitives/list-view.d.ts.map +1 -1
  57. package/dist/primitives/mini-calendar.d.ts +36 -0
  58. package/dist/primitives/mini-calendar.d.ts.map +1 -0
  59. package/dist/primitives/multi-select.d.ts +21 -0
  60. package/dist/primitives/multi-select.d.ts.map +1 -0
  61. package/dist/primitives/page-actions.d.ts.map +1 -1
  62. package/dist/primitives/refresh-button.d.ts.map +1 -1
  63. package/dist/primitives/row-actions.d.ts.map +1 -1
  64. package/dist/primitives/select.d.ts.map +1 -1
  65. package/dist/primitives/stock-entry-form.d.ts +52 -0
  66. package/dist/primitives/stock-entry-form.d.ts.map +1 -0
  67. package/dist/styles.css +124 -0
  68. package/dist/tailwind.cjs +1 -1
  69. package/dist/tailwind.cjs.map +1 -1
  70. package/dist/tailwind.js +1 -1
  71. package/dist/tailwind.js.map +1 -1
  72. package/dist/wizard/index.js +2 -2
  73. package/dist/wizard/useWizard.d.ts.map +1 -1
  74. package/package.json +2 -2
  75. package/dist/chunk-3OVZ5JJQ.js.map +0 -1
  76. package/dist/chunk-4GK6IHOI.js +0 -177
  77. package/dist/chunk-4GK6IHOI.js.map +0 -1
  78. package/dist/chunk-AASANYXN.js.map +0 -1
  79. package/dist/chunk-DFOAKWYB.js.map +0 -1
  80. package/dist/chunk-OBIU37AX.js.map +0 -1
  81. package/dist/chunk-Z2ITFPGL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/primitives/switch.tsx","../src/primitives/confirm-dialog.tsx","../src/primitives/step-progress.tsx","../src/primitives/option-select.tsx","../src/primitives/image-drop.tsx","../src/primitives/color-palette.tsx"],"names":["React","Switch","React2","jsxs","jsx","React3","React5","X"],"mappings":"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","file":"chunk-3OVZ5JJQ.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Switch — ligar/desligar algo que vale IMEDIATAMENTE.\n//\n// É a diferença para o checkbox, e é o que decide qual usar: checkbox é uma\n// escolha que só existe quando o formulário for salvo (\"aceito os termos\");\n// switch é um interruptor — mexeu, mudou. Uma lista onde cada linha liga um\n// disparo é o segundo caso, e desenhá-lo como checkbox faz procurar o botão\n// Salvar que nunca vem.\n//\n// Sem Radix: é um <button role=\"switch\"> com aria-checked, que é exatamente o\n// contrato que o leitor de tela espera. Uma dependência a mais para animar um\n// círculo de 16px não se paga.\n// ---------------------------------------------------------------------------\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n /** 'sm' para linhas de lista, 'md' para formulários. */\n size?: 'sm' | 'md'\n /** Texto ao lado. Clicar nele também alterna — é área de toque de graça. */\n label?: React.ReactNode\n}\n\nconst TRACK = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n}\n\nconst THUMB = {\n sm: 'h-3 w-3 data-[on=true]:translate-x-3',\n md: 'h-4 w-4 data-[on=true]:translate-x-4',\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, onCheckedChange, size = 'sm', label, className, disabled, ...rest },\n ref,\n) {\n const control = (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={(e) => {\n // stopPropagation: o switch vive dentro de linhas clicáveis, e ligar\n // algo não deve navegar para outro lugar ao mesmo tempo.\n e.stopPropagation()\n rest.onClick?.(e)\n if (!disabled) onCheckedChange(!checked)\n }}\n className={cn(\n 'relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n TRACK[size],\n checked ? 'bg-primary' : 'bg-muted-foreground/30',\n className,\n )}\n {...rest}\n >\n <span\n data-on={checked}\n className={cn(\n 'pointer-events-none ml-0.5 inline-block rounded-full bg-background shadow-sm transition-transform',\n THUMB[size],\n )}\n />\n </button>\n )\n\n if (label == null) return control\n\n return (\n <label\n className={cn(\n 'inline-flex items-center gap-2 text-xs text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {control}\n <span>{label}</span>\n </label>\n )\n})\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { AlertTriangle, Info, CheckCircle2, XCircle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\n\ntype ConfirmVariant = 'default' | 'destructive' | 'warning' | 'success'\n\ninterface ConfirmDialogProps {\n open: boolean\n onConfirm: () => void\n onCancel: () => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: ConfirmVariant\n loading?: boolean\n}\n\nconst VARIANT_CONFIG: Record<\n ConfirmVariant,\n {\n icon: React.ElementType\n iconBg: string\n iconColor: string\n buttonVariant: 'default' | 'destructive'\n }\n> = {\n default: {\n icon: Info,\n iconBg: 'bg-info/10',\n iconColor: 'text-info',\n buttonVariant: 'default',\n },\n destructive: {\n icon: XCircle,\n iconBg: 'bg-destructive/10',\n iconColor: 'text-destructive',\n buttonVariant: 'destructive',\n },\n warning: {\n icon: AlertTriangle,\n iconBg: 'bg-warning/10',\n iconColor: 'text-warning',\n buttonVariant: 'destructive',\n },\n success: {\n icon: CheckCircle2,\n iconBg: 'bg-success/10',\n iconColor: 'text-success',\n buttonVariant: 'default',\n },\n}\n\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n}: ConfirmDialogProps) {\n const config = VARIANT_CONFIG[variant]\n const Icon = config.icon\n\n React.useEffect(() => {\n if (!open) return\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCancel()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onCancel])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-[2px] animate-fade-in\"\n onClick={onCancel}\n />\n\n <div\n className=\"relative z-10 w-full max-w-sm mx-4 rounded-modal border border-border bg-card shadow-lg animate-zoom-in\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby={description ? 'confirm-desc' : undefined}\n >\n <div className=\"p-6\">\n <div className=\"flex gap-4\">\n <div className={cn('flex h-10 w-10 items-center justify-center rounded-full shrink-0', config.iconBg)}>\n <Icon className={cn('h-5 w-5', config.iconColor)} />\n </div>\n <div className=\"min-w-0 pt-0.5\">\n <h3 id=\"confirm-title\" className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n {description && (\n <p id=\"confirm-desc\" className=\"text-xs text-muted-foreground mt-1 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-5\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={config.buttonVariant} size=\"sm\" onClick={onConfirm} disabled={loading}>\n {loading ? 'Processing...' : confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface StepProgressProps {\n /** How many steps the flow has. */\n total: number\n /** Zero-based index of the step on screen. */\n current: number\n /** Jump to a step. Only offered for steps already visited. */\n onSelect?: (index: number) => void\n className?: string\n 'aria-label'?: string\n}\n\n/**\n * Segmented progress rail — one bar per step, filled up to the current one.\n *\n * A single continuous bar tells you how far along you are; segments also tell you\n * how much is LEFT, which is what stops someone abandoning a form they think is\n * endless. Sits at the bottom of the wizard column, above the footer.\n */\nexport function StepProgress({ total, current, onSelect, className, ...rest }: StepProgressProps) {\n return (\n <div\n role=\"progressbar\"\n aria-label={rest['aria-label']}\n aria-valuemin={1}\n aria-valuemax={total}\n aria-valuenow={Math.min(current + 1, total)}\n className={cn('flex w-full items-center gap-2', className)}\n >\n {Array.from({ length: total }, (_, i) => {\n const done = i <= current\n // Only steps already behind you are clickable — jumping forward would skip\n // the validation the wizard runs on the way out of each step.\n const clickable = Boolean(onSelect) && i < current\n return (\n <button\n key={i}\n type=\"button\"\n tabIndex={clickable ? 0 : -1}\n aria-hidden={!clickable}\n disabled={!clickable}\n onClick={clickable ? () => onSelect?.(i) : undefined}\n className={cn(\n 'h-[2px] flex-1 rounded-full transition-colors duration-300',\n done ? 'bg-foreground' : 'bg-border',\n clickable && 'cursor-pointer hover:bg-foreground/70',\n )}\n />\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface SelectableOption {\n value: string\n label: React.ReactNode\n /** Second line under the label — the sentence that makes the choice obvious. */\n hint?: React.ReactNode\n icon?: React.ReactNode\n}\n\ninterface SharedProps {\n options: ReadonlyArray<SelectableOption>\n /** A string in single mode, a list in `multi` mode. */\n value?: string | string[]\n onChange: (value: string | string[]) => void\n multi?: boolean\n disabled?: boolean\n /**\n * Bind 1–9 to the first nine options and print the digit on each one.\n *\n * Off by default: two shortcut-bound groups on one screen would both answer to\n * \"1\". The caller decides which group owns the keys.\n */\n shortcuts?: boolean\n className?: string\n 'aria-label'?: string\n}\n\n/** Toggle in multi mode, replace in single mode. */\nfunction nextValue(current: string | string[] | undefined, picked: string, multi: boolean): string | string[] {\n if (!multi) return picked\n const list = Array.isArray(current) ? current : current ? [current] : []\n return list.includes(picked) ? list.filter((v) => v !== picked) : [...list, picked]\n}\n\nfunction isSelected(current: string | string[] | undefined, option: string): boolean {\n return Array.isArray(current) ? current.includes(option) : current === option\n}\n\n/** Only the first nine get a digit — a two-key shortcut is slower than the mouse. */\nconst MAX_SHORTCUTS = 9\n\n/**\n * 1–9 pick the matching option. Ignored while a field has focus, so typing \"2\"\n * into \"how many chairs\" answers the question instead of jumping the form.\n */\nfunction useOptionShortcuts(\n options: ReadonlyArray<SelectableOption>,\n enabled: boolean,\n pick: (value: string) => void,\n) {\n const pickRef = React.useRef(pick)\n pickRef.current = pick\n const values = options.slice(0, MAX_SHORTCUTS).map((o) => o.value).join('\u0000')\n\n React.useEffect(() => {\n if (!enabled) return\n const list = values.split('\u0000').filter(Boolean)\n if (list.length === 0) return\n function onKey(e: KeyboardEvent) {\n if (e.metaKey || e.ctrlKey || e.altKey) return\n const el = e.target as HTMLElement | null\n const tag = el?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el?.isContentEditable) return\n const index = Number(e.key) - 1\n if (!Number.isInteger(index) || index < 0 || index >= list.length) return\n e.preventDefault()\n pickRef.current(list[index]!)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [enabled, values])\n}\n\n/** The digit badge printed on a shortcut-bound option. */\nfunction KeyHint({ index, selected, corner }: { index: number; selected: boolean; corner?: boolean }) {\n return (\n <kbd\n aria-hidden\n className={cn(\n 'hidden h-5 min-w-[1.25rem] shrink-0 items-center justify-center rounded border px-1 font-mono text-[10px] font-semibold sm:inline-flex',\n // Parked in the corner rather than in the reading line: the shortcut is\n // an accelerator, not part of the answer, and inline it pushed every\n // label right and split the logo from the name it belongs to.\n corner && 'absolute right-2 top-2',\n selected\n ? 'border-primary/40 bg-primary/10 text-primary'\n : 'border-border bg-muted text-muted-foreground',\n )}\n >\n {index + 1}\n </kbd>\n )\n}\n\nexport interface OptionCardsProps extends SharedProps {\n /** Cards per row on wide screens. One column reads as a list — use it for long hints. */\n columns?: 1 | 2 | 3\n}\n\nconst COLUMNS: Record<1 | 2 | 3, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/**\n * Card picker — the answer surface for a question with a handful of options that\n * each need a sentence of explanation.\n *\n * Radix has no radio-group in this package and a native radio list cannot carry a\n * hint line, so this is a button grid with `role=\"radio\"`/`\"checkbox\"` semantics\n * layered back on.\n */\nexport function OptionCards({\n options, value, onChange, multi = false, disabled, shortcuts = false, columns = 2, className, ...rest\n}: OptionCardsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('grid gap-2.5', COLUMNS[columns], className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n const corner = shortcuts && index < MAX_SHORTCUTS\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'group relative flex items-start gap-3 rounded-lg border bg-card p-4 text-left transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary ring-2 ring-primary/15'\n : 'border-border hover:-translate-y-px hover:border-foreground/25 hover:shadow-button',\n )}\n >\n {/* One thing in the corner. Once an option is picked its digit has\n done its job, and a check beside a number is two marks arguing\n about the same fact. */}\n {corner && selected && <Check className=\"absolute right-2 top-2 h-4 w-4 text-primary\" />}\n {corner && !selected && <KeyHint index={index} selected={false} corner />}\n {option.icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{option.icon}</span>}\n <span className={cn('min-w-0 flex-1', corner && 'pr-5')}>\n <span className=\"block text-sm font-semibold text-foreground\">{option.label}</span>\n {option.hint && (\n <span className=\"mt-0.5 block text-xs leading-relaxed text-muted-foreground\">{option.hint}</span>\n )}\n </span>\n {!corner && selected && <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport type OptionChipsProps = SharedProps\n\n/**\n * Pill picker — same selection model as OptionCards, for lists long enough that\n * cards would push the question off screen (industries, channels, price bands).\n */\nexport function OptionChips({\n options, value, onChange, multi = false, disabled, shortcuts = false, className, ...rest\n}: OptionChipsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('flex flex-wrap gap-2', className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-4 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary bg-primary/5 text-foreground'\n : 'border-border bg-card text-muted-foreground hover:border-foreground/25 hover:text-foreground',\n )}\n >\n {option.icon}\n {shortcuts && index < MAX_SHORTCUTS && <KeyHint index={index} selected={selected} />}\n {option.label}\n {selected && <Check className=\"h-3.5 w-3.5 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { ImagePlus, Loader2, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ImageDropProps {\n /** Current image. Uncontrolled after the first upload — the component keeps what it uploaded. */\n value?: string\n /** Receives the file, returns the stored URL. Omit to render a read-only preview. */\n onUpload?: (file: File) => Promise<string>\n onChange?: (url: string | undefined) => void\n label?: string\n hint?: string\n accept?: string\n /** Cap in bytes, checked before `onUpload` runs. Default 5 MB. */\n maxBytes?: number\n shape?: 'square' | 'circle'\n disabled?: boolean\n /** Shown when the picked file is over `maxBytes`. `{max}` is replaced with the cap in MB. */\n tooLargeLabel?: string\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024\n\n/**\n * Image picker with preview — click or drop a file, see it, replace or clear it.\n *\n * Generalised from the CRUD form's image slot so surfaces that have no entity\n * behind them (workspace logo during setup, before the tenant row exists) get the\n * same affordance without importing the CRUD stack.\n */\nexport function ImageDrop({\n value,\n onUpload,\n onChange,\n label,\n hint,\n accept = 'image/*',\n maxBytes = DEFAULT_MAX_BYTES,\n shape = 'square',\n disabled,\n tooLargeLabel = 'File is larger than {max} MB.',\n removeLabel = 'Remove image',\n className,\n}: ImageDropProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [url, setUrl] = React.useState<string | undefined>(value)\n const [busy, setBusy] = React.useState(false)\n const [dragging, setDragging] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => { setUrl(value) }, [value])\n\n const editable = Boolean(onUpload) && !disabled\n\n const handleFile = React.useCallback(\n async (file: File | undefined) => {\n if (!file || !onUpload) return\n if (file.size > maxBytes) {\n setError(tooLargeLabel.replace('{max}', String(Math.round(maxBytes / 1024 / 1024))))\n return\n }\n setBusy(true)\n setError(null)\n try {\n const next = await onUpload(file)\n setUrl(next)\n onChange?.(next)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(false)\n }\n },\n [onUpload, onChange, maxBytes, tooLargeLabel],\n )\n\n const pick = () => { if (editable && !busy) inputRef.current?.click() }\n\n const clear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setUrl(undefined)\n setError(null)\n onChange?.(undefined)\n }\n\n return (\n <div className={cn('flex items-center gap-4', className)}>\n <div\n onClick={pick}\n onKeyDown={(e) => { if (editable && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); pick() } }}\n onDragOver={(e) => { if (editable) { e.preventDefault(); setDragging(true) } }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n if (!editable) return\n e.preventDefault()\n setDragging(false)\n void handleFile(e.dataTransfer.files?.[0])\n }}\n role={editable ? 'button' : undefined}\n tabIndex={editable ? 0 : undefined}\n className={cn(\n 'relative flex h-20 w-20 shrink-0 items-center justify-center overflow-hidden border-2 text-muted-foreground transition-colors',\n shape === 'circle' ? 'rounded-full' : 'rounded-xl',\n url ? 'border-solid border-border' : 'border-dashed border-border',\n dragging && 'border-primary text-primary',\n editable && 'cursor-pointer hover:border-primary/40 hover:text-primary/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n )}\n >\n {url ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" /> : <ImagePlus className=\"h-5 w-5\" />}\n {busy && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </span>\n )}\n {url && editable && !busy && (\n <button\n type=\"button\"\n onClick={clear}\n aria-label={removeLabel}\n className=\"absolute right-0 top-0 flex h-5 w-5 items-center justify-center rounded-bl-lg bg-background/90 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {editable && (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n void handleFile(file)\n }}\n />\n )}\n </div>\n <div className=\"min-w-0\">\n {label && <p className=\"text-sm font-medium text-foreground\">{label}</p>}\n {hint && !error && <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{hint}</p>}\n {error && <p className=\"mt-0.5 text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ColorPaletteProps {\n /** Hex values, most prominent first. Shorter than `slots` is normal. */\n value?: ReadonlyArray<string>\n onChange: (colors: string[]) => void\n slots?: number\n /** One per slot, in order. Falls back to the slot number. */\n labels?: ReadonlyArray<string>\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_SLOTS = 4\nconst FALLBACK_SWATCH = '#000000'\n\n/**\n * A fixed row of colour slots, each a swatch that opens the native picker plus a\n * hex field that accepts a paste.\n *\n * Slots rather than an add/remove list on purpose: brand colours arrive from a\n * crawl in a known order (primary, secondary, accent), and a positional row is\n * what makes \"the second one is wrong\" a one-click fix instead of a rebuild of\n * the whole palette.\n */\nexport function ColorPalette({\n value,\n onChange,\n slots = DEFAULT_SLOTS,\n labels,\n removeLabel = 'Remover cor',\n className,\n}: ColorPaletteProps) {\n const colors = React.useMemo(() => {\n const next = Array.from({ length: slots }, (_, i) => value?.[i] ?? '')\n return next\n }, [value, slots])\n\n // Trailing blanks are absence, not answers — a palette of two colours must\n // come back as two, or every consumer has to filter it again.\n const commit = (next: string[]) => {\n const trimmed = [...next]\n while (trimmed.length > 0 && !trimmed[trimmed.length - 1]) trimmed.pop()\n onChange(trimmed)\n }\n\n const setSlot = (index: number, hex: string) => {\n const next = [...colors]\n next[index] = hex\n commit(next)\n }\n\n return (\n <div className={cn('flex gap-2', className)}>\n {colors.map((color, index) => (\n <div key={index} className=\"flex-1 space-y-1\">\n <label className=\"group relative block cursor-pointer\">\n <div\n className={cn(\n 'h-10 rounded-lg border transition-colors',\n color ? 'border-border' : 'border-dashed border-border bg-muted/40',\n )}\n style={color ? { backgroundColor: color } : undefined}\n />\n <input\n type=\"color\"\n value={color || FALLBACK_SWATCH}\n aria-label={labels?.[index] ?? `Cor ${index + 1}`}\n onChange={(e) => setSlot(index, e.target.value)}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n {color && (\n <button\n type=\"button\"\n aria-label={removeLabel}\n onClick={(e) => {\n // The swatch is inside the label, so a click would reopen the picker.\n e.preventDefault()\n e.stopPropagation()\n setSlot(index, '')\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-foreground/80 text-background opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100\"\n >\n <X className=\"h-2.5 w-2.5\" />\n </button>\n )}\n </label>\n <input\n type=\"text\"\n value={color.toUpperCase()}\n placeholder={labels?.[index] ?? `${index + 1}`}\n onChange={(e) => setSlot(index, normalizeHex(e.target.value))}\n className=\"w-full truncate bg-transparent text-center text-[10px] text-muted-foreground outline-none placeholder:text-muted-foreground/50\"\n />\n </div>\n ))}\n </div>\n )\n}\n\n/** Tolerates a pasted `1F7A3D`, `#1f7a3d` or `rgb(...)`-free junk mid-typing. */\nexport function normalizeHex(raw: string): string {\n const cleaned = raw.replace(/[^0-9a-fA-F#]/g, '')\n const withHash = cleaned.startsWith('#') ? cleaned : `#${cleaned}`\n return withHash.slice(0, 7)\n}\n"]}
@@ -1,177 +0,0 @@
1
- import { Zap, XCircle, X, Wrench, Workflow, Wheat, Warehouse, Wallet, UtensilsCrossed, Upload, WandSparkles, Utensils, UsersRound, Users, UserX, UserPlus, UserCog, UserCheck, User, Truck, Trophy, TrendingUp, TrendingDown, TreePalm, ToggleLeft, Timer, Target, Tags, TableProperties, Tag, Star, Sparkles, Soup, SlidersHorizontal, Sigma, ShoppingCart, ShoppingBag, ShieldCheck, Shield, Settings, Send, Search, Scale, Ruler, RotateCw, RotateCcw, Repeat, Receipt, Radio, Puzzle, PlusCircle, Plus, Plug, PieChart, Phone, Percent, Pencil, PawPrint, PartyPopper, Palette, PackageCheck, Package, Newspaper, Music, MousePointerClick, MoreHorizontal, Mic, MessageSquare, MessageCircle, Megaphone, MapPin, Map, Mail, Lock, ListPlus, ListMusic, ListChecks, List, Link, LineChart, LeafyGreen, Leaf, LayoutTemplate, LayoutDashboard, Layers, Landmark, Instagram, Inbox, Images, Image, Home, FolderTree, Hourglass, Heart, Handshake, GraduationCap, Globe, Gauge, FolderOpen, Flame, Filter, FileText, FileDown, FileCheck2, Eye, ExternalLink, Egg, DoorOpen, DollarSign, Dog, Disc3, CreditCard, CookingPot, Contact, Compass, Command, Clock3, Clock, ClipboardList, ClipboardCheck, Clapperboard, CircleDollarSign, CircleCheck, Circle, ChevronsUpDown, ChevronDown, ChefHat, CheckSquare, CheckCircle, Check, Cat, Camera, CalendarX, CalendarRange, CalendarPlus, CalendarDays, CalendarClock, CalendarCheck2, CalendarCheck, Calendar, Building2, Briefcase, Boxes, Box, BookOpenCheck, BookOpen, Bike, Bell, BarChart3, Banknote, Ban, BadgeDollarSign, Award, ArrowUpRight, ArrowUpCircle, ArrowLeftRight, ArrowDownRight, ArrowDownCircle, Apple, AlertTriangle, Activity } from 'lucide-react';
2
-
3
- // src/icons.ts
4
- var registry = {
5
- Activity,
6
- AlertTriangle,
7
- Apple,
8
- ArrowDownCircle,
9
- ArrowDownRight,
10
- ArrowLeftRight,
11
- ArrowUpCircle,
12
- ArrowUpRight,
13
- Award,
14
- BadgeDollarSign,
15
- Ban,
16
- Banknote,
17
- BarChart3,
18
- Bell,
19
- Bike,
20
- BookOpen,
21
- BookOpenCheck,
22
- Box,
23
- Boxes,
24
- Briefcase,
25
- Building2,
26
- Calendar,
27
- CalendarCheck,
28
- CalendarCheck2,
29
- CalendarClock,
30
- CalendarDays,
31
- CalendarPlus,
32
- CalendarRange,
33
- CalendarX,
34
- Camera,
35
- Cat,
36
- Check,
37
- CheckCircle,
38
- CheckSquare,
39
- ChefHat,
40
- ChevronDown,
41
- ChevronsUpDown,
42
- Circle,
43
- CircleCheck,
44
- CircleDollarSign,
45
- Clapperboard,
46
- ClipboardCheck,
47
- ClipboardList,
48
- Clock,
49
- Clock3,
50
- Command,
51
- Compass,
52
- Contact,
53
- CookingPot,
54
- CreditCard,
55
- Disc3,
56
- Dog,
57
- DollarSign,
58
- DoorOpen,
59
- Egg,
60
- ExternalLink,
61
- Eye,
62
- FileCheck2,
63
- FileDown,
64
- FileText,
65
- Filter,
66
- Flame,
67
- FolderOpen,
68
- Gauge,
69
- Globe,
70
- GraduationCap,
71
- Handshake,
72
- Heart,
73
- Hourglass,
74
- FolderTree,
75
- Home,
76
- Image,
77
- Images,
78
- Inbox,
79
- Instagram,
80
- Landmark,
81
- Layers,
82
- LayoutDashboard,
83
- LayoutTemplate,
84
- Leaf,
85
- LeafyGreen,
86
- LineChart,
87
- Link,
88
- List,
89
- ListChecks,
90
- ListMusic,
91
- ListPlus,
92
- Lock,
93
- Mail,
94
- Map,
95
- MapPin,
96
- Megaphone,
97
- MessageCircle,
98
- MessageSquare,
99
- Mic,
100
- MoreHorizontal,
101
- MousePointerClick,
102
- Music,
103
- Newspaper,
104
- Package,
105
- PackageCheck,
106
- Palette,
107
- PartyPopper,
108
- PawPrint,
109
- Pencil,
110
- Percent,
111
- Phone,
112
- PieChart,
113
- Plug,
114
- Plus,
115
- PlusCircle,
116
- Puzzle,
117
- Radio,
118
- Receipt,
119
- Repeat,
120
- RotateCcw,
121
- RotateCw,
122
- Ruler,
123
- Scale,
124
- Search,
125
- Send,
126
- Settings,
127
- Shield,
128
- ShieldCheck,
129
- ShoppingBag,
130
- ShoppingCart,
131
- Sigma,
132
- SlidersHorizontal,
133
- Soup,
134
- Sparkles,
135
- Star,
136
- Tag,
137
- TableProperties,
138
- Tags,
139
- Target,
140
- Timer,
141
- ToggleLeft,
142
- TreePalm,
143
- TrendingDown,
144
- TrendingUp,
145
- Trophy,
146
- Truck,
147
- User,
148
- UserCheck,
149
- UserCog,
150
- UserPlus,
151
- UserX,
152
- Users,
153
- UsersRound,
154
- Utensils,
155
- WandSparkles,
156
- Upload,
157
- UtensilsCrossed,
158
- Wallet,
159
- Warehouse,
160
- Wheat,
161
- Workflow,
162
- Wrench,
163
- X,
164
- XCircle,
165
- Zap
166
- };
167
- function registerIcons(icons) {
168
- Object.assign(registry, icons);
169
- }
170
- function getLucideIcon(name) {
171
- return registry[name];
172
- }
173
- var ICON_MAP = registry;
174
-
175
- export { ICON_MAP, getLucideIcon, registerIcons };
176
- //# sourceMappingURL=chunk-4GK6IHOI.js.map
177
- //# sourceMappingURL=chunk-4GK6IHOI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/icons.ts"],"names":[],"mappings":"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","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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/layout/AppShellSkeleton.tsx","../src/layout/page-trail.tsx","../src/layout/ContentSplit.tsx"],"names":["jsx","React2","jsxs"],"mappings":"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","file":"chunk-DFOAKWYB.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// AppShellSkeleton — what the admin shows while it is still booting (session\n// restore, plugin runtime, first paint).\n//\n// It used to draw the SHAPE of the shell: rail, header band, tiles, table. The\n// idea was that the app would resolve into its own outline. What it did in\n// practice was promise a specific screen and then contradict it — the outline\n// is a dashboard, and half the time you were opening something else — and the\n// pulsing bars read as content that failed to load rather than content on its\n// way. Worse, it made the wait look LONGER: a page of fake rows holds the eye,\n// so every extra frame of it registers.\n//\n// One spinner on the rail's own color says exactly as much (the app is coming)\n// and nothing false. It also matches the HTML boot screen the Vite plugin\n// injects (see @fayz-ai/sdk boot-skeleton), so the whole cold load is one\n// continuous image — same background, same spinner, in the same place — from\n// first paint to mounted app, with nothing swapping underneath.\n// ---------------------------------------------------------------------------\n\nexport interface AppShellSkeletonProps {\n /** Kept for API compatibility. The boot screen no longer draws a shell shape,\n * so every layout gets the same one. */\n variant?: 'sidebar' | 'topbar' | 'minimal'\n /** Kept for API compatibility; the boot screen has no content frame. */\n contentFrame?: boolean\n /** Kept for API compatibility; the boot screen shows no logo. */\n logo?: React.ReactNode\n /** What is loading, for screen readers. */\n label: string\n className?: string\n}\n\n/** Ring spinner in the page's foreground tone. Static under reduced motion —\n * the ring alone still reads as \"busy\", a frozen spinner reads as \"stuck\". */\nexport function BootSpinner({ className }: { className?: string }) {\n return (\n <span\n aria-hidden\n className={cn(\n 'block h-7 w-7 animate-spin rounded-full border-2 border-foreground/20 border-t-foreground/70',\n 'motion-reduce:animate-none motion-reduce:border-t-foreground/20 motion-reduce:animate-pulse',\n className,\n )}\n />\n )\n}\n\nexport function AppShellSkeleton({ label, className }: AppShellSkeletonProps) {\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n className={cn('fz-viewport-h flex items-center justify-center overflow-hidden bg-background', className)}\n >\n <span className=\"sr-only\">{label}</span>\n <BootSpinner />\n </div>\n )\n}\nAppShellSkeleton.displayName = 'AppShellSkeleton'\n","import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// PageTrail — quem é o PAI da tela que está desenhando agora.\n//\n// Uma migalha (\"← Entrega / Embalagens\") precisa de duas coisas que moram em\n// lugares diferentes: o nome do nível de cima, que só o container sabe, e o\n// nome do nível atual, que só a folha sabe. Sem um caminho entre os dois cada\n// container desenhava a própria seta \"para não perder o caminho de volta\" — e\n// foi assim que Configurações ficou com dois cabeçalhos empilhados: um da\n// barra da shell (\"Configurações\") e um escrito à mão dentro do plugin\n// (\"← Entrega\"), desalinhados, para uma coisa só.\n//\n// Aqui o container apenas DECLARA o nível dele. Quem desenha é sempre a folha,\n// uma vez só, pelo mesmo PageHeader que o resto do app usa — uma seta na tela,\n// nunca duas.\n// ---------------------------------------------------------------------------\n\nexport interface PageTrailCrumb {\n /** Nome do nível — a palavra antes da barra para quem vem abaixo. */\n label: string\n /** Rota (hash) deste nível. É também a IDENTIDADE dele: uma tela cuja rota é\n * igual à do nível não é filha dele, é ele — sem isso a lista de Locais,\n * que É a aba, viraria \"← Locais / Locais\". */\n href: string\n /** Como voltar. Sem isso, a própria rota. */\n onNavigate?: () => void\n}\n\nconst EMPTY: PageTrailCrumb[] = []\nconst PageTrailContext = React.createContext<PageTrailCrumb[]>(EMPTY)\n\n/** Declara um nível para tudo que renderizar abaixo. */\nexport function PageTrail({\n label,\n href,\n onNavigate,\n children,\n}: PageTrailCrumb & { children: React.ReactNode }) {\n const parent = React.useContext(PageTrailContext)\n // Identidade estável: a folha memoiza o nó do cabeçalho a partir daqui, e um\n // array novo a cada render faria a reivindicação da barra recomeçar sem fim.\n const trail = React.useMemo(\n () => [...parent, { label, href, onNavigate }],\n [parent, label, href, onNavigate],\n )\n return <PageTrailContext.Provider value={trail}>{children}</PageTrailContext.Provider>\n}\n\nexport function usePageTrail(): PageTrailCrumb[] {\n return React.useContext(PageTrailContext)\n}\n\n/**\n * O nível imediatamente acima de `href`, ou undefined quando não há trilha —\n * fora de Configurações a página segue sem migalha, como sempre foi.\n */\nexport function usePageTrailParent(href?: string): PageTrailCrumb | undefined {\n const trail = React.useContext(PageTrailContext)\n return React.useMemo(() => {\n const above = href ? trail.filter((c) => c.href !== href) : trail\n return above[above.length - 1]\n }, [trail, href])\n}\n\nexport function navigateToCrumb(crumb: PageTrailCrumb): void {\n if (crumb.onNavigate) crumb.onNavigate()\n else window.location.hash = crumb.href\n}\n","import * as React from 'react'\nimport { PanelRight, PanelRightClose, PanelRightOpen } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport {\n Sheet, SheetContent, SheetHeader, SheetBody, SheetTitle, SheetDescription,\n} from '../primitives/sheet'\n\n// ---------------------------------------------------------------------------\n// ContentSplit — main content with a right-aligned companion panel, mobile\n// first. Below `lg` the aside lives in a right Sheet (opened by a trigger the\n// host places wherever fits — typically SubpageHeader actions, via\n// <ContentSplitTrigger/>). From `lg` up it docks as a sticky right column.\n//\n// Pairs with SubpageHeader/ModulePage: the page keeps its own back-button\n// header; ContentSplit only owns the columns below it. Reuse for any\n// \"document + operational panel\" page (script + shooting checklist, form +\n// help, detail + activity feed).\n// ---------------------------------------------------------------------------\n\ninterface ContentSplitContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\nconst ContentSplitContext = React.createContext<ContentSplitContextValue | null>(null)\n\nexport interface ContentSplitProps {\n /** Main column (the document). */\n children: React.ReactNode\n /** Companion panel content (the checklist / help / activity). */\n aside: React.ReactNode\n /** Panel title — Sheet header on mobile, card header on desktop. */\n asideTitle: React.ReactNode\n /** Optional subtitle under the title. */\n asideDescription?: React.ReactNode\n /** Desktop column width (defaults to 20rem). */\n asideWidth?: string\n /** Controlled mobile-sheet state; uncontrolled when omitted. */\n asideOpen?: boolean\n onAsideOpenChange?: (open: boolean) => void\n /** Desktop column can collapse into a slim reopen rail. */\n collapsible?: boolean\n /** Initial desktop collapsed state (e.g. expand only on the relevant day). */\n defaultCollapsed?: boolean\n className?: string\n}\n\nexport function ContentSplit({\n children,\n aside,\n asideTitle,\n asideDescription,\n asideWidth = '20rem',\n asideOpen,\n onAsideOpenChange,\n collapsible = false,\n defaultCollapsed = false,\n className,\n}: ContentSplitProps) {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const open = asideOpen ?? internalOpen\n const setOpen = onAsideOpenChange ?? setInternalOpen\n const [collapsed, setCollapsed] = React.useState(collapsible && defaultCollapsed)\n\n return (\n <ContentSplitContext.Provider value={{ open, setOpen }}>\n <div\n className={cn('lg:grid lg:items-start lg:gap-6', className)}\n style={{ gridTemplateColumns: `minmax(0, 1fr) ${collapsed ? 'auto' : asideWidth}` }}\n >\n <div className=\"min-w-0\">{children}</div>\n\n {/* Desktop: docked sticky column (or slim reopen rail when collapsed) */}\n <aside className=\"hidden lg:block lg:sticky lg:top-4\">\n {collapsed ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCollapsed(false)}\n className=\"h-9 w-9 p-0\"\n aria-label={typeof asideTitle === 'string' ? asideTitle : undefined}\n title={typeof asideTitle === 'string' ? asideTitle : undefined}\n >\n <PanelRightOpen className=\"h-4 w-4\" />\n </Button>\n ) : (\n <div className=\"rounded-card border border-border bg-card\">\n <div className=\"flex items-start justify-between gap-2 border-b border-border px-4 py-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{asideTitle}</p>\n {asideDescription && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{asideDescription}</p>\n )}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed(true)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n aria-label=\"collapse\"\n >\n <PanelRightClose className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n <div className=\"p-4\">{aside}</div>\n </div>\n )}\n </aside>\n </div>\n\n {/* Mobile: right sheet */}\n <div className=\"lg:hidden\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetContent width=\"max-w-sm\">\n <SheetHeader>\n <SheetTitle>{asideTitle}</SheetTitle>\n {asideDescription && <SheetDescription>{asideDescription}</SheetDescription>}\n </SheetHeader>\n <SheetBody>{aside}</SheetBody>\n </SheetContent>\n </Sheet>\n </div>\n </ContentSplitContext.Provider>\n )\n}\n\nexport interface ContentSplitTriggerProps {\n /** Accessible label; also the visible text unless `iconOnly`. */\n label: React.ReactNode\n iconOnly?: boolean\n className?: string\n}\n\n/** Opens the mobile aside sheet. Renders nothing from `lg` up (the panel is\n * already docked). Place inside SubpageHeader `actions` or any toolbar. */\nexport function ContentSplitTrigger({ label, iconOnly, className }: ContentSplitTriggerProps) {\n const ctx = React.useContext(ContentSplitContext)\n if (!ctx) return null\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => ctx.setOpen(true)}\n className={cn('lg:hidden', className)}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <PanelRight className={cn('h-4 w-4', !iconOnly && 'mr-1.5')} />\n {!iconOnly && label}\n </Button>\n )\n}\n"]}