@fayz-ai/ui 0.14.0 → 0.16.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 (115) hide show
  1. package/dist/{ChartWidgetInner-GDE5PBTR.js → ChartWidgetInner-IOLIUYTB.js} +21 -8
  2. package/dist/ChartWidgetInner-IOLIUYTB.js.map +1 -0
  3. package/dist/analytics/AnalyticsCard.d.ts.map +1 -1
  4. package/dist/analytics/AnalyticsControls.d.ts.map +1 -1
  5. package/dist/analytics/context.d.ts +15 -1
  6. package/dist/analytics/context.d.ts.map +1 -1
  7. package/dist/analytics/index.d.ts +1 -1
  8. package/dist/analytics/index.d.ts.map +1 -1
  9. package/dist/chunk-3OVZ5JJQ.js +540 -0
  10. package/dist/chunk-3OVZ5JJQ.js.map +1 -0
  11. package/dist/{chunk-UZYXFEQS.js → chunk-4GK6IHOI.js} +16 -3
  12. package/dist/chunk-4GK6IHOI.js.map +1 -0
  13. package/dist/{chunk-46UZAKFJ.js → chunk-5VF45NLE.js} +7 -6
  14. package/dist/chunk-5VF45NLE.js.map +1 -0
  15. package/dist/{chunk-5KAGNW45.js → chunk-6BJTH3L6.js} +5 -5
  16. package/dist/chunk-6BJTH3L6.js.map +1 -0
  17. package/dist/chunk-AASANYXN.js +601 -0
  18. package/dist/chunk-AASANYXN.js.map +1 -0
  19. package/dist/{chunk-2EFRFYGF.js → chunk-E44WOPCR.js} +198 -39
  20. package/dist/chunk-E44WOPCR.js.map +1 -0
  21. package/dist/chunk-HKGTF2YA.js +117 -0
  22. package/dist/chunk-HKGTF2YA.js.map +1 -0
  23. package/dist/chunk-OKZ6WQB3.js +57 -0
  24. package/dist/chunk-OKZ6WQB3.js.map +1 -0
  25. package/dist/{chunk-MVH64JFG.js → chunk-PZU7XC2M.js} +780 -719
  26. package/dist/chunk-PZU7XC2M.js.map +1 -0
  27. package/dist/{chunk-77CUIMOI.js → chunk-SDPYDWWV.js} +459 -226
  28. package/dist/chunk-SDPYDWWV.js.map +1 -0
  29. package/dist/dashboard/ChartWidgetInner.d.ts.map +1 -1
  30. package/dist/dashboard/index.js +5 -4
  31. package/dist/hooks/useIsWide.d.ts +16 -0
  32. package/dist/hooks/useIsWide.d.ts.map +1 -0
  33. package/dist/icons.d.ts.map +1 -1
  34. package/dist/icons.js +1 -1
  35. package/dist/index.d.ts +5 -3
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +51 -17
  38. package/dist/index.js.map +1 -1
  39. package/dist/layout/AppShell.d.ts +31 -3
  40. package/dist/layout/AppShell.d.ts.map +1 -1
  41. package/dist/layout/ModulePage.d.ts +4 -0
  42. package/dist/layout/ModulePage.d.ts.map +1 -1
  43. package/dist/layout/SaveBar.d.ts.map +1 -1
  44. package/dist/layout/Sidebar.d.ts +27 -4
  45. package/dist/layout/Sidebar.d.ts.map +1 -1
  46. package/dist/layout/Topbar.d.ts +14 -3
  47. package/dist/layout/Topbar.d.ts.map +1 -1
  48. package/dist/layout/index.d.ts +1 -1
  49. package/dist/layout/index.d.ts.map +1 -1
  50. package/dist/layout/index.js +5 -4
  51. package/dist/primitives/SearchCombobox.d.ts +9 -1
  52. package/dist/primitives/SearchCombobox.d.ts.map +1 -1
  53. package/dist/primitives/checkbox.d.ts +4 -0
  54. package/dist/primitives/checkbox.d.ts.map +1 -1
  55. package/dist/primitives/color-palette.d.ts +24 -0
  56. package/dist/primitives/color-palette.d.ts.map +1 -0
  57. package/dist/primitives/header-tabs.d.ts +11 -1
  58. package/dist/primitives/header-tabs.d.ts.map +1 -1
  59. package/dist/primitives/image-drop.d.ts +28 -0
  60. package/dist/primitives/image-drop.d.ts.map +1 -0
  61. package/dist/primitives/index.d.ts +11 -3
  62. package/dist/primitives/index.d.ts.map +1 -1
  63. package/dist/primitives/index.js +7 -5
  64. package/dist/primitives/list-view.d.ts +11 -1
  65. package/dist/primitives/list-view.d.ts.map +1 -1
  66. package/dist/primitives/modal.d.ts.map +1 -1
  67. package/dist/primitives/option-select.d.ts +46 -0
  68. package/dist/primitives/option-select.d.ts.map +1 -0
  69. package/dist/primitives/page-actions.d.ts +55 -0
  70. package/dist/primitives/page-actions.d.ts.map +1 -0
  71. package/dist/primitives/page-header.d.ts +5 -2
  72. package/dist/primitives/page-header.d.ts.map +1 -1
  73. package/dist/primitives/page-toolbar.d.ts +20 -1
  74. package/dist/primitives/page-toolbar.d.ts.map +1 -1
  75. package/dist/primitives/refresh-button.d.ts.map +1 -1
  76. package/dist/primitives/row-actions.d.ts +11 -0
  77. package/dist/primitives/row-actions.d.ts.map +1 -0
  78. package/dist/primitives/sheet.d.ts.map +1 -1
  79. package/dist/primitives/step-progress.d.ts +20 -0
  80. package/dist/primitives/step-progress.d.ts.map +1 -0
  81. package/dist/primitives/use-row-selection.d.ts +50 -0
  82. package/dist/primitives/use-row-selection.d.ts.map +1 -0
  83. package/dist/primitives/whatsapp-icon.d.ts +7 -0
  84. package/dist/primitives/whatsapp-icon.d.ts.map +1 -0
  85. package/dist/stores/index.d.ts +1 -1
  86. package/dist/stores/index.d.ts.map +1 -1
  87. package/dist/stores/layout.store.d.ts +1 -0
  88. package/dist/stores/layout.store.d.ts.map +1 -1
  89. package/dist/stores/page-header.store.d.ts +39 -5
  90. package/dist/stores/page-header.store.d.ts.map +1 -1
  91. package/dist/styles.css +186 -3
  92. package/dist/wizard/Wizard.d.ts +38 -0
  93. package/dist/wizard/Wizard.d.ts.map +1 -0
  94. package/dist/wizard/WizardField.d.ts +22 -0
  95. package/dist/wizard/WizardField.d.ts.map +1 -0
  96. package/dist/wizard/index.d.ts +6 -0
  97. package/dist/wizard/index.d.ts.map +1 -0
  98. package/dist/wizard/index.js +5 -0
  99. package/dist/wizard/index.js.map +1 -0
  100. package/dist/wizard/logic.d.ts +39 -0
  101. package/dist/wizard/logic.d.ts.map +1 -0
  102. package/dist/wizard/types.d.ts +95 -0
  103. package/dist/wizard/types.d.ts.map +1 -0
  104. package/dist/wizard/useWizard.d.ts +47 -0
  105. package/dist/wizard/useWizard.d.ts.map +1 -0
  106. package/package.json +12 -6
  107. package/dist/ChartWidgetInner-GDE5PBTR.js.map +0 -1
  108. package/dist/chunk-2EFRFYGF.js.map +0 -1
  109. package/dist/chunk-46UZAKFJ.js.map +0 -1
  110. package/dist/chunk-5KAGNW45.js.map +0 -1
  111. package/dist/chunk-77CUIMOI.js.map +0 -1
  112. package/dist/chunk-LFZFBN3P.js +0 -142
  113. package/dist/chunk-LFZFBN3P.js.map +0 -1
  114. package/dist/chunk-MVH64JFG.js.map +0 -1
  115. package/dist/chunk-UZYXFEQS.js.map +0 -1
