@fayz-ai/ui 0.25.0 → 0.26.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/primitives/input.tsx","../src/primitives/badge.tsx","../src/primitives/modal.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/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/filter-chip.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/date-range-chip.tsx","../src/primitives/multi-select.tsx","../src/primitives/dictate-button.tsx","../src/primitives/markdown.tsx","../src/primitives/markdown-editor.tsx","../src/primitives/SearchCombobox.tsx","../src/primitives/stock-entry-form.tsx"],"names":["React","jsxs","jsx","React2","React3","React4","Separator","React5","React6","Icon","React7","MoreHorizontal","Check","React8","React9","formatPhone","useState","useRef","useEffect","React11","ChevronDown","Fragment","useCallback","Search","X","RefreshCw","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","useTranslation","useMemo","createPortal","DAY_LABELS","isSameDay","isToday","toDateLocale","getCurrentLocale","Plus","React16","React17","React18","React19","React20","React21","React23"],"mappings":"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","file":"chunk-OQVFOBKU.js","sourcesContent":["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\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-8 w-full rounded-input border border-input bg-card px-2 py-1 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 DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Animations are defined in styles.css under .saas-mdl-ov / .saas-mdl-ct\n// selectors with [data-state=\"open\"/\"closed\"]. Radix defers unmount when\n// it detects animationName on the element — CSS must be loaded before render.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sizes\n// ---------------------------------------------------------------------------\n\nconst SIZE_MAP = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n // Duas colunas de trabalho lado a lado (ficha + linha do tempo) não cabem em\n // 3xl: a coluna da direita fica com 20rem e o texto de cada anotação quebra\n // a cada quatro palavras.\n '4xl': 'sm:max-w-4xl',\n '5xl': 'sm:max-w-5xl',\n full: 'sm:max-w-[calc(100vw-4rem)]',\n} as const\n\ntype ModalSize = keyof typeof SIZE_MAP\n\n// ---------------------------------------------------------------------------\n// Primitives re-export\n// ---------------------------------------------------------------------------\n\nconst Modal = DialogPrimitive.Root\nconst ModalTrigger = DialogPrimitive.Trigger\nconst ModalClose = DialogPrimitive.Close\nconst ModalPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay — also serves as the flex centering wrapper\n// ---------------------------------------------------------------------------\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fayz-modal-overlay saas-mdl-ov fixed inset-0 z-[100]',\n 'flex items-center justify-center p-0 sm:p-6',\n className,\n )}\n {...props}\n />\n))\nModalOverlay.displayName = 'ModalOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — rendered INSIDE the overlay (flex-centered)\n// ---------------------------------------------------------------------------\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n size?: ModalSize\n hideClose?: boolean\n noPadding?: boolean\n }\n>(({ className, children, size = 'lg', hideClose, noPadding, onPointerDownOutside, onInteractOutside, onCloseAutoFocus, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay>\n <DialogPrimitive.Content\n ref={ref}\n onCloseAutoFocus={(e) => {\n // Prevent Radix from stealing focus back to the trigger element on close.\n // This interferes with FullCalendar's selection and other interactive components.\n e.preventDefault()\n onCloseAutoFocus?.(e)\n }}\n onPointerDownOutside={(e) => {\n // Prevent Radix from intercepting clicks on portaled dropdowns (DatePicker, TimePicker, etc.)\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n // fz-container: a form inside a dialog measures the DIALOG. Without\n // it a two-column field grid in an `sm` modal read the window's width\n // and kept both columns in 380px.\n 'fayz-glass-surface fayz-modal-content saas-mdl-ct fz-container relative z-[100] flex flex-col w-full outline-none',\n // Mobile fullscreen\n 'h-full rounded-none border-0',\n // Desktop centered card\n 'sm:h-auto sm:max-h-[85vh] sm:rounded-2xl sm:border',\n SIZE_MAP[size],\n noPadding ? '' : 'p-6 gap-4',\n className,\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </ModalOverlay>\n </ModalPortal>\n))\nModalContent.displayName = 'ModalContent'\n\n// ---------------------------------------------------------------------------\n// Sections\n// ---------------------------------------------------------------------------\n\nfunction ModalHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left shrink-0', className)} {...props} />\n}\n\nfunction ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex-1 overflow-y-auto min-h-0', className)} {...props} />\n}\n\nfunction ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n // mt-auto: on mobile the content is fullscreen, so without it the buttons\n // float mid-screen right under a short body instead of sitting at the bottom.\n // On desktop the card is h-auto, so the auto margin collapses to nothing.\n return <div className={cn('mt-auto flex flex-col-reverse gap-2 sm:mt-0 sm:flex-row sm:justify-end sm:gap-0 sm:space-x-2 shrink-0', className)} {...props} />\n}\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nModalTitle.displayName = 'ModalTitle'\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nModalDescription.displayName = 'ModalDescription'\n\nexport {\n Modal, ModalPortal, ModalOverlay, ModalClose, ModalTrigger,\n ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n}\nexport type { ModalSize }\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-10 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 { 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 'w-full rounded-md border bg-background px-2.5 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 } from 'lucide-react'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownTrigger } from './dropdown'\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}\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 className?: string\n}\n\nexport function FilterChip({ allLabel, options, value, onChange, label, icon: Icon, className }: FilterChipProps) {\n const active = value != null && value !== ''\n const current = options.find((o) => o.value === value)\n\n return (\n <Dropdown>\n <DropdownTrigger 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 {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 </DropdownTrigger>\n <DropdownContent align=\"start\">\n {/* \"Todos\" é uma opção como as outras — limpar o filtro não deveria\n exigir um X separado que só aparece quando há algo para limpar. */}\n <DropdownItem onClick={() => onChange(undefined)}>\n {allLabel}\n {!active && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n {options.map((o) => (\n <DropdownItem key={o.value} onClick={() => onChange(o.value)}>\n {o.label}\n {value === o.value && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\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, SlidersHorizontal, X } 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 { FilterChip } from './filter-chip'\nimport { PageHeaderActions } from '../layout/ModulePage'\nimport { cn } from '../lib/cn'\nimport { Hint } from './hint'\nimport { Popover, PopoverTrigger, PopoverContent } from './popover'\nimport { useIsWide } from '../hooks/useIsWide'\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 /** Controls that narrow the list (period, account, …). They ride in the same\n * row as the search box, right above the table — não em um painel próprio. */\n filters?: React.ReactNode\n /** Os refinadores que NÃO merecem uma pastilha permanente na barra — plano\n * de contas, centro de custo, conta bancária. Ficam atrás de um \"Filtros\"\n * com a conta de quantos estão ativos, em qualquer largura: a barra mostra\n * o que se troca todo dia e guarda o resto a um clique. */\n advancedFilters?: 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 /** Quantos estão ativos DENTRO do painel. Na tela larga é essa a conta na\n * pastilha \"Filtros\": as outras pastilhas já mostram o próprio valor na\n * barra, e contá-las de novo ali dizia \"1 filtro escondido\" quando não\n * havia nenhum. Omitido, cai em `activeFilterCount`. */\n advancedFilterCount?: 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}\n\n// ---------------------------------------------------------------------------\n// Component\n\n/**\n * Os refinadores da lista: lado a lado numa tela larga, recolhidos atrás de um\n * gatilho num telefone.\n *\n * Inline no celular eles embrulhavam — \"Todos\", \"Todo o período\", \"Todos os\n * planos\", \"Todos os centros\" viravam duas linhas abaixo da busca, e a tabela,\n * que é o que a pessoa veio ver, começava três linhas depois. Recolhidos, a\n * linha da busca volta a ser UMA linha e eles seguem a um toque de distância,\n * empilhados com a largura inteira do painel em vez de espremidos em pílulas.\n *\n * Popover e não DropdownMenu: o que entra aqui são selects e campos, e o\n * typeahead do menu do Radix come o que se digita neles.\n */\nfunction ListFilters({ tagFilter, filters, advanced, label, count, wideCount }: {\n tagFilter?: React.ReactNode\n filters?: React.ReactNode\n advanced?: React.ReactNode\n label: string\n count: number\n wideCount: number\n}) {\n const wide = useIsWide()\n const [open, setOpen] = useState(false)\n if (!tagFilter && !filters && !advanced) return null\n\n // Numa tela larga as pastilhas do dia a dia ficam na barra; o resto entra no\n // painel. Num telefone TUDO entra no painel — inline, quatro pastilhas viram\n // duas linhas e a tabela, que é o que a pessoa veio ver, começa embaixo\n // delas.\n const inPanel = wide ? advanced : <>{tagFilter}{filters}{advanced}</>\n const badge = wide ? wideCount : count\n const trigger = wide && !advanced ? null : (\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.5 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors',\n badge > 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 >\n <SlidersHorizontal className=\"h-3 w-3 shrink-0 opacity-70\" />\n {/* O rótulo some no telefone: ali a barra disputa espaço com a busca,\n e o ícone com a conta já diz tudo o que a palavra diria. */}\n <span className=\"hidden sm:inline\">{label}</span>\n {badge > 0 && (\n <span className=\"rounded-full bg-primary/20 px-1.5 text-[10px] font-semibold tabular-nums\">{badge}</span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"flex max-h-[70vh] w-[min(18rem,calc(100vw-1.5rem))] flex-col gap-3 overflow-y-auto p-3 [&_button]:w-full [&_button]:justify-between\"\n >\n {inPanel}\n </PopoverContent>\n </Popover>\n )\n\n return (\n <>\n {wide && tagFilter}\n {wide && filters}\n {trigger}\n </>\n )\n}\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 activeFilterCount = 0,\n advancedFilterCount,\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 headerActions,\n onExport,\n exportLabel = 'Export',\n onRefresh,\n refreshLabel = 'Refresh',\n className,\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 linha da busca, dentro do card da tabela —\n // com tudo o mais que refina as mesmas linhas. Era uma faixa de abas por cima,\n // que é a gramática de trocar de TELA: uma banda inteira gasta para dizer o\n // que uma pastilha diz ao lado do campo de busca.\n const tagFilter = showTags ? (\n <FilterChip\n label={tagsLabel}\n allLabel={allTagLabel}\n options={tags!.map((t) => ({ value: t.value, label: t.label }))}\n value={activeTag}\n onChange={(next) => onTagChange!(next)}\n />\n ) : null\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 <Card className=\"overflow-hidden\">\n {(showSearch || tagFilter || 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 {(tagFilter || filters || advancedFilters || 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. No celular eles se\n // recolhem num gatilho (abaixo) e a linha volta a ser uma.\n <div className=\"ml-auto flex flex-nowrap items-center justify-end gap-2 md:flex-wrap\">\n <ListFilters\n tagFilter={tagFilter}\n filters={filters}\n advanced={advancedFilters}\n label={filtersLabel}\n count={activeFilterCount}\n wideCount={advancedFilterCount ?? activeFilterCount}\n />\n {/* No FIM da fila de filtros e antes das ações: ele zera o\n que está à esquerda dele, e solto no meio separava dois\n filtros que se leem juntos. Só existe quando há o que\n zerar — um \"Limpar\" permanente é um botão que na maior\n parte do tempo não faz nada. */}\n {onClearFilters && activeFilterCount > 0 && (\n <button\n type=\"button\"\n onClick={onClearFilters}\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 {clearFiltersLabel}\n </button>\n )}\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 />\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'\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 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 variant?: 'input' | 'toolbar' | 'chip'\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', string> = {\n input: 'rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 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}\n\nexport function DatePicker({ value, onChange, className, variant = 'input', 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' : 'gap-2 hover:bg-muted/30'} ${TRIGGER_VARIANT[variant]}`}>\n <Calendar className={`shrink-0 ${variant === 'input' ? 'h-3.5 w-3.5 text-muted-foreground' : 'h-3 w-3 opacity-70'}`} />\n <span className=\"whitespace-nowrap\">\n {value\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, children,\n}: {\n title: string\n defaultOpen?: boolean\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>{title}</span>\n <ChevronDown className={`h-3.5 w-3.5 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 } from 'lucide-react'\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 /** 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 /** Custom render for each option */\n renderOption?: (option: SearchSelectOption) => React.ReactNode\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 /** 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 noResultsLabel,\n searchingLabel = 'Searching...',\n allowCreate,\n createLabel = 'Add',\n clearLabel = 'Clear',\n onCreate,\n renderOption,\n loadOnOpen = true,\n className,\n disabled,\n 'data-tour': dataTour,\n}: SearchSelectProps) {\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 } | null>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\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 setLoading(true)\n Promise.resolve(onSearch('')).then(setResults).catch(() => setResults([])).finally(() => setLoading(false))\n }\n }, [open, loadOnOpen])\n\n function handleQueryChange(q: string) {\n setQuery(q)\n if (timerRef.current) clearTimeout(timerRef.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 setResults(res)\n } catch {\n setResults([])\n }\n setLoading(false)\n }, debounce)\n }\n\n function handleSelect(option: SearchSelectOption) {\n onChange(option.id, option)\n setSelectedLabel(option.label)\n setOpen(false)\n setQuery('')\n setResults([])\n }\n\n function handleClear() {\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 const showDropdown = open && (query.length >= minChars || loadOnOpen)\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 setRect({ left: r.left, top: above ? r.top : r.bottom, width: r.width, above })\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])\n\n return (\n <div ref={containerRef} data-tour={dataTour} className={cn('relative', className)}>\n {label && (\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 <div\n className={cn(\n 'mt-1 flex items-center gap-2 rounded-lg border 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 <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 placeholder={placeholder}\n className=\"flex-1 bg-transparent py-2 pr-3 text-sm outline-none\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex-1 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=\"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 {/* Dropdown */}\n {showDropdown && rect && createPortal(\n <div\n ref={dropdownRef}\n style={{\n position: 'fixed',\n left: rect.left,\n width: rect.width,\n ...(rect.above ? { bottom: window.innerHeight - rect.top + 4 } : { top: rect.top + 4 }),\n }}\n className=\"fayz-glass-surface z-[60] overflow-hidden rounded-lg border bg-popover shadow-lg\"\n >\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 ) : (\n <div className=\"max-h-64 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((opt) => (\n <button\n key={opt.id}\n onClick={() => handleSelect(opt)}\n disabled={opt.disabled}\n className={cn(\n 'w-full text-left px-3 py-2 hover:bg-muted/50 transition-colors flex items-center gap-2.5',\n opt.disabled && 'opacity-40 cursor-not-allowed',\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=\"text-sm truncate\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground truncate\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n </button>\n ))}\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 </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 items-center rounded-lg 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=\"flex-1 bg-transparent px-2 py-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 { 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 /** `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 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 && (\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)}\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 </div>\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 : `w-full rounded-lg border bg-background pl-8 ${chevron ? 'pr-8' : 'pr-3'} py-2 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 { 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"]}
1
+ {"version":3,"sources":["../src/primitives/input.tsx","../src/primitives/badge.tsx","../src/primitives/modal.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/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/filter-chip.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/date-range-chip.tsx","../src/primitives/multi-select.tsx","../src/primitives/dictate-button.tsx","../src/primitives/markdown.tsx","../src/primitives/markdown-editor.tsx","../src/primitives/SearchCombobox.tsx","../src/primitives/stock-entry-form.tsx"],"names":["React","jsxs","jsx","React2","React3","React4","Separator","React5","React6","Icon","React7","MoreHorizontal","Check","React8","React9","formatPhone","useState","useRef","useEffect","React11","ChevronDown","Fragment","useCallback","Search","X","RefreshCw","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","useTranslation","useMemo","createPortal","DAY_LABELS","isSameDay","isToday","toDateLocale","getCurrentLocale","Plus","React16","React17","React18","React19","React20","React21","React23"],"mappings":"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","file":"chunk-BKTN6HDM.js","sourcesContent":["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\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-8 w-full rounded-input border border-input bg-card px-2 py-1 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 DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Animations are defined in styles.css under .saas-mdl-ov / .saas-mdl-ct\n// selectors with [data-state=\"open\"/\"closed\"]. Radix defers unmount when\n// it detects animationName on the element — CSS must be loaded before render.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Sizes\n// ---------------------------------------------------------------------------\n\nconst SIZE_MAP = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n // Duas colunas de trabalho lado a lado (ficha + linha do tempo) não cabem em\n // 3xl: a coluna da direita fica com 20rem e o texto de cada anotação quebra\n // a cada quatro palavras.\n '4xl': 'sm:max-w-4xl',\n '5xl': 'sm:max-w-5xl',\n full: 'sm:max-w-[calc(100vw-4rem)]',\n} as const\n\ntype ModalSize = keyof typeof SIZE_MAP\n\n// ---------------------------------------------------------------------------\n// Primitives re-export\n// ---------------------------------------------------------------------------\n\nconst Modal = DialogPrimitive.Root\nconst ModalTrigger = DialogPrimitive.Trigger\nconst ModalClose = DialogPrimitive.Close\nconst ModalPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay — also serves as the flex centering wrapper\n// ---------------------------------------------------------------------------\n\nconst ModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fayz-modal-overlay saas-mdl-ov fixed inset-0 z-[100]',\n 'flex items-center justify-center p-0 sm:p-6',\n className,\n )}\n {...props}\n />\n))\nModalOverlay.displayName = 'ModalOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — rendered INSIDE the overlay (flex-centered)\n// ---------------------------------------------------------------------------\n\nconst ModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n size?: ModalSize\n hideClose?: boolean\n noPadding?: boolean\n }\n>(({ className, children, size = 'lg', hideClose, noPadding, onPointerDownOutside, onInteractOutside, onCloseAutoFocus, ...props }, ref) => (\n <ModalPortal>\n <ModalOverlay>\n <DialogPrimitive.Content\n ref={ref}\n onCloseAutoFocus={(e) => {\n // Prevent Radix from stealing focus back to the trigger element on close.\n // This interferes with FullCalendar's selection and other interactive components.\n e.preventDefault()\n onCloseAutoFocus?.(e)\n }}\n onPointerDownOutside={(e) => {\n // Prevent Radix from intercepting clicks on portaled dropdowns (DatePicker, TimePicker, etc.)\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n // fz-container: a form inside a dialog measures the DIALOG. Without\n // it a two-column field grid in an `sm` modal read the window's width\n // and kept both columns in 380px.\n 'fayz-glass-surface fayz-modal-content saas-mdl-ct fz-container relative z-[100] flex flex-col w-full outline-none',\n // Mobile fullscreen\n 'h-full rounded-none border-0',\n // Desktop centered card\n 'sm:h-auto sm:max-h-[85vh] sm:rounded-2xl sm:border',\n SIZE_MAP[size],\n noPadding ? '' : 'p-6 gap-4',\n className,\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </ModalOverlay>\n </ModalPortal>\n))\nModalContent.displayName = 'ModalContent'\n\n// ---------------------------------------------------------------------------\n// Sections\n// ---------------------------------------------------------------------------\n\nfunction ModalHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left shrink-0', className)} {...props} />\n}\n\nfunction ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex-1 overflow-y-auto min-h-0', className)} {...props} />\n}\n\nfunction ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n // mt-auto: on mobile the content is fullscreen, so without it the buttons\n // float mid-screen right under a short body instead of sitting at the bottom.\n // On desktop the card is h-auto, so the auto margin collapses to nothing.\n return <div className={cn('mt-auto flex flex-col-reverse gap-2 sm:mt-0 sm:flex-row sm:justify-end sm:gap-0 sm:space-x-2 shrink-0', className)} {...props} />\n}\n\nconst ModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props} />\n))\nModalTitle.displayName = 'ModalTitle'\n\nconst ModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nModalDescription.displayName = 'ModalDescription'\n\nexport {\n Modal, ModalPortal, ModalOverlay, ModalClose, ModalTrigger,\n ModalContent, ModalHeader, ModalBody, ModalFooter, ModalTitle, ModalDescription,\n}\nexport type { ModalSize }\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-10 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 { 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 'w-full rounded-md border bg-background px-2.5 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 } from 'lucide-react'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownTrigger } from './dropdown'\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}\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 className?: string\n}\n\nexport function FilterChip({ allLabel, options, value, onChange, label, icon: Icon, className }: FilterChipProps) {\n const active = value != null && value !== ''\n const current = options.find((o) => o.value === value)\n\n return (\n <Dropdown>\n <DropdownTrigger 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 {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 </DropdownTrigger>\n <DropdownContent align=\"start\">\n {/* \"Todos\" é uma opção como as outras — limpar o filtro não deveria\n exigir um X separado que só aparece quando há algo para limpar. */}\n <DropdownItem onClick={() => onChange(undefined)}>\n {allLabel}\n {!active && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n {options.map((o) => (\n <DropdownItem key={o.value} onClick={() => onChange(o.value)}>\n {o.label}\n {value === o.value && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\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, SlidersHorizontal, X } 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 { FilterChip } from './filter-chip'\nimport { PageHeaderActions } from '../layout/ModulePage'\nimport { cn } from '../lib/cn'\nimport { Hint } from './hint'\nimport { Popover, PopoverTrigger, PopoverContent } from './popover'\nimport { useIsWide } from '../hooks/useIsWide'\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 /** Controls that narrow the list (period, account, …). They ride in the same\n * row as the search box, right above the table — não em um painel próprio. */\n filters?: React.ReactNode\n /** Os refinadores que NÃO merecem uma pastilha permanente na barra — plano\n * de contas, centro de custo, conta bancária. Ficam atrás de um \"Filtros\"\n * com a conta de quantos estão ativos, em qualquer largura: a barra mostra\n * o que se troca todo dia e guarda o resto a um clique. */\n advancedFilters?: 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 /** Quantos estão ativos DENTRO do painel. Na tela larga é essa a conta na\n * pastilha \"Filtros\": as outras pastilhas já mostram o próprio valor na\n * barra, e contá-las de novo ali dizia \"1 filtro escondido\" quando não\n * havia nenhum. Omitido, cai em `activeFilterCount`. */\n advancedFilterCount?: 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}\n\n// ---------------------------------------------------------------------------\n// Component\n\n/**\n * Os refinadores da lista: lado a lado numa tela larga, recolhidos atrás de um\n * gatilho num telefone.\n *\n * Inline no celular eles embrulhavam — \"Todos\", \"Todo o período\", \"Todos os\n * planos\", \"Todos os centros\" viravam duas linhas abaixo da busca, e a tabela,\n * que é o que a pessoa veio ver, começava três linhas depois. Recolhidos, a\n * linha da busca volta a ser UMA linha e eles seguem a um toque de distância,\n * empilhados com a largura inteira do painel em vez de espremidos em pílulas.\n *\n * Popover e não DropdownMenu: o que entra aqui são selects e campos, e o\n * typeahead do menu do Radix come o que se digita neles.\n */\nfunction ListFilters({ tagFilter, filters, advanced, label, count, wideCount }: {\n tagFilter?: React.ReactNode\n filters?: React.ReactNode\n advanced?: React.ReactNode\n label: string\n count: number\n wideCount: number\n}) {\n const wide = useIsWide()\n const [open, setOpen] = useState(false)\n if (!tagFilter && !filters && !advanced) return null\n\n // Numa tela larga as pastilhas do dia a dia ficam na barra; o resto entra no\n // painel. Num telefone TUDO entra no painel — inline, quatro pastilhas viram\n // duas linhas e a tabela, que é o que a pessoa veio ver, começa embaixo\n // delas.\n const inPanel = wide ? advanced : <>{tagFilter}{filters}{advanced}</>\n const badge = wide ? wideCount : count\n const trigger = wide && !advanced ? null : (\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.5 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors',\n badge > 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 >\n <SlidersHorizontal className=\"h-3 w-3 shrink-0 opacity-70\" />\n {/* O rótulo some no telefone: ali a barra disputa espaço com a busca,\n e o ícone com a conta já diz tudo o que a palavra diria. */}\n <span className=\"hidden sm:inline\">{label}</span>\n {badge > 0 && (\n <span className=\"rounded-full bg-primary/20 px-1.5 text-[10px] font-semibold tabular-nums\">{badge}</span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"flex max-h-[70vh] w-[min(18rem,calc(100vw-1.5rem))] flex-col gap-3 overflow-y-auto p-3 [&_button]:w-full [&_button]:justify-between\"\n >\n {inPanel}\n </PopoverContent>\n </Popover>\n )\n\n return (\n <>\n {wide && tagFilter}\n {wide && filters}\n {trigger}\n </>\n )\n}\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 activeFilterCount = 0,\n advancedFilterCount,\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 headerActions,\n onExport,\n exportLabel = 'Export',\n onRefresh,\n refreshLabel = 'Refresh',\n className,\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 linha da busca, dentro do card da tabela —\n // com tudo o mais que refina as mesmas linhas. Era uma faixa de abas por cima,\n // que é a gramática de trocar de TELA: uma banda inteira gasta para dizer o\n // que uma pastilha diz ao lado do campo de busca.\n const tagFilter = showTags ? (\n <FilterChip\n label={tagsLabel}\n allLabel={allTagLabel}\n options={tags!.map((t) => ({ value: t.value, label: t.label }))}\n value={activeTag}\n onChange={(next) => onTagChange!(next)}\n />\n ) : null\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 <Card className=\"overflow-hidden\">\n {(showSearch || tagFilter || 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 {(tagFilter || filters || advancedFilters || 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. No celular eles se\n // recolhem num gatilho (abaixo) e a linha volta a ser uma.\n <div className=\"ml-auto flex flex-nowrap items-center justify-end gap-2 md:flex-wrap\">\n <ListFilters\n tagFilter={tagFilter}\n filters={filters}\n advanced={advancedFilters}\n label={filtersLabel}\n count={activeFilterCount}\n wideCount={advancedFilterCount ?? activeFilterCount}\n />\n {/* No FIM da fila de filtros e antes das ações: ele zera o\n que está à esquerda dele, e solto no meio separava dois\n filtros que se leem juntos. Só existe quando há o que\n zerar — um \"Limpar\" permanente é um botão que na maior\n parte do tempo não faz nada. */}\n {onClearFilters && activeFilterCount > 0 && (\n <button\n type=\"button\"\n onClick={onClearFilters}\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 {clearFiltersLabel}\n </button>\n )}\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 />\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'\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 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 variant?: 'input' | 'toolbar' | 'chip'\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', string> = {\n input: 'rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 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}\n\nexport function DatePicker({ value, onChange, className, variant = 'input', 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' : 'gap-2 hover:bg-muted/30'} ${TRIGGER_VARIANT[variant]}`}>\n <Calendar className={`shrink-0 ${variant === 'input' ? 'h-3.5 w-3.5 text-muted-foreground' : 'h-3 w-3 opacity-70'}`} />\n <span className=\"whitespace-nowrap\">\n {value\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, children,\n}: {\n title: string\n defaultOpen?: boolean\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>{title}</span>\n <ChevronDown className={`h-3.5 w-3.5 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 } from 'lucide-react'\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 /** 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 /** Custom render for each option */\n renderOption?: (option: SearchSelectOption) => React.ReactNode\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 /** 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 noResultsLabel,\n searchingLabel = 'Searching...',\n allowCreate,\n createLabel = 'Add',\n clearLabel = 'Clear',\n onCreate,\n renderOption,\n loadOnOpen = true,\n className,\n disabled,\n 'data-tour': dataTour,\n}: SearchSelectProps) {\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 } | null>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\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 setLoading(true)\n Promise.resolve(onSearch('')).then(setResults).catch(() => setResults([])).finally(() => setLoading(false))\n }\n }, [open, loadOnOpen])\n\n function handleQueryChange(q: string) {\n setQuery(q)\n if (timerRef.current) clearTimeout(timerRef.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 setResults(res)\n } catch {\n setResults([])\n }\n setLoading(false)\n }, debounce)\n }\n\n function handleSelect(option: SearchSelectOption) {\n onChange(option.id, option)\n setSelectedLabel(option.label)\n setOpen(false)\n setQuery('')\n setResults([])\n }\n\n function handleClear() {\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 const showDropdown = open && (query.length >= minChars || loadOnOpen)\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 setRect({ left: r.left, top: above ? r.top : r.bottom, width: r.width, above })\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])\n\n return (\n <div ref={containerRef} data-tour={dataTour} className={cn('relative', className)}>\n {label && (\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 <div\n className={cn(\n 'mt-1 flex items-center gap-2 rounded-lg border 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 <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 placeholder={placeholder}\n className=\"flex-1 bg-transparent py-2 pr-3 text-sm outline-none\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={handleOpen}\n className=\"flex-1 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=\"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 {/* Dropdown */}\n {showDropdown && rect && createPortal(\n <div\n ref={dropdownRef}\n style={{\n position: 'fixed',\n left: rect.left,\n width: rect.width,\n ...(rect.above ? { bottom: window.innerHeight - rect.top + 4 } : { top: rect.top + 4 }),\n }}\n className=\"fayz-glass-surface z-[60] overflow-hidden rounded-lg border bg-popover shadow-lg\"\n >\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 ) : (\n <div className=\"max-h-64 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((opt) => (\n <button\n key={opt.id}\n onClick={() => handleSelect(opt)}\n disabled={opt.disabled}\n className={cn(\n 'w-full text-left px-3 py-2 hover:bg-muted/50 transition-colors flex items-center gap-2.5',\n opt.disabled && 'opacity-40 cursor-not-allowed',\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=\"text-sm truncate\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground truncate\">{opt.subtitle}</p>}\n </div>\n </>\n )}\n </button>\n ))}\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 </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 items-center rounded-lg 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=\"flex-1 bg-transparent px-2 py-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 { 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 /** `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 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 && (\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)}\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 </div>\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 : `w-full rounded-lg border bg-background pl-8 ${chevron ? 'pr-8' : 'pr-3'} py-2 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 { 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"]}