@motor-hero/ui-kit 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/theme-provider.tsx","../src/lib/company-theme.ts","../src/hooks/use-company-subdomain.ts","../src/components/mode-toggle.tsx","../src/components/empty-state.tsx","../src/components/confirm-dialog.tsx","../src/components/page-header.tsx","../src/components/status-dot.tsx","../src/components/status-badge.tsx","../src/components/progress-bar.tsx","../src/components/form-field.tsx","../src/components/base-dialog.tsx","../src/hooks/use-is-desktop.ts","../src/lib/utils.ts","../src/components/form-dialog.tsx","../src/components/auth-card.tsx","../src/components/pagination.tsx","../src/components/table-skeleton.tsx","../src/components/search-input.tsx","../src/components/password-input.tsx","../src/components/combobox.tsx","../src/hooks/use-infinite-scroll-sentinel.ts","../src/components/multi-combobox.tsx","../src/components/color-picker.tsx","../src/components/stat-card.tsx","../src/components/data-table-wrapper.tsx","../src/components/mobile-card-list.tsx","../src/components/responsive-data-view.tsx","../src/components/toaster.tsx","../src/components/app-shell.tsx","../src/components/sidebar-nav.tsx","../src/components/types.tsx","../src/components/user-menu.tsx","../src/components/row-actions-menu.tsx","../src/lib/api-error.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-toast.ts"],"sourcesContent":["// Theme\nexport { ThemeProvider, useTheme } from \"./components/theme-provider\"\nexport type { Theme, ThemeProviderProps, ThemeProviderState } from \"./components/theme-provider\"\nexport { applyCompanyTheme } from \"./lib/company-theme\"\nexport type { CompanyTheme, CompanyThemeTokens } from \"./lib/company-theme\"\nexport { useCompanySubdomain, getSubdomain } from \"./hooks/use-company-subdomain\"\nexport type {\n UseCompanySubdomainOptions,\n UseCompanySubdomainResult,\n} from \"./hooks/use-company-subdomain\"\n\n// Components\nexport { ModeToggle } from \"./components/mode-toggle\"\nexport { EmptyState } from \"./components/empty-state\"\nexport { ConfirmDialog } from \"./components/confirm-dialog\"\nexport { PageHeader } from \"./components/page-header\"\nexport { StatusDot } from \"./components/status-dot\"\nexport { StatusBadge } from \"./components/status-badge\"\nexport type { StatusBadgeVariant } from \"./components/status-badge\"\nexport { ProgressBar } from \"./components/progress-bar\"\nexport { FormField } from \"./components/form-field\"\nexport { BaseDialog } from \"./components/base-dialog\"\nexport type { BaseDialogProps, BaseDialogSize } from \"./components/base-dialog\"\nexport { FormDialogLayout, FormDialog } from \"./components/form-dialog\"\nexport type { FormDialogProps, FormDialogSize } from \"./components/form-dialog\"\nexport { AuthCard } from \"./components/auth-card\"\nexport { Pagination } from \"./components/pagination\"\nexport { TableSkeleton } from \"./components/table-skeleton\"\nexport { SearchInput } from \"./components/search-input\"\nexport { PasswordInput } from \"./components/password-input\"\nexport { Combobox } from \"./components/combobox\"\nexport type { ComboboxOption, ComboboxProps } from \"./components/combobox\"\nexport { MultiCombobox } from \"./components/multi-combobox\"\nexport type { MultiComboboxProps } from \"./components/multi-combobox\"\nexport { ColorPicker } from \"./components/color-picker\"\nexport type { ColorPickerProps } from \"./components/color-picker\"\nexport { StatCard } from \"./components/stat-card\"\nexport { DataTableWrapper } from \"./components/data-table-wrapper\"\nexport { MobileCardList } from \"./components/mobile-card-list\"\nexport { ResponsiveDataView } from \"./components/responsive-data-view\"\nexport { Toaster } from \"./components/toaster\"\n\n// App shell\nexport { AppShell } from \"./components/app-shell\"\nexport type { AppShellProps } from \"./components/app-shell\"\nexport { SidebarNav } from \"./components/sidebar-nav\"\nexport type { NavItem, SidebarNavProps } from \"./components/sidebar-nav\"\nexport { UserMenu } from \"./components/user-menu\"\nexport type { AppUser, UserMenuItem, UserMenuProps } from \"./components/user-menu\"\nexport { RowActionsMenu } from \"./components/row-actions-menu\"\nexport type { RowAction, RowActionsMenuProps } from \"./components/row-actions-menu\"\nexport { defaultRenderLink } from \"./components/types\"\nexport type { RenderLink, RenderLinkProps } from \"./components/types\"\n\n// Utilities\nexport { cn } from \"./lib/utils\"\nexport { extractApiError } from \"./lib/api-error\"\n\n// Hooks\nexport { useDisclosure } from \"./hooks/use-disclosure\"\nexport { useIsDesktop } from \"./hooks/use-is-desktop\"\nexport { useCustomToast, toast } from \"./hooks/use-toast\"\n","import { createContext, useContext, useEffect, useState } from \"react\"\nimport { applyCompanyTheme, type CompanyTheme } from \"../lib/company-theme\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n companyTheme?: CompanyTheme\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"ui-theme\",\n companyTheme,\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(\n () => (localStorage.getItem(storageKey) as Theme) || defaultTheme\n )\n\n useEffect(() => {\n const root = window.document.documentElement\n const applyResolved = (resolved: \"light\" | \"dark\") => {\n root.classList.remove(\"light\", \"dark\")\n root.classList.add(resolved)\n applyCompanyTheme(root, companyTheme, resolved)\n }\n\n if (theme === \"system\") {\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\")\n applyResolved(mql.matches ? \"dark\" : \"light\")\n const onChange = (e: MediaQueryListEvent) =>\n applyResolved(e.matches ? \"dark\" : \"light\")\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }\n\n applyResolved(theme)\n }, [theme, companyTheme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = useContext(ThemeProviderContext)\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n }\n return context\n}\n\nexport type { Theme, ThemeProviderProps, ThemeProviderState }\n","export type CompanyThemeTokens = {\n primary?: string | null\n primaryForeground?: string | null\n secondary?: string | null\n secondaryForeground?: string | null\n accent?: string | null\n accentForeground?: string | null\n ring?: string | null\n}\n\nexport type CompanyTheme = {\n light: CompanyThemeTokens\n dark?: Partial<CompanyThemeTokens>\n}\n\nconst VAR_MAP: Record<keyof CompanyThemeTokens, string> = {\n primary: \"--color-primary\",\n primaryForeground: \"--color-primary-foreground\",\n secondary: \"--color-secondary\",\n secondaryForeground: \"--color-secondary-foreground\",\n accent: \"--color-accent\",\n accentForeground: \"--color-accent-foreground\",\n ring: \"--color-ring\",\n}\n\n// A dark token that is null/undefined means \"no override\" — inherit the light\n// value. The API serializes unset *_dark columns as explicit null, so spreading\n// the raw dark object would clobber the inherited light values; strip them first.\nfunction definedTokens(\n tokens: Partial<CompanyThemeTokens> | undefined\n): Partial<CompanyThemeTokens> {\n if (!tokens) return {}\n return Object.fromEntries(\n Object.entries(tokens).filter(([, value]) => value != null)\n )\n}\n\nexport function applyCompanyTheme(\n root: HTMLElement,\n companyTheme: CompanyTheme | undefined,\n mode: \"light\" | \"dark\"\n) {\n const tokens: CompanyThemeTokens = companyTheme\n ? mode === \"dark\"\n ? { ...companyTheme.light, ...definedTokens(companyTheme.dark) }\n : companyTheme.light\n : {}\n\n for (const key of Object.keys(VAR_MAP) as (keyof CompanyThemeTokens)[]) {\n const value = tokens[key]\n if (value) root.style.setProperty(VAR_MAP[key], value)\n else root.style.removeProperty(VAR_MAP[key])\n }\n}\n","import { useState } from \"react\"\n\nexport type UseCompanySubdomainOptions = {\n enableOverride?: boolean\n overrideStorageKey?: string\n}\n\nexport type UseCompanySubdomainResult = {\n subdomain: string | undefined\n}\n\nexport function getSubdomain(hostname: string): string | undefined {\n const labels = hostname.split(\".\")\n if (labels.length < 2) return undefined\n const first = labels[0]\n if (!first || first === \"www\" || first === \"localhost\") return undefined\n return first\n}\n\nfunction resolveOverride(storageKey: string): string | undefined {\n if (typeof window === \"undefined\") return undefined\n const params = new URLSearchParams(window.location.search)\n if (params.has(\"company\")) {\n const value = params.get(\"company\")\n if (value) {\n window.localStorage.setItem(storageKey, value)\n return value\n }\n window.localStorage.removeItem(storageKey)\n return undefined\n }\n return window.localStorage.getItem(storageKey) ?? undefined\n}\n\nexport function useCompanySubdomain(\n opts: UseCompanySubdomainOptions = {},\n): UseCompanySubdomainResult {\n const { enableOverride = false, overrideStorageKey = \"company-subdomain\" } =\n opts\n\n const [subdomain] = useState<string | undefined>(() => {\n if (enableOverride) {\n const override = resolveOverride(overrideStorageKey)\n if (override) return override\n }\n if (typeof window === \"undefined\") return undefined\n return getSubdomain(window.location.hostname)\n })\n\n return { subdomain }\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { Moon, Sun, Monitor } from \"lucide-react\"\nimport { useTheme } from \"./theme-provider\"\n\nexport function ModeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className=\"relative inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n aria-label=\"Alternar tema\"\n >\n <Sun className=\"h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute inset-0 m-auto h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n className=\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"light\")}\n >\n <Sun className=\"h-4 w-4\" /> Claro\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"dark\")}\n >\n <Moon className=\"h-4 w-4\" /> Escuro\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"system\")}\n >\n <Monitor className=\"h-4 w-4\" /> Sistema\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface EmptyStateProps {\n icon?: ReactNode\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={`flex flex-col items-center justify-center py-16 text-center ${className ?? \"\"}`}>\n {icon && <div className=\"mb-4 text-muted-foreground\">{icon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{title}</h3>\n {description && (\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n","import * as AlertDialog from \"@radix-ui/react-alert-dialog\"\nimport type { ReactNode } from \"react\"\n\ninterface ConfirmDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onConfirm: () => void\n title: string\n description: ReactNode\n confirmLabel?: string\n cancelLabel?: string\n loading?: boolean\n variant?: \"default\" | \"destructive\"\n}\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n loading = false,\n variant = \"default\",\n}: ConfirmDialogProps) {\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Portal>\n <AlertDialog.Overlay className=\"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" />\n <AlertDialog.Content className=\"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\">\n <div className=\"flex flex-col space-y-2 text-center sm:text-left\">\n <AlertDialog.Title className=\"text-lg font-semibold\">{title}</AlertDialog.Title>\n <AlertDialog.Description className=\"text-sm text-muted-foreground\">\n {description}\n </AlertDialog.Description>\n </div>\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <AlertDialog.Cancel className=\"inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer\">\n {cancelLabel}\n </AlertDialog.Cancel>\n <AlertDialog.Action\n onClick={onConfirm}\n disabled={loading}\n className={`inline-flex h-9 items-center justify-center rounded-md px-4 text-sm font-medium shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer ${\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\"\n }`}\n >\n {loading ? \"Aguarde...\" : confirmLabel}\n </AlertDialog.Action>\n </div>\n </AlertDialog.Content>\n </AlertDialog.Portal>\n </AlertDialog.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface PageHeaderProps {\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function PageHeader({ title, description, action, className }: PageHeaderProps) {\n return (\n <div\n className={`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between ${className ?? \"\"}`}\n >\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-2xl font-semibold tracking-tight\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n )\n}\n","interface StatusDotProps {\n active: boolean\n label?: string\n className?: string\n}\n\nexport function StatusDot({ active, label, className }: StatusDotProps) {\n return (\n <span className={`inline-flex items-center gap-2 ${className ?? \"\"}`}>\n <span\n className={`h-2 w-2 rounded-full ${active ? \"bg-green-500\" : \"bg-red-500\"}`}\n />\n {label && <span>{label}</span>}\n </span>\n )\n}\n","import type { ReactNode } from \"react\"\n\nexport type StatusBadgeVariant =\n | \"neutral\"\n | \"info\"\n | \"success\"\n | \"danger\"\n | \"warning\"\n\ninterface StatusBadgeProps {\n variant?: StatusBadgeVariant\n dot?: boolean\n className?: string\n children: ReactNode\n}\n\nconst variantClasses: Record<\n StatusBadgeVariant,\n { badge: string; dot: string }\n> = {\n neutral: {\n badge: \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\",\n dot: \"bg-gray-400\",\n },\n info: {\n badge: \"bg-blue-100 text-blue-700 dark:bg-blue-950 dark:text-blue-400\",\n dot: \"bg-blue-500\",\n },\n success: {\n badge: \"bg-green-100 text-green-700 dark:bg-green-950 dark:text-green-400\",\n dot: \"bg-green-500\",\n },\n danger: {\n badge: \"bg-red-100 text-red-700 dark:bg-red-950 dark:text-red-400\",\n dot: \"bg-red-500\",\n },\n warning: {\n badge: \"bg-amber-100 text-amber-700 dark:bg-amber-950 dark:text-amber-400\",\n dot: \"bg-amber-500\",\n },\n}\n\nexport function StatusBadge({\n variant = \"neutral\",\n dot = true,\n className,\n children,\n}: StatusBadgeProps) {\n const classes = variantClasses[variant]\n\n return (\n <span\n className={`inline-flex items-center gap-1.5 rounded-md px-2 py-0.5 text-xs font-medium ${classes.badge} ${className ?? \"\"}`}\n >\n {dot && (\n <span\n className={`inline-block h-1.5 w-1.5 shrink-0 rounded-full ${classes.dot}`}\n />\n )}\n {children}\n </span>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface ProgressBarProps {\n value: number\n size?: \"sm\" | \"md\"\n label?: ReactNode\n valueLabel?: ReactNode\n className?: string\n indicatorClassName?: string\n}\n\nconst sizeClasses = {\n sm: \"h-1.5\",\n md: \"h-2\",\n} as const\n\nexport function ProgressBar({\n value,\n size = \"md\",\n label,\n valueLabel,\n className,\n indicatorClassName,\n}: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value))\n\n return (\n <div className={`space-y-1.5 ${className ?? \"\"}`}>\n {(label || valueLabel) && (\n <div className=\"flex items-baseline justify-between gap-2\">\n {label && (\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n )}\n {valueLabel && (\n <span className=\"text-sm font-semibold\">{valueLabel}</span>\n )}\n </div>\n )}\n <div\n className={`w-full overflow-hidden rounded-full bg-muted ${sizeClasses[size]}`}\n >\n <div\n className={`h-full rounded-full transition-all duration-300 ${indicatorClassName ?? \"bg-primary\"}`}\n style={{ width: `${clamped}%` }}\n />\n </div>\n </div>\n )\n}\n","import { type ReactElement, type ReactNode, cloneElement, isValidElement, useId } from \"react\"\n\ninterface FormFieldProps {\n label: string\n htmlFor?: string\n error?: string\n required?: boolean\n children: ReactNode\n className?: string\n}\n\nexport function FormField({ label, htmlFor, error, required, children, className }: FormFieldProps) {\n const errorId = useId()\n\n // Wire accessibility onto the control: mark it invalid and point it at the\n // error message so screen readers announce both.\n const field =\n error && isValidElement(children)\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n \"aria-invalid\": true,\n \"aria-describedby\": [\n (children.props as Record<string, unknown>)[\"aria-describedby\"],\n errorId,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n : children\n\n return (\n <div className={`space-y-2 ${className ?? \"\"}`}>\n <label\n htmlFor={htmlFor}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n {field}\n {error && (\n <p id={errorId} className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import * as Dialog from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport * as React from \"react\"\nimport type { ReactNode } from \"react\"\n\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nconst sizeClasses = {\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 \"4xl\": \"sm:max-w-4xl\",\n \"5xl\": \"sm:max-w-5xl\",\n \"6xl\": \"sm:max-w-6xl\",\n \"7xl\": \"sm:max-w-7xl\",\n} as const\n\nexport type BaseDialogSize = keyof typeof sizeClasses\n\nexport interface BaseDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: ReactNode\n children: ReactNode\n footer?: ReactNode\n size?: BaseDialogSize\n className?: string\n /**\n * Radix `modal` for the underlying Dialog. Defaults to `!isDesktop`: on\n * desktop the dialog is non-modal so a Combobox/Select popover (portaled\n * outside the dialog) can receive focus and keystrokes; on mobile it stays\n * modal so the bottom-sheet behaves. Pass explicitly to override.\n */\n modal?: boolean\n /**\n * Advanced: wraps the dialog's inner content (header + body + footer) inside\n * Content. Used by FormDialog to inject a <form>. Defaults to identity.\n */\n contentWrapper?: (content: ReactNode) => ReactNode\n}\n\n/**\n * Standardized, responsive dialog shell:\n * - mobile: bottom sheet (full width, up to 92vh tall)\n * - desktop: centered dialog (up to 90vh tall)\n * Header and footer stay fixed; only the body scrolls.\n *\n * Also fixes the known Radix bug where `body { pointer-events: none }`\n * can persist after closing a dialog that contained a Select/Popover,\n * which would otherwise make the rest of the page unclickable.\n */\nexport function BaseDialog({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n size = \"lg\",\n className,\n modal,\n contentWrapper = (content) => content,\n}: BaseDialogProps) {\n const isDesktop = useIsDesktop()\n React.useEffect(() => {\n if (open) return\n const id = window.setTimeout(() => {\n if (document.body.style.pointerEvents === \"none\") {\n document.body.style.pointerEvents = \"\"\n }\n }, 0)\n return () => window.clearTimeout(id)\n }, [open])\n\n const body = (\n <>\n <div className=\"flex shrink-0 items-start justify-between gap-4 border-b px-6 py-3\">\n <div className=\"min-w-0 space-y-1\">\n <Dialog.Title className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </Dialog.Title>\n {description && (\n <Dialog.Description className=\"text-sm text-muted-foreground\">\n {description}\n </Dialog.Description>\n )}\n </div>\n <Dialog.Close\n className=\"-mr-1 shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Fechar\"\n >\n <X className=\"h-5 w-5\" />\n </Dialog.Close>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n {footer && (\n <div className=\"flex shrink-0 flex-col-reverse gap-2 border-t px-6 py-3 sm:flex-row sm:justify-end\">\n {footer}\n </div>\n )}\n </>\n )\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange} modal={modal ?? !isDesktop}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" />\n <Dialog.Content\n onCloseAutoFocus={() => {\n document.body.style.pointerEvents = \"\"\n }}\n className={cn(\n \"fixed z-50 flex max-h-[92vh] flex-col bg-background shadow-lg outline-none\",\n \"inset-x-0 bottom-0 rounded-t-2xl\",\n \"sm:inset-x-auto sm:bottom-auto sm:left-1/2 sm:top-1/2 sm:max-h-[92vh] sm:w-full sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-lg\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n sizeClasses[size],\n className,\n )}\n >\n {contentWrapper(body)}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import * as React from \"react\"\n\nconst DESKTOP_QUERY = \"(min-width: 640px)\"\n\n/**\n * Retorna `true` no desktop (>= 640px, breakpoint `sm`) e `false` no mobile.\n * Usado para alternar Popover/DropdownMenu (desktop) por Drawer/bottom sheet\n * (mobile) em componentes responsivos como Combobox e os menus de ação.\n */\nexport function useIsDesktop(): boolean {\n const [isDesktop, setIsDesktop] = React.useState(() =>\n typeof window !== \"undefined\"\n ? window.matchMedia(DESKTOP_QUERY).matches\n : true,\n )\n\n React.useEffect(() => {\n const mql = window.matchMedia(DESKTOP_QUERY)\n const onChange = () => setIsDesktop(mql.matches)\n onChange()\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return isDesktop\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport type { ReactNode } from \"react\"\n\nimport { BaseDialog, type BaseDialogProps, type BaseDialogSize } from \"./base-dialog\"\n\ninterface FormDialogLayoutProps {\n title: string\n children: ReactNode\n onSubmit: (e: React.FormEvent) => void\n submitLabel?: string\n cancelLabel?: string\n onCancel: () => void\n isSubmitting?: boolean\n isDisabled?: boolean\n}\n\nexport function FormDialogLayout({\n title,\n children,\n onSubmit,\n submitLabel = \"Salvar\",\n cancelLabel = \"Cancelar\",\n onCancel,\n isSubmitting = false,\n isDisabled = false,\n}: FormDialogLayoutProps) {\n return (\n <form onSubmit={onSubmit}>\n <div className=\"flex flex-col space-y-1.5 text-center sm:text-left\">\n <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>\n </div>\n <div className=\"space-y-4 py-4\">{children}</div>\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting || isDisabled}\n className=\"inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow transition-colors hover:bg-primary/90 cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n {isSubmitting ? \"Salvando...\" : submitLabel}\n </button>\n </div>\n </form>\n )\n}\n\nexport type FormDialogSize = BaseDialogSize\n\nexport interface FormDialogProps extends Omit<BaseDialogProps, \"contentWrapper\"> {\n /** When provided, the dialog renders a <form> wrapping body + footer. */\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n}\n\n/**\n * Form-oriented specialization of {@link BaseDialog}: when `onSubmit` is\n * provided, the body and footer are wrapped in a <form> (so footer submit\n * buttons and Enter trigger submission). Without `onSubmit` it behaves like a\n * plain BaseDialog.\n */\nexport function FormDialog({ onSubmit, ...rest }: FormDialogProps) {\n return (\n <BaseDialog\n {...rest}\n contentWrapper={\n onSubmit\n ? (content) => (\n <form onSubmit={onSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {content}\n </form>\n )\n : undefined\n }\n />\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface AuthCardProps {\n title: string\n description?: string\n children: ReactNode\n footer?: ReactNode\n}\n\nexport function AuthCard({ title, description, children, footer }: AuthCardProps) {\n return (\n <div className=\"flex min-h-screen items-center justify-center px-4\">\n <div className=\"w-full max-w-sm rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"mb-6 text-center\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"space-y-4\">{children}</div>\n {footer && <div className=\"mt-4\">{footer}</div>}\n </div>\n </div>\n )\n}\n","interface PaginationProps {\n page: number\n onPageChange: (page: number) => void\n hasNextPage: boolean\n hasPreviousPage: boolean\n className?: string\n}\n\nexport function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, className }: PaginationProps) {\n return (\n <div className={`flex items-center justify-end gap-4 ${className ?? \"\"}`}>\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">Página {page}</span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Próximo\n </button>\n </div>\n )\n}\n","interface TableSkeletonProps {\n rows?: number\n columns?: number\n}\n\nexport function TableSkeleton({ rows = 5, columns = 4 }: TableSkeletonProps) {\n return (\n <>\n {Array.from({ length: rows }).map((_, i) => (\n <tr key={i} className=\"border-b transition-colors\">\n {Array.from({ length: columns }).map((_, j) => (\n <td key={j} className=\"p-4 align-middle\">\n <div className=\"h-5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n","import * as React from \"react\"\n\ninterface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n containerClassName?: string\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n ({ containerClassName, className, ...props }, ref) => {\n return (\n <div className={`relative flex-1 ${containerClassName ?? \"\"}`}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <input\n ref={ref}\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pl-10 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 ${className ?? \"\"}`}\n {...props}\n />\n </div>\n )\n }\n)\nSearchInput.displayName = \"SearchInput\"\n","import { Eye, EyeOff } from \"lucide-react\"\nimport * as React from \"react\"\n\ninterface PasswordInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n containerClassName?: string\n}\n\nexport const PasswordInput = React.forwardRef<\n HTMLInputElement,\n PasswordInputProps\n>(({ containerClassName, className, ...props }, ref) => {\n const [visible, setVisible] = React.useState(false)\n\n return (\n <div className={`relative ${containerClassName ?? \"\"}`}>\n <input\n ref={ref}\n type={visible ? \"text\" : \"password\"}\n className={`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pr-10 text-base shadow-sm transition-all duration-200 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive md:text-sm ${className ?? \"\"}`}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((prev) => !prev)}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n tabIndex={-1}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-foreground\"\n >\n {visible ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )\n})\nPasswordInput.displayName = \"PasswordInput\"\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Check, ChevronsUpDown, Loader2, Plus, Search } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useInfiniteScrollSentinel } from \"../hooks/use-infinite-scroll-sentinel\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ComboboxOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[]\n value?: string\n onChange: (value: string) => void\n /** Texto do gatilho quando nada está selecionado */\n placeholder?: string\n /** Placeholder do campo de busca */\n searchPlaceholder?: string\n /** Mensagem quando a busca não retorna nada */\n emptyMessage?: string\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n /** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n * presença ativa o modo servidor (filtro do cmdk desligado). */\n onSearchChange?: (search: string) => void\n /** Modo servidor: chamado ao rolar até o fim da lista. */\n onLoadMore?: () => void\n /** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n loading?: boolean\n /** Modo servidor: habilita o disparo de `onLoadMore`. */\n hasMore?: boolean\n /** Modo servidor: rótulo do valor já selecionado que pode não estar na\n * página carregada (ex.: formulário de edição). */\n selectedOption?: ComboboxOption\n /** Permite confirmar o texto digitado como valor, mesmo fora da lista\n * (ex.: unidade de medida com texto livre). Mostra uma linha \"criar\" no\n * topo e exibe o valor personalizado no gatilho. */\n creatable?: boolean\n /** Rótulo da linha de criação. Padrão: `Usar \"<texto>\"`. */\n formatCreateLabel?: (search: string) => string\n}\n\n/**\n * Select com busca (combobox) acessível e responsivo.\n *\n * - Desktop: Popover não-modal + cmdk — o dropdown acompanha a largura do\n * gatilho. Não-modal (com `pointer-events-auto` no conteúdo) de propósito:\n * dentro de um Dialog, um Popover modal trava `body { pointer-events: none }`\n * e prende o foco, então a busca não recebe clique/digitação (mesmo motivo do\n * MultiCombobox).\n * - Mobile: Drawer (bottom sheet) + cmdk — evita os problemas de foco/clique de\n * Popover dentro de modal no touch, então a busca funciona no celular.\n *\n * Aceita `aria-invalid`/`aria-describedby` (encaminhados pelo FormField em\n * estado de erro) e fica com a borda vermelha quando inválido.\n */\nexport function Combobox({\n options,\n value,\n onChange,\n placeholder = \"Selecione...\",\n searchPlaceholder = \"Buscar...\",\n emptyMessage = \"Nenhum resultado encontrado.\",\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n onSearchChange,\n onLoadMore,\n loading,\n hasMore,\n selectedOption,\n creatable,\n formatCreateLabel,\n}: ComboboxProps) {\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState(\"\")\n const isDesktop = useIsDesktop()\n const isServer = onSearchChange !== undefined\n const selected =\n selectedOption?.value === value\n ? selectedOption\n : (options.find((option) => option.value === value) ??\n (creatable && value ? { value, label: value } : undefined))\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n if (!next) setSearch(\"\")\n }\n\n const handleSelect = (next: string) => {\n onChange(next)\n handleOpenChange(false)\n }\n\n const handleSearchChange = (next: string) => {\n setSearch(next)\n onSearchChange?.(next)\n }\n\n const trimmedSearch = search.trim()\n const showCreate =\n !!creatable &&\n trimmedSearch.length > 0 &&\n !options.some(\n (option) => option.value.toLowerCase() === trimmedSearch.toLowerCase(),\n )\n const { listRef, sentinelRef } = useInfiniteScrollSentinel({\n enabled: isServer && !!hasMore,\n loading,\n onLoadMore,\n })\n\n const trigger = (\n <button\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n <span className={cn(\"truncate\", !selected && \"text-muted-foreground\")}>\n {selected ? selected.label : placeholder}\n </span>\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n )\n\n const command = (\n <CommandPrimitive\n shouldFilter={!isServer}\n className=\"flex h-full w-full flex-col overflow-hidden\"\n >\n <div className=\"flex items-center border-b px-3\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={searchPlaceholder}\n onValueChange={\n isServer || creatable ? handleSearchChange : undefined\n }\n className=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n />\n </div>\n <CommandPrimitive.List\n ref={listRef}\n className=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n >\n {!isServer && !showCreate && (\n <CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n )}\n {showCreate && (\n <CommandPrimitive.Item\n // cmdk pontua pelo `value`; igualar à busca mantém a linha sempre no topo.\n value={trimmedSearch}\n onSelect={() => handleSelect(trimmedSearch)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground sm:py-1.5\"\n >\n <Plus className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">\n {(formatCreateLabel ?? ((text) => `Usar \"${text}\"`))(\n trimmedSearch,\n )}\n </span>\n </CommandPrimitive.Item>\n )}\n {options.map((option) => (\n <CommandPrimitive.Item\n key={option.value}\n // cliente: cmdk filtra pelo `value`, então usamos o label; servidor:\n // o servidor já filtrou, então usamos o id (único, evita colisão de labels).\n value={isServer ? option.value : option.label}\n disabled={option.disabled}\n onSelect={() => handleSelect(option.value)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5\"\n >\n <Check\n className={cn(\n \"h-4 w-4 shrink-0\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"truncate\">{option.label}</span>\n </CommandPrimitive.Item>\n ))}\n {isServer && !loading && options.length === 0 && (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n )}\n {isServer && loading && (\n <div className=\"flex items-center justify-center py-6\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n )}\n {isServer && hasMore && (\n <div ref={sentinelRef} aria-hidden className=\"h-1\" />\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n {command}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {placeholder}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {command}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as React from \"react\"\n\n/**\n * Dispara `onLoadMore` quando o `sentinelRef` entra na viewport do `listRef`\n * (raiz = a lista rolável, não a janela — a lista rola por dentro do Popover/\n * Drawer). Usa refs \"latest\" para `loading`/`onLoadMore` e evita reassinar o\n * observer a cada render.\n */\nexport function useInfiniteScrollSentinel({\n enabled,\n loading,\n onLoadMore,\n}: {\n enabled: boolean\n loading?: boolean\n onLoadMore?: () => void\n}) {\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n const loadingRef = React.useRef(loading)\n const onLoadMoreRef = React.useRef(onLoadMore)\n\n React.useEffect(() => {\n loadingRef.current = loading\n onLoadMoreRef.current = onLoadMore\n })\n\n React.useEffect(() => {\n if (!enabled) return\n const root = listRef.current\n const sentinel = sentinelRef.current\n if (!root || !sentinel) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && !loadingRef.current) {\n onLoadMoreRef.current?.()\n }\n },\n { root, rootMargin: \"0px 0px 100px 0px\" },\n )\n observer.observe(sentinel)\n return () => observer.disconnect()\n }, [enabled])\n\n return { listRef, sentinelRef }\n}\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Check, ChevronsUpDown, Loader2, Search, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useInfiniteScrollSentinel } from \"../hooks/use-infinite-scroll-sentinel\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { ComboboxOption } from \"./combobox\"\n\nexport interface MultiComboboxProps {\n options: ComboboxOption[]\n value: string[]\n onChange: (value: string[]) => void\n /** Texto do gatilho quando nada está selecionado */\n placeholder?: string\n /** Placeholder do campo de busca */\n searchPlaceholder?: string\n /** Mensagem quando a busca não retorna nada */\n emptyMessage?: string\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n /** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n * presença ativa o modo servidor (filtro do cmdk desligado). */\n onSearchChange?: (search: string) => void\n /** Modo servidor: chamado ao rolar até o fim da lista. */\n onLoadMore?: () => void\n /** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n loading?: boolean\n /** Modo servidor: habilita o disparo de `onLoadMore`. */\n hasMore?: boolean\n /** Modo servidor: rótulos dos valores já selecionados que podem não estar\n * na página carregada (chips do formulário de edição). */\n selectedOptions?: ComboboxOption[]\n}\n\n/**\n * Combobox de múltipla seleção com chips, acessível e responsivo.\n *\n * - Desktop: Popover não-modal + cmdk — o dropdown acompanha a largura do gatilho.\n * Não-modal de propósito: dentro de um Dialog, um Popover modal trava\n * `body { pointer-events: none }` e marca o resto do Dialog como aria-hidden,\n * o que deixava a página/Dialog presos ao fechar com o picker aberto.\n * - Mobile: Drawer (bottom sheet) + cmdk — evita os problemas de foco/clique de\n * Popover dentro de modal no touch, então a busca funciona no celular.\n *\n * As opções selecionadas aparecem como chips dentro do gatilho; clicar numa\n * opção da lista alterna a seleção (a lista permanece aberta) e o `×` de cada\n * chip remove a opção. Aceita `aria-invalid`/`aria-describedby` (encaminhados\n * pelo FormField em estado de erro) e fica com a borda vermelha quando inválido.\n */\nexport function MultiCombobox({\n options,\n value,\n onChange,\n placeholder = \"Selecione...\",\n searchPlaceholder = \"Buscar...\",\n emptyMessage = \"Nenhum resultado encontrado.\",\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n onSearchChange,\n onLoadMore,\n loading,\n hasMore,\n selectedOptions,\n}: MultiComboboxProps) {\n const [open, setOpen] = React.useState(false)\n const isDesktop = useIsDesktop()\n const isServer = onSearchChange !== undefined\n // Chips a partir de selectedOptions (rótulos salvos) + página atual, dedup\n // por value (primeira ocorrência vence → o rótulo salvo prevalece).\n const seen = new Set<string>()\n const selected = [...(selectedOptions ?? []), ...options].filter((option) => {\n if (!value.includes(option.value) || seen.has(option.value)) return false\n seen.add(option.value)\n return true\n })\n const { listRef, sentinelRef } = useInfiniteScrollSentinel({\n enabled: isServer && !!hasMore,\n loading,\n onLoadMore,\n })\n\n const toggleValue = (optionValue: string) => {\n onChange(\n value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue],\n )\n }\n\n const removeValue = (optionValue: string) => {\n onChange(value.filter((v) => v !== optionValue))\n }\n\n const trigger = (\n <div\n id={id}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n aria-disabled={disabled}\n onKeyDown={(event) => {\n if (disabled) return\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowDown\") {\n event.preventDefault()\n setOpen(true)\n }\n }}\n className={cn(\n \"flex min-h-9 w-full cursor-pointer flex-wrap items-center gap-1 rounded-md border border-input bg-transparent px-3 py-1.5 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n {selected.length === 0 ? (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n ) : (\n selected.map((option) => (\n <span\n key={option.value}\n className=\"inline-flex items-center gap-1 rounded bg-secondary px-1.5 py-0.5 text-xs text-secondary-foreground\"\n >\n {option.label}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remover ${option.label}`}\n onClick={(event) => {\n event.stopPropagation()\n removeValue(option.value)\n }}\n onPointerDown={(event) => event.stopPropagation()}\n className=\"rounded-sm opacity-60 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))\n )}\n <ChevronsUpDown className=\"ml-auto h-4 w-4 shrink-0 opacity-50\" />\n </div>\n )\n\n const command = (\n <CommandPrimitive\n shouldFilter={!isServer}\n className=\"flex h-full w-full flex-col overflow-hidden\"\n >\n <div className=\"flex items-center border-b px-3\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={searchPlaceholder}\n onValueChange={isServer ? onSearchChange : undefined}\n className=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n />\n </div>\n <CommandPrimitive.List\n ref={listRef}\n className=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n >\n {!isServer && (\n <CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n )}\n {options.map((option) => (\n <CommandPrimitive.Item\n key={option.value}\n value={isServer ? option.value : option.label}\n disabled={option.disabled}\n onSelect={() => toggleValue(option.value)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5\"\n >\n <Check\n className={cn(\n \"h-4 w-4 shrink-0\",\n value.includes(option.value) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"truncate\">{option.label}</span>\n </CommandPrimitive.Item>\n ))}\n {isServer && !loading && options.length === 0 && (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n )}\n {isServer && loading && (\n <div className=\"flex items-center justify-center py-6\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n )}\n {isServer && hasMore && (\n <div ref={sentinelRef} aria-hidden className=\"h-1\" />\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild disabled={disabled}>\n {trigger}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n {command}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild disabled={disabled}>\n {trigger}\n </DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {placeholder}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {command}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { ChevronsUpDown, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { HexColorInput, HexColorPicker } from \"react-colorful\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ColorPickerProps {\n /** Current color as a hex string (e.g. `#8f27c2`). */\n value?: string | null\n onChange: (value: string) => void\n /** Trigger text shown when no color is set. */\n placeholder?: string\n /**\n * Show a clear (×) affordance when a color is set — emits `onChange(\"\")`\n * so the field can fall back to its default. On by default.\n */\n clearable?: boolean\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n}\n\n/**\n * Color picker — a brand swatch trigger opening a Popover with a\n * saturation/hue area (react-colorful) and a hex input.\n *\n * Controlled via `value`/`onChange` (hex string, with leading `#`). Forwards\n * `aria-invalid`/`aria-describedby` from FormField and shows a destructive\n * border when invalid, matching the other kit inputs.\n */\nexport function ColorPicker({\n value,\n onChange,\n placeholder = \"Selecionar cor\",\n clearable = true,\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n}: ColorPickerProps) {\n const [open, setOpen] = React.useState(false)\n const color = value || \"\"\n const showClear = clearable && !!color && !disabled\n\n const clear = (event: React.SyntheticEvent) => {\n // Inside the popover trigger — don't let the click also toggle it open.\n event.stopPropagation()\n event.preventDefault()\n onChange(\"\")\n }\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <span\n aria-hidden\n className={cn(\n \"h-5 w-5 shrink-0 rounded border border-border\",\n !color && \"bg-[length:8px_8px] bg-[position:0_0,4px_4px]\",\n )}\n style={\n color\n ? { backgroundColor: color }\n : {\n backgroundImage:\n \"linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%),linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%)\",\n }\n }\n />\n <span className={cn(\"truncate\", !color && \"text-muted-foreground\")}>\n {color || placeholder}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {showClear && (\n // Not a <button> — nesting one inside the trigger button is\n // invalid HTML.\n <span\n role=\"button\"\n tabIndex={0}\n aria-label=\"Limpar cor\"\n onClick={clear}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") clear(event)\n }}\n className=\"rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"z-50 w-56 rounded-md border bg-popover p-3 text-popover-foreground shadow-md\"\n >\n <div className=\"mh-color-picker flex flex-col gap-3\">\n <HexColorPicker color={color} onChange={onChange} />\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">#</span>\n <HexColorInput\n color={color}\n onChange={onChange}\n prefixed={false}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm uppercase shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface StatCardProps {\n label: string\n value: ReactNode\n detail?: string\n icon?: ReactNode\n isLoading?: boolean\n}\n\nexport function StatCard({ label, value, detail, icon, isLoading }: StatCardProps) {\n if (isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"flex items-center justify-between pb-2\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-4 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"mt-2 h-7 w-16 animate-pulse rounded bg-muted\" />\n <div className=\"mt-1 h-4 w-20 animate-pulse rounded bg-muted\" />\n </div>\n )\n }\n\n return (\n <div className=\"rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"flex items-center justify-between pb-2\">\n <span className=\"text-sm font-medium text-muted-foreground\">{label}</span>\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\n </div>\n <div className=\"text-2xl font-bold\">{value}</div>\n {detail && <p className=\"text-xs text-muted-foreground\">{detail}</p>}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface DataTableWrapperProps {\n children: ReactNode\n isEmpty: boolean\n isLoading: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n page?: number\n onPageChange?: (page: number) => void\n hasNextPage?: boolean\n hasPreviousPage?: boolean\n}\n\nexport function DataTableWrapper({\n children,\n isEmpty,\n isLoading,\n emptyIcon,\n emptyTitle = \"Nenhum registro encontrado\",\n emptyDescription,\n page,\n onPageChange,\n hasNextPage = false,\n hasPreviousPage = false,\n}: DataTableWrapperProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"overflow-x-auto rounded-md border\">{children}</div>\n\n {!isLoading && isEmpty && (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n {emptyIcon && <div className=\"mb-4 text-muted-foreground\">{emptyIcon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{emptyTitle}</h3>\n {emptyDescription && (\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{emptyDescription}</p>\n )}\n </div>\n )}\n\n {page !== undefined && onPageChange && (\n <div className=\"flex items-center justify-end gap-4\">\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">Página {page}</span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Próximo\n </button>\n </div>\n )}\n </div>\n )\n}\n","import { type MouseEvent, type ReactNode, type TouchEvent, useRef } from \"react\"\n\ninterface MobileCardListProps<T> {\n data: T[]\n renderCard: (item: T, index: number) => ReactNode\n keyExtractor: (item: T) => string\n isLoading?: boolean\n loadingCount?: number\n className?: string\n}\n\n// Movimento (px) acima do qual o gesto é tratado como scroll, não tap.\nconst SCROLL_THRESHOLD = 8\n\nexport function MobileCardList<T>({\n data,\n renderCard,\n keyExtractor,\n isLoading = false,\n loadingCount = 5,\n className,\n}: MobileCardListProps<T>) {\n // Guard contra tap acidental durante o scroll: se o dedo se moveu além do\n // threshold, o clique seguinte (ex.: botão de ações dentro do card) é\n // cancelado na fase de captura, antes de chegar no elemento interativo.\n const start = useRef<{ x: number; y: number } | null>(null)\n const scrolled = useRef(false)\n\n const onTouchStart = (e: TouchEvent<HTMLDivElement>) => {\n const t = e.touches[0]\n start.current = { x: t.clientX, y: t.clientY }\n scrolled.current = false\n }\n\n const onTouchMove = (e: TouchEvent<HTMLDivElement>) => {\n if (!start.current) return\n const t = e.touches[0]\n if (\n Math.abs(t.clientX - start.current.x) > SCROLL_THRESHOLD ||\n Math.abs(t.clientY - start.current.y) > SCROLL_THRESHOLD\n ) {\n scrolled.current = true\n }\n }\n\n const onClickCapture = (e: MouseEvent<HTMLDivElement>) => {\n if (scrolled.current) {\n e.preventDefault()\n e.stopPropagation()\n }\n }\n\n if (isLoading) {\n return (\n <div className={`space-y-3 ${className ?? \"\"}`}>\n {Array.from({ length: loadingCount }).map((_, i) => (\n <div key={i} className=\"rounded-xl border p-4\">\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted\" />\n <div className=\"h-5 w-16 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"h-4 w-48 animate-pulse rounded bg-muted\" />\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-20 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={`space-y-3 ${className ?? \"\"}`}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onClickCapture={onClickCapture}\n >\n {data.map((item, index) => (\n <div\n key={keyExtractor(item)}\n className=\"rounded-xl border p-4 transition-all duration-150 hover:border-foreground/20 active:scale-[0.99]\"\n >\n {renderCard(item, index)}\n </div>\n ))}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface ResponsiveDataViewProps {\n table: ReactNode\n cards: ReactNode\n isEmpty: boolean\n isLoading: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n pagination?: ReactNode\n}\n\nexport function ResponsiveDataView({\n table, cards, isEmpty, isLoading, emptyIcon, emptyTitle = \"Nenhum registro encontrado\", emptyDescription, pagination,\n}: ResponsiveDataViewProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"hidden overflow-x-auto rounded-md border md:block\">{table}</div>\n <div className=\"md:hidden\">{cards}</div>\n {!isLoading && isEmpty && (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n {emptyIcon && <div className=\"mb-4 text-muted-foreground\">{emptyIcon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{emptyTitle}</h3>\n {emptyDescription && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{emptyDescription}</p>}\n </div>\n )}\n {pagination}\n </div>\n )\n}\n","import { useTheme } from \"./theme-provider\"\nimport { Toaster as Sonner } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nexport function Toaster(props: ToasterProps) {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-md\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n success:\n \"group-[.toaster]:!bg-background group-[.toaster]:!text-foreground group-[.toaster]:!border-success/40\",\n error:\n \"group-[.toaster]:!bg-background group-[.toaster]:!text-foreground group-[.toaster]:!border-destructive/40\",\n },\n }}\n {...props}\n />\n )\n}\n","import { ChevronLeft, ChevronRight, Menu } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { SidebarNav, type NavItem } from \"./sidebar-nav\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\nimport { UserMenu, type AppUser, type UserMenuItem } from \"./user-menu\"\n\nexport interface AppShellProps {\n brand: ReactNode\n brandCollapsed?: ReactNode\n navItems: NavItem[]\n activePath: string\n isActive?: (item: NavItem, activePath: string) => boolean\n isAdmin?: boolean\n user?: AppUser\n userMenuItems?: UserMenuItem[]\n onLogout?: () => void\n renderLink?: RenderLink\n headerActions?: ReactNode\n collapsible?: boolean\n defaultCollapsed?: boolean\n children: ReactNode\n}\n\nexport function AppShell({\n brand,\n brandCollapsed,\n navItems,\n activePath,\n isActive,\n isAdmin = false,\n user,\n userMenuItems,\n onLogout,\n renderLink = defaultRenderLink,\n headerActions,\n collapsible = true,\n defaultCollapsed = false,\n children,\n}: AppShellProps) {\n const [collapsed, setCollapsed] = useState(defaultCollapsed)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const nav = (isCollapsed: boolean, onNavigate?: () => void) => (\n <SidebarNav\n items={navItems}\n activePath={activePath}\n isActive={isActive}\n isAdmin={isAdmin}\n isCollapsed={isCollapsed}\n renderLink={renderLink}\n onNavigate={onNavigate}\n />\n )\n\n return (\n <div className=\"flex h-screen overflow-hidden bg-background\">\n {/* Desktop sidebar */}\n <aside\n className={cn(\n \"hidden shrink-0 flex-col border-r bg-card transition-all duration-300 md:flex\",\n collapsed ? \"w-16\" : \"w-60\",\n )}\n >\n <div className=\"flex h-14 shrink-0 items-center border-b px-4\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <div className=\"flex-1 overflow-y-auto px-2 py-4\">{nav(collapsed)}</div>\n {collapsible && (\n <div className=\"border-t p-2\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n className=\"flex w-full items-center justify-center rounded-md px-2 py-2 text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n aria-label={collapsed ? \"Expandir menu\" : \"Recolher menu\"}\n >\n {collapsed ? <ChevronRight className=\"h-4 w-4\" /> : <ChevronLeft className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </aside>\n\n {/* Mobile drawer */}\n <div\n className={cn(\n \"fixed inset-0 z-50 transition-opacity duration-300 md:hidden\",\n mobileOpen ? \"pointer-events-auto opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n onClick={() => setMobileOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/50\" />\n <div\n className={cn(\n \"absolute left-0 top-0 flex h-full w-64 flex-col border-r bg-card transition-transform duration-300\",\n mobileOpen ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center border-b px-4\">{brand}</div>\n <div className=\"flex-1 overflow-y-auto px-2 py-4\">{nav(false, () => setMobileOpen(false))}</div>\n </div>\n </div>\n\n {/* Main column */}\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n <header className=\"flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(true)}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground md:hidden\"\n aria-label=\"Abrir menu\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n <div className=\"ml-auto flex items-center gap-2\">\n {headerActions}\n {(user || onLogout) && (\n <UserMenu user={user} items={userMenuItems} onLogout={onLogout} renderLink={renderLink} />\n )}\n </div>\n </header>\n <main className=\"flex-1 overflow-y-auto\">{children}</main>\n </div>\n </div>\n )\n}\n","import { Fragment, type ReactNode } from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface NavItem {\n label: string\n href: string\n icon?: ReactNode\n adminOnly?: boolean\n}\n\nexport interface SidebarNavProps {\n items: NavItem[]\n activePath: string\n isActive?: (item: NavItem, activePath: string) => boolean\n isAdmin?: boolean\n isCollapsed?: boolean\n renderLink?: RenderLink\n onNavigate?: () => void\n}\n\nfunction defaultIsActive(item: NavItem, activePath: string): boolean {\n if (item.href === \"/\") return activePath === \"/\"\n return activePath === item.href || activePath.startsWith(item.href + \"/\")\n}\n\nexport function SidebarNav({\n items,\n activePath,\n isActive = defaultIsActive,\n isAdmin = false,\n isCollapsed = false,\n renderLink = defaultRenderLink,\n onNavigate,\n}: SidebarNavProps) {\n const visible = items.filter((item) => !item.adminOnly || isAdmin)\n\n return (\n <nav className=\"flex flex-col gap-1\">\n {visible.map((item) => {\n const active = isActive(item, activePath)\n const link = renderLink({\n href: item.href,\n onClick: onNavigate,\n title: isCollapsed ? item.label : undefined,\n \"aria-current\": active ? \"page\" : undefined,\n className: cn(\n \"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground font-semibold\"\n : \"text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n isCollapsed && \"justify-center px-2\",\n ),\n children: (\n <>\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n {!isCollapsed && <span className=\"truncate\">{item.label}</span>}\n </>\n ),\n })\n return <Fragment key={item.href}>{link}</Fragment>\n })}\n </nav>\n )\n}\n","import type { ReactNode } from \"react\"\n\nexport interface RenderLinkProps {\n href: string\n className?: string\n children: ReactNode\n onClick?: () => void\n title?: string\n \"aria-current\"?: \"page\"\n}\n\nexport type RenderLink = (props: RenderLinkProps) => ReactNode\n\nexport const defaultRenderLink: RenderLink = ({ children, ...props }) => (\n <a {...props}>{children}</a>\n)\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { LogOut, User } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface AppUser {\n name?: string\n email?: string\n avatarUrl?: string\n}\n\nexport interface UserMenuItem {\n label: string\n icon?: ReactNode\n href?: string\n onClick?: () => void\n}\n\nexport interface UserMenuProps {\n user?: AppUser\n items?: UserMenuItem[]\n onLogout?: () => void\n logoutLabel?: string\n renderLink?: RenderLink\n align?: \"start\" | \"center\" | \"end\"\n}\n\nfunction initials(user?: AppUser): string {\n const source = user?.name?.trim() || user?.email?.trim()\n if (!source) return \"\"\n const parts = source.split(/\\s+/)\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase()\n return source.slice(0, 2).toUpperCase()\n}\n\nconst itemClass =\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\nconst sheetItemClass =\n \"flex w-full cursor-pointer select-none items-center gap-3 rounded-md px-3 py-3 text-base outline-none transition-colors hover:bg-accent active:bg-accent\"\n\nexport function UserMenu({\n user,\n items = [],\n onLogout,\n logoutLabel = \"Sair\",\n renderLink = defaultRenderLink,\n align = \"end\",\n}: UserMenuProps) {\n const isDesktop = useIsDesktop()\n const [open, setOpen] = useState(false)\n const label = initials(user)\n\n const trigger = (\n <button\n type=\"button\"\n className=\"inline-flex h-9 w-9 items-center justify-center overflow-hidden rounded-full border border-input bg-background text-xs font-semibold shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Menu do usuário\"\n data-testid=\"user-menu\"\n >\n {user?.avatarUrl ? (\n <img\n src={user.avatarUrl}\n alt={user.name ?? user.email ?? \"Avatar\"}\n className=\"h-full w-full object-cover\"\n />\n ) : label ? (\n <span>{label}</span>\n ) : (\n <User className=\"h-4 w-4\" />\n )}\n </button>\n )\n\n const userInfo = (user?.name || user?.email) && (\n <div className=\"px-2 py-1.5\">\n {user.name && (\n <p className=\"truncate text-sm font-medium\">{user.name}</p>\n )}\n {user.email && (\n <p className=\"truncate text-xs text-muted-foreground\">{user.email}</p>\n )}\n </div>\n )\n\n if (isDesktop) {\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align={align}\n sideOffset={6}\n className=\"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {userInfo && (\n <>\n {userInfo}\n <DropdownMenu.Separator className=\"-mx-1 my-1 h-px bg-border\" />\n </>\n )}\n\n {items.map((item) =>\n item.href ? (\n <DropdownMenu.Item key={item.label} asChild>\n {renderLink({\n href: item.href,\n className: itemClass,\n children: (\n <>\n {item.icon}\n {item.label}\n </>\n ),\n })}\n </DropdownMenu.Item>\n ) : (\n <DropdownMenu.Item\n key={item.label}\n className={itemClass}\n onClick={item.onClick}\n >\n {item.icon}\n {item.label}\n </DropdownMenu.Item>\n ),\n )}\n\n {onLogout && (\n <>\n {items.length > 0 && (\n <DropdownMenu.Separator className=\"-mx-1 my-1 h-px bg-border\" />\n )}\n <DropdownMenu.Item\n className={cn(\n itemClass,\n \"text-destructive focus:bg-destructive/10\",\n )}\n onClick={onLogout}\n >\n <LogOut className=\"h-4 w-4\" />\n {logoutLabel}\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n }\n\n // Mobile: bottom sheet (Drawer)\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n Menu do usuário\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {userInfo && (\n <>\n {userInfo}\n <div className=\"-mx-1 my-1 h-px bg-border\" />\n </>\n )}\n {items.map((item) =>\n item.href ? (\n <span\n key={item.label}\n onClick={() => setOpen(false)}\n onKeyDown={() => setOpen(false)}\n >\n {renderLink({\n href: item.href,\n className: sheetItemClass,\n children: (\n <>\n {item.icon}\n {item.label}\n </>\n ),\n })}\n </span>\n ) : (\n <button\n key={item.label}\n type=\"button\"\n className={sheetItemClass}\n onClick={() => {\n item.onClick?.()\n setOpen(false)\n }}\n >\n {item.icon}\n {item.label}\n </button>\n ),\n )}\n {onLogout && (\n <>\n {items.length > 0 && <div className=\"-mx-1 my-1 h-px bg-border\" />}\n <button\n type=\"button\"\n className={cn(sheetItemClass, \"text-destructive\")}\n onClick={() => {\n onLogout()\n setOpen(false)\n }}\n >\n <LogOut className=\"h-4 w-4\" />\n {logoutLabel}\n </button>\n </>\n )}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { MoreVertical } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface RowAction {\n label: string\n icon?: ReactNode\n onClick?: () => void\n href?: string\n destructive?: boolean\n disabled?: boolean\n}\n\nexport interface RowActionsMenuProps {\n actions: RowAction[]\n disabled?: boolean\n align?: \"start\" | \"center\" | \"end\"\n label?: string\n renderLink?: RenderLink\n}\n\nconst triggerClass =\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\"\n\n// Desktop: itens compactos do dropdown. Mobile: alvos de toque maiores.\nconst itemClass =\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\nconst sheetItemClass =\n \"flex w-full cursor-pointer select-none items-center gap-3 rounded-md px-3 py-3 text-base outline-none transition-colors hover:bg-accent active:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n\nexport function RowActionsMenu({\n actions,\n disabled = false,\n align = \"end\",\n label = \"Ações\",\n renderLink = defaultRenderLink,\n}: RowActionsMenuProps) {\n const isDesktop = useIsDesktop()\n const [open, setOpen] = useState(false)\n\n if (actions.length === 0) return null\n\n const trigger = (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={label}\n className={triggerClass}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n )\n\n if (isDesktop) {\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align={align}\n sideOffset={6}\n className=\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {actions.map((action) => {\n const cls = cn(\n itemClass,\n action.destructive &&\n \"text-destructive focus:bg-destructive/10\",\n )\n return action.href ? (\n <DropdownMenu.Item\n key={action.label}\n asChild\n disabled={action.disabled}\n >\n {renderLink({\n href: action.href,\n className: cls,\n children: (\n <>\n {action.icon}\n {action.label}\n </>\n ),\n })}\n </DropdownMenu.Item>\n ) : (\n <DropdownMenu.Item\n key={action.label}\n className={cls}\n disabled={action.disabled}\n onClick={action.onClick}\n >\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n }\n\n // Mobile: action sheet (Drawer)\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {label}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {actions.map((action) => {\n const cls = cn(\n sheetItemClass,\n action.destructive && \"text-destructive\",\n )\n const inner = (\n <>\n {action.icon}\n {action.label}\n </>\n )\n return action.href ? (\n <span\n key={action.label}\n onClick={() => setOpen(false)}\n onKeyDown={() => setOpen(false)}\n >\n {renderLink({\n href: action.href,\n className: cls,\n children: inner,\n })}\n </span>\n ) : (\n <button\n key={action.label}\n type=\"button\"\n disabled={action.disabled}\n className={cls}\n onClick={() => {\n action.onClick?.()\n setOpen(false)\n }}\n >\n {inner}\n </button>\n )\n })}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","export function extractApiError(err: any, fallbackMessage = \"Ocorreu um erro inesperado.\"): string {\n const detail = err?.body?.detail || err?.message\n if (Array.isArray(detail) && detail.length > 0) {\n return detail[0].msg\n }\n return detail || fallbackMessage\n}\n","import { useCallback, useState } from \"react\"\n\nexport function useDisclosure(initial = false) {\n const [open, setOpen] = useState(initial)\n const onOpen = useCallback(() => setOpen(true), [])\n const onClose = useCallback(() => setOpen(false), [])\n const onToggle = useCallback(() => setOpen((v) => !v), [])\n return { open, onOpen, onClose, onToggle, setOpen }\n}\n","import { toast } from \"sonner\"\nimport { useCallback } from \"react\"\n\ntype ToastStatus = \"success\" | \"error\" | \"info\" | \"warning\"\n\nexport function useCustomToast() {\n const showToast = useCallback(\n (title: string, description?: string, status: ToastStatus = \"success\") => {\n switch (status) {\n case \"success\":\n toast.success(title, { description })\n break\n case \"error\":\n toast.error(title, { description })\n break\n case \"info\":\n toast.info(title, { description })\n break\n case \"warning\":\n toast.warning(title, { description })\n break\n }\n },\n [],\n )\n\n return showToast\n}\n\nexport { toast }\n"],"mappings":"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","names":["theme","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","React","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","React","React","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","PopoverPrimitive","import_cmdk","import_lucide_react","React","import_vaul","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","PopoverPrimitive","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Sonner","import_lucide_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","itemClass","sheetItemClass","DrawerPrimitive","import_react","import_sonner","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/theme-provider.tsx","../src/lib/company-theme.ts","../src/hooks/use-company-subdomain.ts","../src/components/mode-toggle.tsx","../src/components/empty-state.tsx","../src/components/confirm-dialog.tsx","../src/components/page-header.tsx","../src/components/status-dot.tsx","../src/components/status-badge.tsx","../src/components/progress-bar.tsx","../src/components/form-field.tsx","../src/components/base-dialog.tsx","../src/hooks/use-is-desktop.ts","../src/lib/utils.ts","../src/components/form-dialog.tsx","../src/components/auth-card.tsx","../src/components/pagination.tsx","../src/components/table-skeleton.tsx","../src/components/search-input.tsx","../src/components/password-input.tsx","../src/components/combobox.tsx","../src/hooks/use-infinite-scroll-sentinel.ts","../src/components/multi-combobox.tsx","../src/components/color-picker.tsx","../src/components/stat-card.tsx","../src/components/data-table-wrapper.tsx","../src/components/mobile-card-list.tsx","../src/components/responsive-data-view.tsx","../src/components/toaster.tsx","../src/components/app-shell.tsx","../src/components/sidebar-nav.tsx","../src/components/types.tsx","../src/components/user-menu.tsx","../src/components/row-actions-menu.tsx","../src/lib/api-error.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-toast.ts"],"sourcesContent":["// Theme\nexport { ThemeProvider, useTheme } from \"./components/theme-provider\"\nexport type { Theme, ThemeProviderProps, ThemeProviderState } from \"./components/theme-provider\"\nexport { applyCompanyTheme } from \"./lib/company-theme\"\nexport type { CompanyTheme, CompanyThemeTokens } from \"./lib/company-theme\"\nexport { useCompanySubdomain, getSubdomain } from \"./hooks/use-company-subdomain\"\nexport type {\n UseCompanySubdomainOptions,\n UseCompanySubdomainResult,\n} from \"./hooks/use-company-subdomain\"\n\n// Components\nexport { ModeToggle } from \"./components/mode-toggle\"\nexport { EmptyState } from \"./components/empty-state\"\nexport { ConfirmDialog } from \"./components/confirm-dialog\"\nexport { PageHeader } from \"./components/page-header\"\nexport { StatusDot } from \"./components/status-dot\"\nexport { StatusBadge } from \"./components/status-badge\"\nexport type { StatusBadgeVariant } from \"./components/status-badge\"\nexport { ProgressBar } from \"./components/progress-bar\"\nexport { FormField } from \"./components/form-field\"\nexport { BaseDialog } from \"./components/base-dialog\"\nexport type { BaseDialogProps, BaseDialogSize } from \"./components/base-dialog\"\nexport { FormDialogLayout, FormDialog } from \"./components/form-dialog\"\nexport type { FormDialogProps, FormDialogSize } from \"./components/form-dialog\"\nexport { AuthCard } from \"./components/auth-card\"\nexport { Pagination } from \"./components/pagination\"\nexport { TableSkeleton } from \"./components/table-skeleton\"\nexport { SearchInput } from \"./components/search-input\"\nexport { PasswordInput } from \"./components/password-input\"\nexport { Combobox } from \"./components/combobox\"\nexport type { ComboboxOption, ComboboxProps } from \"./components/combobox\"\nexport { MultiCombobox } from \"./components/multi-combobox\"\nexport type { MultiComboboxProps } from \"./components/multi-combobox\"\nexport { ColorPicker } from \"./components/color-picker\"\nexport type { ColorPickerProps } from \"./components/color-picker\"\nexport { StatCard } from \"./components/stat-card\"\nexport { DataTableWrapper } from \"./components/data-table-wrapper\"\nexport { MobileCardList } from \"./components/mobile-card-list\"\nexport { ResponsiveDataView } from \"./components/responsive-data-view\"\nexport { Toaster } from \"./components/toaster\"\n\n// App shell\nexport { AppShell } from \"./components/app-shell\"\nexport type { AppShellProps } from \"./components/app-shell\"\nexport { SidebarNav } from \"./components/sidebar-nav\"\nexport type { NavItem, SidebarNavProps } from \"./components/sidebar-nav\"\nexport { UserMenu } from \"./components/user-menu\"\nexport type { AppUser, UserMenuItem, UserMenuProps } from \"./components/user-menu\"\nexport { RowActionsMenu } from \"./components/row-actions-menu\"\nexport type { RowAction, RowActionsMenuProps } from \"./components/row-actions-menu\"\nexport { defaultRenderLink } from \"./components/types\"\nexport type { RenderLink, RenderLinkProps } from \"./components/types\"\n\n// Utilities\nexport { cn } from \"./lib/utils\"\nexport { extractApiError } from \"./lib/api-error\"\n\n// Hooks\nexport { useDisclosure } from \"./hooks/use-disclosure\"\nexport { useIsDesktop } from \"./hooks/use-is-desktop\"\nexport { useCustomToast, toast } from \"./hooks/use-toast\"\n","import { createContext, useContext, useEffect, useState } from \"react\"\nimport { applyCompanyTheme, type CompanyTheme } from \"../lib/company-theme\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n companyTheme?: CompanyTheme\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"ui-theme\",\n companyTheme,\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(\n () => (localStorage.getItem(storageKey) as Theme) || defaultTheme\n )\n\n useEffect(() => {\n const root = window.document.documentElement\n const applyResolved = (resolved: \"light\" | \"dark\") => {\n root.classList.remove(\"light\", \"dark\")\n root.classList.add(resolved)\n applyCompanyTheme(root, companyTheme, resolved)\n }\n\n if (theme === \"system\") {\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\")\n applyResolved(mql.matches ? \"dark\" : \"light\")\n const onChange = (e: MediaQueryListEvent) =>\n applyResolved(e.matches ? \"dark\" : \"light\")\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }\n\n applyResolved(theme)\n }, [theme, companyTheme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport function useTheme() {\n const context = useContext(ThemeProviderContext)\n if (context === undefined) {\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n }\n return context\n}\n\nexport type { Theme, ThemeProviderProps, ThemeProviderState }\n","export type CompanyThemeTokens = {\n primary?: string | null\n primaryForeground?: string | null\n secondary?: string | null\n secondaryForeground?: string | null\n accent?: string | null\n accentForeground?: string | null\n ring?: string | null\n}\n\nexport type CompanyTheme = {\n light: CompanyThemeTokens\n dark?: Partial<CompanyThemeTokens>\n}\n\nconst VAR_MAP: Record<keyof CompanyThemeTokens, string> = {\n primary: \"--color-primary\",\n primaryForeground: \"--color-primary-foreground\",\n secondary: \"--color-secondary\",\n secondaryForeground: \"--color-secondary-foreground\",\n accent: \"--color-accent\",\n accentForeground: \"--color-accent-foreground\",\n ring: \"--color-ring\",\n}\n\n// A dark token that is null/undefined means \"no override\" — inherit the light\n// value. The API serializes unset *_dark columns as explicit null, so spreading\n// the raw dark object would clobber the inherited light values; strip them first.\nfunction definedTokens(\n tokens: Partial<CompanyThemeTokens> | undefined\n): Partial<CompanyThemeTokens> {\n if (!tokens) return {}\n return Object.fromEntries(\n Object.entries(tokens).filter(([, value]) => value != null)\n )\n}\n\nexport function applyCompanyTheme(\n root: HTMLElement,\n companyTheme: CompanyTheme | undefined,\n mode: \"light\" | \"dark\"\n) {\n const tokens: CompanyThemeTokens = companyTheme\n ? mode === \"dark\"\n ? { ...companyTheme.light, ...definedTokens(companyTheme.dark) }\n : companyTheme.light\n : {}\n\n for (const key of Object.keys(VAR_MAP) as (keyof CompanyThemeTokens)[]) {\n const value = tokens[key]\n if (value) root.style.setProperty(VAR_MAP[key], value)\n else root.style.removeProperty(VAR_MAP[key])\n }\n}\n","import { useState } from \"react\"\n\nexport type UseCompanySubdomainOptions = {\n enableOverride?: boolean\n overrideStorageKey?: string\n}\n\nexport type UseCompanySubdomainResult = {\n subdomain: string | undefined\n}\n\nexport function getSubdomain(hostname: string): string | undefined {\n const labels = hostname.split(\".\")\n if (labels.length < 2) return undefined\n const first = labels[0]\n if (!first || first === \"www\" || first === \"localhost\") return undefined\n return first\n}\n\nfunction resolveOverride(storageKey: string): string | undefined {\n if (typeof window === \"undefined\") return undefined\n const params = new URLSearchParams(window.location.search)\n if (params.has(\"company\")) {\n const value = params.get(\"company\")\n if (value) {\n window.localStorage.setItem(storageKey, value)\n return value\n }\n window.localStorage.removeItem(storageKey)\n return undefined\n }\n return window.localStorage.getItem(storageKey) ?? undefined\n}\n\nexport function useCompanySubdomain(\n opts: UseCompanySubdomainOptions = {},\n): UseCompanySubdomainResult {\n const { enableOverride = false, overrideStorageKey = \"company-subdomain\" } =\n opts\n\n const [subdomain] = useState<string | undefined>(() => {\n if (enableOverride) {\n const override = resolveOverride(overrideStorageKey)\n if (override) return override\n }\n if (typeof window === \"undefined\") return undefined\n return getSubdomain(window.location.hostname)\n })\n\n return { subdomain }\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { Moon, Sun, Monitor } from \"lucide-react\"\nimport { useTheme } from \"./theme-provider\"\n\nexport function ModeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className=\"relative inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n aria-label=\"Alternar tema\"\n >\n <Sun className=\"h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute inset-0 m-auto h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n className=\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"light\")}\n >\n <Sun className=\"h-4 w-4\" /> Claro\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"dark\")}\n >\n <Moon className=\"h-4 w-4\" /> Escuro\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className=\"flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\n onClick={() => setTheme(\"system\")}\n >\n <Monitor className=\"h-4 w-4\" /> Sistema\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface EmptyStateProps {\n icon?: ReactNode\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({ icon, title, description, action, className }: EmptyStateProps) {\n return (\n <div className={`flex flex-col items-center justify-center py-16 text-center ${className ?? \"\"}`}>\n {icon && <div className=\"mb-4 text-muted-foreground\">{icon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{title}</h3>\n {description && (\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{description}</p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n )\n}\n","import * as AlertDialog from \"@radix-ui/react-alert-dialog\"\nimport type { ReactNode } from \"react\"\n\ninterface ConfirmDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onConfirm: () => void\n title: string\n description: ReactNode\n confirmLabel?: string\n cancelLabel?: string\n loading?: boolean\n variant?: \"default\" | \"destructive\"\n}\n\nexport function ConfirmDialog({\n open,\n onOpenChange,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n loading = false,\n variant = \"default\",\n}: ConfirmDialogProps) {\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Portal>\n <AlertDialog.Overlay className=\"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" />\n <AlertDialog.Content className=\"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\">\n <div className=\"flex flex-col space-y-2 text-center sm:text-left\">\n <AlertDialog.Title className=\"text-lg font-semibold\">{title}</AlertDialog.Title>\n <AlertDialog.Description className=\"text-sm text-muted-foreground\">\n {description}\n </AlertDialog.Description>\n </div>\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <AlertDialog.Cancel className=\"inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer\">\n {cancelLabel}\n </AlertDialog.Cancel>\n <AlertDialog.Action\n onClick={onConfirm}\n disabled={loading}\n className={`inline-flex h-9 items-center justify-center rounded-md px-4 text-sm font-medium shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer ${\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\"\n }`}\n >\n {loading ? \"Aguarde...\" : confirmLabel}\n </AlertDialog.Action>\n </div>\n </AlertDialog.Content>\n </AlertDialog.Portal>\n </AlertDialog.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface PageHeaderProps {\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function PageHeader({ title, description, action, className }: PageHeaderProps) {\n return (\n <div\n className={`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between ${className ?? \"\"}`}\n >\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-2xl font-semibold tracking-tight\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n )\n}\n","interface StatusDotProps {\n active: boolean\n label?: string\n className?: string\n}\n\nexport function StatusDot({ active, label, className }: StatusDotProps) {\n return (\n <span className={`inline-flex items-center gap-2 ${className ?? \"\"}`}>\n <span\n className={`h-2 w-2 rounded-full ${active ? \"bg-green-500\" : \"bg-red-500\"}`}\n />\n {label && <span>{label}</span>}\n </span>\n )\n}\n","import type { ReactNode } from \"react\"\n\nexport type StatusBadgeVariant =\n | \"neutral\"\n | \"info\"\n | \"success\"\n | \"danger\"\n | \"warning\"\n\ninterface StatusBadgeProps {\n variant?: StatusBadgeVariant\n dot?: boolean\n className?: string\n children: ReactNode\n}\n\nconst variantClasses: Record<\n StatusBadgeVariant,\n { badge: string; dot: string }\n> = {\n neutral: {\n badge: \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\",\n dot: \"bg-gray-400\",\n },\n info: {\n badge: \"bg-blue-100 text-blue-700 dark:bg-blue-950 dark:text-blue-400\",\n dot: \"bg-blue-500\",\n },\n success: {\n badge: \"bg-green-100 text-green-700 dark:bg-green-950 dark:text-green-400\",\n dot: \"bg-green-500\",\n },\n danger: {\n badge: \"bg-red-100 text-red-700 dark:bg-red-950 dark:text-red-400\",\n dot: \"bg-red-500\",\n },\n warning: {\n badge: \"bg-amber-100 text-amber-700 dark:bg-amber-950 dark:text-amber-400\",\n dot: \"bg-amber-500\",\n },\n}\n\nexport function StatusBadge({\n variant = \"neutral\",\n dot = true,\n className,\n children,\n}: StatusBadgeProps) {\n const classes = variantClasses[variant]\n\n return (\n <span\n className={`inline-flex items-center gap-1.5 rounded-md px-2 py-0.5 text-xs font-medium ${classes.badge} ${className ?? \"\"}`}\n >\n {dot && (\n <span\n className={`inline-block h-1.5 w-1.5 shrink-0 rounded-full ${classes.dot}`}\n />\n )}\n {children}\n </span>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface ProgressBarProps {\n value: number\n size?: \"sm\" | \"md\"\n label?: ReactNode\n valueLabel?: ReactNode\n className?: string\n indicatorClassName?: string\n}\n\nconst sizeClasses = {\n sm: \"h-1.5\",\n md: \"h-2\",\n} as const\n\nexport function ProgressBar({\n value,\n size = \"md\",\n label,\n valueLabel,\n className,\n indicatorClassName,\n}: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value))\n\n return (\n <div className={`space-y-1.5 ${className ?? \"\"}`}>\n {(label || valueLabel) && (\n <div className=\"flex items-baseline justify-between gap-2\">\n {label && (\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n )}\n {valueLabel && (\n <span className=\"text-sm font-semibold\">{valueLabel}</span>\n )}\n </div>\n )}\n <div\n className={`w-full overflow-hidden rounded-full bg-muted ${sizeClasses[size]}`}\n >\n <div\n className={`h-full rounded-full transition-all duration-300 ${indicatorClassName ?? \"bg-primary\"}`}\n style={{ width: `${clamped}%` }}\n />\n </div>\n </div>\n )\n}\n","import { type ReactElement, type ReactNode, cloneElement, isValidElement, useId } from \"react\"\n\ninterface FormFieldProps {\n label: string\n htmlFor?: string\n error?: string\n required?: boolean\n children: ReactNode\n className?: string\n}\n\nexport function FormField({ label, htmlFor, error, required, children, className }: FormFieldProps) {\n const errorId = useId()\n\n // Wire accessibility onto the control: mark it invalid and point it at the\n // error message so screen readers announce both.\n const field =\n error && isValidElement(children)\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n \"aria-invalid\": true,\n \"aria-describedby\": [\n (children.props as Record<string, unknown>)[\"aria-describedby\"],\n errorId,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n : children\n\n return (\n <div className={`space-y-2 ${className ?? \"\"}`}>\n <label\n htmlFor={htmlFor}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n {field}\n {error && (\n <p id={errorId} className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import * as Dialog from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport * as React from \"react\"\nimport type { ReactNode } from \"react\"\n\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nconst sizeClasses = {\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 \"4xl\": \"sm:max-w-4xl\",\n \"5xl\": \"sm:max-w-5xl\",\n \"6xl\": \"sm:max-w-6xl\",\n \"7xl\": \"sm:max-w-7xl\",\n} as const\n\nexport type BaseDialogSize = keyof typeof sizeClasses\n\nexport interface BaseDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: ReactNode\n children: ReactNode\n footer?: ReactNode\n size?: BaseDialogSize\n className?: string\n /**\n * Radix `modal` for the underlying Dialog. Defaults to `!isDesktop`: on\n * desktop the dialog is non-modal so a Combobox/Select popover (portaled\n * outside the dialog) can receive focus and keystrokes; on mobile it stays\n * modal so the bottom-sheet behaves. Pass explicitly to override.\n */\n modal?: boolean\n /**\n * Applies backdrop-blur to the overlay behind the dialog.\n * Defaults to true; pass false to keep the plain scrim.\n */\n blurBackdrop?: boolean\n /**\n * Advanced: wraps the dialog's inner content (header + body + footer) inside\n * Content. Used by FormDialog to inject a <form>. Defaults to identity.\n */\n contentWrapper?: (content: ReactNode) => ReactNode\n}\n\n/**\n * Standardized, responsive dialog shell:\n * - mobile: bottom sheet (full width, up to 92vh tall)\n * - desktop: centered dialog (up to 90vh tall)\n * Header and footer stay fixed; only the body scrolls.\n *\n * Also fixes the known Radix bug where `body { pointer-events: none }`\n * can persist after closing a dialog that contained a Select/Popover,\n * which would otherwise make the rest of the page unclickable.\n */\nexport function BaseDialog({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n size = \"lg\",\n className,\n modal,\n blurBackdrop = true,\n contentWrapper = (content) => content,\n}: BaseDialogProps) {\n const isDesktop = useIsDesktop()\n React.useEffect(() => {\n if (open) return\n const id = window.setTimeout(() => {\n if (document.body.style.pointerEvents === \"none\") {\n document.body.style.pointerEvents = \"\"\n }\n }, 0)\n return () => window.clearTimeout(id)\n }, [open])\n\n const body = (\n <>\n <div className=\"flex shrink-0 items-start justify-between gap-4 border-b px-6 py-3\">\n <div className=\"min-w-0 space-y-1\">\n <Dialog.Title className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </Dialog.Title>\n {description && (\n <Dialog.Description className=\"text-sm text-muted-foreground\">\n {description}\n </Dialog.Description>\n )}\n </div>\n <Dialog.Close\n className=\"-mr-1 shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Fechar\"\n >\n <X className=\"h-5 w-5\" />\n </Dialog.Close>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n {footer && (\n <div className=\"flex shrink-0 flex-col-reverse gap-2 border-t px-6 py-3 sm:flex-row sm:justify-end\">\n {footer}\n </div>\n )}\n </>\n )\n\n const isModal = modal ?? !isDesktop\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange} modal={isModal}>\n <Dialog.Portal>\n {isModal ? (\n <Dialog.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n blurBackdrop && \"backdrop-blur-sm\",\n )}\n />\n ) : (\n // Radix skips Dialog.Overlay when non-modal, so the backdrop is\n // rendered by hand; pointer-events-none keeps outside interactions\n // working (the reason the dialog is non-modal on desktop).\n blurBackdrop && (\n <div\n aria-hidden\n className=\"pointer-events-none fixed inset-0 z-50 bg-black/80 backdrop-blur-sm animate-in fade-in-0\"\n />\n )\n )}\n <Dialog.Content\n onCloseAutoFocus={() => {\n document.body.style.pointerEvents = \"\"\n }}\n className={cn(\n \"fixed z-50 flex max-h-[92vh] flex-col bg-background shadow-lg outline-none\",\n \"inset-x-0 bottom-0 rounded-t-2xl\",\n \"sm:inset-x-auto sm:bottom-auto sm:left-1/2 sm:top-1/2 sm:max-h-[92vh] sm:w-full sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-lg\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n sizeClasses[size],\n className,\n )}\n >\n {contentWrapper(body)}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import * as React from \"react\"\n\nconst DESKTOP_QUERY = \"(min-width: 640px)\"\n\n/**\n * Retorna `true` no desktop (>= 640px, breakpoint `sm`) e `false` no mobile.\n * Usado para alternar Popover/DropdownMenu (desktop) por Drawer/bottom sheet\n * (mobile) em componentes responsivos como Combobox e os menus de ação.\n */\nexport function useIsDesktop(): boolean {\n const [isDesktop, setIsDesktop] = React.useState(() =>\n typeof window !== \"undefined\"\n ? window.matchMedia(DESKTOP_QUERY).matches\n : true,\n )\n\n React.useEffect(() => {\n const mql = window.matchMedia(DESKTOP_QUERY)\n const onChange = () => setIsDesktop(mql.matches)\n onChange()\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return isDesktop\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport type { ReactNode } from \"react\"\n\nimport { BaseDialog, type BaseDialogProps, type BaseDialogSize } from \"./base-dialog\"\n\ninterface FormDialogLayoutProps {\n title: string\n children: ReactNode\n onSubmit: (e: React.FormEvent) => void\n submitLabel?: string\n cancelLabel?: string\n onCancel: () => void\n isSubmitting?: boolean\n isDisabled?: boolean\n}\n\nexport function FormDialogLayout({\n title,\n children,\n onSubmit,\n submitLabel = \"Salvar\",\n cancelLabel = \"Cancelar\",\n onCancel,\n isSubmitting = false,\n isDisabled = false,\n}: FormDialogLayoutProps) {\n return (\n <form onSubmit={onSubmit}>\n <div className=\"flex flex-col space-y-1.5 text-center sm:text-left\">\n <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>\n </div>\n <div className=\"space-y-4 py-4\">{children}</div>\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting || isDisabled}\n className=\"inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow transition-colors hover:bg-primary/90 cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n {isSubmitting ? \"Salvando...\" : submitLabel}\n </button>\n </div>\n </form>\n )\n}\n\nexport type FormDialogSize = BaseDialogSize\n\nexport interface FormDialogProps extends Omit<BaseDialogProps, \"contentWrapper\"> {\n /** When provided, the dialog renders a <form> wrapping body + footer. */\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n}\n\n/**\n * Form-oriented specialization of {@link BaseDialog}: when `onSubmit` is\n * provided, the body and footer are wrapped in a <form> (so footer submit\n * buttons and Enter trigger submission). Without `onSubmit` it behaves like a\n * plain BaseDialog.\n */\nexport function FormDialog({ onSubmit, ...rest }: FormDialogProps) {\n return (\n <BaseDialog\n {...rest}\n contentWrapper={\n onSubmit\n ? (content) => (\n <form onSubmit={onSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {content}\n </form>\n )\n : undefined\n }\n />\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface AuthCardProps {\n title: string\n description?: string\n children: ReactNode\n footer?: ReactNode\n}\n\nexport function AuthCard({ title, description, children, footer }: AuthCardProps) {\n return (\n <div className=\"flex min-h-screen items-center justify-center px-4\">\n <div className=\"w-full max-w-sm rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"mb-6 text-center\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n <div className=\"space-y-4\">{children}</div>\n {footer && <div className=\"mt-4\">{footer}</div>}\n </div>\n </div>\n )\n}\n","interface PaginationProps {\n page: number\n onPageChange: (page: number) => void\n hasNextPage: boolean\n hasPreviousPage: boolean\n className?: string\n}\n\nexport function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, className }: PaginationProps) {\n return (\n <div className={`flex items-center justify-end gap-4 ${className ?? \"\"}`}>\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">Página {page}</span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Próximo\n </button>\n </div>\n )\n}\n","interface TableSkeletonProps {\n rows?: number\n columns?: number\n}\n\nexport function TableSkeleton({ rows = 5, columns = 4 }: TableSkeletonProps) {\n return (\n <>\n {Array.from({ length: rows }).map((_, i) => (\n <tr key={i} className=\"border-b transition-colors\">\n {Array.from({ length: columns }).map((_, j) => (\n <td key={j} className=\"p-4 align-middle\">\n <div className=\"h-5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n","import * as React from \"react\"\n\ninterface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n containerClassName?: string\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n ({ containerClassName, className, ...props }, ref) => {\n return (\n <div className={`relative flex-1 ${containerClassName ?? \"\"}`}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <input\n ref={ref}\n type=\"text\"\n className={`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pl-10 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 ${className ?? \"\"}`}\n {...props}\n />\n </div>\n )\n }\n)\nSearchInput.displayName = \"SearchInput\"\n","import { Eye, EyeOff } from \"lucide-react\"\nimport * as React from \"react\"\n\ninterface PasswordInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n containerClassName?: string\n}\n\nexport const PasswordInput = React.forwardRef<\n HTMLInputElement,\n PasswordInputProps\n>(({ containerClassName, className, ...props }, ref) => {\n const [visible, setVisible] = React.useState(false)\n\n return (\n <div className={`relative ${containerClassName ?? \"\"}`}>\n <input\n ref={ref}\n type={visible ? \"text\" : \"password\"}\n className={`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pr-10 text-base shadow-sm transition-all duration-200 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive md:text-sm ${className ?? \"\"}`}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((prev) => !prev)}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n tabIndex={-1}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-foreground\"\n >\n {visible ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </button>\n </div>\n )\n})\nPasswordInput.displayName = \"PasswordInput\"\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Check, ChevronsUpDown, Loader2, Plus, Search } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useInfiniteScrollSentinel } from \"../hooks/use-infinite-scroll-sentinel\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ComboboxOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[]\n value?: string\n onChange: (value: string) => void\n /** Texto do gatilho quando nada está selecionado */\n placeholder?: string\n /** Placeholder do campo de busca */\n searchPlaceholder?: string\n /** Mensagem quando a busca não retorna nada */\n emptyMessage?: string\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n /** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n * presença ativa o modo servidor (filtro do cmdk desligado). */\n onSearchChange?: (search: string) => void\n /** Modo servidor: chamado ao rolar até o fim da lista. */\n onLoadMore?: () => void\n /** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n loading?: boolean\n /** Modo servidor: habilita o disparo de `onLoadMore`. */\n hasMore?: boolean\n /** Modo servidor: rótulo do valor já selecionado que pode não estar na\n * página carregada (ex.: formulário de edição). */\n selectedOption?: ComboboxOption\n /** Permite confirmar o texto digitado como valor, mesmo fora da lista\n * (ex.: unidade de medida com texto livre). Mostra uma linha \"criar\" no\n * topo e exibe o valor personalizado no gatilho. */\n creatable?: boolean\n /** Rótulo da linha de criação. Padrão: `Usar \"<texto>\"`. */\n formatCreateLabel?: (search: string) => string\n}\n\n/**\n * Select com busca (combobox) acessível e responsivo.\n *\n * - Desktop: Popover não-modal + cmdk — o dropdown acompanha a largura do\n * gatilho. Não-modal (com `pointer-events-auto` no conteúdo) de propósito:\n * dentro de um Dialog, um Popover modal trava `body { pointer-events: none }`\n * e prende o foco, então a busca não recebe clique/digitação (mesmo motivo do\n * MultiCombobox).\n * - Mobile: Drawer (bottom sheet) + cmdk — evita os problemas de foco/clique de\n * Popover dentro de modal no touch, então a busca funciona no celular.\n *\n * Aceita `aria-invalid`/`aria-describedby` (encaminhados pelo FormField em\n * estado de erro) e fica com a borda vermelha quando inválido.\n */\nexport function Combobox({\n options,\n value,\n onChange,\n placeholder = \"Selecione...\",\n searchPlaceholder = \"Buscar...\",\n emptyMessage = \"Nenhum resultado encontrado.\",\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n onSearchChange,\n onLoadMore,\n loading,\n hasMore,\n selectedOption,\n creatable,\n formatCreateLabel,\n}: ComboboxProps) {\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState(\"\")\n const isDesktop = useIsDesktop()\n const isServer = onSearchChange !== undefined\n const selected =\n selectedOption?.value === value\n ? selectedOption\n : (options.find((option) => option.value === value) ??\n (creatable && value ? { value, label: value } : undefined))\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n if (!next) setSearch(\"\")\n }\n\n const handleSelect = (next: string) => {\n onChange(next)\n handleOpenChange(false)\n }\n\n const handleSearchChange = (next: string) => {\n setSearch(next)\n onSearchChange?.(next)\n }\n\n const trimmedSearch = search.trim()\n const showCreate =\n !!creatable &&\n trimmedSearch.length > 0 &&\n !options.some(\n (option) => option.value.toLowerCase() === trimmedSearch.toLowerCase(),\n )\n const { listRef, sentinelRef } = useInfiniteScrollSentinel({\n enabled: isServer && !!hasMore,\n loading,\n onLoadMore,\n })\n\n const trigger = (\n <button\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n <span className={cn(\"truncate\", !selected && \"text-muted-foreground\")}>\n {selected ? selected.label : placeholder}\n </span>\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n )\n\n const command = (\n <CommandPrimitive\n shouldFilter={!isServer}\n className=\"flex h-full w-full flex-col overflow-hidden\"\n >\n <div className=\"flex items-center border-b px-3\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={searchPlaceholder}\n onValueChange={\n isServer || creatable ? handleSearchChange : undefined\n }\n className=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n />\n </div>\n <CommandPrimitive.List\n ref={listRef}\n className=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n >\n {!isServer && !showCreate && (\n <CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n )}\n {showCreate && (\n <CommandPrimitive.Item\n // cmdk pontua pelo `value`; igualar à busca mantém a linha sempre no topo.\n value={trimmedSearch}\n onSelect={() => handleSelect(trimmedSearch)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground sm:py-1.5\"\n >\n <Plus className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">\n {(formatCreateLabel ?? ((text) => `Usar \"${text}\"`))(\n trimmedSearch,\n )}\n </span>\n </CommandPrimitive.Item>\n )}\n {options.map((option) => (\n <CommandPrimitive.Item\n key={option.value}\n // cliente: cmdk filtra pelo `value`, então usamos o label; servidor:\n // o servidor já filtrou, então usamos o id (único, evita colisão de labels).\n value={isServer ? option.value : option.label}\n disabled={option.disabled}\n onSelect={() => handleSelect(option.value)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5\"\n >\n <Check\n className={cn(\n \"h-4 w-4 shrink-0\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"truncate\">{option.label}</span>\n </CommandPrimitive.Item>\n ))}\n {isServer && !loading && options.length === 0 && (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n )}\n {isServer && loading && (\n <div className=\"flex items-center justify-center py-6\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n )}\n {isServer && hasMore && (\n <div ref={sentinelRef} aria-hidden className=\"h-1\" />\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n {command}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {placeholder}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {command}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as React from \"react\"\n\n/**\n * Dispara `onLoadMore` quando o `sentinelRef` entra na viewport do `listRef`\n * (raiz = a lista rolável, não a janela — a lista rola por dentro do Popover/\n * Drawer). Usa refs \"latest\" para `loading`/`onLoadMore` e evita reassinar o\n * observer a cada render.\n */\nexport function useInfiniteScrollSentinel({\n enabled,\n loading,\n onLoadMore,\n}: {\n enabled: boolean\n loading?: boolean\n onLoadMore?: () => void\n}) {\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n const loadingRef = React.useRef(loading)\n const onLoadMoreRef = React.useRef(onLoadMore)\n\n React.useEffect(() => {\n loadingRef.current = loading\n onLoadMoreRef.current = onLoadMore\n })\n\n React.useEffect(() => {\n if (!enabled) return\n const root = listRef.current\n const sentinel = sentinelRef.current\n if (!root || !sentinel) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && !loadingRef.current) {\n onLoadMoreRef.current?.()\n }\n },\n { root, rootMargin: \"0px 0px 100px 0px\" },\n )\n observer.observe(sentinel)\n return () => observer.disconnect()\n }, [enabled])\n\n return { listRef, sentinelRef }\n}\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Check, ChevronsUpDown, Loader2, Search, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useInfiniteScrollSentinel } from \"../hooks/use-infinite-scroll-sentinel\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { ComboboxOption } from \"./combobox\"\n\nexport interface MultiComboboxProps {\n options: ComboboxOption[]\n value: string[]\n onChange: (value: string[]) => void\n /** Texto do gatilho quando nada está selecionado */\n placeholder?: string\n /** Placeholder do campo de busca */\n searchPlaceholder?: string\n /** Mensagem quando a busca não retorna nada */\n emptyMessage?: string\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n /** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n * presença ativa o modo servidor (filtro do cmdk desligado). */\n onSearchChange?: (search: string) => void\n /** Modo servidor: chamado ao rolar até o fim da lista. */\n onLoadMore?: () => void\n /** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n loading?: boolean\n /** Modo servidor: habilita o disparo de `onLoadMore`. */\n hasMore?: boolean\n /** Modo servidor: rótulos dos valores já selecionados que podem não estar\n * na página carregada (chips do formulário de edição). */\n selectedOptions?: ComboboxOption[]\n}\n\n/**\n * Combobox de múltipla seleção com chips, acessível e responsivo.\n *\n * - Desktop: Popover não-modal + cmdk — o dropdown acompanha a largura do gatilho.\n * Não-modal de propósito: dentro de um Dialog, um Popover modal trava\n * `body { pointer-events: none }` e marca o resto do Dialog como aria-hidden,\n * o que deixava a página/Dialog presos ao fechar com o picker aberto.\n * - Mobile: Drawer (bottom sheet) + cmdk — evita os problemas de foco/clique de\n * Popover dentro de modal no touch, então a busca funciona no celular.\n *\n * As opções selecionadas aparecem como chips dentro do gatilho; clicar numa\n * opção da lista alterna a seleção (a lista permanece aberta) e o `×` de cada\n * chip remove a opção. Aceita `aria-invalid`/`aria-describedby` (encaminhados\n * pelo FormField em estado de erro) e fica com a borda vermelha quando inválido.\n */\nexport function MultiCombobox({\n options,\n value,\n onChange,\n placeholder = \"Selecione...\",\n searchPlaceholder = \"Buscar...\",\n emptyMessage = \"Nenhum resultado encontrado.\",\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n onSearchChange,\n onLoadMore,\n loading,\n hasMore,\n selectedOptions,\n}: MultiComboboxProps) {\n const [open, setOpen] = React.useState(false)\n const isDesktop = useIsDesktop()\n const isServer = onSearchChange !== undefined\n // Chips a partir de selectedOptions (rótulos salvos) + página atual, dedup\n // por value (primeira ocorrência vence → o rótulo salvo prevalece).\n const seen = new Set<string>()\n const selected = [...(selectedOptions ?? []), ...options].filter((option) => {\n if (!value.includes(option.value) || seen.has(option.value)) return false\n seen.add(option.value)\n return true\n })\n const { listRef, sentinelRef } = useInfiniteScrollSentinel({\n enabled: isServer && !!hasMore,\n loading,\n onLoadMore,\n })\n\n const toggleValue = (optionValue: string) => {\n onChange(\n value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue],\n )\n }\n\n const removeValue = (optionValue: string) => {\n onChange(value.filter((v) => v !== optionValue))\n }\n\n const trigger = (\n <div\n id={id}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n aria-disabled={disabled}\n onKeyDown={(event) => {\n if (disabled) return\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowDown\") {\n event.preventDefault()\n setOpen(true)\n }\n }}\n className={cn(\n \"flex min-h-9 w-full cursor-pointer flex-wrap items-center gap-1 rounded-md border border-input bg-transparent px-3 py-1.5 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n {selected.length === 0 ? (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n ) : (\n selected.map((option) => (\n <span\n key={option.value}\n className=\"inline-flex items-center gap-1 rounded bg-secondary px-1.5 py-0.5 text-xs text-secondary-foreground\"\n >\n {option.label}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remover ${option.label}`}\n onClick={(event) => {\n event.stopPropagation()\n removeValue(option.value)\n }}\n onPointerDown={(event) => event.stopPropagation()}\n className=\"rounded-sm opacity-60 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))\n )}\n <ChevronsUpDown className=\"ml-auto h-4 w-4 shrink-0 opacity-50\" />\n </div>\n )\n\n const command = (\n <CommandPrimitive\n shouldFilter={!isServer}\n className=\"flex h-full w-full flex-col overflow-hidden\"\n >\n <div className=\"flex items-center border-b px-3\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n placeholder={searchPlaceholder}\n onValueChange={isServer ? onSearchChange : undefined}\n className=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n />\n </div>\n <CommandPrimitive.List\n ref={listRef}\n className=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n >\n {!isServer && (\n <CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n )}\n {options.map((option) => (\n <CommandPrimitive.Item\n key={option.value}\n value={isServer ? option.value : option.label}\n disabled={option.disabled}\n onSelect={() => toggleValue(option.value)}\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5\"\n >\n <Check\n className={cn(\n \"h-4 w-4 shrink-0\",\n value.includes(option.value) ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"truncate\">{option.label}</span>\n </CommandPrimitive.Item>\n ))}\n {isServer && !loading && options.length === 0 && (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n )}\n {isServer && loading && (\n <div className=\"flex items-center justify-center py-6\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n </div>\n )}\n {isServer && hasMore && (\n <div ref={sentinelRef} aria-hidden className=\"h-1\" />\n )}\n </CommandPrimitive.List>\n </CommandPrimitive>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild disabled={disabled}>\n {trigger}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n >\n {command}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild disabled={disabled}>\n {trigger}\n </DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {placeholder}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {command}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { ChevronsUpDown, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport { HexColorInput, HexColorPicker } from \"react-colorful\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ColorPickerProps {\n /** Current color as a hex string (e.g. `#8f27c2`). */\n value?: string | null\n onChange: (value: string) => void\n /** Trigger text shown when no color is set. */\n placeholder?: string\n /**\n * Show a clear (×) affordance when a color is set — emits `onChange(\"\")`\n * so the field can fall back to its default. On by default.\n */\n clearable?: boolean\n disabled?: boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n}\n\n/**\n * Color picker — a brand swatch trigger opening a Popover with a\n * saturation/hue area (react-colorful) and a hex input.\n *\n * Controlled via `value`/`onChange` (hex string, with leading `#`). Forwards\n * `aria-invalid`/`aria-describedby` from FormField and shows a destructive\n * border when invalid, matching the other kit inputs.\n */\nexport function ColorPicker({\n value,\n onChange,\n placeholder = \"Selecionar cor\",\n clearable = true,\n disabled,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n}: ColorPickerProps) {\n const [open, setOpen] = React.useState(false)\n const color = value || \"\"\n const showClear = clearable && !!color && !disabled\n\n const clear = (event: React.SyntheticEvent) => {\n // Inside the popover trigger — don't let the click also toggle it open.\n event.stopPropagation()\n event.preventDefault()\n onChange(\"\")\n }\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive\",\n className,\n )}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <span\n aria-hidden\n className={cn(\n \"h-5 w-5 shrink-0 rounded border border-border\",\n !color && \"bg-[length:8px_8px] bg-[position:0_0,4px_4px]\",\n )}\n style={\n color\n ? { backgroundColor: color }\n : {\n backgroundImage:\n \"linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%),linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%)\",\n }\n }\n />\n <span className={cn(\"truncate\", !color && \"text-muted-foreground\")}>\n {color || placeholder}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {showClear && (\n // Not a <button> — nesting one inside the trigger button is\n // invalid HTML.\n <span\n role=\"button\"\n tabIndex={0}\n aria-label=\"Limpar cor\"\n onClick={clear}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") clear(event)\n }}\n className=\"rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </span>\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n className=\"z-50 w-56 rounded-md border bg-popover p-3 text-popover-foreground shadow-md\"\n >\n <div className=\"mh-color-picker flex flex-col gap-3\">\n <HexColorPicker color={color} onChange={onChange} />\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">#</span>\n <HexColorInput\n color={color}\n onChange={onChange}\n prefixed={false}\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm uppercase shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface StatCardProps {\n label: string\n value: ReactNode\n detail?: string\n icon?: ReactNode\n isLoading?: boolean\n}\n\nexport function StatCard({ label, value, detail, icon, isLoading }: StatCardProps) {\n if (isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"flex items-center justify-between pb-2\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-4 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"mt-2 h-7 w-16 animate-pulse rounded bg-muted\" />\n <div className=\"mt-1 h-4 w-20 animate-pulse rounded bg-muted\" />\n </div>\n )\n }\n\n return (\n <div className=\"rounded-lg border bg-card p-6 shadow-sm\">\n <div className=\"flex items-center justify-between pb-2\">\n <span className=\"text-sm font-medium text-muted-foreground\">{label}</span>\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\n </div>\n <div className=\"text-2xl font-bold\">{value}</div>\n {detail && <p className=\"text-xs text-muted-foreground\">{detail}</p>}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface DataTableWrapperProps {\n children: ReactNode\n isEmpty: boolean\n isLoading: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n page?: number\n onPageChange?: (page: number) => void\n hasNextPage?: boolean\n hasPreviousPage?: boolean\n}\n\nexport function DataTableWrapper({\n children,\n isEmpty,\n isLoading,\n emptyIcon,\n emptyTitle = \"Nenhum registro encontrado\",\n emptyDescription,\n page,\n onPageChange,\n hasNextPage = false,\n hasPreviousPage = false,\n}: DataTableWrapperProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"overflow-x-auto rounded-md border\">{children}</div>\n\n {!isLoading && isEmpty && (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n {emptyIcon && <div className=\"mb-4 text-muted-foreground\">{emptyIcon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{emptyTitle}</h3>\n {emptyDescription && (\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{emptyDescription}</p>\n )}\n </div>\n )}\n\n {page !== undefined && onPageChange && (\n <div className=\"flex items-center justify-end gap-4\">\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">Página {page}</span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className=\"inline-flex h-8 items-center justify-center rounded-md border border-input bg-background px-3 text-xs font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50\"\n >\n Próximo\n </button>\n </div>\n )}\n </div>\n )\n}\n","import { type MouseEvent, type ReactNode, type TouchEvent, useRef } from \"react\"\n\ninterface MobileCardListProps<T> {\n data: T[]\n renderCard: (item: T, index: number) => ReactNode\n keyExtractor: (item: T) => string\n isLoading?: boolean\n loadingCount?: number\n className?: string\n}\n\n// Movimento (px) acima do qual o gesto é tratado como scroll, não tap.\nconst SCROLL_THRESHOLD = 8\n\nexport function MobileCardList<T>({\n data,\n renderCard,\n keyExtractor,\n isLoading = false,\n loadingCount = 5,\n className,\n}: MobileCardListProps<T>) {\n // Guard contra tap acidental durante o scroll: se o dedo se moveu além do\n // threshold, o clique seguinte (ex.: botão de ações dentro do card) é\n // cancelado na fase de captura, antes de chegar no elemento interativo.\n const start = useRef<{ x: number; y: number } | null>(null)\n const scrolled = useRef(false)\n\n const onTouchStart = (e: TouchEvent<HTMLDivElement>) => {\n const t = e.touches[0]\n start.current = { x: t.clientX, y: t.clientY }\n scrolled.current = false\n }\n\n const onTouchMove = (e: TouchEvent<HTMLDivElement>) => {\n if (!start.current) return\n const t = e.touches[0]\n if (\n Math.abs(t.clientX - start.current.x) > SCROLL_THRESHOLD ||\n Math.abs(t.clientY - start.current.y) > SCROLL_THRESHOLD\n ) {\n scrolled.current = true\n }\n }\n\n const onClickCapture = (e: MouseEvent<HTMLDivElement>) => {\n if (scrolled.current) {\n e.preventDefault()\n e.stopPropagation()\n }\n }\n\n if (isLoading) {\n return (\n <div className={`space-y-3 ${className ?? \"\"}`}>\n {Array.from({ length: loadingCount }).map((_, i) => (\n <div key={i} className=\"rounded-xl border p-4\">\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted\" />\n <div className=\"h-5 w-16 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"h-4 w-48 animate-pulse rounded bg-muted\" />\n <div className=\"flex justify-between\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-20 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={`space-y-3 ${className ?? \"\"}`}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onClickCapture={onClickCapture}\n >\n {data.map((item, index) => (\n <div\n key={keyExtractor(item)}\n className=\"rounded-xl border p-4 transition-all duration-150 hover:border-foreground/20 active:scale-[0.99]\"\n >\n {renderCard(item, index)}\n </div>\n ))}\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\ninterface ResponsiveDataViewProps {\n table: ReactNode\n cards: ReactNode\n isEmpty: boolean\n isLoading: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n pagination?: ReactNode\n}\n\nexport function ResponsiveDataView({\n table, cards, isEmpty, isLoading, emptyIcon, emptyTitle = \"Nenhum registro encontrado\", emptyDescription, pagination,\n}: ResponsiveDataViewProps) {\n return (\n <div className=\"space-y-4\">\n <div className=\"hidden overflow-x-auto rounded-md border md:block\">{table}</div>\n <div className=\"md:hidden\">{cards}</div>\n {!isLoading && isEmpty && (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n {emptyIcon && <div className=\"mb-4 text-muted-foreground\">{emptyIcon}</div>}\n <h3 className=\"text-lg font-semibold tracking-tight\">{emptyTitle}</h3>\n {emptyDescription && <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">{emptyDescription}</p>}\n </div>\n )}\n {pagination}\n </div>\n )\n}\n","import { useTheme } from \"./theme-provider\"\nimport { Toaster as Sonner } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nexport function Toaster(props: ToasterProps) {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-md\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n success:\n \"group-[.toaster]:!bg-background group-[.toaster]:!text-foreground group-[.toaster]:!border-success/40\",\n error:\n \"group-[.toaster]:!bg-background group-[.toaster]:!text-foreground group-[.toaster]:!border-destructive/40\",\n },\n }}\n {...props}\n />\n )\n}\n","import { ChevronLeft, ChevronRight, Menu } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { SidebarNav, type NavItem } from \"./sidebar-nav\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\nimport { UserMenu, type AppUser, type UserMenuItem } from \"./user-menu\"\n\nexport interface AppShellProps {\n brand: ReactNode\n brandCollapsed?: ReactNode\n navItems: NavItem[]\n activePath: string\n isActive?: (item: NavItem, activePath: string) => boolean\n isAdmin?: boolean\n user?: AppUser\n userMenuItems?: UserMenuItem[]\n onLogout?: () => void\n renderLink?: RenderLink\n headerActions?: ReactNode\n collapsible?: boolean\n defaultCollapsed?: boolean\n children: ReactNode\n}\n\nexport function AppShell({\n brand,\n brandCollapsed,\n navItems,\n activePath,\n isActive,\n isAdmin = false,\n user,\n userMenuItems,\n onLogout,\n renderLink = defaultRenderLink,\n headerActions,\n collapsible = true,\n defaultCollapsed = false,\n children,\n}: AppShellProps) {\n const [collapsed, setCollapsed] = useState(defaultCollapsed)\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const nav = (isCollapsed: boolean, onNavigate?: () => void) => (\n <SidebarNav\n items={navItems}\n activePath={activePath}\n isActive={isActive}\n isAdmin={isAdmin}\n isCollapsed={isCollapsed}\n renderLink={renderLink}\n onNavigate={onNavigate}\n />\n )\n\n return (\n <div className=\"flex h-screen overflow-hidden bg-background\">\n {/* Desktop sidebar */}\n <aside\n className={cn(\n \"hidden shrink-0 flex-col border-r bg-card transition-all duration-300 md:flex\",\n collapsed ? \"w-16\" : \"w-60\",\n )}\n >\n <div className=\"flex h-14 shrink-0 items-center border-b px-4\">\n {collapsed ? (brandCollapsed ?? brand) : brand}\n </div>\n <div className=\"flex-1 overflow-y-auto px-2 py-4\">{nav(collapsed)}</div>\n {collapsible && (\n <div className=\"border-t p-2\">\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n className=\"flex w-full items-center justify-center rounded-md px-2 py-2 text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n aria-label={collapsed ? \"Expandir menu\" : \"Recolher menu\"}\n >\n {collapsed ? <ChevronRight className=\"h-4 w-4\" /> : <ChevronLeft className=\"h-4 w-4\" />}\n </button>\n </div>\n )}\n </aside>\n\n {/* Mobile drawer */}\n <div\n className={cn(\n \"fixed inset-0 z-50 transition-opacity duration-300 md:hidden\",\n mobileOpen ? \"pointer-events-auto opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n onClick={() => setMobileOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/50\" />\n <div\n className={cn(\n \"absolute left-0 top-0 flex h-full w-64 flex-col border-r bg-card transition-transform duration-300\",\n mobileOpen ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center border-b px-4\">{brand}</div>\n <div className=\"flex-1 overflow-y-auto px-2 py-4\">{nav(false, () => setMobileOpen(false))}</div>\n </div>\n </div>\n\n {/* Main column */}\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n <header className=\"flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4\">\n <button\n type=\"button\"\n onClick={() => setMobileOpen(true)}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground md:hidden\"\n aria-label=\"Abrir menu\"\n >\n <Menu className=\"h-4 w-4\" />\n </button>\n <div className=\"ml-auto flex items-center gap-2\">\n {headerActions}\n {(user || onLogout) && (\n <UserMenu user={user} items={userMenuItems} onLogout={onLogout} renderLink={renderLink} />\n )}\n </div>\n </header>\n <main className=\"flex-1 overflow-y-auto\">{children}</main>\n </div>\n </div>\n )\n}\n","import { Fragment, type ReactNode } from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface NavItem {\n label: string\n href: string\n icon?: ReactNode\n adminOnly?: boolean\n}\n\nexport interface SidebarNavProps {\n items: NavItem[]\n activePath: string\n isActive?: (item: NavItem, activePath: string) => boolean\n isAdmin?: boolean\n isCollapsed?: boolean\n renderLink?: RenderLink\n onNavigate?: () => void\n}\n\nfunction defaultIsActive(item: NavItem, activePath: string): boolean {\n if (item.href === \"/\") return activePath === \"/\"\n return activePath === item.href || activePath.startsWith(item.href + \"/\")\n}\n\nexport function SidebarNav({\n items,\n activePath,\n isActive = defaultIsActive,\n isAdmin = false,\n isCollapsed = false,\n renderLink = defaultRenderLink,\n onNavigate,\n}: SidebarNavProps) {\n const visible = items.filter((item) => !item.adminOnly || isAdmin)\n\n return (\n <nav className=\"flex flex-col gap-1\">\n {visible.map((item) => {\n const active = isActive(item, activePath)\n const link = renderLink({\n href: item.href,\n onClick: onNavigate,\n title: isCollapsed ? item.label : undefined,\n \"aria-current\": active ? \"page\" : undefined,\n className: cn(\n \"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n active\n ? \"bg-accent text-accent-foreground font-semibold\"\n : \"text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n isCollapsed && \"justify-center px-2\",\n ),\n children: (\n <>\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n {!isCollapsed && <span className=\"truncate\">{item.label}</span>}\n </>\n ),\n })\n return <Fragment key={item.href}>{link}</Fragment>\n })}\n </nav>\n )\n}\n","import type { ReactNode } from \"react\"\n\nexport interface RenderLinkProps {\n href: string\n className?: string\n children: ReactNode\n onClick?: () => void\n title?: string\n \"aria-current\"?: \"page\"\n}\n\nexport type RenderLink = (props: RenderLinkProps) => ReactNode\n\nexport const defaultRenderLink: RenderLink = ({ children, ...props }) => (\n <a {...props}>{children}</a>\n)\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { LogOut, User } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface AppUser {\n name?: string\n email?: string\n avatarUrl?: string\n}\n\nexport interface UserMenuItem {\n label: string\n icon?: ReactNode\n href?: string\n onClick?: () => void\n}\n\nexport interface UserMenuProps {\n user?: AppUser\n items?: UserMenuItem[]\n onLogout?: () => void\n logoutLabel?: string\n renderLink?: RenderLink\n align?: \"start\" | \"center\" | \"end\"\n}\n\nfunction initials(user?: AppUser): string {\n const source = user?.name?.trim() || user?.email?.trim()\n if (!source) return \"\"\n const parts = source.split(/\\s+/)\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase()\n return source.slice(0, 2).toUpperCase()\n}\n\nconst itemClass =\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent\"\nconst sheetItemClass =\n \"flex w-full cursor-pointer select-none items-center gap-3 rounded-md px-3 py-3 text-base outline-none transition-colors hover:bg-accent active:bg-accent\"\n\nexport function UserMenu({\n user,\n items = [],\n onLogout,\n logoutLabel = \"Sair\",\n renderLink = defaultRenderLink,\n align = \"end\",\n}: UserMenuProps) {\n const isDesktop = useIsDesktop()\n const [open, setOpen] = useState(false)\n const label = initials(user)\n\n const trigger = (\n <button\n type=\"button\"\n className=\"inline-flex h-9 w-9 items-center justify-center overflow-hidden rounded-full border border-input bg-background text-xs font-semibold shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"Menu do usuário\"\n data-testid=\"user-menu\"\n >\n {user?.avatarUrl ? (\n <img\n src={user.avatarUrl}\n alt={user.name ?? user.email ?? \"Avatar\"}\n className=\"h-full w-full object-cover\"\n />\n ) : label ? (\n <span>{label}</span>\n ) : (\n <User className=\"h-4 w-4\" />\n )}\n </button>\n )\n\n const userInfo = (user?.name || user?.email) && (\n <div className=\"px-2 py-1.5\">\n {user.name && (\n <p className=\"truncate text-sm font-medium\">{user.name}</p>\n )}\n {user.email && (\n <p className=\"truncate text-xs text-muted-foreground\">{user.email}</p>\n )}\n </div>\n )\n\n if (isDesktop) {\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align={align}\n sideOffset={6}\n className=\"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {userInfo && (\n <>\n {userInfo}\n <DropdownMenu.Separator className=\"-mx-1 my-1 h-px bg-border\" />\n </>\n )}\n\n {items.map((item) =>\n item.href ? (\n <DropdownMenu.Item key={item.label} asChild>\n {renderLink({\n href: item.href,\n className: itemClass,\n children: (\n <>\n {item.icon}\n {item.label}\n </>\n ),\n })}\n </DropdownMenu.Item>\n ) : (\n <DropdownMenu.Item\n key={item.label}\n className={itemClass}\n onClick={item.onClick}\n >\n {item.icon}\n {item.label}\n </DropdownMenu.Item>\n ),\n )}\n\n {onLogout && (\n <>\n {items.length > 0 && (\n <DropdownMenu.Separator className=\"-mx-1 my-1 h-px bg-border\" />\n )}\n <DropdownMenu.Item\n className={cn(\n itemClass,\n \"text-destructive focus:bg-destructive/10\",\n )}\n onClick={onLogout}\n >\n <LogOut className=\"h-4 w-4\" />\n {logoutLabel}\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n }\n\n // Mobile: bottom sheet (Drawer)\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n Menu do usuário\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {userInfo && (\n <>\n {userInfo}\n <div className=\"-mx-1 my-1 h-px bg-border\" />\n </>\n )}\n {items.map((item) =>\n item.href ? (\n <span\n key={item.label}\n onClick={() => setOpen(false)}\n onKeyDown={() => setOpen(false)}\n >\n {renderLink({\n href: item.href,\n className: sheetItemClass,\n children: (\n <>\n {item.icon}\n {item.label}\n </>\n ),\n })}\n </span>\n ) : (\n <button\n key={item.label}\n type=\"button\"\n className={sheetItemClass}\n onClick={() => {\n item.onClick?.()\n setOpen(false)\n }}\n >\n {item.icon}\n {item.label}\n </button>\n ),\n )}\n {onLogout && (\n <>\n {items.length > 0 && <div className=\"-mx-1 my-1 h-px bg-border\" />}\n <button\n type=\"button\"\n className={cn(sheetItemClass, \"text-destructive\")}\n onClick={() => {\n onLogout()\n setOpen(false)\n }}\n >\n <LogOut className=\"h-4 w-4\" />\n {logoutLabel}\n </button>\n </>\n )}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { MoreVertical } from \"lucide-react\"\nimport { type ReactNode, useState } from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\nimport type { RenderLink } from \"./types\"\nimport { defaultRenderLink } from \"./types\"\n\nexport interface RowAction {\n label: string\n icon?: ReactNode\n onClick?: () => void\n href?: string\n destructive?: boolean\n disabled?: boolean\n}\n\nexport interface RowActionsMenuProps {\n actions: RowAction[]\n disabled?: boolean\n align?: \"start\" | \"center\" | \"end\"\n label?: string\n renderLink?: RenderLink\n}\n\nconst triggerClass =\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\"\n\n// Desktop: itens compactos do dropdown. Mobile: alvos de toque maiores.\nconst itemClass =\n \"flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\nconst sheetItemClass =\n \"flex w-full cursor-pointer select-none items-center gap-3 rounded-md px-3 py-3 text-base outline-none transition-colors hover:bg-accent active:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n\nexport function RowActionsMenu({\n actions,\n disabled = false,\n align = \"end\",\n label = \"Ações\",\n renderLink = defaultRenderLink,\n}: RowActionsMenuProps) {\n const isDesktop = useIsDesktop()\n const [open, setOpen] = useState(false)\n\n if (actions.length === 0) return null\n\n const trigger = (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={label}\n className={triggerClass}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n )\n\n if (isDesktop) {\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen} modal={false}>\n <DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align={align}\n sideOffset={6}\n className=\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {actions.map((action) => {\n const cls = cn(\n itemClass,\n action.destructive &&\n \"text-destructive focus:bg-destructive/10\",\n )\n return action.href ? (\n <DropdownMenu.Item\n key={action.label}\n asChild\n disabled={action.disabled}\n >\n {renderLink({\n href: action.href,\n className: cls,\n children: (\n <>\n {action.icon}\n {action.label}\n </>\n ),\n })}\n </DropdownMenu.Item>\n ) : (\n <DropdownMenu.Item\n key={action.label}\n className={cls}\n disabled={action.disabled}\n onClick={action.onClick}\n >\n {action.icon}\n {action.label}\n </DropdownMenu.Item>\n )\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n )\n }\n\n // Mobile: action sheet (Drawer)\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n <DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content className=\"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none\">\n <DrawerPrimitive.Title className=\"sr-only\">\n {label}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n {actions.map((action) => {\n const cls = cn(\n sheetItemClass,\n action.destructive && \"text-destructive\",\n )\n const inner = (\n <>\n {action.icon}\n {action.label}\n </>\n )\n return action.href ? (\n <span\n key={action.label}\n onClick={() => setOpen(false)}\n onKeyDown={() => setOpen(false)}\n >\n {renderLink({\n href: action.href,\n className: cls,\n children: inner,\n })}\n </span>\n ) : (\n <button\n key={action.label}\n type=\"button\"\n disabled={action.disabled}\n className={cls}\n onClick={() => {\n action.onClick?.()\n setOpen(false)\n }}\n >\n {inner}\n </button>\n )\n })}\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n","export function extractApiError(err: any, fallbackMessage = \"Ocorreu um erro inesperado.\"): string {\n const detail = err?.body?.detail || err?.message\n if (Array.isArray(detail) && detail.length > 0) {\n return detail[0].msg\n }\n return detail || fallbackMessage\n}\n","import { useCallback, useState } from \"react\"\n\nexport function useDisclosure(initial = false) {\n const [open, setOpen] = useState(initial)\n const onOpen = useCallback(() => setOpen(true), [])\n const onClose = useCallback(() => setOpen(false), [])\n const onToggle = useCallback(() => setOpen((v) => !v), [])\n return { open, onOpen, onClose, onToggle, setOpen }\n}\n","import { toast } from \"sonner\"\nimport { useCallback } from \"react\"\n\ntype ToastStatus = \"success\" | \"error\" | \"info\" | \"warning\"\n\nexport function useCustomToast() {\n const showToast = useCallback(\n (title: string, description?: string, status: ToastStatus = \"success\") => {\n switch (status) {\n case \"success\":\n toast.success(title, { description })\n break\n case \"error\":\n toast.error(title, { description })\n break\n case \"info\":\n toast.info(title, { description })\n break\n case \"warning\":\n toast.warning(title, { description })\n break\n }\n },\n [],\n )\n\n return showToast\n}\n\nexport { toast }\n"],"mappings":"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","names":["theme","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","React","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","React","React","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","PopoverPrimitive","import_cmdk","import_lucide_react","React","import_vaul","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","PopoverPrimitive","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Sonner","import_lucide_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","itemClass","sheetItemClass","DrawerPrimitive","import_react","import_sonner","import_react"]}