@@ -0,0 +1 @@
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,12 +1,12 @@
1
- import { cn, Button } from './chunk-LFZFBN3P.js';
2
- import * as React2 from 'react';
1
+ import { cn, Button } from './chunk-OKZ6WQB3.js';
2
+ import * as React6 from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
5
- import { ChevronRight, Check, Circle, Minus, ChevronDown, ArrowDown, ArrowUp, ArrowUpDown, Calendar, RefreshCw } from 'lucide-react';
5
+ import { ChevronRight, Check, Circle, Minus, ChevronDown, ArrowDown, ArrowUp, ArrowUpDown, Calendar, GripVertical, RefreshCw } from 'lucide-react';
6
6
  import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
7
7
  import { useTranslation } from '@fayz-ai/core';
8
8
 
9
- var Card = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
9
+ var Card = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
10
10
  "div",
11
11
  {
12
12
  ref,
@@ -18,7 +18,7 @@ var Card = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ j
18
18
  }
19
19
  ));
20
20
  Card.displayName = "Card";
21
- var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
21
+ var CardHeader = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
22
22
  "div",
23
23
  {
24
24
  ref,
@@ -27,7 +27,7 @@ var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE_
27
27
  }
28
28
  ));
29
29
  CardHeader.displayName = "CardHeader";
