@fayz-ai/ui 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/derive.d.ts +1 -9
- package/dist/analytics/derive.d.ts.map +1 -1
- package/dist/{chunk-DFOAKWYB.js → chunk-5NEADAIP.js} +3 -3
- package/dist/{chunk-DFOAKWYB.js.map → chunk-5NEADAIP.js.map} +1 -1
- package/dist/{chunk-Z2ITFPGL.js → chunk-5WSKZU7M.js} +547 -74
- package/dist/chunk-5WSKZU7M.js.map +1 -0
- package/dist/{chunk-OBIU37AX.js → chunk-6YFPPK7X.js} +28 -14
- package/dist/chunk-6YFPPK7X.js.map +1 -0
- package/dist/{chunk-ZLPYNHXH.js → chunk-ERSX3C7T.js} +3 -3
- package/dist/{chunk-ZLPYNHXH.js.map → chunk-ERSX3C7T.js.map} +1 -1
- package/dist/{chunk-3OVZ5JJQ.js → chunk-GLRLWBBF.js} +4 -3
- package/dist/chunk-GLRLWBBF.js.map +1 -0
- package/dist/{chunk-AASANYXN.js → chunk-OB2ULDBD.js} +6 -4
- package/dist/chunk-OB2ULDBD.js.map +1 -0
- package/dist/chunk-SB6DWHXI.js +199 -0
- package/dist/chunk-SB6DWHXI.js.map +1 -0
- package/dist/dashboard/index.js +2 -2
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -25
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.d.ts +7 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/SaveBar.d.ts +10 -1
- package/dist/layout/SaveBar.d.ts.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/index.js +3 -3
- package/dist/lib/error-message.d.ts +2 -0
- package/dist/lib/error-message.d.ts.map +1 -0
- package/dist/primitives/brand-marks.d.ts +11 -0
- package/dist/primitives/brand-marks.d.ts.map +1 -0
- package/dist/primitives/button.d.ts +1 -1
- package/dist/primitives/dot-badge.d.ts +27 -0
- package/dist/primitives/dot-badge.d.ts.map +1 -0
- package/dist/primitives/draft-commit-bar.d.ts +27 -0
- package/dist/primitives/draft-commit-bar.d.ts.map +1 -0
- package/dist/primitives/filter-check-list.d.ts +65 -0
- package/dist/primitives/filter-check-list.d.ts.map +1 -0
- package/dist/primitives/header-tabs.d.ts +19 -0
- package/dist/primitives/header-tabs.d.ts.map +1 -1
- package/dist/primitives/image-drop.d.ts.map +1 -1
- package/dist/primitives/index.d.ts +6 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -4
- package/dist/primitives/list-chrome.d.ts +5 -1
- package/dist/primitives/list-chrome.d.ts.map +1 -1
- package/dist/primitives/mini-calendar.d.ts +36 -0
- package/dist/primitives/mini-calendar.d.ts.map +1 -0
- package/dist/primitives/multi-select.d.ts +21 -0
- package/dist/primitives/multi-select.d.ts.map +1 -0
- package/dist/primitives/select.d.ts.map +1 -1
- package/dist/primitives/stock-entry-form.d.ts +52 -0
- package/dist/primitives/stock-entry-form.d.ts.map +1 -0
- package/dist/styles.css +100 -0
- package/dist/tailwind.cjs +1 -1
- package/dist/tailwind.cjs.map +1 -1
- package/dist/tailwind.js +1 -1
- package/dist/tailwind.js.map +1 -1
- package/dist/wizard/index.js +2 -2
- package/dist/wizard/useWizard.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-3OVZ5JJQ.js.map +0 -1
- package/dist/chunk-4GK6IHOI.js +0 -177
- package/dist/chunk-4GK6IHOI.js.map +0 -1
- package/dist/chunk-AASANYXN.js.map +0 -1
- package/dist/chunk-OBIU37AX.js.map +0 -1
- package/dist/chunk-Z2ITFPGL.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/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/tooltip.tsx","../src/primitives/page-actions.tsx","../src/primitives/row-actions.tsx","../src/primitives/list-chrome.tsx","../src/primitives/bulk-action-bar.tsx","../src/primitives/thumbnail.tsx","../src/primitives/refresh-button.tsx","../src/primitives/phone-field.tsx","../src/primitives/stat-tiles.tsx","../src/primitives/hint.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/search-select.tsx","../src/primitives/currency-input.tsx","../src/primitives/popover.tsx","../src/primitives/segmented-control.tsx","../src/primitives/markdown.tsx","../src/primitives/markdown-editor.tsx","../src/primitives/SearchCombobox.tsx"],"names":["React","jsxs","jsx","React2","React3","React4","Separator","React5","React6","React7","Icon","ChevronDown","Fragment","React8","MoreHorizontal","React9","React10","React11","Check","formatPhone","React12","Hint","TooltipPrimitive2","useState","useRef","useEffect","createPortal","React14","useCallback","Plus","Search","RefreshCw","ChevronLeft","ChevronRight","useTranslation","useMemo","X","React17","React18","React19","React20"],"mappings":"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","file":"chunk-Z2ITFPGL.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 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 className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\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 * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '../lib/cn'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[120] overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, MoreHorizontal, MoreVertical, Plus } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { useIsWide } from '../hooks/useIsWide'\nimport { Button } from './button'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger } from './dropdown'\n\n// ---------------------------------------------------------------------------\n// What a screen can DO, declared rather than drawn.\n//\n// The header slot was only ever a portal: it imposed no button, variant, size,\n// order or collapse rule, so every screen invented its own and the same control\n// ended up with five treatments — solid, outline, ghost, icon-sized, and three\n// raw <button>s with the primary classes copied by hand.\n//\n// A screen now says what its actions ARE and this decides how they look. It is\n// the same trade the bottom nav makes: declare intent, let one renderer own\n// presentation, and a second presentation (a phone) costs nothing extra.\n//\n// The complement is PageToolbar, and the line between them holds: this carries\n// what you DO on a screen, that carries what the screen SHOWS. A period picker\n// is not an action.\n// ---------------------------------------------------------------------------\n\nexport type PageActionIntent = 'primary' | 'secondary' | 'utility' | 'danger'\n\nexport interface PageActionItem {\n id: string\n /** Already translated. The point of the type is that nothing hardcodes here. */\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /**\n * - `primary` the one thing the screen is for. At most one; extras demote.\n * - `secondary` other ways to do it (import, from AI) — folded under primary.\n * - `utility` settings, export, refresh. Icon-only beside the primary.\n * - `danger` destructive. Never inline; always behind the overflow.\n */\n intent?: PageActionIntent\n onSelect: () => void | Promise<void>\n disabled?: boolean\n /** Set by whoever resolves permissions — this renderer has no access engine. */\n hidden?: boolean\n /** Long-form line under the label when the action opens in a menu. */\n description?: string\n /** Kept so converting a hand-written button does not silently drop its hook. */\n testId?: string\n /**\n * This action makes a NEW record. It decides the FAB's face: \"+\" on a screen\n * you add to, \"⋮\" on a record you act upon. Not derivable from the icon —\n * \"Novo produto\" carries a Package, not a plus — and not from the screen\n * either, since a settings tab has a back crumb and still adds. Defaults to\n * the icon being a plus, which covers the plainly-named cases.\n */\n creates?: boolean\n /**\n * Offered on a pointer device only. Some actions cannot be FINISHED on a\n * phone — picking a CSV off a filesystem and mapping its columns is the\n * clearest case — and a menu entry that leads nowhere is worse than one that\n * is absent. Not about screen width: about whether the job can be done.\n */\n desktopOnly?: boolean\n}\n\nfunction iconOf(action: PageActionItem, className: string) {\n const Icon = action.icon\n return Icon ? <Icon className={className} /> : null\n}\n\n/**\n * Renders a declared action set.\n *\n * One primary survives: a screen with three equal buttons is a screen with no\n * obvious next step, and on a phone it simply overflows the header. Anything\n * after the first primary is treated as secondary.\n */\nexport function PageActionBar({ actions, className }: { actions: PageActionItem[]; className?: string }) {\n const wide = useIsWide()\n const visible = actions.filter((a) => !a.hidden)\n if (visible.length === 0) return null\n\n // A phone header has room for a title and not much else, and its top-right is\n // the furthest point from a thumb. The actions move to the corner the thumb\n // owns instead — the same set, a different place to reach it.\n if (!wide) {\n const usable = visible.filter((a) => !a.desktopOnly)\n return usable.length > 0 ? <PageActionFab actions={usable} /> : null\n }\n\n let seenPrimary = false\n const primary: PageActionItem[] = []\n const secondary: PageActionItem[] = []\n const utility: PageActionItem[] = []\n const danger: PageActionItem[] = []\n\n for (const a of visible) {\n const intent = a.intent ?? 'secondary'\n if (intent === 'primary' && !seenPrimary) { seenPrimary = true; primary.push(a); continue }\n if (intent === 'danger') { danger.push(a); continue }\n if (intent === 'utility') { utility.push(a); continue }\n secondary.push(a)\n }\n\n const head = primary[0]\n const menu = [...secondary, ...danger]\n\n return (\n <div className={cn('flex shrink-0 items-center gap-2', className)}>\n {/* Utilities read as chrome, so they sit before the thing you came to do. */}\n {utility.map((a) => (\n <Button\n key={a.id}\n variant=\"outline\"\n size=\"icon\"\n onClick={() => void a.onSelect()}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.label}\n data-testid={a.testId}\n data-tour={`action.${a.id}`}\n >\n {iconOf(a, 'h-4 w-4')}\n </Button>\n ))}\n\n {head && menu.length === 0 && (\n <Button onClick={() => void head.onSelect()} disabled={head.disabled} data-testid={head.testId} data-tour={`action.${head.id}`}>\n {iconOf(head, 'mr-1.5 h-4 w-4')}\n {head.label}\n </Button>\n )}\n\n {/* Primary plus alternatives: one button, one caret. Two buttons of equal\n weight is the thing that made these headers unreadable. */}\n {head && menu.length > 0 && (\n <div className=\"flex items-center\">\n <Button className=\"rounded-r-none\" onClick={() => void head.onSelect()} disabled={head.disabled} data-testid={head.testId} data-tour={`action.${head.id}`}>\n {iconOf(head, 'mr-1.5 h-4 w-4')}\n {head.label}\n </Button>\n <Dropdown>\n <DropdownTrigger asChild>\n <Button\n className=\"-ml-px rounded-l-none px-2\"\n aria-label={`${head.label}…`}\n // Anchors for the actions FOLDED behind this caret resolve to\n // the caret itself: pointing at a menu item nobody has opened\n // would spotlight an element that is not on screen.\n data-tour={menu.map((a) => `action.${a.id}`).join(' ')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n <ActionItems actions={menu} />\n </DropdownContent>\n </Dropdown>\n </div>\n )}\n\n {/* No primary, but things to offer: a plain overflow rather than promoting\n something the screen did not call primary. */}\n {!head && menu.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"icon\" aria-label=\"Ações\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n <ActionItems actions={menu} />\n </DropdownContent>\n </Dropdown>\n )}\n </div>\n )\n}\n\nfunction ActionItems({ actions, stagger }: { actions: PageActionItem[]; stagger?: boolean }) {\n const out: React.ReactNode[] = []\n actions.forEach((a, i) => {\n const isDanger = a.intent === 'danger'\n const prevSafe = i > 0 && actions[i - 1].intent !== 'danger'\n if (isDanger && prevSafe) out.push(<DropdownSeparator key={`${a.id}-sep`} />)\n out.push(\n <DropdownItem\n key={a.id}\n disabled={a.disabled}\n onSelect={() => void a.onSelect()}\n data-testid={a.testId}\n style={stagger ? ({ ['--i' as string]: i } as React.CSSProperties) : undefined}\n className={cn('gap-2', stagger && 'fz-fab-item', isDanger && 'text-destructive focus:text-destructive')}\n >\n {iconOf(a, 'h-4 w-4 shrink-0')}\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{a.label}</span>\n {a.description && (\n <span className=\"block truncate text-xs text-muted-foreground\">{a.description}</span>\n )}\n </span>\n </DropdownItem>,\n )\n })\n return <>{out}</>\n}\n\n/**\n * The phone presentation: one button in the thumb's corner.\n *\n * It rides on `--fz-bottom-bar`, so it sits above the tab bar where there is\n * one and drops to the screen edge on the screens where the bar retracts —\n * without knowing anything about either.\n *\n * A single action is performed by the tap. Opening a menu to offer one choice\n * is a question with one answer.\n */\nfunction PageActionFab({ actions }: { actions: PageActionItem[] }) {\n const byIntent = (i: PageActionIntent) => actions.filter((a) => (a.intent ?? 'secondary') === i)\n\n // Utilities are not the thing you came to do. Folded into the \"+\" they made\n // a create menu whose first entry was \"Configurações\"; they get their own,\n // smaller, neutral circle above it instead — near the thumb, clearly not the\n // primary. Alone on a screen they simply ARE the button.\n const utility = byIntent('utility')\n const main = [...byIntent('primary'), ...byIntent('secondary'), ...byIntent('danger')]\n\n if (main.length === 0) return <FabButton actions={utility} tone=\"neutral\" />\n\n // Its face follows what the whole set is FOR, not what its first entry looks\n // like. A screen whose every action inserts something is a screen you add on\n // — the circle is a \"+\", even when the menu offers three ways in and none of\n // their icons is a plus. One non-inserting action and it is not that screen\n // any more: a record's own actions get the neutral \"⋮\", because painting\n // those brand made every record page look like an invitation to create.\n const isCreate = main.every((a) => a.creates ?? a.icon === Plus)\n return (\n <>\n {utility.length > 0 && <FabButton actions={utility} tone=\"neutral\" mini />}\n <FabButton actions={main} tone={isCreate ? 'primary' : 'neutral'} />\n </>\n )\n}\n\n/**\n * Keeps the scrim mounted through its fade-OUT.\n *\n * Radix animates its own content out with `data-state=closed`; a plain element\n * of ours has no such state, so unmounting on close would cut the dim instantly\n * while the menu was still leaving. Mounted first, painted transparent, then\n * faded in on the next frame — a transition needs two values to run between.\n */\nfunction useScrim(open: boolean): { mounted: boolean; visible: boolean } {\n const [mounted, setMounted] = React.useState(open)\n const [visible, setVisible] = React.useState(open)\n\n React.useEffect(() => {\n if (open) {\n setMounted(true)\n const frame = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(frame)\n }\n setVisible(false)\n const timer = window.setTimeout(() => setMounted(false), SCRIM_MS)\n return () => window.clearTimeout(timer)\n }, [open])\n\n return { mounted, visible }\n}\n\n/** Matches `duration-200` on the scrim. */\nconst SCRIM_MS = 200\n\n/** One circle: it performs a lone action, or opens the rest upward. */\nfunction FabButton({ actions, tone, mini }: {\n actions: PageActionItem[]\n tone: 'primary' | 'neutral'\n /** Stacked above the main circle, one size down. */\n mini?: boolean\n}) {\n const [open, setOpen] = React.useState(false)\n const scrim = useScrim(open)\n if (actions.length === 0) return null\n\n const isCreate = tone === 'primary'\n const FabIcon = isCreate ? Plus : MoreVertical\n // The mini sits one main circle (3.5rem) plus a gap above the main one, so\n // both move together when the tab bar retracts.\n const style = {\n bottom: mini ? 'calc(var(--fz-bottom-bar, 0px) + 4.75rem)' : 'calc(var(--fz-bottom-bar, 0px) + 1rem)',\n } as React.CSSProperties\n\n const shell = cn(\n 'fz-tap fixed z-40 flex items-center justify-center rounded-full',\n 'transition-transform active:scale-95 md:hidden',\n // Centred on the main circle's column, so the two read as one stack.\n mini ? 'right-5 h-12 w-12' : 'right-4 h-14 w-14',\n isCreate\n // The wide ring is what holds a saturated disc off the content it covers.\n ? 'bg-primary text-primary-foreground shadow-lg shadow-primary/30 ring-4 ring-background'\n // Neutral on purpose: \"⋮\" is not the thing you came to do, and painting\n // it brand made every record page look like it was inviting a create.\n //\n // A hairline, not that wide ring: white circle + 4px of page colour +\n // shadow drew a second disc behind the first, and the pair read as two\n // buttons stacked. And a hairline, not a `border` — a theme may turn any\n // bordered card surface into glass (`.bg-card.border` →\n // fayz-glass-surface), and beauty does; the circle came out see-through\n // with the board scrolling underneath it.\n : 'bg-card text-foreground shadow-lg ring-1 ring-border',\n )\n\n if (actions.length === 1) {\n const only = actions[0]\n const Icon = only.icon ?? FabIcon\n return (\n <button\n type=\"button\"\n style={style}\n className={shell}\n onClick={() => void only.onSelect()}\n disabled={only.disabled}\n aria-label={only.label}\n data-testid={only.testId}\n >\n <Icon className={mini ? 'h-5 w-5' : 'h-6 w-6'} />\n </button>\n )\n }\n\n return (\n <Dropdown open={open} onOpenChange={setOpen}>\n {/* The page dims behind the menu, the way a sheet dims behind itself: on a\n phone the menu is the only thing to answer, and the list of records\n under it kept reading as a place you could still tap. Portalled to the\n body so no ancestor's stacking context can trap it below the menu. */}\n {scrim.mounted && typeof document !== 'undefined' && createPortal(\n <div\n aria-hidden\n onClick={() => setOpen(false)}\n className={cn(\n 'fixed inset-0 z-[100] bg-foreground/40 transition-opacity duration-200 md:hidden',\n 'motion-reduce:transition-none',\n scrim.visible ? 'opacity-100' : 'opacity-0',\n )}\n />,\n document.body,\n )}\n <DropdownTrigger asChild>\n <button\n type=\"button\"\n style={style}\n // Only the \"+\" rotates into an \"×\": a vertical ellipsis spun 135°\n // reads as a glitch, not as \"tap again to close\".\n //\n // Above the scrim while open: the circle is what closes the menu, and\n // dimming the way out is the one thing the dim must not do.\n className={cn(shell, open && 'z-[105]', isCreate && 'fz-fab-trigger')}\n aria-label={actionsMenuLabel}\n >\n <FabIcon className={mini ? 'h-5 w-5' : 'h-6 w-6'} />\n </button>\n </DropdownTrigger>\n {/* Upward, from the button: a menu that opened downward would run straight\n off the bottom of the screen. */}\n <DropdownContent side=\"top\" align=\"end\" sideOffset={12} className=\"fz-fab-menu w-60 md:hidden\">\n <ActionItems actions={actions} stagger />\n </DropdownContent>\n </Dropdown>\n )\n}\n\n/** The FAB's accessible name when it opens a menu. Overridable for locale. */\nexport let actionsMenuLabel = 'Ações'\nexport function setActionsMenuLabel(label: string) { actionsMenuLabel = label }\n","import * as React from 'react'\nimport { MoreHorizontal } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Dropdown, DropdownContent, DropdownItem, DropdownSeparator, DropdownTrigger } from './dropdown'\nimport type { PageActionItem } from './page-actions'\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 <Button\n key={a.id}\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 title={a.label}\n data-testid={a.testId}\n >\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n </Button>\n )\n })}\n\n {overflow.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\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 </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, Search } from 'lucide-react'\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 'data-testid'?: string\n}\n\n/** Borderless on purpose: the card already draws the boundary. */\nexport function SearchField({ value, onChange, placeholder, ...rest }: SearchFieldProps) {\n return (\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n 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/** Count on the left, arrows on the right: one says where you are, one moves. */\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\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 <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 <span className=\"px-1 text-xs tabular-nums text-muted-foreground\">\n {page.toLocaleString()} / {pages.toLocaleString()}\n </span>\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 </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 { 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'\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 <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n title={title}\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 )\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 * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\nexport interface HintProps extends React.HTMLAttributes<HTMLElement> {\n /** The tip. Nothing renders when this is empty. */\n label?: React.ReactNode\n children: React.ReactElement\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Milliseconds before it opens. 0 — an icon button gives no other clue what\n * it does, so waiting 700ms to find out is the wrong trade. */\n delayDuration?: number\n}\n\n/**\n * A styled tooltip for any control that would otherwise rely on the browser's\n * native `title` attribute.\n *\n * `title=` looks like a tooltip until you use one: it appears after a ~1s\n * delay you cannot change, in the OS's own styling, never on touch, and it is\n * skipped by several screen readers. This renders the design-system tooltip\n * instead, and — because the trigger keeps its own `aria-describedby` — the\n * text is announced rather than merely drawn.\n *\n * Self-contained on purpose: it mounts its own Provider so a caller can drop a\n * Hint anywhere without first knowing whether some ancestor set one up.\n */\nexport const Hint = React.forwardRef<HTMLElement, HintProps>(function Hint(\n { label, children, side = 'top', delayDuration = 0, ...rest },\n ref,\n) {\n // `rest` + ref repassados ao filho porque um Hint costuma envolver o gatilho\n // de OUTRA coisa — `<DropdownTrigger asChild><Hint><button/></Hint>`. Sem\n // isso o Hint engolia os handlers do dropdown e o botão virava enfeite: o\n // menu de ordenar simplesmente não abria.\n if (!label) return React.cloneElement(children, { ...rest, ref } as never)\n return (\n <TooltipPrimitive.Provider delayDuration={delayDuration}>\n <Tooltip>\n <TooltipTrigger asChild {...rest} ref={ref as never}>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"px-2 py-1 text-xs font-medium\">\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipPrimitive.Provider>\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, Download, RefreshCw } from 'lucide-react'\nimport { DataTable } from './data-table'\nimport { BulkActionBar } from './bulk-action-bar'\nimport { useRowSelection, type RowBulkAction } from './use-row-selection'\nimport { Button } from './button'\nimport { PageActionBar, type PageActionItem } from './page-actions'\nimport { Card } from './card'\nimport { FilterChip } from './filter-chip'\nimport { PageHeaderActions } from '../layout/ModulePage'\nimport { cn } from '../lib/cn'\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\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 /** 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\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\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 /** 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\nexport function ListView<TData>({\n columns,\n data,\n loading = false,\n searchPlaceholder = 'Search...',\n search: controlledSearch,\n onSearchChange,\n searchDebounce = 300,\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 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 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 <div className=\"relative min-w-0 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 || onRefresh || onExport) && (\n <div className=\"ml-auto flex flex-wrap items-center justify-end gap-2\">\n {tagFilter}\n {filters}\n {onRefresh && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={refreshLabel} title={refreshLabel} onClick={onRefresh} className={ICON_BTN}>\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n )}\n {onExport && (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={exportLabel} title={exportLabel} onClick={onExport} className={ICON_BTN}>\n <Download className=\"h-4 w-4\" />\n </Button>\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 </Card>\n\n {/* ── Pagination ── */}\n {showPagination && (\n <div className=\"flex items-center justify-between px-1\">\n <p className=\"text-xs text-muted-foreground\">\n {((page - 1) * pageSize) + 1}–{Math.min(page * pageSize, totalItems)} of {totalItems}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange!(page - 1)}\n disabled={page <= 1}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange!(page + 1)}\n disabled={page >= totalPages}\n className=\"flex h-7 w-7 items-center justify-center rounded-md border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n )}\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 * 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}\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}: 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} 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 * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../lib/cn'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] w-72 rounded-xl border bg-popover p-0 text-popover-foreground shadow-lg outline-none',\n 'data-[state=open]:animate-zoom-in data-[state=closed]:animate-zoom-out',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { 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} “<span className=\"font-medium\">{value.trim()}</span>”</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
|