@fayz-ai/ui 0.42.0 → 0.43.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 (37) hide show
  1. package/dist/{chunk-47B6ISJ6.js → chunk-3HGLZIQT.js} +140 -344
  2. package/dist/chunk-3HGLZIQT.js.map +1 -0
  3. package/dist/{chunk-W7CIJU5U.js → chunk-4BP33MTZ.js} +4 -4
  4. package/dist/{chunk-W7CIJU5U.js.map → chunk-4BP33MTZ.js.map} +1 -1
  5. package/dist/{chunk-UKMRHO5B.js → chunk-L6PNGGHM.js} +713 -244
  6. package/dist/chunk-L6PNGGHM.js.map +1 -0
  7. package/dist/{chunk-GG5XY6SF.js → chunk-ZMS7TNJD.js} +149 -196
  8. package/dist/chunk-ZMS7TNJD.js.map +1 -0
  9. package/dist/dashboard/index.js +3 -3
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +8 -8
  13. package/dist/layout/AppShell.d.ts +4 -1
  14. package/dist/layout/AppShell.d.ts.map +1 -1
  15. package/dist/layout/index.js +1 -1
  16. package/dist/primitives/bulk-action-bar.d.ts +3 -1
  17. package/dist/primitives/bulk-action-bar.d.ts.map +1 -1
  18. package/dist/primitives/data-table.d.ts +8 -1
  19. package/dist/primitives/data-table.d.ts.map +1 -1
  20. package/dist/primitives/dropdown.d.ts +2 -2
  21. package/dist/primitives/dropdown.d.ts.map +1 -1
  22. package/dist/primitives/index.d.ts +1 -1
  23. package/dist/primitives/index.d.ts.map +1 -1
  24. package/dist/primitives/index.js +3 -3
  25. package/dist/primitives/list-view.d.ts +3 -1
  26. package/dist/primitives/list-view.d.ts.map +1 -1
  27. package/dist/primitives/mobile-scrim.d.ts +29 -0
  28. package/dist/primitives/mobile-scrim.d.ts.map +1 -0
  29. package/dist/primitives/page-actions.d.ts +5 -14
  30. package/dist/primitives/page-actions.d.ts.map +1 -1
  31. package/dist/primitives/use-row-selection.d.ts +2 -0
  32. package/dist/primitives/use-row-selection.d.ts.map +1 -1
  33. package/dist/styles.css +55 -0
  34. package/package.json +2 -2
  35. package/dist/chunk-47B6ISJ6.js.map +0 -1
  36. package/dist/chunk-GG5XY6SF.js.map +0 -1
  37. package/dist/chunk-UKMRHO5B.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/primitives/ai-action-button.tsx","../src/primitives/inline-link.tsx","../src/primitives/input.tsx","../src/primitives/badge.tsx","../src/primitives/select.tsx","../src/primitives/toast.tsx","../src/primitives/tabs.tsx","../src/primitives/separator.tsx","../src/primitives/phone-link.tsx","../src/primitives/whatsapp-icon.tsx","../src/primitives/breadcrumb.tsx","../src/primitives/page-actions.tsx","../src/primitives/row-actions.tsx","../src/primitives/list-chrome.tsx","../src/primitives/bulk-action-bar.tsx","../src/primitives/draft-commit-bar.tsx","../src/primitives/thumbnail.tsx","../src/primitives/refresh-button.tsx","../src/primitives/phone-field.tsx","../src/primitives/stat-tiles.tsx","../src/primitives/time-picker.tsx","../src/primitives/use-row-selection.ts","../src/primitives/choice-list.tsx","../src/primitives/filter-chip.tsx","../src/primitives/list-filter-bar.tsx","../src/primitives/list-view.tsx","../src/primitives/date-picker.tsx","../src/primitives/mini-calendar.tsx","../src/primitives/dot-badge.tsx","../src/primitives/filter-check-list.tsx","../src/primitives/search-select.tsx","../src/primitives/currency-input.tsx","../src/primitives/segmented-control.tsx","../src/primitives/required-filter.tsx","../src/primitives/filter-panel.tsx","../src/primitives/date-range-chip.tsx","../src/primitives/multi-select.tsx","../src/primitives/person-picker.tsx","../src/primitives/dictate-button.tsx","../src/primitives/markdown.tsx","../src/primitives/markdown-editor.tsx","../src/primitives/SearchCombobox.tsx","../src/primitives/picker-dialog.tsx","../src/primitives/wizard-steps.tsx","../src/primitives/modal-flow.tsx","../src/primitives/nested-pane.tsx","../src/primitives/modal-task.tsx","../src/primitives/stock-entry-form.tsx","../src/primitives/coming-soon.tsx","../src/primitives/person-name.ts","../src/primitives/filter-rail.tsx"],"names":["React","TONE","jsx","React2","jsxs","React3","React4","Separator","React5","React6","Icon","ChevronDown","Fragment","React7","MoreHorizontal","React8","Check","React9","React10","formatPhone","useState","useRef","useEffect","createPortal","React12","React13","Search","React14","React15","useCallback","React16","Plus","RefreshCw","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","useTranslation","useMemo","DAY_LABELS","isSameDay","isToday","toDateLocale","getCurrentLocale","Loader2","X","React21","React22","React23","SearchIcon","React24","React25","React26","React27","React28","React29","React31","ArrowLeft","React32","React33","Clock"],"mappings":"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","file":"chunk-47B6ISJ6.js","sourcesContent":["import * as React from 'react'\nimport { Loader2, Sparkles } from 'lucide-react'\n\nimport { Button, type ButtonProps } from './button'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// The one button that asks the machine for an answer.\n// ---------------------------------------------------------------------------\n// Purple (`magic`) is already the colour of what the model proposed — the\n// reconciliation screen paints its suggestion ribbon with it. The ACTION that\n// produces a suggestion wore `variant=\"outline\"` instead, so the same thought\n// had two looks: the ask was grey and the answer was purple. One component, so\n// every \"ask the AI\" in the product is the same gesture.\n//\n// `busy` is a prop and not the caller's job: every one of these fires a network\n// round trip, and a button that stays clickable during it sends the request\n// twice.\n// ---------------------------------------------------------------------------\n\nexport interface AiActionButtonProps extends Omit<ButtonProps, 'variant'> {\n /** The request is in flight: spinner, and no second click. */\n busy?: boolean\n /** What to say while it runs. Falls back to the idle label. */\n busyLabel?: React.ReactNode\n /** `solid` for the primary ask; `soft` when it sits next to a real primary. */\n tone?: 'solid' | 'soft'\n}\n\nconst TONE = {\n solid:\n 'bg-magic text-magic-foreground border border-magic shadow-button-primary hover:bg-magic/90 active:shadow-button-inset',\n soft:\n 'border border-magic/30 bg-magic-soft text-magic-soft-foreground shadow-button hover:bg-magic/10 active:shadow-button-inset',\n} as const\n\nconst AiActionButton = React.forwardRef<HTMLButtonElement, AiActionButtonProps>(\n ({ busy, busyLabel, tone = 'solid', className, children, disabled, ...props }, ref) => (\n <Button\n ref={ref}\n variant=\"ghost\"\n disabled={disabled || busy}\n className={cn(TONE[tone], className)}\n {...props}\n >\n {busy\n ? <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" aria-hidden />\n : <Sparkles className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />}\n {busy ? (busyLabel ?? children) : children}\n </Button>\n ),\n)\nAiActionButton.displayName = 'AiActionButton'\n\nexport { AiActionButton }\n","import * as React from 'react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// A PRÓPRIA PALAVRA É O GATILHO.\n// ---------------------------------------------------------------------------\n// Dentro de uma frase não cabe botão: «Motivo: Entrada via DANFE NF-e 4693» é\n// uma legenda, e desenhar uma caixa em volta do número a transformaria num\n// controle que disputa atenção com o que a linha tem de dizer. O que o produto\n// usa nesses lugares é texto sublinhado — e cada tela vinha escrevendo a classe\n// à mão, com sublinhado diferente em cada uma.\n//\n// Duas aparências, e a diferença não é estética:\n//\n// solid LEVA A OUTRO LUGAR. Sublinhado contínuo, a convenção de link que\n// todo mundo já leu mil vezes.\n// dashed TROCA ESTE VALOR AQUI. Tracejado, o traço clássico de «isto se\n// edita» — é o que `InstallmentSource` e os gatilhos da barra de\n// ferramentas usam, e prometer navegação com ele mentiria.\n//\n// Renderiza `<a>` quando recebe `href` e `<button>` quando recebe `onClick`:\n// abrir um modal não é navegar, e um `<a href=\"#\">` que abre diálogo quebra o\n// «abrir em nova aba» que o cursor de mãozinha prometeu.\n// ---------------------------------------------------------------------------\n\nexport type InlineLinkTone = 'solid' | 'dashed'\n\n/**\n * A TINTA, exportada, porque ela já existia em quatro grafias diferentes.\n *\n * O `DatePicker variant=\"inline\"`, o gatilho de forma de pagamento do\n * `InstallmentSource`, o `ToolbarButton` da barra e este componente desenhavam o\n * mesmo traço cada um do seu jeito — um com `decoration-dashed`, outro com\n * `border-b border-dashed`, com três deslocamentos diferentes. Quem precisa do\n * comportamento de botão do Radix (um popover, por exemplo) não pode usar o\n * componente, mas pode usar a tinta.\n */\nexport const INLINE_LINK_TONE: Record<InlineLinkTone, string> = {\n solid: 'underline underline-offset-2 decoration-from-font',\n dashed: 'underline decoration-dashed decoration-from-font underline-offset-4',\n}\n\nconst TONE = INLINE_LINK_TONE\ntype Tone = InlineLinkTone\n\n// `text-primary` por padrão, e não `text-inherit`: palavra clicável neste produto\n// é da cor da marca — é o que o `DatePicker variant=\"inline\"` já fazia, e a data\n// do cronograma de pagamento é vinho no ChefControl porque é o primary dele.\n// Herdar a cor do texto faria o gatilho desaparecer dentro da frase, e `text-info`\n// azul faria cada tela escolher a sua. `className` sobrepõe quando há motivo.\nconst BASE =\n 'inline items-baseline text-left font-[inherit] text-primary ' +\n 'hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ' +\n 'focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50'\n\ninterface Common {\n tone?: Tone\n className?: string\n children?: React.ReactNode\n}\n\nexport type InlineLinkProps =\n & Common\n & (\n | ({ href: string; onClick?: never } & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'className'>)\n | ({ href?: never; onClick: React.MouseEventHandler<HTMLButtonElement> } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'className'>)\n )\n\nexport function InlineLink({ tone = 'solid', className, children, ...rest }: InlineLinkProps) {\n const classes = cn(BASE, TONE[tone], className)\n\n if ('href' in rest && rest.href !== undefined) {\n const { href, ...anchor } = rest as React.AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }\n return <a href={href} className={classes} {...anchor}>{children}</a>\n }\n\n const button = rest as React.ButtonHTMLAttributes<HTMLButtonElement>\n // `type=\"button\"` explícito: dentro de um formulário, o padrão é `submit`, e\n // um link que salva o formulário ao ser lido é o defeito mais caro desta lista.\n return <button type=\"button\" className={classes} {...button}>{children}</button>\n}\n","import * as React from 'react'\n\nimport { cn } from '../lib/cn'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: string\n description?: string\n}\n\n// ---------------------------------------------------------------------------\n// A ALTURA DE UM CAMPO É UMA SÓ: h-9, 36px.\n//\n// Eram três na mesma linha de formulário — 32px neste, 36px no seletor, 38px no\n// campo de dinheiro, que não declarava altura nenhuma e caía da padding. Numa\n// grade de duas colunas isso é visível sem medir: o rótulo da direita alinha e\n// a caixa não.\n//\n// 36px e não 32: é o que o `baseClass` do formulário do CRUD já usava, é a\n// altura do botão `lg` (um campo ao lado de um botão primário tem de fechar), e\n// 32px num campo que se toca no celular é apertado.\n//\n// Uma tela densa que queira menos passa a sua (`className=\"h-8\"`): `cn` é\n// tailwind-merge e a classe de quem chama ganha das daqui.\n// ---------------------------------------------------------------------------\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, error, description, id, ...props }, ref) => {\n const inputId = id ?? React.useId()\n const descriptionId = description ? `${inputId}-description` : undefined\n const errorId = error ? `${inputId}-error` : undefined\n\n return (\n <div className=\"w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n 'flex h-9 w-full rounded-input border border-input bg-card px-3 py-1.5 text-sm text-foreground shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-destructive focus-visible:ring-destructive',\n className,\n )}\n ref={ref}\n aria-invalid={error ? true : undefined}\n aria-describedby={\n [descriptionId, errorId].filter(Boolean).join(' ') || undefined\n }\n {...props}\n />\n {description && !error && (\n <p id={descriptionId} className=\"mt-1.5 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p id={errorId} className=\"mt-1.5 text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center gap-1.5 rounded px-2 py-0.5 text-xs font-medium leading-[18px] transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'bg-muted text-muted-foreground',\n secondary: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n destructive: 'bg-destructive-soft text-destructive-soft-foreground',\n magic: 'bg-magic-soft text-magic-soft-foreground',\n strong: 'bg-primary text-primary-foreground',\n outline: 'border border-border text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst VARIANTS_WITH_DOT = new Set([\n 'info',\n 'success',\n 'warning',\n 'destructive',\n 'magic',\n])\n\nconst DOT_COLOR: Record<string, string> = {\n info: 'hsl(var(--info))',\n success: 'hsl(var(--success))',\n warning: 'hsl(var(--warning))',\n destructive: 'hsl(var(--destructive))',\n magic: 'hsl(var(--magic))',\n}\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {\n // Show a leading status dot. Defaults to true for status variants\n // (info/success/warning/destructive/magic), false for neutral/outline/strong.\n dot?: boolean\n}\n\nfunction Badge({ className, variant, dot, children, ...props }: BadgeProps) {\n const v = variant ?? 'default'\n const showDot = dot ?? VARIANTS_WITH_DOT.has(v)\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props}>\n {showDot && (\n <span\n className=\"inline-block size-1.5 rounded-full\"\n style={{ background: DOT_COLOR[v] ?? 'currentColor' }}\n />\n )}\n {children}\n </div>\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { ChevronDown, ChevronUp, Check } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between rounded-input border border-input bg-background px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'fayz-glass-surface relative z-[110] max-h-96 min-w-[8rem] overflow-hidden rounded-card border bg-popover text-popover-foreground shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n // NOT the same box as SelectItem, which is what it used to be: same\n // padding, same size, only bolder — so a group header read as a bolder\n // CHOICE, and \"Salão\" looked like a mesa you could pick.\n //\n // Three things separate them now, and each does its own work: small caps\n // muted type says \"this labels things\" rather than \"this is a thing\";\n // `pl-2` drops the checkmark gutter that only a selectable row needs; and\n // the top margin puts air between groups so the eye sees blocks instead of\n // one long list.\n className={cn(\n 'mt-1.5 px-2 py-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground first:mt-0',\n className,\n )}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none data-[highlighted]:bg-muted focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from 'react'\nimport { Toaster, toast } from 'sonner'\nimport { useSaveBarVisible } from '../layout/SaveBar'\n\ninterface ToastProviderProps {\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n theme?: 'light' | 'dark' | 'system'\n}\n\nfunction ToastProvider({\n position = 'bottom-center',\n theme = 'system',\n}: ToastProviderProps) {\n // Stack toasts ABOVE the floating SaveBar (instead of overlapping it) by\n // lifting the bottom offset while the bar is on screen.\n const saveBarVisible = useSaveBarVisible()\n const bottomOffset = position.startsWith('bottom') && saveBarVisible ? 84 : 24\n return (\n <Toaster\n position={position}\n theme={theme}\n offset={bottomOffset}\n closeButton\n richColors\n toastOptions={{\n classNames: {\n // Format harmonized with the SaveBar island: soft ring + xl shadow,\n // generous rounded-2xl radius (full-pill looks wrong on multi-line\n // toasts). Colors stay semantic (richColors).\n toast: 'group !gap-3 !rounded-3xl !border !px-4 !py-3 !shadow-xl !ring-1 !ring-black/5',\n title: '!text-sm !font-semibold',\n description: '!text-xs !mt-0.5',\n closeButton: '!opacity-0 group-hover:!opacity-60 hover:!opacity-100 !transition-opacity',\n },\n }}\n />\n )\n}\n\nexport { ToastProvider, toast }\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '../lib/cn'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n // Theme radius, not a fixed one: the chip and its track are controls, and\n // an app that states 12px corners had these two answering 6px.\n 'inline-flex h-10 items-center justify-center rounded-button bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\n// The active tab is a raised chip, so it takes `card` — the surface every other\n// raised thing takes. On `background` it only stood out while the page happened\n// to be white; on a page one step down the scale it lost its edge.\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-button px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-card data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '../lib/cn'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Um telefone que abre a conversa, não o discador.\n//\n// `tel:` era a escolha óbvia e é a errada para este público: num desktop ele\n// não faz nada (ou abre um app que ninguém configurou), e no Brasil o primeiro\n// contato com um lead acontece no WhatsApp de qualquer jeito. O clique custava\n// um copiar-colar toda vez.\n//\n// Componente em vez de `<a>` solto porque a parte difícil não é o link — é\n// decidir o que fazer com o que está gravado. O telefone chega de formulário\n// público, de importação, de digitação: com DDI, sem DDI, com máscara, com\n// ramal. wa.me só aceita dígitos com DDI, e um link errado leva a pessoa a uma\n// conversa com o número errado — pior do que não linkar.\n// ---------------------------------------------------------------------------\n\n/** DDI assumido quando o número não traz um. Brasil, que é o padrão da stack. */\nconst DEFAULT_COUNTRY_CODE = '55'\n\n/** Menor coisa discável: DDD + 8 dígitos. Abaixo disso não é telefone. */\nconst MIN_NATIONAL_DIGITS = 10\n\n/** E.164 vai até 15; acima disso é lixo, ramal colado ou dois números juntos. */\nconst MAX_DIGITS = 15\n\nexport interface NormalizedPhone {\n /** Só dígitos, com DDI — o que o wa.me aceita. Null quando não dá para usar. */\n e164: string | null\n /** Como mostrar: formatado quando reconhecível, cru quando não. */\n display: string\n}\n\n/**\n * Resolve o que está gravado para algo que o wa.me aceita.\n *\n * Conservador de propósito: na dúvida devolve `e164: null`, e o componente\n * mostra texto simples. Deixar de linkar é um incômodo; linkar para o número\n * de outra pessoa é um erro que ninguém percebe até a conversa começar.\n */\nexport function normalizePhone(\n raw: string | null | undefined,\n countryCode: string = DEFAULT_COUNTRY_CODE,\n): NormalizedPhone {\n const input = (raw ?? '').trim()\n if (!input) return { e164: null, display: '' }\n\n const digits = input.replace(/\\D/g, '')\n if (!digits || digits.length > MAX_DIGITS) {\n return { e164: null, display: input }\n }\n\n // `+` na origem significa que quem gravou já disse o país. Respeitar.\n const explicit = input.startsWith('+')\n let e164: string | null = null\n\n if (explicit) {\n e164 = digits\n } else if (digits.startsWith(countryCode) && digits.length > MIN_NATIONAL_DIGITS) {\n // Já vem com o DDI (o formulário público grava assim).\n e164 = digits\n } else if (digits.length >= MIN_NATIONAL_DIGITS) {\n // Número nacional: o DDI é o que falta.\n e164 = `${countryCode}${digits}`\n }\n\n if (e164 && (e164.length < MIN_NATIONAL_DIGITS + 1 || e164.length > MAX_DIGITS)) {\n e164 = null\n }\n\n return { e164, display: formatPhone(e164 ?? digits, input, countryCode) }\n}\n\n/** \"5521999998888\" → \"+55 (21) 99999-8888\". Fora do Brasil, devolve o original. */\nfunction formatPhone(digits: string, fallback: string, countryCode: string): string {\n if (countryCode !== '55' || !digits.startsWith('55')) return fallback\n const national = digits.slice(2)\n // 11 = celular (9 dígitos), 10 = fixo.\n if (national.length !== 10 && national.length !== 11) return fallback\n const ddd = national.slice(0, 2)\n const rest = national.slice(2)\n const head = rest.length === 9 ? rest.slice(0, 5) : rest.slice(0, 4)\n const tail = rest.length === 9 ? rest.slice(5) : rest.slice(4)\n return `+55 (${ddd}) ${head}-${tail}`\n}\n\nexport interface PhoneLinkProps extends Omit<React.ComponentPropsWithoutRef<'a'>, 'href'> {\n /** O telefone como está gravado — com ou sem DDI, com ou sem máscara. */\n phone: string | null | undefined\n /** Texto que já vai digitado na conversa. */\n message?: string\n /** DDI assumido quando o número não traz um. Default: 55. */\n countryCode?: string\n /** Mostra o número cru em vez do formatado. */\n raw?: boolean\n /** Renderizado no lugar do número (um ícone + label, por exemplo). */\n children?: React.ReactNode\n}\n\n/**\n * Telefone clicável que abre o WhatsApp em outra aba.\n *\n * Sem número utilizável, vira `<span>`: um link morto convida ao clique e não\n * entrega nada.\n */\nexport const PhoneLink = React.forwardRef<HTMLAnchorElement, PhoneLinkProps>(\n ({ phone, message, countryCode, raw, className, children, ...props }, ref) => {\n const { e164, display } = normalizePhone(phone, countryCode)\n const label = children ?? (raw ? (phone ?? '') : display)\n\n if (!e164) {\n return label ? <span className={className}>{label}</span> : null\n }\n\n const href = message\n ? `https://wa.me/${e164}?text=${encodeURIComponent(message)}`\n : `https://wa.me/${e164}`\n\n return (\n <a\n ref={ref}\n href={href}\n target=\"_blank\"\n // noreferrer junto: wa.me abre em aba nova, e sem isto a página de\n // destino recebe uma referência para a janela de origem.\n rel=\"noopener noreferrer\"\n title={`WhatsApp ${display}`}\n className={cn('hover:underline', className)}\n {...props}\n >\n {label}\n </a>\n )\n },\n)\nPhoneLink.displayName = 'PhoneLink'\n","import * as React from 'react'\n\n// The one brand glyph the channel iconography needs: \"WhatsApp\" drawn as\n// WhatsApp, not as a generic speech bubble. currentColor on purpose — callers\n// theme it like any Lucide icon (text-muted-foreground in lists, the brand\n// green where the channel identity is the point).\nexport interface WhatsAppIconProps extends React.SVGProps<SVGSVGElement> {\n className?: string\n}\n\nexport const WHATSAPP_BRAND_COLOR = '#25D366'\n\nexport function WhatsAppIcon({ className, ...props }: WhatsAppIconProps) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n className={className}\n {...props}\n >\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.297-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z\" />\n </svg>\n )\n}\n","import * as React from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { useBackHandler } from '../layout/SaveBar'\nimport { useCrossModuleBack } from '../layout/useCrossModuleBack'\n\ninterface BreadcrumbProps {\n /** Parent label (e.g. \"Invoices\", \"Clients\") — clicking navigates back */\n parent: string\n /** Current item name (e.g. \"Invoice #123\", \"John Doe\") */\n current?: string\n /** Navigate back handler */\n onBack: () => void\n}\n\nexport function Breadcrumb({ parent, current, onBack }: BreadcrumbProps) {\n // When the user came from another module, point \"back\" at that actual\n // previous page; otherwise keep this page's own parent/onBack.\n const { onBack: effectiveOnBack, parentLabel: effectiveParent } = useCrossModuleBack(onBack, parent)\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n return (\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button\n type=\"button\"\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1 hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {effectiveParent}\n </button>\n {current !== undefined && (\n <>\n <span>/</span>\n {current ? (\n <span className=\"text-foreground font-medium truncate max-w-[200px]\">{current}</span>\n ) : (\n <span className=\"inline-block h-4 w-24 rounded bg-muted animate-pulse align-middle\" />\n )}\n </>\n )}\n </nav>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, MoreHorizontal, MoreVertical, Plus } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { useIsWide } from '../hooks/useIsWide'\nimport { Button } from './button'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger } from './dropdown'\nimport { Hint } from './hint'\n\n// ---------------------------------------------------------------------------\n// What a screen can DO, declared rather than drawn.\n//\n// The header slot was only ever a portal: it imposed no button, variant, size,\n// order or collapse rule, so every screen invented its own and the same control\n// ended up with five treatments — solid, outline, ghost, icon-sized, and three\n// raw <button>s with the primary classes copied by hand.\n//\n// A screen now says what its actions ARE and this decides how they look. It is\n// the same trade the bottom nav makes: declare intent, let one renderer own\n// presentation, and a second presentation (a phone) costs nothing extra.\n//\n// The complement is PageToolbar, and the line between them holds: this carries\n// what you DO on a screen, that carries what the screen SHOWS. A period picker\n// is not an action.\n// ---------------------------------------------------------------------------\n\nexport type PageActionIntent = 'primary' | 'secondary' | 'utility' | 'danger'\n\nexport interface PageActionItem {\n id: string\n /** Already translated. The point of the type is that nothing hardcodes here. */\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /**\n * - `primary` the one thing the screen is for. At most one; extras demote.\n * - `secondary` other ways to do it (import, from AI) — folded under primary.\n * - `utility` settings, export, refresh. Icon-only beside the primary.\n * - `danger` destructive. Never inline; always behind the overflow.\n */\n intent?: PageActionIntent\n onSelect: () => void | Promise<void>\n disabled?: boolean\n /** Set by whoever resolves permissions — this renderer has no access engine. */\n hidden?: boolean\n /** Long-form line under the label when the action opens in a menu. */\n description?: string\n /** Kept so converting a hand-written button does not silently drop its hook. */\n testId?: string\n /**\n * This action makes a NEW record. It decides the FAB's face: \"+\" on a screen\n * you add to, \"⋮\" on a record you act upon. Not derivable from the icon —\n * \"Novo produto\" carries a Package, not a plus — and not from the screen\n * either, since a settings tab has a back crumb and still adds. Defaults to\n * the icon being a plus, which covers the plainly-named cases.\n */\n creates?: boolean\n /**\n * Offered on a pointer device only. Some actions cannot be FINISHED on a\n * phone — picking a CSV off a filesystem and mapping its columns is the\n * clearest case — and a menu entry that leads nowhere is worse than one that\n * is absent. Not about screen width: about whether the job can be done.\n */\n desktopOnly?: boolean\n}\n\nfunction iconOf(action: PageActionItem, className: string) {\n const Icon = action.icon\n return Icon ? <Icon className={className} /> : null\n}\n\n/**\n * Renders a declared action set.\n *\n * One primary survives: a screen with three equal buttons is a screen with no\n * obvious next step, and on a phone it simply overflows the header. Anything\n * after the first primary is treated as secondary.\n */\nexport function PageActionBar({ actions, className }: { actions: PageActionItem[]; className?: string }) {\n const wide = useIsWide()\n const visible = actions.filter((a) => !a.hidden)\n if (visible.length === 0) return null\n\n // A phone header has room for a title and not much else, and its top-right is\n // the furthest point from a thumb. The actions move to the corner the thumb\n // owns instead — the same set, a different place to reach it.\n if (!wide) {\n const usable = visible.filter((a) => !a.desktopOnly)\n if (usable.length === 0) return null\n const fab = <PageActionFab actions={usable} />\n // The desktop actions slot lives inside the page-title band. Primary\n // destinations hide that redundant band on phones, so the fixed FAB must\n // escape its display:none ancestor and belong to the viewport directly.\n const fabHost = typeof document !== 'undefined'\n ? document.querySelector<HTMLElement>('.shell-enter') ?? document.body\n : null\n return fabHost ? createPortal(fab, fabHost) : fab\n }\n\n let seenPrimary = false\n const primary: PageActionItem[] = []\n const secondary: PageActionItem[] = []\n const utility: PageActionItem[] = []\n const danger: PageActionItem[] = []\n\n for (const a of visible) {\n const intent = a.intent ?? 'secondary'\n if (intent === 'primary' && !seenPrimary) { seenPrimary = true; primary.push(a); continue }\n if (intent === 'danger') { danger.push(a); continue }\n if (intent === 'utility') { utility.push(a); continue }\n secondary.push(a)\n }\n\n const head = primary[0]\n const menu = [...secondary, ...danger]\n\n return (\n <div className={cn('flex shrink-0 items-center gap-2', className)}>\n {/* Utilities read as chrome, so they sit before the thing you came to do. */}\n {utility.map((a) => (\n // Um botão só de ícone não diz o que faz. `title=` parecia resolver e\n // não resolve: espera ~1s que ninguém controla, sai na pintura do\n // sistema operacional, nunca aparece no toque e vários leitores de tela\n // pulam. Hint é o tooltip do design system, e o texto é ANUNCIADO.\n <Hint key={a.id} label={a.label}>\n <Button\n // `ghost`, não `outline`: um utilitário é cromo, e uma caixa em\n // volta dele pede a mesma atenção que a ação pela qual a tela\n // existe — duas molduras lado a lado e nenhuma hierarquia. Sem\n // contorno em repouso, o ícone só ganha superfície no hover, que é\n // quando alguém já está mirando nele.\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => void a.onSelect()}\n disabled={a.disabled}\n aria-label={a.label}\n data-testid={a.testId}\n data-tour={`action.${a.id}`}\n >\n {iconOf(a, 'h-4 w-4')}\n </Button>\n </Hint>\n ))}\n\n {head && menu.length === 0 && (\n <Button onClick={() => void head.onSelect()} disabled={head.disabled} data-testid={head.testId} data-tour={`action.${head.id}`}>\n {iconOf(head, 'mr-1.5 h-4 w-4')}\n {head.label}\n </Button>\n )}\n\n {/* Primary plus alternatives: one button, one caret. Two buttons of equal\n weight is the thing that made these headers unreadable. */}\n {head && menu.length > 0 && (\n <div className=\"flex items-center\">\n <Button className=\"rounded-r-none\" onClick={() => void head.onSelect()} disabled={head.disabled} data-testid={head.testId} data-tour={`action.${head.id}`}>\n {iconOf(head, 'mr-1.5 h-4 w-4')}\n {head.label}\n </Button>\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={`${head.label}…`}>\n <Button\n className=\"-ml-px rounded-l-none px-2\"\n aria-label={`${head.label}…`}\n // Anchors for the actions FOLDED behind this caret resolve to\n // the caret itself: pointing at a menu item nobody has opened\n // would spotlight an element that is not on screen.\n data-tour={menu.map((a) => `action.${a.id}`).join(' ')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n <ActionItems actions={menu} />\n </DropdownContent>\n </Dropdown>\n </div>\n )}\n\n {/* No primary, but things to offer: a plain overflow rather than promoting\n something the screen did not call primary. */}\n {!head && menu.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label=\"Ações\">\n <Button variant=\"outline\" size=\"icon\" aria-label=\"Ações\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n <ActionItems actions={menu} />\n </DropdownContent>\n </Dropdown>\n )}\n </div>\n )\n}\n\nfunction ActionItems({ actions, stagger }: { actions: PageActionItem[]; stagger?: boolean }) {\n const out: React.ReactNode[] = []\n actions.forEach((a, i) => {\n const isDanger = a.intent === 'danger'\n const prevSafe = i > 0 && actions[i - 1].intent !== 'danger'\n if (isDanger && prevSafe) out.push(<DropdownSeparator key={`${a.id}-sep`} />)\n out.push(\n <DropdownItem\n key={a.id}\n disabled={a.disabled}\n onSelect={() => void a.onSelect()}\n data-testid={a.testId}\n style={stagger ? ({ ['--i' as string]: i } as React.CSSProperties) : undefined}\n className={cn('gap-2', stagger && 'fz-fab-item', isDanger && 'text-destructive focus:text-destructive')}\n >\n {iconOf(a, 'h-4 w-4 shrink-0')}\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{a.label}</span>\n {a.description && (\n <span className=\"block truncate text-xs text-muted-foreground\">{a.description}</span>\n )}\n </span>\n </DropdownItem>,\n )\n })\n return <>{out}</>\n}\n\n/**\n * The phone presentation: one button in the thumb's corner.\n *\n * It rides on `--fz-bottom-bar`, so it sits above the tab bar where there is\n * one and drops to the screen edge on the screens where the bar retracts —\n * without knowing anything about either.\n *\n * A single action is performed by the tap. Opening a menu to offer one choice\n * is a question with one answer.\n */\nfunction PageActionFab({ actions }: { actions: PageActionItem[] }) {\n const byIntent = (i: PageActionIntent) => actions.filter((a) => (a.intent ?? 'secondary') === i)\n\n // Utilities are not the thing you came to do. Folded into the \"+\" they made\n // a create menu whose first entry was \"Configurações\"; they get their own,\n // smaller, neutral circle above it instead — near the thumb, clearly not the\n // primary. Alone on a screen they simply ARE the button.\n const utility = byIntent('utility')\n const main = [...byIntent('primary'), ...byIntent('secondary'), ...byIntent('danger')]\n\n if (main.length === 0) return <FabButton actions={utility} tone=\"neutral\" />\n\n // Its face follows what the whole set is FOR, not what its first entry looks\n // like. A screen whose every action inserts something is a screen you add on\n // — the circle is a \"+\", even when the menu offers three ways in and none of\n // their icons is a plus. One non-inserting action and it is not that screen\n // any more: a record's own actions get the neutral \"⋮\", because painting\n // those brand made every record page look like an invitation to create.\n const isCreate = main.every((a) => a.creates ?? a.icon === Plus)\n return (\n <>\n {utility.length > 0 && <FabButton actions={utility} tone=\"neutral\" mini />}\n <FabButton actions={main} tone={isCreate ? 'primary' : 'neutral'} />\n </>\n )\n}\n\n/**\n * Keeps the scrim mounted through its fade-OUT.\n *\n * Radix animates its own content out with `data-state=closed`; a plain element\n * of ours has no such state, so unmounting on close would cut the dim instantly\n * while the menu was still leaving. Mounted first, painted transparent, then\n * faded in on the next frame — a transition needs two values to run between.\n */\nexport function useScrim(open: boolean): { mounted: boolean; visible: boolean } {\n const [mounted, setMounted] = React.useState(open)\n const [visible, setVisible] = React.useState(open)\n\n React.useEffect(() => {\n if (open) {\n setMounted(true)\n const frame = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(frame)\n }\n setVisible(false)\n const timer = window.setTimeout(() => setMounted(false), SCRIM_MS)\n return () => window.clearTimeout(timer)\n }, [open])\n\n return { mounted, visible }\n}\n\n/** Matches `duration-200` on the scrim. */\nexport const SCRIM_MS = 200\n\n/** One circle: it performs a lone action, or opens the rest upward. */\nfunction FabButton({ actions, tone, mini }: {\n actions: PageActionItem[]\n tone: 'primary' | 'neutral'\n /** Stacked above the main circle, one size down. */\n mini?: boolean\n}) {\n const [open, setOpen] = React.useState(false)\n const scrim = useScrim(open)\n if (actions.length === 0) return null\n\n const isCreate = tone === 'primary'\n const FabIcon = isCreate ? Plus : MoreVertical\n // The mini sits one main circle (3.5rem) plus a gap above the main one, so\n // both move together when the tab bar retracts.\n const style = {\n bottom: mini ? 'calc(var(--fz-bottom-bar, 0px) + 4.75rem)' : 'calc(var(--fz-bottom-bar, 0px) + 1rem)',\n } as React.CSSProperties\n\n const shell = cn(\n 'fz-tap fixed z-40 flex items-center justify-center rounded-full',\n 'transition-transform active:scale-95 md:hidden',\n // Centred on the main circle's column, so the two read as one stack.\n mini ? 'right-5 h-12 w-12' : 'right-4 h-14 w-14',\n isCreate\n // The wide ring is what holds a saturated disc off the content it covers.\n ? 'bg-primary text-primary-foreground shadow-lg shadow-primary/30 ring-4 ring-background'\n // Neutral on purpose: \"⋮\" is not the thing you came to do, and painting\n // it brand made every record page look like it was inviting a create.\n //\n // A hairline, not that wide ring: white circle + 4px of page colour +\n // shadow drew a second disc behind the first, and the pair read as two\n // buttons stacked. And a hairline, not a `border` — a theme may turn any\n // bordered card surface into glass (`.bg-card.border` →\n // fayz-glass-surface), and beauty does; the circle came out see-through\n // with the board scrolling underneath it.\n : 'bg-card text-foreground shadow-lg ring-1 ring-border',\n )\n\n if (actions.length === 1) {\n const only = actions[0]\n const Icon = only.icon ?? FabIcon\n return (\n <button\n type=\"button\"\n style={style}\n className={shell}\n onClick={() => void only.onSelect()}\n disabled={only.disabled}\n aria-label={only.label}\n data-testid={only.testId}\n >\n <Icon className={mini ? 'h-5 w-5' : 'h-6 w-6'} />\n </button>\n )\n }\n\n return (\n <Dropdown open={open} onOpenChange={setOpen}>\n {/* The page dims behind the menu, the way a sheet dims behind itself: on a\n phone the menu is the only thing to answer, and the list of records\n under it kept reading as a place you could still tap. Portalled to the\n body so no ancestor's stacking context can trap it below the menu. */}\n {scrim.mounted && typeof document !== 'undefined' && createPortal(\n <div\n aria-hidden\n onClick={() => setOpen(false)}\n className={cn(\n 'fixed inset-0 z-[100] bg-foreground/40 transition-opacity duration-200 md:hidden',\n 'motion-reduce:transition-none',\n scrim.visible ? 'opacity-100' : 'opacity-0',\n )}\n />,\n document.body,\n )}\n <DropdownTrigger asChild>\n <button\n type=\"button\"\n style={style}\n // Only the \"+\" rotates into an \"×\": a vertical ellipsis spun 135°\n // reads as a glitch, not as \"tap again to close\".\n //\n // Above the scrim while open: the circle is what closes the menu, and\n // dimming the way out is the one thing the dim must not do.\n className={cn(shell, open && 'z-[105]', isCreate && 'fz-fab-trigger')}\n aria-label={actionsMenuLabel}\n >\n <FabIcon className={mini ? 'h-5 w-5' : 'h-6 w-6'} />\n </button>\n </DropdownTrigger>\n {/* Upward, from the button: a menu that opened downward would run straight\n off the bottom of the screen. */}\n <DropdownContent side=\"top\" align=\"end\" sideOffset={12} className=\"fz-fab-menu w-60 md:hidden\">\n <ActionItems actions={actions} stagger />\n </DropdownContent>\n </Dropdown>\n )\n}\n\n/** The FAB's accessible name when it opens a menu. Overridable for locale. */\nexport let actionsMenuLabel = 'Ações'\nexport function setActionsMenuLabel(label: string) { actionsMenuLabel = label }\n","import * as React from 'react'\nimport { MoreHorizontal } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger } from './dropdown'\nimport type { PageActionItem } from './page-actions'\nimport { Hint } from './hint'\n\n// ---------------------------------------------------------------------------\n// What can be done to ONE row.\n//\n// There was no such component. `BulkActionBar` only ever acts on TICKED rows,\n// so every list that wanted an edit or a delete on the row itself drew its own:\n// five visual idioms across roughly thirteen copies — Radix kebabs assembled by\n// hand, popup menus with their own outside-click listeners and inline\n// keyframes, raw <button> icon rows, ghost icon rows, and a detail-page pair.\n// Most were 32px with no accessible name.\n//\n// Same descriptor as the page header, so an action can move between the two\n// without being rewritten, and the collapse rule BulkActionBar already proved:\n// a couple inline, the rest behind a \"…\".\n// ---------------------------------------------------------------------------\n\n/** Inline icons past this go into the overflow instead. */\nconst INLINE_LIMIT = 2\n\nexport function RowActions({\n actions,\n className,\n inlineLimit = INLINE_LIMIT,\n}: {\n actions: PageActionItem[]\n className?: string\n inlineLimit?: number\n}) {\n const visible = actions.filter((a) => !a.hidden)\n if (visible.length === 0) return null\n\n // Destructive actions are never inline on a row: a delete one pixel from an\n // edit, repeated down a list, is a mis-tap waiting to happen.\n const safe = visible.filter((a) => a.intent !== 'danger')\n const danger = visible.filter((a) => a.intent === 'danger')\n\n const inline = danger.length === 0 && safe.length <= inlineLimit ? safe : safe.slice(0, 0)\n const overflow = visible.filter((a) => !inline.includes(a))\n\n // A row is a click target of its own, so nothing in here may bubble.\n const stop = (e: React.MouseEvent) => e.stopPropagation()\n\n return (\n <div className={cn('flex shrink-0 items-center justify-end gap-0.5', className)} onClick={stop}>\n {inline.map((a) => {\n const Icon = a.icon\n return (\n // Uma linha de tabela com três ícones cinza é três adivinhações.\n <Hint key={a.id} label={a.label}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"fz-tap text-muted-foreground\"\n onClick={() => void a.onSelect()}\n disabled={a.disabled}\n aria-label={a.label}\n data-testid={a.testId}\n >\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n </Button>\n </Hint>\n )\n })}\n\n {overflow.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={rowActionsLabel}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"fz-tap text-muted-foreground\"\n aria-label={rowActionsLabel}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-52\">\n {overflow.map((a, i) => {\n const Icon = a.icon\n const isDanger = a.intent === 'danger'\n const prevSafe = i > 0 && overflow[i - 1].intent !== 'danger'\n return (\n <React.Fragment key={a.id}>\n {isDanger && prevSafe && <DropdownSeparator />}\n <DropdownItem\n disabled={a.disabled}\n onSelect={() => void a.onSelect()}\n data-testid={a.testId}\n className={cn('gap-2', isDanger && 'text-destructive focus:text-destructive')}\n >\n {Icon ? <Icon className=\"h-4 w-4 shrink-0\" /> : null}\n <span className=\"truncate\">{a.label}</span>\n </DropdownItem>\n </React.Fragment>\n )\n })}\n </DropdownContent>\n </Dropdown>\n )}\n </div>\n )\n}\n\n/** Overridable so an app in another language is not stuck with this one. */\nexport let rowActionsLabel = 'Ações'\nexport function setRowActionsLabel(label: string) { rowActionsLabel = label }\n","import * as React from 'react'\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Search } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// The two controls every list card wears: the search box that sits flush inside\n// its top border, and the pager that sits flush inside its bottom one.\n//\n// Both are lifted verbatim from CrudListView, which is the shape of record —\n// bespoke lists (orders, sales) were drawing their own approximations, and the\n// paddings had already drifted. CrudListView still owns its copies because its\n// footer also carries the entity-counted i18n string; when that is generalised\n// it should collapse onto these.\n// ---------------------------------------------------------------------------\n\nexport interface SearchFieldProps {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n /** Applied to the wrapper. Borderless is the default because the card around\n * it usually draws the boundary; a caller that puts the field somewhere with\n * no card (a tab band's action slot) passes its own width and border here. */\n className?: string\n 'data-testid'?: string\n}\n\n/** Borderless on purpose: the card already draws the boundary. */\nexport function SearchField({ value, onChange, placeholder, className, ...rest }: SearchFieldProps) {\n return (\n <div className={cn('relative', className)}>\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n data-testid={rest['data-testid']}\n className=\"w-full bg-transparent py-1.5 pl-8 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none\"\n />\n </div>\n )\n}\n\nexport interface ChevronPagerProps {\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n /** What is being counted, for \"1–25 de 240 pedidos\". */\n noun?: string\n}\n\n/**\n * Contagem à esquerda, navegação à direita.\n *\n * ── por que os NÚMEROS voltaram ────────────────────────────────────────\n *\n * Eles saíram com um argumento bom: havia dois paginadores no produto e este,\n * o compacto, virou o padrão. O que saiu junto, e não devia, foi a capacidade\n * de saber ONDE se está numa lista longa e de voltar a um ponto.\n *\n * \"Se o que se procura está longe, use a busca\" vale para procurar UM registro.\n * Não vale para trabalhar uma fila: quem está a ligar para 314 leads parou na\n * página 4 ontem, e com `‹ 4 / 7 ›` o caminho de volta é clicar quatro vezes.\n *\n * A régua continua UMA — os números moram dentro dela, não numa segunda tira\n * solta abaixo da carta, que era o defeito real que aquela mudança consertou.\n *\n * ── a janela ───────────────────────────────────────────────────────────\n *\n * No máximo cinco números à volta da página atual, com saltos para a primeira\n * e a última nas pontas. Sete páginas cabem; setenta não — e uma régua que\n * quebra em duas linhas deixa de ser régua.\n */\nexport function ChevronPager({ page, pageSize, total, onPageChange, noun }: ChevronPagerProps) {\n const pages = Math.max(1, Math.ceil(total / pageSize))\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1\n const to = Math.min(page * pageSize, total)\n const button =\n 'flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-40'\n // A janela escorrega para caber: perto das pontas ela encosta, no meio ela\n // centra. Sem isto a primeira página mostraria dois números e a última, um.\n const JANELA = 5\n const inicio = Math.max(1, Math.min(page - Math.floor(JANELA / 2), pages - JANELA + 1))\n const numeros = Array.from({ length: Math.min(JANELA, pages) }, (_, i) => inicio + i)\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-t border-border px-3 py-2\">\n <p className=\"text-xs text-muted-foreground\">\n {from.toLocaleString()}–{to.toLocaleString()} de {total.toLocaleString()}{noun ? ` ${noun}` : ''}\n </p>\n {pages > 1 && (\n <div className=\"flex items-center gap-1\">\n {pages > JANELA && (\n <button type=\"button\" aria-label=\"Primeira página\" className={button}\n disabled={page <= 1} onClick={() => onPageChange(1)}>\n <ChevronsLeft className=\"h-4 w-4\" />\n </button>\n )}\n <button type=\"button\" aria-label=\"Página anterior\" className={button}\n disabled={page <= 1} onClick={() => onPageChange(page - 1)}>\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {numeros.map((n) => (\n <button\n key={n}\n type=\"button\"\n aria-label={`Página ${n}`}\n aria-current={n === page ? 'page' : undefined}\n onClick={() => onPageChange(n)}\n className={\n n === page\n ? 'flex h-7 min-w-7 items-center justify-center rounded-md bg-primary px-1.5 text-xs font-medium tabular-nums text-primary-foreground'\n : 'flex h-7 min-w-7 items-center justify-center rounded-md px-1.5 text-xs tabular-nums text-muted-foreground transition-colors hover:bg-muted hover:text-foreground'\n }\n >\n {n.toLocaleString()}\n </button>\n ))}\n <button type=\"button\" aria-label=\"Próxima página\" className={button}\n disabled={page >= pages} onClick={() => onPageChange(page + 1)}>\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n {pages > JANELA && (\n <button type=\"button\" aria-label=\"Última página\" className={button}\n disabled={page >= pages} onClick={() => onPageChange(pages)}>\n <ChevronsRight className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { MoreHorizontal } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\n\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownTrigger } from './dropdown'\n\n// ---------------------------------------------------------------------------\n// What appears the moment a row is ticked: what is selected on the left, what\n// can be done with it on the right.\n//\n// `inline` is how the lists use it — it TAKES OVER the search/filter row of the\n// card instead of stacking a second band above it. Same row, same height, so\n// nothing on the page moves as the selection comes and goes, and the delete\n// button lands next to the rows it acts on. `band` keeps the old standalone\n// look for callers with no toolbar to borrow.\n// ---------------------------------------------------------------------------\n\nexport interface BulkAction {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n onSelect: () => void | Promise<void>\n /** Red label. Reserved for what cannot be undone. */\n destructive?: boolean\n /** Moves the action into the \"…\" menu instead of the button row. */\n overflow?: boolean\n disabled?: boolean\n}\n\nexport interface BulkActionBarProps {\n /** How many rows are selected. The bar renders nothing at 0. */\n count: number\n /** Rows currently loaded — what \"select all N\" would reach. */\n total: number\n /** Selects every loaded row. Hidden when the selection already covers them. */\n onSelectAll?: () => void\n onClear: () => void\n actions?: BulkAction[]\n /** `inline` drops the bar's own frame to sit inside a toolbar row. */\n variant?: 'band' | 'inline'\n className?: string\n}\n\nexport function BulkActionBar({\n count, total, onSelectAll, onClear, actions = [], variant = 'band', className,\n}: BulkActionBarProps) {\n const t = useTranslation()\n if (count === 0) return null\n\n const inline = actions.filter((a) => !a.overflow)\n const overflow = actions.filter((a) => a.overflow)\n\n return (\n <div\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2',\n variant === 'band'\n ? 'rounded-lg border border-border bg-muted/30 px-3 py-2'\n // min-h matches the toolbar's icon buttons, so taking the row over\n // does not change its height.\n : 'w-full min-h-8',\n className,\n )}\n role=\"region\"\n aria-label={t('crud.list.bulkActions')}\n >\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span className=\"font-medium text-foreground\">\n {count === 1\n ? t('crud.list.selectedOne')\n : t('crud.list.selectedMany', { count: count.toLocaleString() })}\n </span>\n {onSelectAll && count < total && (\n <button\n type=\"button\"\n onClick={onSelectAll}\n className=\"text-muted-foreground underline-offset-2 transition-colors hover:text-foreground hover:underline\"\n >\n {t('crud.list.selectAllCount', { total: total.toLocaleString() })}\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-muted-foreground underline-offset-2 transition-colors hover:text-foreground hover:underline\"\n >\n {t('crud.list.deselectAll')}\n </button>\n </div>\n\n {(inline.length > 0 || overflow.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {inline.map((action) => (\n <Button\n key={action.id}\n variant=\"outline\"\n size=\"sm\"\n disabled={action.disabled}\n onClick={() => void action.onSelect()}\n className={action.destructive ? 'text-destructive hover:text-destructive' : undefined}\n >\n {action.icon && <action.icon className=\"mr-1.5 h-3.5 w-3.5\" />}\n {action.label}\n </Button>\n ))}\n {overflow.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" aria-label={t('crud.list.moreActions')}>\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n {overflow.map((action) => (\n <DropdownItem\n key={action.id}\n disabled={action.disabled}\n onClick={() => void action.onSelect()}\n className={action.destructive ? 'text-destructive focus:text-destructive' : undefined}\n >\n {action.icon && <action.icon className=\"mr-2 h-3.5 w-3.5 shrink-0\" />}\n {action.label}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n )}\n </div>\n )}\n </div>\n )\n}\nBulkActionBar.displayName = 'BulkActionBar'\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\n\n// ---------------------------------------------------------------------------\n// The one decision bar for a screen the person edits before saving.\n//\n// It exists because \"each edit writes immediately\" and \"one Save at the top of\n// a long list\" are both wrong for the same job: the first turns a conference\n// into dozens of separate events, the second hides the way out from whoever is\n// on row 40. So the bar STICKS to the bottom of the scroll — it is in reach\n// wherever the person stopped typing — and it renders nothing until something\n// actually changed, which is what keeps a clean screen clean.\n//\n// It floats over the content instead of sitting above the list on purpose: a\n// band that appears above rows pushes them down, and the line being read walks\n// away under the cursor.\n//\n// The labels are props, not keys: this package has no vocabulary of its own,\n// and \"Apply\", \"Publish\" and \"Post 3 corrections\" are the caller's words.\n// ---------------------------------------------------------------------------\n\nexport interface DraftCommitBarProps {\n /** Nothing renders while this is false — no reserved space, no empty frame. */\n open: boolean\n /** What is pending, in the caller's words (\"3 quantities changed\"). */\n title: string\n /** The consequence of committing, one line. Optional but usually the point. */\n hint?: string\n /** Left of the title. A quiet mark that the screen has unsaved work. */\n icon?: React.ComponentType<{ className?: string }>\n commitLabel: string\n onCommit: () => void\n discardLabel?: string\n onDiscard?: () => void\n /** Both buttons go quiet while the commit is in flight. */\n busy?: boolean\n /** Says what is missing. A blocked action that stays silent is a dead button. */\n commitDisabledReason?: string\n className?: string\n}\n\nexport function DraftCommitBar({\n open, title, hint, icon: Icon, commitLabel, onCommit,\n discardLabel, onDiscard, busy, commitDisabledReason, className,\n}: DraftCommitBarProps) {\n if (!open) return null\n\n return (\n <div\n role=\"region\"\n aria-label={title}\n className={cn(\n 'sticky bottom-3 z-10 flex flex-wrap items-center gap-3 rounded-card border bg-card px-4 py-2.5 shadow-lg',\n className,\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-primary\" />}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium\">{title}</p>\n {(commitDisabledReason || hint) && (\n <p className={cn('text-[11px]', commitDisabledReason ? 'text-warning' : 'text-muted-foreground')}>\n {commitDisabledReason || hint}\n </p>\n )}\n </div>\n {onDiscard && discardLabel && (\n <Button variant=\"outline\" size=\"sm\" onClick={onDiscard} disabled={busy}>\n {discardLabel}\n </Button>\n )}\n <Button size=\"sm\" onClick={onCommit} disabled={busy || Boolean(commitDisabledReason)}>\n <Check className=\"h-3.5 w-3.5\" /> {commitLabel}\n </Button>\n </div>\n )\n}\nDraftCommitBar.displayName = 'DraftCommitBar'\n","import * as React from 'react'\nimport { ImageIcon } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// The little square a list row wears next to a name.\n//\n// It ALWAYS occupies its square, image or not. A row that renders nothing when\n// the record has no photo pulls its name back against the checkbox while the\n// rows around it stay indented — the column stops looking like a column, and\n// the product without a photo reads as a different kind of row rather than the\n// same kind missing one thing.\n// ---------------------------------------------------------------------------\n\nexport type ThumbnailSize = 'sm' | 'md' | 'lg'\n\nconst SIZE_CLASSES: Record<ThumbnailSize, string> = {\n sm: 'h-8 w-8 rounded',\n md: 'h-9 w-9 rounded',\n lg: 'h-12 w-12 rounded-md',\n}\n\nconst ICON_CLASSES: Record<ThumbnailSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nexport interface ThumbnailProps {\n src?: string | null\n /** Decorative by default: the name sits right beside it in every list. */\n alt?: string\n size?: ThumbnailSize\n /** Placeholder glyph. Pass the entity's own icon where the list has one. */\n icon?: React.ComponentType<{ className?: string; strokeWidth?: number | string }>\n className?: string\n}\n\nexport function Thumbnail({ src, alt = '', size = 'md', icon: Icon = ImageIcon, className }: ThumbnailProps) {\n // A URL that 404s is the same situation as no URL at all, and only the browser\n // finds out — without this the row keeps a broken-image glyph forever.\n const [failed, setFailed] = React.useState(false)\n React.useEffect(() => { setFailed(false) }, [src])\n\n const base = cn('shrink-0 overflow-hidden', SIZE_CLASSES[size], className)\n\n if (!src || failed) {\n return (\n <div\n className={cn(base, 'flex items-center justify-center border border-border/60 bg-muted/50 text-muted-foreground/60')}\n aria-hidden\n >\n <Icon className={ICON_CLASSES[size]} strokeWidth={1.75} />\n </div>\n )\n }\n\n return (\n <img\n src={src}\n alt={alt}\n loading=\"lazy\"\n onError={() => setFailed(true)}\n className={cn(base, 'border border-border/60 object-cover')}\n />\n )\n}\nThumbnail.displayName = 'Thumbnail'\n","import * as React from 'react'\nimport { Check, RefreshCw } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Hint } from './hint'\n\n// ---------------------------------------------------------------------------\n// RefreshButton — the one refresh control for every cached surface.\n//\n// Three phases the merchant can read without a tooltip: amber when the rows on\n// screen came from the local cache (\"this is local data\"), spinning while the\n// network answer is on its way, and a brief check when it landed. The same\n// control everywhere is what makes the amber tint legible as a convention\n// rather than a decoration.\n// ---------------------------------------------------------------------------\n\nexport interface RefreshButtonProps {\n /** Runs the actual refresh. The button spins for as long as this pends. */\n onRefresh: () => void | Promise<void>\n /** True when the data on screen was answered from a local cache. */\n fromCache?: boolean\n /** Accessible label / native tooltip when the data is live. */\n label: string\n /** Label when `fromCache` — defaults to `label`. */\n labelCached?: string\n className?: string\n 'data-testid'?: string\n}\n\nexport function RefreshButton({ onRefresh, fromCache, label, labelCached, className, ...rest }: RefreshButtonProps) {\n const [phase, setPhase] = React.useState<'idle' | 'busy' | 'done'>('idle')\n const alive = React.useRef(true)\n React.useEffect(() => () => { alive.current = false }, [])\n\n const title = fromCache ? (labelCached ?? label) : label\n\n async function run() {\n if (phase === 'busy') return\n setPhase('busy')\n try {\n await onRefresh()\n } catch {\n // The screen owns its error surface; the button only reports motion.\n }\n if (!alive.current) return\n setPhase('done')\n setTimeout(() => { if (alive.current) setPhase((p) => (p === 'done' ? 'idle' : p)) }, 1400)\n }\n\n return (\n // Só o ícone: sem o tooltip do design system, o que este botão faz depende\n // de o usuário arriscar um clique. `title=` não conta — ver Hint.\n <Hint label={title}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={title}\n onClick={() => { void run() }}\n className={cn(\n // The state colours are the point of this control, so they stay; what\n // it was missing is the shared button underneath them.\n 'transition',\n fromCache && phase !== 'done' && 'text-amber-600 hover:text-amber-700 dark:text-amber-500 dark:hover:text-amber-400',\n phase === 'done' && 'text-emerald-600 dark:text-emerald-500',\n className,\n )}\n {...rest}\n >\n {phase === 'done'\n ? <Check className=\"h-4 w-4\" />\n : <RefreshCw className={cn('h-4 w-4', phase === 'busy' && 'animate-spin')} />}\n </Button>\n </Hint>\n )\n}\nRefreshButton.displayName = 'RefreshButton'\n","import * as React from 'react'\nimport { maskPhone, unmaskPhone, getCountry } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// PhoneField — masked on the way in, digits on the way out.\n//\n// The rule was already written down in ContactPicker (\"the mask is chrome for\n// the person typing; what gets stored stays digits-only, which is what every\n// phone lookup and the tenant-phone uniqueness index compare against\") and then\n// re-typed by hand in every other form that collects a phone — each one free to\n// forget half of it. A raw <input> stores \"(11) 98765-4321\" and the next screen\n// searching for 11987654321 finds nothing.\n//\n// The country only picks the mask. Storing a dial code is a separate decision\n// and belongs to whoever owns the record, not to a text field.\n// ---------------------------------------------------------------------------\n\nexport interface PhoneFieldProps {\n /** Digits, or anything containing them — the field masks for display. */\n value: string\n /** Always called with digits only. */\n onChange: (digits: string) => void\n /** ISO2 country whose mask is used. Defaults to BR. */\n country?: string\n placeholder?: string\n disabled?: boolean\n autoFocus?: boolean\n className?: string\n 'aria-label'?: string\n 'data-testid'?: string\n}\n\nexport function PhoneField({\n value, onChange, country, placeholder, disabled, autoFocus, className, ...rest\n}: PhoneFieldProps) {\n const mask = getCountry(country).mask\n return (\n <input\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel\"\n value={maskPhone(value, mask)}\n onChange={(event) => onChange(unmaskPhone(event.target.value))}\n placeholder={placeholder ?? mask.replace(/#/gu, '0')}\n disabled={disabled}\n autoFocus={autoFocus}\n aria-label={rest['aria-label']}\n data-testid={rest['data-testid']}\n className={cn(\n // `rounded-input`/`border-input` e não `rounded-md`/`border`: este campo\n // senta ao lado de um texto e de um seletor do DS, e era o único com\n // raio próprio — 6px contra os 12px do resto, na mesma linha da ficha.\n // O raio é do TEMA (`--input-radius`), que é quem sabe o desenho da casa.\n 'flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm outline-none focus:border-primary',\n className,\n )}\n />\n )\n}\n\n/** The same masking, for read-only places that show a stored number. */\nexport function formatPhone(value: string | null | undefined, country?: string): string {\n const digits = unmaskPhone(String(value ?? ''))\n if (!digits) return ''\n return maskPhone(digits, getCountry(country).mask) || digits\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\nimport { Card } from './card'\n\nexport interface StatTileData {\n id: string\n label: string\n /** The number/text. Omit while loading, or when `pending` says \"not yet\". */\n value?: React.ReactNode\n icon?: React.ComponentType<{ className?: string }>\n /** Renders an em dash plus this badge instead of a value — for a metric the\n * screen promises but does not compute yet (\"Em breve\"). Honest beats a\n * confident zero that the merchant would read as a real measurement. */\n pending?: string\n hint?: string\n}\n\nexport interface StatTilesProps {\n tiles: StatTileData[]\n /** Show the skeleton shape instead of values while the source is loading. */\n loading?: boolean\n className?: string\n}\n\n/**\n * The row of summary tiles that sits between a list's header and its table.\n *\n * One component rather than a hand-rolled grid per screen: every list wants the\n * same four-across-on-desktop row, and the fifth copy of that markup is where\n * the paddings start disagreeing. Feed it data; it owns the layout.\n */\nexport function StatTiles({ tiles, loading, className }: StatTilesProps) {\n if (tiles.length === 0) return null\n return (\n <div className={cn('grid gap-4 sm:grid-cols-2 lg:grid-cols-4', className)}>\n {tiles.map((tile) => {\n const Icon = tile.icon\n return (\n <Card key={tile.id} className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"min-w-0 truncate text-[13px] text-muted-foreground\" title={tile.hint ?? tile.label}>\n {tile.label}\n </p>\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n </div>\n <div className=\"mt-2 flex items-end justify-between gap-2\">\n {loading && tile.value === undefined && !tile.pending ? (\n <div className=\"h-7 w-16 animate-pulse rounded bg-muted\" />\n ) : tile.pending ? (\n <span className=\"text-2xl font-semibold text-muted-foreground/50\">—</span>\n ) : (\n <span className=\"truncate text-2xl font-semibold tabular-nums\">{tile.value}</span>\n )}\n {tile.pending && (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n {tile.pending}\n </span>\n )}\n </div>\n </Card>\n )\n })}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// TimePicker — dropdown time slot selector, Google Calendar style\n// ---------------------------------------------------------------------------\n\nfunction formatTime12(h: number, m: number) {\n const period = h >= 12 ? 'pm' : 'am'\n const h12 = h % 12 || 12\n return `${h12}:${String(m).padStart(2, '0')}${period}`\n}\n\nfunction formatTime24(h: number, m: number) {\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\ninterface TimePickerProps {\n /** Value as HH:MM (24h) */\n value: string\n onChange: (value: string) => void\n /** Interval in minutes between slots (default: 15) */\n interval?: number\n /** Min time as HH:MM (default: '00:00') */\n min?: string\n /** Max time as HH:MM (default: '23:45') */\n max?: string\n /** Use 12h format for display (default: false) */\n use12h?: boolean\n /** Read-only mode */\n readOnly?: boolean\n className?: string\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport function TimePicker({ value, onChange, interval = 15, min = '00:00', max = '23:45', use12h = false, readOnly, className, defaultOpen, onOpenChange }: TimePickerProps) {\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 })\n\n // Position the portal dropdown\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 120) })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (listRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n // Scroll to selected time when opening\n useEffect(() => {\n if (!open || !listRef.current || !value) return\n const el = listRef.current.querySelector('[data-selected=\"true\"]')\n if (el) el.scrollIntoView({ block: 'center' })\n }, [open, value])\n\n const slots = useMemo(() => {\n const [minH, minM] = min.split(':').map(Number)\n const [maxH, maxM] = max.split(':').map(Number)\n const minTotal = minH * 60 + minM\n const maxTotal = maxH * 60 + maxM\n const result: { value: string; label: string }[] = []\n\n for (let t = minTotal; t <= maxTotal; t += interval) {\n const h = Math.floor(t / 60)\n const m = t % 60\n result.push({\n value: formatTime24(h, m),\n label: use12h ? formatTime12(h, m) : formatTime24(h, m),\n })\n }\n return result\n }, [interval, min, max, use12h])\n\n const displayValue = useMemo(() => {\n if (!value) return ''\n const [h, m] = value.split(':').map(Number)\n return use12h ? formatTime12(h, m) : formatTime24(h, m)\n }, [value, use12h])\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (readOnly) return\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const idx = slots.findIndex((s) => s.value === value)\n const next = e.key === 'ArrowDown'\n ? Math.min(idx + 1, slots.length - 1)\n : Math.max(idx - 1, 0)\n if (slots[next]) onChange(slots[next].value)\n } else if (e.key === 'Enter' || e.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\"\n onClick={() => !readOnly && setOpen((p) => !p)}\n onKeyDown={handleKeyDown}\n disabled={readOnly}\n className={`flex items-center gap-2 rounded-button border px-3 py-2 text-sm w-full text-left transition-colors ${\n readOnly ? 'bg-muted/40 text-muted-foreground cursor-default' : 'bg-background hover:bg-muted/30'\n }`}>\n <Clock className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <span>{displayValue || '--:--'}</span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && !readOnly && createPortal(\n <div ref={listRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, width: pos.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface min-w-[120px] max-h-48 overflow-y-auto rounded-xl border bg-popover shadow-xl py-1\">\n {slots.map((slot) => {\n const selected = slot.value === value\n return (\n <button key={slot.value} type=\"button\" data-selected={selected}\n onClick={() => { onChange(slot.value); setOpen(false) }}\n className={`block w-full px-3 py-1.5 text-sm text-left transition-colors ${\n selected ? 'bg-primary/10 text-primary font-medium' : 'hover:bg-muted/50'\n }`}>\n {slot.label}\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\n\nimport type { BulkAction } from './bulk-action-bar'\n\n// ---------------------------------------------------------------------------\n// The selection half of a list: which rows are ticked, and what the bar on top\n// of them can do. DataTable draws the checkbox column and BulkActionBar draws\n// the bar; this is the state between them, so a list that is not a CRUD page\n// (ListView, plugin lists) gets the same behaviour without copying it.\n// ---------------------------------------------------------------------------\n\n/**\n * One entry in the bar that appears when rows are ticked. It receives the\n * selected ROWS, not their ids: an action that has to go back to the store to\n * learn what it is acting on is an action that can act on stale data.\n */\nexport interface RowBulkAction<T> {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n onSelect: (rows: T[]) => void | Promise<void>\n /** Red label. Reserved for what cannot be undone. */\n destructive?: boolean\n /** Moves the action into the \"…\" menu instead of the button row. */\n overflow?: boolean\n disabled?: boolean\n}\n\nexport interface UseRowSelectionOptions<T> {\n /** The rows currently on screen — what a selection may reach. */\n rows: T[] | null | undefined\n actions?: RowBulkAction<T>[]\n /** Row identity. Defaults to `row.id`. */\n getRowId?: (row: T) => string\n /** Turns checkboxes off even with actions declared (e.g. a card grid, which\n * has no row to hang one off). */\n enabled?: boolean\n}\n\nexport interface RowSelection<T> {\n selectedIds: string[]\n selectedRows: T[]\n setSelectedIds: (ids: string[]) => void\n clear: () => void\n /** Ticks every row on screen. */\n selectAll: () => void\n /** Actions bound to the current selection, ready for BulkActionBar. */\n barActions: BulkAction[]\n /** Whether to draw the checkbox column at all. */\n selectable: boolean\n /** Selection is on AND something is ticked — the bar is showing. */\n hasSelection: boolean\n /** Resolved row identity, to hand back to DataTable. */\n getRowId: (row: T) => string\n /** How many rows \"select all\" would reach. */\n total: number\n}\n\nexport function useRowSelection<T>({\n rows,\n actions,\n getRowId,\n enabled = true,\n}: UseRowSelectionOptions<T>): RowSelection<T> {\n const identify = React.useCallback(\n (row: T) => (getRowId ? getRowId(row) : String((row as { id?: unknown } | null)?.id ?? '')),\n [getRowId],\n )\n const visible = React.useMemo(() => rows ?? [], [rows])\n\n const [rawSelection, setRawSelection] = React.useState<string[]>([])\n // Kept as ids and PRUNED to what is on screen on every render. A selection is\n // a promise about records the user can see; after a filter, a page turn or a\n // refetch that dropped a row, an id still sitting in state would make the bar\n // count records nobody is looking at — and a bulk action reach them.\n const visibleIds = React.useMemo(() => new Set(visible.map(identify)), [visible, identify])\n const selectedIds = React.useMemo(\n () => rawSelection.filter((id) => visibleIds.has(id)),\n [rawSelection, visibleIds],\n )\n const selectedRows = React.useMemo(() => {\n const picked = new Set(selectedIds)\n return visible.filter((row) => picked.has(identify(row)))\n }, [visible, selectedIds, identify])\n\n const clear = React.useCallback(() => setRawSelection([]), [])\n const selectAll = React.useCallback(\n () => setRawSelection(visible.map(identify)),\n [visible, identify],\n )\n\n const barActions = React.useMemo<BulkAction[]>(\n () =>\n (actions ?? []).map((action) => ({\n id: action.id,\n label: action.label,\n icon: action.icon,\n destructive: action.destructive,\n overflow: action.overflow,\n disabled: action.disabled,\n onSelect: () => action.onSelect(selectedRows),\n })),\n [actions, selectedRows],\n )\n\n const selectable = enabled && barActions.length > 0\n return {\n selectedIds,\n selectedRows,\n setSelectedIds: setRawSelection,\n clear,\n selectAll,\n barActions,\n selectable,\n hasSelection: selectable && selectedIds.length > 0,\n getRowId: identify,\n total: visible.length,\n }\n}\n","import * as React from 'react'\nimport { Check, ChevronDown, Search, Settings } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\n\nexport interface ChoiceOption {\n value: string\n label: string\n /** Status/stage colour dot, same language as DotChip. */\n dot?: string\n}\n\n/** The fixed last row that leaves the list for the records' own screen. */\nexport interface ChoiceManageAction {\n label: string\n onSelect: () => void\n}\n\n/** Above this many options the list gets a search field. */\nexport const CHOICE_SEARCH_THRESHOLD = 8\n\nexport function choiceSearchable(count: number, searchable?: boolean): boolean {\n return searchable ?? count > CHOICE_SEARCH_THRESHOLD\n}\n\nexport function ManageRow({ action, onDone, className }: {\n action: ChoiceManageAction\n onDone?: () => void\n className?: string\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => { onDone?.(); action.onSelect() }}\n className={cn(\n 'flex w-full shrink-0 items-center gap-2 border-t px-3 py-2 text-left text-xs text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground',\n className,\n )}\n >\n <Settings className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />\n {action.label}\n </button>\n )\n}\n\nexport interface ChoiceListProps {\n options: ChoiceOption[]\n /** `undefined` = the \"all\" row is the current one. */\n value?: string\n onSelect: (value: string | undefined) => void\n /** First row, meaning \"no filter\". Omit for lists without one. */\n allLabel?: string\n /** Defaults to on when there are more than CHOICE_SEARCH_THRESHOLD options. */\n searchable?: boolean\n searchPlaceholder?: string\n emptyLabel?: string\n manage?: ChoiceManageAction\n /** Called after any pick, including the manage row (closes the host popover). */\n onDone?: () => void\n className?: string\n}\n\n/**\n * Single-choice list with search, a capped scroll area and an optional fixed\n * \"Gerenciar …\" row. One body for every picker-shaped dropdown, so a list of\n * forty units reads like a list of four.\n */\nexport function ChoiceList({\n options, value, onSelect, allLabel, searchable, searchPlaceholder = 'Buscar…',\n emptyLabel = 'Nada encontrado', manage, onDone, className,\n}: ChoiceListProps) {\n const [query, setQuery] = React.useState('')\n const withSearch = choiceSearchable(options.length, searchable)\n const q = query.trim().toLowerCase()\n const shown = q ? options.filter((o) => o.label.toLowerCase().includes(q)) : options\n const pick = (v: string | undefined) => { onSelect(v); onDone?.() }\n\n return (\n <div className={cn('flex max-h-[min(24rem,70vh)] min-w-[14rem] flex-col', className)}>\n {withSearch && (\n <div className=\"relative shrink-0 border-b p-1.5\">\n <Search className=\"pointer-events-none absolute left-3.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <input\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter' && shown[0]) { e.preventDefault(); pick(shown[0].value) } }}\n placeholder={searchPlaceholder}\n className=\"h-8 w-full rounded-md bg-muted/40 pl-7 pr-2 text-xs outline-none\"\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto p-1\">\n {allLabel && !q && (\n <Row active={value == null || value === ''} onClick={() => pick(undefined)}>\n <span className=\"min-w-0 truncate text-muted-foreground\">{allLabel}</span>\n </Row>\n )}\n {shown.map((o) => (\n <Row key={o.value} active={o.value === value} onClick={() => pick(o.value)}>\n {o.dot && <span aria-hidden className=\"h-2 w-2 shrink-0 rounded-full\" style={{ background: o.dot }} />}\n <span className=\"min-w-0 truncate\">{o.label}</span>\n </Row>\n ))}\n {shown.length === 0 && <p className=\"px-2 py-3 text-center text-xs text-muted-foreground\">{emptyLabel}</p>}\n </div>\n {manage && <ManageRow action={manage} onDone={onDone} />}\n </div>\n )\n}\n\nfunction Row({ active, onClick, children }: { active?: boolean; onClick: () => void; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs transition-colors hover:bg-muted\"\n >\n {children}\n {active && <Check className=\"ml-auto h-3 w-3 shrink-0 text-muted-foreground\" />}\n </button>\n )\n}\n\nexport interface ChoiceSelectProps extends Omit<ChoiceListProps, 'onSelect' | 'onDone' | 'className'> {\n onChange: (value: string | undefined) => void\n /** Trigger text when nothing is chosen and there is no `allLabel`. */\n placeholder?: string\n icon?: React.ComponentType<{ className?: string }>\n disabled?: boolean\n 'aria-label'?: string\n className?: string\n}\n\n/** Form-field trigger over a ChoiceList — the picker a form shows in place of a native <select>. */\nexport function ChoiceSelect({\n options, value, onChange, allLabel, placeholder = 'Selecionar…', icon: Icon, disabled,\n className, 'aria-label': ariaLabel, ...list\n}: ChoiceSelectProps) {\n const [open, setOpen] = React.useState(false)\n const current = options.find((o) => o.value === value)\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n className={cn(\n 'flex h-9 w-full items-center gap-2 rounded-input border border-input bg-card px-3 text-left text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] transition-colors hover:bg-muted/30 disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />}\n <span className={cn('min-w-0 flex-1 truncate', !current && !allLabel && 'text-muted-foreground')}>\n {current?.label ?? allLabel ?? placeholder}\n </span>\n <ChevronDown className={cn('h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform', open && 'rotate-180')} />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-[var(--radix-popover-trigger-width)] min-w-[14rem] overflow-hidden\">\n <ChoiceList {...list} options={options} value={value} onSelect={onChange} allLabel={allLabel} onDone={() => setOpen(false)} />\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport { ChoiceList, type ChoiceManageAction } from './choice-list'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// FilterChip — um filtro de lista em UMA pastilha, não em uma fileira delas.\n//\n// [ Todos os status ⌄ ] → clica, escolhe outra\n//\n// Antes cada filtro ocupava uma linha inteira com todas as opções abertas\n// (Todos · Ativo · VIP · Inativo · Restrito). Duas dessas e a tabela começava\n// 100px mais abaixo, para mostrar o tempo todo cinco opções das quais quatro\n// não interessam depois que a escolha foi feita. A pastilha diz o que está\n// valendo agora e guarda o resto atrás de um clique.\n//\n// Ela fica ao lado da busca de propósito: filtrar e buscar reduzem a MESMA\n// lista, então são a mesma barra de ferramentas.\n//\n// O estado escolhido é sutil, não gritante: quem já escolheu sabe o que\n// escolheu — o destaque serve para lembrar que a lista está filtrada quando se\n// volta para ela depois, e para isso basta cor, sem peso.\n// ---------------------------------------------------------------------------\n\nexport interface FilterChipOption {\n value: string\n label: string\n /** Cor da bolinha à esquerda (status, etapa) — a mesma linguagem do DotChip\n * dos cards: uma cor por estado, em toda superfície. */\n dot?: string\n}\n\nexport interface FilterChipProps {\n /** Texto quando nada está filtrado (\"Todos os status\"). */\n allLabel: string\n options: FilterChipOption[]\n /** Valor atual. `undefined` = sem filtro. */\n value?: string\n onChange: (value: string | undefined) => void\n /** Nome acessível do filtro (\"Status\"). */\n label?: string\n /**\n * Ícone à esquerda. Um filtro cujo VALOR não denuncia de que ele é — \"Todo o\n * período\" ao lado de \"Todas as contas\" — ganha o calendário para se\n * identificar sem gastar a palavra \"Período\" na pastilha.\n */\n icon?: React.ComponentType<{ className?: string }>\n /** Defaults to on above CHOICE_SEARCH_THRESHOLD options. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Fixed last row to the records' own screen — pass only to who may edit them. */\n manage?: ChoiceManageAction\n className?: string\n}\n\nexport function FilterChip({ allLabel, options, value, onChange, label, icon: Icon, searchable, searchPlaceholder, manage, className }: FilterChipProps) {\n const [open, setOpen] = React.useState(false)\n const active = value != null && value !== ''\n const current = options.find((o) => o.value === value)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors',\n active\n ? 'border-primary/30 bg-primary/10 text-primary hover:bg-primary/15'\n : 'border-transparent bg-muted/70 text-muted-foreground hover:bg-muted hover:text-foreground',\n className,\n )}\n >\n {current?.dot\n ? <span className=\"h-2 w-2 shrink-0 rounded-full\" style={{ backgroundColor: current.dot }} />\n : Icon && <Icon className=\"h-3 w-3 shrink-0 opacity-70\" />}\n <span className=\"max-w-[12rem] truncate\">{current?.label ?? allLabel}</span>\n <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-auto max-w-[min(22rem,calc(100vw-2rem))] overflow-hidden\">\n {/* \"Todos\" is the first option, not a separate X that only shows when there is something to clear. */}\n <ChoiceList\n options={options}\n value={value}\n onSelect={onChange}\n allLabel={allLabel}\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n manage={manage}\n onDone={() => setOpen(false)}\n />\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { FilterChip, type FilterChipOption } from './filter-chip'\nimport { FilterMenu, FilterMenuRow, type FilterMenuField } from './filter-menu'\nimport { ManageRow, choiceSearchable, type ChoiceManageAction } from './choice-list'\nimport { useIsWide } from '../hooks/useIsWide'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// ListFilterBar — UM desenho de filtro para todas as listas do produto.\n//\n// …busca… [Etapa: Proposta ⌄] [Período: 30 dias ⌄] (⚟) Limpar\n//\n// É o padrão que o funil (/sales/pipeline) já usava à mão e que todas as\n// outras listas reinventavam: o que ESTÁ valendo aparece como pastilha, o\n// resto mora atrás de UM botão redondo com o ícone de filtro, encostado à\n// direita da mesma linha da busca.\n//\n// O QUE ISTO SUBSTITUI: um painel flutuante com ícone de controles deslizantes\n// que despejava todos os campos empilhados, e, no CRUD genérico, uma fileira\n// de pastilhas sempre abertas — uma por filtro, valendo ou não. Eram três\n// gramáticas para a mesma pergunta (\"como recorto esta lista?\"), e qual delas\n// a pessoa via dependia de qual tela o componente por baixo era.\n//\n// DECLARATIVO, não uma sopa de nós: a tela diz QUAIS são os filtros e a barra\n// decide onde cada um aparece — pastilha quando ativo, linha do menu sempre.\n// Quem tem um campo que não cabe nesta forma (multi-seleção com busca, gente\n// com retrato) entrega `extraFields`/`extraChips` e continua dentro da mesma\n// moldura, em vez de desenhar uma barra própria ao lado desta.\n// ---------------------------------------------------------------------------\n\nexport interface ListFilterDef {\n id: string\n /** Nome do filtro (\"Etapa\", \"Período\"). */\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Texto do \"sem filtro\" (\"Todas as etapas\"). */\n allLabel: string\n options: FilterChipOption[]\n /** `undefined` = sem filtro. */\n value?: string\n onChange: (value: string | undefined) => void\n /** Search in the dropdown; defaults to on above CHOICE_SEARCH_THRESHOLD options. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Fixed last row to the records' own screen — pass only to who may edit them. */\n manage?: ChoiceManageAction\n}\n\nexport interface ListFilterBarProps {\n filters?: ListFilterDef[]\n /** Campos que não cabem na forma declarativa, passados direto ao menu. */\n extraFields?: FilterMenuField[]\n /** Pastilhas próprias da tela (multi-seleção, etiquetas), ao lado das daqui. */\n extraChips?: React.ReactNode\n /** Conteúdo fixo no topo do menu — a escapatória para um painel inteiro. */\n menuHeader?: React.ReactNode\n /** Rótulo do gatilho. */\n label?: string\n clearLabel?: string\n onClear?: () => void\n /** Total de filtros ativos quando a tela conta melhor que a barra (porque\n * tem `extraChips`). Omitido, a barra conta os `filters` que têm valor. */\n activeCount?: number\n className?: string\n}\n\nexport function ListFilterBar({\n filters,\n extraFields,\n extraChips,\n menuHeader,\n label = 'Filtros',\n clearLabel = 'Limpar filtros',\n onClear,\n activeCount,\n className,\n}: ListFilterBarProps) {\n const wide = useIsWide()\n\n // Um filtro sem opções não filtra nada: desenhá-lo dá uma linha que abre um\n // flyout vazio.\n const usable = React.useMemo(() => (filters ?? []).filter((f) => f.options.length > 0), [filters])\n const active = usable.filter((f) => f.value != null && f.value !== '')\n const total = activeCount ?? active.length\n\n const fields: FilterMenuField[] = React.useMemo(() => [\n ...usable.map((f) => ({\n id: f.id,\n label: f.label,\n icon: f.icon,\n activeCount: f.value ? 1 : 0,\n searchable: choiceSearchable(f.options.length, f.searchable),\n searchPlaceholder: f.searchPlaceholder,\n footer: f.manage ? (close: () => void) => <ManageRow action={f.manage!} onDone={close} /> : undefined,\n render: (close: () => void, query: string) => {\n const q = query.trim().toLowerCase()\n const shown = q ? f.options.filter((o) => o.label.toLowerCase().includes(q)) : f.options\n return (\n <>\n {/* \"Todos\" é a PRIMEIRA linha e não um botão de limpar no rodapé:\n desfazer um filtro é escolher outro valor, não uma operação\n diferente. */}\n <FilterMenuRow active={!f.value} onClick={() => { f.onChange(undefined); close() }}>\n <span className=\"min-w-0 truncate text-muted-foreground\">{f.allLabel}</span>\n </FilterMenuRow>\n {shown.map((o) => (\n <FilterMenuRow key={o.value} active={o.value === f.value} onClick={() => { f.onChange(o.value); close() }}>\n {o.dot && <span aria-hidden className=\"h-2 w-2 shrink-0 rounded-full\" style={{ background: o.dot }} />}\n <span className=\"min-w-0 truncate\">{o.label}</span>\n </FilterMenuRow>\n ))}\n </>\n )\n },\n })),\n ...(extraFields ?? []),\n ], [usable, extraFields])\n\n if (!fields.length && !extraChips) return null\n\n return (\n <div className={cn('flex min-w-0 flex-nowrap items-center justify-end gap-1.5 md:flex-wrap', className)}>\n {/* As pastilhas só no desktop. Num telefone a linha da busca já é\n estreita, e três pastilhas ali espremiam a busca até \"Busc\" — o\n gatilho com a bolinha continua dizendo que a lista está filtrada, e\n o menu continua sendo onde se troca. */}\n {wide && active.map((f) => (\n <FilterChip\n key={f.id}\n label={f.label}\n icon={f.icon}\n allLabel={f.allLabel}\n options={f.options}\n value={f.value}\n onChange={f.onChange}\n searchable={f.searchable}\n searchPlaceholder={f.searchPlaceholder}\n manage={f.manage}\n />\n ))}\n {wide && extraChips}\n {fields.length > 0 && (\n <FilterMenu\n fields={fields}\n label={label}\n activeCount={total}\n onClear={onClear}\n clearLabel={clearLabel}\n header={menuHeader}\n />\n )}\n {/* O \"Limpar\" fora do menu, no fim da fila: com pastilhas à vista, zerar\n tudo é um gesto sobre o que se está VENDO, e escondê-lo dentro do\n menu obrigava a abrir o menu para desfazer o que está na barra. */}\n {onClear && total > 0 && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-full px-2 py-1 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3 shrink-0\" />\n {clearLabel}\n </button>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Search, Plus, ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Download, RefreshCw } from 'lucide-react'\nimport { DataTable } from './data-table'\nimport { BulkActionBar } from './bulk-action-bar'\nimport { useRowSelection, type RowBulkAction } from './use-row-selection'\nimport { Button } from './button'\nimport { PageActionBar, type PageActionItem } from './page-actions'\nimport { Card } from './card'\nimport { ListFilterBar, type ListFilterDef } from './list-filter-bar'\nimport { PageHeaderActions } from '../layout/ModulePage'\nimport { cn } from '../lib/cn'\nimport { Hint } from './hint'\n\n/** The table toolbar's quiet icon button — the shared Button, plus `fz-tap` so\n * a finger gets 44px while the pointer size stays. This and CrudListView each\n * carried their own copy of the same hand-written class, 32px and outside the\n * primitive, which is how a fourth icon-button look appeared. */\nconst ICON_BTN = 'fz-tap text-muted-foreground'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TagFilter {\n value: string\n label: string\n}\n\n\n/** As páginas a desenhar: sempre a primeira, sempre a última, a atual e as\n * vizinhas — reticências no que for pulado.\n *\n * Com sete páginas cabem todas; com cem, `1 … 48 49 50 … 100` continua dizendo\n * onde se está e permitindo chegar às pontas num clique. O controle anterior\n * (\"‹ 3/7 ›\") obrigava a clicar seis vezes para ver a última e não dizia que\n * ela existia.\n *\n * `-1` é a reticência. Dois seguidos nunca acontecem porque o salto mínimo\n * entre blocos é de duas páginas.\n */\nfunction pageNumbers(page: number, totalPages: number): number[] {\n const fixas = new Set<number>([1, totalPages, page - 1, page, page + 1])\n const visiveis = [...fixas].filter((n) => n >= 1 && n <= totalPages).sort((a, b) => a - b)\n\n const saida: number[] = []\n for (const n of visiveis) {\n const anterior = saida[saida.length - 1]\n // Um buraco de UMA página não vira reticência: \"1 … 3\" gasta o mesmo\n // espaço que \"1 2 3\" e esconde uma página que cabia.\n if (anterior !== undefined && n - anterior === 2) saida.push(anterior + 1)\n else if (anterior !== undefined && n - anterior > 2) saida.push(-1)\n saida.push(n)\n }\n return saida\n}\n\n\nexport interface ListViewProps<TData> {\n /** TanStack column definitions */\n columns: ColumnDef<TData, any>[]\n /** Data rows */\n data: TData[]\n /** Loading state — shows skeleton */\n loading?: boolean\n\n // ── Search ──\n /** Placeholder for search input (default: \"Search...\") */\n searchPlaceholder?: string\n /** Rótulo acessível do gatilho que recolhe os filtros no celular. */\n filtersLabel?: string\n /** Controlled search value */\n search?: string\n /** Called on search change (debounced internally if onSearchDebounced is used) */\n onSearchChange?: (value: string) => void\n /** Debounce delay in ms (default: 300). Set 0 for no debounce. */\n searchDebounce?: number\n /** A busca toma a primeira linha inteira, e os filtros descem para a\n * seguinte.\n *\n * Uma barra com dois filtros cabe numa linha e ler a busca ao lado deles é\n * melhor do que gastar uma linha a mais antes da tabela. Com seis, não\n * cabe: as pastilhas não encolhem (cada uma tem o seu rótulo) e quem\n * absorve o aperto é a busca — que aparecia com \"Busc\" e mais nada.\n *\n * Uma prop e não uma medição: quem monta a lista SABE quantos filtros\n * passou, e um ResizeObserver para descobrir o que o autor já sabe é\n * maquinaria a mais. */\n searchOwnRow?: boolean\n\n // ── Tag filters ──\n /** Available filter tags (e.g. status values, types) */\n tags?: TagFilter[]\n /** \"All\" label (default: \"All\") */\n allTagLabel?: string\n /** Nome acessível do filtro de status (\"Status\"), para a pastilha. */\n tagsLabel?: string\n /** Currently active tag value (undefined = all) */\n activeTag?: string\n /** Called when a tag is selected (undefined = all) */\n onTagChange?: (value: string | undefined) => void\n\n // ── CTA button ──\n /** Label for the \"New\" button (e.g. \"New Product\") */\n newLabel?: string\n /** Called when the \"New\" button is clicked */\n onNew?: () => void\n\n // ── Row interaction ──\n /** Called when a row is clicked */\n onRowClick?: (row: TData) => void\n\n // ── Selection ──\n /** What can be done to ticked rows. Declaring one turns on the checkbox\n * column and the bar; each action receives the selected rows. */\n bulkActions?: RowBulkAction<TData>[]\n /** Row identity for selection. Defaults to `row.id`. */\n getRowId?: (row: TData) => string\n\n // ── Empty state ──\n /** Icon component for the empty state */\n emptyIcon?: React.ComponentType<{ className?: string }>\n /** Empty state message */\n emptyMessage?: string\n /** Empty state action label (e.g. \"Create your first product\") */\n emptyActionLabel?: string\n /** Called when the empty action is clicked */\n onEmptyAction?: () => void\n\n // ── Pagination ──\n /** Total item count (enables pagination when > pageSize) */\n total?: number\n /** Current page (1-indexed) */\n page?: number\n /** Page size (default: 25) */\n pageSize?: number\n /** Called when page changes */\n onPageChange?: (page: number) => void\n // Os rótulos entram por prop porque este primitivo não fala com o dicionário:\n // \"1–50 of 316\" apareceu embaixo de uma tabela num app inteiro em português,\n // e um \"of\" solto é a única palavra da tela que denuncia de onde o componente\n // veio. Os defaults ficam em inglês para não quebrar quem já usa.\n /** A palavra entre o intervalo e o total: \"1–50 <of> 316\". */\n rangeOfLabel?: string\n /** Volta a ser usado: o salto para a primeira página aparece quando há mais\n * páginas do que a janela de números mostra. */\n firstPageLabel?: string\n prevPageLabel?: string\n nextPageLabel?: string\n /** Ver `firstPageLabel`. */\n lastPageLabel?: string\n /** Prefixo do rótulo acessível de cada número: \"Página 3\". */\n pageLabel?: string\n\n // ── Extra ──\n /** Additional content rendered between filters and table */\n toolbar?: React.ReactNode\n /** Os filtros da lista, DECLARADOS. É o caminho preferido: a barra decide\n * onde cada um aparece (pastilha quando ativo, linha do menu sempre) e\n * todas as listas do produto ficam com o mesmo desenho — ver ListFilterBar. */\n filterDefs?: ListFilterDef[]\n /** Pastilhas próprias da tela (multi-seleção, etiquetas) ao lado das de\n * `filterDefs`. Preferir `filterDefs` quando o filtro for um valor só:\n * um nó cru aqui é onde cada lista voltava a inventar a própria barra. */\n filters?: React.ReactNode\n /** Um painel inteiro, quando a tela tem um que não se decompõe em campos.\n * Entra no TOPO do mesmo menu, não numa segunda superfície ao lado. */\n advancedFilters?: React.ReactNode\n /** O gatilho de filtros da tela (FilterMenu) — entra na fila da direita, ao\n * lado de atualizar/exportar. Quem passa isto normalmente não passa\n * `advancedFilters`: o menu É o painel. */\n filtersTrigger?: React.ReactNode\n /** Quantos filtros estão ativos AGORA, contando TUDO — pastilhas incluídas.\n * É o que faz o \"Limpar\" existir, e a conta do \"Filtros\" no telefone, onde\n * o painel guarda todos eles. */\n activeFilterCount?: number\n /** Zera todos os filtros de uma vez. Só aparece com algo a zerar, e no FIM\n * da fila — no meio dela ele separava dois filtros que se leem juntos. */\n onClearFilters?: () => void\n /** Rótulo do \"Limpar\" (este pacote não tem i18n). */\n clearFiltersLabel?: string\n /** Extra controls in the header row, before the New button. */\n headerActions?: React.ReactNode\n /** Declared actions. Preferred over `headerActions`, which is a raw node and\n * therefore a place for each list to invent its own button again. */\n actions?: PageActionItem[]\n /** Download the rows in front of you. Renders the toolbar's export button. */\n onExport?: () => void\n /** Accessible label for the export button (this package has no i18n). */\n exportLabel?: string\n /** Refetch the list. Renders the toolbar's refresh button. */\n onRefresh?: () => void\n /** Accessible label for the refresh button. */\n refreshLabel?: string\n /** CSS class for the outer wrapper */\n className?: string\n /** Classe por linha — ver DataTable.rowClassName. */\n rowClassName?: (row: TData) => string | undefined\n}\n\n// ---------------------------------------------------------------------------\n// Component\n\n// ---------------------------------------------------------------------------\n\nconst PAGER_BTN =\n 'flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors ' +\n 'hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-40'\n\nexport function ListView<TData>({\n columns,\n data,\n loading = false,\n searchPlaceholder = 'Search...',\n filtersLabel = 'Filtros',\n advancedFilters,\n filtersTrigger,\n activeFilterCount = 0,\n onClearFilters,\n clearFiltersLabel = 'Clear',\n search: controlledSearch,\n onSearchChange,\n searchDebounce = 300,\n searchOwnRow,\n tags,\n allTagLabel = 'All',\n tagsLabel,\n activeTag,\n onTagChange,\n newLabel,\n onNew,\n onRowClick,\n bulkActions,\n getRowId,\n emptyIcon: EmptyIcon,\n emptyMessage = 'No results found.',\n emptyActionLabel,\n onEmptyAction,\n total,\n page = 1,\n pageSize = 25,\n rangeOfLabel = 'of',\n firstPageLabel = 'First page',\n prevPageLabel = 'Previous page',\n nextPageLabel = 'Next page',\n lastPageLabel = 'Last page',\n pageLabel = 'Page',\n onPageChange,\n toolbar,\n filters,\n filterDefs,\n headerActions,\n onExport,\n exportLabel = 'Export',\n onRefresh,\n refreshLabel = 'Refresh',\n className,\n rowClassName,\n actions,}: ListViewProps<TData>) {\n // Internal search state for debouncing\n const [internalSearch, setInternalSearch] = useState(controlledSearch ?? '')\n const debounceRef = useRef<ReturnType<typeof setTimeout>>()\n\n // Sync controlled → internal\n useEffect(() => {\n if (controlledSearch !== undefined) setInternalSearch(controlledSearch)\n }, [controlledSearch])\n\n const handleSearchChange = useCallback((value: string) => {\n setInternalSearch(value)\n if (searchDebounce === 0) {\n onSearchChange?.(value)\n } else {\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => onSearchChange?.(value), searchDebounce)\n }\n }, [onSearchChange, searchDebounce])\n\n // Pagination\n const totalItems = total ?? data.length\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize))\n // A JANELA DE PÁGINAS.\n //\n // Os números tinham saído com o argumento de que \"uma lista não se lê\n // pulando para a página 7\". Quem decide isso é quem usa: trabalhar uma\n // fila de 314 leads é parar na página 4 e voltar lá amanhã, e sem número\n // o caminho de volta são quatro cliques às cegas.\n //\n // Ficam DENTRO do mesmo rodapé — o defeito que aquela mudança consertou\n // era haver duas réguas, e esse continua consertado.\n //\n // Uma janela DESLIZANTE de cinco números dizia \"1 2 3 4 5\" numa lista de\n // sete páginas — e quem lê conclui que são cinco. O número que falta é\n // justamente o que responde \"quanto falta\", e escondê-lo é pior do que\n // mostrar menos números.\n const pageWindow = pageNumbers(page, totalPages)\n const showPagination = onPageChange && totalItems > pageSize\n\n const showSearch = !!onSearchChange\n const showTags = tags && tags.length > 0 && onTagChange\n\n // Same selection as the CRUD lists — same hook, so the checkbox column, the\n // bar and the pruning rules cannot drift between a generated list and a\n // plugin's own.\n const selection = useRowSelection<TData>({ rows: loading ? [] : data, actions: bulkActions, getRowId })\n\n // Status é FILTRO, e filtro mora na mesma barra que todos os outros — não\n // numa faixa de abas por cima, que é a gramática de trocar de TELA. Ele entra\n // na fila declarada como qualquer um: pastilha quando vale, linha do menu\n // sempre.\n const allFilters: ListFilterDef[] = React.useMemo(() => [\n ...(showTags ? [{\n id: '__tag',\n label: tagsLabel ?? allTagLabel,\n allLabel: allTagLabel,\n options: tags!.map((tg) => ({ value: tg.value, label: tg.label })),\n value: activeTag,\n onChange: (next: string | undefined) => onTagChange!(next),\n }] : []),\n ...(filterDefs ?? []),\n ], [showTags, tags, tagsLabel, allTagLabel, activeTag, onTagChange, filterDefs])\n\n // O vazio é a primeira tela que alguém vê numa lista nova. O mesmo desenho do\n // CRUD: ícone da entidade, uma frase em destaque dizendo o que falta e o botão\n // que resolve — dentro do card da tabela, não numa caixa tracejada à parte.\n const emptyState = (\n <div className=\"flex flex-col items-center gap-1 py-6\">\n {EmptyIcon && <EmptyIcon className=\"mb-2 h-9 w-9 text-muted-foreground/40\" />}\n <p className=\"text-base font-semibold text-foreground\">{emptyMessage}</p>\n {emptyActionLabel && onEmptyAction && (\n <Button variant=\"default\" className=\"mt-3\" onClick={onEmptyAction}>\n <Plus className=\"h-3.5 w-3.5\" />\n {emptyActionLabel}\n </Button>\n )}\n </div>\n )\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* ── Ações na barra da shell; os status na faixa de abas da página ──\n As duas coisas moravam numa linha própria aqui dentro: o \"Novo\" ficava\n a meia altura entre o nome da tela e a tabela, e cada lista escolhia a\n altura dessa linha por conta. É o mesmo movimento que CrudListView fez\n — uma lista de plugin e um CRUD gerado agora se coroam igual. */}\n {(headerActions || actions?.length || (onNew && newLabel)) && (\n <PageHeaderActions>\n <div className=\"flex items-center gap-2\">\n {headerActions}\n <PageActionBar\n actions={[\n ...(actions ?? []),\n ...(onNew && newLabel\n ? [{ id: 'new', label: newLabel, icon: Plus, intent: 'primary' as const, onSelect: onNew }]\n : []),\n ]}\n />\n </div>\n </PageHeaderActions>\n )}\n {/* ── Extra toolbar ── */}\n {toolbar}\n\n {/* Busca, filtros e tabela são UMA superfície, como em CrudListView: eles\n agem sobre as mesmas linhas, e uma busca flutuando sobre o fundo da\n página acima de um card separado lia como dois controles sem relação. */}\n {/* `clip`, not `hidden`: a scroll container here would hold the table's sticky header. */}\n <Card style={{ overflow: 'clip' }}>\n {(showSearch || allFilters.length > 0 || filters || onRefresh || onExport || selection.hasSelection) && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2\">\n {/* Uma seleção ativa TOMA a linha da busca em vez de abrir uma faixa\n acima dela: a ação fica na mesma linha das linhas sobre as quais\n age, e nada na página se desloca. */}\n {selection.hasSelection ? (\n <BulkActionBar\n variant=\"inline\"\n count={selection.selectedIds.length}\n total={selection.total}\n onSelectAll={selection.selectAll}\n onClear={selection.clear}\n actions={selection.barActions}\n />\n ) : (\n <>\n {showSearch && (\n // `basis-full` e não uma segunda `div`: o contentor já é\n // `flex-wrap`, então uma primeira cria que ocupa a linha\n // inteira empurra o resto para baixo sozinha. Sem filtros,\n // a busca volta a partilhar a linha com atualizar/exportar.\n // `basis-full` SEM `flex-1`, e não os dois: `flex-1` é\n // `flex: 1 1 0%`, que fixa `flex-basis: 0%` — e o Tailwind\n // emite `basis-*` ANTES de `flex-*`, então os dois juntos\n // deixam o `flex-1` ganhar e a busca continua a encolher\n // até \"Busc\". Sozinha na linha ela não precisa crescer:\n // a base de 100% já é a linha inteira.\n <div className={cn('relative min-w-0', searchOwnRow ? 'basis-full' : 'flex-1')}>\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={internalSearch}\n onChange={(e) => handleSearchChange(e.target.value)}\n // Sem borda: o card já desenha o limite, e uma caixa dentro\n // da outra seria uma moldura dentro de uma moldura.\n className=\"w-full bg-transparent py-1.5 pl-8 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none\"\n />\n </div>\n )}\n {/* Busca à esquerda; o que refina e o que age sobre o resultado\n (filtros, atualizar, exportar) encosta na direita, junto. Solto\n no meio da linha, cada filtro novo empurrava os botões e a\n barra mudava de desenho a cada tela. */}\n {(allFilters.length > 0 || filters || advancedFilters || filtersTrigger || onRefresh || onExport) && (\n // `flex-nowrap`: envolvendo, cada filtro a mais abria uma\n // linha nova sob a busca, e quatro deles gastavam três linhas\n // antes da primeira linha da tabela.\n <div className=\"ml-auto flex flex-nowrap items-center justify-end gap-2 md:flex-wrap\">\n <ListFilterBar\n filters={allFilters}\n extraChips={filters}\n menuHeader={advancedFilters}\n label={filtersLabel}\n activeCount={activeFilterCount > 0 ? activeFilterCount : undefined}\n onClear={onClearFilters}\n clearLabel={clearFiltersLabel}\n />\n {filtersTrigger}\n {onRefresh && (\n <Hint label={refreshLabel}>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={refreshLabel} onClick={onRefresh} className={ICON_BTN}>\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n </Hint>\n )}\n {onExport && (\n <Hint label={exportLabel}>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={exportLabel} onClick={onExport} className={ICON_BTN}>\n <Download className=\"h-4 w-4\" />\n </Button>\n </Hint>\n )}\n </div>\n )}\n </>\n )}\n </div>\n )}\n <DataTable\n variant=\"bare\"\n columns={columns}\n data={loading ? [] : data}\n loading={loading}\n skeletonRows={loading ? 3 : undefined}\n emptyMessage={emptyState}\n onRowClick={onRowClick}\n selectable={selection.selectable}\n selectedIds={selection.selectedIds}\n onSelectedIdsChange={selection.setSelectedIds}\n getRowId={getRowId}\n rowClassName={rowClassName}\n />\n\n {/* ── Paginação ──\n DENTRO da carta, sobre a mesma hairline que fecha a tabela — um só\n rodapé, como no CRUD genérico (CrudListView). O que estava errado\n antes era a tira SOLTA embaixo da carta: duas réguas para a mesma\n coisa no mesmo produto.\n\n Os NÚMEROS ficam, e os saltos para a primeira/última também. Quem\n decide se vale ir à página 7 é quem está lendo, não este componente:\n um `‹ Página 3 de 40 ›` obriga a 37 cliques ou a desistir, e a busca\n logo acima só ajuda quem já sabe o que procura. Numa lista que se\n percorre — leads da feira, por exemplo — não se sabe.\n\n A NAVEGAÇÃO NO CENTRO, a contagem à margem. Numa tabela larga o\n rodapé à direita põe os botões a dois palmos do olho de quem acabou\n de ler a última linha, que começa à esquerda; o centro é o único\n ponto que não depende da largura da tela. E a contagem fica ABSOLUTA:\n no fluxo ela empurraria o centro para a direita, e \"centro\" passaria\n a significar \"centro do que sobrou\". */}\n {showPagination && (\n <div className=\"-mt-px flex min-h-9 flex-col items-center gap-2 rounded-b-card border-t border-border px-3 py-2 sm:grid sm:grid-cols-[1fr_auto_1fr] sm:gap-3\">\n {/* Três colunas e não `justify-center`: a navegação só fica no centro\n da FAIXA se o que está à volta dela não contar. Com a contagem no\n fluxo, \"centro\" vira o centro do que sobrou — que foi o desenho\n anterior, a contagem e os botões juntos no meio. A terceira\n coluna está vazia de propósito: é ela que equilibra a primeira. */}\n <p className=\"text-xs text-muted-foreground sm:justify-self-start\">\n {((page - 1) * pageSize) + 1}–{Math.min(page * pageSize, totalItems)} {rangeOfLabel} {totalItems.toLocaleString()}\n </p>\n <div className=\"flex items-center gap-1\">\n {/* Sempre que houver mais de uma página, e não só quando há\n reticência: condicioná-los ao buraco fazia os dois botões\n aparecerem e sumirem conforme se navega, e a régua mudava de\n largura debaixo do dedo. Nas pontas eles ficam desativados,\n que é a forma honesta de estar presente e não servir. */}\n {totalPages > 1 && (\n <button\n type=\"button\"\n onClick={() => onPageChange!(1)}\n disabled={page <= 1}\n aria-label={firstPageLabel}\n className={PAGER_BTN}\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onPageChange!(page - 1)}\n disabled={page <= 1}\n aria-label={prevPageLabel}\n className={PAGER_BTN}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {pageWindow.map((n, i) => n === -1 ? (\n // Sem `onClick` e fora da ordem de tabulação: é um sinal de que\n // há páginas ali, não um destino. Um \"…\" clicável promete um\n // salto que ninguém sabe para onde vai.\n <span key={`gap-${i}`} aria-hidden className=\"px-0.5 text-xs text-muted-foreground\">…</span>\n ) : (\n <button\n key={n}\n type=\"button\"\n onClick={() => onPageChange!(n)}\n aria-label={`${pageLabel} ${n}`}\n aria-current={n === page ? 'page' : undefined}\n className={\n n === page\n ? 'flex h-7 min-w-7 items-center justify-center rounded-md bg-primary px-1.5 text-xs font-medium tabular-nums text-primary-foreground'\n : 'flex h-7 min-w-7 items-center justify-center rounded-md px-1.5 text-xs tabular-nums text-muted-foreground transition-colors hover:bg-muted hover:text-foreground'\n }\n >\n {n}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => onPageChange!(page + 1)}\n disabled={page >= totalPages}\n aria-label={nextPageLabel}\n className={PAGER_BTN}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n {totalPages > 1 && (\n <button\n type=\"button\"\n onClick={() => onPageChange!(totalPages)}\n disabled={page >= totalPages}\n aria-label={lastPageLabel}\n className={PAGER_BTN}\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n </Card>\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronLeft, ChevronRight, Calendar } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { INLINE_LINK_TONE } from './inline-link'\n\n// ---------------------------------------------------------------------------\n// DatePicker — custom dropdown calendar, Google Calendar style\n// ---------------------------------------------------------------------------\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) { return isSameDay(d, new Date()) }\n\nfunction formatDate(date: Date, locale: string) {\n return date.toLocaleDateString(toDateLocale(locale), { month: 'short', day: 'numeric', year: 'numeric' })\n}\n\n/** Toolbar label: the year is noise while you're inside it, and two of these sit\n * side by side in a range — it only earns its space on another year. */\nfunction formatDateCompact(date: Date, locale: string) {\n const sameYear = date.getFullYear() === new Date().getFullYear()\n return date.toLocaleDateString(toDateLocale(locale), {\n month: 'short',\n day: 'numeric',\n ...(sameYear ? {} : { year: 'numeric' }),\n })\n}\n\nfunction formatDateNumeric(date: Date, locale: string) {\n return date.toLocaleDateString(toDateLocale(locale), { day: '2-digit', month: '2-digit', year: 'numeric' })\n}\n\nfunction toDateStr(d: Date) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(s: string): Date {\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y, m - 1, d)\n}\n\ninterface DatePickerProps {\n /** Value as YYYY-MM-DD string */\n value: string\n onChange: (value: string) => void\n className?: string\n /**\n * `input` (default) is the form-field trigger. `toolbar` is the 26px pill that\n * matches SegmentedControl/Button `sm`, for filter bars where a full-height\n * form field towers over everything beside it. `chip` is the FilterChip look\n * — a data está ao lado de outros filtros e é um filtro como eles; com a\n * moldura de campo ela lia como algo a preencher, não a escolher.\n *\n * `inline` NÃO tem moldura: a própria data escrita é o gatilho, sublinhada em\n * tracejado. Para quando a data já está à vista como resposta de outra\n * escolha — \"válido por 30 dias → 28/10/2026\" — e abrir um campo abaixo para\n * trocá-la acrescentaria uma segunda data na tela dizendo a mesma coisa.\n */\n variant?: 'input' | 'toolbar' | 'chip' | 'inline'\n /**\n * `long` (padrão) escreve o mês por extenso; `numeric` escreve 04/09/2026.\n *\n * Numérico não é preferência de gosto: num campo estreito — duas datas e mais\n * dois campos na mesma linha — \"30 de jun. de 2027\" não cabe, e o que o\n * usuário vê é o ano cortado pela borda. Uma data pela metade é pior que uma\n * data curta, e curta é como o V1 sempre mostrou.\n */\n format?: 'long' | 'numeric'\n /** Open the dropdown immediately on mount */\n defaultOpen?: boolean\n /** Called when the dropdown opens or closes */\n onOpenChange?: (open: boolean) => void\n}\n\nconst TRIGGER_VARIANT: Record<'input' | 'toolbar' | 'chip' | 'inline', string> = {\n input: 'flex h-9 items-center rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 text-sm w-full',\n toolbar: 'h-[26px] rounded-button border border-border bg-card shadow-button px-2.5 text-xs font-medium',\n // Mesmas medidas e cores de FilterChip.\n chip: 'rounded-full border border-transparent bg-muted/70 px-2.5 py-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground',\n // O tracejado é o que diz que o texto se edita. Sem ele a data lê como rótulo.\n // A tinta vem do InlineLink: o mesmo traço estava escrito aqui, no gatilho de\n // forma de pagamento e na barra de ferramentas, com três grafias.\n inline: `text-xs font-medium text-primary hover:opacity-80 ${INLINE_LINK_TONE.dashed}`,\n}\n\nexport function DatePicker({ value, onChange, className, variant = 'input', format = 'long', defaultOpen, onOpenChange }: DatePickerProps) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const [open, setOpen] = useState(defaultOpen ?? false)\n const ref = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const selectedDate = value ? parseDate(value) : new Date()\n const [viewMonth, setViewMonth] = useState(new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n const [pos, setPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 })\n\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n const dateLocale = toDateLocale(locale)\n\n // Position the portal dropdown relative to the trigger\n useEffect(() => {\n if (!open || !triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const dropW = 260\n let left = rect.left\n if (left + dropW > window.innerWidth - 12) left = window.innerWidth - dropW - 12\n if (left < 8) left = 8\n setPos({ top: rect.bottom + 4, left })\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n onOpenChange?.(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open, onOpenChange])\n\n // Sync view month when value changes externally\n useEffect(() => {\n if (value) {\n const d = parseDate(value)\n setViewMonth(new Date(d.getFullYear(), d.getMonth(), 1))\n }\n }, [value])\n\n const monthLabel = viewMonth.toLocaleDateString(dateLocale, { month: 'long', year: 'numeric' })\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n const prevMonthDays = new Date(year, month, 0).getDate()\n\n const cells: { date: Date; inMonth: boolean }[] = []\n for (let i = startOffset - 1; i >= 0; i--) {\n cells.push({ date: new Date(year, month - 1, prevMonthDays - i), inMonth: false })\n }\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(year, month, d), inMonth: true })\n }\n while (cells.length % 7 !== 0) {\n cells.push({ date: new Date(year, month + 1, cells.length - startOffset - daysInMonth + 1), inMonth: false })\n }\n\n const rows: typeof cells[] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function handleSelect(date: Date) {\n onChange(toDateStr(date))\n setOpen(false)\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n {/* Trigger */}\n <button ref={triggerRef} type=\"button\" onClick={() => setOpen((p) => !p)}\n className={`flex items-center text-left transition-colors ${variant === 'chip' ? 'gap-1' : variant === 'inline' ? '' : 'gap-2 hover:bg-muted/30'} ${TRIGGER_VARIANT[variant]}`}>\n {variant !== 'inline' && (\n <Calendar className={`shrink-0 ${variant === 'input' ? 'h-3.5 w-3.5 text-muted-foreground' : 'h-3 w-3 opacity-70'}`} />\n )}\n <span className=\"whitespace-nowrap\">\n {value\n ? (format === 'numeric'\n ? formatDateNumeric\n : variant === 'input' ? formatDate : formatDateCompact)(selectedDate, locale)\n : t('common.selectDate')}\n </span>\n </button>\n\n {/* Dropdown — portal to escape overflow containers */}\n {open && createPortal(\n <div ref={dropdownRef} data-modal-passthrough\n style={{ position: 'fixed', top: pos.top, left: pos.left, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-xl border bg-popover shadow-xl p-3 w-[260px]\">\n {/* Month nav */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button type=\"button\" onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1))}\n className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-1\">\n {dayLabels.map((l, i) => (\n <div key={i} className=\"flex h-8 items-center justify-center text-[11px] font-medium text-muted-foreground\">{l}</div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map(({ date, inMonth }, di) => {\n const sel = value && isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button key={di} type=\"button\"\n onClick={() => handleSelect(date)}\n className={`flex h-8 w-8 items-center justify-center rounded-full text-xs mx-auto transition-colors ${\n sel\n ? 'bg-primary text-primary-foreground font-semibold'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : inMonth\n ? 'hover:bg-muted text-foreground'\n : 'text-muted-foreground/40 hover:bg-muted/50'\n }`}>\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n\n {/* Today shortcut */}\n <div className=\"mt-2 pt-2 border-t\">\n <button type=\"button\" onClick={() => { handleSelect(new Date()) }}\n className=\"text-xs text-primary font-medium hover:underline\">{t('agenda.calendar.today')}</button>\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import React, { useMemo } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\n/**\n * The little month picker, shared.\n *\n * It lived inside plugin-agenda, which is where it was first needed, but there\n * is nothing about a month grid that belongs to appointments — it is date\n * arithmetic and seven columns. plugin-reservations wanted the same picker for\n * a screen with no professionals in it at all, and copying 120 lines of\n * `new Date(year, month + 1, 0)` into a second plugin is how two calendars\n * start disagreeing about which day a week begins on.\n *\n * `markers` is the one thing added in the lift: a day can carry dots. The\n * agenda paints nothing (its month view is the calendar itself), the\n * reservations screen paints one dot per state so the month says where the\n * night is full before you click into it.\n */\nexport interface MiniCalendarMarker {\n /** Any CSS colour. Up to three are drawn; the rest become a \"+\". */\n color: string\n /** Read by screen readers on the day button. */\n label?: string\n}\n\nexport interface MiniCalendarProps {\n selectedDate: Date\n onDateSelect: (date: Date) => void\n onMonthChange?: (date: Date) => void\n /** Keyed by `YYYY-MM-DD` in LOCAL time — the same string the day buttons\n * build, so a caller never has to guess a timezone. */\n markers?: Record<string, MiniCalendarMarker[]>\n}\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\n/** Local-time ISO day. `toISOString()` would shift a São Paulo evening into the\n * next day, which is exactly the class of bug a shared component should not\n * make each caller rediscover. */\nexport function toLocalISODate(d: Date): string {\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${d.getFullYear()}-${month}-${day}`\n}\n\nexport function MiniCalendar({ selectedDate, onDateSelect, onMonthChange, markers }: MiniCalendarProps) {\n const locale = getCurrentLocale()\n const [viewMonth, setViewMonth] = React.useState(() => new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n\n const monthLabel = viewMonth.toLocaleDateString(toDateLocale(locale), { month: 'long', year: 'numeric' })\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < startOffset; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n while (cells.length % 7 !== 0) cells.push(null)\n\n const rows: (Date | null)[][] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function prevMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function nextMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n const hasMarkers = !!markers\n\n return (\n <div className=\"select-none\">\n {/* Month header */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={prevMonth} aria-label=\"Previous month\" className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button onClick={nextMonth} aria-label=\"Next month\" className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-0.5\">\n {dayLabels.map((label, i) => (\n <div key={i} className=\"flex h-6 w-6 items-center justify-center text-[10px] font-medium text-muted-foreground mx-auto\">\n {label}\n </div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map((date, di) => {\n // The dot row needs its own height, so an empty cell in a marked\n // month has to be as tall as a marked one or the grid limps.\n if (!date) return <div key={di} className={hasMarkers ? 'h-9 w-6 mx-auto' : 'h-6 w-6 mx-auto'} />\n const selected = isSameDay(date, selectedDate)\n const today = isToday(date)\n const dots = markers?.[toLocalISODate(date)] ?? []\n return (\n <div key={di} className={hasMarkers ? 'flex h-9 flex-col items-center' : 'contents'}>\n <button\n onClick={() => onDateSelect(date)}\n aria-label={dots.length ? dots.map((m) => m.label).filter(Boolean).join(', ') || undefined : undefined}\n className={`flex h-6 w-6 items-center justify-center rounded-full text-[11px] mx-auto transition-colors ${\n selected\n ? 'bg-primary text-primary-foreground'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : 'hover:bg-muted text-foreground'\n }`}\n >\n {date.getDate()}\n </button>\n {hasMarkers && (\n <div className=\"flex h-2 items-center gap-[2px]\">\n {dots.slice(0, 3).map((m, i) => (\n <span key={i} className=\"h-1 w-1 rounded-full\" style={{ backgroundColor: m.color }} />\n ))}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n","import React from 'react'\n\n/**\n * A state, said in a colour and a word.\n *\n * Six plugins had written this pill by hand — plugin-agenda's `StatusBadge`,\n * plugin-crm's `LeadStatusBadge`, plugin-financial's local `StatusBadge`,\n * plugin-marketing's two, and the one plugin-reservations was about to add.\n * They agree on the shape (dot + label in a tinted pill) and drift on the\n * numbers: three different alpha suffixes for the same tint, two different\n * paddings, one without the border. A restaurant switching from Reservas to\n * Pedidos should not have to re-learn what a state looks like.\n *\n * Colour comes from the CALLER, not from a shared enum: the vocabularies are\n * genuinely different (a lead is `qualified`, a reservation is `seated`) and\n * hiding that behind one map would be the same mistake as putting reservations\n * on the agenda. What is shared is the shape, which is all that was duplicated.\n */\nexport interface DotBadgeProps {\n label: string\n /** Any CSS colour. Tinted for the background and the border. */\n color: string\n /** Drops the dot, for a pill that is already unambiguous. */\n hideDot?: boolean\n className?: string\n}\n\nexport function DotBadge({ label, color, hideDot, className }: DotBadgeProps) {\n return (\n <span\n className={`inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap ${className ?? ''}`}\n style={{\n backgroundColor: `${color}15`,\n color,\n border: `1px solid ${color}30`,\n }}\n >\n {!hideDot && <span className=\"h-1.5 w-1.5 shrink-0 rounded-full\" style={{ backgroundColor: color }} />}\n {label}\n </span>\n )\n}\n","import React from 'react'\nimport { ChevronDown } from 'lucide-react'\n\n/**\n * A filter column's list of options — the shape plugin-agenda's left rail\n * established and every other filtered screen should repeat.\n *\n * Three things it encodes that a row of pills does not:\n *\n * 1. **Nothing selected means everything.** The boxes read CHECKED when the\n * filter is empty, because that is what the list is showing. A pill row says\n * the opposite with the same data — nothing highlighted looks like nothing\n * is on — and the person clicks a pill expecting to add and instead narrows\n * to one.\n * 2. **The colour belongs to the value, not to the selection.** The box itself\n * is painted in the status' own colour, so it is the same key the rows and\n * badges use and the filter teaches the legend. A pill that only turns\n * coloured when active cannot do that.\n * 3. **A stable column.** Rows are one per line and do not reflow when a label\n * grows, so the item under the cursor stays under the cursor.\n *\n * Lifted out of the agenda's `FilterRail` when Reservas needed the same column:\n * two screens over the same night were drawing two different filters for the\n * same idea — one a coloured box, the other a grey checkbox with a dot beside\n * it. Both render through here now, so neither can drift again.\n */\n\n/** A collapsible block of the rail. Open by default: a filter nobody can see is\n * a filter nobody uses, and the chevron is there for whoever wants the space\n * back. */\nexport function FilterSection({\n title, defaultOpen = true, count, children,\n}: {\n title: string\n defaultOpen?: boolean\n /**\n * Quantos desta seção estão marcados. Zero ou ausente não desenha nada.\n *\n * Existe por causa da seção FECHADA: dobrar um filtro guarda a régua junto\n * com o recorte, e a coluna passa a mostrar menos do que existe sem nada na\n * tela dizendo por quê. O número no cabeçalho é a única coisa que sobrevive\n * ao fechamento — e é ele que transforma \"some\" em \"escondi\".\n */\n count?: number\n children: React.ReactNode\n}) {\n const [open, setOpen] = React.useState(defaultOpen)\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen((p) => !p)}\n aria-expanded={open}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\"\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate\">{title}</span>\n {!!count && (\n <span className=\"shrink-0 rounded-full bg-primary/10 px-1.5 py-px text-[10px] font-semibold leading-4 text-primary\">\n {count}\n </span>\n )}\n </span>\n <ChevronDown className={`h-3.5 w-3.5 shrink-0 transition-transform ${open ? '' : '-rotate-90'}`} />\n </button>\n {open && <div className=\"mt-1.5 space-y-0.5\">{children}</div>}\n </>\n )\n}\n\nfunction CheckMark({ className }: { className: string }) {\n return (\n <svg className={className} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** The box. Painted in the value's own colour when it has one; in the app's\n * primary when it does not — a person or an agenda has no colour of its own. */\nexport function FilterCheckBox({ checked, color }: { checked: boolean; color?: string }) {\n if (!color) {\n return (\n <span className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors ${\n checked ? 'border-primary bg-primary' : 'border-muted-foreground/30'\n }`}>\n {checked && <CheckMark className=\"h-2.5 w-2.5 text-primary-foreground\" />}\n </span>\n )\n }\n return (\n <span\n className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors\"\n style={{ borderColor: checked ? color : color + '40', backgroundColor: checked ? color : 'transparent' }}\n >\n {checked && <CheckMark className=\"h-2.5 w-2.5 text-white\" />}\n </span>\n )\n}\n\nexport interface FilterCheckOption<T extends string = string> {\n value: T\n label: string\n /** Paints the box. Omit and the box uses the app's primary. */\n color?: string\n /** Drawn between the box and the label — an avatar, initials, an icon. */\n adornment?: React.ReactNode\n count?: number\n}\n\n/** One row. Exported for rails that own their own list plumbing (search,\n * pagination) but must not own the row's look. */\nexport function FilterCheckRow<T extends string = string>({\n option, checked, onToggle,\n}: {\n option: FilterCheckOption<T>\n checked: boolean\n onToggle: () => void\n}) {\n return (\n <label className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <FilterCheckBox checked={checked} color={option.color} />\n {option.adornment}\n <span className={`min-w-0 flex-1 truncate text-xs ${checked ? 'text-foreground' : 'text-muted-foreground'}`}>\n {option.label}\n </span>\n {option.count != null && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">{option.count}</span>\n )}\n <input type=\"checkbox\" className=\"sr-only\" checked={checked} onChange={onToggle} />\n </label>\n )\n}\n\nexport interface FilterCheckListProps<T extends string = string> {\n /** Present ⇒ the rows sit inside a collapsible section under this title. */\n label?: string\n options: ReadonlyArray<FilterCheckOption<T>>\n /** Empty means \"all\", and every box draws checked. */\n selected: readonly T[]\n onChange: (next: T[]) => void\n className?: string\n}\n\nexport function FilterCheckList<T extends string = string>({\n label, options, selected, onChange, className,\n}: FilterCheckListProps<T>) {\n const all = selected.length === 0\n\n // Plain add/remove, the agenda's behaviour: from \"all\", the first click keeps\n // only what was clicked. Selecting the two states you are working tonight is\n // two clicks, not five.\n function toggle(value: T) {\n const next = selected.includes(value)\n ? selected.filter((v) => v !== value)\n : [...selected, value]\n // Every box checked is no filter, not a filter that happens to list\n // everything — otherwise the \"Limpar\" affordance never comes back.\n onChange(next.length === options.length ? [] : next)\n }\n\n const rows = options.map((option) => (\n <FilterCheckRow\n key={option.value}\n option={option}\n checked={all || selected.includes(option.value)}\n onToggle={() => toggle(option.value)}\n />\n ))\n\n if (label) {\n return (\n <div className={className}>\n <FilterSection title={label}>{rows}</FilterSection>\n </div>\n )\n }\n return <div className={className ? `${className} space-y-0.5` : 'space-y-0.5'}>{rows}</div>\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, X, ChevronDown, Loader2, Plus, Check, Pencil } from 'lucide-react'\nimport { ManageRow } from './choice-list'\nimport { cn } from '../lib/cn'\n\n/** Layout effect no cliente, efeito comum no SSR (evita o aviso). */\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SearchSelectOption {\n id: string\n label: string\n subtitle?: string\n icon?: React.ReactNode\n group?: string\n disabled?: boolean\n data?: any\n}\n\nexport interface SearchSelectProps {\n /** Currently selected option ID */\n value?: string\n /** Display text when a value is selected (overrides auto-lookup) */\n displayValue?: string\n /** Callback when an option is selected */\n onChange: (id: string, option: SearchSelectOption | null) => void\n /** Search function — async or sync. Called with debounced query. */\n onSearch: (query: string) => Promise<SearchSelectOption[]> | SearchSelectOption[]\n /** Placeholder text */\n placeholder?: string\n /** Label above the input */\n label?: string\n /** Required field indicator */\n required?: boolean\n /** Debounce delay in ms (default: 250) */\n debounce?: number\n /** Minimum characters before searching (default: 1) */\n minChars?: number\n /** Guidance shown before the minimum query length is reached. */\n minCharsLabel?: string\n /** Empty-state line. Defaults to English — a host in another language passes\n * its own, because this primitive has no translations of its own. */\n noResultsLabel?: string\n /** Spinner line, same reason. */\n searchingLabel?: string\n /** Show a \"Create new\" action at the bottom */\n allowCreate?: boolean\n /** Label for create action (default: \"Add\") */\n createLabel?: string\n /** Label for the footer's clear action (default: \"Clear\"). */\n clearLabel?: string\n /** Callback when create is clicked. Can be async — component shows optimistic state while waiting. */\n onCreate?: (query: string) => void | Promise<void>\n /** Edit the selected record without leaving the field. Shown on the\n * selected row at the top of the open list. */\n onEdit?: (id: string) => void\n /** Label for the edit action (default: \"Edit\"). */\n editLabel?: string\n /** Last fixed row that leaves the field for the records' own screen\n * (\"Gerenciar contas\"). Pass it only when the person may edit them. */\n onManage?: () => void\n manageLabel?: string\n /** Custom render for each option */\n renderOption?: (option: SearchSelectOption) => React.ReactNode\n /** Render grouped results as adjacent columns on wider screens. */\n groupLayout?: 'stacked' | 'columns'\n /** Load initial results when dropdown opens (calls onSearch('')). Default\n * true — clicking lists options before any typing; pass false to require\n * a query first (e.g. very large datasets with no cheap top-N). */\n loadOnOpen?: boolean\n /** Compact required-filter trigger used above data lists. */\n variant?: 'field' | 'required-filter'\n /** Icon shown by the required-filter trigger. */\n icon?: React.ComponentType<{ className?: string }>\n /** Shown in place of the search glyph while a value is selected and the\n * field is closed — e.g. the chosen option's logo. */\n leading?: React.ReactNode\n /** Placeholder value shown by a missing required filter. */\n emptyValue?: string\n /** Additional className for the container */\n className?: string\n /** Disabled state */\n disabled?: boolean\n /** Tour anchor stamped on the container (a guided tour points here). */\n 'data-tour'?: string\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchSelect({\n value,\n displayValue,\n onChange,\n onSearch,\n placeholder = 'Search...',\n label,\n required,\n debounce = 250,\n minChars = 1,\n minCharsLabel,\n noResultsLabel,\n searchingLabel = 'Searching...',\n allowCreate,\n createLabel = 'Add',\n clearLabel = 'Clear',\n onCreate,\n onEdit,\n editLabel = 'Edit',\n onManage,\n manageLabel = 'Manage',\n renderOption,\n groupLayout = 'stacked',\n loadOnOpen = true,\n variant = 'field',\n icon: FilterIcon,\n leading,\n emptyValue = '____',\n className,\n disabled,\n 'data-tour': dataTour,\n}: SearchSelectProps) {\n const isRequiredFilter = variant === 'required-filter'\n // `allowCreate === false` cala o rodapé de criar mesmo com onCreate ligado —\n // é como um chamador desliga a criação numa tela onde ela não faz sentido.\n const canCreate = !!onCreate && allowCreate !== false\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<SearchSelectOption[]>([])\n const [loading, setLoading] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const [selectedLabel, setSelectedLabel] = React.useState(displayValue ?? '')\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const timerRef = React.useRef<ReturnType<typeof setTimeout>>()\n\n // Onde a lista abre, em coordenadas de tela.\n //\n // Ela era `absolute` dentro do campo, e um campo dentro de um card com\n // `overflow-hidden` (uma linha de item de pedido, por exemplo) tinha a lista\n // cortada na borda do card — a busca funcionava e os resultados ficavam\n // escondidos. Fora, presa ao corpo da página, nada a recorta.\n const [rect, setRect] = React.useState<{ left: number; top: number; width: number; above: boolean; space: number } | null>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const requestRef = React.useRef(0)\n\n // Close on outside click. O painel não está mais dentro do container, então\n // clicar nele não é \"fora\" — os dois precisam ser consultados.\n React.useEffect(() => {\n function handler(e: MouseEvent) {\n const target = e.target as Node\n if (containerRef.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n // Update display when value/displayValue changes externally\n React.useEffect(() => {\n if (displayValue !== undefined) setSelectedLabel(displayValue)\n }, [displayValue])\n\n // Load initial results when dropdown opens with empty query\n React.useEffect(() => {\n if (open && loadOnOpen && query.length === 0 && results.length === 0 && !loading) {\n const request = ++requestRef.current\n setLoading(true)\n Promise.resolve(onSearch(''))\n .then((next) => { if (request === requestRef.current) setResults(next) })\n .catch(() => { if (request === requestRef.current) setResults([]) })\n .finally(() => { if (request === requestRef.current) setLoading(false) })\n }\n }, [open, loadOnOpen])\n\n function handleQueryChange(q: string) {\n setQuery(q)\n if (timerRef.current) clearTimeout(timerRef.current)\n const request = ++requestRef.current\n\n if (q.length < minChars && !(loadOnOpen && q.length === 0)) {\n setResults([])\n setLoading(false)\n return\n }\n\n setLoading(true)\n timerRef.current = setTimeout(async () => {\n try {\n const res = await onSearch(q)\n if (request === requestRef.current) setResults(res)\n } catch {\n if (request === requestRef.current) setResults([])\n }\n if (request === requestRef.current) setLoading(false)\n }, debounce)\n }\n\n function handleSelect(option: SearchSelectOption) {\n requestRef.current += 1\n onChange(option.id, option)\n setSelectedLabel(option.label)\n setOpen(false)\n setQuery('')\n setResults([])\n }\n\n function handleClear() {\n requestRef.current += 1\n onChange('', null)\n setSelectedLabel('')\n setQuery('')\n setResults([])\n }\n\n async function handleCreate(name: string) {\n if (!onCreate) return\n setCreating(true)\n setSelectedLabel(name)\n setOpen(false)\n setQuery('')\n setResults([])\n try {\n await onCreate(name)\n } finally {\n setCreating(false)\n }\n }\n\n function handleOpen() {\n if (disabled || creating) return\n setOpen(true)\n setQuery('')\n // Stale results from a previous typed query would render for the empty\n // query now that the dropdown shows immediately — drop them so the\n // loadOnOpen effect refetches the initial listing.\n setResults([])\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n\n // Group results\n const groups = React.useMemo(() => {\n const map = new Map<string, SearchSelectOption[]>()\n for (const opt of results) {\n const group = opt.group ?? ''\n if (!map.has(group)) map.set(group, [])\n map.get(group)!.push(opt)\n }\n return map\n }, [results])\n\n const hasValue = !!value && !!selectedLabel\n // With loadOnOpen the dropdown must show for the EMPTY query too — gating it\n // on minChars silently hid the initial listing loadOnOpen had just fetched.\n // A selected value always opens the list, to show it (and its edit action)\n // even where searching needs a few characters first.\n const showDropdown = open && (isRequiredFilter || query.length >= minChars || loadOnOpen || hasValue)\n\n // Mede ao abrir e acompanha rolagem/redimensionamento — uma lista presa ao\n // corpo não sobe junto com a página, e ficar parada onde o campo ESTAVA é a\n // única coisa que um seguidor não pode fazer.\n useIsomorphicLayoutEffect(() => {\n if (!showDropdown) { setRect(null); return }\n const measure = () => {\n const el = containerRef.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const below = window.innerHeight - r.bottom\n // Abre para cima quando embaixo não cabe e em cima cabe mais.\n const above = below < 240 && r.top > below\n const groupedWidth = groupLayout === 'columns' && groups.size > 1\n ? Math.min(groups.size * 210, window.innerWidth - 16)\n : r.width\n const width = isRequiredFilter\n ? Math.max(r.width, 288, groupedWidth)\n : Math.max(r.width, groupedWidth)\n const left = Math.max(8, Math.min(r.left, window.innerWidth - width - 8))\n // The fixed footer rows must stay on screen: the list shrinks, not the footer.\n const space = Math.max(160, (above ? r.top : below) - 12)\n setRect({ left, top: above ? r.top : r.bottom, width, above, space })\n }\n measure()\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n return () => {\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n }\n }, [showDropdown, isRequiredFilter, groupLayout, groups.size])\n\n const optionButton = (opt: SearchSelectOption) => (\n <button\n key={opt.id}\n onClick={() => handleSelect(opt)}\n disabled={opt.disabled}\n className={cn(\n 'flex w-full items-center gap-2.5 px-3 py-2 text-left transition-colors hover:bg-muted/50',\n opt.disabled && 'cursor-not-allowed opacity-40',\n opt.id === value && 'bg-muted/30',\n )}\n >\n {renderOption ? renderOption(opt) : (\n <>\n {opt.icon}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[10px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n </button>\n )\n\n return (\n <div ref={containerRef} data-tour={dataTour} className={cn('relative', className)}>\n {label && !isRequiredFilter && (\n <label className=\"text-xs font-medium text-muted-foreground\">\n {label}{required && ' *'}\n </label>\n )}\n\n {/* Trigger — shows selected value or search input */}\n {isRequiredFilter ? (\n <button\n type=\"button\"\n onClick={handleOpen}\n disabled={disabled || creating}\n aria-label={`${label ?? ''}: ${selectedLabel || emptyValue}`}\n className={cn(\n 'inline-flex h-8 max-w-[18rem] items-center gap-1.5 rounded-button border px-2.5 text-xs font-medium transition-colors',\n hasValue\n ? 'border-border bg-card text-foreground shadow-button hover:bg-muted'\n : 'border-dashed border-warning/60 bg-warning/10 text-warning hover:bg-warning/15',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {FilterIcon ? <FilterIcon className=\"h-3.5 w-3.5 shrink-0 opacity-75\" /> : null}\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className={cn('truncate', !hasValue && 'text-warning')}>{selectedLabel || emptyValue}</span>\n <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" />\n </button>\n ) : (\n <div\n className={cn(\n 'mt-1 flex h-9 items-center gap-2 rounded-input border border-input bg-background transition-colors',\n open ? 'ring-2 ring-primary/20' : 'hover:bg-muted/30',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n {leading && hasValue && !open\n ? <span className=\"ml-2.5 flex shrink-0 items-center\">{leading}</span>\n : <Search className=\"h-3.5 w-3.5 text-muted-foreground ml-3 shrink-0\" />}\n {open ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n // Opening to search must not read as \"the value was cleared\".\n placeholder={hasValue ? selectedLabel : placeholder}\n className=\"flex-1 bg-transparent py-2 pr-3 text-sm outline-none placeholder:text-foreground/70\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"min-w-0 flex-1 truncate text-left py-2 pr-3 text-sm outline-none\"\n disabled={disabled || creating}\n >\n {creating ? (\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"font-medium text-foreground\">{selectedLabel}</span>\n </span>\n ) : hasValue ? (\n <span className=\"block truncate font-medium\">{selectedLabel}</span>\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </button>\n )}\n {hasValue && !open && (\n <button onClick={handleClear} className=\"pr-3 text-muted-foreground hover:text-foreground\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {!hasValue && !open && (\n <ChevronDown className=\"h-3 w-3 text-muted-foreground mr-3 shrink-0\" />\n )}\n </div>\n )}\n\n {/* Dropdown */}\n {showDropdown && rect && createPortal(\n <div\n ref={dropdownRef}\n style={{\n position: 'fixed',\n left: rect.left,\n width: rect.width,\n // O DIALOGO POE `pointer-events: none` NO BODY.\n //\n // Esta lista vai pelo portal, para o `body` — fora do conteudo do\n // dialogo, que e o unico ramo que o Radix reabilita. Sem esta\n // linha ela aparece por cima e NAO RECEBE CLIQUE: a busca roda, o\n // resultado desenha, e escolher nao faz nada. Mesma armadilha que\n // o PaymentModal ja documentava (\"aparece por cima porem surdo\").\n pointerEvents: 'auto',\n ...(rect.above ? { bottom: window.innerHeight - rect.top + 4 } : { top: rect.top + 4 }),\n maxHeight: rect.space,\n }}\n // z-[110], a camada das listas flutuantes do design system (dropdown,\n // popover, select). Em z-[60] a lista nascia ATRAS de todo modal —\n // que sao z-[100] —, e o campo respondia à digitação sem mostrar\n // nada: a busca rodava, o resultado voltava, e ninguém via.\n className=\"fayz-glass-surface z-[110] flex flex-col overflow-hidden rounded-lg border bg-popover shadow-lg\"\n >\n {isRequiredFilter && (\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(event) => handleQueryChange(event.target.value)}\n onKeyDown={(event) => { if (event.key === 'Escape') setOpen(false) }}\n placeholder={placeholder}\n className=\"h-8 w-full rounded-md bg-muted/35 pl-8 pr-3 text-sm outline-none ring-ring focus:ring-2\"\n />\n </div>\n </div>\n )}\n {hasValue && !query && (\n <div className=\"flex items-center gap-2 border-b bg-muted/30 px-3 py-2\">\n <Check className=\"h-3.5 w-3.5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{selectedLabel}</span>\n {onEdit && value && (\n <button\n type=\"button\"\n onClick={() => { setOpen(false); onEdit(value) }}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-primary transition-colors hover:bg-primary/10\"\n >\n <Pencil className=\"h-3 w-3\" />\n {editLabel}\n </button>\n )}\n </div>\n )}\n {query.length < minChars && !loadOnOpen ? (\n <div className=\"px-4 py-5 text-center text-xs text-muted-foreground\">\n {minCharsLabel ?? `Type at least ${minChars} characters`}\n </div>\n ) : loading ? (\n <div className=\"flex items-center justify-center gap-2 px-4 py-6 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> {searchingLabel}\n </div>\n ) : results.length === 0 ? (\n <div className=\"px-4 py-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {noResultsLabel ?? (query ? `No results for \"${query}\"` : 'No results')}\n </p>\n </div>\n ) : groupLayout === 'columns' && groups.size > 1 ? (\n <div className=\"max-h-72 overflow-auto\">\n <div className=\"flex min-w-full flex-col sm:flex-row\">\n {[...groups.entries()].map(([group, options], index) => (\n <div\n key={group}\n className={cn('min-w-0 flex-1', index > 0 && 'border-t sm:border-l sm:border-t-0')}\n >\n <div className=\"sticky top-0 bg-muted/65 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-foreground backdrop-blur-sm\">\n {group || 'Outros'}\n </div>\n {options.map(optionButton)}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"max-h-64 min-h-0 flex-1 overflow-auto py-1\">\n {[...groups.entries()].map(([group, options]) => (\n <React.Fragment key={group}>\n {group && (\n <div className=\"sticky top-0 bg-muted/50 px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n )}\n {options.map(optionButton)}\n </React.Fragment>\n ))}\n </div>\n )}\n\n {/* Rodapé fixo: limpar e criar.\n As duas ações moravam DENTRO da lista rolável — \"criar\" aparecia\n depois de vinte resultados, ou só quando a busca não achava nada,\n que é exatamente quando a pessoa já desistiu. Aqui elas ficam à\n vista com a lista inteira, como o resto do sistema faz. */}\n {(canCreate || hasValue || query.trim()) && !loading && (\n <div className=\"flex items-center justify-between gap-2 border-t bg-muted/20 px-1.5 py-1\">\n {hasValue || query.trim() ? (\n <button\n onClick={handleClear}\n className=\"rounded-md px-2 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n {clearLabel}\n </button>\n ) : <span />}\n {canCreate && (\n <button\n onClick={() => handleCreate(query)}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-xs font-medium text-primary transition-colors hover:bg-primary/10\"\n >\n <Plus className=\"h-3 w-3\" />\n {query.trim() ? `${createLabel} \"${query.trim()}\"` : createLabel}\n </button>\n )}\n </div>\n )}\n {onManage && (\n <ManageRow action={{ label: manageLabel, onSelect: onManage }} onDone={() => setOpen(false)} />\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\ninterface CurrencyInputProps {\n value: number\n onChange: (value: number) => void\n symbol?: string\n locale?: string\n currencyCode?: string\n label?: string\n placeholder?: string\n className?: string\n disabled?: boolean\n}\n\n/**\n * Currency input with automatic decimal formatting.\n *\n * - Always displays the value with 2 decimal places using the project's locale\n * - Input works like an ATM: digits push from right, decimals are fixed\n * - Typing \"12345\" shows \"123,45\" (or \"123.45\" depending on locale)\n * - Backspace removes the last digit\n * - Supports the project currency symbol\n */\nexport function CurrencyInput({\n value,\n onChange,\n symbol = 'R$',\n locale = 'pt-BR',\n currencyCode = 'BRL',\n label,\n placeholder,\n className,\n disabled,\n}: CurrencyInputProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [focused, setFocused] = React.useState(false)\n\n // Format number to locale string with 2 decimals\n const format = React.useCallback((v: number) => {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(v)\n }, [locale])\n\n const displayValue = format(value)\n\n // Handle key-by-key input — ATM-style (digits push from right)\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (disabled) return\n\n // Allow tab, arrow keys, etc.\n if (['Tab', 'Escape', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return\n\n e.preventDefault()\n\n if (e.key === 'Backspace' || e.key === 'Delete') {\n // Remove last digit: 123.45 → 12.34\n const cents = Math.floor(Math.round(value * 100) / 10)\n onChange(cents / 100)\n return\n }\n\n // Only accept digits\n if (!/^\\d$/.test(e.key)) return\n\n // Append digit: 12.34 + '5' → 123.45\n const currentCents = Math.round(value * 100)\n const newCents = currentCents * 10 + parseInt(e.key, 10)\n // Cap at 999,999,999.99\n if (newCents > 99999999999) return\n onChange(newCents / 100)\n }\n\n // Handle paste — parse number from pasted text\n function handlePaste(e: React.ClipboardEvent) {\n e.preventDefault()\n const text = e.clipboardData.getData('text')\n // Remove everything except digits, dots, commas\n const cleaned = text.replace(/[^\\d.,]/g, '')\n // Replace comma with dot for parsing\n const normalized = cleaned.replace(',', '.')\n const parsed = parseFloat(normalized)\n if (!isNaN(parsed)) {\n onChange(Math.round(parsed * 100) / 100)\n }\n }\n\n return (\n <div className={className}>\n {label && <label className=\"text-xs font-medium text-muted-foreground\">{label}</label>}\n <div\n className={cn(\n 'flex h-9 items-center rounded-input border border-input bg-background ring-offset-background transition-colors cursor-text',\n label && 'mt-1',\n focused && 'border-ring ring-2 ring-ring ring-offset-2',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n onClick={() => inputRef.current?.focus()}\n >\n <span className=\"pl-3 pr-1 text-sm font-medium text-muted-foreground select-none\">{symbol}</span>\n <input\n ref={inputRef}\n type=\"text\"\n inputMode=\"numeric\"\n value={displayValue}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder ?? format(0)}\n disabled={disabled}\n readOnly={false}\n className=\"h-full min-w-0 flex-1 bg-transparent px-2 text-sm outline-none text-right tabular-nums caret-primary selection:bg-primary/20\"\n onChange={() => {}}\n />\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n // `fz-segmented`: gancho para a faixa do cabeçalho trocar este chrome\n // de cartão pelo de faixa (ver .fz-on-band em styles.css).\n 'fz-segmented inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\n\nexport interface RequiredFilterProps {\n label: string\n value?: string\n emptyValue?: string\n icon?: React.ComponentType<{ className?: string }>\n children: React.ReactNode | ((close: () => void) => React.ReactNode)\n align?: 'start' | 'center' | 'end'\n className?: string\n contentClassName?: string\n}\n\n/**\n * A required list filter stays visible even before it has a value. The dashed\n * warning treatment makes the missing input actionable instead of hiding the\n * reason for an empty result behind the generic filter menu.\n */\nexport function RequiredFilter({\n label,\n value,\n emptyValue = '____',\n icon: Icon,\n children,\n align = 'end',\n className,\n contentClassName,\n}: RequiredFilterProps) {\n const [open, setOpen] = React.useState(false)\n const missing = !value\n const close = React.useCallback(() => setOpen(false), [])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={`${label}: ${value || emptyValue}`}\n className={cn(\n 'inline-flex h-8 shrink-0 items-center gap-1.5 rounded-button border px-2.5 text-xs font-medium transition-colors',\n missing\n ? 'border-dashed border-warning/60 bg-warning/10 text-warning hover:bg-warning/15'\n : 'border-border bg-card text-foreground shadow-button hover:bg-muted',\n className,\n )}\n >\n {Icon ? <Icon className=\"h-3.5 w-3.5 shrink-0 opacity-75\" /> : null}\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className={cn('max-w-[14rem] truncate', missing && 'text-warning')}>{value || emptyValue}</span>\n <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} className={cn('w-72 p-1.5', contentClassName)}>\n {typeof children === 'function' ? children(close) : children}\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown, Search as SearchIcon } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Card } from './card'\nimport { DraftCommitBar } from './draft-commit-bar'\n\n// ---------------------------------------------------------------------------\n// A SEÇÃO DE FILTROS DE UMA CONSULTA CARA.\n//\n// Uma barra de pastilhas serve a lista que responde na hora. Ela para de servir\n// quando o recorte tem seis ou sete campos e cada um deles custa uma ida ao\n// banco: mexer em quatro campos são quatro consultas, das quais três ninguém\n// pediu — e a terceira ainda pode chegar depois da quarta e pintar a tela com\n// a resposta errada.\n//\n// Então o recorte aqui é um RASCUNHO. Os campos escrevem num estado à parte, e\n// a lista só muda quando a pessoa manda buscar. É o mesmo contrato do formulário\n// que só grava no Salvar, e por isso o aviso de pendência é literalmente a\n// mesma peça (DraftCommitBar): quem já entendeu uma entende a outra.\n//\n// Duas portas para a mesma ação, de propósito: o botão redondo no alto, que\n// está sempre no mesmo lugar, e a barra que aparece embaixo quando há algo\n// pendente — perto de onde a pessoa acabou de digitar, que é o lugar em que ela\n// está olhando. A barra é o que impede o engano clássico desta forma: digitar o\n// recorte, ver a lista velha e concluir que o filtro não funciona.\n// ---------------------------------------------------------------------------\n\nexport interface FilterPanelProps {\n /** Título da seção (\"Filtros\"). */\n title: string\n /** Há rascunho por aplicar — ver `useFilterDraft`. */\n dirty: boolean\n /** Manda buscar: o rascunho vira o recorte em vigor. */\n onApply: () => void\n /** Rótulo do botão de buscar, e do aviso de pendência. */\n applyLabel: string\n /** O que está pendente, nas palavras de quem chama. */\n pendingTitle: string\n /** Uma linha sobre a consequência de aplicar. */\n pendingHint?: string\n /** Zera o recorte. Some quando não há nada para zerar. */\n onClear?: () => void\n clearLabel?: string\n /** A consulta em voo: os dois botões ficam quietos. */\n busy?: boolean\n /** Diz o que falta. Um botão bloqueado e mudo é um botão morto. */\n applyDisabledReason?: string\n /** Os campos que ficam sempre à vista. Use `FilterPanelField` para cada um. */\n children: React.ReactNode\n /**\n * A SEGUNDA FILEIRA, atrás de um interruptor.\n *\n * Nem todo recorte é de todo dia. Plano de contas e centro de custo são de\n * quem está fechando o mês; nota fiscal é de quem está caçando um documento.\n * Deixá-los sempre abertos dobra a altura do painel para todo mundo, e\n * escondê-los num menu à parte os torna invisíveis. Um interruptor com\n * contagem resolve os dois: fechado ele ocupa uma linha de texto, e o número\n * ao lado diz que há recorte ali dentro mesmo com a fileira fechada.\n */\n advanced?: React.ReactNode\n /** Quantos campos da segunda fileira estão preenchidos. */\n advancedCount?: number\n moreLabel?: string\n lessLabel?: string\n /** Uma linha própria abaixo da grade. */\n footer?: React.ReactNode\n className?: string\n}\n\nexport function FilterPanel({\n title, dirty, onApply, applyLabel, pendingTitle, pendingHint,\n onClear, clearLabel, busy, applyDisabledReason, children,\n advanced, advancedCount, moreLabel, lessLabel, footer, className,\n}: FilterPanelProps) {\n const blocked = Boolean(applyDisabledReason)\n // Abre sozinho quando já HÁ recorte lá dentro: uma fileira fechada com\n // filtro ativo é a lista curta sem explicação na tela.\n const [aberto, setAberto] = React.useState(Boolean(advancedCount))\n const jaAbriu = React.useRef(Boolean(advancedCount))\n React.useEffect(() => {\n if (advancedCount && !jaAbriu.current) { jaAbriu.current = true; setAberto(true) }\n }, [advancedCount])\n return (\n <Card className={cn('p-3', className)}>\n <div className=\"mb-2 flex items-center gap-2\">\n <p className=\"text-xs font-semibold text-muted-foreground\">{title}</p>\n <div className=\"ml-auto flex items-center gap-1\">\n {onClear && clearLabel && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 px-2 text-xs\" onClick={onClear} disabled={busy}>\n {clearLabel}\n </Button>\n )}\n {/* REDONDO e sempre no mesmo canto: é o botão que a pessoa procura\n quando terminou de preencher, e procurar é o que ele não pode\n custar. O anel só aparece com rascunho pendente — sem ele o botão\n continua clicável (reconsultar o mesmo recorte é legítimo), mas\n não chama atenção para nada. */}\n <Button\n size=\"icon\"\n aria-label={applyLabel}\n title={applyDisabledReason || applyLabel}\n onClick={onApply}\n disabled={busy || blocked}\n className={cn(\n 'h-8 w-8 rounded-full',\n dirty && !blocked && 'ring-2 ring-primary/30 ring-offset-1 ring-offset-card',\n )}\n >\n <SearchIcon className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">{children}</div>\n\n {advanced && (\n <>\n <button\n type=\"button\"\n onClick={() => setAberto((v) => !v)}\n aria-expanded={aberto}\n className=\"mt-2 inline-flex items-center gap-1 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ChevronDown className={cn('h-3.5 w-3.5 transition-transform', aberto && 'rotate-180')} />\n {aberto ? (lessLabel ?? moreLabel) : moreLabel}\n {!aberto && Boolean(advancedCount) && (\n <span className=\"rounded-full bg-primary/10 px-1.5 text-[10px] font-semibold text-primary\">\n {advancedCount}\n </span>\n )}\n </button>\n {aberto && (\n <div className=\"mt-2 grid gap-3 border-t pt-3 sm:grid-cols-2 lg:grid-cols-4\">{advanced}</div>\n )}\n </>\n )}\n\n {footer && <div className=\"mt-3\">{footer}</div>}\n\n {/* `static`: dentro do cartão a barra é uma faixa, não uma peça flutuante\n — o que flutua sobre a lista é a barra do formulário, e esta seção não\n rola junto com nada. */}\n <DraftCommitBar\n open={dirty}\n title={pendingTitle}\n hint={pendingHint}\n icon={SearchIcon}\n commitLabel={applyLabel}\n onCommit={onApply}\n busy={busy}\n commitDisabledReason={applyDisabledReason}\n className=\"static mt-3 shadow-sm\"\n />\n </Card>\n )\n}\nFilterPanel.displayName = 'FilterPanel'\n\nexport interface FilterPanelFieldProps {\n /** O rótulo fica mesmo quando o controle se nomeia: a fileira de rótulos é\n * como se descobre o que dá para recortar sem abrir um campo por vez. */\n label: string\n /** O controle já traz seu próprio espaço no topo (SearchSelect). */\n compact?: boolean\n /** Marca o campo sem o qual a tela não responde. */\n required?: boolean\n className?: string\n children: React.ReactNode\n}\n\nexport function FilterPanelField({ label, compact, required, className, children }: FilterPanelFieldProps) {\n return (\n <div className={cn('min-w-0', className)}>\n <p className={cn('text-[10px] font-medium uppercase tracking-wide text-muted-foreground', !compact && 'mb-1')}>\n {label}{required ? ' *' : ''}\n </p>\n {children}\n </div>\n )\n}\nFilterPanelField.displayName = 'FilterPanelField'\n\nexport interface FilterDraft<T> {\n /** O que os campos escrevem. */\n draft: T\n /** O recorte EM VIGOR — é dele que a consulta se monta. */\n applied: T\n /** Mexe em um ou mais campos do rascunho. */\n patch: (changes: Partial<T>) => void\n setDraft: React.Dispatch<React.SetStateAction<T>>\n /** O rascunho difere do que está em vigor. */\n dirty: boolean\n /** Manda buscar. */\n apply: () => void\n /** Volta os dois ao valor dado (ou ao inicial). */\n reset: (value?: T) => void\n}\n\n/**\n * Dois estados para o mesmo recorte: o que se digita e o que está valendo.\n *\n * A comparação é por JSON porque estes objetos são rasos e serializáveis por\n * construção — um recorte que não cabe num JSON não é um recorte, é um estado\n * de tela.\n */\nexport function useFilterDraft<T extends object>(initial: T): FilterDraft<T> {\n const inicial = React.useRef(initial)\n const [draft, setDraft] = React.useState<T>(initial)\n const [applied, setApplied] = React.useState<T>(initial)\n\n const dirty = React.useMemo(\n () => JSON.stringify(draft) !== JSON.stringify(applied),\n [draft, applied],\n )\n\n const patch = React.useCallback((changes: Partial<T>) => {\n setDraft((atual) => ({ ...atual, ...changes }))\n }, [])\n\n // Aplicar lê o rascunho de DENTRO do setter: dois cliques no mesmo tique (ou\n // um clique logo após digitar) enxergariam o valor velho pela captura.\n const apply = React.useCallback(() => {\n setDraft((atual) => { setApplied(atual); return atual })\n }, [])\n\n const reset = React.useCallback((value?: T) => {\n const alvo = value ?? inicial.current\n setDraft(alvo)\n setApplied(alvo)\n }, [])\n\n return { draft, applied, patch, setDraft, dirty, apply, reset }\n}\n","import * as React from 'react'\nimport { CalendarDays, Check } from 'lucide-react'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport { DatePicker } from './date-picker'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// DateRangeChip — UM controle para o recorte de datas.\n//\n// [ 1–20 set. ⌄ ] → abre presets + \"de … até …\"\n//\n// Antes o período ocupava quatro controles seguidos na barra: a pastilha do\n// preset, duas datas e um \"Limpar\" solto no meio da fila, entre filtros que\n// nada têm a ver com ele. Quatro alvos para responder uma pergunta — \"que\n// intervalo eu estou vendo\" — e a resposta só se lia somando os três primeiros.\n//\n// Aqui a pastilha DIZ o intervalo e guarda o resto atrás de um clique: os\n// atalhos que se usa em 90% das vezes em cima, os dois campos embaixo para o\n// intervalo que nenhum atalho cobre, e o \"limpar\" dentro do painel, junto do\n// que ele limpa.\n// ---------------------------------------------------------------------------\n\nexport interface DateRangePreset {\n value: string\n label: string\n}\n\nexport interface DateRangeChipProps {\n from: string\n to: string\n onChange: (range: { from: string; to: string }) => void\n /** Atalhos (\"Este mês\", \"Últimos 30 dias\"). O host resolve cada um em datas. */\n presets?: DateRangePreset[]\n /** Qual atalho está valendo, quando é um deles. */\n preset?: string\n onPresetChange?: (preset: string) => void\n /** Texto quando não há recorte (\"Todo o período\"). */\n allLabel: string\n /** Rótulos do painel. Sem i18n neste pacote — o host traduz. */\n labels?: { custom?: string; from?: string; to?: string; clear?: string }\n /** Nome acessível (\"Período\"). */\n label?: string\n className?: string\n}\n\n/** \"1 de set. – 20 de set.\" vira \"1–20 de set.\"; meses diferentes mantêm os\n * dois nomes. Uma pastilha é lida de relance e um intervalo escrito por\n * extenso não cabe numa. */\nfunction formatRange(from: string, to: string, locale: string): string {\n const parse = (s: string) => {\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y!, (m ?? 1) - 1, d ?? 1)\n }\n const day = (d: Date) => String(d.getDate())\n const dayMonth = (d: Date) => d.toLocaleDateString(locale, { day: 'numeric', month: 'short' }).replace(/\\.$/, '')\n if (from && to) {\n const a = parse(from)\n const b = parse(to)\n if (a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()) {\n return a.getDate() === b.getDate() ? dayMonth(a) : `${day(a)}–${dayMonth(b)}`\n }\n return `${dayMonth(a)} – ${dayMonth(b)}`\n }\n return dayMonth(parse(from || to))\n}\n\nexport function DateRangeChip({\n from,\n to,\n onChange,\n presets = [],\n preset,\n onPresetChange,\n allLabel,\n labels,\n label,\n className,\n}: DateRangeChipProps) {\n const [open, setOpen] = React.useState(false)\n const active = !!(from || to)\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en'\n const presetLabel = presets.find((p) => p.value === preset)?.label\n\n // O atalho, quando é um atalho (\"Este mês\"); o intervalo quando é um\n // intervalo. Um \"Personalizado\" na pastilha ocuparia a largura sem dizer\n // NADA sobre o que está na tela — que é a única coisa que ela precisa dizer.\n const text = !active ? allLabel : (presetLabel ?? formatRange(from, to, locale))\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors',\n active\n ? 'border-primary/30 bg-primary/10 text-primary hover:bg-primary/15'\n : 'border-transparent bg-muted/70 text-muted-foreground hover:bg-muted hover:text-foreground',\n className,\n )}\n >\n <CalendarDays className=\"h-3 w-3 shrink-0 opacity-70\" />\n <span className=\"max-w-[12rem] truncate\">{text}</span>\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" sideOffset={6} className=\"w-60 p-1.5\">\n <button\n type=\"button\"\n onClick={() => { onPresetChange?.('all'); onChange({ from: '', to: '' }); setOpen(false) }}\n className=\"flex w-full items-center rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted\"\n >\n {allLabel}\n {!active && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0\" />}\n </button>\n {presets.map((p) => (\n <button\n key={p.value}\n type=\"button\"\n onClick={() => { onPresetChange?.(p.value); setOpen(false) }}\n className=\"flex w-full items-center rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted\"\n >\n {p.label}\n {active && preset === p.value && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0\" />}\n </button>\n ))}\n\n {/* Os dois campos ficam SEMPRE visíveis aqui dentro — escondê-los atrás\n de um item \"Personalizado\" cobrava dois cliques para a coisa mais\n comum depois dos atalhos, e dentro do painel eles não custam barra\n nenhuma. Mexer em um deles já é escolher \"personalizado\". */}\n <div className=\"mt-1 space-y-1.5 border-t border-border px-2 pb-1 pt-2\">\n <label className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"w-8 shrink-0\">{labels?.from ?? 'From'}</span>\n <DatePicker\n value={from}\n onChange={(next) => { onPresetChange?.('custom'); onChange({ from: next, to }) }}\n variant=\"toolbar\"\n className=\"min-w-0 flex-1\"\n />\n </label>\n <label className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"w-8 shrink-0\">{labels?.to ?? 'To'}</span>\n <DatePicker\n value={to}\n onChange={(next) => { onPresetChange?.('custom'); onChange({ from, to: next }) }}\n variant=\"toolbar\"\n className=\"min-w-0 flex-1\"\n />\n </label>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown, Search, X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Checkbox } from './checkbox'\nimport { Dropdown, DropdownContent, DropdownTrigger } from './dropdown'\n\n// ---------------------------------------------------------------------------\n// Escolher VÁRIOS de uma lista longa.\n//\n// O `Select` escolhe um; o `SearchSelect` busca um; o `FilterChip` filtra por\n// um. Nenhum marca cinco serviços numa lista de duzentos, que é o que um\n// critério de regra pede — e por isso as telas que precisavam disso vinham\n// desenhando a sua própria caixa com `<input type=\"checkbox\">` cru.\n//\n// O VAZIO NÃO É \"NADA SELECIONADO\", é \"todos\". Em critério de regra, lista\n// vazia quer dizer \"vale para qualquer um\", e essa é a informação que o\n// operador mais erra: o gatilho diz `allLabel` em vez de ficar em branco,\n// porque um campo em branco parece esquecido e este está decidindo.\n// ---------------------------------------------------------------------------\n\nexport interface MultiSelectOption {\n value: string\n label: string\n hint?: string\n /** A cor da etiqueta, quando ela tem uma. Um ponto antes do nome é o que\n * deixa a lista ser LIDA em vez de percorrida: quem procura \"Coorte 3\"\n * entre trinta nomes parecidos acha pela cor antes de acabar de ler. */\n color?: string\n}\n\nexport interface MultiSelectProps {\n options: MultiSelectOption[]\n value: string[]\n onChange: (value: string[]) => void\n /** O que o gatilho diz quando nada está marcado — \"Todos os serviços\". */\n allLabel?: string\n searchPlaceholder?: string\n emptyLabel?: string\n disabled?: boolean\n className?: string\n /** Abaixo disto a busca não aparece: procurar entre seis é mais lento que ler. */\n searchThreshold?: number\n /**\n * Avisado a cada tecla da busca — para quem tem MAIS opções do que trouxe.\n *\n * Uma rede com 739 profissionais não manda as 739 para o navegador: manda as\n * primeiras e diz que truncou. A partir daí, filtrar só o que chegou responde\n * \"não existe\" para quem está na lista e não veio, que é a única resposta que\n * um filtro nunca pode dar errado. Com isto, quem chama vai ao servidor.\n *\n * Presente também força a caixa de busca a aparecer, independente do\n * `searchThreshold`: quem tem mais do que trouxe sempre precisa dela.\n */\n onSearchChange?: (query: string) => void\n /** Linha final de quem chama — \"buscando…\", \"+128 não listados\". */\n footer?: React.ReactNode\n /** `field` (padrão) é um campo de formulário: caixa com borda, largura\n * inteira, ao lado de outros campos. `chip` é uma pastilha de barra de\n * filtros, idêntica à do `FilterChip`.\n *\n * Existe porque numa barra de filtros o campo destoava: cinco pastilhas de\n * duas dezenas de pixels e, no meio delas, uma caixa com borda ocupando a\n * linha inteira. Lado a lado os dois não se leem como o mesmo tipo de\n * controle, e a barra passa a ter dois desenhos para uma coisa só. */\n variant?: 'field' | 'chip'\n /** Só em `chip`: o ícone à esquerda, como nas outras pastilhas da barra. */\n icon?: React.ComponentType<{ className?: string }>\n}\n\nexport function MultiSelect({\n options,\n value,\n onChange,\n allLabel = 'Todos',\n searchPlaceholder = 'Buscar…',\n emptyLabel = 'Nada encontrado',\n disabled,\n className,\n searchThreshold = 8,\n onSearchChange,\n footer,\n variant = 'field',\n icon: Icon,\n}: MultiSelectProps) {\n const [query, setQuery] = React.useState('')\n const selected = React.useMemo(() => new Set(value), [value])\n\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [options, query])\n\n function toggle(v: string) {\n onChange(selected.has(v) ? value.filter((x) => x !== v) : [...value, v])\n }\n\n // O rótulo do gatilho: um nome quando é um, \"N selecionados\" quando é mais.\n // Emendar cinco nomes cabe em nenhum botão e trunca no meio da terceira\n // palavra, que não informa nem o nome nem a quantidade.\n const label =\n value.length === 0\n ? allLabel\n : value.length === 1\n ? (options.find((o) => o.value === value[0])?.label ?? '1 selecionado')\n : `${value.length} selecionados`\n\n return (\n <Dropdown>\n <DropdownTrigger asChild disabled={disabled}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={allLabel}\n className={cn(\n 'disabled:cursor-not-allowed disabled:opacity-50',\n variant === 'chip'\n // Os mesmos valores do FilterChip, não valores parecidos: uma\n // pastilha a 2px de altura de diferença da vizinha lê como\n // desalinho, que é pior do que uma diferença assumida.\n ? cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors',\n value.length > 0\n ? 'border-primary/30 bg-primary/10 text-primary hover:bg-primary/15'\n : 'border-transparent bg-muted/70 text-muted-foreground hover:bg-muted hover:text-foreground',\n )\n : cn(\n 'flex h-9 w-full items-center justify-between gap-2 rounded-input border border-input bg-card px-3 py-1.5 text-xs',\n 'shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] transition-colors hover:bg-muted/40',\n value.length === 0 && 'text-muted-foreground',\n ),\n className,\n )}\n >\n {variant === 'chip' && Icon && <Icon className=\"h-3 w-3 shrink-0 opacity-70\" />}\n <span className={cn('min-w-0 truncate', variant === 'chip' && 'max-w-[12rem]')}>{label}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {value.length > 0 && (\n // Limpar dentro do gatilho: a alternativa é desmarcar cinco itens\n // um a um para voltar a \"todos\", e é o caminho de volta mais\n // comum de todos.\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Limpar seleção\"\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onChange([]) }}\n className=\"rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </span>\n )}\n <ChevronDown className={cn('shrink-0', variant === 'chip' ? 'h-3 w-3 opacity-60' : 'h-3.5 w-3.5 opacity-50')} />\n </span>\n </button>\n </DropdownTrigger>\n\n <DropdownContent\n align=\"start\"\n className={cn(\n 'p-0',\n // Em `field` o painel casa com o campo, que é largo. Em `chip` a\n // largura do gatilho é a do rótulo — herdá-la daria uma lista de\n // dois dedos. Aqui ele ganha a sua própria medida de leitura.\n variant === 'chip'\n ? 'w-[min(16rem,calc(100vw-1.5rem))]'\n : 'w-[--radix-dropdown-menu-trigger-width]',\n )}\n >\n {(options.length >= searchThreshold || !!onSearchChange) && (\n <div className=\"flex items-center gap-2 border-b px-2 py-1.5\">\n <Search className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n value={query}\n onChange={(e) => { setQuery(e.target.value); onSearchChange?.(e.target.value) }}\n placeholder={searchPlaceholder}\n // Radix move o foco para o item ao teclar; sem isto a busca perde\n // o cursor na primeira letra e some com o que já foi digitado.\n onKeyDown={(e) => e.stopPropagation()}\n className=\"w-full bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </div>\n )}\n\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-xs text-muted-foreground\">{emptyLabel}</p>\n ) : (\n filtered.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n // `onSelect` do Radix fecha o menu a cada clique, e marcar cinco\n // itens viraria abrir-marcar-abrir cinco vezes.\n onClick={(e) => { e.preventDefault(); toggle(o.value) }}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors hover:bg-muted\"\n >\n <Checkbox checked={selected.has(o.value)} onChange={() => toggle(o.value)} />\n {o.color && (\n <span\n aria-hidden\n className=\"h-2 w-2 shrink-0 rounded-full ring-1 ring-inset ring-black/10\"\n style={{ backgroundColor: o.color }}\n />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{o.label}</span>\n {o.hint && <span className=\"shrink-0 text-[10px] text-muted-foreground\">{o.hint}</span>}\n </button>\n ))\n )}\n {footer}\n </div>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import * as React from 'react'\nimport { ChevronDown, Search, X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Checkbox } from './checkbox'\nimport { Dropdown, DropdownContent, DropdownTrigger } from './dropdown'\n\n// ---------------------------------------------------------------------------\n// Escolher GENTE.\n//\n// Um profissional, um responsável, um vendedor, quem recebe a tarefa — toda\n// tela do produto escolhe uma pessoa em algum momento, e cada uma vinha\n// desenhando a sua própria caixa: a agenda tinha um dropdown feito à mão com\n// nomes crus, os filtros tinham um `MultiSelect` genérico, a grade de horários\n// tinha uma terceira lista. Três desenhos para a mesma pergunta.\n//\n// Pessoa não é string. Um `Select` de texto é o desenho certo para \"status\" e o\n// errado para \"quem\": entre \"Ana Caroline Neves Domingos\" e \"Ana Luiza Vilas\n// Bôas\" o que distingue em meio segundo é o ROSTO, não a segunda palavra. Por\n// isso o retrato vem na esquerda e o nome inteiro fica ao lado dele — e quem\n// não tem foto ganha as iniciais num tom derivado do próprio nome, para que a\n// ausência de foto continue sendo um sinal estável e não um borrão igual para\n// todo mundo.\n//\n// Duas portas sobre o mesmo desenho: `PersonPicker` escolhe UMA e\n// `PersonMultiPicker` escolhe VÁRIAS. A diferença é a caixinha à esquerda e o\n// que o gatilho diz — o resto (busca, retrato, dica à direita, truncagem) é o\n// mesmo, de propósito.\n// ---------------------------------------------------------------------------\n\nexport interface PersonOption {\n id: string\n name: string\n /** Retrato. Sem ele o lugar continua ocupado, com as iniciais. */\n avatarUrl?: string | null\n /** Linha secundária sob o nome — o cargo, a unidade, a sala. */\n subtitle?: string | null\n /** Selo à direita da linha — \"sem grade\", \"de férias\", \"3 hoje\". */\n hint?: string | null\n disabled?: boolean\n}\n\nexport type PersonAvatarSize = 'xs' | 'sm' | 'md' | 'lg'\n\nconst AVATAR_SIZE: Record<PersonAvatarSize, string> = {\n xs: 'h-5 w-5 text-[9px]',\n sm: 'h-6 w-6 text-[10px]',\n md: 'h-8 w-8 text-xs',\n lg: 'h-10 w-10 text-sm',\n}\n\n/**\n * As iniciais de \"Ana Caroline Neves Domingos\" são AD, não AC.\n *\n * Primeira letra do primeiro nome e primeira do último sobrenome: é o mesmo par\n * que a pessoa usa para se apresentar, e é o que separa duas Anas. Pegar as\n * duas primeiras palavras devolve \"AC\" e \"AL\" para a Ana Caroline e a Ana\n * Luiza, que é exatamente o par que mais precisa ser distinguido.\n */\nexport function personInitials(name: string): string {\n // Só o que é LETRA vira inicial. Um cadastro chamado \"Espaço Facial\n // (legado)\" tem a última palavra entre parênteses, e a inicial dela é \"(\" —\n // um par \"E(\" num círculo colorido lê como defeito de renderização.\n const parts = name\n .trim()\n .split(/\\s+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, ''))\n .filter(Boolean)\n if (parts.length === 0) return '?'\n const particles = new Set(['de', 'da', 'do', 'das', 'dos', 'e', 'del', 'di', 'du', 'van', 'von'])\n const first = parts[0]\n const rest = parts.slice(1).filter((w) => !particles.has(w.toLowerCase()))\n const second = rest.length > 0 ? rest[rest.length - 1].charAt(0) : first.charAt(1)\n return (first.charAt(0) + (second ?? '')).toUpperCase()\n}\n\n// Seis matizes bem separados no círculo. O tom sai do NOME, então a mesma\n// pessoa tem sempre a mesma cor em toda tela do produto — a cor vira parte de\n// como se reconhece alguém, e não enfeite aleatório por renderização.\nconst AVATAR_HUES = [210, 340, 150, 35, 265, 190]\n\nfunction hueFor(name: string): number {\n let h = 0\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0\n return AVATAR_HUES[h % AVATAR_HUES.length]\n}\n\nexport interface PersonAvatarProps {\n name: string\n src?: string | null\n size?: PersonAvatarSize\n className?: string\n}\n\n/** O retrato de alguém — foto quando existe, iniciais coloridas quando não. */\nexport function PersonAvatar({ name, src, size = 'sm', className }: PersonAvatarProps) {\n // Uma URL que dá 404 é a mesma situação de não ter URL, e só o navegador\n // descobre: sem isto a linha fica com o ícone de imagem quebrada para sempre.\n const [failed, setFailed] = React.useState(false)\n React.useEffect(() => { setFailed(false) }, [src])\n\n const base = cn('shrink-0 overflow-hidden rounded-full', AVATAR_SIZE[size], className)\n\n if (src && !failed) {\n return (\n <img\n src={src}\n alt=\"\"\n onError={() => setFailed(true)}\n className={cn(base, 'object-cover')}\n />\n )\n }\n\n const hue = hueFor(name)\n return (\n <span\n aria-hidden\n className={cn(base, 'flex items-center justify-center font-semibold leading-none')}\n style={{\n backgroundColor: `hsl(${hue} 62% 92%)`,\n color: `hsl(${hue} 55% 32%)`,\n }}\n >\n {personInitials(name)}\n </span>\n )\n}\n\n// ---------------------------------------------------------------------------\n\ninterface ListShellProps {\n options: PersonOption[]\n query: string\n setQuery: (q: string) => void\n onSearchChange?: (q: string) => void\n searchPlaceholder: string\n emptyLabel: string\n showSearch: boolean\n footer?: React.ReactNode\n children: (option: PersonOption) => React.ReactNode\n}\n\nfunction ListShell({\n options, query, setQuery, onSearchChange, searchPlaceholder, emptyLabel, showSearch, footer, children,\n}: ListShellProps) {\n const filtered = React.useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return options\n return options.filter((o) => o.name.toLowerCase().includes(q))\n }, [options, query])\n\n return (\n <>\n {showSearch && (\n <div className=\"flex items-center gap-2 border-b px-2.5 py-2\">\n <Search className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n value={query}\n onChange={(e) => { setQuery(e.target.value); onSearchChange?.(e.target.value) }}\n placeholder={searchPlaceholder}\n // O Radix move o foco para o item ao teclar; sem isto a busca perde\n // o cursor na primeira letra e some com o que já foi digitado.\n onKeyDown={(e) => e.stopPropagation()}\n className=\"w-full bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </div>\n )}\n <div className=\"max-h-72 overflow-y-auto py-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-5 text-center text-xs text-muted-foreground\">{emptyLabel}</p>\n ) : (\n filtered.map((o) => <React.Fragment key={o.id}>{children(o)}</React.Fragment>)\n )}\n {footer}\n </div>\n </>\n )\n}\n\n/** A linha: retrato, nome (e cargo), selo. O mesmo desenho nas duas portas. */\nfunction PersonRow({ option, size = 'sm' }: { option: PersonOption; size?: PersonAvatarSize }) {\n return (\n <>\n <PersonAvatar name={option.name} src={option.avatarUrl} size={size} />\n <span className=\"min-w-0 flex-1 text-left\">\n <span className=\"block truncate\">{option.name}</span>\n {option.subtitle && (\n <span className=\"block truncate text-[10px] text-muted-foreground\">{option.subtitle}</span>\n )}\n </span>\n {option.hint && <span className=\"shrink-0 text-[10px] text-muted-foreground\">{option.hint}</span>}\n </>\n )\n}\n\n/**\n * Duas roupas para o mesmo gatilho.\n *\n * `input` é o campo de formulário: tem moldura porque está numa coluna de\n * campos e precisa parecer um. `inline` é o que mora DENTRO de uma linha já\n * cheia — a faixa de hora do agendamento, o cabeçalho de um cartão — onde uma\n * segunda moldura só acrescenta ruído; ali o retrato e a setinha já dizem que\n * aquilo abre.\n */\nexport type PersonPickerVariant = 'input' | 'inline'\n\nconst TRIGGER_CLASSES: Record<PersonPickerVariant, string> = {\n input:\n 'flex h-9 w-full items-center justify-between gap-2 rounded-input border border-input bg-card px-2.5 py-1.5 text-xs ' +\n 'shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] transition-colors hover:bg-muted/40 disabled:cursor-not-allowed disabled:opacity-50',\n inline:\n 'flex w-full items-center justify-between gap-2 rounded-button px-1.5 py-1 text-xs ' +\n 'transition-colors hover:bg-muted/50 disabled:cursor-not-allowed disabled:opacity-50',\n}\n\n// ---------------------------------------------------------------------------\n// UMA pessoa\n// ---------------------------------------------------------------------------\n\nexport interface PersonPickerProps {\n options: PersonOption[]\n value: string | null | undefined\n onChange: (id: string) => void\n placeholder?: string\n searchPlaceholder?: string\n emptyLabel?: string\n disabled?: boolean\n className?: string\n /** Abaixo disto a busca não aparece: procurar entre seis é mais lento que ler. */\n searchThreshold?: number\n /** Presente = existe quem escolher que não veio na lista; ver `MultiSelect`. */\n onSearchChange?: (query: string) => void\n footer?: React.ReactNode\n /** Deixa desfazer a escolha. Fora por padrão: a maioria dos campos é obrigatória. */\n clearable?: boolean\n onClear?: () => void\n variant?: PersonPickerVariant\n}\n\nexport function PersonPicker({\n options,\n value,\n onChange,\n placeholder = 'Selecionar pessoa…',\n searchPlaceholder = 'Buscar pessoa…',\n emptyLabel = 'Ninguém encontrado',\n disabled,\n className,\n searchThreshold = 8,\n onSearchChange,\n footer,\n clearable,\n onClear,\n variant = 'input',\n}: PersonPickerProps) {\n const [query, setQuery] = React.useState('')\n const [open, setOpen] = React.useState(false)\n const current = options.find((o) => o.id === value)\n\n return (\n <Dropdown open={open} onOpenChange={setOpen}>\n <DropdownTrigger asChild disabled={disabled}>\n <button type=\"button\" disabled={disabled} className={cn(TRIGGER_CLASSES[variant], className)}>\n {current ? (\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n <PersonAvatar name={current.name} src={current.avatarUrl} size=\"sm\" />\n <span className=\"min-w-0 truncate\">{current.name}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-left text-muted-foreground\">{placeholder}</span>\n )}\n <span className=\"flex shrink-0 items-center gap-1\">\n {clearable && current && (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Limpar seleção\"\n // Ver o X do PersonMultiPicker abaixo: o pointerdown do Radix\n // mata o click que viria depois.\n onPointerDown={(e) => { e.preventDefault(); e.stopPropagation(); onClear?.() }}\n onClick={(e) => { e.preventDefault(); e.stopPropagation() }}\n className=\"rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </span>\n )}\n <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n </span>\n </button>\n </DropdownTrigger>\n\n <DropdownContent align=\"start\" className=\"w-[--radix-dropdown-menu-trigger-width] min-w-[17rem] p-0\">\n <ListShell\n options={options}\n query={query}\n setQuery={setQuery}\n onSearchChange={onSearchChange}\n searchPlaceholder={searchPlaceholder}\n emptyLabel={emptyLabel}\n showSearch={options.length >= searchThreshold || !!onSearchChange}\n footer={footer}\n >\n {(o) => (\n <button\n type=\"button\"\n disabled={o.disabled}\n onClick={() => { onChange(o.id); setOpen(false) }}\n className={cn(\n 'flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors hover:bg-muted',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n o.id === value && 'bg-muted/60',\n )}\n >\n <PersonRow option={o} />\n </button>\n )}\n </ListShell>\n </DropdownContent>\n </Dropdown>\n )\n}\n\n// ---------------------------------------------------------------------------\n// VÁRIAS pessoas\n// ---------------------------------------------------------------------------\n\nexport interface PersonMultiPickerProps {\n options: PersonOption[]\n value: string[]\n onChange: (ids: string[]) => void\n /** O que o gatilho diz com nada marcado. Vazio quer dizer TODOS, como no `MultiSelect`. */\n allLabel?: string\n searchPlaceholder?: string\n emptyLabel?: string\n disabled?: boolean\n className?: string\n searchThreshold?: number\n onSearchChange?: (query: string) => void\n footer?: React.ReactNode\n /** Teto de marcados ao mesmo tempo; acima dele as caixas vazias travam. */\n max?: number\n variant?: PersonPickerVariant\n}\n\nexport function PersonMultiPicker({\n options,\n value,\n onChange,\n allLabel = 'Todos',\n searchPlaceholder = 'Buscar pessoa…',\n emptyLabel = 'Ninguém encontrado',\n disabled,\n className,\n searchThreshold = 8,\n onSearchChange,\n footer,\n max,\n variant = 'input',\n}: PersonMultiPickerProps) {\n const [query, setQuery] = React.useState('')\n const selected = React.useMemo(() => new Set(value), [value])\n const atCeiling = max != null && value.length >= max\n\n function toggle(id: string) {\n if (selected.has(id)) onChange(value.filter((x) => x !== id))\n else if (!atCeiling) onChange([...value, id])\n }\n\n // Um nome quando é um, \"N selecionados\" quando é mais: emendar cinco nomes\n // não cabe em botão nenhum e trunca no meio da terceira palavra, que não\n // informa nem o nome nem a quantidade.\n const first = value.length === 1 ? options.find((o) => o.id === value[0]) : undefined\n const label =\n value.length === 0 ? allLabel\n : value.length === 1 ? (first?.name ?? '1 selecionado')\n : `${value.length} selecionados`\n\n return (\n <Dropdown>\n <DropdownTrigger asChild disabled={disabled}>\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(TRIGGER_CLASSES[variant], value.length === 0 && 'text-muted-foreground', className)}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {first && <PersonAvatar name={first.name} src={first.avatarUrl} size=\"sm\" />}\n <span className=\"min-w-0 truncate text-left\">{label}</span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {value.length > 0 && (\n // Limpar dentro do gatilho: a alternativa é desmarcar cinco itens\n // um a um para voltar a \"todos\", e é o caminho de volta mais\n // comum de todos.\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Limpar seleção\"\n // No POINTERDOWN, não no click.\n //\n // O gatilho do menu é do Radix, e ele chama `preventDefault()`\n // no pointerdown para segurar o foco — o que mata o evento de\n // `click` que viria depois. O X desenhava, o cursor virava\n // mãozinha, e clicar nele só abria a lista: a única forma de\n // voltar para \"todos\" era desmarcar um por um.\n onPointerDown={(e) => { e.preventDefault(); e.stopPropagation(); onChange([]) }}\n onClick={(e) => { e.preventDefault(); e.stopPropagation() }}\n className=\"rounded-full p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </span>\n )}\n <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n </span>\n </button>\n </DropdownTrigger>\n\n <DropdownContent align=\"start\" className=\"w-[--radix-dropdown-menu-trigger-width] min-w-[17rem] p-0\">\n <ListShell\n options={options}\n query={query}\n setQuery={setQuery}\n onSearchChange={onSearchChange}\n searchPlaceholder={searchPlaceholder}\n emptyLabel={emptyLabel}\n showSearch={options.length >= searchThreshold || !!onSearchChange}\n footer={footer}\n >\n {(o) => {\n const checked = selected.has(o.id)\n // No teto, o que trava é a caixa VAZIA: desmarcar tem que continuar\n // possível, senão a única saída de um teto cheio é o \"limpar\".\n const blocked = o.disabled || (!checked && atCeiling)\n return (\n <button\n type=\"button\"\n disabled={blocked}\n // `onSelect` do Radix fecha o menu a cada clique, e marcar cinco\n // itens viraria abrir-marcar-abrir cinco vezes.\n onClick={(e) => { e.preventDefault(); toggle(o.id) }}\n className={cn(\n 'flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors hover:bg-muted',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n >\n <Checkbox checked={checked} disabled={blocked} onChange={() => toggle(o.id)} tabIndex={-1} />\n <PersonRow option={o} />\n </button>\n )\n }}\n </ListShell>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import * as React from 'react'\nimport { Mic, MicOff } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Ditar em vez de digitar.\n//\n// Quem registra um contato costuma estar a sair de um — no corredor, entre uma\n// mesa e outra, com o telefone numa mão. Digitar três linhas ali é o que faz a\n// nota não ser escrita, e uma nota não escrita é a informação perdida: foi\n// exatamente o que aconteceu na feira, onde a equipa gravou áudios e os\n// transcreveu depois, à mão, para dentro de um campo de texto.\n//\n// ── por que a API do NAVEGADOR e não uma transcrição no servidor ──────────\n//\n// Um gravador que sobe o ficheiro e espera a transcrição precisa de bucket,\n// política, fila e de um estado \"a transcrever\" que alguém tem de ver. E,\n// sobretudo, precisa de o áudio SAIR do dispositivo — o que numa conversa de\n// vendas é dado de terceiro.\n//\n// `SpeechRecognition` resolve o caso comum sem nada disso: o texto aparece\n// enquanto se fala, nada é gravado, nada é enviado por nós. O que se perde é\n// suporte universal (Chrome e Edge têm; Firefox não) — e é por isso que o\n// botão SOME quando não há suporte, em vez de aparecer e falhar ao clicar.\n//\n// Quando houver caso para áudio arquivado e transcrição de servidor, é outro\n// controle, ao lado deste, e não este a fingir que faz as duas coisas.\n// ---------------------------------------------------------------------------\n\n/** O que o navegador expõe, na fatia que este módulo usa. O tipo completo não\n * está no lib.dom de todas as versões de TS, e depender dele prenderia o\n * pacote a uma. */\ninterface RecognitionLike {\n lang: string\n continuous: boolean\n interimResults: boolean\n start(): void\n stop(): void\n onresult: ((e: any) => void) | null\n onerror: ((e: any) => void) | null\n onend: (() => void) | null\n}\n\nfunction recognitionCtor(): (new () => RecognitionLike) | null {\n if (typeof window === 'undefined') return null\n const w = window as any\n return w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null\n}\n\nexport interface DictateButtonProps {\n /** Recebe o texto RECONHECIDO ATÉ AGORA nesta sessão de ditado.\n *\n * O texto acumulado e não só o pedaço novo: o motor corrige o que já disse\n * quando a frase avança (\"dois\" vira \"doze\" ao ouvir o resto), e quem só\n * concatena pedaços fica com o engano colado no meio da nota. */\n onTranscript: (texto: string) => void\n /** BCP-47. O padrão segue o idioma da página. */\n lang?: string\n /** Rótulos — este pacote não fala com o dicionário. */\n startLabel?: string\n stopLabel?: string\n className?: string\n disabled?: boolean\n}\n\nexport function DictateButton({\n onTranscript,\n lang,\n startLabel = 'Ditar',\n stopLabel = 'Parar de ditar',\n className,\n disabled,\n}: DictateButtonProps) {\n const [ouvindo, setOuvindo] = React.useState(false)\n const [erro, setErro] = React.useState<string | null>(null)\n const ref = React.useRef<RecognitionLike | null>(null)\n\n // Decidido UMA vez, no cliente: `recognitionCtor()` toca em `window`, e\n // chamá-lo durante o render do servidor rebentaria a página inteira por um\n // botão.\n const [suportado, setSuportado] = React.useState(false)\n React.useEffect(() => { setSuportado(recognitionCtor() !== null) }, [])\n\n // Parar ao desmontar. Sem isto o microfone fica aberto depois de o modal\n // fechar — o indicador do navegador continua vermelho e ninguém liga aquilo\n // a esta tela.\n React.useEffect(() => () => { ref.current?.stop() }, [])\n\n const alternar = React.useCallback(() => {\n if (ouvindo) { ref.current?.stop(); return }\n\n const Ctor = recognitionCtor()\n if (!Ctor) return\n const rec = new Ctor()\n // O idioma da página, e não uma constante: um app em inglês ditado com\n // `pt-BR` transcreve fonemas para as palavras erradas.\n const doPagina = typeof document !== 'undefined' ? document.documentElement.lang : ''\n rec.lang = lang ?? (doPagina || 'pt-BR')\n // `continuous`: uma nota tem mais de uma frase, e o padrão pára na\n // primeira pausa. `interimResults`: ver o texto a aparecer é o que diz que\n // está a ouvir — sem isso o botão fica aceso e a caixa vazia.\n rec.continuous = true\n rec.interimResults = true\n\n rec.onresult = (e: any) => {\n let texto = ''\n for (let i = 0; i < e.results.length; i++) texto += e.results[i][0].transcript\n onTranscript(texto)\n }\n rec.onerror = (e: any) => {\n // `no-speech` e `aborted` são o normal de quem clicou e não falou, ou\n // parou. Pintar isso de vermelho ensina a pessoa a ignorar o aviso.\n if (e?.error && e.error !== 'no-speech' && e.error !== 'aborted') setErro(String(e.error))\n setOuvindo(false)\n }\n rec.onend = () => setOuvindo(false)\n\n ref.current = rec\n setErro(null)\n try { rec.start(); setOuvindo(true) } catch { setOuvindo(false) }\n }, [ouvindo, lang, onTranscript])\n\n if (!suportado) return null\n\n return (\n <button\n type=\"button\"\n onClick={alternar}\n disabled={disabled}\n aria-pressed={ouvindo}\n aria-label={ouvindo ? stopLabel : startLabel}\n title={erro ? `${startLabel} — ${erro}` : ouvindo ? stopLabel : startLabel}\n className={cn(\n 'fz-tap inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors',\n ouvindo\n // Pulsa enquanto ouve. Um microfone ligado sem sinal na tela é a\n // forma de alguém falar meio minuto para uma caixa que não grava.\n ? 'animate-pulse bg-destructive/10 text-destructive hover:bg-destructive/15'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n className,\n )}\n >\n {ouvindo ? <MicOff className=\"h-3.5 w-3.5\" /> : <Mic className=\"h-3.5 w-3.5\" />}\n </button>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n/**\n * Minimal markdown renderer — builds React elements directly (no HTML string,\n * no dangerouslySetInnerHTML), so untrusted content is safe by construction.\n * Supports the subset content docs actually use: h1–h3, ---, blockquote,\n * ul/ol, paragraphs, and inline **bold** / *italic* / `code`.\n */\n\nconst INLINE_TOKEN = /(\\*\\*[^*]+\\*\\*|\\*[^*]+\\*|`[^`]+`)/g\n\nfunction renderInline(text: string, keyPrefix: string): React.ReactNode[] {\n return text.split(INLINE_TOKEN).map((part, i) => {\n const key = `${keyPrefix}-${i}`\n if (part.startsWith('**') && part.endsWith('**') && part.length > 4) {\n return <strong key={key}>{part.slice(2, -2)}</strong>\n }\n if (part.startsWith('*') && part.endsWith('*') && part.length > 2) {\n return <em key={key}>{part.slice(1, -1)}</em>\n }\n if (part.startsWith('`') && part.endsWith('`') && part.length > 2) {\n return (\n <code key={key} className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.85em]\">\n {part.slice(1, -1)}\n </code>\n )\n }\n return part === '' ? null : <React.Fragment key={key}>{part}</React.Fragment>\n })\n}\n\ntype Block =\n | { type: 'heading'; level: 1 | 2 | 3; text: string }\n | { type: 'hr' }\n | { type: 'blockquote'; lines: string[] }\n | { type: 'ul'; items: string[] }\n | { type: 'ol'; items: string[] }\n | { type: 'p'; lines: string[] }\n\nfunction parseBlocks(source: string): Block[] {\n const lines = source.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: Block[] = []\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n const trimmed = line.trim()\n if (trimmed === '') { i++; continue }\n const heading = /^(#{1,3})\\s+(.*)$/.exec(trimmed)\n if (heading) {\n blocks.push({ type: 'heading', level: heading[1].length as 1 | 2 | 3, text: heading[2] })\n i++\n continue\n }\n if (/^(-{3,}|\\*{3,})$/.test(trimmed)) {\n blocks.push({ type: 'hr' })\n i++\n continue\n }\n if (trimmed.startsWith('>')) {\n const quote: string[] = []\n while (i < lines.length && lines[i].trim().startsWith('>')) {\n quote.push(lines[i].trim().replace(/^>\\s?/, ''))\n i++\n }\n blocks.push({ type: 'blockquote', lines: quote })\n continue\n }\n if (/^[-*]\\s+/.test(trimmed)) {\n const items: string[] = []\n while (i < lines.length && /^[-*]\\s+/.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^[-*]\\s+/, ''))\n i++\n }\n blocks.push({ type: 'ul', items })\n continue\n }\n if (/^\\d+[.)]\\s+/.test(trimmed)) {\n const items: string[] = []\n while (i < lines.length && /^\\d+[.)]\\s+/.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^\\d+[.)]\\s+/, ''))\n i++\n }\n blocks.push({ type: 'ol', items })\n continue\n }\n const para: string[] = []\n while (i < lines.length && lines[i].trim() !== '' && !/^(#{1,3}\\s|>|[-*]\\s|\\d+[.)]\\s|-{3,}$|\\*{3,}$)/.test(lines[i].trim())) {\n para.push(lines[i].trim())\n i++\n }\n blocks.push({ type: 'p', lines: para })\n }\n return blocks\n}\n\nconst HEADING_CLASS: Record<1 | 2 | 3, string> = {\n 1: 'text-xl font-semibold tracking-tight',\n 2: 'text-base font-semibold tracking-tight',\n 3: 'text-sm font-semibold',\n}\n\nexport function renderMarkdown(source: string): React.ReactNode {\n const blocks = parseBlocks(source)\n return blocks.map((block, bi) => {\n const key = `md-${bi}`\n switch (block.type) {\n case 'heading': {\n const Tag = (`h${block.level}`) as 'h1' | 'h2' | 'h3'\n return (\n <Tag key={key} className={HEADING_CLASS[block.level]}>\n {renderInline(block.text, key)}\n </Tag>\n )\n }\n case 'hr':\n return <hr key={key} className=\"border-border\" />\n case 'blockquote':\n return (\n <blockquote key={key} className=\"border-l-2 border-border pl-3 text-muted-foreground\">\n {block.lines.map((l, li) => (\n <p key={`${key}-${li}`}>{renderInline(l, `${key}-${li}`)}</p>\n ))}\n </blockquote>\n )\n case 'ul':\n return (\n <ul key={key} className=\"list-disc space-y-1 pl-5\">\n {block.items.map((item, li) => (\n <li key={`${key}-${li}`}>{renderInline(item, `${key}-${li}`)}</li>\n ))}\n </ul>\n )\n case 'ol':\n return (\n <ol key={key} className=\"list-decimal space-y-1 pl-5\">\n {block.items.map((item, li) => (\n <li key={`${key}-${li}`}>{renderInline(item, `${key}-${li}`)}</li>\n ))}\n </ol>\n )\n case 'p':\n return (\n <p key={key}>\n {block.lines.map((l, li) => (\n <React.Fragment key={`${key}-${li}`}>\n {li > 0 && <br />}\n {renderInline(l, `${key}-${li}`)}\n </React.Fragment>\n ))}\n </p>\n )\n }\n })\n}\n\nexport interface MarkdownProps {\n source: string\n className?: string\n}\n\n/** Rendered markdown block — spacing tuned for script/brief documents. */\nexport function Markdown({ source, className }: MarkdownProps) {\n return (\n <div className={cn('space-y-3 text-sm leading-relaxed text-foreground', className)}>\n {renderMarkdown(source)}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\nimport { SegmentedControl } from './segmented-control'\nimport { Markdown } from './markdown'\n\nexport interface MarkdownEditorProps {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n /** Minimum visible rows for the textarea. */\n minRows?: number\n defaultMode?: 'edit' | 'preview'\n /** i18n injection — ui stays locale-agnostic. */\n editLabel?: string\n previewLabel?: string\n /** Custom preview renderer — e.g. a social-post mockup instead of plain\n * markdown. Defaults to the built-in Markdown renderer. */\n renderPreview?: (value: string) => React.ReactNode\n className?: string\n}\n\n/**\n * Markdown editor with an edit/preview toggle. Plain textarea + the zero-dep\n * Markdown renderer — deliberately not a block/WYSIWYG editor (that's a later\n * milestone); this covers script/brief documents today.\n */\nexport function MarkdownEditor({\n value,\n onChange,\n placeholder,\n minRows = 16,\n defaultMode = 'preview',\n editLabel = 'Edit',\n previewLabel = 'Preview',\n renderPreview,\n className,\n}: MarkdownEditorProps) {\n const [mode, setMode] = React.useState<'edit' | 'preview'>(\n defaultMode === 'preview' && value.trim() === '' ? 'edit' : defaultMode,\n )\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <div className=\"flex justify-end\">\n <SegmentedControl\n aria-label=\"Markdown mode\"\n options={[\n { value: 'edit', label: editLabel },\n { value: 'preview', label: previewLabel },\n ]}\n value={mode}\n onChange={(m) => setMode(m as 'edit' | 'preview')}\n />\n </div>\n {mode === 'edit' ? (\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n rows={Math.max(minRows, value.split('\\n').length + 1)}\n className={cn(\n 'w-full resize-y rounded-md border border-border bg-card p-3',\n 'font-mono text-[13px] leading-relaxed text-foreground',\n 'placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring',\n )}\n />\n ) : renderPreview ? (\n renderPreview(value)\n ) : (\n <div className=\"rounded-md border border-border bg-card p-4\">\n <Markdown source={value} />\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, Plus, ChevronDown } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Reusable search combobox with keyboard navigation + optional create\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOption {\n id: string\n label: string\n subtitle?: string\n price?: number\n data?: Record<string, unknown>\n}\n\ninterface SearchComboboxProps {\n value: string\n onChange: (value: string) => void\n onSelect: (option: ComboboxOption) => void\n options: ComboboxOption[]\n placeholder?: string\n autoFocus?: boolean\n onBlurEmpty?: () => void\n renderRight?: (option: ComboboxOption) => React.ReactNode\n /** Show a \"+ Create ...\" option when search has no exact match */\n allowCreate?: boolean\n /** Called when user clicks the create option. Receives the current search text. */\n onCreateNew?: (searchText: string) => void\n /** Label for the create option (default: 'Create') */\n createLabel?: string\n className?: string\n /** Minimal style — no border/bg, just underline on focus. For inline use. */\n minimal?: boolean\n /** Inline label shown when collapsed. Click reveals the search input. */\n inlineLabel?: string\n /** Icon for the inline label: 'search' (default) or 'plus' (for \"add\" actions) */\n inlineIcon?: 'search' | 'plus'\n /** Show a loading skeleton in the dropdown while results are being fetched */\n loading?: boolean\n /** Called when the input gains focus */\n onFocus?: () => void\n /**\n * Chevron on the right edge. A borderless combobox reads as free text: the\n * arrow is what says the field picks from a list, same as the selects it\n * sits next to. Clicking it focuses the input, which opens the list.\n */\n chevron?: boolean\n /** Marks the input `aria-required` — the visible mark belongs to the host row. */\n required?: boolean\n}\n\nexport function SearchCombobox({\n value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty,\n renderRight, allowCreate, onCreateNew, createLabel = 'Create', className, minimal, inlineLabel, inlineIcon = 'search',\n loading, onFocus: onFocusProp, chevron, required,\n}: SearchComboboxProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(-1)\n const [expanded, setExpanded] = useState(!inlineLabel)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n // When value is set externally (e.g. edit mode), auto-expand; collapse when cleared\n useEffect(() => {\n if (value && inlineLabel) setExpanded(true)\n if (!value && inlineLabel && !open) setExpanded(false)\n }, [value, open])\n\n function updateRect() {\n if (wrapperRef.current) setDropRect(wrapperRef.current.getBoundingClientRect())\n }\n\n // Show create option only when dropdown is open, has text, and no exact match\n const showCreate = open && allowCreate && onCreateNew && value.trim().length > 0 &&\n !options.some((o) => o.label.toLowerCase() === value.trim().toLowerCase())\n\n const totalItems = options.length + (showCreate ? 1 : 0)\n\n useEffect(() => { setActiveIndex(-1) }, [options])\n useEffect(() => {\n if ((options.length > 0 || showCreate || loading) && document.activeElement === inputRef.current) setOpen(true)\n }, [options, showCreate, loading])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!open || totalItems === 0) {\n if (e.key === 'ArrowDown' && totalItems > 0) {\n e.preventDefault()\n setOpen(true)\n setActiveIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % totalItems)\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1))\n break\n case 'Enter':\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < options.length) {\n onSelect(options[activeIndex])\n setOpen(false)\n setActiveIndex(-1)\n } else if (showCreate && activeIndex === options.length) {\n onCreateNew?.(value.trim())\n setOpen(false)\n setActiveIndex(-1)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n setActiveIndex(-1)\n break\n }\n }, [open, options, totalItems, activeIndex, onSelect, showCreate, onCreateNew, value])\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return\n const items = listRef.current.children\n if (items[activeIndex]) (items[activeIndex] as HTMLElement).scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n function handleBlur() {\n setTimeout(() => {\n setOpen(false)\n setActiveIndex(-1)\n if (!value && onBlurEmpty) onBlurEmpty()\n if (!value && inlineLabel) setExpanded(false)\n }, 200)\n }\n\n const hasDropdown = open && (options.length > 0 || showCreate || loading)\n\n // Collapsed inline label — click to expand\n if (!expanded && inlineLabel) {\n const isPlus = inlineIcon === 'plus'\n return (\n <button type=\"button\" onClick={() => { setExpanded(true); setTimeout(() => inputRef.current?.focus(), 50) }}\n className={`flex items-center gap-1.5 w-full text-left text-sm py-1.5 pl-2 ${chevron ? 'pr-2' : ''} transition-colors ${\n isPlus ? 'text-primary hover:text-primary/80' : 'text-muted-foreground hover:text-foreground'\n } ${className ?? ''}`}>\n {isPlus && <Plus className=\"h-3.5 w-3.5 shrink-0\" />}\n {inlineLabel}\n {chevron && <ChevronDown className=\"ml-auto h-3 w-3 shrink-0 text-muted-foreground\" />}\n </button>\n )\n }\n\n return (\n <div ref={wrapperRef} className={`relative ${className ?? ''}`}>\n {!minimal && (\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => { onChange(e.target.value); updateRect(); setOpen(true) }}\n onFocus={() => { updateRect(); onFocusProp?.(); if (options.length > 0 || showCreate || loading) setOpen(true) }}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n className={minimal\n ? `w-full bg-transparent pl-2 ${chevron ? 'pr-7' : 'pr-3'} py-1.5 text-sm placeholder:text-muted-foreground focus:outline-none border-b border-transparent hover:border-border focus:border-foreground transition-colors`\n : `h-9 w-full rounded-input border border-input bg-background pl-8 ${chevron ? 'pr-8' : 'pr-3'} text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring`\n }\n role=\"combobox\"\n aria-expanded={hasDropdown}\n aria-autocomplete=\"list\"\n aria-required={required || undefined}\n aria-activedescendant={activeIndex >= 0 ? `combobox-opt-${activeIndex}` : undefined}\n />\n {chevron && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n // mousedown, not click: blur would collapse the field before the click lands.\n onMouseDown={(e) => { e.preventDefault(); inputRef.current?.focus() }}\n // 8px in, the same inset the inline selects put their chevron at —\n // these sit in one column with them, so the arrows have to line up.\n className={`absolute ${minimal ? 'right-2' : 'right-2.5'} top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors`}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n )}\n {hasDropdown && dropRect && createPortal(\n <div ref={listRef} role=\"listbox\" data-modal-passthrough\n style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface max-h-52 overflow-y-auto rounded-lg border bg-popover shadow-lg py-0.5 animate-in fade-in zoom-in-95 duration-100\">\n {loading && options.length === 0 && (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5 animate-spin shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" />\n <path d=\"M14.5 8a6.5 6.5 0 00-6.5-6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span>Buscando…</span>\n </div>\n )}\n {options.map((opt, i) => (\n <div key={opt.id} id={`combobox-opt-${i}`} role=\"option\" aria-selected={i === activeIndex}\n onMouseDown={(e) => { e.preventDefault(); onSelect(opt); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(i)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors ${\n i === activeIndex ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate font-medium\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[11px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n {renderRight && <div className=\"shrink-0\">{renderRight(opt)}</div>}\n </div>\n ))}\n {showCreate && (\n <div id={`combobox-opt-${options.length}`} role=\"option\" aria-selected={activeIndex === options.length}\n onMouseDown={(e) => { e.preventDefault(); onCreateNew?.(value.trim()); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(options.length)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors border-t ${\n activeIndex === options.length ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span>{createLabel} &ldquo;<span className=\"font-medium\">{value.trim()}</span>&rdquo;</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check, Search } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Modal, ModalContent } from './modal'\n\n// One list for every \"which one?\" question: search on top, keyboard below,\n// groups only when they mean something. Long lists live in a dialog, not in a\n// dropdown that has to fit between the trigger and the bottom of the window.\n\nexport interface PickerOption {\n id: string\n label: string\n /** Second line under the label — the city, the role, the code. */\n sublabel?: string | null\n /** Tag on the right — \"matriz\", \"3 hoje\". */\n hint?: string | null\n icon?: React.ReactNode\n /** Extra words the search also matches on (code, city, slug). */\n keywords?: string[]\n disabled?: boolean\n}\n\nexport interface PickerGroup {\n id: string\n label?: string\n options: PickerOption[]\n}\n\n/** Accent-blind: nobody types \"Bangú\" to find \"Bangu\". */\nfunction normalize(s: string): string {\n return s.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase()\n}\n\nfunction optionMatches(o: PickerOption, term: string): boolean {\n if (!term) return true\n const haystack = [o.label, o.sublabel ?? '', ...(o.keywords ?? [])].map(normalize)\n return haystack.some((h) => h.includes(term))\n}\n\n/** A key the way the keyboard draws it — used for the ↵ on the active row. */\nfunction Keycap({ children }: { children: React.ReactNode }) {\n return (\n <kbd className=\"rounded border border-border bg-muted/60 px-1.5 py-0.5 font-sans text-[10px] leading-none text-muted-foreground\">\n {children}\n </kbd>\n )\n}\n\nexport interface PickerListProps {\n /** Flat list, or `groups` for headed sections. Searching flattens either way. */\n options?: PickerOption[]\n groups?: PickerGroup[]\n value?: string | null\n onSelect: (id: string) => void\n searchPlaceholder?: string\n emptyLabel?: string\n /** Below this many rows the search box is more friction than help. */\n searchThreshold?: number\n /** Pinned above the list, outside the filter — \"all units\", \"clear\". */\n header?: React.ReactNode\n footer?: React.ReactNode\n className?: string\n listClassName?: string\n autoFocus?: boolean\n}\n\nexport function PickerList({\n options,\n groups,\n value,\n onSelect,\n searchPlaceholder = 'Buscar…',\n emptyLabel = 'Nada encontrado',\n searchThreshold = 8,\n header,\n footer,\n className,\n listClassName,\n autoFocus = true,\n}: PickerListProps) {\n const [query, setQuery] = React.useState('')\n const term = normalize(query.trim())\n\n const sections = React.useMemo<PickerGroup[]>(\n () => groups ?? [{ id: '_', options: options ?? [] }],\n [groups, options],\n )\n const total = React.useMemo(\n () => sections.reduce((n, g) => n + g.options.length, 0),\n [sections],\n )\n\n // Searching drops the headings: \"where is Copacabana\" is not a question about\n // which region it belongs to.\n const visible = React.useMemo<PickerGroup[]>(() => {\n if (!term) return sections\n const hits = sections.flatMap((g) => g.options.filter((o) => optionMatches(o, term)))\n return [{ id: '_results', options: hits }]\n }, [sections, term])\n\n const flat = React.useMemo(() => visible.flatMap((g) => g.options), [visible])\n const [active, setActive] = React.useState(0)\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // Keyed on the TERM alone: callers pass fresh arrays every render, so any\n // dep on the list itself would reset the highlight on the keypress that moved\n // it. Opening on the current row makes Enter a no-op instead of a surprise.\n React.useEffect(() => {\n const i = flat.findIndex((o) => o.id === value)\n setActive(i >= 0 ? i : 0)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [term])\n\n React.useEffect(() => {\n listRef.current\n ?.querySelector<HTMLElement>(`[data-picker-index=\"${active}\"]`)\n ?.scrollIntoView({ block: 'nearest' })\n }, [active])\n\n function step(delta: number) {\n if (flat.length === 0) return\n let next = active\n for (let i = 0; i < flat.length; i++) {\n next = (next + delta + flat.length) % flat.length\n if (!flat[next]?.disabled) break\n }\n setActive(next)\n }\n\n function onKeyDown(e: React.KeyboardEvent) {\n // The dropdown/dialog above this owns typeahead and would eat every key.\n if (e.key === 'ArrowDown') { e.preventDefault(); e.stopPropagation(); step(1) }\n else if (e.key === 'ArrowUp') { e.preventDefault(); e.stopPropagation(); step(-1) }\n else if (e.key === 'Home') { e.preventDefault(); setActive(0) }\n else if (e.key === 'End') { e.preventDefault(); setActive(flat.length - 1) }\n else if (e.key === 'Enter') {\n e.preventDefault()\n const o = flat[active]\n if (o && !o.disabled) onSelect(o.id)\n } else if (e.key !== 'Escape') {\n e.stopPropagation()\n }\n }\n\n const searchable = total >= searchThreshold\n let index = -1\n\n return (\n <div className={cn('flex min-h-0 flex-col', className)} onKeyDown={onKeyDown}>\n {searchable && (\n <div className=\"flex shrink-0 items-center gap-2 border-b px-3 py-2.5\">\n <Search className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <input\n autoFocus={autoFocus}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={searchPlaceholder}\n aria-activedescendant={flat[active] ? `picker-opt-${flat[active].id}` : undefined}\n className=\"w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {term && (\n <span className=\"shrink-0 text-[11px] tabular-nums text-muted-foreground\">{flat.length}</span>\n )}\n </div>\n )}\n {header}\n <div\n ref={listRef}\n role=\"listbox\"\n className={cn('min-h-0 flex-1 overflow-y-auto py-1', listClassName)}\n >\n {flat.length === 0 && (\n <p className=\"px-3 py-6 text-center text-sm text-muted-foreground\">{emptyLabel}</p>\n )}\n {visible.map((group) => (\n <React.Fragment key={group.id}>\n {group.label && group.options.length > 0 && (\n <p className=\"px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </p>\n )}\n {group.options.map((o) => {\n index += 1\n const i = index\n const selected = o.id === value\n return (\n <button\n key={o.id}\n id={`picker-opt-${o.id}`}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n data-picker-index={i}\n disabled={o.disabled}\n onMouseMove={() => setActive(i)}\n onClick={() => onSelect(o.id)}\n className={cn(\n 'flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm transition-colors',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n i === active && 'bg-muted',\n selected && 'font-medium',\n )}\n >\n {o.icon && <span className=\"flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground\">{o.icon}</span>}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{o.label}</span>\n {o.sublabel && (\n <span className=\"block truncate text-xs text-muted-foreground\">{o.sublabel}</span>\n )}\n </span>\n {o.hint && <span className=\"shrink-0 text-[10px] text-muted-foreground\">{o.hint}</span>}\n {selected && <Check className=\"h-4 w-4 shrink-0\" />}\n {/* Only on the row the keyboard is standing on: a keycap on\n every line would read as sixty-five buttons. */}\n {i === active && !o.disabled && <Keycap>enter</Keycap>}\n </button>\n )\n })}\n </React.Fragment>\n ))}\n </div>\n {footer}\n </div>\n )\n}\n\nexport interface PickerDialogProps extends Omit<PickerListProps, 'className' | 'listClassName'> {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: string\n /** Keyboard legend under the list. Off for a short list nobody will arrow through. */\n showKeyHints?: boolean\n}\n\nexport function PickerDialog({\n open, onOpenChange, title, description, showKeyHints = true, onSelect, ...list\n}: PickerDialogProps) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size=\"md\" noPadding className=\"max-h-[80vh] gap-0 overflow-hidden sm:max-h-[70vh]\">\n <div className=\"shrink-0 px-4 pb-3 pt-4\">\n <h2 className=\"pr-8 text-sm font-semibold\">{title}</h2>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n <PickerList\n {...list}\n onSelect={(id) => { onSelect(id); onOpenChange(false) }}\n className=\"min-h-0 flex-1\"\n listClassName=\"max-h-[55vh]\"\n />\n {showKeyHints && (\n <div className=\"flex shrink-0 items-center gap-1.5 border-t px-3 py-2 text-[10px] text-muted-foreground\">\n <Keycap>↑</Keycap><Keycap>↓</Keycap><span>navegar</span>\n <Keycap>enter</Keycap><span>selecionar</span>\n <Keycap>esc</Keycap><span>fechar</span>\n </div>\n )}\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface WizardStep {\n id: string\n label: string\n}\n\nexport interface WizardStepsProps extends Omit<React.HTMLAttributes<HTMLOListElement>, 'onSelect'> {\n steps: WizardStep[]\n current: number\n onSelect?: (index: number) => void\n}\n\n/** Shared progress rail for modal flows with a defined beginning and end. */\nexport function WizardSteps({ steps, current, onSelect, className, ...props }: WizardStepsProps) {\n const active = Math.min(Math.max(current, 0), Math.max(steps.length - 1, 0))\n\n return (\n <ol className={cn('flex w-full items-start', className)} {...props}>\n {steps.map((step, index) => {\n const done = index < active\n const selected = index === active\n const enabled = !!onSelect && index <= active\n const marker = (\n <span\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold transition-colors',\n done && 'border-primary bg-primary text-primary-foreground',\n selected && 'border-primary bg-background text-primary',\n !done && !selected && 'border-muted-foreground/25 bg-background text-muted-foreground',\n )}\n >\n {done ? <Check className=\"h-3.5 w-3.5\" aria-hidden /> : index + 1}\n </span>\n )\n\n return (\n <li key={step.id} className={cn('relative flex min-w-0 flex-1 flex-col items-center', index === steps.length - 1 && 'flex-none')} aria-current={selected ? 'step' : undefined}>\n {index > 0 ? (\n <span className={cn('absolute right-1/2 top-3.5 h-0.5 w-full -translate-y-1/2', index <= active ? 'bg-primary' : 'bg-border')} aria-hidden />\n ) : null}\n {enabled ? (\n <button type=\"button\" onClick={() => onSelect(index)} className=\"relative z-10 flex max-w-28 flex-col items-center gap-1.5 text-center\">\n {marker}\n <span className={cn('text-[11px] leading-tight', selected ? 'font-medium text-foreground' : 'text-muted-foreground')}>{step.label}</span>\n </button>\n ) : (\n <div className=\"relative z-10 flex max-w-28 flex-col items-center gap-1.5 text-center\">\n {marker}\n <span className={cn('text-[11px] leading-tight', selected ? 'font-medium text-foreground' : 'text-muted-foreground')}>{step.label}</span>\n </div>\n )}\n </li>\n )\n })}\n </ol>\n )\n}\n","import * as React from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from './modal'\nimport { WizardSteps } from './wizard-steps'\nimport type { ModalSize } from './modal'\n\n/**\n * One page of a flow — a step of a wizard, or a task opened from a hub.\n *\n * `footer` is the page's own actions. The flow draws the navigation (voltar,\n * avançar); the page draws what only it knows how to do.\n */\nexport interface ModalFlowPage {\n id: string\n title: string\n /** A line under the title: what this page is for. */\n hint?: string\n render: () => React.ReactNode\n /** Actions on the right of the footer. The flow supplies the left side. */\n footer?: React.ReactNode\n /** Block \"Avançar\" with a reason — `steps` mode only. */\n blockedReason?: string\n}\n\nexport interface ModalFlowProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /**\n * `steps` — a line with a beginning and an end (1, 2, 3), with a rail on top\n * and Voltar/Avançar at the foot.\n *\n * `stack` — a hub that opens tasks. The task takes over the same frame with\n * a back arrow; it is NOT a second window floating over the first.\n */\n mode?: 'steps' | 'stack'\n /** The name of the whole flow — the person, the attendance, the sale. */\n title: string\n pages: ModalFlowPage[]\n /** Index (steps) or page id (stack). `null` in stack mode means the hub. */\n current: number | string | null\n onCurrentChange: (next: number | string | null) => void\n /** The hub itself — `stack` mode only. */\n hub?: React.ReactNode\n /** The hub's own footer — `stack` mode only. */\n hubFooter?: React.ReactNode\n size?: ModalSize\n nextLabel?: string\n doneLabel?: string\n onDone?: () => void\n}\n\n/**\n * MODAL SOBRE MODAL É UM SINTOMA, não um recurso.\n *\n * Duas janelas empilhadas custam duas vezes: a de trás fica visível e ilegível,\n * e a da frente perde o contexto de onde veio — quem está olhando não sabe se\n * fechar volta para a anterior ou joga tudo fora. No celular a de trás some por\n * baixo e a de cima ocupa metade da tela.\n *\n * Aqui há UMA moldura. Em `steps`, o conteúdo anda para frente e para trás numa\n * linha com começo e fim, e a trilha em cima diz quanto falta. Em `stack`, a\n * tarefa entra no lugar do painel com uma seta de voltar e o nome do que se\n * está fazendo — o mesmo gesto do celular, onde ninguém empilha janelas.\n */\nexport function ModalFlow({\n open, onOpenChange, mode = 'stack', title, pages, current, onCurrentChange,\n hub, hubFooter, size = 'md', nextLabel = 'Avançar', doneLabel = 'Concluir', onDone,\n}: ModalFlowProps) {\n const index = mode === 'steps'\n ? Math.min(Math.max(typeof current === 'number' ? current : 0, 0), Math.max(pages.length - 1, 0))\n : -1\n const page = mode === 'steps'\n ? pages[index]\n : (typeof current === 'string' ? pages.find((p) => p.id === current) : undefined)\n\n const naTarefa = mode === 'stack' && !!page\n const ultimo = mode === 'steps' && index === pages.length - 1\n\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size={size} noPadding className=\"gap-0\">\n <ModalHeader className=\"border-b px-5 py-3.5\">\n <div className=\"flex items-center gap-2\">\n {naTarefa && (\n // A seta é a saída da tarefa, e ela volta para o painel — não\n // fecha o atendimento inteiro. Sem ela, o X era a única porta e\n // desistir de uma etapa significava sair de tudo.\n <button\n type=\"button\"\n onClick={() => onCurrentChange(null)}\n aria-label=\"Voltar\"\n className=\"-ml-1 rounded-button p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden />\n </button>\n )}\n <div className=\"min-w-0\">\n <ModalTitle className=\"truncate text-base\">\n {naTarefa ? page!.title : title}\n </ModalTitle>\n {naTarefa && page!.hint && (\n <p className=\"truncate text-[11px] text-muted-foreground\">{page!.hint}</p>\n )}\n {!naTarefa && mode === 'steps' && page && (\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {`${index + 1} de ${pages.length} · ${page.title}`}\n </p>\n )}\n </div>\n </div>\n {mode === 'steps' && pages.length > 1 && (\n <WizardSteps\n steps={pages.map((flowPage) => ({ id: flowPage.id, label: flowPage.title }))}\n current={index}\n onSelect={(i) => onCurrentChange(i)}\n className=\"mt-3\"\n aria-label={title}\n />\n )}\n </ModalHeader>\n\n <ModalBody className=\"p-0\">\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {mode === 'steps' ? page?.render() : (page ? page.render() : hub)}\n </div>\n\n {/* O rodapé é FIXO no celular — a ação não pode ficar a uma rolagem\n de distância de quem está com o cliente na frente. */}\n <div className=\"flex items-center justify-between gap-2 border-t px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n {mode === 'steps' ? (\n <>\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => onCurrentChange(index - 1)}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground disabled:opacity-40\"\n >\n Voltar\n </button>\n <div className=\"flex items-center gap-2\">\n {page?.footer}\n <button\n type=\"button\"\n title={page?.blockedReason}\n disabled={!!page?.blockedReason}\n onClick={() => (ultimo ? onDone?.() : onCurrentChange(index + 1))}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\"\n >\n {ultimo ? doneLabel : nextLabel}\n </button>\n </div>\n </>\n ) : (\n <>\n <div className=\"text-[11px] text-muted-foreground\">\n {naTarefa ? page!.hint ?? '' : ''}\n </div>\n <div className=\"flex items-center gap-2\">\n {naTarefa ? page!.footer : hubFooter}\n </div>\n </>\n )}\n </div>\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n\n/** Small helper so a hub can render its tasks as a list of entry points. */\nexport function ModalFlowEntry({ children, onClick, className }: {\n children: React.ReactNode\n onClick: () => void\n className?: string\n}) {\n return (\n <button type=\"button\" onClick={onClick} className={cn('w-full text-left', className)}>\n {children}\n </button>\n )\n}\n","import * as React from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface NestedPaneProps {\n /** O nome do que se está fazendo — substitui o título do anfitrião. */\n title: React.ReactNode\n /** Uma linha de contexto sob o título. */\n hint?: React.ReactNode\n /** Volta para o anfitrião. NÃO fecha o anfitrião. */\n onBack: () => void\n children: React.ReactNode\n className?: string\n}\n\n/**\n * UMA TAREFA DENTRO DA MOLDURA DE QUEM A ABRIU.\n *\n * Modal sobre modal custa duas vezes: a janela de trás fica visível e\n * ilegível, e a da frente perde o contexto de onde veio — fechar vira aposta\n * entre \"volto para a anterior\" e \"perco tudo\". No celular a de baixo some por\n * completo e a de cima ocupa metade da tela.\n *\n * Esta é a alternativa, e é a mesma dos aplicativos de telefone: a tarefa\n * ocupa o corpo do anfitrião, com o nome dela em cima e uma seta que volta. O\n * anfitrião esconde o próprio conteúdo enquanto ela dura — e continua sendo a\n * única janela aberta.\n *\n * O rodapé da tarefa vem no `children`, como a tarefa já o desenhava.\n */\nexport function NestedPane({ title, hint, onBack, children, className }: NestedPaneProps) {\n return (\n <div className={cn('flex min-h-0 flex-1 flex-col', className)}>\n <div className=\"flex items-center gap-2 border-b px-5 py-3\">\n <button\n type=\"button\"\n onClick={onBack}\n aria-label=\"Voltar\"\n className=\"-ml-1 rounded-button p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden />\n </button>\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-medium\">{title}</h2>\n {hint && <p className=\"truncate text-[11px] text-muted-foreground\">{hint}</p>}\n </div>\n </div>\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ArrowLeft, ChevronRight, X } from 'lucide-react'\nimport { Modal, ModalContent } from './modal'\nimport { NestedPane } from './nested-pane'\n\n// ---------------------------------------------------------------------------\n// UMA TAREFA ABERTA DE DENTRO DE QUALQUER SUPERFÍCIE — sem modal sobre modal.\n//\n// O problema que isto resolve: um formulário fundo na árvore (o \"Adicionar\n// endereço\" da ficha, aberto de dentro do modal de agendamento) precisava de\n// uma janela própria, e cada superfície resolvia à sua maneira — RightRail por\n// trás do modal (quebrado: o modal está na frente), segundo Dialog por cima\n// (as duas janelas visíveis, nenhuma legível).\n//\n// A regra da casa é a do NestedPane: a tarefa ocupa a MOLDURA de quem a\n// abriu. Este par a torna alcançável de qualquer profundidade:\n//\n// · `ModalTaskHost` — o anfitrião (o corpo de um modal) declara \"tarefas\n// abrem em mim\". Enquanto uma dura, o conteúdo dele fica escondido (mas\n// MONTADO — nada de estado perdido) e a tarefa aparece no lugar, com\n// título e seta de voltar.\n// · `ModalTask` — a tarefa. Dentro de um host, entra na moldura dele por\n// portal (o React preserva o contexto de quem a declarou). SEM host — a\n// tela normal, um CRUD de página — abre como um Modal comum, e esse Modal\n// é ele mesmo um host: uma tarefa aberta de dentro dele (o Receber de uma\n// fatura) continua tomando a moldura em vez de empilhar janelas.\n//\n// As tarefas EMPILHAM: a fatura abre como tarefa, o Receber abre por cima\n// dela, e a seta volta um nível de cada vez. Só a do topo aparece; as de\n// baixo ficam montadas e escondidas, como o conteúdo do anfitrião.\n//\n// Quem escreve a tarefa não pergunta onde está: declara `<ModalTask open …>`\n// e o lugar certo acontece.\n// ---------------------------------------------------------------------------\n\nexport interface ModalTaskCrumb {\n title: React.ReactNode\n hint?: React.ReactNode\n onBack: () => void\n}\n\ntype TaskMeta = ModalTaskCrumb\n\ninterface TaskEntry {\n id: number\n meta: TaskMeta\n}\n\ninterface ModalTaskApi {\n open: (meta: TaskMeta) => number\n close: (id: number) => void\n /** A tarefa do topo da pilha — a única desenhada. */\n topId: number | null\n slot: HTMLElement | null\n}\n\nconst ModalTaskContext = React.createContext<ModalTaskApi | null>(null)\n\n/**\n * O cabeçalho ÚNICO do modal que hospeda tarefas — o breadcrumb.\n *\n * Sem tarefa: o título do modal e o X. Com tarefa: \"Título › Tarefa\", cada\n * antepassado clicável volta até ele, e o X SOME — a saída é pelo caminho,\n * não por um atalho que perderia o que está no meio. Foi pedido assim\n * (23-09): duas faixas de cabeçalho (título + \"← tarefa\") liam como duas\n * janelas dentro de uma.\n */\nexport function ModalTaskHeader({ title, hint, stack, onClose }: {\n title: React.ReactNode\n hint?: React.ReactNode\n stack: ModalTaskCrumb[]\n /** Fecha o modal — só oferecido no nível raiz. */\n onClose?: () => void\n}) {\n // Fecha da tarefa mais funda até a de cima do alvo; cada onBack fecha a sua.\n const popTo = (index: number) => {\n for (let i = stack.length - 1; i > index; i--) stack[i].onBack()\n }\n const popAll = () => { for (let i = stack.length - 1; i >= 0; i--) stack[i].onBack() }\n const last = stack[stack.length - 1]\n\n return (\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b px-5 py-3.5\">\n {stack.length === 0 ? (\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-base font-semibold\">{title}</h2>\n {hint && <p className=\"truncate text-[11px] text-muted-foreground\">{hint}</p>}\n </div>\n ) : (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {/* A seta volta UM nível — o gesto que a mão já conhece; o\n breadcrumb ao lado diz onde se está e salta direto. */}\n <button\n type=\"button\"\n onClick={() => last?.onBack()}\n aria-label=\"Voltar\"\n className=\"-ml-1 mr-0.5 shrink-0 rounded-button p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4\" aria-hidden />\n </button>\n <button\n type=\"button\"\n onClick={popAll}\n className=\"max-w-[40%] truncate text-base font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n {title}\n </button>\n {stack.map((c, i) => (\n <React.Fragment key={i}>\n <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/50\" aria-hidden />\n {i < stack.length - 1 ? (\n <button\n type=\"button\"\n onClick={() => popTo(i)}\n className=\"min-w-0 truncate text-base font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n {c.title}\n </button>\n ) : (\n <span className=\"min-w-0 truncate text-base font-semibold\">{c.title}</span>\n )}\n </React.Fragment>\n ))}\n </div>\n )}\n {stack.length === 0 && onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" aria-hidden />\n </button>\n )}\n </div>\n )\n}\n\n/** O corpo do modal anfitrião. Envolva o conteúdo que a tarefa substitui.\n * Com `header`, o anfitrião ganha UM cabeçalho que vira breadcrumb quando\n * uma tarefa abre (use `ModalTaskHeader`); sem ele, a tarefa desenha a\n * própria faixa de título via NestedPane. */\nexport function ModalTaskHost({ children, className, header }: {\n children: React.ReactNode\n className?: string\n header?: (stack: ModalTaskCrumb[]) => React.ReactNode\n}) {\n const [stack, setStack] = React.useState<TaskEntry[]>([])\n const [slot, setSlot] = React.useState<HTMLElement | null>(null)\n const idRef = React.useRef(0)\n const api = React.useMemo<Omit<ModalTaskApi, 'topId' | 'slot'>>(() => ({\n open: (meta) => {\n const id = ++idRef.current\n setStack((s) => [...s, { id, meta }])\n return id\n },\n close: (id) => setStack((s) => s.filter((e) => e.id !== id)),\n }), [])\n const top = stack.length ? stack[stack.length - 1] : null\n // `slot`/`topId` fora do useMemo do api: eles mudam a cada abertura e a\n // identidade das funções não pode mudar junto (o effect da tarefa depende\n // delas para não reabrir em loop).\n const value = React.useMemo<ModalTaskApi>(\n () => ({ ...api, topId: top?.id ?? null, slot }),\n [api, top?.id, slot],\n )\n\n return (\n <ModalTaskContext.Provider value={value}>\n {/* O cabeçalho do anfitrião nunca se esconde: é ELE que vira breadcrumb. */}\n {header?.(stack.map((e) => e.meta))}\n {top && (header\n ? <div ref={setSlot} className=\"flex min-h-0 flex-1 flex-col overflow-hidden\" />\n : (\n <NestedPane title={top.meta.title} hint={top.meta.hint} onBack={() => top.meta.onBack()}>\n <div ref={setSlot} className=\"flex min-h-0 flex-1 flex-col overflow-hidden\" />\n </NestedPane>\n ))}\n {/* `hidden`, não desmonte: a tarefa volta para um formulário com tudo\n que a pessoa já tinha digitado. A classe só entra sem tarefa aberta —\n um `.flex` venceria o `[hidden]` do user agent. */}\n <div hidden={!!top} className={top ? undefined : className}>{children}</div>\n </ModalTaskContext.Provider>\n )\n}\n\nexport function useInModalTaskHost(): boolean {\n return React.useContext(ModalTaskContext) !== null\n}\n\n/**\n * A tarefa. `children` deve trazer o próprio corpo E rodapé (a moldura só dá\n * título e volta). No fallback sem host, vira um Modal com o mesmo cabeçalho —\n * e esse Modal hospeda tarefas abertas de dentro dele.\n */\nexport function ModalTask({ open, title, hint, onClose, width, children }: {\n open: boolean\n title: React.ReactNode\n hint?: React.ReactNode\n onClose: () => void\n /** Largura do Modal do fallback (classe max-w-*). */\n width?: string\n children: React.ReactNode\n}) {\n const host = React.useContext(ModalTaskContext)\n const onCloseRef = React.useRef(onClose)\n onCloseRef.current = onClose\n const [myId, setMyId] = React.useState<number | null>(null)\n\n React.useEffect(() => {\n if (!host || !open) return\n const id = host.open({ title, hint, onBack: () => onCloseRef.current() })\n setMyId(id)\n return () => { host.close(id); setMyId(null) }\n // título/hint são quase sempre literais; a identidade do host.open/close é\n // estável (só topId/slot mudam no context value).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host !== null, open])\n\n if (!open) return null\n\n if (host) {\n if (!host.slot || myId == null) return null\n const isTop = host.topId === myId\n return createPortal(\n // Tarefa coberta por outra fica montada e escondida — mesma regra do\n // conteúdo do anfitrião. A classe de flex só quando visível.\n <div hidden={!isTop} className={isTop ? 'flex min-h-0 flex-1 flex-col overflow-hidden' : undefined}>\n {children}\n </div>,\n host.slot,\n )\n }\n\n // `width` chega como classe (\"max-w-3xl\") por história; o ModalContent fala\n // em `size` — e a classe base responsiva dele (sm:max-w-*) vence uma\n // max-w-* crua, então passar pelo className deixava o modal estreito.\n const size = (width?.match(/^max-w-(sm|md|lg|xl|2xl|3xl|4xl|5xl)$/)?.[1] ?? 'lg') as\n 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl'\n\n return (\n <Modal open onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent noPadding size={size} className=\"gap-0\" hideClose>\n <div className=\"flex max-h-[80vh] min-h-0 flex-col overflow-hidden\">\n {/* O fallback é um host com cabeçalho único: o título vira\n breadcrumb quando uma tarefa abre por dentro (o Receber de\n dentro da fatura), em vez de empilhar faixas de cabeçalho. */}\n <ModalTaskHost\n className=\"flex min-h-0 flex-1 flex-col overflow-hidden\"\n header={(stack) => (\n <ModalTaskHeader title={title} hint={hint} stack={stack} onClose={onClose} />\n )}\n >\n {children}\n </ModalTaskHost>\n </div>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { Button } from './button'\nimport {\n Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalFooter,\n} from './modal'\n\n// ---------------------------------------------------------------------------\n// Lançar movimento — the one entry form, for every plugin that keeps stock.\n//\n// The shop's Posições tab had it and the inventory plugin's Estoque tab did\n// not: the same product, two screens, and only one of them could take a\n// receipt. Copying the markup across would have made that two forms to keep in\n// step, which is how the reason picker on one grows a field the other never\n// gets.\n//\n// Presentational ON PURPOSE. It knows nothing about a ledger, an RPC or a\n// provider — the host passes the verbs it supports, the reasons it offers and\n// one `onSubmit`. That is what lets plugin-inventory and plugin-shop share it\n// while writing through their own contracts, and it is why this lives in `ui`\n// rather than in either plugin.\n// ---------------------------------------------------------------------------\n\nexport interface StockEntryVerb {\n value: string\n label: string\n /** What it does to the balance. `set` asks for a count, not a delta. */\n effect: 'increase' | 'decrease' | 'set' | 'move'\n}\n\nexport interface StockEntryReason {\n key: string\n label: string\n}\n\nexport interface StockEntrySubmit {\n verb: string\n quantity: number\n reasonCode: string\n occurredOn: string\n note: string\n}\n\nexport interface StockEntryFormProps {\n /** The verb the form opens on; null keeps it closed. */\n verb: string | null\n onVerbChange: (verb: string) => void\n onClose: () => void\n verbs: readonly StockEntryVerb[]\n reasons?: readonly StockEntryReason[]\n /** Current on-hand, to show the consequence while they type. */\n available: number\n saving?: boolean\n /** An unresolved command may be retried, but its inputs must not change. */\n readOnly?: boolean\n notice?: string\n onSubmit: (entry: StockEntrySubmit) => void | Promise<void>\n labels?: Partial<typeof DEFAULT_LABELS>\n}\n\nconst DEFAULT_LABELS = {\n title: 'Lançar movimento',\n description: 'O razão não se edita: um erro se corrige com o movimento contrário.',\n quantity: 'Quantidade',\n reason: 'Motivo',\n reasonDefault: 'Padrão',\n whenArrived: 'Chegou em',\n when: 'Quando',\n note: 'Observação',\n notePlaceholder: 'Nota fiscal, quem entregou…',\n addNote: '+ observação',\n staysAt: 'Fica em',\n notEnough: 'não há tudo isso',\n sayHowMany: 'Diga quantas unidades',\n cancel: 'Cancelar',\n submit: 'Lançar',\n submitting: 'Lançando…',\n}\n\nconst field =\n 'mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary'\n\nconst todayISO = () => new Date().toISOString().slice(0, 10)\n\nexport function StockEntryForm({\n verb, onVerbChange, onClose, verbs, reasons = [], available,\n saving = false, readOnly = false, notice, onSubmit, labels: overrides,\n}: StockEntryFormProps) {\n const labels = { ...DEFAULT_LABELS, ...overrides }\n const [quantity, setQuantity] = React.useState('')\n const [reasonCode, setReasonCode] = React.useState('')\n const [occurredOn, setOccurredOn] = React.useState(todayISO())\n const [note, setNote] = React.useState('')\n const [noteOpen, setNoteOpen] = React.useState(false)\n const quantityRef = React.useRef<HTMLInputElement>(null)\n\n // Reopening is a NEW movement, not the last one still half-typed. The verb is\n // what the caller changed, so it is what resets the rest.\n React.useEffect(() => {\n if (verb === null) return\n setQuantity('')\n setReasonCode('')\n setOccurredOn(todayISO())\n setNote('')\n setNoteOpen(false)\n const timer = setTimeout(() => quantityRef.current?.focus(), 30)\n return () => clearTimeout(timer)\n }, [verb])\n\n const amount = Math.max(0, Math.trunc(Number(quantity) || 0))\n const spec = verbs.find((v) => v.value === verb)\n const effect = spec?.effect ?? 'increase'\n\n // What the balance becomes, while they type. Null before a number is entered,\n // so the hint reads \"fica em N\" rather than \"N → N\".\n const nextBalance = amount === 0\n ? null\n : effect === 'set'\n ? amount\n : effect === 'decrease'\n ? available - amount\n : available + amount\n\n const submit = () => {\n if (amount === 0 || saving) return\n void onSubmit({ verb: verb as string, quantity: amount, reasonCode, occurredOn, note })\n }\n\n return (\n <Modal open={verb !== null} onOpenChange={(open: boolean) => { if (!open && !saving && !readOnly) onClose() }}>\n <ModalContent className=\"sm:max-w-lg\">\n <ModalHeader>\n <ModalTitle>{labels.title}</ModalTitle>\n <ModalDescription>{labels.description}</ModalDescription>\n </ModalHeader>\n\n {notice && <p role=\"status\" className=\"text-sm text-warning\">{notice}</p>}\n <fieldset disabled={saving || readOnly} className=\"p-1\">\n {/* The common verb arrives already chosen; the others sit one tap\n away rather than competing with the primary action. */}\n <div className=\"flex flex-wrap gap-1\">\n {verbs.map((v) => (\n <button\n key={v.value}\n type=\"button\"\n onClick={() => onVerbChange(v.value)}\n className={`fz-tap rounded-button px-3 py-1.5 text-xs font-medium transition-colors ${\n verb === v.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {v.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-3 space-y-3\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">{labels.quantity}</span>\n <input\n ref={quantityRef}\n type=\"number\"\n inputMode=\"numeric\"\n min={effect === 'set' ? 0 : 1}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit() }\n if (e.key === 'Escape') { e.preventDefault(); onClose() }\n }}\n placeholder=\"0\"\n className={`${field} font-semibold tabular-nums`}\n />\n {/* The consequence, while they type. */}\n <span aria-live=\"polite\" className=\"mt-1 block text-xs text-muted-foreground\">\n {nextBalance === null ? (\n <>{labels.staysAt} <span className=\"font-medium tabular-nums text-foreground\">{available}</span></>\n ) : (\n <>\n <span className=\"tabular-nums\">{available}</span>\n <span className=\"mx-1.5\">→</span>\n <span className={`text-base font-semibold tabular-nums ${nextBalance < 0 ? 'text-destructive' : 'text-foreground'}`}>\n {nextBalance}\n </span>\n {nextBalance < 0 && <span className=\"ml-2 text-destructive\">{labels.notEnough}</span>}\n </>\n )}\n </span>\n </label>\n\n {reasons.length > 0 && (\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">{labels.reason}</span>\n <select value={reasonCode} onChange={(e) => setReasonCode(e.target.value)} className={field}>\n <option value=\"\">{labels.reasonDefault}</option>\n {reasons.map((r) => <option key={r.key} value={r.key}>{r.label}</option>)}\n </select>\n </label>\n )}\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {effect === 'increase' ? labels.whenArrived : labels.when}\n </span>\n <input\n type=\"date\"\n value={occurredOn}\n max={todayISO()}\n onChange={(e) => setOccurredOn(e.target.value || todayISO())}\n className={field}\n />\n </label>\n </div>\n\n {noteOpen ? (\n <label className=\"mt-3 block\">\n <span className=\"text-xs font-medium text-muted-foreground\">{labels.note}</span>\n <input\n autoFocus\n value={note}\n onChange={(e) => setNote(e.target.value)}\n className={field}\n placeholder={labels.notePlaceholder}\n />\n </label>\n ) : (\n <button\n type=\"button\"\n onClick={() => setNoteOpen(true)}\n className=\"mt-2 text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n {labels.addNote}\n </button>\n )}\n </fieldset>\n\n <ModalFooter>\n {amount === 0 && (\n // Why the button is dim, next to the button.\n <span className=\"mr-auto text-xs text-muted-foreground\">{labels.sayHowMany}</span>\n )}\n <Button variant=\"ghost\" onClick={onClose} disabled={saving || readOnly}>{labels.cancel}</Button>\n <Button onClick={submit} disabled={saving || amount === 0}>\n {saving ? labels.submitting : labels.submit}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","// ---------------------------------------------------------------------------\n// ComingSoon — o ponto de entrada existe antes da feature.\n//\n// Mora no kit porque DOIS plugins já precisam dele (fiscal e estoque) e o\n// terceiro viria copiando. Um mapa do que falta é parte do produto, não enfeite\n// de um módulo.\n// ---------------------------------------------------------------------------\n// Não é enfeite: uma tela que anuncia o que vai fazer, de onde ela vem no V1 e o\n// que falta é um MAPA. Sem ela o operador procura a função, não acha, e conclui\n// que o V2 não serve — e nós descobrimos isso pelo suporte, não pelo plano.\n//\n// Por isso cada uma carrega três coisas, e nenhuma é opcional:\n// · o que a tela FAZ, na frase do V1;\n// · de onde ela vem lá (o caminho exato, para quem está migrando);\n// · o que falta para funcionar — em português de gente, não de commit.\n//\n// Regra: se o V1 também não faz, a tela DIZ isso. Copiar um vazio e apresentá-lo\n// como paridade é pior que a ausência.\n// ---------------------------------------------------------------------------\nimport React from 'react'\nimport { Clock, ArrowRight } from 'lucide-react'\nimport { Card } from './card'\nimport { SubpageHeader } from '../layout/ModulePage'\n\n/**\n * Um controle que existe no V1 e ainda não funciona aqui. Fica NA TELA onde a\n * pessoa faria, desabilitado e dizendo o que falta — nunca escondido, porque\n * quem não vê o botão conclui que o V2 não faz e volta para o V1.\n *\n * `quantas` traz o volume medido no rastro de auditoria, quando houver: dá\n * tamanho ao buraco sem precisar de opinião.\n */\nexport function EmBreve({ label, o_que, quantas }: { label: string; o_que: string; quantas?: string }) {\n return (\n <button\n type=\"button\"\n disabled\n title={`${o_que}${quantas ? ` — ${quantas}` : ''}`}\n className=\"inline-flex cursor-not-allowed items-center gap-1.5 rounded-md border border-dashed border-input px-2.5 py-1 text-[11px] text-muted-foreground opacity-80\"\n >\n <Clock className=\"h-3 w-3\" aria-hidden />\n {label}\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px]\">Em breve</span>\n </button>\n )\n}\n\nexport interface ComingSoonProps {\n title: string\n /** A frase do V1, literal quando existir. */\n summary: string\n /** O caminho no V1: «Estoque → Notas Fiscais → Notas Emitidas». */\n v1Path?: string\n /** O que falta para isto funcionar. Uma linha por item, sem jargão. */\n missing: string[]\n /** Quando o V1 TAMBÉM não faz — e a tela tem de admitir. */\n v1AlsoMissing?: boolean\n /** Volume medido no V1, quando houver: dá tamanho ao que falta. */\n measured?: string\n onBack?: () => void\n backTo?: string\n}\n\nexport function ComingSoon({\n title, summary, v1Path, missing, v1AlsoMissing, measured, onBack, backTo,\n}: ComingSoonProps) {\n return (\n <div className=\"space-y-4\">\n {onBack && <SubpageHeader title={title} onBack={onBack} parentLabel={backTo ?? 'Voltar'} />}\n\n <Card className=\"p-6\">\n <div className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n <Clock className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n </span>\n <div className=\"min-w-0\">\n <h2 className=\"text-base font-semibold\">{title}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{summary}</p>\n\n {v1Path && (\n <p className=\"mt-3 text-xs text-muted-foreground\">\n No sistema antigo: <span className=\"font-medium text-foreground\">{v1Path}</span>\n </p>\n )}\n\n {measured && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{measured}</p>\n )}\n\n {v1AlsoMissing && (\n // Honestidade que economiza uma reunião: ninguém vai procurar no V1\n // o que o V1 nunca teve.\n <div className=\"mt-3 rounded-md border border-warning bg-warning-soft px-3 py-2\">\n <p className=\"text-xs text-warning-soft-foreground\">\n <strong>O sistema antigo também não faz isto.</strong> A tela existe lá e anuncia\n «em desenvolvimento». Não há nada para trazer — é funcionalidade nova, não porte.\n </p>\n </div>\n )}\n\n <div className=\"mt-4\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n Em breve — o que falta\n </p>\n <ul className=\"mt-2 space-y-1.5\">\n {missing.map((item) => (\n <li key={item} className=\"flex items-start gap-2 text-sm\">\n <ArrowRight className=\"mt-1 h-3 w-3 shrink-0 text-muted-foreground\" aria-hidden />\n <span>{item}</span>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </Card>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Como um nome de pessoa se escreve quando não cabe inteiro.\n//\n// Mora aqui, e não na tela que precisou primeiro, porque a resposta é a MESMA\n// em toda parte: a coluna da agenda, a lista de filtros, a fila do check-in, a\n// linha de confirmações. Enquanto a regra viveu dentro da CalendarView, cada\n// tela vizinha encurtava do seu jeito — ou não encurtava, e truncava por CSS.\n// ---------------------------------------------------------------------------\n\n/** Não identificam ninguém: \"Alana Matos de Paula\" abrevia por \"Paula\". */\nconst PARTICLES = new Set([\n 'de', 'da', 'do', 'das', 'dos', 'e', 'del', 'di', 'du', 'van', 'von', 'la', 'le',\n])\n\nfunction cap(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * \"ADRIANA VITÓRIA DOS SANTOS MOREIRA\" → \"Adriana Vitória M.\"\n *\n * NOME, SOBRENOME e a inicial do último. Truncar por CSS corta no meio da\n * primeira palavra (\"Adriellen Cristi…\") e joga fora justamente o sobrenome,\n * que é o que distingue duas Adrianas. Só o primeiro nome mais uma inicial\n * (\"Adriana M.\") empata rápido demais numa equipe onde o primeiro nome se\n * repete; com o segundo nome inteiro a pessoa é reconhecida antes, e a inicial\n * passa a ser o desempate.\n *\n * O nome inteiro continua no `title` e no link da ficha — abreviar é uma\n * decisão de LARGURA, não de conteúdo.\n *\n * O caixa-alta do cadastro vira caixa de nome: a fonte grita porque o sistema\n * antigo gritava, e um cabeçalho em maiúsculas ocupa mais espaço e lê pior.\n */\nexport function abbreviatePersonName(full: string): string {\n const parts = full.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return full\n const first = cap(parts[0])\n if (parts.length === 1) return first\n\n const rest = parts.slice(1).filter((w) => !PARTICLES.has(w.toLowerCase()))\n // Só partículas depois do primeiro nome: melhor a última palavra inteira do\n // que um \"D.\" que não diz nada.\n if (rest.length === 0) return `${first} ${cap(parts[parts.length - 1])}`\n\n const second = cap(rest[0])\n if (rest.length === 1) return `${first} ${second}`\n // O ÚLTIMO sobrenome é o que se usa para chamar alguém, não o do meio.\n return `${first} ${second} ${rest[rest.length - 1].charAt(0).toUpperCase()}.`\n}\n\n/**\n * A ordem em que se PROCURA alguém numa lista: primeiro nome, depois o resto.\n *\n * Ordenar pelo nome abreviado ordena errado — \"Ana C.\" e \"Ana B.\" empatam em\n * tudo que a tela mostra e a ordem sai pela ordem de chegada do banco.\n * `sensitivity: 'base'` mantém Álvaro ao lado de Alvaro em vez de no fim.\n */\nexport function comparePersonNames(a: string, b: string): number {\n return a.localeCompare(b, undefined, { sensitivity: 'base' })\n}\n","import React from 'react'\nimport { Search } from 'lucide-react'\nimport { FilterSection, FilterCheckRow } from './filter-check-list'\nimport { MultiSelect } from './multi-select'\nimport { PersonAvatar } from './person-picker'\nimport { abbreviatePersonName, comparePersonNames } from './person-name'\nimport { CollapsibleColumn, COLUMN_WIDTH } from './collapsible-column'\nimport { PageRail } from '../layout/ModulePage'\n\n// ---------------------------------------------------------------------------\n// filter-rail — A COLUNA DE FILTRO, uma para o produto inteiro.\n//\n// Nasceu na agenda, onde Agenda, Check-in, Confirmações e Comunicação são\n// quatro recortes das MESMAS reservas e cada tela tinha crescido a própria\n// coluna. Subiu para cá porque a pergunta não é da agenda: escala, ponto e\n// encargos recortam listas do mesmo jeito, e o workforce estava a caminho de\n// desenhar a quinta.\n//\n// O nome perdeu o \"Agenda\" de propósito — uma primitiva se chama pelo que faz,\n// não pelo módulo onde apareceu primeiro.\n// ---------------------------------------------------------------------------\n\nexport interface FilterRailSection {\n id: string\n title: string\n /** Quantos estão marcados. Zero não desenha selo. */\n count?: number\n /** Fechada por padrão — a coluna aberta empurra o conteúdo para fora do olho. */\n defaultOpen?: boolean\n /** Declarada e fora do ar: a tela não precisa de um `&&` por seção. */\n hidden?: boolean\n content: React.ReactNode\n}\n\nexport interface FilterRailProps {\n /** Botões do alto (Bloquear, Horários). */\n actions?: React.ReactNode\n /** O que vem antes dos filtros — o mini-calendário da agenda. */\n before?: React.ReactNode\n /** A busca é um filtro como os outros: mora na mesma coluna, no mesmo lugar. */\n search?: {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n }\n sections: FilterRailSection[]\n /** O rodapé de contagem (\"12 de 40\"). */\n footer?: React.ReactNode\n}\n\n/**\n * A LARGURA É ÚNICA. 220px cabe o nome de uma pessoa truncado no sobrenome, que\n * é o limite real desta coluna; mais que isso tira da grade, que é onde o\n * trabalho acontece.\n */\n/** A largura da coluna — a MESMA de todas as colunas da esquerda. */\nexport const FILTER_RAIL_WIDTH = COLUMN_WIDTH\n\nexport function FilterRail({\n actions, before, search, sections, footer,\n}: FilterRailProps) {\n const visible = sections.filter((s) => !s.hidden)\n return (\n <>\n {actions && <div className=\"mb-4 space-y-2\">{actions}</div>}\n\n {search && (\n <div className=\"relative mb-4\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <input\n type=\"search\"\n value={search.value}\n onChange={(e) => search.onChange(e.target.value)}\n placeholder={search.placeholder}\n className=\"w-full rounded-input border border-input bg-card py-2 pl-8 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n\n {before}\n\n {visible.map((section, index) => (\n <React.Fragment key={section.id}>\n {/* O fio separador entre seções, e só ENTRE elas: um traço solto\n acima da primeira parece o fim de outra coisa. */}\n {(index > 0 || !!before || !!actions || !!search) && (\n <div className=\"my-4 h-px bg-border\" />\n )}\n <FilterSection\n title={section.title}\n count={section.count}\n defaultOpen={section.defaultOpen ?? false}\n >\n {section.content}\n </FilterSection>\n </React.Fragment>\n ))}\n\n {footer && (\n <p className=\"mt-4 px-1 text-xs tabular-nums text-muted-foreground\">{footer}</p>\n )}\n </>\n )\n}\n\n/**\n * A moldura de duas colunas: filtros PARADOS à esquerda, conteúdo rolando ao\n * lado.\n *\n * Numa barra sobre a lista, cada toque num filtro empurra a fila para baixo e\n * quem estava lendo perde a linha. É a regra que o check-in já seguia e a\n * agenda também — só que cada uma a escreveu por conta própria.\n *\n * Some no celular inteira: 220px de filtro sobre 360px de tela não é uma\n * coluna, é a tela. Quem filtra no telefone filtra por outra porta.\n */\n/**\n * A moldura da coluna — a MESMA do menu de um módulo (ver CollapsibleColumn).\n *\n * A coluna CEDE quando a direita abre. Rail de filtro + rail de detalhe são\n * ~600px de moldura; a fila, que é o trabalho, ficava com o resto. Quem abre um\n * check-in não está filtrando.\n *\n * O que mudou: antes ela sumia inteira (largura zero) e não havia como\n * trazê-la de volta sem fechar a direita. Agora vira a mesma tira das outras\n * colunas do produto — com botão no pé, reabrindo sob o ponteiro — e o\n * automático continua sendo a primeira palavra.\n */\nexport function FilterRailColumn({ children, collapsed = false }: {\n children: React.ReactNode\n /** A coluna CEDE quando outra superfície abre à direita. Quem sabe disso é a\n * casca do aplicativo, não este primitivo — por isso vem de fora. */\n collapsed?: boolean\n}) {\n return (\n // ENTREGUE À SHELL, como a coluna de um módulo: ali ela encosta no topo do\n // quadro e a régua do cabeçalho se emenda nela pela mesma curva. Desenhada\n // dentro da página, começava depois do respiro do módulo — e a costura, que\n // só existe quando a coluna encosta na faixa, não acontecia: a régua passava\n // reta por cima dela e a quina ficava quadrada, diferente de todo o resto.\n <PageRail>\n <CollapsibleColumn storageKey=\"fayz.filterrail\" squeezed={collapsed}>\n {({ collapsed: tight }) => (\n // Na tira, 224px de filtros dobrando linhas dentro de 64 é ruído\n // animado: o conteúdo espera o ponteiro (ou o botão) em vez de\n // espremer.\n tight ? null : <div className=\"py-1\">{children}</div>\n )}\n </CollapsibleColumn>\n </PageRail>\n )\n}\n\nexport function RailWorkspace({\n rail, children, className, collapsed,\n}: {\n rail: React.ReactNode\n children: React.ReactNode\n className?: string\n /** Ver FilterRailColumn. */\n collapsed?: boolean\n}) {\n return (\n <div className={`flex min-h-0 ${className ?? ''}`}>\n <FilterRailColumn collapsed={collapsed}>{rail}</FilterRailColumn>\n <div className=\"flex min-w-0 flex-1 flex-col\">{children}</div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// O filtro que escolhe a própria forma.\n//\n// Três serviços cabem na coluna e se leem de uma vez: abrir um campo para\n// escolher entre três é um clique a mais para ver o que já cabia na tela.\n// Trezentos não cabem — a lista vira a coluna inteira e empurra o Status para\n// fora do olho, e aí o campo com busca é o único jeito de achar alguém.\n//\n// A decisão é do TAMANHO DO DADO, e o dado é o mesmo em toda casa: a clínica\n// com seis agendas nunca vê um dropdown, a rede com 759 nunca vê uma lista.\n// Quem chama não escolhe a forma, só entrega as opções.\n// ---------------------------------------------------------------------------\n\n/** Acima disto, a lista deixa de ser um filtro e vira um obstáculo. */\nexport const INLINE_FILTER_MAX = 6\n\nexport interface AdaptiveFilterOption {\n value: string\n /**\n * O NOME INTEIRO, sempre. Quem chama não encurta.\n *\n * Encurtar é decisão de largura, e a largura é desta coluna — não da tela que\n * por acaso montou a lista. Enquanto cada tela abreviava por conta própria, a\n * agenda dizia \"Hannah J.\" e a fila do check-in dizia o nome inteiro\n * truncado por CSS, para a mesma pessoa.\n */\n label: string\n color?: string\n hint?: string\n /**\n * O retrato, quando a opção é GENTE — e é esta chave que diz que é.\n *\n * Presente (mesmo como `null`), a linha ganha cara, o nome é abreviado pela\n * regra do design system e a lista se ordena por nome. Ausente, a opção é\n * uma coisa — um serviço, um status — e nada disso se aplica.\n */\n avatarUrl?: string | null\n}\n\nexport function AdaptiveFilter({\n options, value, onChange, allLabel, searchPlaceholder, onSearchChange, inlineMax = INLINE_FILTER_MAX,\n}: {\n options: AdaptiveFilterOption[]\n value: string[]\n onChange: (next: string[]) => void\n allLabel: string\n searchPlaceholder?: string\n /** Presente ⇒ a busca do campo vai ao servidor (lista truncada). */\n onSearchChange?: (query: string) => void\n /** Teto da forma em lista. Acima dele, campo. */\n inlineMax?: number\n}) {\n // Lista truncada no servidor NUNCA é inline: o que está em memória não é o\n // conjunto, é uma amostra dele, e marcar caixinhas sobre uma amostra diz\n // \"não existe\" para quem ficou de fora.\n const inline = !onSearchChange && options.length > 0 && options.length <= inlineMax\n\n if (inline) {\n // GENTE se ordena por nome e se escreve encurtada; coisa fica na ordem em\n // que veio, que é a ordem que quem montou a lista escolheu (um status tem\n // uma sequência de fluxo, não alfabética).\n const people = options.some((o) => o.avatarUrl !== undefined)\n const rows = people\n ? [...options].sort((a, b) => comparePersonNames(a.label, b.label))\n : options\n return (\n <>\n {rows.map((opt) => (\n <FilterCheckRow\n key={opt.value}\n option={{\n ...opt,\n label: opt.avatarUrl !== undefined ? abbreviatePersonName(opt.label) : opt.label,\n // `adornment` já existe no primitivo: o retrato entra por ele,\n // sem a lista de filtros precisar saber o que é uma pessoa.\n adornment: opt.avatarUrl !== undefined\n ? <PersonAvatar name={opt.label} src={opt.avatarUrl ?? undefined} size=\"xs\" />\n : undefined,\n }}\n // Vazio quer dizer TODOS, e as caixas desenham marcadas quando\n // ninguém escolheu — é o que a tela está mostrando.\n checked={value.length === 0 || value.includes(opt.value)}\n onToggle={() => onChange(\n value.includes(opt.value) ? value.filter((v) => v !== opt.value) : [...value, opt.value],\n )}\n />\n ))}\n </>\n )\n }\n\n return (\n <MultiSelect\n options={options}\n value={value}\n onChange={onChange}\n allLabel={allLabel}\n searchPlaceholder={searchPlaceholder}\n onSearchChange={onSearchChange}\n />\n )\n}\n"]}