30
- var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
30
+ var CardTitle = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
31
31
  "h3",
32
32
  {
33
33
  ref,
@@ -39,7 +39,7 @@ var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
39
39
  }
40
40
  ));
41
41
  CardTitle.displayName = "CardTitle";
42
- var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
42
+ var CardDescription = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
43
43
  "p",
44
44
  {
45
45
  ref,
@@ -48,9 +48,9 @@ var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__
48
48
  }
49
49
  ));
50
50
  CardDescription.displayName = "CardDescription";
51
- var CardContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-4 pt-0", className), ...props }));
51
+ var CardContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-4 pt-0", className), ...props }));
52
52
  CardContent.displayName = "CardContent";
53
- var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
53
+ var CardFooter = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
54
54
  "div",
55
55
  {
56
56
  ref,
@@ -65,7 +65,7 @@ var DropdownGroup = DropdownMenuPrimitive.Group;
65
65
  var DropdownPortal = DropdownMenuPrimitive.Portal;
66
66
  var DropdownSub = DropdownMenuPrimitive.Sub;
67
67
  var DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup;
68
- var DropdownSubTrigger = React2.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
68
+ var DropdownSubTrigger = React6.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
69
69
  DropdownMenuPrimitive.SubTrigger,
70
70
  {
71
71
  ref,
@@ -82,7 +82,7 @@ var DropdownSubTrigger = React2.forwardRef(({ className, inset, children, ...pro
82
82
  }
83
83
  ));
84
84
  DropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
85
- var DropdownSubContent = React2.forwardRef(({ className, ...props }, ref) => (
85
+ var DropdownSubContent = React6.forwardRef(({ className, ...props }, ref) => (
86
86
  // Portaled, like DropdownContent. Without it the submenu renders inside the
87
87
  // parent panel's DOM — and that panel is `overflow-hidden`, so the submenu
88
88
  // was clipped to its box: a flyout you could open and never reach.
@@ -91,7 +91,7 @@ var DropdownSubContent = React2.forwardRef(({ className, ...props }, ref) => (
91
91
  {
92
92
  ref,
93
93
  className: cn(
94
- "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
94
+ "fayz-glass-surface z-[110] min-w-[8rem] overflow-hidden rounded-card border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
95
95
  className
96
96
  ),
97
97
  ...props
@@ -99,20 +99,20 @@ var DropdownSubContent = React2.forwardRef(({ className, ...props }, ref) => (
99
99
  ) })
100
100
  ));
101
101
  DropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
102
- var DropdownContent = React2.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
102
+ var DropdownContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
103
103
  DropdownMenuPrimitive.Content,
104
104
  {
105
105
  ref,
106
106
  sideOffset,
107
107
  className: cn(
108
- "fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
108
+ "fayz-glass-surface z-[110] min-w-[8rem] overflow-hidden rounded-card border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
109
109
  className
110
110
  ),
111
111
  ...props
112
112
  }
113
113
  ) }));
114
114
  DropdownContent.displayName = DropdownMenuPrimitive.Content.displayName;
115
- var DropdownItem = React2.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
115
+ var DropdownItem = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
116
116
  DropdownMenuPrimitive.Item,
117
117
  {
118
118
  ref,
@@ -125,7 +125,7 @@ var DropdownItem = React2.forwardRef(({ className, inset, ...props }, ref) => /*
125
125
  }
126
126
  ));
127
127
  DropdownItem.displayName = DropdownMenuPrimitive.Item.displayName;
128
- var DropdownCheckboxItem = React2.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
128
+ var DropdownCheckboxItem = React6.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
129
129
  DropdownMenuPrimitive.CheckboxItem,
130
130
  {
131
131
  ref,
@@ -142,7 +142,7 @@ var DropdownCheckboxItem = React2.forwardRef(({ className, children, checked, ..
142
142
  }
143
143
  ));
144
144
  DropdownCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
145
- var DropdownRadioItem = React2.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
145
+ var DropdownRadioItem = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
146
146
  DropdownMenuPrimitive.RadioItem,
147
147
  {
148
148
  ref,
@@ -158,7 +158,7 @@ var DropdownRadioItem = React2.forwardRef(({ className, children, ...props }, re
158
158
  }
159
159
  ));
160
160
  DropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
161
- var DropdownLabel = React2.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
161
+ var DropdownLabel = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
162
162
  DropdownMenuPrimitive.Label,
163
163
  {
164
164
  ref,
@@ -171,7 +171,7 @@ var DropdownLabel = React2.forwardRef(({ className, inset, ...props }, ref) => /
171
171
  }
172
172
  ));
173
173
  DropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName;
174
- var DropdownSeparator = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
174
+ var DropdownSeparator = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
175
175
  DropdownMenuPrimitive.Separator,
176
176
  {
177
177
  ref,
@@ -199,7 +199,7 @@ var COLOR_CLASSES = {
199
199
  warning: "border-warning bg-warning text-white",
200
200
  destructive: "border-destructive bg-destructive text-destructive-foreground"
201
201
  };
202
- var Checkbox = React2.forwardRef(
202
+ var Checkbox = React6.forwardRef(
203
203
  ({ checked = false, onChange, disabled, className, color = "primary", id, indeterminate = false, ...props }, ref) => {
204
204
  const filled = checked || indeterminate;
205
205
  return /* @__PURE__ */ jsx(
@@ -243,34 +243,34 @@ function DataTable({
243
243
  }) {
244
244
  const t = useTranslation();
245
245
  const isCard = variant === "card";
246
- const wrapperCls = isCard ? "overflow-hidden rounded-lg border bg-card shadow-sm" : variant === "bare" ? "" : "overflow-hidden rounded-lg border";
246
+ const wrapperCls = isCard ? "overflow-hidden rounded-card border bg-card shadow-sm" : variant === "bare" ? "" : "overflow-hidden rounded-lg border";
247
247
  const headerCls = isCard ? "border-b bg-muted/50" : variant === "bare" ? "border-b bg-muted/30 rounded-none" : "border-b bg-muted/30";
248
248
  const thCls = compact ? "px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground" : "px-4 py-2.5 text-left font-medium text-muted-foreground";
249
249
  const tdCls = compact ? "px-3 py-1.5 align-middle text-xs" : "px-4 py-3 align-middle";
250
250
  const tableCls = compact ? "w-full text-xs min-w-max" : "w-full text-sm min-w-max";
251
251
  const rowHoverCls = isCard ? "hover:bg-muted/30" : "hover:bg-muted/20";
252
- const [sorting, setSorting] = React2.useState([]);
253
- const rowId = React2.useCallback(
252
+ const [sorting, setSorting] = React6.useState([]);
253
+ const rowId = React6.useCallback(
254
254
  (row) => getRowId ? getRowId(row) : String(row.id ?? ""),
255
255
  [getRowId]
256
256
  );
257
- const selected = React2.useMemo(() => new Set(selectedIds ?? []), [selectedIds]);
258
- const pageIds = React2.useMemo(() => data.map(rowId), [data, rowId]);
257
+ const selected = React6.useMemo(() => new Set(selectedIds ?? []), [selectedIds]);
258
+ const pageIds = React6.useMemo(() => data.map(rowId), [data, rowId]);
259
259
  const selectedOnPage = pageIds.filter((id) => selected.has(id)).length;
260
260
  const allOnPageSelected = pageIds.length > 0 && selectedOnPage === pageIds.length;
261
- const toggleRow = React2.useCallback((id) => {
261
+ const toggleRow = React6.useCallback((id) => {
262
262
  const next = new Set(selected);
263
263
  if (next.has(id)) next.delete(id);
264
264
  else next.add(id);
265
265
  onSelectedIdsChange?.([...next]);
266
266
  }, [selected, onSelectedIdsChange]);
267
- const toggleAllOnPage = React2.useCallback(() => {
267
+ const toggleAllOnPage = React6.useCallback(() => {
268
268
  const next = new Set(selected);
269
269
  if (allOnPageSelected) pageIds.forEach((id) => next.delete(id));
270
270
  else pageIds.forEach((id) => next.add(id));
271
271
  onSelectedIdsChange?.([...next]);
272
272
  }, [selected, allOnPageSelected, pageIds, onSelectedIdsChange]);
273
- const selectionColumn = React2.useMemo(() => ({
273
+ const selectionColumn = React6.useMemo(() => ({
274
274
  id: "__select__",
275
275
  enableSorting: false,
276
276
  header: () => /* @__PURE__ */ jsx(
@@ -297,7 +297,7 @@ function DataTable({
297
297
  // ids: turning the page with nothing selected changes no other dep, and the
298
298
  // memo would hand the header a button that ticks the previous page's rows.
299
299
  }), [allOnPageSelected, selectedOnPage, selected, rowId, toggleRow, toggleAllOnPage, t]);
300
- const allColumns = React2.useMemo(
300
+ const allColumns = React6.useMemo(
301
301
  () => selectable ? [selectionColumn, ...columns] : columns,
302
302
  [selectable, selectionColumn, columns]
303
303
  );
@@ -370,6 +370,19 @@ function DataTable({
370
370
  }) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: allColumns.length, className: "h-64 px-6 text-center align-middle text-muted-foreground", children: emptyMessage }) }) })
371
371
  ] }) }) });
372
372
  }
373
+ var WIDE_QUERY = "(min-width: 768px)";
374
+ function useIsWide(query = WIDE_QUERY) {
375
+ const [wide, setWide] = React6.useState(
376
+ () => typeof window === "undefined" ? true : window.matchMedia(query).matches
377
+ );
378
+ React6.useEffect(() => {
379
+ const mq = window.matchMedia(query);
380
+ const onChange = () => setWide(mq.matches);
381
+ mq.addEventListener("change", onChange);
382
+ return () => mq.removeEventListener("change", onChange);
383
+ }, [query]);
384
+ return wide;
385
+ }
373
386
  function Skeleton({
374
387
  className,
375
388
  ...props
@@ -397,7 +410,7 @@ function TableSkeleton({ columns = 4, rows = 2 }) {
397
410
  )) }, r)) })
