@motor-hero/ui-kit 0.39.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/row-actions-menu.d.ts +1 -0
- package/dist/components/row-actions-menu.d.ts.map +1 -1
- package/dist/index.cjs +69 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +70 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/row-actions-menu.tsx +70 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/app-shell.tsx","../src/lib/utils.ts","../src/components/sidebar-nav.tsx","../src/components/types.tsx","../src/components/user-menu.tsx","../src/hooks/use-is-desktop.ts","../src/components/auth-card.tsx","../src/components/base-dialog.tsx","../src/components/color-picker.tsx","../src/components/rating.tsx","../src/components/combobox.tsx","../src/hooks/use-infinite-scroll-sentinel.ts","../src/components/confirm-dialog.tsx","../src/components/data-table-wrapper.tsx","../src/components/date-picker.tsx","../src/components/empty-state.tsx","../src/components/filter-toolbar.tsx","../src/components/form-dialog.tsx","../src/components/form-field.tsx","../src/components/mobile-card-list.tsx","../src/components/mode-toggle.tsx","../src/components/theme-provider.tsx","../src/lib/company-theme.ts","../src/components/multi-combobox.tsx","../src/components/page-header.tsx","../src/components/pagination.tsx","../src/components/password-input.tsx","../src/components/progress-bar.tsx","../src/components/responsive-data-view.tsx","../src/components/row-actions-menu.tsx","../src/components/search-input.tsx","../src/components/stat-card.tsx","../src/components/status-badge.tsx","../src/components/status-dot.tsx","../src/components/table-skeleton.tsx","../src/components/toaster.tsx","../src/hooks/use-company-subdomain.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-toast.ts","../src/lib/api-error.ts"],"sourcesContent":["// Theme\n\nexport type { AppShellProps } from \"./components/app-shell\";\n// App shell\nexport { AppShell } from \"./components/app-shell\";\nexport { AuthCard } from \"./components/auth-card\";\nexport type { BaseDialogProps, BaseDialogSize } from \"./components/base-dialog\";\nexport { BaseDialog } from \"./components/base-dialog\";\nexport type { ColorPickerProps } from \"./components/color-picker\";\nexport { ColorPicker } from \"./components/color-picker\";\nexport { Rating } from \"./components/rating\"\nexport type { RatingProps } from \"./components/rating\"\nexport type { ComboboxOption, ComboboxProps } from \"./components/combobox\";\nexport { Combobox } from \"./components/combobox\";\nexport { ConfirmDialog } from \"./components/confirm-dialog\";\nexport { DataTableWrapper } from \"./components/data-table-wrapper\";\nexport type { DatePickerProps } from \"./components/date-picker\";\nexport { DatePicker, DateTimePicker } from \"./components/date-picker\";\nexport { EmptyState } from \"./components/empty-state\";\nexport type {\n\tFilterOption,\n\tFilterOptionListProps,\n\tFilterPopoverProps,\n\tFilterToolbarProps,\n} from \"./components/filter-toolbar\";\nexport {\n\tFilterOptionList,\n\tFilterPopover,\n\tFilterToolbar,\n} from \"./components/filter-toolbar\";\nexport type { FormDialogProps, FormDialogSize } from \"./components/form-dialog\";\nexport { FormDialog, FormDialogLayout } from \"./components/form-dialog\";\nexport { FormField } from \"./components/form-field\";\nexport { MobileCardList } from \"./components/mobile-card-list\";\n// Components\nexport { ModeToggle } from \"./components/mode-toggle\";\nexport type { MultiComboboxProps } from \"./components/multi-combobox\";\nexport { MultiCombobox } from \"./components/multi-combobox\";\nexport { PageHeader } from \"./components/page-header\";\nexport type { PaginationProps } from \"./components/pagination\";\nexport { Pagination } from \"./components/pagination\";\nexport { PasswordInput } from \"./components/password-input\";\nexport { ProgressBar } from \"./components/progress-bar\";\nexport { ResponsiveDataView } from \"./components/responsive-data-view\";\nexport type {\n\tRowAction,\n\tRowActionsMenuProps,\n} from \"./components/row-actions-menu\";\nexport { RowActionsMenu } from \"./components/row-actions-menu\";\nexport { SearchInput } from \"./components/search-input\";\nexport type { NavItem, SidebarNavProps } from \"./components/sidebar-nav\";\nexport { SidebarNav } from \"./components/sidebar-nav\";\nexport { StatCard } from \"./components/stat-card\";\nexport type { StatusBadgeVariant } from \"./components/status-badge\";\nexport { StatusBadge } from \"./components/status-badge\";\nexport { StatusDot } from \"./components/status-dot\";\nexport { TableSkeleton } from \"./components/table-skeleton\";\nexport type {\n\tTheme,\n\tThemeProviderProps,\n\tThemeProviderState,\n} from \"./components/theme-provider\";\nexport { ThemeProvider, useTheme } from \"./components/theme-provider\";\nexport { Toaster } from \"./components/toaster\";\nexport type { RenderLink, RenderLinkProps } from \"./components/types\";\nexport { defaultRenderLink } from \"./components/types\";\nexport type {\n\tAppUser,\n\tUserMenuItem,\n\tUserMenuProps,\n} from \"./components/user-menu\";\nexport { UserMenu } from \"./components/user-menu\";\nexport type {\n\tUseCompanySubdomainOptions,\n\tUseCompanySubdomainResult,\n} from \"./hooks/use-company-subdomain\";\nexport {\n\tgetSubdomain,\n\tuseCompanySubdomain,\n} from \"./hooks/use-company-subdomain\";\n// Hooks\nexport { useDisclosure } from \"./hooks/use-disclosure\";\nexport { useIsDesktop } from \"./hooks/use-is-desktop\";\nexport { toast, useCustomToast } from \"./hooks/use-toast\";\nexport { extractApiError } from \"./lib/api-error\";\nexport type { CompanyTheme, CompanyThemeTokens } from \"./lib/company-theme\";\nexport { applyCompanyTheme } from \"./lib/company-theme\";\n// Utilities\nexport { cn } from \"./lib/utils\";\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 { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\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 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 { 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","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 * Extra classes appended to the backdrop/overlay. Use it to tune the scrim\n * per dialog, e.g. `bg-black/40` for a lighter tint or `bg-transparent` to\n * drop the darkening and keep only the blur. Wins over the default via\n * tailwind-merge.\n */\n backdropClassName?: string\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 backdropClassName,\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/50 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 backdropClassName,\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 || backdropClassName) && (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none fixed inset-0 z-50 bg-black/50 animate-in fade-in-0\",\n blurBackdrop && \"backdrop-blur-sm\",\n backdropClassName,\n )}\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 PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { ChevronsUpDown, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport {\n HexAlphaColorPicker,\n HexColorInput,\n HexColorPicker,\n} 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 /**\n * Accept an alpha channel — the picker gains an opacity slider and the\n * value may be an 8-digit hex (`#RRGGBBAA`). Off by default.\n */\n alpha?: 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 alpha = false,\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=\"h-5 w-5 shrink-0 rounded border border-border bg-[length:8px_8px] bg-[position:0_0,4px_4px]\"\n style={{\n // The checkerboard stays under the color layer so a\n // translucent value reads as translucent in the swatch.\n backgroundImage: `${\n color ? `linear-gradient(${color},${color}),` : \"\"\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 <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 {alpha ? (\n <HexAlphaColorPicker color={color} onChange={onChange} />\n ) : (\n <HexColorPicker color={color} onChange={onChange} />\n )}\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 alpha={alpha}\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 * as ToggleGroup from \"@radix-ui/react-toggle-group\"\nimport { Star } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst MAX_STARS = 5\n\nconst sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n} as const\n\nexport interface RatingProps {\n value?: number\n onChange?: (value: number) => void\n readOnly?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n \"aria-label\"?: string\n}\n\nfunction defaultLabel(value: number) {\n return value > 0\n ? `Avaliação: ${value} de ${MAX_STARS} estrelas`\n : \"Avaliação: sem nota\"\n}\n\nexport function Rating({\n value = 0,\n onChange,\n readOnly = false,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: RatingProps) {\n const clamped = Math.min(MAX_STARS, Math.max(0, value))\n const label = ariaLabel ?? defaultLabel(clamped)\n\n if (readOnly) {\n return (\n <div\n role=\"img\"\n aria-label={label}\n className={cn(\"inline-flex items-center gap-0.5\", className)}\n >\n {Array.from({ length: MAX_STARS }, (_, index) => (\n <Star\n key={index}\n aria-hidden\n className={cn(\n sizeClasses[size],\n index < clamped\n ? \"fill-amber-400 text-amber-400\"\n : \"text-muted-foreground\",\n )}\n />\n ))}\n </div>\n )\n }\n\n return (\n <ToggleGroup.Root\n type=\"single\"\n value={clamped > 0 ? String(clamped) : \"\"}\n onValueChange={(next) => {\n // Radix emite \"\" ao clicar de novo na estrela já selecionada;\n // mantemos a nota atual em vez de zerar (onChange é sempre 1-5).\n if (next) onChange?.(Number(next))\n }}\n aria-label={label}\n className={cn(\"inline-flex items-center gap-0.5\", className)}\n >\n {Array.from({ length: MAX_STARS }, (_, index) => {\n const starValue = index + 1\n const filled = starValue <= clamped\n return (\n <ToggleGroup.Item\n key={starValue}\n value={String(starValue)}\n aria-label={`${starValue} ${starValue === 1 ? \"estrela\" : \"estrelas\"}`}\n className=\"inline-flex cursor-pointer items-center justify-center rounded-sm bg-transparent p-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Star\n aria-hidden\n className={cn(\n sizeClasses[size],\n \"transition-colors\",\n filled\n ? \"fill-amber-400 text-amber-400\"\n : \"text-muted-foreground hover:text-amber-400\",\n )}\n />\n </ToggleGroup.Item>\n )\n })}\n </ToggleGroup.Root>\n )\n}\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\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n}\n\nexport interface ComboboxProps {\n\toptions: ComboboxOption[];\n\tvalue?: string;\n\tonChange: (value: string) => void;\n\t/** Texto do gatilho quando nada está selecionado */\n\tplaceholder?: string;\n\t/** Placeholder do campo de busca */\n\tsearchPlaceholder?: string;\n\t/** Mensagem quando a busca não retorna nada */\n\temptyMessage?: string;\n\tdisabled?: boolean;\n\tid?: string;\n\tclassName?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\";\n\t\"aria-describedby\"?: string;\n\t/** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n\t * presença ativa o modo servidor (filtro do cmdk desligado). */\n\tonSearchChange?: (search: string) => void;\n\t/** Modo servidor: chamado ao rolar até o fim da lista. */\n\tonLoadMore?: () => void;\n\t/** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n\tloading?: boolean;\n\t/** Modo servidor: habilita o disparo de `onLoadMore`. */\n\thasMore?: boolean;\n\t/** Modo servidor: rótulo do valor já selecionado que pode não estar na\n\t * página carregada (ex.: formulário de edição). */\n\tselectedOption?: ComboboxOption;\n\t/** Permite confirmar o texto digitado como valor, mesmo fora da lista\n\t * (ex.: unidade de medida com texto livre). Mostra uma linha \"criar\" no\n\t * topo e exibe o valor personalizado no gatilho. */\n\tcreatable?: boolean;\n\t/** Rótulo da linha de criação. Padrão: `Usar \"<texto>\"`. */\n\tformatCreateLabel?: (search: string) => string;\n\t/** Permite limpar a seleção clicando na opção já selecionada (útil em\n\t * filtros: remover um filtro sem uma opção \"Todos\"). Emite `onChange(\"\")`. */\n\tdeselectable?: boolean;\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\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Selecione...\",\n\tsearchPlaceholder = \"Buscar...\",\n\temptyMessage = \"Nenhum resultado encontrado.\",\n\tdisabled,\n\tid,\n\tclassName,\n\t\"aria-invalid\": ariaInvalid,\n\t\"aria-describedby\": ariaDescribedby,\n\tonSearchChange,\n\tonLoadMore,\n\tloading,\n\thasMore,\n\tselectedOption,\n\tcreatable,\n\tformatCreateLabel,\n\tdeselectable,\n}: ComboboxProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [search, setSearch] = React.useState(\"\");\n\tconst isDesktop = useIsDesktop();\n\tconst isServer = onSearchChange !== undefined;\n\tconst selected =\n\t\tselectedOption?.value === value\n\t\t\t? selectedOption\n\t\t\t: (options.find((option) => option.value === value) ??\n\t\t\t\t(creatable && value ? { value, label: value } : undefined));\n\n\tconst handleOpenChange = (next: boolean) => {\n\t\tsetOpen(next);\n\t\tif (!next) setSearch(\"\");\n\t};\n\n\tconst handleSelect = (next: string) => {\n\t\tonChange(deselectable && next === value ? \"\" : next);\n\t\thandleOpenChange(false);\n\t};\n\n\tconst handleSearchChange = (next: string) => {\n\t\tsetSearch(next);\n\t\tonSearchChange?.(next);\n\t};\n\n\tconst trimmedSearch = search.trim();\n\tconst showCreate =\n\t\t!!creatable &&\n\t\ttrimmedSearch.length > 0 &&\n\t\t!options.some(\n\t\t\t(option) => option.value.toLowerCase() === trimmedSearch.toLowerCase(),\n\t\t);\n\tconst { listRef, sentinelRef } = useInfiniteScrollSentinel({\n\t\tenabled: isServer && !!hasMore,\n\t\tloading,\n\t\tonLoadMore,\n\t});\n\n\tconst trigger = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tid={id}\n\t\t\trole=\"combobox\"\n\t\t\taria-expanded={open}\n\t\t\taria-invalid={ariaInvalid}\n\t\t\taria-describedby={ariaDescribedby}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"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\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span className={cn(\"truncate\", !selected && \"text-muted-foreground\")}>\n\t\t\t\t{selected ? selected.label : placeholder}\n\t\t\t</span>\n\t\t\t<ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n\t\t</button>\n\t);\n\n\tconst command = (\n\t\t<CommandPrimitive\n\t\t\tshouldFilter={!isServer}\n\t\t\tclassName=\"flex h-full w-full flex-col overflow-hidden\"\n\t\t>\n\t\t\t<div className=\"flex items-center border-b px-3\">\n\t\t\t\t<Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n\t\t\t\t<CommandPrimitive.Input\n\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\tonValueChange={isServer || creatable ? handleSearchChange : undefined}\n\t\t\t\t\tclassName=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<CommandPrimitive.List\n\t\t\t\tref={listRef}\n\t\t\t\tclassName=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n\t\t\t>\n\t\t\t\t{!isServer && !showCreate && (\n\t\t\t\t\t<CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</CommandPrimitive.Empty>\n\t\t\t\t)}\n\t\t\t\t{showCreate && (\n\t\t\t\t\t<CommandPrimitive.Item\n\t\t\t\t\t\t// cmdk pontua pelo `value`; igualar à busca mantém a linha sempre no topo.\n\t\t\t\t\t\tvalue={trimmedSearch}\n\t\t\t\t\t\tonSelect={() => handleSelect(trimmedSearch)}\n\t\t\t\t\t\tclassName=\"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\t\t\t\t\t>\n\t\t\t\t\t\t<Plus className=\"h-4 w-4 shrink-0\" />\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{(formatCreateLabel ?? ((text) => `Usar \"${text}\"`))(\n\t\t\t\t\t\t\t\ttrimmedSearch,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</CommandPrimitive.Item>\n\t\t\t\t)}\n\t\t\t\t{options.map((option) => (\n\t\t\t\t\t<CommandPrimitive.Item\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t// cliente: cmdk filtra pelo `value`, então usamos o label; servidor:\n\t\t\t\t\t\t// o servidor já filtrou, então usamos o id (único, evita colisão de labels).\n\t\t\t\t\t\tvalue={isServer ? option.value : option.label}\n\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\tonSelect={() => handleSelect(option.value)}\n\t\t\t\t\t\tclassName=\"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\t\t\t\t\t>\n\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-4 w-4 shrink-0\",\n\t\t\t\t\t\t\t\tvalue === option.value ? \"opacity-100\" : \"opacity-0\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"truncate\">{option.label}</span>\n\t\t\t\t\t</CommandPrimitive.Item>\n\t\t\t\t))}\n\t\t\t\t{isServer && !loading && options.length === 0 && (\n\t\t\t\t\t<div className=\"py-6 text-center text-sm text-muted-foreground\">\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{isServer && loading && (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-6\">\n\t\t\t\t\t\t<Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{isServer && hasMore && (\n\t\t\t\t\t<div ref={sentinelRef} aria-hidden className=\"h-1\" />\n\t\t\t\t)}\n\t\t\t</CommandPrimitive.List>\n\t\t</CommandPrimitive>\n\t);\n\n\tif (isDesktop) {\n\t\treturn (\n\t\t\t<PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n\t\t\t\t<PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\tclassName=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n\t\t\t\t\t\tstyle={{ width: \"var(--radix-popover-trigger-width)\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{command}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</PopoverPrimitive.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DrawerPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n\t\t\t<DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n\t\t\t<DrawerPrimitive.Portal>\n\t\t\t\t<DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n\t\t\t\t<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\t\t\t\t\t<DrawerPrimitive.Title className=\"sr-only\">\n\t\t\t\t\t\t{placeholder}\n\t\t\t\t\t</DrawerPrimitive.Title>\n\t\t\t\t\t<div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n\t\t\t\t\t{command}\n\t\t\t\t</DrawerPrimitive.Content>\n\t\t\t</DrawerPrimitive.Portal>\n\t\t</DrawerPrimitive.Root>\n\t);\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 AlertDialog from \"@radix-ui/react-alert-dialog\"\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\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 * 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 * Extra classes appended to the backdrop/overlay. Use it to tune the scrim\n * per dialog, e.g. `bg-black/40` for a lighter tint. Wins over the default\n * via tailwind-merge.\n */\n backdropClassName?: string\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 blurBackdrop = true,\n backdropClassName,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Portal>\n <AlertDialog.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 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 backdropClassName,\n )}\n />\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-sm 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 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 * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { InputMask } from \"@react-input/mask\"\nimport { endOfYear, format, isValid, parse, subYears } from \"date-fns\"\nimport { ptBR } from \"date-fns/locale\"\nimport { CalendarIcon, ChevronDown, ChevronLeft, ChevronRight, Clock } from \"lucide-react\"\nimport * as React from \"react\"\nimport { DayPicker, type Matcher } from \"react-day-picker\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nconst DATE_MASK = \"__/__/____\"\nconst TIME_MASK = \"__:__\"\nconst MASK_REPLACEMENT = { _: /\\d/ }\n\nconst DATE_FORMAT = \"dd/MM/yyyy\"\nconst TIME_FORMAT = \"HH:mm\"\nconst DATE_VALUE_FORMAT = \"yyyy-MM-dd\"\n\nexport interface DatePickerProps {\n /** `DatePicker`: data pura `\"yyyy-MM-dd\"`, sem conversão de fuso. `DateTimePicker`:\n * ISO UTC completo (`...Z`). `\"\"`/`undefined` = sem valor. */\n value?: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n /** `\"yyyy-MM-dd\"`, inclusive. */\n minDate?: string\n /** `\"yyyy-MM-dd\"`, inclusive. */\n maxDate?: string\n disabledDates?: (date: Date) => boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n}\n\ninterface DatePickerImplProps extends DatePickerProps {\n withTime?: boolean\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, \"0\")\n}\n\n/** Parseia `text` num formato estrito, rejeitando rollover (ex. 31/02 -> 03/03,\n * 25:99 -> next day) via round-trip: só é válido se formatar de volta pro\n * mesmo texto exato digitado. */\nfunction parseStrict(text: string, fmt: string): Date | null {\n const parsed = parse(text, fmt, new Date())\n if (!isValid(parsed)) return null\n return format(parsed, fmt) === text ? parsed : null\n}\n\nfunction dateOnlyToDate(value: string | undefined): Date | undefined {\n if (!value) return undefined\n const parsed = parse(value, DATE_VALUE_FORMAT, new Date())\n return isValid(parsed) ? parsed : undefined\n}\n\nfunction dateTimeToDate(value: string | undefined): Date | undefined {\n if (!value) return undefined\n const parsed = new Date(value)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed\n}\n\nfunction displayFor(value: string | undefined, withTime: boolean): string {\n const date = withTime ? dateTimeToDate(value) : dateOnlyToDate(value)\n if (!date) return \"\"\n const datePart = format(date, DATE_FORMAT)\n return withTime ? `${datePart} ${pad(date.getHours())}:${pad(date.getMinutes())}` : datePart\n}\n\nfunction toMatchers(\n minDate: string | undefined,\n maxDate: string | undefined,\n disabledDates: ((date: Date) => boolean) | undefined,\n): Matcher[] {\n const matchers: Matcher[] = []\n const min = dateOnlyToDate(minDate)\n const max = dateOnlyToDate(maxDate)\n if (min) matchers.push({ before: min })\n if (max) matchers.push({ after: max })\n if (disabledDates) matchers.push(disabledDates)\n return matchers\n}\n\nconst triggerInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pr-10 text-sm shadow-sm transition-colors 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\"\n\nconst fieldInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n\n/** Botão \"ghost\" (sem borda, hover:bg-accent) — mesma variante que o shadcn usa nas\n * setas de navegação do calendário; inline porque o ui-kit não tem um Button próprio. */\nconst navButtonClass =\n \"inline-flex size-(--cell-size) shrink-0 select-none items-center justify-center rounded-md p-0 transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:opacity-50\"\n\nconst calendarClassNames = {\n months: \"relative flex flex-col gap-4\",\n month: \"flex w-full flex-col gap-4\",\n month_caption: \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n caption_label:\n \"flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm font-medium select-none [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n dropdowns: \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n dropdown_root:\n \"relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50\",\n dropdown: \"absolute inset-0 bg-popover opacity-0\",\n nav: \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n button_previous: navButtonClass,\n button_next: navButtonClass,\n month_grid: \"w-full border-collapse\",\n weekdays: \"flex\",\n weekday: \"flex-1 select-none rounded-md text-[0.8rem] font-normal text-muted-foreground\",\n week: \"mt-2 flex w-full\",\n day: \"relative aspect-square h-full w-full select-none p-0 text-center aria-selected:[&>button]:bg-primary aria-selected:[&>button]:text-primary-foreground aria-selected:[&>button]:hover:bg-primary\",\n day_button:\n \"inline-flex aspect-square size-auto w-full min-w-(--cell-size) items-center justify-center rounded-md p-0 font-normal transition-colors hover:bg-accent hover:text-accent-foreground\",\n today: \"bg-accent text-accent-foreground rounded-md\",\n outside: \"text-muted-foreground opacity-50\",\n disabled: \"text-muted-foreground opacity-50 pointer-events-none\",\n hidden: \"invisible\",\n}\n\nconst calendarComponents = {\n Chevron: ({ orientation }: { orientation?: string }) => {\n if (orientation === \"left\") return <ChevronLeft className=\"size-4\" />\n if (orientation === \"right\") return <ChevronRight className=\"size-4\" />\n return <ChevronDown className=\"size-4\" />\n },\n}\n\n/** Nome curto do mês em pt-BR pro rótulo do dropdown (ex. \"jul\") — explícito porque\n * `toLocaleString(\"default\", ...)` seguiria o locale do navegador, não o do app. */\nconst formatMonthDropdown = (date: Date) => date.toLocaleString(\"pt-BR\", { month: \"short\" })\n\n/**\n * DatePicker / DateTimePicker — calendário + campo digitável com máscara\n * (nunca o `<input type=\"date\"/time\">` nativo). Desktop: Popover não-modal;\n * mobile: Drawer (bottom sheet) — mesmo padrão de `Combobox`/`ColorPicker`.\n *\n * `DatePicker` fecha ao escolher o dia (não tem hora pra confirmar).\n * `DateTimePicker` exige \"Aplicar\" — calendário e campo de horário só viram\n * `value` quando os dois estão preenchidos.\n */\nfunction DatePickerImpl({\n value,\n onChange,\n placeholder,\n disabled,\n minDate,\n maxDate,\n disabledDates,\n withTime = false,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n}: DatePickerImplProps) {\n const isDesktop = useIsDesktop()\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const [open, setOpenRaw] = React.useState(false)\n const [focused, setFocused] = React.useState(false)\n const [editText, setEditText] = React.useState(\"\")\n const [pendingDate, setPendingDate] = React.useState<Date | undefined>()\n const [pendingTime, setPendingTime] = React.useState(\"\")\n\n const committedDate = withTime ? dateTimeToDate(value) : dateOnlyToDate(value)\n const displayValue = displayFor(value, withTime)\n const matchers = toMatchers(minDate, maxDate, disabledDates)\n // Alcance do dropdown de ano: minDate/maxDate quando informados, senão o mesmo\n // padrão da lib (100 anos atrás -> fim do ano atual) — calculado explícito nos dois\n // lados porque passar só um dos dois via prop faz a lib truncar o outro (visto na\n // prática: só uma opção de ano no lado sem prop), em vez de cair no padrão dela.\n const startMonth = dateOnlyToDate(minDate) ?? subYears(new Date(), 100)\n const endMonth = dateOnlyToDate(maxDate) ?? endOfYear(new Date())\n\n const setOpen = (next: boolean) => {\n setOpenRaw(next)\n if (next) {\n setEditText(displayValue)\n setPendingDate(committedDate)\n setPendingTime(\n committedDate ? `${pad(committedDate.getHours())}:${pad(committedDate.getMinutes())}` : \"\",\n )\n }\n }\n\n const commitDateOnly = (date: Date) => {\n onChange(format(date, DATE_VALUE_FORMAT))\n setOpen(false)\n }\n\n const commitDateTime = (date: Date, timeText: string) => {\n const time = parseStrict(timeText, TIME_FORMAT)\n if (!time) return\n const combined = new Date(date)\n combined.setHours(time.getHours(), time.getMinutes(), 0, 0)\n onChange(combined.toISOString())\n setOpen(false)\n }\n\n const handleCalendarSelect = (date: Date) => {\n if (!withTime) {\n commitDateOnly(date)\n return\n }\n setPendingDate(date)\n setEditText(`${format(date, DATE_FORMAT)} ${pendingTime}`.trim())\n }\n\n const handleTriggerChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const text = event.target.value\n setEditText(text)\n if (!withTime) {\n const parsed = parseStrict(text, DATE_FORMAT)\n if (parsed) commitDateOnly(parsed)\n return\n }\n const [datePart, timePart] = [text.slice(0, 10), text.slice(11)]\n const parsedDate = parseStrict(datePart, DATE_FORMAT)\n if (parsedDate) {\n setPendingDate(parsedDate)\n if (timePart) setPendingTime(timePart)\n }\n if (parsedDate && timePart && parseStrict(timePart, TIME_FORMAT)) {\n commitDateTime(parsedDate, timePart)\n }\n }\n\n const handleTimeFieldChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setPendingTime(event.target.value)\n if (pendingDate) {\n setEditText(`${format(pendingDate, DATE_FORMAT)} ${event.target.value}`.trim())\n }\n }\n\n const canApply = withTime && !!pendingDate && !!parseStrict(pendingTime, TIME_FORMAT)\n\n const trigger = (\n <div ref={triggerRef} className=\"relative\">\n <InputMask\n id={id}\n mask={withTime ? `${DATE_MASK} ${TIME_MASK}` : DATE_MASK}\n replacement={MASK_REPLACEMENT}\n value={focused ? editText : displayValue}\n onChange={handleTriggerChange}\n onFocus={() => {\n setFocused(true)\n setOpen(true)\n }}\n onBlur={() => setFocused(false)}\n placeholder={placeholder ?? (withTime ? \"dd/mm/aaaa hh:mm\" : \"dd/mm/aaaa\")}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n className={cn(triggerInputClass, className)}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={withTime ? \"Abrir calendário e horário\" : \"Abrir calendário\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n {withTime ? <Clock className=\"h-4 w-4\" /> : <CalendarIcon className=\"h-4 w-4\" />}\n </button>\n </div>\n )\n\n const content = (\n <div className={withTime ? \"p-3\" : \"\"}>\n <DayPicker\n mode=\"single\"\n locale={ptBR}\n captionLayout=\"dropdown\"\n formatters={{ formatMonthDropdown }}\n startMonth={startMonth}\n endMonth={endMonth}\n selected={withTime ? pendingDate : committedDate}\n defaultMonth={(withTime ? pendingDate : committedDate) ?? new Date()}\n onSelect={(date) => date && handleCalendarSelect(date)}\n disabled={matchers}\n className={cn(withTime ? \"p-0\" : \"p-3\", \"[--cell-size:2rem]\")}\n classNames={calendarClassNames}\n components={calendarComponents}\n />\n {withTime && (\n <>\n <div className=\"mt-2 flex items-center gap-2 border-t pt-3\">\n <span className=\"text-sm text-muted-foreground\">Horário</span>\n <InputMask\n mask={TIME_MASK}\n replacement={MASK_REPLACEMENT}\n value={pendingTime}\n onChange={handleTimeFieldChange}\n placeholder=\"hh:mm\"\n aria-label=\"Horário\"\n className={cn(fieldInputClass, \"flex-1\")}\n />\n </div>\n <button\n type=\"button\"\n disabled={!canApply}\n onClick={() => pendingDate && commitDateTime(pendingDate, pendingTime)}\n className=\"mt-3 flex h-9 w-full items-center justify-center rounded-md bg-primary text-sm font-medium text-primary-foreground shadow-sm transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50\"\n >\n Aplicar\n </button>\n </>\n )}\n </div>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Anchor asChild>{trigger}</PopoverPrimitive.Anchor>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n if (triggerRef.current?.contains(event.target as Node)) event.preventDefault()\n }}\n className=\"pointer-events-auto z-50 w-auto overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\"\n >\n {content}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content\n onOpenAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n if (triggerRef.current?.contains(event.target as Node)) event.preventDefault()\n }}\n 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 >\n <DrawerPrimitive.Title className=\"sr-only\">\n {withTime ? \"Selecione a data e o horário\" : \"Selecione a data\"}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n <div className=\"flex justify-center overflow-y-auto pb-4\">{content}</div>\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n\nexport function DatePicker(props: DatePickerProps) {\n return <DatePickerImpl {...props} />\n}\n\nexport function DateTimePicker(props: DatePickerProps) {\n return <DatePickerImpl {...props} withTime />\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 PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { ChevronDown, type LucideIcon, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\nimport { useIsDesktop } from \"../hooks/use-is-desktop\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * Barra de filtros compacta para telas com muitos filtros.\n *\n * Mantém poucos controles visíveis (uma busca + 1–2 filtros primários) e recolhe\n * o restante atrás de um botão \"Filtros\" com contador, no lugar de uma fileira\n * poluída de dropdowns. Composicional e router-agnóstico: o app fornece os\n * controles reais (Combobox, listas) dentro de cada `FilterPopover`.\n */\nexport interface FilterToolbarProps {\n\tchildren: React.ReactNode;\n\t/** Mostra o botão \"Limpar filtros\" quando `true`. */\n\tisFilterActive?: boolean;\n\tonClear?: () => void;\n\tclearLabel?: string;\n\tclassName?: string;\n}\n\nexport function FilterToolbar({\n\tchildren,\n\tisFilterActive = false,\n\tonClear,\n\tclearLabel = \"Limpar filtros\",\n\tclassName,\n}: FilterToolbarProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"mb-6 flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{isFilterActive && onClear && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClear}\n\t\t\t\t\tclassName=\"inline-flex h-9 shrink-0 items-center justify-center gap-1.5 self-start rounded-md px-2.5 text-sm text-muted-foreground transition-colors hover:text-foreground sm:self-auto\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t\t{clearLabel}\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\ntype FilterPopoverContent =\n\t| React.ReactNode\n\t| ((api: { close: () => void }) => React.ReactNode);\n\nexport interface FilterPopoverProps {\n\t/** Rótulo do gatilho (nome do filtro). */\n\tlabel: string;\n\t/** Ícone opcional à esquerda (ex.: `Filter` no botão de overflow). */\n\ticon?: LucideIcon;\n\t/** Ativo → gatilho destacado e badge visível. */\n\tactive?: boolean;\n\t/** Conteúdo do badge quando ativo: uma contagem ou o rótulo do valor. */\n\tbadge?: React.ReactNode;\n\t/** Largura/estilo do conteúdo no desktop. Padrão: `w-60`. */\n\tcontentClassName?: string;\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Título do drawer no mobile (acessibilidade). Padrão: `label`. */\n\ttitle?: string;\n\t/** Nó ou render-prop que recebe `{ close }` para fechar após selecionar. */\n\tchildren: FilterPopoverContent;\n}\n\n/**\n * Gatilho compacto + popover (desktop) / drawer (mobile) para um filtro.\n * Mesmo idiom do `Combobox`: popover não-modal no desktop, bottom sheet no touch.\n */\nexport function FilterPopover({\n\tlabel,\n\ticon: Icon,\n\tactive = false,\n\tbadge,\n\tcontentClassName,\n\talign = \"start\",\n\ttitle,\n\tchildren,\n}: FilterPopoverProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst isDesktop = useIsDesktop();\n\tconst close = React.useCallback(() => setOpen(false), []);\n\tconst content =\n\t\ttypeof children === \"function\" ? children({ close }) : children;\n\n\tconst trigger = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-expanded={open}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-9 w-full shrink-0 cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent px-3 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:w-auto sm:justify-start\",\n\t\t\t\tactive ? \"border-ring/60 text-foreground\" : \"text-muted-foreground\",\n\t\t\t)}\n\t\t>\n\t\t\t{Icon && <Icon className=\"h-4 w-4 shrink-0 opacity-70\" />}\n\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t{active && badge != null && (\n\t\t\t\t<span className=\"inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium leading-none text-primary-foreground\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n\t\t</button>\n\t);\n\n\tif (isDesktop) {\n\t\treturn (\n\t\t\t<PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n\t\t\t\t<PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\talign={align}\n\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\tonInteractOutside={(event) => {\n\t\t\t\t\t\t\t// Mantém aberto quando o clique cai dentro de outro popover\n\t\t\t\t\t\t\t// aberto a partir daqui (ex.: o dropdown de um Combobox),\n\t\t\t\t\t\t\t// em vez de um clique genuíno fora.\n\t\t\t\t\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\t\t\t\t\tif (target?.closest(\"[data-radix-popper-content-wrapper]\")) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"pointer-events-auto z-50 w-60 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\",\n\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</PopoverPrimitive.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n\t\t\t<DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n\t\t\t<DrawerPrimitive.Portal>\n\t\t\t\t<DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n\t\t\t\t<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\t\t\t\t\t<DrawerPrimitive.Title className=\"sr-only\">\n\t\t\t\t\t\t{title ?? label}\n\t\t\t\t\t</DrawerPrimitive.Title>\n\t\t\t\t\t<div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n\t\t\t\t\t<div className=\"overflow-y-auto p-2\">{content}</div>\n\t\t\t\t</DrawerPrimitive.Content>\n\t\t\t</DrawerPrimitive.Portal>\n\t\t</DrawerPrimitive.Root>\n\t);\n}\n\nexport interface FilterOption {\n\tvalue: string;\n\tlabel: string;\n\t/** Classe do \"dot\" à esquerda (ex.: `bg-emerald-500` para um status). */\n\tdotClassName?: string;\n}\n\nexport interface FilterOptionListProps {\n\toptions: FilterOption[];\n\t/** `string` no modo simples; `string[]` no modo múltiplo. */\n\tvalue: string | string[];\n\tonChange: (value: string | string[]) => void;\n\tmultiple?: boolean;\n\t/** Mostra o link \"Limpar\" no rodapé quando há seleção. */\n\tclearable?: boolean;\n\tclearLabel?: string;\n}\n\n/**\n * Lista de opções (seleção simples ou múltipla) para o conteúdo de um\n * `FilterPopover` — evita aninhar um Combobox para enums curtos.\n */\nexport function FilterOptionList({\n\toptions,\n\tvalue,\n\tonChange,\n\tmultiple = false,\n\tclearable = false,\n\tclearLabel = \"Limpar\",\n}: FilterOptionListProps) {\n\tconst selected = Array.isArray(value) ? value : value ? [value] : [];\n\tconst hasSelection = selected.length > 0;\n\n\tconst toggle = (optionValue: string) => {\n\t\tif (!multiple) {\n\t\t\tonChange(optionValue);\n\t\t\treturn;\n\t\t}\n\t\tonChange(\n\t\t\tselected.includes(optionValue)\n\t\t\t\t? selected.filter((v) => v !== optionValue)\n\t\t\t\t: [...selected, optionValue],\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col p-1\">\n\t\t\t{options.map((option) => {\n\t\t\t\tconst isChecked = selected.includes(option.value);\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => toggle(option.value)}\n\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{option.dotClassName && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"h-2 w-2 shrink-0 rounded-full\",\n\t\t\t\t\t\t\t\t\toption.dotClassName,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<span className=\"flex-1 truncate\">{option.label}</span>\n\t\t\t\t\t\t{isChecked && (\n\t\t\t\t\t\t\t<span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{clearable && hasSelection && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => onChange(multiple ? [] : \"\")}\n\t\t\t\t\tclassName=\"mt-1 border-t px-2 pt-1.5 pb-0.5 text-center text-xs text-muted-foreground transition-colors hover:text-foreground\"\n\t\t\t\t>\n\t\t\t\t\t{clearLabel}\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\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-sm 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 // O conteúdo do dialog é portalado para o body, mas eventos React sobem pela\n // árvore React, não pela do DOM: sem stopPropagation, o submit deste form\n // chega ao <form> da página que renderiza o dialog e dispara o submit dela.\n // Precisa ser síncrono — handlers de RHF são assíncronos (resolver).\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.stopPropagation()\n onSubmit?.(e)\n }\n return (\n <BaseDialog\n {...rest}\n contentWrapper={\n onSubmit\n ? (content) => (\n <form onSubmit={handleSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {content}\n </form>\n )\n : undefined\n }\n />\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=\"block 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 { 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 * 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 { 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 * 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 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","export interface PaginationProps {\n page: number\n onPageChange: (page: number) => void\n hasNextPage: boolean\n hasPreviousPage: boolean\n /** Total de páginas. Quando informado, o rótulo vira \"Página {page} de {totalPages}\". */\n totalPages?: number\n /** Exibe o seletor de itens por página. Use com `pageSize`, `onPageSizeChange` e `pageSizeOptions`. */\n showPageSizeSelector?: boolean\n pageSize?: number\n onPageSizeChange?: (size: number) => void\n pageSizeOptions?: number[]\n className?: string\n}\n\nconst navButtonClass =\n \"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\nexport function Pagination({\n page,\n onPageChange,\n hasNextPage,\n hasPreviousPage,\n totalPages,\n showPageSizeSelector = false,\n pageSize,\n onPageSizeChange,\n pageSizeOptions,\n className,\n}: PaginationProps) {\n return (\n <div\n className={`flex items-center ${showPageSizeSelector ? \"justify-between\" : \"justify-end\"} gap-4 ${className ?? \"\"}`}\n >\n {showPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"pagination-page-size\" className=\"text-sm text-muted-foreground\">\n Itens por página\n </label>\n <select\n id=\"pagination-page-size\"\n value={pageSize}\n onChange={(e) => onPageSizeChange?.(Number(e.target.value))}\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-medium shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring cursor-pointer\"\n >\n {(pageSizeOptions ?? []).map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className={navButtonClass}\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">\n Página {page}\n {totalPages ? ` de ${totalPages}` : \"\"}\n </span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className={navButtonClass}\n >\n Próximo\n </button>\n </div>\n </div>\n )\n}\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 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 { ReactNode } from \"react\"\nimport { EmptyState } from \"./empty-state\"\n\nimport { cn } from \"../lib/utils\"\n\ninterface ResponsiveDataViewProps {\n table: ReactNode\n cards: ReactNode\n isEmpty: boolean\n isLoading: boolean\n /**\n * Dados desatualizados na tela enquanto um refetch está em voo (ex.:\n * `isPlaceholderData` do TanStack Query). Esmaece e bloqueia a interação\n * com table/cards; a paginação continua clicável.\n */\n isBusy?: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n /** CTA do estado vazio — normalmente o mesmo botão \"Adicionar X\" da página. */\n emptyAction?: ReactNode\n pagination?: ReactNode\n}\n\nexport function ResponsiveDataView({\n table,\n cards,\n isEmpty,\n isLoading,\n isBusy = false,\n emptyIcon,\n emptyTitle = \"Nenhum registro encontrado\",\n emptyDescription,\n emptyAction,\n pagination,\n}: ResponsiveDataViewProps) {\n // Lista vazia mostra só o EmptyState. Antes renderizava a caixa com o\n // cabeçalho da tabela vazio, o bloco de texto por fora dela e a paginação\n // desabilitada — três blocos empilhados para zero registro.\n if (!isLoading && !isBusy && isEmpty) {\n return (\n <div className=\"rounded-md border\">\n <EmptyState\n icon={emptyIcon}\n title={emptyTitle}\n description={emptyDescription}\n action={emptyAction}\n />\n </div>\n )\n }\n\n const busyClass = isBusy && \"pointer-events-none opacity-50\"\n return (\n <div className=\"space-y-4\">\n <div\n aria-busy={isBusy}\n className={cn(\n \"hidden overflow-x-auto rounded-md border transition-opacity md:block\",\n busyClass,\n )}\n >\n {table}\n </div>\n <div aria-busy={isBusy} className={cn(\"transition-opacity md:hidden\", busyClass)}>\n {cards}\n </div>\n {pagination}\n </div>\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","import * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\ninterface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n\tcontainerClassName?: string;\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n\t({ containerClassName, className, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div className={cn(\"relative flex-1\", containerClassName)}>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<circle cx=\"11\" cy=\"11\" r=\"8\" />\n\t\t\t\t\t<path d=\"m21 21-4.3-4.3\" />\n\t\t\t\t</svg>\n\t\t\t\t<input\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"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\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\nSearchInput.displayName = \"SearchInput\";\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\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\n/**\n * Cada variante lê os tokens semânticos `--status-*` do app, com fallback para\n * a paleta Tailwind que o componente já usava. Um app que define os tokens\n * (ex.: IMMA, de neutros quentes) ganha as cores do seu design system; um app\n * que não define continua com a aparência de antes — a troca não quebra nenhum\n * consumidor. Também dispensa `dark:`, já que os tokens de quem os define\n * mudam sozinhos no escopo `.dark`.\n */\nconst variantClasses: Record<\n StatusBadgeVariant,\n { badge: string; dot: string }\n> = {\n neutral: {\n badge:\n \"bg-[var(--status-neutral-surface,#f3f4f6)] text-[var(--status-neutral-text,#374151)]\",\n dot: \"bg-[var(--status-neutral,#9ca3af)]\",\n },\n info: {\n badge:\n \"bg-[var(--status-info-surface,#dbeafe)] text-[var(--status-info-text,#1d4ed8)]\",\n dot: \"bg-[var(--status-info,#3b82f6)]\",\n },\n success: {\n badge:\n \"bg-[var(--status-success-surface,#dcfce7)] text-[var(--status-success-text,#15803d)]\",\n dot: \"bg-[var(--status-success,#22c55e)]\",\n },\n danger: {\n badge:\n \"bg-[var(--status-danger-surface,#fee2e2)] text-[var(--status-danger-text,#b91c1c)]\",\n dot: \"bg-[var(--status-danger,#ef4444)]\",\n },\n warning: {\n badge:\n \"bg-[var(--status-warning-surface,#fef3c7)] text-[var(--status-warning-text,#b45309)]\",\n dot: \"bg-[var(--status-warning,#f59e0b)]\",\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","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","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 // p-2/h-4 espelha o TableCell real. Com p-4/h-5 a linha do skeleton\n // ficava ~16px mais alta que a linha de dados, e a tabela encolhia\n // visivelmente quando a resposta chegava.\n <tr key={i} className=\"border-b transition-colors\">\n {Array.from({ length: columns }).map((_, j) => (\n <td key={j} className=\"p-2 align-middle first:pl-4 last:pr-4\">\n <div className=\"h-4 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\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 { useState } from \"react\"\n\nexport type UseCompanySubdomainOptions = {\n enableOverride?: boolean\n overrideStorageKey?: string\n /**\n * Host labels that are *not* tenants. A product whose default host carries\n * a label of its own (`app.example.com`, `admin.example.com`) must list it\n * here, or that label is read as a tenant slug and sent downstream as one.\n *\n * Added to the built-in `www`; `localhost` is always excluded structurally.\n * Case-insensitive.\n */\n reservedSubdomains?: string[]\n}\n\nexport type UseCompanySubdomainResult = {\n subdomain: string | undefined\n}\n\nconst ALWAYS_RESERVED = [\"www\", \"localhost\"]\n\n/**\n * The tenant slug in a hostname, or `undefined` when there is none.\n *\n * The first label is only a tenant if it isn't reserved. Callers whose\n * default host is `app.<domain>` must pass `[\"app\"]` (plus any sibling\n * surfaces like `admin`), otherwise visiting the default host yields the\n * literal `\"app\"` as if it were a customer.\n */\nexport function getSubdomain(\n hostname: string,\n reservedSubdomains: string[] = [],\n): string | undefined {\n const labels = hostname.split(\".\")\n if (labels.length < 2) return undefined\n const first = labels[0]\n if (!first) return undefined\n const reserved = [...ALWAYS_RESERVED, ...reservedSubdomains].map((label) =>\n label.toLowerCase(),\n )\n if (reserved.includes(first.toLowerCase())) 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 {\n enableOverride = false,\n overrideStorageKey = \"company-subdomain\",\n reservedSubdomains = [],\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, reservedSubdomains)\n })\n\n return { subdomain }\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","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"],"mappings":"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","names":["import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","sizeClasses","PopoverPrimitive","import_lucide_react","React","import_vaul","React","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","PopoverPrimitive","import_lucide_react","React","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","PopoverPrimitive","import_lucide_react","React","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","PopoverPrimitive","import_cmdk","import_lucide_react","React","import_vaul","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","navButtonClass","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","sizeClasses","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","itemClass","sheetItemClass","DrawerPrimitive","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","import_jsx_runtime","Sonner","import_react","import_react","import_sonner","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/app-shell.tsx","../src/lib/utils.ts","../src/components/sidebar-nav.tsx","../src/components/types.tsx","../src/components/user-menu.tsx","../src/hooks/use-is-desktop.ts","../src/components/auth-card.tsx","../src/components/base-dialog.tsx","../src/components/color-picker.tsx","../src/components/rating.tsx","../src/components/combobox.tsx","../src/hooks/use-infinite-scroll-sentinel.ts","../src/components/confirm-dialog.tsx","../src/components/data-table-wrapper.tsx","../src/components/date-picker.tsx","../src/components/empty-state.tsx","../src/components/filter-toolbar.tsx","../src/components/form-dialog.tsx","../src/components/form-field.tsx","../src/components/mobile-card-list.tsx","../src/components/mode-toggle.tsx","../src/components/theme-provider.tsx","../src/lib/company-theme.ts","../src/components/multi-combobox.tsx","../src/components/page-header.tsx","../src/components/pagination.tsx","../src/components/password-input.tsx","../src/components/progress-bar.tsx","../src/components/responsive-data-view.tsx","../src/components/row-actions-menu.tsx","../src/components/search-input.tsx","../src/components/stat-card.tsx","../src/components/status-badge.tsx","../src/components/status-dot.tsx","../src/components/table-skeleton.tsx","../src/components/toaster.tsx","../src/hooks/use-company-subdomain.ts","../src/hooks/use-disclosure.ts","../src/hooks/use-toast.ts","../src/lib/api-error.ts"],"sourcesContent":["// Theme\n\nexport type { AppShellProps } from \"./components/app-shell\";\n// App shell\nexport { AppShell } from \"./components/app-shell\";\nexport { AuthCard } from \"./components/auth-card\";\nexport type { BaseDialogProps, BaseDialogSize } from \"./components/base-dialog\";\nexport { BaseDialog } from \"./components/base-dialog\";\nexport type { ColorPickerProps } from \"./components/color-picker\";\nexport { ColorPicker } from \"./components/color-picker\";\nexport { Rating } from \"./components/rating\"\nexport type { RatingProps } from \"./components/rating\"\nexport type { ComboboxOption, ComboboxProps } from \"./components/combobox\";\nexport { Combobox } from \"./components/combobox\";\nexport { ConfirmDialog } from \"./components/confirm-dialog\";\nexport { DataTableWrapper } from \"./components/data-table-wrapper\";\nexport type { DatePickerProps } from \"./components/date-picker\";\nexport { DatePicker, DateTimePicker } from \"./components/date-picker\";\nexport { EmptyState } from \"./components/empty-state\";\nexport type {\n\tFilterOption,\n\tFilterOptionListProps,\n\tFilterPopoverProps,\n\tFilterToolbarProps,\n} from \"./components/filter-toolbar\";\nexport {\n\tFilterOptionList,\n\tFilterPopover,\n\tFilterToolbar,\n} from \"./components/filter-toolbar\";\nexport type { FormDialogProps, FormDialogSize } from \"./components/form-dialog\";\nexport { FormDialog, FormDialogLayout } from \"./components/form-dialog\";\nexport { FormField } from \"./components/form-field\";\nexport { MobileCardList } from \"./components/mobile-card-list\";\n// Components\nexport { ModeToggle } from \"./components/mode-toggle\";\nexport type { MultiComboboxProps } from \"./components/multi-combobox\";\nexport { MultiCombobox } from \"./components/multi-combobox\";\nexport { PageHeader } from \"./components/page-header\";\nexport type { PaginationProps } from \"./components/pagination\";\nexport { Pagination } from \"./components/pagination\";\nexport { PasswordInput } from \"./components/password-input\";\nexport { ProgressBar } from \"./components/progress-bar\";\nexport { ResponsiveDataView } from \"./components/responsive-data-view\";\nexport type {\n\tRowAction,\n\tRowActionsMenuProps,\n} from \"./components/row-actions-menu\";\nexport { RowActionsMenu } from \"./components/row-actions-menu\";\nexport { SearchInput } from \"./components/search-input\";\nexport type { NavItem, SidebarNavProps } from \"./components/sidebar-nav\";\nexport { SidebarNav } from \"./components/sidebar-nav\";\nexport { StatCard } from \"./components/stat-card\";\nexport type { StatusBadgeVariant } from \"./components/status-badge\";\nexport { StatusBadge } from \"./components/status-badge\";\nexport { StatusDot } from \"./components/status-dot\";\nexport { TableSkeleton } from \"./components/table-skeleton\";\nexport type {\n\tTheme,\n\tThemeProviderProps,\n\tThemeProviderState,\n} from \"./components/theme-provider\";\nexport { ThemeProvider, useTheme } from \"./components/theme-provider\";\nexport { Toaster } from \"./components/toaster\";\nexport type { RenderLink, RenderLinkProps } from \"./components/types\";\nexport { defaultRenderLink } from \"./components/types\";\nexport type {\n\tAppUser,\n\tUserMenuItem,\n\tUserMenuProps,\n} from \"./components/user-menu\";\nexport { UserMenu } from \"./components/user-menu\";\nexport type {\n\tUseCompanySubdomainOptions,\n\tUseCompanySubdomainResult,\n} from \"./hooks/use-company-subdomain\";\nexport {\n\tgetSubdomain,\n\tuseCompanySubdomain,\n} from \"./hooks/use-company-subdomain\";\n// Hooks\nexport { useDisclosure } from \"./hooks/use-disclosure\";\nexport { useIsDesktop } from \"./hooks/use-is-desktop\";\nexport { toast, useCustomToast } from \"./hooks/use-toast\";\nexport { extractApiError } from \"./lib/api-error\";\nexport type { CompanyTheme, CompanyThemeTokens } from \"./lib/company-theme\";\nexport { applyCompanyTheme } from \"./lib/company-theme\";\n// Utilities\nexport { cn } from \"./lib/utils\";\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 { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\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 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 { 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","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 * Extra classes appended to the backdrop/overlay. Use it to tune the scrim\n * per dialog, e.g. `bg-black/40` for a lighter tint or `bg-transparent` to\n * drop the darkening and keep only the blur. Wins over the default via\n * tailwind-merge.\n */\n backdropClassName?: string\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 backdropClassName,\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/50 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 backdropClassName,\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 || backdropClassName) && (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none fixed inset-0 z-50 bg-black/50 animate-in fade-in-0\",\n blurBackdrop && \"backdrop-blur-sm\",\n backdropClassName,\n )}\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 PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { ChevronsUpDown, X } from \"lucide-react\"\nimport * as React from \"react\"\nimport {\n HexAlphaColorPicker,\n HexColorInput,\n HexColorPicker,\n} 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 /**\n * Accept an alpha channel — the picker gains an opacity slider and the\n * value may be an 8-digit hex (`#RRGGBBAA`). Off by default.\n */\n alpha?: 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 alpha = false,\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=\"h-5 w-5 shrink-0 rounded border border-border bg-[length:8px_8px] bg-[position:0_0,4px_4px]\"\n style={{\n // The checkerboard stays under the color layer so a\n // translucent value reads as translucent in the swatch.\n backgroundImage: `${\n color ? `linear-gradient(${color},${color}),` : \"\"\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 <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 {alpha ? (\n <HexAlphaColorPicker color={color} onChange={onChange} />\n ) : (\n <HexColorPicker color={color} onChange={onChange} />\n )}\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 alpha={alpha}\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 * as ToggleGroup from \"@radix-ui/react-toggle-group\"\nimport { Star } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst MAX_STARS = 5\n\nconst sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n} as const\n\nexport interface RatingProps {\n value?: number\n onChange?: (value: number) => void\n readOnly?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n \"aria-label\"?: string\n}\n\nfunction defaultLabel(value: number) {\n return value > 0\n ? `Avaliação: ${value} de ${MAX_STARS} estrelas`\n : \"Avaliação: sem nota\"\n}\n\nexport function Rating({\n value = 0,\n onChange,\n readOnly = false,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: RatingProps) {\n const clamped = Math.min(MAX_STARS, Math.max(0, value))\n const label = ariaLabel ?? defaultLabel(clamped)\n\n if (readOnly) {\n return (\n <div\n role=\"img\"\n aria-label={label}\n className={cn(\"inline-flex items-center gap-0.5\", className)}\n >\n {Array.from({ length: MAX_STARS }, (_, index) => (\n <Star\n key={index}\n aria-hidden\n className={cn(\n sizeClasses[size],\n index < clamped\n ? \"fill-amber-400 text-amber-400\"\n : \"text-muted-foreground\",\n )}\n />\n ))}\n </div>\n )\n }\n\n return (\n <ToggleGroup.Root\n type=\"single\"\n value={clamped > 0 ? String(clamped) : \"\"}\n onValueChange={(next) => {\n // Radix emite \"\" ao clicar de novo na estrela já selecionada;\n // mantemos a nota atual em vez de zerar (onChange é sempre 1-5).\n if (next) onChange?.(Number(next))\n }}\n aria-label={label}\n className={cn(\"inline-flex items-center gap-0.5\", className)}\n >\n {Array.from({ length: MAX_STARS }, (_, index) => {\n const starValue = index + 1\n const filled = starValue <= clamped\n return (\n <ToggleGroup.Item\n key={starValue}\n value={String(starValue)}\n aria-label={`${starValue} ${starValue === 1 ? \"estrela\" : \"estrelas\"}`}\n className=\"inline-flex cursor-pointer items-center justify-center rounded-sm bg-transparent p-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Star\n aria-hidden\n className={cn(\n sizeClasses[size],\n \"transition-colors\",\n filled\n ? \"fill-amber-400 text-amber-400\"\n : \"text-muted-foreground hover:text-amber-400\",\n )}\n />\n </ToggleGroup.Item>\n )\n })}\n </ToggleGroup.Root>\n )\n}\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\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n}\n\nexport interface ComboboxProps {\n\toptions: ComboboxOption[];\n\tvalue?: string;\n\tonChange: (value: string) => void;\n\t/** Texto do gatilho quando nada está selecionado */\n\tplaceholder?: string;\n\t/** Placeholder do campo de busca */\n\tsearchPlaceholder?: string;\n\t/** Mensagem quando a busca não retorna nada */\n\temptyMessage?: string;\n\tdisabled?: boolean;\n\tid?: string;\n\tclassName?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\";\n\t\"aria-describedby\"?: string;\n\t/** Modo servidor: chamado a cada tecla com o texto bruto da busca. Sua\n\t * presença ativa o modo servidor (filtro do cmdk desligado). */\n\tonSearchChange?: (search: string) => void;\n\t/** Modo servidor: chamado ao rolar até o fim da lista. */\n\tonLoadMore?: () => void;\n\t/** Modo servidor: mostra uma linha de carregamento no fim da lista. */\n\tloading?: boolean;\n\t/** Modo servidor: habilita o disparo de `onLoadMore`. */\n\thasMore?: boolean;\n\t/** Modo servidor: rótulo do valor já selecionado que pode não estar na\n\t * página carregada (ex.: formulário de edição). */\n\tselectedOption?: ComboboxOption;\n\t/** Permite confirmar o texto digitado como valor, mesmo fora da lista\n\t * (ex.: unidade de medida com texto livre). Mostra uma linha \"criar\" no\n\t * topo e exibe o valor personalizado no gatilho. */\n\tcreatable?: boolean;\n\t/** Rótulo da linha de criação. Padrão: `Usar \"<texto>\"`. */\n\tformatCreateLabel?: (search: string) => string;\n\t/** Permite limpar a seleção clicando na opção já selecionada (útil em\n\t * filtros: remover um filtro sem uma opção \"Todos\"). Emite `onChange(\"\")`. */\n\tdeselectable?: boolean;\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\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Selecione...\",\n\tsearchPlaceholder = \"Buscar...\",\n\temptyMessage = \"Nenhum resultado encontrado.\",\n\tdisabled,\n\tid,\n\tclassName,\n\t\"aria-invalid\": ariaInvalid,\n\t\"aria-describedby\": ariaDescribedby,\n\tonSearchChange,\n\tonLoadMore,\n\tloading,\n\thasMore,\n\tselectedOption,\n\tcreatable,\n\tformatCreateLabel,\n\tdeselectable,\n}: ComboboxProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [search, setSearch] = React.useState(\"\");\n\tconst isDesktop = useIsDesktop();\n\tconst isServer = onSearchChange !== undefined;\n\tconst selected =\n\t\tselectedOption?.value === value\n\t\t\t? selectedOption\n\t\t\t: (options.find((option) => option.value === value) ??\n\t\t\t\t(creatable && value ? { value, label: value } : undefined));\n\n\tconst handleOpenChange = (next: boolean) => {\n\t\tsetOpen(next);\n\t\tif (!next) setSearch(\"\");\n\t};\n\n\tconst handleSelect = (next: string) => {\n\t\tonChange(deselectable && next === value ? \"\" : next);\n\t\thandleOpenChange(false);\n\t};\n\n\tconst handleSearchChange = (next: string) => {\n\t\tsetSearch(next);\n\t\tonSearchChange?.(next);\n\t};\n\n\tconst trimmedSearch = search.trim();\n\tconst showCreate =\n\t\t!!creatable &&\n\t\ttrimmedSearch.length > 0 &&\n\t\t!options.some(\n\t\t\t(option) => option.value.toLowerCase() === trimmedSearch.toLowerCase(),\n\t\t);\n\tconst { listRef, sentinelRef } = useInfiniteScrollSentinel({\n\t\tenabled: isServer && !!hasMore,\n\t\tloading,\n\t\tonLoadMore,\n\t});\n\n\tconst trigger = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tid={id}\n\t\t\trole=\"combobox\"\n\t\t\taria-expanded={open}\n\t\t\taria-invalid={ariaInvalid}\n\t\t\taria-describedby={ariaDescribedby}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"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\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span className={cn(\"truncate\", !selected && \"text-muted-foreground\")}>\n\t\t\t\t{selected ? selected.label : placeholder}\n\t\t\t</span>\n\t\t\t<ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n\t\t</button>\n\t);\n\n\tconst command = (\n\t\t<CommandPrimitive\n\t\t\tshouldFilter={!isServer}\n\t\t\tclassName=\"flex h-full w-full flex-col overflow-hidden\"\n\t\t>\n\t\t\t<div className=\"flex items-center border-b px-3\">\n\t\t\t\t<Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n\t\t\t\t<CommandPrimitive.Input\n\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\tonValueChange={isServer || creatable ? handleSearchChange : undefined}\n\t\t\t\t\tclassName=\"flex h-11 w-full bg-transparent py-2 text-base outline-none placeholder:text-muted-foreground sm:h-9 sm:text-sm\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<CommandPrimitive.List\n\t\t\t\tref={listRef}\n\t\t\t\tclassName=\"max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60\"\n\t\t\t>\n\t\t\t\t{!isServer && !showCreate && (\n\t\t\t\t\t<CommandPrimitive.Empty className=\"py-6 text-center text-sm text-muted-foreground\">\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</CommandPrimitive.Empty>\n\t\t\t\t)}\n\t\t\t\t{showCreate && (\n\t\t\t\t\t<CommandPrimitive.Item\n\t\t\t\t\t\t// cmdk pontua pelo `value`; igualar à busca mantém a linha sempre no topo.\n\t\t\t\t\t\tvalue={trimmedSearch}\n\t\t\t\t\t\tonSelect={() => handleSelect(trimmedSearch)}\n\t\t\t\t\t\tclassName=\"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\t\t\t\t\t>\n\t\t\t\t\t\t<Plus className=\"h-4 w-4 shrink-0\" />\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{(formatCreateLabel ?? ((text) => `Usar \"${text}\"`))(\n\t\t\t\t\t\t\t\ttrimmedSearch,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</CommandPrimitive.Item>\n\t\t\t\t)}\n\t\t\t\t{options.map((option) => (\n\t\t\t\t\t<CommandPrimitive.Item\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t// cliente: cmdk filtra pelo `value`, então usamos o label; servidor:\n\t\t\t\t\t\t// o servidor já filtrou, então usamos o id (único, evita colisão de labels).\n\t\t\t\t\t\tvalue={isServer ? option.value : option.label}\n\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\tonSelect={() => handleSelect(option.value)}\n\t\t\t\t\t\tclassName=\"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\t\t\t\t\t>\n\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-4 w-4 shrink-0\",\n\t\t\t\t\t\t\t\tvalue === option.value ? \"opacity-100\" : \"opacity-0\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"truncate\">{option.label}</span>\n\t\t\t\t\t</CommandPrimitive.Item>\n\t\t\t\t))}\n\t\t\t\t{isServer && !loading && options.length === 0 && (\n\t\t\t\t\t<div className=\"py-6 text-center text-sm text-muted-foreground\">\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{isServer && loading && (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-6\">\n\t\t\t\t\t\t<Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{isServer && hasMore && (\n\t\t\t\t\t<div ref={sentinelRef} aria-hidden className=\"h-1\" />\n\t\t\t\t)}\n\t\t\t</CommandPrimitive.List>\n\t\t</CommandPrimitive>\n\t);\n\n\tif (isDesktop) {\n\t\treturn (\n\t\t\t<PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n\t\t\t\t<PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\tclassName=\"pointer-events-auto z-50 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\"\n\t\t\t\t\t\tstyle={{ width: \"var(--radix-popover-trigger-width)\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{command}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</PopoverPrimitive.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DrawerPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n\t\t\t<DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n\t\t\t<DrawerPrimitive.Portal>\n\t\t\t\t<DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n\t\t\t\t<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\t\t\t\t\t<DrawerPrimitive.Title className=\"sr-only\">\n\t\t\t\t\t\t{placeholder}\n\t\t\t\t\t</DrawerPrimitive.Title>\n\t\t\t\t\t<div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n\t\t\t\t\t{command}\n\t\t\t\t</DrawerPrimitive.Content>\n\t\t\t</DrawerPrimitive.Portal>\n\t\t</DrawerPrimitive.Root>\n\t);\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 AlertDialog from \"@radix-ui/react-alert-dialog\"\nimport type { ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\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 * 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 * Extra classes appended to the backdrop/overlay. Use it to tune the scrim\n * per dialog, e.g. `bg-black/40` for a lighter tint. Wins over the default\n * via tailwind-merge.\n */\n backdropClassName?: string\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 blurBackdrop = true,\n backdropClassName,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Portal>\n <AlertDialog.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 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 backdropClassName,\n )}\n />\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-sm 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 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 * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { InputMask } from \"@react-input/mask\"\nimport { endOfYear, format, isValid, parse, subYears } from \"date-fns\"\nimport { ptBR } from \"date-fns/locale\"\nimport { CalendarIcon, ChevronDown, ChevronLeft, ChevronRight, Clock } from \"lucide-react\"\nimport * as React from \"react\"\nimport { DayPicker, type Matcher } from \"react-day-picker\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\nimport { useIsDesktop } from \"../hooks/use-is-desktop\"\nimport { cn } from \"../lib/utils\"\n\nconst DATE_MASK = \"__/__/____\"\nconst TIME_MASK = \"__:__\"\nconst MASK_REPLACEMENT = { _: /\\d/ }\n\nconst DATE_FORMAT = \"dd/MM/yyyy\"\nconst TIME_FORMAT = \"HH:mm\"\nconst DATE_VALUE_FORMAT = \"yyyy-MM-dd\"\n\nexport interface DatePickerProps {\n /** `DatePicker`: data pura `\"yyyy-MM-dd\"`, sem conversão de fuso. `DateTimePicker`:\n * ISO UTC completo (`...Z`). `\"\"`/`undefined` = sem valor. */\n value?: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n /** `\"yyyy-MM-dd\"`, inclusive. */\n minDate?: string\n /** `\"yyyy-MM-dd\"`, inclusive. */\n maxDate?: string\n disabledDates?: (date: Date) => boolean\n id?: string\n className?: string\n \"aria-invalid\"?: boolean | \"true\" | \"false\"\n \"aria-describedby\"?: string\n}\n\ninterface DatePickerImplProps extends DatePickerProps {\n withTime?: boolean\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, \"0\")\n}\n\n/** Parseia `text` num formato estrito, rejeitando rollover (ex. 31/02 -> 03/03,\n * 25:99 -> next day) via round-trip: só é válido se formatar de volta pro\n * mesmo texto exato digitado. */\nfunction parseStrict(text: string, fmt: string): Date | null {\n const parsed = parse(text, fmt, new Date())\n if (!isValid(parsed)) return null\n return format(parsed, fmt) === text ? parsed : null\n}\n\nfunction dateOnlyToDate(value: string | undefined): Date | undefined {\n if (!value) return undefined\n const parsed = parse(value, DATE_VALUE_FORMAT, new Date())\n return isValid(parsed) ? parsed : undefined\n}\n\nfunction dateTimeToDate(value: string | undefined): Date | undefined {\n if (!value) return undefined\n const parsed = new Date(value)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed\n}\n\nfunction displayFor(value: string | undefined, withTime: boolean): string {\n const date = withTime ? dateTimeToDate(value) : dateOnlyToDate(value)\n if (!date) return \"\"\n const datePart = format(date, DATE_FORMAT)\n return withTime ? `${datePart} ${pad(date.getHours())}:${pad(date.getMinutes())}` : datePart\n}\n\nfunction toMatchers(\n minDate: string | undefined,\n maxDate: string | undefined,\n disabledDates: ((date: Date) => boolean) | undefined,\n): Matcher[] {\n const matchers: Matcher[] = []\n const min = dateOnlyToDate(minDate)\n const max = dateOnlyToDate(maxDate)\n if (min) matchers.push({ before: min })\n if (max) matchers.push({ after: max })\n if (disabledDates) matchers.push(disabledDates)\n return matchers\n}\n\nconst triggerInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 pr-10 text-sm shadow-sm transition-colors 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\"\n\nconst fieldInputClass =\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n\n/** Botão \"ghost\" (sem borda, hover:bg-accent) — mesma variante que o shadcn usa nas\n * setas de navegação do calendário; inline porque o ui-kit não tem um Button próprio. */\nconst navButtonClass =\n \"inline-flex size-(--cell-size) shrink-0 select-none items-center justify-center rounded-md p-0 transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:opacity-50\"\n\nconst calendarClassNames = {\n months: \"relative flex flex-col gap-4\",\n month: \"flex w-full flex-col gap-4\",\n month_caption: \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n caption_label:\n \"flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm font-medium select-none [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n dropdowns: \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n dropdown_root:\n \"relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50\",\n dropdown: \"absolute inset-0 bg-popover opacity-0\",\n nav: \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n button_previous: navButtonClass,\n button_next: navButtonClass,\n month_grid: \"w-full border-collapse\",\n weekdays: \"flex\",\n weekday: \"flex-1 select-none rounded-md text-[0.8rem] font-normal text-muted-foreground\",\n week: \"mt-2 flex w-full\",\n day: \"relative aspect-square h-full w-full select-none p-0 text-center aria-selected:[&>button]:bg-primary aria-selected:[&>button]:text-primary-foreground aria-selected:[&>button]:hover:bg-primary\",\n day_button:\n \"inline-flex aspect-square size-auto w-full min-w-(--cell-size) items-center justify-center rounded-md p-0 font-normal transition-colors hover:bg-accent hover:text-accent-foreground\",\n today: \"bg-accent text-accent-foreground rounded-md\",\n outside: \"text-muted-foreground opacity-50\",\n disabled: \"text-muted-foreground opacity-50 pointer-events-none\",\n hidden: \"invisible\",\n}\n\nconst calendarComponents = {\n Chevron: ({ orientation }: { orientation?: string }) => {\n if (orientation === \"left\") return <ChevronLeft className=\"size-4\" />\n if (orientation === \"right\") return <ChevronRight className=\"size-4\" />\n return <ChevronDown className=\"size-4\" />\n },\n}\n\n/** Nome curto do mês em pt-BR pro rótulo do dropdown (ex. \"jul\") — explícito porque\n * `toLocaleString(\"default\", ...)` seguiria o locale do navegador, não o do app. */\nconst formatMonthDropdown = (date: Date) => date.toLocaleString(\"pt-BR\", { month: \"short\" })\n\n/**\n * DatePicker / DateTimePicker — calendário + campo digitável com máscara\n * (nunca o `<input type=\"date\"/time\">` nativo). Desktop: Popover não-modal;\n * mobile: Drawer (bottom sheet) — mesmo padrão de `Combobox`/`ColorPicker`.\n *\n * `DatePicker` fecha ao escolher o dia (não tem hora pra confirmar).\n * `DateTimePicker` exige \"Aplicar\" — calendário e campo de horário só viram\n * `value` quando os dois estão preenchidos.\n */\nfunction DatePickerImpl({\n value,\n onChange,\n placeholder,\n disabled,\n minDate,\n maxDate,\n disabledDates,\n withTime = false,\n id,\n className,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedby,\n}: DatePickerImplProps) {\n const isDesktop = useIsDesktop()\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const [open, setOpenRaw] = React.useState(false)\n const [focused, setFocused] = React.useState(false)\n const [editText, setEditText] = React.useState(\"\")\n const [pendingDate, setPendingDate] = React.useState<Date | undefined>()\n const [pendingTime, setPendingTime] = React.useState(\"\")\n\n const committedDate = withTime ? dateTimeToDate(value) : dateOnlyToDate(value)\n const displayValue = displayFor(value, withTime)\n const matchers = toMatchers(minDate, maxDate, disabledDates)\n // Alcance do dropdown de ano: minDate/maxDate quando informados, senão o mesmo\n // padrão da lib (100 anos atrás -> fim do ano atual) — calculado explícito nos dois\n // lados porque passar só um dos dois via prop faz a lib truncar o outro (visto na\n // prática: só uma opção de ano no lado sem prop), em vez de cair no padrão dela.\n const startMonth = dateOnlyToDate(minDate) ?? subYears(new Date(), 100)\n const endMonth = dateOnlyToDate(maxDate) ?? endOfYear(new Date())\n\n const setOpen = (next: boolean) => {\n setOpenRaw(next)\n if (next) {\n setEditText(displayValue)\n setPendingDate(committedDate)\n setPendingTime(\n committedDate ? `${pad(committedDate.getHours())}:${pad(committedDate.getMinutes())}` : \"\",\n )\n }\n }\n\n const commitDateOnly = (date: Date) => {\n onChange(format(date, DATE_VALUE_FORMAT))\n setOpen(false)\n }\n\n const commitDateTime = (date: Date, timeText: string) => {\n const time = parseStrict(timeText, TIME_FORMAT)\n if (!time) return\n const combined = new Date(date)\n combined.setHours(time.getHours(), time.getMinutes(), 0, 0)\n onChange(combined.toISOString())\n setOpen(false)\n }\n\n const handleCalendarSelect = (date: Date) => {\n if (!withTime) {\n commitDateOnly(date)\n return\n }\n setPendingDate(date)\n setEditText(`${format(date, DATE_FORMAT)} ${pendingTime}`.trim())\n }\n\n const handleTriggerChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const text = event.target.value\n setEditText(text)\n if (!withTime) {\n const parsed = parseStrict(text, DATE_FORMAT)\n if (parsed) commitDateOnly(parsed)\n return\n }\n const [datePart, timePart] = [text.slice(0, 10), text.slice(11)]\n const parsedDate = parseStrict(datePart, DATE_FORMAT)\n if (parsedDate) {\n setPendingDate(parsedDate)\n if (timePart) setPendingTime(timePart)\n }\n if (parsedDate && timePart && parseStrict(timePart, TIME_FORMAT)) {\n commitDateTime(parsedDate, timePart)\n }\n }\n\n const handleTimeFieldChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setPendingTime(event.target.value)\n if (pendingDate) {\n setEditText(`${format(pendingDate, DATE_FORMAT)} ${event.target.value}`.trim())\n }\n }\n\n const canApply = withTime && !!pendingDate && !!parseStrict(pendingTime, TIME_FORMAT)\n\n const trigger = (\n <div ref={triggerRef} className=\"relative\">\n <InputMask\n id={id}\n mask={withTime ? `${DATE_MASK} ${TIME_MASK}` : DATE_MASK}\n replacement={MASK_REPLACEMENT}\n value={focused ? editText : displayValue}\n onChange={handleTriggerChange}\n onFocus={() => {\n setFocused(true)\n setOpen(true)\n }}\n onBlur={() => setFocused(false)}\n placeholder={placeholder ?? (withTime ? \"dd/mm/aaaa hh:mm\" : \"dd/mm/aaaa\")}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedby}\n className={cn(triggerInputClass, className)}\n />\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={withTime ? \"Abrir calendário e horário\" : \"Abrir calendário\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n {withTime ? <Clock className=\"h-4 w-4\" /> : <CalendarIcon className=\"h-4 w-4\" />}\n </button>\n </div>\n )\n\n const content = (\n <div className={withTime ? \"p-3\" : \"\"}>\n <DayPicker\n mode=\"single\"\n locale={ptBR}\n captionLayout=\"dropdown\"\n formatters={{ formatMonthDropdown }}\n startMonth={startMonth}\n endMonth={endMonth}\n selected={withTime ? pendingDate : committedDate}\n defaultMonth={(withTime ? pendingDate : committedDate) ?? new Date()}\n onSelect={(date) => date && handleCalendarSelect(date)}\n disabled={matchers}\n className={cn(withTime ? \"p-0\" : \"p-3\", \"[--cell-size:2rem]\")}\n classNames={calendarClassNames}\n components={calendarComponents}\n />\n {withTime && (\n <>\n <div className=\"mt-2 flex items-center gap-2 border-t pt-3\">\n <span className=\"text-sm text-muted-foreground\">Horário</span>\n <InputMask\n mask={TIME_MASK}\n replacement={MASK_REPLACEMENT}\n value={pendingTime}\n onChange={handleTimeFieldChange}\n placeholder=\"hh:mm\"\n aria-label=\"Horário\"\n className={cn(fieldInputClass, \"flex-1\")}\n />\n </div>\n <button\n type=\"button\"\n disabled={!canApply}\n onClick={() => pendingDate && commitDateTime(pendingDate, pendingTime)}\n className=\"mt-3 flex h-9 w-full items-center justify-center rounded-md bg-primary text-sm font-medium text-primary-foreground shadow-sm transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50\"\n >\n Aplicar\n </button>\n </>\n )}\n </div>\n )\n\n if (isDesktop) {\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Anchor asChild>{trigger}</PopoverPrimitive.Anchor>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n onOpenAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n if (triggerRef.current?.contains(event.target as Node)) event.preventDefault()\n }}\n className=\"pointer-events-auto z-50 w-auto overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\"\n >\n {content}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n )\n }\n\n return (\n <DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <DrawerPrimitive.Portal>\n <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n <DrawerPrimitive.Content\n onOpenAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n if (triggerRef.current?.contains(event.target as Node)) event.preventDefault()\n }}\n 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 >\n <DrawerPrimitive.Title className=\"sr-only\">\n {withTime ? \"Selecione a data e o horário\" : \"Selecione a data\"}\n </DrawerPrimitive.Title>\n <div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n <div className=\"flex justify-center overflow-y-auto pb-4\">{content}</div>\n </DrawerPrimitive.Content>\n </DrawerPrimitive.Portal>\n </DrawerPrimitive.Root>\n )\n}\n\nexport function DatePicker(props: DatePickerProps) {\n return <DatePickerImpl {...props} />\n}\n\nexport function DateTimePicker(props: DatePickerProps) {\n return <DatePickerImpl {...props} withTime />\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 PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { ChevronDown, type LucideIcon, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\nimport { useIsDesktop } from \"../hooks/use-is-desktop\";\nimport { cn } from \"../lib/utils\";\n\n/**\n * Barra de filtros compacta para telas com muitos filtros.\n *\n * Mantém poucos controles visíveis (uma busca + 1–2 filtros primários) e recolhe\n * o restante atrás de um botão \"Filtros\" com contador, no lugar de uma fileira\n * poluída de dropdowns. Composicional e router-agnóstico: o app fornece os\n * controles reais (Combobox, listas) dentro de cada `FilterPopover`.\n */\nexport interface FilterToolbarProps {\n\tchildren: React.ReactNode;\n\t/** Mostra o botão \"Limpar filtros\" quando `true`. */\n\tisFilterActive?: boolean;\n\tonClear?: () => void;\n\tclearLabel?: string;\n\tclassName?: string;\n}\n\nexport function FilterToolbar({\n\tchildren,\n\tisFilterActive = false,\n\tonClear,\n\tclearLabel = \"Limpar filtros\",\n\tclassName,\n}: FilterToolbarProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"mb-6 flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t\t{isFilterActive && onClear && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClear}\n\t\t\t\t\tclassName=\"inline-flex h-9 shrink-0 items-center justify-center gap-1.5 self-start rounded-md px-2.5 text-sm text-muted-foreground transition-colors hover:text-foreground sm:self-auto\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t\t{clearLabel}\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\ntype FilterPopoverContent =\n\t| React.ReactNode\n\t| ((api: { close: () => void }) => React.ReactNode);\n\nexport interface FilterPopoverProps {\n\t/** Rótulo do gatilho (nome do filtro). */\n\tlabel: string;\n\t/** Ícone opcional à esquerda (ex.: `Filter` no botão de overflow). */\n\ticon?: LucideIcon;\n\t/** Ativo → gatilho destacado e badge visível. */\n\tactive?: boolean;\n\t/** Conteúdo do badge quando ativo: uma contagem ou o rótulo do valor. */\n\tbadge?: React.ReactNode;\n\t/** Largura/estilo do conteúdo no desktop. Padrão: `w-60`. */\n\tcontentClassName?: string;\n\talign?: \"start\" | \"center\" | \"end\";\n\t/** Título do drawer no mobile (acessibilidade). Padrão: `label`. */\n\ttitle?: string;\n\t/** Nó ou render-prop que recebe `{ close }` para fechar após selecionar. */\n\tchildren: FilterPopoverContent;\n}\n\n/**\n * Gatilho compacto + popover (desktop) / drawer (mobile) para um filtro.\n * Mesmo idiom do `Combobox`: popover não-modal no desktop, bottom sheet no touch.\n */\nexport function FilterPopover({\n\tlabel,\n\ticon: Icon,\n\tactive = false,\n\tbadge,\n\tcontentClassName,\n\talign = \"start\",\n\ttitle,\n\tchildren,\n}: FilterPopoverProps) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst isDesktop = useIsDesktop();\n\tconst close = React.useCallback(() => setOpen(false), []);\n\tconst content =\n\t\ttypeof children === \"function\" ? children({ close }) : children;\n\n\tconst trigger = (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-expanded={open}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-9 w-full shrink-0 cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent px-3 text-sm shadow-sm transition-colors hover:border-ring/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:w-auto sm:justify-start\",\n\t\t\t\tactive ? \"border-ring/60 text-foreground\" : \"text-muted-foreground\",\n\t\t\t)}\n\t\t>\n\t\t\t{Icon && <Icon className=\"h-4 w-4 shrink-0 opacity-70\" />}\n\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t{active && badge != null && (\n\t\t\t\t<span className=\"inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-medium leading-none text-primary-foreground\">\n\t\t\t\t\t{badge}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n\t\t</button>\n\t);\n\n\tif (isDesktop) {\n\t\treturn (\n\t\t\t<PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n\t\t\t\t<PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\talign={align}\n\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\tonInteractOutside={(event) => {\n\t\t\t\t\t\t\t// Mantém aberto quando o clique cai dentro de outro popover\n\t\t\t\t\t\t\t// aberto a partir daqui (ex.: o dropdown de um Combobox),\n\t\t\t\t\t\t\t// em vez de um clique genuíno fora.\n\t\t\t\t\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\t\t\t\t\tif (target?.closest(\"[data-radix-popper-content-wrapper]\")) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"pointer-events-auto z-50 w-60 overflow-hidden rounded-md border bg-popover p-0 text-popover-foreground shadow-md\",\n\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</PopoverPrimitive.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DrawerPrimitive.Root open={open} onOpenChange={setOpen}>\n\t\t\t<DrawerPrimitive.Trigger asChild>{trigger}</DrawerPrimitive.Trigger>\n\t\t\t<DrawerPrimitive.Portal>\n\t\t\t\t<DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/80\" />\n\t\t\t\t<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\t\t\t\t\t<DrawerPrimitive.Title className=\"sr-only\">\n\t\t\t\t\t\t{title ?? label}\n\t\t\t\t\t</DrawerPrimitive.Title>\n\t\t\t\t\t<div className=\"mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted\" />\n\t\t\t\t\t<div className=\"overflow-y-auto p-2\">{content}</div>\n\t\t\t\t</DrawerPrimitive.Content>\n\t\t\t</DrawerPrimitive.Portal>\n\t\t</DrawerPrimitive.Root>\n\t);\n}\n\nexport interface FilterOption {\n\tvalue: string;\n\tlabel: string;\n\t/** Classe do \"dot\" à esquerda (ex.: `bg-emerald-500` para um status). */\n\tdotClassName?: string;\n}\n\nexport interface FilterOptionListProps {\n\toptions: FilterOption[];\n\t/** `string` no modo simples; `string[]` no modo múltiplo. */\n\tvalue: string | string[];\n\tonChange: (value: string | string[]) => void;\n\tmultiple?: boolean;\n\t/** Mostra o link \"Limpar\" no rodapé quando há seleção. */\n\tclearable?: boolean;\n\tclearLabel?: string;\n}\n\n/**\n * Lista de opções (seleção simples ou múltipla) para o conteúdo de um\n * `FilterPopover` — evita aninhar um Combobox para enums curtos.\n */\nexport function FilterOptionList({\n\toptions,\n\tvalue,\n\tonChange,\n\tmultiple = false,\n\tclearable = false,\n\tclearLabel = \"Limpar\",\n}: FilterOptionListProps) {\n\tconst selected = Array.isArray(value) ? value : value ? [value] : [];\n\tconst hasSelection = selected.length > 0;\n\n\tconst toggle = (optionValue: string) => {\n\t\tif (!multiple) {\n\t\t\tonChange(optionValue);\n\t\t\treturn;\n\t\t}\n\t\tonChange(\n\t\t\tselected.includes(optionValue)\n\t\t\t\t? selected.filter((v) => v !== optionValue)\n\t\t\t\t: [...selected, optionValue],\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col p-1\">\n\t\t\t{options.map((option) => {\n\t\t\t\tconst isChecked = selected.includes(option.value);\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => toggle(option.value)}\n\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{option.dotClassName && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"h-2 w-2 shrink-0 rounded-full\",\n\t\t\t\t\t\t\t\t\toption.dotClassName,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<span className=\"flex-1 truncate\">{option.label}</span>\n\t\t\t\t\t\t{isChecked && (\n\t\t\t\t\t\t\t<span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-primary\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{clearable && hasSelection && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => onChange(multiple ? [] : \"\")}\n\t\t\t\t\tclassName=\"mt-1 border-t px-2 pt-1.5 pb-0.5 text-center text-xs text-muted-foreground transition-colors hover:text-foreground\"\n\t\t\t\t>\n\t\t\t\t\t{clearLabel}\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\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-sm 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 // O conteúdo do dialog é portalado para o body, mas eventos React sobem pela\n // árvore React, não pela do DOM: sem stopPropagation, o submit deste form\n // chega ao <form> da página que renderiza o dialog e dispara o submit dela.\n // Precisa ser síncrono — handlers de RHF são assíncronos (resolver).\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.stopPropagation()\n onSubmit?.(e)\n }\n return (\n <BaseDialog\n {...rest}\n contentWrapper={\n onSubmit\n ? (content) => (\n <form onSubmit={handleSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {content}\n </form>\n )\n : undefined\n }\n />\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=\"block 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 { 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 * 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 { 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 * 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 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","export interface PaginationProps {\n page: number\n onPageChange: (page: number) => void\n hasNextPage: boolean\n hasPreviousPage: boolean\n /** Total de páginas. Quando informado, o rótulo vira \"Página {page} de {totalPages}\". */\n totalPages?: number\n /** Exibe o seletor de itens por página. Use com `pageSize`, `onPageSizeChange` e `pageSizeOptions`. */\n showPageSizeSelector?: boolean\n pageSize?: number\n onPageSizeChange?: (size: number) => void\n pageSizeOptions?: number[]\n className?: string\n}\n\nconst navButtonClass =\n \"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\nexport function Pagination({\n page,\n onPageChange,\n hasNextPage,\n hasPreviousPage,\n totalPages,\n showPageSizeSelector = false,\n pageSize,\n onPageSizeChange,\n pageSizeOptions,\n className,\n}: PaginationProps) {\n return (\n <div\n className={`flex items-center ${showPageSizeSelector ? \"justify-between\" : \"justify-end\"} gap-4 ${className ?? \"\"}`}\n >\n {showPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"pagination-page-size\" className=\"text-sm text-muted-foreground\">\n Itens por página\n </label>\n <select\n id=\"pagination-page-size\"\n value={pageSize}\n onChange={(e) => onPageSizeChange?.(Number(e.target.value))}\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-medium shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring cursor-pointer\"\n >\n {(pageSizeOptions ?? []).map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={!hasPreviousPage}\n className={navButtonClass}\n >\n Anterior\n </button>\n <span className=\"text-sm text-muted-foreground\">\n Página {page}\n {totalPages ? ` de ${totalPages}` : \"\"}\n </span>\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={!hasNextPage}\n className={navButtonClass}\n >\n Próximo\n </button>\n </div>\n </div>\n )\n}\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 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 { ReactNode } from \"react\"\nimport { EmptyState } from \"./empty-state\"\n\nimport { cn } from \"../lib/utils\"\n\ninterface ResponsiveDataViewProps {\n table: ReactNode\n cards: ReactNode\n isEmpty: boolean\n isLoading: boolean\n /**\n * Dados desatualizados na tela enquanto um refetch está em voo (ex.:\n * `isPlaceholderData` do TanStack Query). Esmaece e bloqueia a interação\n * com table/cards; a paginação continua clicável.\n */\n isBusy?: boolean\n emptyIcon?: ReactNode\n emptyTitle?: string\n emptyDescription?: string\n /** CTA do estado vazio — normalmente o mesmo botão \"Adicionar X\" da página. */\n emptyAction?: ReactNode\n pagination?: ReactNode\n}\n\nexport function ResponsiveDataView({\n table,\n cards,\n isEmpty,\n isLoading,\n isBusy = false,\n emptyIcon,\n emptyTitle = \"Nenhum registro encontrado\",\n emptyDescription,\n emptyAction,\n pagination,\n}: ResponsiveDataViewProps) {\n // Lista vazia mostra só o EmptyState. Antes renderizava a caixa com o\n // cabeçalho da tabela vazio, o bloco de texto por fora dela e a paginação\n // desabilitada — três blocos empilhados para zero registro.\n if (!isLoading && !isBusy && isEmpty) {\n return (\n <div className=\"rounded-md border\">\n <EmptyState\n icon={emptyIcon}\n title={emptyTitle}\n description={emptyDescription}\n action={emptyAction}\n />\n </div>\n )\n }\n\n const busyClass = isBusy && \"pointer-events-none opacity-50\"\n return (\n <div className=\"space-y-4\">\n <div\n aria-busy={isBusy}\n className={cn(\n \"hidden overflow-x-auto rounded-md border transition-opacity md:block\",\n busyClass,\n )}\n >\n {table}\n </div>\n <div aria-busy={isBusy} className={cn(\"transition-opacity md:hidden\", busyClass)}>\n {cards}\n </div>\n {pagination}\n </div>\n )\n}\n","import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\"\nimport { ChevronRight, 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 // Submenu de um nível: com `children`, `onClick`/`href` são ignorados.\n // Desktop: Radix Sub; mobile: grupo inline no action sheet.\n children?: RowAction[]\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 if (action.children?.length) {\n return (\n <DropdownMenu.Sub key={action.label}>\n <DropdownMenu.SubTrigger\n className={cls}\n disabled={action.disabled}\n >\n {action.icon}\n {action.label}\n <ChevronRight className=\"ml-auto h-4 w-4 text-muted-foreground\" />\n </DropdownMenu.SubTrigger>\n <DropdownMenu.Portal>\n <DropdownMenu.SubContent\n sideOffset={4}\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 {action.children.map((child) => (\n <DropdownMenu.Item\n key={child.label}\n className={cn(\n itemClass,\n child.destructive &&\n \"text-destructive focus:bg-destructive/10\",\n )}\n disabled={child.disabled}\n onClick={child.onClick}\n >\n {child.icon}\n {child.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.SubContent>\n </DropdownMenu.Portal>\n </DropdownMenu.Sub>\n )\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 if (action.children?.length) {\n return (\n <div key={action.label}>\n <div className=\"mx-3 my-1 h-px bg-border\" />\n <div className=\"flex items-center gap-3 px-3 pb-1 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {action.icon}\n {action.label}\n </div>\n {action.children.map((child) => (\n <button\n key={child.label}\n type=\"button\"\n disabled={child.disabled}\n className={cn(\n sheetItemClass,\n child.destructive && \"text-destructive\",\n )}\n onClick={() => {\n child.onClick?.()\n setOpen(false)\n }}\n >\n {child.icon}\n {child.label}\n </button>\n ))}\n <div className=\"mx-3 my-1 h-px bg-border\" />\n </div>\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","import * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\ninterface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n\tcontainerClassName?: string;\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n\t({ containerClassName, className, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div className={cn(\"relative flex-1\", containerClassName)}>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<circle cx=\"11\" cy=\"11\" r=\"8\" />\n\t\t\t\t\t<path d=\"m21 21-4.3-4.3\" />\n\t\t\t\t</svg>\n\t\t\t\t<input\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"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\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\nSearchInput.displayName = \"SearchInput\";\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\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\n/**\n * Cada variante lê os tokens semânticos `--status-*` do app, com fallback para\n * a paleta Tailwind que o componente já usava. Um app que define os tokens\n * (ex.: IMMA, de neutros quentes) ganha as cores do seu design system; um app\n * que não define continua com a aparência de antes — a troca não quebra nenhum\n * consumidor. Também dispensa `dark:`, já que os tokens de quem os define\n * mudam sozinhos no escopo `.dark`.\n */\nconst variantClasses: Record<\n StatusBadgeVariant,\n { badge: string; dot: string }\n> = {\n neutral: {\n badge:\n \"bg-[var(--status-neutral-surface,#f3f4f6)] text-[var(--status-neutral-text,#374151)]\",\n dot: \"bg-[var(--status-neutral,#9ca3af)]\",\n },\n info: {\n badge:\n \"bg-[var(--status-info-surface,#dbeafe)] text-[var(--status-info-text,#1d4ed8)]\",\n dot: \"bg-[var(--status-info,#3b82f6)]\",\n },\n success: {\n badge:\n \"bg-[var(--status-success-surface,#dcfce7)] text-[var(--status-success-text,#15803d)]\",\n dot: \"bg-[var(--status-success,#22c55e)]\",\n },\n danger: {\n badge:\n \"bg-[var(--status-danger-surface,#fee2e2)] text-[var(--status-danger-text,#b91c1c)]\",\n dot: \"bg-[var(--status-danger,#ef4444)]\",\n },\n warning: {\n badge:\n \"bg-[var(--status-warning-surface,#fef3c7)] text-[var(--status-warning-text,#b45309)]\",\n dot: \"bg-[var(--status-warning,#f59e0b)]\",\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","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","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 // p-2/h-4 espelha o TableCell real. Com p-4/h-5 a linha do skeleton\n // ficava ~16px mais alta que a linha de dados, e a tabela encolhia\n // visivelmente quando a resposta chegava.\n <tr key={i} className=\"border-b transition-colors\">\n {Array.from({ length: columns }).map((_, j) => (\n <td key={j} className=\"p-2 align-middle first:pl-4 last:pr-4\">\n <div className=\"h-4 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\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 { useState } from \"react\"\n\nexport type UseCompanySubdomainOptions = {\n enableOverride?: boolean\n overrideStorageKey?: string\n /**\n * Host labels that are *not* tenants. A product whose default host carries\n * a label of its own (`app.example.com`, `admin.example.com`) must list it\n * here, or that label is read as a tenant slug and sent downstream as one.\n *\n * Added to the built-in `www`; `localhost` is always excluded structurally.\n * Case-insensitive.\n */\n reservedSubdomains?: string[]\n}\n\nexport type UseCompanySubdomainResult = {\n subdomain: string | undefined\n}\n\nconst ALWAYS_RESERVED = [\"www\", \"localhost\"]\n\n/**\n * The tenant slug in a hostname, or `undefined` when there is none.\n *\n * The first label is only a tenant if it isn't reserved. Callers whose\n * default host is `app.<domain>` must pass `[\"app\"]` (plus any sibling\n * surfaces like `admin`), otherwise visiting the default host yields the\n * literal `\"app\"` as if it were a customer.\n */\nexport function getSubdomain(\n hostname: string,\n reservedSubdomains: string[] = [],\n): string | undefined {\n const labels = hostname.split(\".\")\n if (labels.length < 2) return undefined\n const first = labels[0]\n if (!first) return undefined\n const reserved = [...ALWAYS_RESERVED, ...reservedSubdomains].map((label) =>\n label.toLowerCase(),\n )\n if (reserved.includes(first.toLowerCase())) 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 {\n enableOverride = false,\n overrideStorageKey = \"company-subdomain\",\n reservedSubdomains = [],\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, reservedSubdomains)\n })\n\n return { subdomain }\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","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"],"mappings":"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","names":["import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","sizeClasses","PopoverPrimitive","import_lucide_react","React","import_vaul","React","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","PopoverPrimitive","import_lucide_react","React","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","PopoverPrimitive","import_lucide_react","React","import_vaul","import_jsx_runtime","DrawerPrimitive","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_jsx_runtime","theme","import_jsx_runtime","PopoverPrimitive","import_cmdk","import_lucide_react","React","import_vaul","import_jsx_runtime","CommandPrimitive","DrawerPrimitive","import_jsx_runtime","import_jsx_runtime","navButtonClass","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","sizeClasses","import_jsx_runtime","DropdownMenu","import_lucide_react","import_react","import_vaul","import_jsx_runtime","itemClass","sheetItemClass","DrawerPrimitive","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","import_jsx_runtime","Sonner","import_react","import_react","import_sonner","import_react"]}
|