398
411
  ] });
399
412
  }
400
- var ToolbarButton = React2.forwardRef(function ToolbarButton2({ icon: Icon, caret = true, children, className, ...props }, ref) {
413
+ var ToolbarButton = React6.forwardRef(function ToolbarButton2({ icon: Icon, caret = true, children, className, ...props }, ref) {
401
414
  return /* @__PURE__ */ jsxs(
402
415
  Button,
403
416
  {
@@ -422,6 +435,27 @@ var ToolbarButton = React2.forwardRef(function ToolbarButton2({ icon: Icon, care
422
435
  }
423
436
  );
424
437
  });
438
+ var ToolbarAction = React6.forwardRef(function ToolbarAction2({ icon: Icon, caret = false, children, className, ...props }, ref) {
439
+ return /* @__PURE__ */ jsxs(
440
+ Button,
441
+ {
442
+ ref,
443
+ variant: "ghost",
444
+ size: "sm",
445
+ className: cn(
446
+ "gap-1.5 border-0 bg-transparent px-2 font-medium text-muted-foreground shadow-none",
447
+ "hover:bg-transparent hover:text-foreground",
448
+ className
449
+ ),
450
+ ...props,
451
+ children: [
452
+ Icon ? /* @__PURE__ */ jsx(Icon, { className: "h-3 w-3 shrink-0 opacity-70" }) : null,
453
+ children,
454
+ caret ? /* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 shrink-0 opacity-60" }) : null
455
+ ]
456
+ }
457
+ );
458
+ });
425
459
  function RangeControl({
426
460
  options,
427
461
  value,
@@ -451,6 +485,109 @@ function RangeControl({
451
485
  children
452
486
  ] });
453
487
  }
488
+ var OFFSET_KEY = (scope) => `fayz.toolbar.offset.${scope}`;
489
+ var EDGE = 8;
490
+ function readOffset(key) {
491
+ if (typeof window === "undefined") return { x: 0, y: 0 };
492
+ try {
493
+ const raw = window.localStorage.getItem(key);
494
+ if (!raw) return { x: 0, y: 0 };
495
+ const parsed = JSON.parse(raw);
496
+ return {
497
+ x: Number.isFinite(parsed.x) ? Number(parsed.x) : 0,
498
+ y: Number.isFinite(parsed.y) ? Number(parsed.y) : 0
499
+ };
500
+ } catch {
501
+ return { x: 0, y: 0 };
502
+ }
503
+ }
504
+ function writeOffset(key, offset) {
505
+ if (typeof window === "undefined") return;
506
+ try {
507
+ if (offset.x === 0 && offset.y === 0) window.localStorage.removeItem(key);
508
+ else window.localStorage.setItem(key, JSON.stringify(offset));
509
+ } catch {
510
+ }
511
+ }
512
+ function useToolbarOffset(storageKey, enabled) {
513
+ const key = OFFSET_KEY(storageKey);
514
+ const barRef = React6.useRef(null);
515
+ const [offset, setOffset] = React6.useState(() => enabled ? readOffset(key) : { x: 0, y: 0 });
516
+ const [dragging, setDragging] = React6.useState(false);
517
+ const latest = React6.useRef(offset);
518
+ latest.current = offset;
519
+ const origin = React6.useRef(null);
520
+ const clamp = React6.useCallback((next) => {
521
+ const el = barRef.current;
522
+ if (!el || typeof window === "undefined") return next;
523
+ const rect = el.getBoundingClientRect();
524
+ const anchorLeft = rect.left - latest.current.x;
525
+ const anchorTop = rect.top - latest.current.y;
526
+ return {
527
+ x: Math.min(
528
+ Math.max(next.x, EDGE - anchorLeft),
529
+ Math.max(EDGE - anchorLeft, window.innerWidth - EDGE - rect.width - anchorLeft)
530
+ ),
531
+ y: Math.min(
532
+ Math.max(next.y, EDGE - anchorTop),
533
+ Math.max(EDGE - anchorTop, window.innerHeight - EDGE - rect.height - anchorTop)
534
+ )
535
+ };
536
+ }, []);
537
+ const move = React6.useCallback((next, persist) => {
538
+ const clamped = clamp(next);
539
+ setOffset(clamped);
540
+ if (persist) writeOffset(key, clamped);
541
+ }, [clamp, key]);
542
+ const onPointerDown = (event) => {
543
+ if (!enabled || event.button !== 0) return;
544
+ event.preventDefault();
545
+ event.currentTarget.setPointerCapture(event.pointerId);
546
+ origin.current = { px: event.clientX, py: event.clientY, ox: latest.current.x, oy: latest.current.y };
547
+ setDragging(true);
548
+ };
549
+ const onPointerMove = (event) => {
550
+ const from = origin.current;
551
+ if (!from) return;
552
+ move({ x: from.ox + (event.clientX - from.px), y: from.oy + (event.clientY - from.py) }, false);
553
+ };
554
+ const endDrag = (event) => {
555
+ if (!origin.current) return;
556
+ origin.current = null;
557
+ setDragging(false);
558
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
559
+ event.currentTarget.releasePointerCapture(event.pointerId);
560
+ }
561
+ writeOffset(key, latest.current);
562
+ };
563
+ const onKeyDown = (event) => {
564
+ if (!enabled) return;
565
+ const step = event.shiftKey ? 24 : 8;
566
+ const delta = {
567
+ ArrowLeft: { x: -step, y: 0 },
568
+ ArrowRight: { x: step, y: 0 },
569
+ ArrowUp: { x: 0, y: -step },
570
+ ArrowDown: { x: 0, y: step }
571
+ };
572
+ if (event.key === "Escape" || event.key === "Home") {
573
+ event.preventDefault();
574
+ move({ x: 0, y: 0 }, true);
575
+ return;
576
+ }
577
+ const d = delta[event.key];
578
+ if (!d) return;
579
+ event.preventDefault();
580
+ move({ x: latest.current.x + d.x, y: latest.current.y + d.y }, true);
581
+ };
582
+ const reset = React6.useCallback(() => move({ x: 0, y: 0 }, true), [move]);
583
+ React6.useEffect(() => {
584
+ if (!enabled) return;
585
+ const onResize = () => move(latest.current, false);
586
+ window.addEventListener("resize", onResize);
587
+ return () => window.removeEventListener("resize", onResize);
588
+ }, [enabled, move]);
589
+ return { barRef, offset, dragging, reset, handlers: { onPointerDown, onPointerMove, onPointerUp: endDrag, onPointerCancel: endDrag, onKeyDown } };
590
+ }
454
591
  function PageToolbar({
455
592
  range,
456
593
  filters,
@@ -460,8 +597,13 @@ function PageToolbar({
460
597
  onRefresh,
461
598
  refreshLabel,
462
599
  sticky = true,
600
+ movable = true,
601
+ storageKey = "shared",
602
+ moveLabel,
463
603
  className
464
604
  }) {
605
+ const floating = useIsWide();
606
+ const { barRef, offset, dragging, reset, handlers } = useToolbarOffset(storageKey, movable && floating);
465
607
  if (!range && !filters && !chips && !customize && !actions && !onRefresh) return null;
466
608
  return (
467
609
  // Caixa de altura ZERO: a barra flutua sobre os cartões em vez de abrir uma
@@ -477,24 +619,41 @@ function PageToolbar({
477
619
  "div",
478
620
  {
479
621
  className: cn(
622
+ "z-20 flex",
480
623
  // `items-start` não é enfeite: num flex de altura 0, o alinhamento
481
624
  // padrão (stretch) achata o filho para 0px — a barra some e só os
482
625
  // botões transbordam, sem vidro nenhum atrás.
483
- "pointer-events-none z-20 flex h-0 items-start justify-end",
626
+ floating ? "pointer-events-none h-0 items-start justify-end" : "w-full",
484
627
  sticky && "sticky top-0"
485
628
  ),
486
629
  children: /* @__PURE__ */ jsxs(
487
630
  "div",
488
631
  {
632
+ ref: barRef,
633
+ style: floating && (offset.x || offset.y) ? { transform: `translate3d(${offset.x}px, ${offset.y}px, 0)` } : void 0,
489
634
  className: cn(
490
- // O mesmo vidro do assistente (fayz-floating-surface, em styles.css):
491
- // é a outra coisa que flutua sobre a página, e as duas se diziam
492
- // flutuantes em materiais diferentes. Fill fino + blur pesado, para a
493
- // grade passar por baixo sem competir.
494
- "fayz-floating-surface pointer-events-auto flex max-w-full flex-wrap items-center justify-end gap-2 rounded-2xl px-2 py-1.5",
635
+ "flex max-w-full flex-wrap items-center gap-2",
636
+ floating ? "fayz-floating-surface pointer-events-auto justify-end rounded-2xl px-2 py-1.5" : "w-full justify-start border-b border-border bg-background px-3 py-2",
637
+ dragging && "select-none",
495
638
  className
496
639
  ),
497
640
  children: [
641
+ movable && floating ? /* @__PURE__ */ jsx(
642
+ "button",
643
+ {
644
+ type: "button",
645
+ "aria-label": moveLabel ?? "Mover a barra",
646
+ title: moveLabel ?? "Mover a barra",
647
+ onDoubleClick: reset,
648
+ ...handlers,
649
+ className: cn(
650
+ "flex h-[26px] w-4 shrink-0 touch-none items-center justify-center rounded-md text-muted-foreground/50",
651
+ "transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
652
+ dragging ? "cursor-grabbing text-foreground" : "cursor-grab"
653
+ ),
654
+ children: /* @__PURE__ */ jsx(GripVertical, { className: "h-3.5 w-3.5" })
655
+ }
656
+ ) : null,
498
657
  range,
499
658
  filters,
500
659
  chips,
@@ -519,6 +678,6 @@ function PageToolbar({
519
678
  );
520
679
  }
521
680
 
522
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, PageToolbar, RangeControl, Skeleton, TableSkeleton, ToolbarButton };
523
- //# sourceMappingURL=chunk-2EFRFYGF.js.map
524
- //# sourceMappingURL=chunk-2EFRFYGF.js.map
681
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, PageToolbar, RangeControl, Skeleton, TableSkeleton, ToolbarAction, ToolbarButton, WIDE_QUERY, useIsWide };
682
+ //# sourceMappingURL=chunk-E44WOPCR.js.map
683
+ //# sourceMappingURL=chunk-E44WOPCR.js.map