@carefully-built/ui 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["AvatarPrimitive","DialogPrimitive","DropdownMenuPrimitive","DrawerPrimitive","DEFAULT_DATE_DISPLAY_LABELS: DateDisplayLabels","selectedFiles","SheetPrimitive","TooltipPrimitive","LabelPrimitive","PopoverPrimitive","TabsPrimitive","SelectPrimitive","SwitchPrimitive","fragments: string[]","bestScore: number | null","value","actionIcons: Record<ActionType, typeof Eye>","actionLabels: Record<ActionType, string>"],"sources":["../src/utils/cn.ts","../src/primitives/avatar.tsx","../src/primitives/button.tsx","../src/primitives/calendar.tsx","../src/primitives/card.tsx","../src/primitives/chip-utils.ts","../src/primitives/chip.tsx","../src/primitives/dialog.tsx","../src/primitives/dropdown-menu.tsx","../src/primitives/drawer.tsx","../src/utils/date-display.ts","../src/primitives/display-date.tsx","../src/primitives/field-detail-row.tsx","../src/primitives/file-dropzone.tsx","../src/primitives/keyboard-shortcut-hint.tsx","../src/overlays/responsive-sheet.footer.tsx","../src/primitives/sheet.tsx","../src/overlays/responsive-sheet.layouts.tsx","../src/overlays/responsive-sheet.shortcuts.ts","../src/utils/use-media-query.ts","../src/overlays/responsive-sheet.tsx","../src/primitives/tooltip.tsx","../src/primitives/help-info-button.tsx","../src/primitives/input.tsx","../src/primitives/label.tsx","../src/primitives/pagination.tsx","../src/primitives/popover.tsx","../src/primitives/scroll-fade-area.tsx","../src/primitives/tabs.tsx","../src/primitives/segmented-toggle.tsx","../src/primitives/select.tsx","../src/primitives/skeleton.tsx","../src/primitives/switch.tsx","../src/primitives/table.tsx","../src/primitives/textarea.tsx","../src/primitives/user-picker-utils.ts","../src/primitives/user-picker.tsx","../src/empty-state/empty-state-card.tsx","../src/empty-state/initial-empty-state.tsx","../src/empty-state/no-results-state.tsx","../src/empty-state/collection-empty-state.ts","../src/utils/search.ts","../src/search/searchable-select-position.ts","../src/search/searchable-select.tsx","../src/smart-table/SmartTableActions.tsx","../src/smart-table/utils.ts","../src/smart-table/sorting.ts","../src/smart-table/truncated-content.utils.ts","../src/smart-table/TruncatedContent.tsx","../src/smart-table/DesktopView.tsx","../src/smart-table/MobileView.tsx","../src/smart-table/SmartTable.tsx","../src/table-toolbar/table-toolbar.tsx","../src/error-page/error-code.tsx","../src/error-page/error-page-content.ts","../src/error-page/posthog-error-capture.ts","../src/error-page/saas-error-page.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"rounded-full aspect-square size-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback\n}\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:brightness-90 [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\ntype ButtonVariant =\n | \"default\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"link\";\ntype ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\n\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n readonly asChild?: boolean;\n readonly size?: ButtonSize;\n readonly variant?: ButtonVariant;\n}\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\nexport type { ButtonProps, ButtonSize, ButtonVariant };\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { buttonVariants } from \"./button\"\nimport { cn } from \"../utils/cn\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: React.ComponentProps<typeof DayPicker>) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: \"flex flex-col gap-4\",\n month: \"flex flex-col gap-4\",\n month_caption: \"relative flex items-center justify-center pt-1\",\n caption_label: \"text-sm font-medium\",\n nav: \"flex items-center gap-1\",\n button_previous: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"absolute left-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"absolute right-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday:\n \"w-9 text-[0.78rem] font-medium text-muted-foreground\",\n week: \"mt-2 flex w-full\",\n day: \"size-9 p-0 text-sm\",\n day_button: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"size-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n today: \"bg-muted text-foreground\",\n outside: \"text-muted-foreground opacity-50 aria-selected:bg-primary/10 aria-selected:text-muted-foreground\",\n disabled: \"text-muted-foreground opacity-50\",\n hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation, className: iconClassName, ...iconProps }) =>\n orientation === \"left\" ? (\n <ChevronLeft className={cn(\"size-4\", iconClassName)} {...iconProps} />\n ) : (\n <ChevronRight className={cn(\"size-4\", iconClassName)} {...iconProps} />\n ),\n }}\n {...props}\n />\n )\n}\n\nexport { Calendar }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\"ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-xl py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"bg-muted/50 rounded-b-xl border-t p-4 group-data-[size=sm]/card:p-3 flex items-center\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n}\n","export const CHIP_CLASS_NAMES = {\n default: 'inline-flex w-fit max-w-full flex-none items-center gap-1 rounded-md px-1.5 py-[2px] text-xs font-medium leading-4',\n compact: 'inline-flex w-fit max-w-full flex-none items-center gap-1 rounded-[4px] px-1.5 py-px text-[10px] font-medium leading-3',\n} as const;\n\nexport type ChipSize = keyof typeof CHIP_CLASS_NAMES;\n\nexport function getChipClassName(size: ChipSize = 'default'): string {\n return CHIP_CLASS_NAMES[size];\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';\n\nimport { getChipClassName, type ChipSize } from './chip-utils';\nimport { cn } from '../utils/cn';\n\ninterface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n readonly children: ReactNode;\n readonly leading?: ReactNode;\n readonly trailing?: ReactNode;\n readonly size?: ChipSize;\n}\n\nexport function Chip({\n children,\n className,\n leading,\n size = 'default',\n trailing,\n ...props\n}: ChipProps): React.ReactElement {\n return (\n <span\n {...props}\n className={cn(\n getChipClassName(size),\n className\n )}\n >\n {leading ? <span className=\"shrink-0\">{leading}</span> : null}\n <span className=\"truncate\">{children}</span>\n {trailing ? <span className=\"shrink-0\">{trailing}</span> : null}\n </span>\n );\n}\n\ninterface ChipButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n readonly children: ReactNode;\n readonly leading?: ReactNode;\n readonly trailing?: ReactNode;\n readonly selected?: boolean;\n readonly size?: ChipSize;\n}\n\nexport function ChipButton({\n children,\n className,\n leading,\n selected = false,\n size = 'default',\n trailing,\n ...props\n}: ChipButtonProps): React.ReactElement {\n return (\n <button\n type=\"button\"\n aria-pressed={selected}\n {...props}\n className={cn(\n getChipClassName(size),\n 'border text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n selected\n ? 'border-[#713dff] bg-[#f6f1ff] text-[#1f1f23] shadow-[0_0_0_1px_rgba(113,61,255,0.08)] hover:bg-[#f6f1ff]'\n : 'border-[#e7e8eb] bg-white text-[#5f6368] hover:bg-[#f7f7f9]',\n className\n )}\n >\n {leading ? <span className=\"shrink-0\">{leading}</span> : null}\n <span className=\"truncate\">{children}</span>\n {trailing ? <span className=\"shrink-0\">{trailing}</span> : null}\n </button>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\nimport { Button } from \"./button\"\nimport { X } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 isolate z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 grid max-w-[calc(100%-2rem)] gap-4 rounded-xl p-4 text-sm ring-1 duration-100 sm:max-w-sm fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\">\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"gap-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"bg-muted/50 -mx-4 -mb-4 rounded-b-xl border-t p-4 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-base leading-none font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground *:[a]:hover:text-foreground text-sm *:[a]:underline *:[a]:underline-offset-3\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction DropdownMenu({\n modal = false,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" modal={modal} {...props} />\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto data-[state=closed]:overflow-hidden\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-1.5 rounded-md px-1.5 py-1 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-pointer items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-pointer items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\"text-muted-foreground px-1.5 py-1 text-xs font-medium data-inset:pl-7\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuSeparator\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Drawer as DrawerPrimitive } from 'vaul';\n\nimport { cn } from '../utils/cn';\n\nfunction Drawer({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\nfunction DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 fixed inset-0 z-50 bg-black/10 backdrop-blur-xs',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n 'bg-background group/drawer-content fixed z-50 flex h-auto flex-col overflow-visible text-sm data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-r-xl data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-l-xl data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm',\n className,\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-1 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n 'flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-0.5 md:text-left',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn('text-foreground text-base font-medium', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerOverlay,\n DrawerPortal,\n DrawerTitle,\n};\n","export type DateDisplayValue = Date | number | string;\n\nexport interface DateDisplayLabels {\n readonly today: string;\n readonly yesterday: string;\n readonly daysAgo: (dayCount: number) => string;\n}\n\nexport interface DateDisplayFormatOptions {\n readonly locale?: string;\n readonly labels?: Partial<DateDisplayLabels>;\n}\n\nconst DEFAULT_DATE_DISPLAY_LABELS: DateDisplayLabels = {\n today: 'Today',\n yesterday: 'Yesterday',\n daysAgo: (dayCount) => `${String(dayCount)} days ago`,\n};\n\nfunction getDate(value: DateDisplayValue): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction getDayDifference(from: Date, to: Date): number {\n const millisecondsPerDay = 24 * 60 * 60 * 1000;\n return Math.round((startOfDay(to).getTime() - startOfDay(from).getTime()) / millisecondsPerDay);\n}\n\nfunction capitalizeMonthLabel(value: string): string {\n return value\n .split(' ')\n .map((part, index) => {\n if (index !== 1 || part.length === 0) {\n return part;\n }\n\n const [firstCharacter = '', ...restCharacters] = part;\n return `${firstCharacter.toUpperCase()}${restCharacters.join('')}`;\n })\n .join(' ');\n}\n\nexport function formatAbsoluteDate(\n value: DateDisplayValue,\n options: DateDisplayFormatOptions = {},\n): string {\n const date = getDate(value);\n const currentYear = new Date().getFullYear();\n const includesYear = date.getFullYear() !== currentYear;\n const locale = options.locale ?? 'en-US';\n\n return capitalizeMonthLabel(\n new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n ...(includesYear ? { year: 'numeric' } : {}),\n }).format(date)\n );\n}\n\nexport function formatDisplayDate(\n value: DateDisplayValue,\n options: DateDisplayFormatOptions = {},\n): string {\n const date = getDate(value);\n const dayDifference = getDayDifference(date, new Date());\n const labels = {\n ...DEFAULT_DATE_DISPLAY_LABELS,\n ...options.labels,\n };\n\n if (dayDifference === 0) {\n return labels.today;\n }\n\n if (dayDifference === 1) {\n return labels.yesterday;\n }\n\n if (dayDifference >= 2 && dayDifference <= 10) {\n return labels.daysAgo(dayDifference);\n }\n\n return formatAbsoluteDate(date, options);\n}\n","import {\n formatAbsoluteDate,\n formatDisplayDate,\n type DateDisplayValue,\n type DateDisplayFormatOptions,\n} from \"../utils/date-display\";\n\nexport interface DisplayDateProps {\n readonly value: DateDisplayValue;\n readonly formatOptions?: DateDisplayFormatOptions;\n readonly className?: string;\n}\n\nexport function DisplayDate({ value, formatOptions, className }: DisplayDateProps): React.ReactElement {\n const date = value instanceof Date ? value : new Date(value);\n\n return (\n <time dateTime={date.toISOString()} title={formatAbsoluteDate(date, formatOptions)} className={className}>\n {formatDisplayDate(date, formatOptions)}\n </time>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nexport interface FieldDetailRowProps {\n readonly icon: LucideIcon;\n readonly label: string;\n readonly value: ReactNode;\n readonly labelColumnClassName?: string;\n}\n\nexport function FieldDetailRow({\n icon: Icon,\n label,\n value,\n labelColumnClassName = \"grid-cols-[110px_minmax(0,1fr)]\",\n}: FieldDetailRowProps): React.ReactElement {\n return (\n <div className={`grid ${labelColumnClassName} items-start gap-2 py-1.5`}>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"text-[12px]\">{label}</span>\n </div>\n <div className=\"min-w-0 text-[14px] leading-5 tracking-[-0.28px] text-foreground\">\n {value}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Check, FileText, Upload, X } from 'lucide-react';\nimport { useRef, useState } from 'react';\n\nimport { Button } from './button';\nimport { cn } from '../utils/cn';\n\ninterface FileDropzoneProps {\n readonly accept?: string;\n readonly browseLabel?: string;\n readonly browseButtonClassName?: string;\n readonly className?: string;\n readonly currentPreviewUrl?: string | null;\n readonly disabled?: boolean;\n readonly emptyIcon?: React.ReactNode;\n readonly helperText?: string;\n readonly footerText?: string | null;\n readonly inputClassName?: string;\n readonly multiple?: boolean;\n readonly onFileSelect: (file: File) => void;\n readonly onFilesSelect?: (files: File[]) => void;\n readonly onRemove?: () => void;\n readonly previewAlt: string;\n readonly title?: string;\n}\n\nfunction formatFileSize(size: number): string {\n if (size < 1024) {\n return `${size} B`;\n }\n\n if (size < 1024 * 1024) {\n return `${Math.round(size / 1024)} KB`;\n }\n\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getFileTypeLabel(file: File): string {\n return file.type || file.name.split('.').pop()?.toUpperCase() || 'File';\n}\n\nexport function FileDropzone({\n accept,\n browseLabel = 'Browse',\n browseButtonClassName,\n className,\n currentPreviewUrl = null,\n disabled = false,\n emptyIcon,\n helperText,\n footerText = 'Drag a file here or click the box to select one.',\n inputClassName,\n multiple = false,\n onFileSelect,\n onFilesSelect,\n onRemove,\n previewAlt,\n title = 'Drop a file here or browse',\n}: FileDropzoneProps): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const hasSelectedFiles = selectedFiles.length > 0;\n\n const openFilePicker = (): void => {\n if (disabled) {\n return;\n }\n\n inputRef.current?.click();\n };\n\n const handleFileSelection = (files: FileList | File[] | null | undefined): void => {\n const selectedFiles = Array.from(files ?? []);\n if (selectedFiles.length === 0 || disabled) {\n return;\n }\n\n setSelectedFiles(selectedFiles);\n\n if (multiple && onFilesSelect) {\n onFilesSelect(selectedFiles);\n return;\n }\n\n const firstFile = selectedFiles[0];\n if (firstFile) {\n onFileSelect(firstFile);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n handleFileSelection(event.target.files);\n event.target.value = '';\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n handleFileSelection(event.dataTransfer.files);\n };\n\n const handleRemove = (event: React.MouseEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n setSelectedFiles([]);\n onRemove?.();\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={handleInputChange}\n disabled={disabled}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={openFilePicker}\n onKeyDown={(event): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openFilePicker();\n }\n }}\n onDragEnter={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragOver={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragLeave={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n 'bg-muted/30 relative flex w-full cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed px-6 py-5 text-center transition-colors outline-none',\n 'border-primary/60 hover:bg-muted/50 focus-visible:ring-primary/20 focus-visible:ring-2',\n isDragging && 'bg-muted/60',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n >\n {currentPreviewUrl ? (\n <div className=\"bg-background relative flex min-h-40 w-full items-center justify-center overflow-hidden rounded-md\">\n <img src={currentPreviewUrl} alt={previewAlt} className=\"size-full object-contain\" />\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"icon-xs\"\n className=\"absolute top-2 right-2 z-10\"\n onClick={handleRemove}\n disabled={disabled}\n >\n <X className=\"size-3.5\" />\n </Button>\n ) : null}\n {hasSelectedFiles ? (\n <div className=\"bg-background/95 absolute right-2 bottom-2 left-2 rounded-md border px-3 py-2 text-left shadow-sm backdrop-blur\">\n <p className=\"truncate text-sm font-medium\">{selectedFiles[0]?.name}</p>\n {selectedFiles[0] ? (\n <p className=\"text-muted-foreground text-xs\">\n {getFileTypeLabel(selectedFiles[0])} | {formatFileSize(selectedFiles[0].size)}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : (\n <>\n <div className=\"text-primary mb-2 flex items-center justify-center\">\n {emptyIcon ?? <Upload className=\"size-5\" />}\n </div>\n <div className=\"space-y-0.5\">\n <p className=\"text-foreground text-base font-medium\">{title}</p>\n {helperText ? <p className=\"text-muted-foreground text-sm\">{helperText}</p> : null}\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n className={cn('mt-4 shadow-[0px_1px_1px_rgba(5,32,81,0.05)]', browseButtonClassName)}\n onClick={(event): void => {\n event.stopPropagation();\n openFilePicker();\n }}\n disabled={disabled}\n >\n {browseLabel}\n </Button>\n {hasSelectedFiles ? (\n <div className=\"mt-4 w-full space-y-2\">\n {selectedFiles.map((file) => (\n <div\n key={`${file.name}-${file.size}-${file.lastModified}`}\n className=\"bg-background flex min-w-0 items-center gap-3 rounded-md border px-3 py-2 text-left\"\n >\n <FileText className=\"text-muted-foreground size-4 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{file.name}</p>\n <p className=\"text-muted-foreground text-xs\">\n {getFileTypeLabel(file)} | {formatFileSize(file.size)}\n </p>\n </div>\n <Check className=\"text-primary size-4 shrink-0\" />\n </div>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n {footerText ? (\n <p className={cn('text-muted-foreground mt-2 text-xs', inputClassName)}>{footerText}</p>\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport { Command } from 'lucide-react';\n\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../utils/cn';\n\nexport function KeyboardKeycap({\n children,\n className,\n}: {\n readonly children: ReactNode;\n readonly className?: string;\n}): React.ReactElement {\n return (\n <span\n className={cn(\n 'inline-flex h-4 min-w-4 items-center justify-center rounded-[4px] border px-1 text-[9px] font-semibold leading-none',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport function ShortcutModifierKeycap({\n modifierLabel,\n className,\n}: {\n readonly modifierLabel: string;\n readonly className?: string;\n}): React.ReactElement {\n return (\n <KeyboardKeycap className={className}>\n {modifierLabel === 'Cmd' ? <Command className=\"size-[10px]\" /> : 'Ctrl'}\n </KeyboardKeycap>\n );\n}\n","'use client';\n\nimport { CornerDownLeft } from 'lucide-react';\n\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\nimport { KeyboardKeycap, ShortcutModifierKeycap } from '../primitives/keyboard-shortcut-hint';\n\nexport function DesktopConfirmShortcutHint({\n desktopModifierLabel,\n}: {\n readonly desktopModifierLabel: string;\n}): React.ReactElement {\n const keycapClassName = 'border-primary-foreground/20 bg-primary-foreground/10';\n\n return (\n <span className=\"text-primary-foreground/70 inline-flex items-center gap-1\">\n <ShortcutModifierKeycap modifierLabel={desktopModifierLabel} className={keycapClassName} />\n <KeyboardKeycap className={keycapClassName}>\n <CornerDownLeft className=\"size-[10px]\" />\n </KeyboardKeycap>\n </span>\n );\n}\n\ninterface SheetActionFooterProps {\n readonly footer?: ReactNode;\n readonly onCancel?: () => void;\n readonly cancelLabel: ReactNode;\n readonly onConfirm?: () => void;\n readonly confirmLabel: ReactNode;\n readonly confirmDisabled: boolean;\n readonly confirmLoading: boolean;\n readonly desktopConfirmShortcutEnabled?: boolean;\n readonly desktopModifierLabel?: string | null;\n}\n\nexport function SheetActionFooter({\n footer,\n onCancel,\n cancelLabel,\n onConfirm,\n confirmLabel,\n confirmDisabled,\n confirmLoading,\n desktopConfirmShortcutEnabled = false,\n desktopModifierLabel = null,\n}: SheetActionFooterProps): React.ReactNode {\n if (footer) return footer;\n\n if (!onCancel && !onConfirm) return null;\n\n const actionCount = Number(Boolean(onCancel)) + Number(Boolean(onConfirm));\n const footerButtonClassName = actionCount === 1 ? 'w-full' : 'min-w-0 flex-1';\n\n return (\n <div className=\"flex w-full flex-nowrap items-center gap-2\">\n {onCancel ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n className={footerButtonClassName}\n >\n {cancelLabel}\n </Button>\n ) : null}\n {onConfirm ? (\n <Button\n type=\"button\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n className={`${footerButtonClassName} relative`}\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <span>{confirmLoading ? 'Saving...' : confirmLabel}</span>\n {desktopConfirmShortcutEnabled && desktopModifierLabel ? (\n <span className=\"absolute top-1/2 right-2 -translate-y-1/2\">\n <DesktopConfirmShortcutHint desktopModifierLabel={desktopModifierLabel} />\n </span>\n ) : null}\n </span>\n </Button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\nimport { Button } from './button';\nimport { cn } from '../utils/cn';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 fixed inset-0 z-50 bg-black/10 backdrop-blur-xs duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n 'bg-background data-open:animate-in data-closed:animate-out data-[side=right]:data-closed:slide-out-to-right-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=top]:data-closed:slide-out-to-top-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=bottom]:data-open:slide-in-from-bottom-10 fixed z-50 flex flex-col gap-4 overflow-visible bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:rounded-r-xl data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:rounded-l-xl data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\">\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n ) : null}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-0.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground text-base font-medium', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle };\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport type { SheetOutsideInteractionGuard } from './responsive-sheet';\nimport type { ResponsiveSheetClassNames } from './responsive-sheet';\n\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '../primitives/drawer';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '../primitives/sheet';\nimport { cn } from '../utils/cn';\n\ninterface SheetDescriptionBlockProps {\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nfunction SheetDescriptionBlock({\n title,\n description,\n classes,\n}: SheetDescriptionBlockProps): React.ReactElement {\n return (\n <>\n <SheetTitle className={classes?.title}>{title}</SheetTitle>\n {description ? (\n <SheetDescription className={classes?.description}>{description}</SheetDescription>\n ) : null}\n </>\n );\n}\n\ninterface SharedSheetLayoutProps {\n readonly open: boolean;\n readonly onOpenChange: (open: boolean) => void;\n readonly modal: boolean;\n readonly outsideInteractionGuard?: SheetOutsideInteractionGuard;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly footer: ReactNode;\n readonly mobileDrawerContentClassName?: string;\n readonly contentClassName?: string;\n readonly footerClassName?: string;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nfunction shouldPreventOutsideInteraction(\n target: EventTarget | null,\n guard?: SheetOutsideInteractionGuard,\n): boolean {\n const element =\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n\n if (!element) {\n return false;\n }\n\n if (element.closest('[data-searchable-select-content]')) {\n return true;\n }\n\n return guard?.selectors.some((selector) => element.closest(selector)) ?? false;\n}\n\ntype MobileSheetLayoutProps = SharedSheetLayoutProps;\n\nexport function MobileSheetLayout({\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n children,\n footer,\n mobileDrawerContentClassName,\n contentClassName,\n footerClassName,\n classes,\n}: MobileSheetLayoutProps): React.ReactElement {\n return (\n <Drawer open={open} onOpenChange={onOpenChange} modal={modal}>\n <DrawerContent\n aria-describedby={description ? undefined : 'responsive-sheet-description-empty'}\n className={cn(\n 'px-4 pb-[calc(env(safe-area-inset-bottom)+20px)]',\n mobileDrawerContentClassName,\n classes?.mobileContent,\n )}\n onInteractOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n onPointerDownOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n >\n <DrawerHeader className={cn('px-0 pb-4', classes?.header)}>\n <DrawerTitle className={classes?.title}>{title}</DrawerTitle>\n {description ? (\n <DrawerDescription className={classes?.description}>{description}</DrawerDescription>\n ) : (\n <DrawerDescription id=\"responsive-sheet-description-empty\" className=\"sr-only\">\n Dialog\n </DrawerDescription>\n )}\n </DrawerHeader>\n <div className=\"flex min-h-0 flex-1 flex-col gap-4\">\n <div\n className={cn(\n '-mx-1 flex-1 overflow-y-auto px-1 pb-3 [scrollbar-gutter:stable]',\n contentClassName,\n classes?.body,\n )}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn('shrink-0 border-t pt-4 pb-3', footerClassName, classes?.footer)}>\n {footer}\n </div>\n ) : null}\n </div>\n </DrawerContent>\n </Drawer>\n );\n}\n\ninterface DesktopSheetLayoutProps extends SharedSheetLayoutProps {\n readonly width: number;\n}\n\nexport function DesktopSheetLayout({\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n children,\n footer,\n width,\n contentClassName,\n footerClassName,\n classes,\n}: DesktopSheetLayoutProps): React.ReactElement {\n return (\n <Sheet open={open} onOpenChange={onOpenChange} modal={modal}>\n <SheetContent\n aria-describedby={description ? undefined : 'responsive-sheet-description-empty'}\n style={{ width: `${String(width)}px`, maxWidth: '85vw' }}\n className={cn('flex flex-col gap-0 p-0', classes?.desktopContent)}\n onInteractOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n onPointerDownOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n >\n <SheetHeader className={cn('border-b px-4 py-4', classes?.header)}>\n <SheetDescriptionBlock title={title} description={description} classes={classes} />\n </SheetHeader>\n {description ? null : (\n <SheetDescription id=\"responsive-sheet-description-empty\" className=\"sr-only\">\n Dialog\n </SheetDescription>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div\n className={cn(\n 'flex-1 overflow-x-visible overflow-y-auto px-4 pt-4 pb-6 [scrollbar-gutter:stable]',\n contentClassName,\n classes?.body,\n )}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn('border-t px-4 py-4', footerClassName, classes?.footer)}>\n {footer}\n </div>\n ) : null}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useEffect, useState } from \"react\";\n\ninterface NavigatorWithUserAgentData extends Navigator {\n readonly userAgentData?: {\n readonly platform?: string;\n };\n}\n\nexport function getDesktopShortcutModifierLabel(): string {\n if (typeof navigator === \"undefined\") {\n return \"Ctrl\";\n }\n\n const navigatorWithUserAgentData = navigator as NavigatorWithUserAgentData;\n const platform =\n navigatorWithUserAgentData.userAgentData?.platform ?? navigator.userAgent;\n\n return /Mac|iPhone|iPad|iPod/i.test(platform) ? \"Cmd\" : \"Ctrl\";\n}\n\nexport function isAllowedConfirmShortcutEvent(\n event: KeyboardEvent,\n desktopModifierLabel: string,\n): boolean {\n if (event.key !== \"Enter\" || event.repeat || event.isComposing) {\n return false;\n }\n\n const expectsMetaKey = desktopModifierLabel === \"Cmd\";\n const usedExpectedModifier = expectsMetaKey ? event.metaKey : event.ctrlKey;\n const usedOtherModifier = expectsMetaKey ? event.ctrlKey : event.metaKey;\n const usedShiftModifier = event.shiftKey;\n const usedAltModifier = event.altKey;\n\n if (\n !usedExpectedModifier ||\n usedOtherModifier ||\n usedShiftModifier ||\n usedAltModifier\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function useDesktopShortcutModifierLabel(\n enabled: boolean,\n): string | null {\n const [desktopModifierLabel, setDesktopModifierLabel] = useState<\n string | null\n >(null);\n\n useEffect(() => {\n if (!enabled) {\n setDesktopModifierLabel(null);\n return;\n }\n\n setDesktopModifierLabel(getDesktopShortcutModifierLabel());\n }, [enabled]);\n\n return desktopModifierLabel;\n}\n\ninterface UseDesktopConfirmShortcutOptions {\n readonly open: boolean;\n readonly enabled: boolean;\n readonly confirmDisabled: boolean;\n readonly confirmLoading: boolean;\n readonly onConfirm?: () => void;\n}\n\nexport function useDesktopConfirmShortcut({\n open,\n enabled,\n confirmDisabled,\n confirmLoading,\n onConfirm,\n}: UseDesktopConfirmShortcutOptions): void {\n useEffect(() => {\n if (!open || !enabled || !onConfirm || confirmDisabled || confirmLoading) {\n return;\n }\n\n const desktopModifierLabel = getDesktopShortcutModifierLabel();\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (!isAllowedConfirmShortcutEvent(event, desktopModifierLabel)) {\n return;\n }\n\n event.preventDefault();\n onConfirm();\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [confirmDisabled, confirmLoading, enabled, onConfirm, open]);\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n const [matches, setMatches] = useState(defaultValue);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(query);\n\n const handleChange = (): void => {\n setMatches(mediaQuery.matches);\n };\n\n handleChange();\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [query]);\n\n return matches;\n}\n\nexport function useIsMobile(maxWidth = 767): boolean {\n return useMediaQuery(`(max-width: ${String(maxWidth)}px)`);\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { SheetActionFooter } from './responsive-sheet.footer';\nimport { DesktopSheetLayout, MobileSheetLayout } from './responsive-sheet.layouts';\nimport {\n useDesktopConfirmShortcut,\n useDesktopShortcutModifierLabel,\n} from './responsive-sheet.shortcuts';\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport interface SheetOutsideInteractionGuard {\n readonly selectors: readonly string[];\n}\n\nexport interface ResponsiveSheetClassNames {\n readonly desktopContent?: string;\n readonly mobileContent?: string;\n readonly header?: string;\n readonly body?: string;\n readonly footer?: string;\n readonly title?: string;\n readonly description?: string;\n}\n\nexport interface ResponsiveSheetProps {\n readonly open: boolean;\n readonly onOpenChange: (open: boolean) => void;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly footer?: ReactNode;\n readonly onCancel?: () => void;\n readonly cancelLabel?: ReactNode;\n readonly onConfirm?: () => void;\n readonly confirmLabel?: ReactNode;\n readonly confirmDisabled?: boolean;\n readonly confirmLoading?: boolean;\n readonly width?: number;\n readonly modal?: boolean;\n readonly outsideInteractionGuard?: SheetOutsideInteractionGuard;\n readonly enableDesktopConfirmShortcut?: boolean;\n readonly mobileDrawerContentClassName?: string;\n readonly className?: string;\n readonly contentClassName?: string;\n readonly footerClassName?: string;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nexport function ResponsiveSheet({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n onCancel,\n cancelLabel = 'Cancel',\n onConfirm,\n confirmLabel = 'Save',\n confirmDisabled = false,\n confirmLoading = false,\n width = 550,\n modal = true,\n outsideInteractionGuard,\n enableDesktopConfirmShortcut = true,\n mobileDrawerContentClassName,\n className,\n contentClassName,\n footerClassName,\n classes,\n}: ResponsiveSheetProps): React.ReactElement {\n const isMobile = useIsMobile();\n const desktopConfirmShortcutEnabled =\n !isMobile && enableDesktopConfirmShortcut && Boolean(onConfirm);\n const desktopModifierLabel = useDesktopShortcutModifierLabel(desktopConfirmShortcutEnabled);\n\n useDesktopConfirmShortcut({\n open,\n enabled: desktopConfirmShortcutEnabled,\n confirmDisabled,\n confirmLoading,\n onConfirm: onConfirm\n ? () => {\n onConfirm();\n }\n : undefined,\n });\n\n const resolvedFooter = (\n <SheetActionFooter\n footer={footer}\n onCancel={onCancel}\n cancelLabel={cancelLabel}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n confirmDisabled={confirmDisabled}\n confirmLoading={confirmLoading}\n desktopConfirmShortcutEnabled={desktopConfirmShortcutEnabled}\n desktopModifierLabel={desktopModifierLabel}\n />\n );\n const hasFooter = [footer, onCancel, onConfirm].some(\n (value) => value !== null && value !== undefined,\n );\n const sharedLayoutProps = {\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n footer: hasFooter ? resolvedFooter : null,\n children,\n contentClassName,\n footerClassName,\n mobileDrawerContentClassName,\n classes: {\n ...classes,\n desktopContent: cn(className, classes?.desktopContent),\n mobileContent: cn(className, mobileDrawerContentClassName, classes?.mobileContent),\n },\n };\n\n return isMobile ? (\n <MobileSheetLayout {...sharedLayoutProps} />\n ) : (\n <DesktopSheetLayout {...sharedLayoutProps} width={width} />\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md bg-foreground px-3 py-1.5 text-xs text-background z-50 w-fit max-w-[min(20rem,calc(100vw-1.5rem))] whitespace-normal break-words origin-(--radix-tooltip-content-transform-origin)\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\";\n\nimport { CircleHelp } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\n\nimport { ResponsiveSheet } from \"../overlays/responsive-sheet\";\nimport { Button } from \"./button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\nexport interface HelpInfoButtonProps {\n readonly ariaLabel: string;\n readonly tooltip: ReactNode;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly width?: number;\n}\n\nexport function HelpInfoButton({\n ariaLabel,\n tooltip,\n title,\n description,\n children,\n width = 620,\n}: HelpInfoButtonProps): React.ReactElement {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 text-muted-foreground hover:text-foreground\"\n aria-label={ariaLabel}\n onClick={() => {\n setOpen(true);\n }}\n >\n <CircleHelp className=\"size-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n <ResponsiveSheet\n open={open}\n onOpenChange={setOpen}\n title={title}\n description={description}\n cancelLabel=\"Close\"\n onCancel={() => {\n setOpen(false);\n }}\n width={width}\n >\n {children}\n </ResponsiveSheet>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-8 rounded-lg border bg-transparent px-2.5 py-1 text-base transition-colors file:h-6 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","'use client';\n\nimport * as React from 'react';\nimport { Label as LabelPrimitive } from 'radix-ui';\n\nimport { cn } from '../utils/cn';\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","'use client';\n\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\n\nimport { Button } from '../primitives/button';\nimport { cn } from '../utils/cn';\n\nexport interface PaginationProps {\n /** Current page (1-indexed) */\n currentPage: number;\n /** Total number of pages */\n totalPages: number;\n /** Total number of items */\n totalItems: number;\n /** Items per page */\n pageSize: number;\n /** Start index of current page items (1-indexed for display) */\n startIndex: number;\n /** End index of current page items */\n endIndex: number;\n /** Go to specific page */\n onPageChange: (page: number) => void;\n /** Optional: page size options */\n pageSizeOptions?: number[];\n /** Optional: callback when page size changes */\n onPageSizeChange?: (size: number) => void;\n /** Optional: custom className */\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n totalItems,\n pageSize,\n startIndex,\n endIndex,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n className,\n}: PaginationProps): React.ReactElement | null {\n if (totalPages <= 1) {\n return null;\n }\n\n const hasPrevPage = currentPage > 1;\n const hasNextPage = currentPage < totalPages;\n\n return (\n <div className={cn('flex items-center justify-between gap-3 py-3', className)}>\n {/* Items info */}\n <div className=\"text-xs text-muted-foreground\">\n {totalItems === 0 ? (\n 'No items'\n ) : (\n <>\n Showing <span className=\"font-medium\">{startIndex + 1}</span> -{' '}\n <span className=\"font-medium\">{endIndex}</span> of{' '}\n <span className=\"font-medium\">{totalItems}</span>\n </>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n {/* Page size selector */}\n {pageSizeOptions && onPageSizeChange && (\n <div className=\"hidden items-center gap-1.5 sm:flex\">\n <span className=\"text-xs text-muted-foreground\">Rows:</span>\n <select\n value={String(pageSize)}\n onChange={(event) => {\n onPageSizeChange(Number(event.target.value));\n }}\n className=\"border-input bg-background h-7 w-[64px] rounded-md border px-2 text-xs\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={String(size)}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Page info */}\n <div className=\"hidden text-xs text-muted-foreground sm:block\">\n Page {currentPage} of {totalPages}\n </div>\n\n {/* Navigation buttons */}\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(1); }}\n disabled={!hasPrevPage}\n >\n <ChevronsLeft className=\"size-3.5\" />\n <span className=\"sr-only\">First page</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(currentPage - 1); }}\n disabled={!hasPrevPage}\n >\n <ChevronLeft className=\"size-3.5\" />\n <span className=\"sr-only\">Previous page</span>\n </Button>\n\n {/* Mobile page indicator */}\n <span className=\"px-1.5 text-xs sm:hidden\">\n {currentPage}/{totalPages}\n </span>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(currentPage + 1); }}\n disabled={!hasNextPage}\n >\n <ChevronRight className=\"size-3.5\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(totalPages); }}\n disabled={!hasNextPage}\n >\n <ChevronsRight className=\"size-3.5\" />\n <span className=\"sr-only\">Last page</span>\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n}\n","'use client';\n\nimport * as React from 'react';\n\nimport type { PointerEvent } from 'react';\n\nimport { cn } from '../utils/cn';\n\ntype ScrollFadeOrientation = 'horizontal' | 'vertical';\n\ninterface ScrollFadeAreaProps extends React.ComponentProps<'div'> {\n readonly fadeSize?: number;\n readonly orientation?: ScrollFadeOrientation;\n readonly scrollbarVisibility?: 'hidden' | 'section-hover';\n readonly viewportClassName?: string;\n}\n\ninterface VerticalScrollbarState {\n readonly isScrollable: boolean;\n readonly thumbHeight: number;\n readonly thumbTop: number;\n}\n\nconst MIN_THUMB_SIZE = 40;\nconst SCROLLBAR_INSET = 6;\n\nfunction getScrollFadeMask({\n canScrollEnd,\n canScrollStart,\n orientation,\n}: {\n readonly canScrollEnd: boolean;\n readonly canScrollStart: boolean;\n readonly orientation: ScrollFadeOrientation;\n}): string {\n const direction = orientation === 'horizontal' ? 'right' : 'bottom';\n\n if (canScrollStart && canScrollEnd) {\n return `linear-gradient(to ${direction}, transparent, black var(--scroll-fade-size), black calc(100% - var(--scroll-fade-size)), transparent)`;\n }\n\n if (canScrollStart) {\n return `linear-gradient(to ${direction}, transparent, black var(--scroll-fade-size))`;\n }\n\n if (canScrollEnd) {\n return `linear-gradient(to ${direction}, black calc(100% - var(--scroll-fade-size)), transparent)`;\n }\n\n return 'none';\n}\n\nfunction getScrollState(\n scrollArea: HTMLDivElement,\n orientation: ScrollFadeOrientation,\n): {\n canScrollEnd: boolean;\n canScrollStart: boolean;\n} {\n if (orientation === 'horizontal') {\n return {\n canScrollStart: scrollArea.scrollLeft > 1,\n canScrollEnd: scrollArea.scrollLeft + scrollArea.clientWidth < scrollArea.scrollWidth - 1,\n };\n }\n\n return {\n canScrollStart: scrollArea.scrollTop > 1,\n canScrollEnd: scrollArea.scrollTop + scrollArea.clientHeight < scrollArea.scrollHeight - 1,\n };\n}\n\nfunction getVerticalScrollbarState(scrollArea: HTMLDivElement): VerticalScrollbarState {\n const trackHeight = scrollArea.clientHeight - SCROLLBAR_INSET * 2;\n const maxScrollTop = scrollArea.scrollHeight - scrollArea.clientHeight;\n\n if (maxScrollTop <= 0 || trackHeight <= 0) {\n return {\n isScrollable: false,\n thumbHeight: 0,\n thumbTop: 0,\n };\n }\n\n const thumbHeight = Math.max(\n (scrollArea.clientHeight / scrollArea.scrollHeight) * trackHeight,\n MIN_THUMB_SIZE,\n );\n const maxThumbTop = trackHeight - thumbHeight;\n const scrollProgress = scrollArea.scrollTop / maxScrollTop;\n\n return {\n isScrollable: true,\n thumbHeight,\n thumbTop: maxThumbTop * scrollProgress,\n };\n}\n\nexport function ScrollFadeArea({\n children,\n className,\n fadeSize = 24,\n onPointerEnter,\n onPointerLeave,\n onScroll,\n orientation = 'vertical',\n scrollbarVisibility = 'hidden',\n style,\n viewportClassName,\n ...props\n}: ScrollFadeAreaProps): React.ReactElement {\n const scrollAreaRef = React.useRef<HTMLDivElement>(null);\n const dragOffsetRef = React.useRef(0);\n const [scrollState, setScrollState] = React.useState({\n canScrollStart: false,\n canScrollEnd: false,\n });\n const [verticalScrollbarState, setVerticalScrollbarState] =\n React.useState<VerticalScrollbarState>({\n isScrollable: false,\n thumbHeight: 0,\n thumbTop: 0,\n });\n const [isSectionActive, setIsSectionActive] = React.useState(false);\n const [isDraggingScrollbar, setIsDraggingScrollbar] = React.useState(false);\n const shouldRenderSectionScrollbar =\n orientation === 'vertical' && scrollbarVisibility === 'section-hover';\n const isSectionScrollbarVisible = isSectionActive || isDraggingScrollbar;\n\n const updateScrollState = React.useCallback(() => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n const nextScrollState = getScrollState(scrollArea, orientation);\n\n setScrollState((currentScrollState) => {\n if (\n currentScrollState.canScrollStart === nextScrollState.canScrollStart &&\n currentScrollState.canScrollEnd === nextScrollState.canScrollEnd\n ) {\n return currentScrollState;\n }\n\n return nextScrollState;\n });\n\n if (shouldRenderSectionScrollbar) {\n setVerticalScrollbarState(getVerticalScrollbarState(scrollArea));\n }\n }, [orientation, shouldRenderSectionScrollbar]);\n\n const scrollToThumbPosition = React.useCallback(\n (thumbTop: number): void => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n const trackHeight = scrollArea.clientHeight - SCROLLBAR_INSET * 2;\n const maxThumbTop = trackHeight - verticalScrollbarState.thumbHeight;\n const maxScrollTop = scrollArea.scrollHeight - scrollArea.clientHeight;\n const clampedThumbTop = Math.min(Math.max(thumbTop, 0), maxThumbTop);\n const scrollProgress = maxThumbTop > 0 ? clampedThumbTop / maxThumbTop : 0;\n\n scrollArea.scrollTop = maxScrollTop * scrollProgress;\n updateScrollState();\n },\n [updateScrollState, verticalScrollbarState.thumbHeight],\n );\n\n function handleTrackPointerDown(event: PointerEvent<HTMLDivElement>): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n\n scrollToThumbPosition(event.nativeEvent.offsetY - verticalScrollbarState.thumbHeight / 2);\n }\n\n function handleThumbPointerDown(event: PointerEvent<HTMLDivElement>): void {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n setIsDraggingScrollbar(true);\n dragOffsetRef.current = event.clientY - SCROLLBAR_INSET - verticalScrollbarState.thumbTop;\n }\n\n function handleThumbPointerMove(event: PointerEvent<HTMLDivElement>): void {\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) {\n return;\n }\n\n scrollToThumbPosition(event.clientY - SCROLLBAR_INSET - dragOffsetRef.current);\n }\n\n function handleThumbPointerUp(event: PointerEvent<HTMLDivElement>): void {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n\n setIsDraggingScrollbar(false);\n }\n\n React.useEffect(() => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n updateScrollState();\n\n const resizeObserver = new ResizeObserver(updateScrollState);\n resizeObserver.observe(scrollArea);\n\n if (scrollArea.firstElementChild) {\n resizeObserver.observe(scrollArea.firstElementChild);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [children, updateScrollState]);\n\n const maskImage = getScrollFadeMask({\n canScrollEnd: scrollState.canScrollEnd,\n canScrollStart: scrollState.canScrollStart,\n orientation,\n });\n const maskStyle = {\n '--scroll-fade-size': `${String(fadeSize)}px`,\n WebkitMaskImage: maskImage,\n maskImage,\n } satisfies React.CSSProperties & Record<'--scroll-fade-size', string>;\n\n return (\n <div\n className={cn('group/scroll-fade relative min-h-0 min-w-0', className)}\n style={style}\n onPointerEnter={(event) => {\n setIsSectionActive(true);\n onPointerEnter?.(event);\n }}\n onPointerLeave={(event) => {\n setIsSectionActive(false);\n onPointerLeave?.(event);\n }}\n {...props}\n >\n <div\n ref={scrollAreaRef}\n className={cn(\n 'min-h-0 min-w-0',\n orientation === 'horizontal' ? 'overflow-x-auto' : 'h-full overflow-y-auto',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n viewportClassName,\n )}\n style={maskStyle}\n onScroll={(event) => {\n updateScrollState();\n onScroll?.(event);\n }}\n >\n {children}\n </div>\n {shouldRenderSectionScrollbar && verticalScrollbarState.isScrollable ? (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'absolute top-1.5 right-0 bottom-1.5 z-10 w-3 transition-opacity duration-150',\n isSectionScrollbarVisible\n ? 'pointer-events-auto opacity-100'\n : 'pointer-events-none opacity-0',\n )}\n data-section-scrollbar=\"true\"\n onPointerDown={handleTrackPointerDown}\n >\n <div\n className=\"absolute right-1 w-1.5 rounded-full bg-black/15 transition-colors hover:bg-black/25\"\n onPointerDown={handleThumbPointerDown}\n onPointerMove={handleThumbPointerMove}\n onPointerUp={handleThumbPointerUp}\n onPointerCancel={handleThumbPointerUp}\n style={{\n height: `${String(verticalScrollbarState.thumbHeight)}px`,\n transform: `translateY(${String(verticalScrollbarState.thumbTop)}px)`,\n }}\n />\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tabs as TabsPrimitive } from 'radix-ui';\n\nimport { ScrollFadeArea } from './scroll-fade-area';\nimport { cn } from '../utils/cn';\n\nfunction Tabs({\n className,\n orientation = 'horizontal',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn('group/tabs flex gap-2 data-horizontal:flex-col', className)}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n 'gap-2 rounded-lg p-[3px] group-data-horizontal/tabs:h-8 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col',\n {\n variants: {\n variant: {\n default: 'bg-muted',\n line: 'gap-2 bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction TabsScrollArea({\n className,\n viewportClassName,\n ...props\n}: React.ComponentProps<typeof ScrollFadeArea>) {\n return (\n <ScrollFadeArea\n {...props}\n data-slot=\"tabs-scroll-area\"\n orientation=\"horizontal\"\n className={cn('w-full min-w-0', className)}\n viewportClassName={cn('min-w-0', viewportClassName)}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent',\n 'data-active:bg-background dark:data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 data-active:text-foreground',\n 'after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn('flex-1 text-sm outline-none', className)}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsScrollArea, TabsTrigger, TabsContent, tabsListVariants };\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { Tabs, TabsList, TabsScrollArea, TabsTrigger } from './tabs';\nimport { cn } from '../utils/cn';\n\nexport interface SegmentedToggleOption<TValue extends string> {\n readonly value: TValue;\n readonly label: string;\n readonly icon?: ReactNode;\n}\n\nexport interface SegmentedToggleProps<TValue extends string> {\n readonly value: TValue;\n readonly onChange: (value: TValue) => void;\n readonly options: readonly SegmentedToggleOption<TValue>[];\n readonly disabled?: boolean;\n readonly className?: string;\n readonly variant?: 'default' | 'primary';\n readonly scrollable?: boolean;\n}\n\nexport function SegmentedToggle<TValue extends string>({\n value,\n onChange,\n options,\n disabled = false,\n className,\n variant = 'default',\n scrollable = false,\n}: SegmentedToggleProps<TValue>): React.ReactElement {\n const isPrimaryVariant = variant === 'primary';\n\n return (\n <Tabs\n value={value}\n onValueChange={(nextValue) => {\n if (nextValue) {\n onChange(nextValue as TValue);\n }\n }}\n className={cn('w-full', disabled && 'opacity-50', className)}\n >\n {scrollable ? (\n <TabsScrollArea>\n <TabsList\n className={cn(\n 'w-full min-w-max',\n isPrimaryVariant &&\n 'border-border bg-background h-8 gap-0.5 rounded-lg border p-0.5 shadow-none',\n )}\n >\n {options.map((option) => (\n <TabsTrigger\n key={option.value}\n value={option.value}\n disabled={disabled}\n className={cn(\n 'shrink-0',\n isPrimaryVariant && [\n 'text-foreground h-full gap-1.5 rounded-md px-2 py-0 text-[13px] leading-5 font-medium tracking-[-0.28px] shadow-none',\n 'hover:text-foreground',\n 'data-active:border-border data-active:bg-accent data-active:text-accent-foreground data-active:shadow-none',\n '[&_svg:not([class*=size-])]:size-4',\n ],\n )}\n >\n {option.icon}\n {option.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </TabsScrollArea>\n ) : (\n <TabsList\n className={cn(\n 'w-full',\n isPrimaryVariant &&\n 'border-border bg-background h-8 gap-0.5 rounded-lg border p-0.5 shadow-none',\n )}\n >\n {options.map((option) => (\n <TabsTrigger\n key={option.value}\n value={option.value}\n disabled={disabled}\n className={cn(\n 'flex-1',\n isPrimaryVariant && [\n 'text-foreground h-full gap-1.5 rounded-md px-2 py-0 text-[13px] leading-5 font-medium tracking-[-0.28px] shadow-none',\n 'hover:text-foreground',\n 'data-active:border-border data-active:bg-accent data-active:text-accent-foreground data-active:shadow-none',\n '[&_svg:not([class*=size-])]:size-4',\n ],\n )}\n >\n {option.icon}\n {option.label}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n </Tabs>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-lg border bg-transparent py-1 pr-2 pl-2 text-sm transition-colors select-none focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronsUpDown className=\"text-muted-foreground size-4 pointer-events-none\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-[250px] rounded-lg shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"pointer-events-none size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronUp />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronDown />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectItem,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectTrigger,\n SelectValue,\n}\n","import { cn } from \"../utils/cn\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-md animate-pulse\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background pointer-events-none block size-5 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[22px] data-[state=unchecked]:translate-x-0.5\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","'use client';\n\nimport * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Table({ className, ...props }: React.ComponentProps<'table'>) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full min-w-0 overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn('w-full min-w-0 caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return <thead data-slot=\"table-header\" className={cn('[&_tr]:border-b', className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<'th'>) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n 'text-foreground h-10 overflow-hidden px-2 text-left align-middle font-medium text-ellipsis whitespace-nowrap [&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'overflow-hidden p-2 align-middle text-ellipsis whitespace-nowrap [&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 min-h-24 rounded-lg border bg-transparent px-3 py-2 text-base transition-colors placeholder:text-muted-foreground w-full min-w-0 resize-y outline-none focus-visible:ring-3 aria-invalid:ring-3 md:text-sm disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","export interface UserPickerOption {\n readonly value: string;\n readonly label?: string | null;\n readonly email?: string | null;\n readonly imageUrl?: string | null;\n readonly archived?: boolean;\n readonly searchText?: string;\n}\n\nexport interface UserPickerCopy {\n readonly fallbackName?: string;\n readonly singlePlaceholder?: string;\n readonly multiplePlaceholder?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly selectedSingleLabel?: string;\n readonly selectedPluralLabel?: string;\n readonly formatSelectedCount?: (count: number) => string;\n}\n\nexport function formatUserDisplayName(\n user: UserPickerOption,\n fallbackName = 'User',\n): string {\n const label = user.label?.trim();\n if (label) {\n return label;\n }\n\n const email = user.email?.trim();\n if (email) {\n return email;\n }\n\n return fallbackName;\n}\n\nexport function formatSelectedUserSummary(\n selectedUsers: readonly UserPickerOption[],\n copy: UserPickerCopy = {},\n): string {\n const selectedNames = selectedUsers\n .slice(0, 2)\n .map((user) => formatUserDisplayName(user, copy.fallbackName));\n const remainingCount = selectedUsers.length - selectedNames.length;\n\n if (remainingCount <= 0) {\n return selectedNames.join(', ');\n }\n\n const remainingLabel =\n remainingCount === 1\n ? copy.selectedSingleLabel ?? 'person'\n : copy.selectedPluralLabel ?? 'people';\n\n return `${selectedNames.join(', ')} +${String(remainingCount)} ${remainingLabel}`;\n}\n\nexport function buildUserInitials(user: UserPickerOption, fallbackName?: string): string {\n const displayName = formatUserDisplayName(user, fallbackName);\n const nameParts = displayName\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2);\n\n if (nameParts.length > 1) {\n return nameParts.map((part) => part[0]?.toUpperCase()).join('');\n }\n\n return displayName[0]?.toUpperCase() ?? 'U';\n}\n\nexport function filterSelectableUsers(\n users: readonly UserPickerOption[],\n selectedValues: readonly string[],\n): UserPickerOption[] {\n const selectedValueSet = new Set(selectedValues);\n\n return users.filter((user) => !user.archived || selectedValueSet.has(user.value));\n}\n\nexport function filterUsersBySearch(\n users: readonly UserPickerOption[],\n search: string,\n fallbackName?: string,\n): UserPickerOption[] {\n const normalizedSearch = search.trim().toLowerCase();\n\n if (!normalizedSearch) {\n return [...users];\n }\n\n return users.filter((user) => {\n const searchableText = [\n formatUserDisplayName(user, fallbackName),\n user.email,\n user.searchText,\n ].filter(Boolean).join(' ').toLowerCase();\n\n return searchableText.includes(normalizedSearch);\n });\n}\n\nexport function toggleUserSelection(\n selectedValues: readonly string[],\n toggledValue: string,\n): string[] {\n if (selectedValues.includes(toggledValue)) {\n return selectedValues.filter((value) => value !== toggledValue);\n }\n\n return [...selectedValues, toggledValue];\n}\n","'use client';\n\nimport { Check, ChevronDown, Search } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport {\n buildUserInitials,\n filterUsersBySearch,\n filterSelectableUsers,\n formatUserDisplayName,\n formatSelectedUserSummary,\n toggleUserSelection,\n type UserPickerCopy,\n type UserPickerOption,\n} from './user-picker-utils';\n\nimport { Avatar, AvatarFallback, AvatarImage } from './avatar';\nimport { Button } from './button';\nimport { Input } from './input';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { cn } from '../utils/cn';\n\ninterface BaseUserPickerProps {\n readonly options: readonly UserPickerOption[];\n readonly placeholder?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly disabled?: boolean;\n readonly className?: string;\n readonly triggerClassName?: string;\n readonly copy?: UserPickerCopy;\n}\n\ninterface SingleUserPickerProps extends BaseUserPickerProps {\n readonly mode: 'single';\n readonly value?: string;\n readonly onValueChange: (value: string | undefined) => void;\n}\n\ninterface MultipleUserPickerProps extends BaseUserPickerProps {\n readonly mode: 'multiple';\n readonly value: readonly string[];\n readonly onValueChange: (value: string[]) => void;\n}\n\nexport type UserPickerProps = SingleUserPickerProps | MultipleUserPickerProps;\n\nfunction UserAvatar({ user, className, fallbackName }: {\n readonly user: UserPickerOption;\n readonly className?: string;\n readonly fallbackName?: string;\n}): React.ReactElement {\n return (\n <Avatar size=\"sm\" className={className}>\n {user.imageUrl ? <AvatarImage src={user.imageUrl} alt={formatUserDisplayName(user, fallbackName)} /> : null}\n <AvatarFallback>{buildUserInitials(user, fallbackName)}</AvatarFallback>\n </Avatar>\n );\n}\n\nfunction UserRow({\n user,\n fallbackName,\n}: {\n readonly user: UserPickerOption;\n readonly fallbackName?: string;\n}): React.ReactElement {\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <UserAvatar user={user} fallbackName={fallbackName} />\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium\">{formatUserDisplayName(user, fallbackName)}</span>\n {user.email ? (\n <span className=\"block truncate text-xs text-muted-foreground\">{user.email}</span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction MultipleUserValue({ selectedUsers, placeholder, copy }: {\n readonly selectedUsers: readonly UserPickerOption[];\n readonly placeholder: string;\n readonly copy: UserPickerCopy;\n}): React.ReactElement {\n if (selectedUsers.length === 0) {\n return <span className=\"text-muted-foreground\">{placeholder}</span>;\n }\n\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"flex -space-x-2\">\n {selectedUsers.slice(0, 3).map((user) => (\n <UserAvatar\n key={user.value}\n user={user}\n className=\"ring-2 ring-background\"\n fallbackName={copy.fallbackName}\n />\n ))}\n </span>\n <span className=\"truncate\">\n {copy.formatSelectedCount\n ? copy.formatSelectedCount(selectedUsers.length)\n : formatSelectedUserSummary(selectedUsers, copy)}\n </span>\n </span>\n );\n}\n\nexport function UserPicker(props: UserPickerProps): React.ReactElement {\n const {\n options,\n copy = {},\n placeholder = props.mode === 'single'\n ? copy.singlePlaceholder ?? 'Select person'\n : copy.multiplePlaceholder ?? 'Select people',\n searchPlaceholder = copy.searchPlaceholder ?? 'Search people...',\n emptyMessage = copy.emptyMessage ?? 'No people available',\n disabled = false,\n className,\n triggerClassName,\n } = props;\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const singleValue = props.mode === 'single' ? props.value : undefined;\n const multipleValue = props.mode === 'multiple' ? props.value : undefined;\n const selectedValues = useMemo(\n () => (props.mode === 'single' ? (singleValue ? [singleValue] : []) : [...(multipleValue ?? [])]),\n [multipleValue, props.mode, singleValue],\n );\n const selectedValueSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectableUsers = useMemo(\n () => filterSelectableUsers(options, selectedValues),\n [options, selectedValues],\n );\n const filteredUsers = useMemo(\n () => filterUsersBySearch(selectableUsers, search, copy.fallbackName),\n [copy.fallbackName, search, selectableUsers],\n );\n const selectedUsers = selectedValues\n .map((selectedValue) => options.find((option) => option.value === selectedValue))\n .filter((user): user is UserPickerOption => Boolean(user));\n const selectedUser = selectedUsers[0];\n\n function selectUser(userValue: string): void {\n if (props.mode === 'single') {\n props.onValueChange(userValue);\n setOpen(false);\n return;\n }\n\n props.onValueChange(toggleUserSelection(props.value, userValue));\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div className={cn('relative', className)}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n 'h-9 w-full justify-between gap-2 px-2 text-left font-normal',\n selectedValues.length === 0 && 'text-muted-foreground',\n triggerClassName,\n )}\n >\n <span className=\"min-w-0 flex-1\">\n {props.mode === 'single' ? (\n selectedUser ? <UserRow user={selectedUser} fallbackName={copy.fallbackName} /> : <span>{placeholder}</span>\n ) : (\n <MultipleUserValue selectedUsers={selectedUsers} placeholder={placeholder} copy={copy} />\n )}\n </span>\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n data-searchable-select-content=\"\"\n className=\"w-[var(--radix-popover-trigger-width)] min-w-72 p-2\"\n >\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(event) => {\n setSearch(event.target.value);\n }}\n placeholder={searchPlaceholder}\n className=\"h-8 pl-8\"\n />\n </div>\n <div className=\"max-h-72 space-y-1 overflow-y-auto\">\n {filteredUsers.map((user) => {\n const selected = selectedValueSet.has(user.value);\n\n return (\n <button\n key={user.value}\n type=\"button\"\n className={cn(\n 'flex w-full items-center justify-between gap-3 rounded-md px-2 py-2 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground',\n selected && 'bg-muted/70',\n )}\n onClick={() => {\n selectUser(user.value);\n }}\n >\n <UserRow user={user} fallbackName={copy.fallbackName} />\n {selected ? <Check className=\"size-4 shrink-0\" /> : null}\n </button>\n );\n })}\n {filteredUsers.length === 0 ? (\n <p className=\"px-2 py-4 text-sm text-muted-foreground\">{emptyMessage}</p>\n ) : null}\n </div>\n </PopoverContent>\n </div>\n </Popover>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { Card, CardContent } from \"../primitives/card\";\nimport { cn } from \"../utils/cn\";\n\nexport interface EmptyStateCardProps {\n readonly icon: ReactNode;\n readonly title: string;\n readonly subtitle: string;\n readonly actionLabel?: string;\n readonly onAction?: () => void;\n readonly actionHref?: string;\n readonly actionTarget?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n readonly actionRel?: string;\n readonly actionDisabled?: boolean;\n readonly actionIcon?: ReactNode;\n readonly className?: string;\n}\n\nexport function EmptyStateCard({\n icon,\n title,\n subtitle,\n actionLabel,\n onAction,\n actionHref,\n actionTarget = \"_self\",\n actionRel,\n actionDisabled = false,\n actionIcon,\n className,\n}: EmptyStateCardProps): React.ReactElement {\n const hasLinkAction = actionLabel !== undefined && actionHref !== undefined;\n const hasButtonAction = actionLabel !== undefined && onAction !== undefined;\n const hasDisabledAction = actionLabel !== undefined && actionDisabled;\n const hasAction = hasLinkAction || hasButtonAction || hasDisabledAction;\n\n return (\n <Card className={cn(\"w-full border border-dashed border-border shadow-none ring-0\", className)}>\n <CardContent className=\"flex flex-col items-center justify-start px-6 py-10 text-center\">\n <div className=\"mb-4 flex size-14 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n {icon}\n </div>\n <div className=\"space-y-1.5\">\n <h3 className=\"text-lg font-medium tracking-tight\">{title}</h3>\n <p className=\"max-w-2xl text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n {hasAction ? (\n hasLinkAction ? (\n <Button asChild className=\"mt-5\" disabled={actionDisabled}>\n <a href={actionHref} target={actionTarget} rel={actionRel}>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </a>\n </Button>\n ) : hasDisabledAction ? (\n <Button className=\"mt-5\" disabled>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </Button>\n ) : (\n <Button className=\"mt-5\" onClick={onAction} disabled={actionDisabled}>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </Button>\n )\n ) : null}\n </CardContent>\n </Card>\n );\n}\n","import { Inbox } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { EmptyStateCard } from \"./empty-state-card\";\n\nexport interface InitialEmptyStateProps {\n readonly icon?: ReactNode;\n readonly title: string;\n readonly subtitle: string;\n readonly actionLabel?: string;\n readonly onAction?: () => void;\n readonly actionIcon?: ReactNode;\n readonly className?: string;\n}\n\nexport function InitialEmptyState({\n icon = <Inbox className=\"size-7\" />,\n title,\n subtitle,\n actionLabel,\n onAction,\n actionIcon,\n className,\n}: InitialEmptyStateProps): React.ReactElement {\n return (\n <EmptyStateCard\n icon={icon}\n title={title}\n subtitle={subtitle}\n actionLabel={actionLabel}\n onAction={onAction}\n actionIcon={actionIcon}\n className={className}\n />\n );\n}\n","import { SearchX } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { EmptyStateCard } from \"./empty-state-card\";\n\nexport interface NoResultsStateProps {\n readonly icon?: ReactNode;\n readonly title?: string;\n readonly subtitle?: string;\n readonly className?: string;\n}\n\nexport function NoResultsState({\n icon = <SearchX className=\"size-7\" />,\n title = \"No results\",\n subtitle = \"Try changing your search or filters.\",\n className,\n}: NoResultsStateProps): React.ReactElement {\n return <EmptyStateCard icon={icon} title={title} subtitle={subtitle} className={className} />;\n}\n","export type CollectionEmptyState = \"none\" | \"initial\" | \"no-results\";\n\nexport interface ResolveCollectionEmptyStateOptions {\n readonly totalCount: number;\n readonly filteredCount: number;\n readonly hasSearch?: boolean;\n readonly hasFilters?: boolean;\n}\n\nexport function resolveCollectionEmptyState({\n totalCount,\n filteredCount,\n hasSearch = false,\n hasFilters = false,\n}: ResolveCollectionEmptyStateOptions): CollectionEmptyState {\n if (filteredCount > 0) {\n return \"none\";\n }\n\n if (totalCount === 0) {\n return \"initial\";\n }\n\n if (hasSearch || hasFilters) {\n return \"no-results\";\n }\n\n return \"initial\";\n}\n","function normalizeSearchValue(value: string): string {\n return value\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeSearchValue(value)\n .split(' ')\n .filter((token) => token.length > 0);\n}\n\nfunction flattenSearchPart(\n part: SearchTextPart,\n fragments: string[],\n): void {\n if (typeof part === 'string') {\n const normalized = part.trim();\n if (normalized.length > 0) {\n fragments.push(normalized);\n }\n return;\n }\n\n if (!part) {\n return;\n }\n\n for (const nestedPart of part) {\n flattenSearchPart(nestedPart, fragments);\n }\n}\n\nfunction getMaxDistance(term: string): number {\n if (term.length <= 4) {\n return 1;\n }\n\n if (term.length <= 8) {\n return 2;\n }\n\n return 3;\n}\n\nfunction damerauLevenshtein(left: string, right: string): number {\n const rows = left.length + 1;\n const columns = right.length + 1;\n const matrix = Array.from({ length: rows }, () => Array<number>(columns).fill(0));\n\n for (let row = 0; row < rows; row += 1) {\n const matrixRow = matrix[row];\n if (!matrixRow) {\n continue;\n }\n matrixRow[0] = row;\n }\n\n for (let column = 0; column < columns; column += 1) {\n const firstRow = matrix[0];\n if (!firstRow) {\n return 0;\n }\n firstRow[column] = column;\n }\n\n for (let row = 1; row < rows; row += 1) {\n const currentRow = matrix[row];\n const previousRow = matrix[row - 1];\n if (!currentRow || !previousRow) {\n continue;\n }\n\n for (let column = 1; column < columns; column += 1) {\n const substitutionCost = left[row - 1] === right[column - 1] ? 0 : 1;\n const leftCost = currentRow[column - 1];\n const topCost = previousRow[column];\n const diagonalCost = previousRow[column - 1];\n\n if (\n leftCost === undefined ||\n topCost === undefined ||\n diagonalCost === undefined\n ) {\n continue;\n }\n\n currentRow[column] = Math.min(\n topCost + 1,\n leftCost + 1,\n diagonalCost + substitutionCost,\n );\n\n if (\n row > 1 &&\n column > 1 &&\n left[row - 1] === right[column - 2] &&\n left[row - 2] === right[column - 1]\n ) {\n const transpositionRow = matrix[row - 2];\n const transpositionCost = transpositionRow?.[column - 2];\n\n if (transpositionCost !== undefined) {\n currentRow[column] = Math.min(currentRow[column] ?? Number.POSITIVE_INFINITY, transpositionCost + 1);\n }\n }\n }\n }\n\n return matrix[left.length]?.[right.length] ?? 0;\n}\n\nfunction scoreTokenMatch(\n searchTerm: string,\n candidateToken: string,\n isLastTerm: boolean,\n): number | null {\n if (candidateToken === searchTerm) {\n return 120;\n }\n\n if (isLastTerm && candidateToken.startsWith(searchTerm)) {\n return 90 - Math.max(candidateToken.length - searchTerm.length, 0);\n }\n\n const distance = damerauLevenshtein(searchTerm, candidateToken);\n if (distance > getMaxDistance(searchTerm)) {\n return null;\n }\n\n return 70 - distance * 10 - Math.abs(candidateToken.length - searchTerm.length);\n}\n\nexport type SearchTextPart =\n | string\n | null\n | undefined\n | readonly SearchTextPart[];\n\nexport function buildSearchText(...parts: SearchTextPart[]): string {\n const fragments: string[] = [];\n\n for (const part of parts) {\n flattenSearchPart(part, fragments);\n }\n\n return fragments.join(' ').replace(/\\s+/g, ' ').trim();\n}\n\nexport function scoreFuzzyMatch(query: string, candidate: string): number | null {\n const normalizedQuery = normalizeSearchValue(query);\n if (normalizedQuery.length === 0) {\n return 0;\n }\n\n const queryTerms = tokenize(normalizedQuery);\n const candidateTerms = tokenize(candidate);\n const normalizedCandidate = normalizeSearchValue(candidate);\n\n if (queryTerms.length === 0 || candidateTerms.length === 0) {\n return null;\n }\n\n let score = normalizedCandidate.includes(normalizedQuery) ? 40 : 0;\n\n for (const [index, queryTerm] of queryTerms.entries()) {\n let bestScore: number | null = null;\n\n for (const candidateTerm of candidateTerms) {\n const tokenScore = scoreTokenMatch(\n queryTerm,\n candidateTerm,\n index === queryTerms.length - 1,\n );\n\n if (tokenScore !== null && (bestScore === null || tokenScore > bestScore)) {\n bestScore = tokenScore;\n }\n }\n\n if (bestScore === null) {\n return null;\n }\n\n score += bestScore;\n }\n\n return score;\n}\n\nexport function filterAndRankBySearch<T extends { searchText: string }>(\n items: readonly T[],\n query: string,\n): T[] {\n const normalizedQuery = normalizeSearchValue(query);\n\n if (normalizedQuery.length === 0) {\n return [...items];\n }\n\n return items\n .map((item) => ({\n item,\n score: scoreFuzzyMatch(normalizedQuery, item.searchText),\n }))\n .filter((result): result is { item: T; score: number } => result.score !== null)\n .sort((left, right) => right.score - left.score)\n .map((result) => result.item);\n}\n\nexport function rankBySearch<T>(\n items: readonly T[],\n query: string,\n getSearchText: (item: T) => string,\n): T[] {\n return filterAndRankBySearch(\n items.map((item) => ({\n item,\n searchText: getSearchText(item),\n })),\n query,\n ).map((result) => result.item);\n}\n","export interface SearchableSelectRect {\n readonly top: number;\n readonly left: number;\n readonly right: number;\n readonly bottom: number;\n readonly width: number;\n readonly height: number;\n}\n\ninterface ResolveSearchableSelectDropdownPositionArgs {\n readonly triggerRect: SearchableSelectRect;\n readonly boundaryRect?: SearchableSelectRect;\n readonly portalRect?: SearchableSelectRect;\n readonly contentWidth: number;\n readonly contentHeight: number;\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n readonly offset?: number;\n readonly padding?: number;\n}\n\ninterface SearchableSelectDropdownPosition {\n readonly top: number;\n readonly left: number;\n readonly width: number;\n readonly maxHeight: number;\n readonly direction: 'up' | 'down';\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n\n return Math.min(Math.max(value, min), max);\n}\n\nexport function resolveSearchableSelectDropdownPosition({\n triggerRect,\n boundaryRect,\n portalRect,\n contentWidth,\n contentHeight,\n viewportWidth,\n viewportHeight,\n offset = 8,\n padding = 8,\n}: ResolveSearchableSelectDropdownPositionArgs): SearchableSelectDropdownPosition {\n const boundaryLeftEdge = boundaryRect?.left ?? 0;\n const boundaryRightEdge = boundaryRect?.right ?? viewportWidth;\n const boundaryTopEdge = boundaryRect?.top ?? 0;\n const boundaryBottomEdge = boundaryRect?.bottom ?? viewportHeight;\n const boundaryLeft = Math.max(padding, boundaryLeftEdge + padding);\n const boundaryRight = Math.min(\n viewportWidth - padding,\n boundaryRightEdge - padding,\n );\n const boundaryTop = Math.max(padding, boundaryTopEdge + padding);\n const boundaryBottom = Math.min(\n viewportHeight - padding,\n boundaryBottomEdge - padding,\n );\n const availableWidth = Math.max(0, boundaryRight - boundaryLeft);\n const width = Math.min(contentWidth, availableWidth);\n const alignedRightLeft = triggerRect.right - width;\n const defaultLeft = triggerRect.left;\n const shouldAlignRight =\n defaultLeft + width > boundaryRight && alignedRightLeft >= boundaryLeft;\n const left = clamp(\n shouldAlignRight ? alignedRightLeft : defaultLeft,\n boundaryLeft,\n boundaryRight - width,\n );\n\n const spaceAbove = triggerRect.top - boundaryTop;\n const spaceBelow = boundaryBottom - triggerRect.bottom;\n const shouldOpenUp = spaceBelow < contentHeight + offset && spaceAbove > spaceBelow;\n const direction = shouldOpenUp ? 'up' : 'down';\n const maxHeight = Math.max(\n 120,\n Math.floor((shouldOpenUp ? spaceAbove : spaceBelow) - offset),\n );\n const renderedHeight = Math.min(contentHeight, maxHeight);\n const viewportTop = shouldOpenUp\n ? Math.max(boundaryTop, triggerRect.top - offset - renderedHeight)\n : Math.min(boundaryBottom - renderedHeight, triggerRect.bottom + offset);\n\n return {\n top: viewportTop - (portalRect?.top ?? 0),\n left: left - (portalRect?.left ?? 0),\n width,\n maxHeight,\n direction,\n };\n}\n","'use client';\n\nimport { Check, ChevronDown, Search } from 'lucide-react';\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { buildSearchText, rankBySearch } from '../utils/search';\n\nimport type { LucideIcon } from 'lucide-react';\n\nimport { Input } from '../primitives/input';\nimport { cn } from '../utils/cn';\nimport { resolveSearchableSelectDropdownPosition } from './searchable-select-position';\n\nexport const AUTO_SEARCHABLE_SELECT_THRESHOLD = 5;\n\nexport interface SearchableSelectOption {\n readonly value: string;\n readonly label: string;\n readonly searchText?: string;\n}\n\nexport interface SearchableSelectProps<TOption extends SearchableSelectOption> {\n readonly value: string;\n readonly onValueChange: (value: string) => void;\n readonly options: readonly TOption[];\n readonly placeholder?: string;\n readonly disabled?: boolean;\n readonly className?: string;\n readonly triggerClassName?: string;\n readonly contentClassName?: string;\n readonly ariaLabel?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly leadingIcon?: LucideIcon;\n readonly searchThreshold?: number;\n readonly size?: 'sm' | 'default';\n readonly renderOption?: (option: TOption) => React.ReactNode;\n readonly renderValue?: (option: TOption) => React.ReactNode;\n}\n\ninterface SearchableSelectBoundaryElement {\n contains(target: EventTarget | null): boolean;\n}\n\ninterface SearchableSelectPortalAnchor {\n closest(selectors: string): Element | null;\n}\n\nconst SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR =\n '[data-slot=\"sheet-content\"], [data-slot=\"drawer-content\"]';\n\nfunction getSearchableSelectBoundaryRect(element: HTMLElement): DOMRect | undefined {\n return element.closest(SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR)?.getBoundingClientRect();\n}\n\nexport function isSearchableSelectPointerInside(\n target: EventTarget | null,\n triggerContainer: SearchableSelectBoundaryElement | null,\n dropdownContent: SearchableSelectBoundaryElement | null,\n): boolean {\n return Boolean(triggerContainer?.contains(target) || dropdownContent?.contains(target));\n}\n\nexport function getSearchableSelectPortalContainer(\n trigger: SearchableSelectPortalAnchor | null,\n): Element | null {\n return trigger?.closest(SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR) ?? null;\n}\n\nexport function SearchableSelect<TOption extends SearchableSelectOption>({\n value,\n onValueChange,\n options,\n placeholder = 'Select...',\n disabled = false,\n className,\n triggerClassName,\n contentClassName,\n ariaLabel,\n searchPlaceholder = 'Search...',\n emptyMessage = 'No results found',\n leadingIcon: LeadingIcon,\n searchThreshold = AUTO_SEARCHABLE_SELECT_THRESHOLD,\n size = 'default',\n renderOption,\n renderValue,\n}: SearchableSelectProps<TOption>): React.ReactElement {\n const selectId = useId();\n const [isOpen, setIsOpen] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const [search, setSearch] = useState('');\n const [highlightedOptionIndex, setHighlightedOptionIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const optionRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [portalContainer, setPortalContainer] = useState<Element | null>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n const selectedOption = options.find((option) => option.value === value);\n const showSearchInput = options.length > searchThreshold;\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n function closeOtherSearchableSelects(event: Event): void {\n if (event instanceof CustomEvent && event.detail !== selectId) {\n setIsOpen(false);\n }\n }\n\n window.addEventListener('searchable-select:open', closeOtherSearchableSelects);\n\n return () => {\n window.removeEventListener('searchable-select:open', closeOtherSearchableSelects);\n };\n }, [selectId]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n window.dispatchEvent(new CustomEvent('searchable-select:open', { detail: selectId }));\n }, [isOpen, selectId]);\n\n useEffect(() => {\n if (!showSearchInput || !isOpen) {\n setSearch('');\n return;\n }\n\n requestAnimationFrame(() => {\n searchInputRef.current?.focus();\n });\n }, [isOpen, showSearchInput]);\n\n useEffect(() => {\n function handlePointerDown(event: PointerEvent): void {\n if (isSearchableSelectPointerInside(event.target, containerRef.current, contentRef.current)) {\n return;\n }\n\n setIsOpen(false);\n }\n\n if (!isOpen) {\n return undefined;\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n };\n }, [isOpen]);\n\n const filteredOptions = useMemo(\n () =>\n rankBySearch(options, search, (option) => buildSearchText(option.label, option.searchText)),\n [options, search],\n );\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const selectedIndex = filteredOptions.findIndex((option) => option.value === value);\n if (selectedIndex >= 0) {\n setHighlightedOptionIndex(selectedIndex);\n return;\n }\n\n setHighlightedOptionIndex(0);\n }, [filteredOptions, isOpen, value]);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\n\n if (filteredOptions.length === 0) {\n setHighlightedOptionIndex(0);\n return;\n }\n\n setHighlightedOptionIndex((currentValue) => Math.min(currentValue, filteredOptions.length - 1));\n }, [filteredOptions]);\n\n useEffect(() => {\n if (!isOpen || filteredOptions.length === 0) {\n return;\n }\n\n optionRefs.current[highlightedOptionIndex]?.scrollIntoView({ block: 'nearest' });\n }, [filteredOptions.length, highlightedOptionIndex, isOpen]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setDropdownPosition(null);\n setPortalContainer(null);\n return;\n }\n\n function updateDropdownPosition(): void {\n const trigger = triggerRef.current;\n const content = contentRef.current;\n\n if (!trigger || !content) {\n return;\n }\n\n const nextPortalContainer = getSearchableSelectPortalContainer(trigger);\n setPortalContainer(nextPortalContainer);\n\n const triggerRect = trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const nextPosition = resolveSearchableSelectDropdownPosition({\n triggerRect,\n boundaryRect: getSearchableSelectBoundaryRect(trigger),\n portalRect: nextPortalContainer?.getBoundingClientRect(),\n contentWidth: Math.max(triggerRect.width, contentRect.width, 250),\n contentHeight: contentRect.height,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n\n setDropdownPosition((currentValue) => {\n if (\n currentValue?.top === nextPosition.top &&\n currentValue?.left === nextPosition.left &&\n currentValue?.width === nextPosition.width &&\n currentValue?.maxHeight === nextPosition.maxHeight\n ) {\n return currentValue;\n }\n\n return nextPosition;\n });\n }\n\n updateDropdownPosition();\n const animationFrameId = window.requestAnimationFrame(updateDropdownPosition);\n\n window.addEventListener('resize', updateDropdownPosition);\n window.addEventListener('scroll', updateDropdownPosition, true);\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n window.removeEventListener('resize', updateDropdownPosition);\n window.removeEventListener('scroll', updateDropdownPosition, true);\n };\n }, [filteredOptions.length, isOpen, search, showSearchInput]);\n\n function selectHighlightedOption(): void {\n const highlightedOption = filteredOptions[highlightedOptionIndex];\n\n if (!highlightedOption) {\n return;\n }\n\n onValueChange(highlightedOption.value);\n setIsOpen(false);\n }\n\n function selectOption(value: string): void {\n onValueChange(value);\n setIsOpen(false);\n }\n\n function moveHighlightedOption(direction: 'up' | 'down'): void {\n if (filteredOptions.length === 0) {\n return;\n }\n\n setHighlightedOptionIndex((currentValue) => {\n if (direction === 'down') {\n return (currentValue + 1) % filteredOptions.length;\n }\n\n return (currentValue - 1 + filteredOptions.length) % filteredOptions.length;\n });\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n disabled={disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n }}\n className={cn(\n 'border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 flex w-full items-center justify-between gap-1.5 rounded-lg border bg-transparent py-1 pr-2 pl-2 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3',\n size === 'sm' ? 'h-7 rounded-[min(var(--radius-md),10px)]' : 'h-8',\n triggerClassName,\n )}\n >\n {LeadingIcon ? (\n <LeadingIcon className=\"text-muted-foreground size-4 shrink-0\" strokeWidth={1.8} />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {selectedOption ? (\n (renderValue?.(selectedOption) ?? selectedOption.label)\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </span>\n <ChevronDown\n className={cn(\n 'text-muted-foreground size-4 shrink-0 transition-transform',\n isOpen && 'rotate-180',\n )}\n />\n </button>\n\n {isOpen && isMounted\n ? createPortal(\n <div\n ref={contentRef}\n data-searchable-select-content=\"\"\n className={cn(\n 'bg-popover text-popover-foreground pointer-events-auto z-[60] min-w-0 rounded-xl border p-2 shadow-lg',\n portalContainer ? 'absolute' : 'fixed',\n contentClassName,\n )}\n style={{\n top: dropdownPosition?.top ?? 0,\n left: dropdownPosition?.left ?? 0,\n width: dropdownPosition?.width ?? triggerRef.current?.getBoundingClientRect().width,\n visibility: dropdownPosition ? 'visible' : 'hidden',\n }}\n >\n {showSearchInput ? (\n <div className=\"relative mb-2\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n ref={searchInputRef}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveHighlightedOption('down');\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveHighlightedOption('up');\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n selectHighlightedOption();\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n setIsOpen(false);\n }\n }}\n placeholder={searchPlaceholder}\n className=\"pl-9\"\n />\n </div>\n ) : null}\n\n <div\n className=\"space-y-1 overflow-y-auto\"\n style={{\n maxHeight: Math.min(256, dropdownPosition?.maxHeight ?? 256),\n }}\n >\n {filteredOptions.map((option, index) => {\n const isSelected = option.value === value;\n\n return (\n <button\n key={option.value}\n ref={(element) => {\n optionRefs.current[index] = element;\n }}\n type=\"button\"\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex h-auto w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm transition-colors',\n isSelected && 'bg-muted/60',\n highlightedOptionIndex === index && 'bg-accent text-accent-foreground',\n )}\n onMouseEnter={() => setHighlightedOptionIndex(index)}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectOption(option.value);\n }}\n onClick={(event) => {\n if (event.detail === 0) {\n selectOption(option.value);\n }\n }}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {renderOption?.(option) ?? option.label}\n </span>\n {isSelected ? <Check className=\"size-4 shrink-0\" /> : null}\n </button>\n );\n })}\n\n {filteredOptions.length === 0 ? (\n <p className=\"text-muted-foreground px-2 py-4 text-sm\">{emptyMessage}</p>\n ) : null}\n </div>\n </div>,\n portalContainer ?? document.body,\n )\n : null}\n </div>\n );\n}\n","'use client';\n\nimport { Eye, Pencil, Trash2 } from 'lucide-react';\n\nimport type { ActionHandlers, ActionType } from './types';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\n\nconst SMART_TABLE_ACTIONS_CONTAINER_CLASS = 'flex w-full items-center justify-end gap-1';\n\ninterface SmartTableActionsProps<T> {\n item: T;\n actions?: ActionType[];\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n}\n\nconst actionIcons: Record<ActionType, typeof Eye> = {\n view: Eye,\n edit: Pencil,\n delete: Trash2,\n};\n\nconst actionLabels: Record<ActionType, string> = {\n view: 'Visualizza',\n edit: 'Edit',\n delete: 'Delete',\n};\n\nexport function SmartTableActions<T>({\n item,\n actions,\n actionHandlers,\n renderActions,\n}: SmartTableActionsProps<T>): React.ReactElement | null {\n if (renderActions) {\n return <div className={SMART_TABLE_ACTIONS_CONTAINER_CLASS}>{renderActions(item)}</div>;\n }\n\n if (!actions || !actionHandlers) {\n return null;\n }\n\n return (\n <div className={SMART_TABLE_ACTIONS_CONTAINER_CLASS}>\n {actions.map((action) => {\n const Icon = actionIcons[action];\n const handler = actionHandlers[\n `on${action.charAt(0).toUpperCase()}${action.slice(1)}` as keyof ActionHandlers<T>\n ];\n\n return (\n <Button\n key={action}\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n aria-label={actionLabels[action]}\n onClick={(event) => {\n event.stopPropagation();\n (handler as ((value: T) => void) | undefined)?.(item);\n }}\n >\n <Icon className=\"size-4\" />\n </Button>\n );\n })}\n </div>\n );\n}\n","import { createElement } from 'react';\n\nimport type { Column } from './types';\nimport type { ReactNode } from 'react';\n\n\nimport { DisplayDate } from '../primitives/display-date';\nimport { formatDisplayDate } from '../utils/date-display';\n\nfunction formatListEntry(value: unknown): string {\n const formatted = formatValue(value);\n\n if (typeof formatted === 'string' || typeof formatted === 'number') {\n return String(formatted);\n }\n\n return '—';\n}\n\n/**\n * Get nested value from object using dot notation\n * e.g., getNestedValue(obj, 'user.profile.name')\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n return path.split('.').reduce((acc, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): ReactNode {\n if (value === null || value === undefined) {\n return '—';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return createElement(DisplayDate, { value });\n }\n\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '—';\n }\n\n return value.map((entry) => formatListEntry(entry)).join(', ');\n }\n\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n\n for (const key of ['label', 'name', 'title']) {\n const nestedValue = record[key];\n if (typeof nestedValue === 'string' || typeof nestedValue === 'number') {\n return String(nestedValue);\n }\n }\n }\n\n return '[Object]';\n}\n\nfunction formatValueAsText(value: unknown): string | null {\n if (value === null || value === undefined) {\n return '—';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return formatDisplayDate(value);\n }\n\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '—';\n }\n\n return value.map((entry) => formatValueAsText(entry) ?? '—').join(', ');\n }\n\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n\n for (const key of ['label', 'name', 'title']) {\n const nestedValue = record[key];\n if (typeof nestedValue === 'string' || typeof nestedValue === 'number') {\n return String(nestedValue);\n }\n }\n }\n\n return null;\n}\n\nexport function getColumnValue<T>(column: Column<T>, item: T): unknown {\n if (!column.accessor) {\n return null;\n }\n\n if (typeof column.accessor === 'string' && column.accessor.includes('.')) {\n return getNestedValue(item, column.accessor);\n }\n\n return (item as Record<string, unknown>)[column.accessor as string];\n}\n\nexport function renderColumnValue<T>(column: Column<T>, item: T): ReactNode {\n const value = getColumnValue(column, item);\n\n if (column.render) {\n return column.render(value, item);\n }\n\n return formatValue(value);\n}\n\nexport function getColumnTooltipText<T>(column: Column<T>, item: T): string | null {\n if (column.render) {\n return null;\n }\n\n return formatValueAsText(getColumnValue(column, item));\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\n\nimport { getColumnValue } from './utils';\n\nimport type { Column, SortDirection, SortState, SortValue } from './types';\n\ninterface UseTableSortingOptions<T> {\n readonly data: readonly T[];\n readonly columns: readonly Column<T>[];\n readonly initialSortState?: SortState;\n}\n\ninterface UseTableSortingResult<T> {\n readonly sortedData: T[];\n readonly sortState: SortState;\n readonly setSortState: (state: SortState) => void;\n}\n\nexport function getColumnSortKey<T>(column: Column<T>): string | null {\n if (column.sortable === false) {\n return null;\n }\n\n if (column.sortKey) {\n return column.sortKey;\n }\n\n return typeof column.accessor === 'string' ? column.accessor : null;\n}\n\nexport function getNextSortState(currentState: SortState, key: string): SortState {\n if (currentState?.key !== key) {\n return { key, direction: 'asc' };\n }\n\n if (currentState.direction === 'asc') {\n return { key, direction: 'desc' };\n }\n\n return null;\n}\n\nfunction normalizeSortValue(value: SortValue): string | number | boolean | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n return value;\n}\n\nfunction compareSortValues(left: SortValue, right: SortValue): number {\n const leftValue = normalizeSortValue(left);\n const rightValue = normalizeSortValue(right);\n\n if (leftValue === null && rightValue === null) {\n return 0;\n }\n\n if (leftValue === null) {\n return 1;\n }\n\n if (rightValue === null) {\n return -1;\n }\n\n if (typeof leftValue === 'number' && typeof rightValue === 'number') {\n return leftValue - rightValue;\n }\n\n if (typeof leftValue === 'boolean' && typeof rightValue === 'boolean') {\n return Number(leftValue) - Number(rightValue);\n }\n\n return String(leftValue).localeCompare(String(rightValue), 'it', {\n numeric: true,\n sensitivity: 'base',\n });\n}\n\nfunction getSortValue<T>(column: Column<T>, row: T): SortValue {\n if (column.sortAccessor) {\n return column.sortAccessor(row);\n }\n\n return getColumnValue(column, row) as SortValue;\n}\n\nfunction getSortColumn<T>(\n columns: readonly Column<T>[],\n sortState: SortState,\n): Column<T> | null {\n if (!sortState) {\n return null;\n }\n\n return columns.find((column) => getColumnSortKey(column) === sortState.key) ?? null;\n}\n\nfunction applyDirection(value: number, direction: SortDirection): number {\n return direction === 'asc' ? value : -value;\n}\n\nfunction sortTableData<T>(\n data: readonly T[],\n columns: readonly Column<T>[],\n sortState: SortState,\n): T[] {\n const sortColumn = getSortColumn(columns, sortState);\n\n if (!sortColumn || !sortState) {\n return [...data];\n }\n\n return data\n .map((row, index) => ({ row, index }))\n .sort((left, right) => {\n const compared = compareSortValues(\n getSortValue(sortColumn, left.row),\n getSortValue(sortColumn, right.row),\n );\n\n return compared === 0\n ? left.index - right.index\n : applyDirection(compared, sortState.direction);\n })\n .map(({ row }) => row);\n}\n\nexport function useTableSorting<T>({\n data,\n columns,\n initialSortState = null,\n}: UseTableSortingOptions<T>): UseTableSortingResult<T> {\n const [sortState, setSortState] = useState(initialSortState);\n const sortedData = useMemo(\n () => sortTableData(data, columns, sortState),\n [columns, data, sortState],\n );\n\n return { sortedData, sortState, setSortState };\n}\n","import type { ColumnAlign } from './types';\n\nexport function getTruncatedContentAlignmentClass(\n align?: ColumnAlign\n): string {\n if (align === 'right') {\n return 'text-right';\n }\n\n if (align === 'center') {\n return 'text-center';\n }\n\n return 'text-left';\n}\n\nexport function shouldRenderTooltipTrigger(options: {\n tooltip?: string | null;\n isOverflowing: boolean;\n}): boolean {\n return Boolean(options.tooltip) && options.isOverflowing;\n}\n","'use client';\n\nimport {\n getTruncatedContentAlignmentClass,\n shouldRenderTooltipTrigger,\n} from './truncated-content.utils';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { ReactNode } from 'react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../primitives/tooltip';\n\ninterface TruncatedContentProps {\n children: ReactNode;\n tooltip?: string | null;\n align?: 'left' | 'right' | 'center';\n className?: string;\n}\n\nexport function TruncatedContent({\n children,\n tooltip,\n align = 'left',\n className = '',\n}: TruncatedContentProps): React.ReactElement {\n const contentRef = useRef<HTMLDivElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n\n const updateOverflowState = (): boolean => {\n const element = contentRef.current;\n if (!element) {\n setIsOverflowing(false);\n return false;\n }\n\n const overflowing = element.scrollWidth > element.clientWidth + 1;\n setIsOverflowing(overflowing);\n return overflowing;\n };\n\n useEffect(() => {\n const element = contentRef.current;\n if (!element) {\n return;\n }\n\n updateOverflowState();\n\n const resizeObserver = new ResizeObserver(() => {\n updateOverflowState();\n });\n\n resizeObserver.observe(element);\n window.addEventListener('resize', updateOverflowState);\n\n return () => {\n resizeObserver.disconnect();\n window.removeEventListener('resize', updateOverflowState);\n };\n }, [children, className, align, tooltip]);\n\n useEffect(() => {\n if (!isOverflowing && isOpen) {\n setIsOpen(false);\n }\n }, [isOpen, isOverflowing]);\n\n const alignmentClass = getTruncatedContentAlignmentClass(align);\n const showTooltipTrigger = shouldRenderTooltipTrigger({\n tooltip,\n isOverflowing,\n });\n\n const content = (\n <div\n ref={contentRef}\n className={[\n 'block min-w-0 w-full truncate',\n alignmentClass,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n\n if (!showTooltipTrigger) {\n return content;\n }\n\n return (\n <Tooltip\n delayDuration={100}\n open={isOverflowing ? isOpen : false}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n setIsOpen(false);\n return;\n }\n\n setIsOpen(updateOverflowState());\n }}\n >\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className={[\n 'block min-w-0 w-full overflow-hidden bg-transparent p-0 text-inherit outline-none',\n alignmentClass,\n isOverflowing ? 'cursor-help' : 'cursor-default',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseEnter={() => {\n updateOverflowState();\n }}\n onFocus={() => {\n updateOverflowState();\n }}\n onClick={(event) => {\n event.stopPropagation();\n const overflowing = updateOverflowState();\n if (overflowing) {\n setIsOpen((previous) => !previous);\n }\n }}\n >\n {content}\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align={align === 'right' ? 'end' : align === 'center' ? 'center' : 'start'}\n sideOffset={6}\n collisionPadding={12}\n avoidCollisions\n className=\"w-[min(20rem,calc(100vw-1.5rem))] max-w-[calc(100vw-1.5rem)] whitespace-normal break-words text-left\"\n >\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react';\n\nimport { SmartTableActions } from './SmartTableActions';\nimport { getColumnSortKey, getNextSortState } from './sorting';\nimport { TruncatedContent } from './TruncatedContent';\nimport { getColumnTooltipText, renderColumnValue } from './utils';\n\nimport type {\n ActionHandlers,\n ActionType,\n Column,\n PaginationConfig,\n SortDirection,\n SortState,\n} from './types';\nimport type { ReactNode } from 'react';\n\nimport { Pagination } from '../primitives/pagination';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../primitives/table';\nimport { cn } from '../utils/cn';\n\ninterface DesktopViewProps<T> {\n data: T[];\n columns: Column<T>[];\n isLoading: boolean;\n skeletonRows: number;\n actions?: ActionType[];\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n noDataMessage: string;\n noDataContent?: ReactNode;\n getRowKey: (item: T) => string | number;\n onRowClick?: (item: T) => void;\n pagination?: PaginationConfig;\n stickyHeader?: boolean;\n maxHeight?: string;\n fullHeight?: boolean;\n sortState?: SortState;\n onSortChange?: (state: SortState) => void;\n}\n\nconst ACTION_COLUMN_WIDTH_PX = 112;\nconst ACTION_CELL_CLASS_NAME = 'w-28 min-w-28 overflow-visible whitespace-nowrap text-right';\n\nfunction SortIcon({\n activeDirection,\n}: {\n readonly activeDirection?: SortDirection;\n}): React.ReactElement {\n if (activeDirection === 'asc') {\n return <ArrowUp className=\"size-3.5\" aria-hidden=\"true\" />;\n }\n\n if (activeDirection === 'desc') {\n return <ArrowDown className=\"size-3.5\" aria-hidden=\"true\" />;\n }\n\n return <ChevronsUpDown className=\"size-3.5 opacity-45\" aria-hidden=\"true\" />;\n}\n\nfunction SortableHeaderContent<T>({\n column,\n sortState,\n onSortChange,\n}: {\n readonly column: Column<T>;\n readonly sortState?: SortState;\n readonly onSortChange?: (state: SortState) => void;\n}): React.ReactElement {\n const sortKey = getColumnSortKey(column);\n const activeDirection = sortState?.key === sortKey ? sortState.direction : undefined;\n\n if (!sortKey || !onSortChange) {\n return <>{column.header}</>;\n }\n\n return (\n <button\n type=\"button\"\n className={cn(\n 'hover:text-foreground focus-visible:ring-ring inline-flex max-w-full items-center gap-1.5 rounded-sm text-left font-medium transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',\n column.align === 'right' && 'ml-auto',\n column.align === 'center' && 'mx-auto',\n )}\n aria-label={`Sort by ${column.header}`}\n onClick={() => {\n onSortChange(getNextSortState(sortState ?? null, sortKey));\n }}\n >\n <span className=\"truncate\">{column.header}</span>\n <SortIcon activeDirection={activeDirection} />\n </button>\n );\n}\n\nexport function DesktopView<T>({\n data,\n columns,\n isLoading,\n skeletonRows,\n actions,\n actionHandlers,\n renderActions,\n noDataMessage,\n noDataContent,\n getRowKey,\n onRowClick,\n pagination,\n stickyHeader = false,\n maxHeight = 'calc(100vh - 300px)',\n fullHeight = false,\n sortState,\n onSortChange,\n}: DesktopViewProps<T>): React.ReactElement {\n const resolvedNoDataContent = noDataContent ?? noDataMessage;\n const hasActions = (actions?.length ?? 0) > 0 || renderActions !== undefined;\n const actionColumnWidth = hasActions ? `${String(ACTION_COLUMN_WIDTH_PX)}px` : undefined;\n const specifiedPercentageWidth = columns.reduce((total, column) => {\n if (typeof column.width === 'string' && column.width.endsWith('%')) {\n const parsedWidth = Number.parseFloat(column.width);\n return Number.isNaN(parsedWidth) ? total : total + parsedWidth;\n }\n\n return total;\n }, 0);\n const actionWidthPercentage = 0;\n const remainingPercentageForDataColumns = Math.max(\n 0,\n 100 - specifiedPercentageWidth - actionWidthPercentage,\n );\n const columnsWithoutWidth = columns.filter((column) => column.width === undefined).length;\n const defaultPercentageWidth =\n columnsWithoutWidth > 0 && remainingPercentageForDataColumns > 0\n ? `${String(remainingPercentageForDataColumns / columnsWithoutWidth)}%`\n : undefined;\n\n const columnGroup = (\n <colgroup>\n {columns.map((column) => (\n <col key={column.header} style={{ width: column.width ?? defaultPercentageWidth }} />\n ))}\n {hasActions && actionColumnWidth ? (\n <col style={{ width: actionColumnWidth, minWidth: actionColumnWidth }} />\n ) : null}\n </colgroup>\n );\n\n const tableHeader = (\n <TableHeader className={cn(stickyHeader && 'bg-muted/50 sticky top-0 z-10 backdrop-blur-sm')}>\n <TableRow>\n {columns.map((col) => (\n <TableHead\n key={col.header}\n style={{ width: col.width }}\n aria-sort={\n sortState?.key === getColumnSortKey(col)\n ? sortState.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n className={\n col.align === 'right' ? 'text-right' : col.align === 'center' ? 'text-center' : ''\n }\n >\n <SortableHeaderContent column={col} sortState={sortState} onSortChange={onSortChange} />\n </TableHead>\n ))}\n {hasActions ? (\n <TableHead\n style={\n actionColumnWidth\n ? { width: actionColumnWidth, minWidth: actionColumnWidth }\n : undefined\n }\n className=\"w-28 min-w-28 overflow-visible text-right whitespace-nowrap\"\n >\n Actions\n </TableHead>\n ) : null}\n </TableRow>\n </TableHeader>\n );\n\n // Determine scrollable container styles\n const scrollContainerClass = cn(\n 'min-w-0 rounded-lg border overflow-x-auto',\n fullHeight && 'flex-1 min-h-0 overflow-y-auto',\n !fullHeight && stickyHeader && 'overflow-y-auto',\n );\n const scrollContainerStyle = !fullHeight && stickyHeader ? { maxHeight } : undefined;\n\n if (isLoading) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className={scrollContainerClass} style={scrollContainerStyle}>\n <Table className=\"table-fixed\">\n {columnGroup}\n {tableHeader}\n <TableBody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <TableRow key={i}>\n {columns.map((col) => (\n <TableCell key={col.header}>\n <Skeleton className=\"h-5 w-full\" />\n </TableCell>\n ))}\n {hasActions ? (\n <TableCell className={ACTION_CELL_CLASS_NAME}>\n <div className=\"flex w-full justify-end\">\n <Skeleton className=\"h-8 w-20\" />\n </div>\n </TableCell>\n ) : null}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className=\"w-full py-0\">\n {typeof resolvedNoDataContent === 'string' ? (\n <div className=\"text-muted-foreground\">{resolvedNoDataContent}</div>\n ) : (\n resolvedNoDataContent\n )}\n </div>\n {pagination && pagination.totalItems > 0 && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n }\n\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className={scrollContainerClass} style={scrollContainerStyle}>\n <Table className=\"table-fixed\">\n {columnGroup}\n {tableHeader}\n <TableBody>\n {data.map((item) => (\n <TableRow\n key={getRowKey(item)}\n className={onRowClick ? 'hover:bg-muted/50 cursor-pointer' : ''}\n onClick={() => onRowClick?.(item)}\n >\n {columns.map((col) => (\n <TableCell\n key={col.header}\n className={cn(\n 'max-w-0',\n col.align === 'right'\n ? 'text-right'\n : col.align === 'center'\n ? 'text-center'\n : '',\n )}\n >\n {col.truncate === false ? (\n <div\n className={cn(\n 'block w-full min-w-0',\n col.align === 'right'\n ? 'text-right'\n : col.align === 'center'\n ? 'text-center'\n : 'text-left',\n )}\n >\n {renderColumnValue(col, item)}\n </div>\n ) : (\n <TruncatedContent align={col.align} tooltip={getColumnTooltipText(col, item)}>\n {renderColumnValue(col, item)}\n </TruncatedContent>\n )}\n </TableCell>\n ))}\n {hasActions ? (\n <TableCell className={ACTION_CELL_CLASS_NAME}>\n <SmartTableActions\n item={item}\n actions={actions}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n />\n </TableCell>\n ) : null}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { SmartTableActions } from './SmartTableActions';\nimport { TruncatedContent } from './TruncatedContent';\nimport { getColumnTooltipText, renderColumnValue } from './utils';\n\nimport type { ActionHandlers, ActionType, Column, PaginationConfig } from './types';\nimport type { ReactNode } from 'react';\n\nimport { Pagination } from '../primitives/pagination';\nimport { Card, CardContent } from '../primitives/card';\nimport { Skeleton } from '../primitives/skeleton';\nimport { cn } from '../utils/cn';\n\ninterface MobileViewProps<T> {\n data: T[];\n columns: Column<T>[];\n isLoading: boolean;\n skeletonRows: number;\n actions?: ActionType[];\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n noDataMessage: string;\n noDataContent?: ReactNode;\n getRowKey: (item: T) => string | number;\n onRowClick?: (item: T) => void;\n renderMobileCard?: (item: T) => ReactNode;\n pagination?: PaginationConfig;\n fullHeight?: boolean;\n}\n\nexport function MobileView<T>({\n data,\n columns,\n isLoading,\n skeletonRows,\n actions,\n actionHandlers,\n renderActions,\n noDataMessage,\n noDataContent,\n getRowKey,\n onRowClick,\n renderMobileCard,\n pagination,\n fullHeight = false,\n}: MobileViewProps<T>): React.ReactElement {\n const resolvedNoDataContent = noDataContent ?? noDataMessage;\n const visibleColumns = columns.filter((col) => !col.hideOnMobile);\n const hasActions = (actions?.length ?? 0) > 0 || renderActions !== undefined;\n\n const paginationComponent = pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n );\n\n if (isLoading) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className={cn('space-y-2', fullHeight && 'flex-1 min-h-0 overflow-auto px-px')}>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <Card key={i} size=\"sm\" className=\"border border-border/80 shadow-none ring-0\">\n <CardContent className=\"px-3\">\n <div className=\"space-y-2\">\n {visibleColumns.map((column) => (\n <div key={column.header} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-3.5 w-20 shrink-0\" />\n <Skeleton className=\"h-4 w-full\" />\n </div>\n ))}\n {hasActions ? (\n <div className=\"flex justify-end border-t pt-3\">\n <Skeleton className=\"h-8 w-24\" />\n </div>\n ) : null}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n {paginationComponent}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className=\"w-full py-0\">\n {typeof resolvedNoDataContent === 'string' ? (\n <div className=\"text-muted-foreground\">{resolvedNoDataContent}</div>\n ) : (\n resolvedNoDataContent\n )}\n </div>\n {pagination && pagination.totalItems > 0 && paginationComponent}\n </div>\n );\n }\n\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className={cn('space-y-2', fullHeight && 'flex-1 min-h-0 overflow-auto px-px')}>\n {data.map((item) => (\n <Card\n key={getRowKey(item)}\n size=\"sm\"\n className={cn(\n 'border border-border/80 shadow-none ring-0',\n onRowClick ? 'cursor-pointer hover:bg-muted/50' : ''\n )}\n onClick={() => onRowClick?.(item)}\n >\n <CardContent className=\"px-3\">\n {renderMobileCard ? (\n renderMobileCard(item)\n ) : (\n <div className=\"space-y-2.5\">\n {visibleColumns.map((col) => (\n <div\n key={col.header}\n className=\"flex items-center gap-3 overflow-hidden\"\n >\n <span className=\"w-20 shrink-0 truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {col.mobileLabel ?? col.header}\n </span>\n <div className=\"min-w-0 flex-1 text-sm\">\n {col.truncate === false ? (\n <div className=\"block min-w-0 w-full text-right text-sm\">\n {renderColumnValue(col, item)}\n </div>\n ) : (\n <TruncatedContent\n align=\"right\"\n tooltip={getColumnTooltipText(col, item)}\n className=\"text-sm\"\n >\n {renderColumnValue(col, item)}\n </TruncatedContent>\n )}\n </div>\n </div>\n ))}\n {hasActions ? (\n <div className=\"mt-3 flex justify-end border-t pt-2.5\">\n <SmartTableActions\n item={item}\n actions={actions}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n />\n </div>\n ) : null}\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n {paginationComponent}\n </div>\n );\n}\n","'use client';\n\nimport { DesktopView } from './DesktopView';\nimport { MobileView } from './MobileView';\n\nimport type { SmartTableProps } from './types';\n\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport function SmartTable<T>({\n data,\n columns,\n isLoading,\n skeletonRows = 5,\n actions,\n actionHandlers,\n renderActions,\n noDataMessage = 'No data available',\n noDataContent,\n getRowKey = (item) => {\n // Default: try _id, id, or index\n const record = item as Record<string, unknown>;\n if ('_id' in record) return String(record._id);\n if ('id' in record) return String(record.id);\n return data.indexOf(item);\n },\n onRowClick,\n renderMobileCard,\n pagination,\n stickyHeader,\n maxHeight,\n fullHeight,\n sortState,\n onSortChange,\n}: SmartTableProps<T>): React.ReactElement {\n const isMobile = useIsMobile();\n\n if (isMobile) {\n return (\n <div className={cn('min-w-0', fullHeight && 'flex min-h-0 flex-1 flex-col')}>\n <MobileView\n data={data}\n columns={columns}\n isLoading={isLoading}\n skeletonRows={skeletonRows}\n actions={actions}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n noDataMessage={noDataMessage}\n noDataContent={noDataContent}\n getRowKey={getRowKey}\n onRowClick={onRowClick}\n renderMobileCard={renderMobileCard}\n pagination={pagination}\n fullHeight={fullHeight}\n />\n </div>\n );\n }\n\n return (\n <div className={cn('min-w-0', fullHeight && 'flex min-h-0 flex-1 flex-col')}>\n <DesktopView\n data={data}\n columns={columns}\n isLoading={isLoading}\n skeletonRows={skeletonRows}\n actions={actions}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n noDataMessage={noDataMessage}\n noDataContent={noDataContent}\n getRowKey={getRowKey}\n onRowClick={onRowClick}\n pagination={pagination}\n stickyHeader={stickyHeader}\n maxHeight={maxHeight}\n fullHeight={fullHeight}\n sortState={sortState}\n onSortChange={onSortChange}\n />\n </div>\n );\n}\n","'use client';\n\nimport { Filter, Search, X } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\nimport { Input } from '../primitives/input';\nimport { DesktopConfirmShortcutHint } from '../overlays/responsive-sheet.footer';\nimport { ResponsiveSheet } from '../overlays/responsive-sheet';\nimport { useDesktopShortcutModifierLabel } from '../overlays/responsive-sheet.shortcuts';\nimport { SearchableSelect } from '../search/searchable-select';\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport interface FilterOption<T extends string = string> {\n readonly value: T;\n readonly label: string;\n}\n\ninterface FilterDropdownProps<T extends string> {\n readonly label: string;\n readonly value: T | 'all';\n readonly options: readonly FilterOption<T>[];\n readonly onChange: (value: T | 'all') => void;\n readonly className?: string;\n readonly icon?: LucideIcon;\n readonly allowAll?: boolean;\n readonly allOptionLabel?: string;\n}\n\nexport function buildAllFilterOptionLabel(label: string, allOptionLabel?: string): string {\n return allOptionLabel ?? `All: ${label}`;\n}\n\nexport function FilterDropdown<T extends string>({\n label,\n value,\n options,\n onChange,\n className,\n allowAll = true,\n allOptionLabel,\n}: FilterDropdownProps<T>): React.ReactElement {\n return (\n <SearchableSelect\n value={value}\n onValueChange={(nextValue) => {\n onChange(nextValue as T | 'all');\n }}\n placeholder={label}\n className={className ?? 'w-full sm:w-[140px]'}\n searchPlaceholder={`Search ${label.toLocaleLowerCase()}...`}\n options={[\n ...(allowAll\n ? [{ value: 'all', label: buildAllFilterOptionLabel(label, allOptionLabel) }]\n : []),\n ...options,\n ]}\n />\n );\n}\n\ninterface SearchInputProps {\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder?: string;\n readonly className?: string;\n}\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n className,\n}: SearchInputProps): React.ReactElement {\n return (\n <div className={cn('relative', className)}>\n <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={(event) => {\n onChange(event.target.value);\n }}\n className=\"pr-9 pl-9\"\n />\n {value ? (\n <button\n type=\"button\"\n onClick={() => {\n onChange('');\n }}\n className=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-2.5 -translate-y-1/2\"\n >\n <X className=\"size-4\" />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport interface FilterConfig<T extends string = string> {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly options: readonly FilterOption<T>[];\n}\n\nexport interface TableToolbarLabels {\n readonly filtersButtonLabel: string;\n readonly filtersTitle: ReactNode;\n readonly filtersDescription?: ReactNode;\n readonly clearFiltersLabel: ReactNode;\n readonly showResultsLabel: (resultCount?: number) => ReactNode;\n readonly rangeMinPlaceholder: string;\n readonly rangeMaxPlaceholder: string;\n}\n\nexport type TableToolbarLabelsInput = Partial<TableToolbarLabels>;\n\nexport function resolveTableToolbarLabels(\n labels: TableToolbarLabelsInput = {},\n): TableToolbarLabels {\n return {\n filtersButtonLabel: labels.filtersButtonLabel ?? 'Filters',\n filtersTitle: labels.filtersTitle ?? 'Filters',\n filtersDescription:\n labels.filtersDescription ?? 'Narrow the list using the available criteria.',\n clearFiltersLabel: labels.clearFiltersLabel ?? 'Clear',\n showResultsLabel:\n labels.showResultsLabel ??\n ((resultCount?: number) =>\n typeof resultCount === 'number'\n ? `Show ${resultCount.toLocaleString('en-US')} ${\n resultCount === 1 ? 'result' : 'results'\n }`\n : 'Show results'),\n rangeMinPlaceholder: labels.rangeMinPlaceholder ?? 'Min',\n rangeMaxPlaceholder: labels.rangeMaxPlaceholder ?? 'Max',\n };\n}\n\ninterface SelectFilter {\n readonly config: FilterConfig;\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly allowAll?: boolean;\n readonly allOptionLabel?: string;\n readonly clearable?: boolean;\n}\n\ninterface TextFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder?: string;\n}\n\ninterface RangeFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly minValue: string;\n readonly maxValue: string;\n readonly onMinChange: (value: string) => void;\n readonly onMaxChange: (value: string) => void;\n readonly minPlaceholder?: string;\n readonly maxPlaceholder?: string;\n readonly inputType?: 'text' | 'date';\n readonly inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode'];\n}\n\nexport interface CustomTableToolbarFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly value: string;\n readonly clearValue?: string;\n readonly clearable?: boolean;\n readonly onChange: (value: string) => void;\n readonly render: (args: {\n readonly value: string;\n readonly setValue: (value: string) => void;\n }) => ReactNode;\n}\n\nexport interface TableToolbarProps {\n readonly search?: {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n };\n readonly filters?: SelectFilter[];\n readonly textFilters?: TextFilter[];\n readonly customFilters?: CustomTableToolbarFilter[];\n readonly rangeFilters?: RangeFilter[];\n readonly renderRangeInput?: (args: {\n readonly filter: RangeFilter;\n readonly input: 'min' | 'max';\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n }) => ReactNode;\n readonly inlineControls?: ReactNode;\n readonly onClearAll?: () => void;\n readonly getDraftResultCount?: (draftValues: Record<string, string>) => number | undefined;\n readonly labels?: TableToolbarLabelsInput;\n readonly children?: ReactNode;\n}\n\nexport function TableToolbar({\n search,\n filters,\n textFilters,\n customFilters,\n rangeFilters,\n renderRangeInput,\n inlineControls,\n onClearAll,\n getDraftResultCount,\n labels,\n children,\n}: TableToolbarProps): React.ReactElement {\n const resolvedLabels = resolveTableToolbarLabels(labels);\n const isMobile = useIsMobile();\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [draftFilterValues, setDraftFilterValues] = useState<Record<string, string>>({});\n const hasFilters = Boolean(\n (filters?.length ?? 0) +\n (textFilters?.length ?? 0) +\n (customFilters?.length ?? 0) +\n (rangeFilters?.length ?? 0),\n );\n const desktopConfirmShortcutEnabled = filtersOpen && !isMobile;\n const desktopModifierLabel = useDesktopShortcutModifierLabel(desktopConfirmShortcutEnabled);\n const clearableFilters = filters?.filter((filter) => filter.clearable !== false) ?? [];\n const clearableCustomFilters =\n customFilters?.filter((filter) => filter.clearable !== false) ?? [];\n const filterValues = useMemo(\n () => ({\n ...Object.fromEntries((filters ?? []).map((filter) => [filter.config.key, filter.value])),\n ...Object.fromEntries((textFilters ?? []).map((filter) => [filter.key, filter.value])),\n ...Object.fromEntries((customFilters ?? []).map((filter) => [filter.key, filter.value])),\n ...Object.fromEntries(\n (rangeFilters ?? []).flatMap((filter) => [\n [`${filter.key}Min`, filter.minValue],\n [`${filter.key}Max`, filter.maxValue],\n ]),\n ),\n }),\n [customFilters, filters, rangeFilters, textFilters],\n );\n\n const activeFilterCount = clearableFilters.filter((filter) => filter.value !== 'all').length;\n const activeCustomFilterCount = clearableCustomFilters.filter(\n (filter) => filter.value !== (filter.clearValue ?? 'all'),\n ).length;\n const activeRangeFilterCount =\n rangeFilters?.filter((filter) => filter.minValue.trim() || filter.maxValue.trim()).length ?? 0;\n const activeTextFilterCount =\n textFilters?.filter((filter) => filter.value.trim().length > 0).length ?? 0;\n const hasDraftFilters =\n clearableFilters.some((filter) => {\n const draftValue = draftFilterValues[filter.config.key] ?? filter.value;\n return draftValue !== 'all';\n }) ||\n clearableCustomFilters.some((filter) => {\n const draftValue = draftFilterValues[filter.key] ?? filter.value;\n return draftValue !== (filter.clearValue ?? 'all');\n }) ||\n (rangeFilters ?? []).some((filter) => {\n const minValue = draftFilterValues[`${filter.key}Min`] ?? filter.minValue;\n const maxValue = draftFilterValues[`${filter.key}Max`] ?? filter.maxValue;\n return Boolean(minValue.trim() || maxValue.trim());\n }) ||\n (textFilters ?? []).some((filter) => {\n const draftValue = draftFilterValues[filter.key] ?? filter.value;\n return draftValue.trim().length > 0;\n });\n const draftResultCount = useMemo(\n () => (filtersOpen ? getDraftResultCount?.(draftFilterValues) : undefined),\n [draftFilterValues, filtersOpen, getDraftResultCount],\n );\n const applyButtonLabel = resolvedLabels.showResultsLabel(draftResultCount);\n\n function openFiltersSheet(): void {\n setDraftFilterValues(filterValues);\n setFiltersOpen(true);\n }\n\n const activeFilterTotal =\n activeFilterCount + activeCustomFilterCount + activeRangeFilterCount + activeTextFilterCount;\n\n function updateDraftFilterValue(key: string, value: string): void {\n setDraftFilterValues((currentValues) => ({\n ...currentValues,\n [key]: value,\n }));\n }\n\n function clearAndApplyFilters(): void {\n const clearedValues = Object.fromEntries(\n clearableFilters.map((filter) => [filter.config.key, 'all']),\n );\n const clearedRangeValues = Object.fromEntries(\n (rangeFilters ?? []).flatMap((filter) => [\n [`${filter.key}Min`, ''],\n [`${filter.key}Max`, ''],\n ]),\n );\n const clearedTextValues = Object.fromEntries(\n (textFilters ?? []).map((filter) => [filter.key, '']),\n );\n const clearedCustomValues = Object.fromEntries(\n clearableCustomFilters.map((filter) => [filter.key, filter.clearValue ?? 'all']),\n );\n setDraftFilterValues((currentValues) => ({\n ...currentValues,\n ...clearedValues,\n ...clearedRangeValues,\n ...clearedTextValues,\n ...clearedCustomValues,\n }));\n filters?.forEach((filter) => {\n const nextValue = filter.clearable === false ? filter.value : 'all';\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n rangeFilters?.forEach((filter) => {\n if (filter.minValue) {\n filter.onMinChange('');\n }\n if (filter.maxValue) {\n filter.onMaxChange('');\n }\n });\n textFilters?.forEach((filter) => {\n if (filter.value) {\n filter.onChange('');\n }\n });\n customFilters?.forEach((filter) => {\n const nextValue = filter.clearable === false ? filter.value : (filter.clearValue ?? 'all');\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n setFiltersOpen(false);\n }\n\n function applyDraftFilters(): void {\n filters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.config.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n rangeFilters?.forEach((filter) => {\n const nextMinValue = draftFilterValues[`${filter.key}Min`] ?? filter.minValue;\n const nextMaxValue = draftFilterValues[`${filter.key}Max`] ?? filter.maxValue;\n if (nextMinValue !== filter.minValue) {\n filter.onMinChange(nextMinValue);\n }\n if (nextMaxValue !== filter.maxValue) {\n filter.onMaxChange(nextMaxValue);\n }\n });\n textFilters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n customFilters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n setFiltersOpen(false);\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {search ? (\n <SearchInput\n value={search.value}\n onChange={search.onChange}\n placeholder={search.placeholder}\n className=\"min-w-0 flex-1 sm:w-64 sm:flex-initial\"\n />\n ) : null}\n\n {inlineControls}\n\n {hasFilters ? (\n <Button variant=\"outline\" className=\"relative gap-2\" onClick={openFiltersSheet}>\n <Filter className=\"size-4\" />\n {resolvedLabels.filtersButtonLabel}\n {activeFilterTotal > 0 ? (\n <span className=\"bg-primary text-primary-foreground absolute -top-1 -right-1 flex size-4 items-center justify-center rounded-full text-[10px]\">\n {activeFilterTotal}\n </span>\n ) : null}\n </Button>\n ) : null}\n\n {children ? (\n <div className=\"hidden sm:ml-auto sm:flex sm:items-center sm:gap-2\">{children}</div>\n ) : null}\n </div>\n\n {hasFilters ? (\n <ResponsiveSheet\n open={filtersOpen}\n onOpenChange={setFiltersOpen}\n title={resolvedLabels.filtersTitle}\n description={resolvedLabels.filtersDescription}\n onConfirm={applyDraftFilters}\n footer={\n <div className=\"flex w-full gap-2\">\n {onClearAll ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!hasDraftFilters}\n onClick={clearAndApplyFilters}\n className=\"min-w-0 flex-1\"\n >\n <X className=\"mr-1 size-4\" />\n {resolvedLabels.clearFiltersLabel}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n onClick={applyDraftFilters}\n className={cn(\n 'relative min-w-0 flex-1',\n desktopConfirmShortcutEnabled ? 'pr-12' : null,\n )}\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <span className=\"min-w-0 truncate\">{applyButtonLabel}</span>\n {desktopConfirmShortcutEnabled && desktopModifierLabel ? (\n <span className=\"absolute top-1/2 right-2 -translate-y-1/2\">\n <DesktopConfirmShortcutHint desktopModifierLabel={desktopModifierLabel} />\n </span>\n ) : null}\n </span>\n </Button>\n </div>\n }\n width={420}\n >\n <div className=\"space-y-4\">\n {filters?.map((filter) => {\n const Icon = filter.config.icon;\n\n return (\n <div key={filter.config.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.config.label}\n </span>\n <FilterDropdown\n label={filter.config.label}\n value={draftFilterValues[filter.config.key] ?? filter.value}\n options={filter.config.options}\n onChange={(value) => {\n updateDraftFilterValue(filter.config.key, value);\n }}\n className=\"w-full\"\n allowAll={filter.allowAll}\n allOptionLabel={filter.allOptionLabel}\n />\n </div>\n );\n })}\n {customFilters?.map((filter) => {\n const Icon = filter.icon;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n {filter.render({\n value: draftFilterValues[filter.key] ?? filter.value,\n setValue: (value) => {\n updateDraftFilterValue(filter.key, value);\n },\n })}\n </div>\n );\n })}\n {textFilters?.map((filter) => {\n const Icon = filter.icon;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n <Input\n type=\"text\"\n value={draftFilterValues[filter.key] ?? filter.value}\n onChange={(event) => {\n updateDraftFilterValue(filter.key, event.target.value);\n }}\n placeholder={filter.placeholder ?? filter.label}\n />\n </div>\n );\n })}\n {rangeFilters?.map((filter) => {\n const Icon = filter.icon;\n const minKey = `${filter.key}Min`;\n const maxKey = `${filter.key}Max`;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n <div className=\"grid grid-cols-2 gap-2\">\n {renderRangeInput ? (\n <>\n {renderRangeInput({\n filter,\n input: 'min',\n value: draftFilterValues[minKey] ?? filter.minValue,\n onChange: (value) => {\n updateDraftFilterValue(minKey, value);\n },\n placeholder: filter.minPlaceholder ?? resolvedLabels.rangeMinPlaceholder,\n })}\n {renderRangeInput({\n filter,\n input: 'max',\n value: draftFilterValues[maxKey] ?? filter.maxValue,\n onChange: (value) => {\n updateDraftFilterValue(maxKey, value);\n },\n placeholder: filter.maxPlaceholder ?? resolvedLabels.rangeMaxPlaceholder,\n })}\n </>\n ) : (\n <>\n <Input\n type={filter.inputType ?? 'text'}\n inputMode={filter.inputMode ?? 'decimal'}\n value={draftFilterValues[minKey] ?? filter.minValue}\n onChange={(event) => {\n updateDraftFilterValue(minKey, event.target.value);\n }}\n placeholder={filter.minPlaceholder ?? 'Min'}\n />\n <Input\n type={filter.inputType ?? 'text'}\n inputMode={filter.inputMode ?? 'decimal'}\n value={draftFilterValues[maxKey] ?? filter.maxValue}\n onChange={(event) => {\n updateDraftFilterValue(maxKey, event.target.value);\n }}\n placeholder={filter.maxPlaceholder ?? 'Max'}\n />\n </>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </ResponsiveSheet>\n ) : null}\n </div>\n );\n}\n","import { cn } from \"../utils/cn\";\n\nexport interface ErrorCodeProps {\n readonly code: string;\n readonly reference?: string | null;\n readonly className?: string;\n}\n\nexport function ErrorCode({ code, reference, className }: ErrorCodeProps): React.ReactElement {\n return (\n <p className={cn(\"text-xs text-muted-foreground/55\", className)}>\n Codice {code}\n {reference ? <span className=\"ml-2\">Rif. {reference}</span> : null}\n </p>\n );\n}\n","export type ErrorPageKind = \"error\" | \"not-found\";\n\nexport interface ErrorPageContent {\n readonly code: string;\n readonly title: string;\n readonly description: string;\n readonly shouldCapture: boolean;\n}\n\nexport interface ResolveErrorPageContentOptions {\n readonly fallbackCode?: string;\n readonly fallbackTitle?: string;\n readonly fallbackDescription?: string;\n}\n\nconst NOT_FOUND_STATUS = 404;\n\nfunction getErrorText(error: unknown): string {\n if (error instanceof Error) {\n const digest = \"digest\" in error ? String(error.digest) : \"\";\n return `${error.message} ${digest}`;\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as { readonly message?: unknown; readonly digest?: unknown };\n const message = typeof record.message === \"string\" ? record.message : \"\";\n const digest = typeof record.digest === \"string\" ? record.digest : \"\";\n return `${message} ${digest}`;\n }\n\n return typeof error === \"string\" ? error : \"\";\n}\n\nfunction getErrorStatusCode(error: unknown): number | null {\n const text = getErrorText(error);\n const fallbackMatch = /NEXT_HTTP_ERROR_FALLBACK;(\\d{3})/.exec(text);\n\n if (fallbackMatch) {\n return Number(fallbackMatch[1]);\n }\n\n const statusMatch = /\\bstatus(?:Code)?[=:]\\s*(\\d{3})\\b/i.exec(text);\n return statusMatch ? Number(statusMatch[1]) : null;\n}\n\nexport function resolveErrorPageContent(\n error: unknown,\n options: ResolveErrorPageContentOptions = {},\n): ErrorPageContent {\n if (getErrorStatusCode(error) === NOT_FOUND_STATUS) {\n return {\n code: \"404\",\n title: \"Page not found\",\n description: \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n };\n }\n\n return {\n code: options.fallbackCode ?? \"500\",\n title: options.fallbackTitle ?? \"An error occurred\",\n description:\n options.fallbackDescription ?? \"An unexpected error occurred. Please try again later.\",\n shouldCapture: true,\n };\n}\n\nexport function getNotFoundPageContent(): ErrorPageContent {\n return {\n code: \"404\",\n title: \"Page not found\",\n description: \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n };\n}\n","export interface PostHogErrorCapturePayload {\n readonly error: unknown;\n readonly code: string;\n readonly reference: string;\n readonly source?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\ninterface PostHogClient {\n capture: (eventName: string, properties?: Record<string, unknown>) => void;\n}\n\nfunction getPostHogClient(): PostHogClient | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const client = (window as typeof window & { readonly posthog?: PostHogClient }).posthog;\n return typeof client?.capture === \"function\" ? client : null;\n}\n\nfunction normalizeError(error: unknown): {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n readonly digest?: string;\n} {\n if (error instanceof Error) {\n const digest = \"digest\" in error && typeof error.digest === \"string\" ? error.digest : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n digest,\n };\n }\n\n return {\n name: \"UnknownError\",\n message: typeof error === \"string\" ? error : \"Unknown error\",\n };\n}\n\nexport function createErrorReference(error: unknown): string {\n if (error instanceof Error && \"digest\" in error && typeof error.digest === \"string\") {\n return error.digest;\n }\n\n return `err_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function captureErrorToPostHog({\n error,\n code,\n reference,\n source = \"error-page\",\n metadata,\n}: PostHogErrorCapturePayload): void {\n const posthog = getPostHogClient();\n\n if (!posthog) {\n return;\n }\n\n const normalizedError = normalizeError(error);\n\n try {\n posthog.capture(\"$exception\", {\n $exception_type: normalizedError.name,\n $exception_message: normalizedError.message,\n $exception_stack_trace: normalizedError.stack,\n code,\n digest: normalizedError.digest,\n error_reference: reference,\n pathname: window.location.pathname,\n source,\n ...metadata,\n });\n } catch {\n // Error pages must never fail while reporting an error.\n }\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils/cn\";\nimport { ErrorCode } from \"./error-code\";\nimport {\n getNotFoundPageContent,\n resolveErrorPageContent,\n type ErrorPageContent,\n} from \"./error-page-content\";\nimport { captureErrorToPostHog, createErrorReference } from \"./posthog-error-capture\";\n\nexport interface SaasErrorPageProps {\n readonly error?: Error & { readonly digest?: string };\n readonly reset?: () => void;\n readonly homeHref?: string;\n readonly homeLabel?: string;\n readonly retryLabel?: string;\n readonly source?: string;\n readonly metadata?: Record<string, unknown>;\n readonly content?: Partial<ErrorPageContent>;\n readonly className?: string;\n readonly classes?: SaasErrorPageClassNames;\n}\n\nexport interface SaasErrorPageClassNames {\n readonly root?: string;\n readonly content?: string;\n readonly code?: string;\n readonly text?: string;\n readonly title?: string;\n readonly description?: string;\n readonly actions?: string;\n}\n\nfunction resolveContent(\n error: SaasErrorPageProps[\"error\"],\n content: SaasErrorPageProps[\"content\"],\n): ErrorPageContent {\n const resolvedContent = error ? resolveErrorPageContent(error) : getNotFoundPageContent();\n\n return {\n ...resolvedContent,\n ...content,\n shouldCapture: content?.shouldCapture ?? resolvedContent.shouldCapture,\n };\n}\n\nexport function SaasErrorPage({\n error,\n reset,\n homeHref = \"/\",\n homeLabel = \"Torna alla home\",\n retryLabel = \"Riprova\",\n source,\n metadata,\n content,\n className,\n classes,\n}: SaasErrorPageProps): React.ReactElement {\n const resolvedContent = useMemo(() => resolveContent(error, content), [content, error]);\n const [reference] = useState(() => (error ? createErrorReference(error) : null));\n\n useEffect(() => {\n if (!error || !resolvedContent.shouldCapture || !reference) {\n return;\n }\n\n captureErrorToPostHog({\n error,\n code: resolvedContent.code,\n reference,\n source,\n metadata,\n });\n }, [error, metadata, reference, resolvedContent.code, resolvedContent.shouldCapture, source]);\n\n return (\n <main\n className={cn(\n \"bg-background text-foreground flex min-h-screen flex-col items-center justify-center gap-4 px-6 text-center\",\n className,\n classes?.root,\n )}\n >\n <div className={cn(\"space-y-3\", classes?.content)}>\n <p\n className={cn(\n \"text-8xl font-semibold leading-none text-muted-foreground/25 sm:text-9xl\",\n classes?.code,\n )}\n >\n {resolvedContent.code}\n </p>\n <div className={cn(\"space-y-2\", classes?.text)}>\n <h1 className={cn(\"text-2xl font-semibold tracking-tight\", classes?.title)}>\n {resolvedContent.title}\n </h1>\n <p className={cn(\"mx-auto max-w-md text-sm text-muted-foreground\", classes?.description)}>\n {resolvedContent.description}\n </p>\n </div>\n </div>\n\n <ErrorCode code={resolvedContent.code} reference={reference} />\n\n <div className={cn(\"mt-2 flex flex-wrap justify-center gap-3\", classes?.actions)}>\n {reset ? (\n <Button type=\"button\" variant=\"outline\" onClick={reset}>\n {retryLabel}\n </Button>\n ) : null}\n <Button asChild>\n <a href={homeHref}>{homeLabel}</a>\n </Button>\n </div>\n </main>\n );\n}\n\nexport interface SaasNotFoundPageProps\n extends Omit<SaasErrorPageProps, \"error\" | \"reset\" | \"content\"> {\n readonly title?: string;\n readonly description?: string;\n}\n\nexport function SaasNotFoundPage({\n title,\n description,\n ...props\n}: SaasNotFoundPageProps): React.ReactElement {\n return (\n <SaasErrorPage\n {...props}\n content={{\n code: \"404\",\n title: title ?? \"Page not found\",\n description:\n description ?? \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n }}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["AvatarPrimitive","DialogPrimitive","DropdownMenuPrimitive","DrawerPrimitive","DEFAULT_DATE_DISPLAY_LABELS: DateDisplayLabels","selectedFiles","SheetPrimitive","TooltipPrimitive","LabelPrimitive","PopoverPrimitive","TabsPrimitive","SelectPrimitive","SwitchPrimitive","fragments: string[]","bestScore: number | null","value","actionIcons: Record<ActionType, typeof Eye>","defaultActionLabels: Record<ActionType, string>"],"sources":["../src/utils/cn.ts","../src/primitives/avatar.tsx","../src/primitives/button.tsx","../src/primitives/calendar.tsx","../src/primitives/card.tsx","../src/primitives/chip-utils.ts","../src/primitives/chip.tsx","../src/primitives/dialog.tsx","../src/primitives/dropdown-menu.tsx","../src/primitives/drawer.tsx","../src/utils/date-display.ts","../src/primitives/display-date.tsx","../src/primitives/field-detail-row.tsx","../src/primitives/file-dropzone.tsx","../src/primitives/keyboard-shortcut-hint.tsx","../src/overlays/responsive-sheet.footer.tsx","../src/primitives/sheet.tsx","../src/overlays/responsive-sheet.layouts.tsx","../src/overlays/responsive-sheet.shortcuts.ts","../src/utils/use-media-query.ts","../src/overlays/responsive-sheet.tsx","../src/primitives/tooltip.tsx","../src/primitives/help-info-button.tsx","../src/primitives/input.tsx","../src/primitives/label.tsx","../src/primitives/pagination.tsx","../src/primitives/popover.tsx","../src/primitives/scroll-fade-area.tsx","../src/primitives/tabs.tsx","../src/primitives/segmented-toggle.tsx","../src/primitives/select.tsx","../src/primitives/skeleton.tsx","../src/primitives/switch.tsx","../src/primitives/table.tsx","../src/primitives/textarea.tsx","../src/primitives/user-picker-utils.ts","../src/primitives/user-picker.tsx","../src/empty-state/empty-state-card.tsx","../src/empty-state/initial-empty-state.tsx","../src/empty-state/no-results-state.tsx","../src/empty-state/collection-empty-state.ts","../src/utils/search.ts","../src/search/searchable-select-position.ts","../src/search/searchable-select.tsx","../src/smart-table/SmartTableActions.tsx","../src/smart-table/utils.ts","../src/smart-table/sorting.ts","../src/smart-table/truncated-content.utils.ts","../src/smart-table/TruncatedContent.tsx","../src/smart-table/DesktopView.tsx","../src/smart-table/MobileView.tsx","../src/smart-table/SmartTable.tsx","../src/table-toolbar/table-toolbar.tsx","../src/error-page/error-code.tsx","../src/error-page/error-page-content.ts","../src/error-page/posthog-error-capture.ts","../src/error-page/saas-error-page.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"rounded-full aspect-square size-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback\n}\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:brightness-90 [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-lg),12px)] px-2 text-xs in-data-[slot=button-group]:rounded-xl has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-lg),14px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-xl has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-lg),12px)] in-data-[slot=button-group]:rounded-xl [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-lg),14px)] in-data-[slot=button-group]:rounded-xl\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\ntype ButtonVariant =\n | \"default\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"destructive\"\n | \"link\";\ntype ButtonSize =\n | \"default\"\n | \"xs\"\n | \"sm\"\n | \"lg\"\n | \"icon\"\n | \"icon-xs\"\n | \"icon-sm\"\n | \"icon-lg\";\n\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n readonly asChild?: boolean;\n readonly size?: ButtonSize;\n readonly variant?: ButtonVariant;\n}\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\nexport type { ButtonProps, ButtonSize, ButtonVariant };\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { buttonVariants } from \"./button\"\nimport { cn } from \"../utils/cn\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: React.ComponentProps<typeof DayPicker>) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: \"flex flex-col gap-4\",\n month: \"flex flex-col gap-4\",\n month_caption: \"relative flex items-center justify-center pt-1\",\n caption_label: \"text-sm font-medium\",\n nav: \"flex items-center gap-1\",\n button_previous: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"absolute left-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100\"\n ),\n button_next: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"absolute right-1 size-7 bg-transparent p-0 opacity-70 hover:opacity-100\"\n ),\n month_grid: \"w-full border-collapse space-y-1\",\n weekdays: \"flex\",\n weekday:\n \"w-9 text-[0.78rem] font-medium text-muted-foreground\",\n week: \"mt-2 flex w-full\",\n day: \"size-9 p-0 text-sm\",\n day_button: cn(\n buttonVariants({ variant: \"ghost\", size: \"icon-sm\" }),\n \"size-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n selected:\n \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n today: \"bg-muted text-foreground\",\n outside: \"text-muted-foreground opacity-50 aria-selected:bg-primary/10 aria-selected:text-muted-foreground\",\n disabled: \"text-muted-foreground opacity-50\",\n hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation, className: iconClassName, ...iconProps }) =>\n orientation === \"left\" ? (\n <ChevronLeft className={cn(\"size-4\", iconClassName)} {...iconProps} />\n ) : (\n <ChevronRight className={cn(\"size-4\", iconClassName)} {...iconProps} />\n ),\n }}\n {...props}\n />\n )\n}\n\nexport { Calendar }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\"ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-2xl py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-2xl *:[img:last-child]:rounded-b-2xl group/card flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"gap-1 rounded-t-2xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"bg-muted/50 rounded-b-2xl border-t p-4 group-data-[size=sm]/card:p-3 flex items-center\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n}\n","export const CHIP_CLASS_NAMES = {\n default: 'inline-flex w-fit max-w-full flex-none items-center gap-1 rounded-md px-1.5 py-[2px] text-xs font-medium leading-4',\n compact: 'inline-flex w-fit max-w-full flex-none items-center gap-1 rounded-[4px] px-1.5 py-px text-[10px] font-medium leading-3',\n} as const;\n\nexport type ChipSize = keyof typeof CHIP_CLASS_NAMES;\n\nexport function getChipClassName(size: ChipSize = 'default'): string {\n return CHIP_CLASS_NAMES[size];\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';\n\nimport { getChipClassName, type ChipSize } from './chip-utils';\nimport { cn } from '../utils/cn';\n\ninterface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n readonly children: ReactNode;\n readonly leading?: ReactNode;\n readonly trailing?: ReactNode;\n readonly size?: ChipSize;\n}\n\nexport function Chip({\n children,\n className,\n leading,\n size = 'default',\n trailing,\n ...props\n}: ChipProps): React.ReactElement {\n return (\n <span\n {...props}\n className={cn(\n getChipClassName(size),\n className\n )}\n >\n {leading ? <span className=\"shrink-0\">{leading}</span> : null}\n <span className=\"truncate\">{children}</span>\n {trailing ? <span className=\"shrink-0\">{trailing}</span> : null}\n </span>\n );\n}\n\ninterface ChipButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n readonly children: ReactNode;\n readonly leading?: ReactNode;\n readonly trailing?: ReactNode;\n readonly selected?: boolean;\n readonly size?: ChipSize;\n}\n\nexport function ChipButton({\n children,\n className,\n leading,\n selected = false,\n size = 'default',\n trailing,\n ...props\n}: ChipButtonProps): React.ReactElement {\n return (\n <button\n type=\"button\"\n aria-pressed={selected}\n {...props}\n className={cn(\n getChipClassName(size),\n 'border text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n selected\n ? 'border-[#713dff] bg-[#f6f1ff] text-[#1f1f23] shadow-[0_0_0_1px_rgba(113,61,255,0.08)] hover:bg-[#f6f1ff]'\n : 'border-[#e7e8eb] bg-white text-[#5f6368] hover:bg-[#f7f7f9]',\n className\n )}\n >\n {leading ? <span className=\"shrink-0\">{leading}</span> : null}\n <span className=\"truncate\">{children}</span>\n {trailing ? <span className=\"shrink-0\">{trailing}</span> : null}\n </button>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\nimport { Button } from \"./button\"\nimport { X } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 isolate z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 grid max-w-[calc(100%-2rem)] gap-4 rounded-xl p-4 text-sm ring-1 duration-100 sm:max-w-sm fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\">\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"gap-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"bg-muted/50 -mx-4 -mb-4 rounded-b-xl border-t p-4 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-base leading-none font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground *:[a]:hover:text-foreground text-sm *:[a]:underline *:[a]:underline-offset-3\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction DropdownMenu({\n modal = false,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" modal={modal} {...props} />\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto data-[state=closed]:overflow-hidden\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-1.5 rounded-md px-1.5 py-1 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-pointer items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-pointer items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\"text-muted-foreground px-1.5 py-1 text-xs font-medium data-inset:pl-7\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuSeparator\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Drawer as DrawerPrimitive } from 'vaul';\n\nimport { cn } from '../utils/cn';\n\nfunction Drawer({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\nfunction DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 fixed inset-0 z-50 bg-black/10 backdrop-blur-xs',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n 'bg-background group/drawer-content fixed z-50 flex h-auto flex-col overflow-visible text-sm data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-r-xl data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-l-xl data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm',\n className,\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-1 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n 'flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-0.5 md:text-left',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn('text-foreground text-base font-medium', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerOverlay,\n DrawerPortal,\n DrawerTitle,\n};\n","export type DateDisplayValue = Date | number | string;\n\nexport interface DateDisplayLabels {\n readonly today: string;\n readonly yesterday: string;\n readonly daysAgo: (dayCount: number) => string;\n}\n\nexport interface DateDisplayFormatOptions {\n readonly locale?: string;\n readonly labels?: Partial<DateDisplayLabels>;\n}\n\nconst DEFAULT_DATE_DISPLAY_LABELS: DateDisplayLabels = {\n today: 'Today',\n yesterday: 'Yesterday',\n daysAgo: (dayCount) => `${String(dayCount)} days ago`,\n};\n\nfunction getDate(value: DateDisplayValue): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction getDayDifference(from: Date, to: Date): number {\n const millisecondsPerDay = 24 * 60 * 60 * 1000;\n return Math.round((startOfDay(to).getTime() - startOfDay(from).getTime()) / millisecondsPerDay);\n}\n\nfunction capitalizeMonthLabel(value: string): string {\n return value\n .split(' ')\n .map((part, index) => {\n if (index !== 1 || part.length === 0) {\n return part;\n }\n\n const [firstCharacter = '', ...restCharacters] = part;\n return `${firstCharacter.toUpperCase()}${restCharacters.join('')}`;\n })\n .join(' ');\n}\n\nexport function formatAbsoluteDate(\n value: DateDisplayValue,\n options: DateDisplayFormatOptions = {},\n): string {\n const date = getDate(value);\n const currentYear = new Date().getFullYear();\n const includesYear = date.getFullYear() !== currentYear;\n const locale = options.locale ?? 'en-US';\n\n return capitalizeMonthLabel(\n new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n ...(includesYear ? { year: 'numeric' } : {}),\n }).format(date)\n );\n}\n\nexport function formatDisplayDate(\n value: DateDisplayValue,\n options: DateDisplayFormatOptions = {},\n): string {\n const date = getDate(value);\n const dayDifference = getDayDifference(date, new Date());\n const labels = {\n ...DEFAULT_DATE_DISPLAY_LABELS,\n ...options.labels,\n };\n\n if (dayDifference === 0) {\n return labels.today;\n }\n\n if (dayDifference === 1) {\n return labels.yesterday;\n }\n\n if (dayDifference >= 2 && dayDifference <= 10) {\n return labels.daysAgo(dayDifference);\n }\n\n return formatAbsoluteDate(date, options);\n}\n","import {\n formatAbsoluteDate,\n formatDisplayDate,\n type DateDisplayValue,\n type DateDisplayFormatOptions,\n} from \"../utils/date-display\";\n\nexport interface DisplayDateProps {\n readonly value: DateDisplayValue;\n readonly formatOptions?: DateDisplayFormatOptions;\n readonly className?: string;\n}\n\nexport function DisplayDate({ value, formatOptions, className }: DisplayDateProps): React.ReactElement {\n const date = value instanceof Date ? value : new Date(value);\n\n return (\n <time dateTime={date.toISOString()} title={formatAbsoluteDate(date, formatOptions)} className={className}>\n {formatDisplayDate(date, formatOptions)}\n </time>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nexport interface FieldDetailRowProps {\n readonly icon: LucideIcon;\n readonly label: string;\n readonly value: ReactNode;\n readonly labelColumnClassName?: string;\n}\n\nexport function FieldDetailRow({\n icon: Icon,\n label,\n value,\n labelColumnClassName = \"grid-cols-[110px_minmax(0,1fr)]\",\n}: FieldDetailRowProps): React.ReactElement {\n return (\n <div className={`grid ${labelColumnClassName} items-start gap-2 py-1.5`}>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"text-[12px]\">{label}</span>\n </div>\n <div className=\"min-w-0 text-[14px] leading-5 tracking-[-0.28px] text-foreground\">\n {value}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Check, FileText, Upload, X } from 'lucide-react';\nimport { useRef, useState } from 'react';\n\nimport { Button } from './button';\nimport { cn } from '../utils/cn';\n\ninterface FileDropzoneProps {\n readonly accept?: string;\n readonly browseLabel?: string;\n readonly browseButtonClassName?: string;\n readonly className?: string;\n readonly currentPreviewUrl?: string | null;\n readonly disabled?: boolean;\n readonly emptyIcon?: React.ReactNode;\n readonly helperText?: string;\n readonly footerText?: string | null;\n readonly inputClassName?: string;\n readonly multiple?: boolean;\n readonly onFileSelect: (file: File) => void;\n readonly onFilesSelect?: (files: File[]) => void;\n readonly onRemove?: () => void;\n readonly previewAlt: string;\n readonly title?: string;\n}\n\nfunction formatFileSize(size: number): string {\n if (size < 1024) {\n return `${size} B`;\n }\n\n if (size < 1024 * 1024) {\n return `${Math.round(size / 1024)} KB`;\n }\n\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getFileTypeLabel(file: File): string {\n return file.type || file.name.split('.').pop()?.toUpperCase() || 'File';\n}\n\nexport function FileDropzone({\n accept,\n browseLabel = 'Browse',\n browseButtonClassName,\n className,\n currentPreviewUrl = null,\n disabled = false,\n emptyIcon,\n helperText,\n footerText = 'Drag a file here or click the box to select one.',\n inputClassName,\n multiple = false,\n onFileSelect,\n onFilesSelect,\n onRemove,\n previewAlt,\n title = 'Drop a file here or browse',\n}: FileDropzoneProps): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const hasSelectedFiles = selectedFiles.length > 0;\n\n const openFilePicker = (): void => {\n if (disabled) {\n return;\n }\n\n inputRef.current?.click();\n };\n\n const handleFileSelection = (files: FileList | File[] | null | undefined): void => {\n const selectedFiles = Array.from(files ?? []);\n if (selectedFiles.length === 0 || disabled) {\n return;\n }\n\n setSelectedFiles(selectedFiles);\n\n if (multiple && onFilesSelect) {\n onFilesSelect(selectedFiles);\n return;\n }\n\n const firstFile = selectedFiles[0];\n if (firstFile) {\n onFileSelect(firstFile);\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n handleFileSelection(event.target.files);\n event.target.value = '';\n };\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n handleFileSelection(event.dataTransfer.files);\n };\n\n const handleRemove = (event: React.MouseEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n setSelectedFiles([]);\n onRemove?.();\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={handleInputChange}\n disabled={disabled}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={openFilePicker}\n onKeyDown={(event): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openFilePicker();\n }\n }}\n onDragEnter={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragOver={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragLeave={(event): void => {\n event.preventDefault();\n event.stopPropagation();\n setIsDragging(false);\n }}\n onDrop={handleDrop}\n className={cn(\n 'bg-muted/30 relative flex w-full cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed px-6 py-5 text-center transition-colors outline-none',\n 'border-primary/60 hover:bg-muted/50 focus-visible:ring-primary/20 focus-visible:ring-2',\n isDragging && 'bg-muted/60',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n >\n {currentPreviewUrl ? (\n <div className=\"bg-background relative flex min-h-40 w-full items-center justify-center overflow-hidden rounded-md\">\n <img src={currentPreviewUrl} alt={previewAlt} className=\"size-full object-contain\" />\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"icon-xs\"\n className=\"absolute top-2 right-2 z-10\"\n onClick={handleRemove}\n disabled={disabled}\n >\n <X className=\"size-3.5\" />\n </Button>\n ) : null}\n {hasSelectedFiles ? (\n <div className=\"bg-background/95 absolute right-2 bottom-2 left-2 rounded-md border px-3 py-2 text-left shadow-sm backdrop-blur\">\n <p className=\"truncate text-sm font-medium\">{selectedFiles[0]?.name}</p>\n {selectedFiles[0] ? (\n <p className=\"text-muted-foreground text-xs\">\n {getFileTypeLabel(selectedFiles[0])} | {formatFileSize(selectedFiles[0].size)}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : (\n <>\n <div className=\"text-primary mb-2 flex items-center justify-center\">\n {emptyIcon ?? <Upload className=\"size-5\" />}\n </div>\n <div className=\"space-y-0.5\">\n <p className=\"text-foreground text-base font-medium\">{title}</p>\n {helperText ? <p className=\"text-muted-foreground text-sm\">{helperText}</p> : null}\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n className={cn('mt-4 shadow-[0px_1px_1px_rgba(5,32,81,0.05)]', browseButtonClassName)}\n onClick={(event): void => {\n event.stopPropagation();\n openFilePicker();\n }}\n disabled={disabled}\n >\n {browseLabel}\n </Button>\n {hasSelectedFiles ? (\n <div className=\"mt-4 w-full space-y-2\">\n {selectedFiles.map((file) => (\n <div\n key={`${file.name}-${file.size}-${file.lastModified}`}\n className=\"bg-background flex min-w-0 items-center gap-3 rounded-md border px-3 py-2 text-left\"\n >\n <FileText className=\"text-muted-foreground size-4 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{file.name}</p>\n <p className=\"text-muted-foreground text-xs\">\n {getFileTypeLabel(file)} | {formatFileSize(file.size)}\n </p>\n </div>\n <Check className=\"text-primary size-4 shrink-0\" />\n </div>\n ))}\n </div>\n ) : null}\n </>\n )}\n </div>\n {footerText ? (\n <p className={cn('text-muted-foreground mt-2 text-xs', inputClassName)}>{footerText}</p>\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport { Command } from 'lucide-react';\n\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../utils/cn';\n\nexport function KeyboardKeycap({\n children,\n className,\n}: {\n readonly children: ReactNode;\n readonly className?: string;\n}): React.ReactElement {\n return (\n <span\n className={cn(\n 'inline-flex h-4 min-w-4 items-center justify-center rounded-[4px] border px-1 text-[9px] font-semibold leading-none',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport function ShortcutModifierKeycap({\n modifierLabel,\n className,\n}: {\n readonly modifierLabel: string;\n readonly className?: string;\n}): React.ReactElement {\n return (\n <KeyboardKeycap className={className}>\n {modifierLabel === 'Cmd' ? <Command className=\"size-[10px]\" /> : 'Ctrl'}\n </KeyboardKeycap>\n );\n}\n","'use client';\n\nimport { CornerDownLeft } from 'lucide-react';\n\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\nimport { KeyboardKeycap, ShortcutModifierKeycap } from '../primitives/keyboard-shortcut-hint';\n\nexport function DesktopConfirmShortcutHint({\n desktopModifierLabel,\n}: {\n readonly desktopModifierLabel: string;\n}): React.ReactElement {\n const keycapClassName = 'border-primary-foreground/20 bg-primary-foreground/10';\n\n return (\n <span className=\"text-primary-foreground/70 inline-flex items-center gap-1\">\n <ShortcutModifierKeycap modifierLabel={desktopModifierLabel} className={keycapClassName} />\n <KeyboardKeycap className={keycapClassName}>\n <CornerDownLeft className=\"size-[10px]\" />\n </KeyboardKeycap>\n </span>\n );\n}\n\ninterface SheetActionFooterProps {\n readonly footer?: ReactNode;\n readonly onCancel?: () => void;\n readonly cancelLabel: ReactNode;\n readonly onConfirm?: () => void;\n readonly confirmLabel: ReactNode;\n readonly confirmDisabled: boolean;\n readonly confirmLoading: boolean;\n readonly desktopConfirmShortcutEnabled?: boolean;\n readonly desktopModifierLabel?: string | null;\n}\n\nexport function SheetActionFooter({\n footer,\n onCancel,\n cancelLabel,\n onConfirm,\n confirmLabel,\n confirmDisabled,\n confirmLoading,\n desktopConfirmShortcutEnabled = false,\n desktopModifierLabel = null,\n}: SheetActionFooterProps): React.ReactNode {\n if (footer) return footer;\n\n if (!onCancel && !onConfirm) return null;\n\n const actionCount = Number(Boolean(onCancel)) + Number(Boolean(onConfirm));\n const footerButtonClassName = actionCount === 1 ? 'w-full' : 'min-w-0 flex-1';\n\n return (\n <div className=\"flex w-full flex-nowrap items-center gap-2\">\n {onCancel ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n className={footerButtonClassName}\n >\n {cancelLabel}\n </Button>\n ) : null}\n {onConfirm ? (\n <Button\n type=\"button\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n className={`${footerButtonClassName} relative`}\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <span>{confirmLoading ? 'Saving...' : confirmLabel}</span>\n {desktopConfirmShortcutEnabled && desktopModifierLabel ? (\n <span className=\"absolute top-1/2 right-2 -translate-y-1/2\">\n <DesktopConfirmShortcutHint desktopModifierLabel={desktopModifierLabel} />\n </span>\n ) : null}\n </span>\n </Button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\n\nimport { Button } from './button';\nimport { cn } from '../utils/cn';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 fixed inset-0 z-50 bg-black/10 backdrop-blur-xs duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n 'bg-background data-open:animate-in data-closed:animate-out data-[side=right]:data-closed:slide-out-to-right-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=top]:data-closed:slide-out-to-top-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=bottom]:data-open:slide-in-from-bottom-10 fixed z-50 flex flex-col gap-4 overflow-visible bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:rounded-r-xl data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:rounded-l-xl data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\">\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n ) : null}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn('flex flex-col gap-0.5 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground text-base font-medium', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle };\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport type { SheetOutsideInteractionGuard } from './responsive-sheet';\nimport type { ResponsiveSheetClassNames } from './responsive-sheet';\n\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '../primitives/drawer';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '../primitives/sheet';\nimport { cn } from '../utils/cn';\n\ninterface SheetDescriptionBlockProps {\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nfunction SheetDescriptionBlock({\n title,\n description,\n classes,\n}: SheetDescriptionBlockProps): React.ReactElement {\n return (\n <>\n <SheetTitle className={classes?.title}>{title}</SheetTitle>\n {description ? (\n <SheetDescription className={classes?.description}>{description}</SheetDescription>\n ) : null}\n </>\n );\n}\n\ninterface SharedSheetLayoutProps {\n readonly open: boolean;\n readonly onOpenChange: (open: boolean) => void;\n readonly modal: boolean;\n readonly outsideInteractionGuard?: SheetOutsideInteractionGuard;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly footer: ReactNode;\n readonly mobileDrawerContentClassName?: string;\n readonly contentClassName?: string;\n readonly footerClassName?: string;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nfunction shouldPreventOutsideInteraction(\n target: EventTarget | null,\n guard?: SheetOutsideInteractionGuard,\n): boolean {\n const element =\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n\n if (!element) {\n return false;\n }\n\n if (element.closest('[data-searchable-select-content]')) {\n return true;\n }\n\n return guard?.selectors.some((selector) => element.closest(selector)) ?? false;\n}\n\ntype MobileSheetLayoutProps = SharedSheetLayoutProps;\n\nexport function MobileSheetLayout({\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n children,\n footer,\n mobileDrawerContentClassName,\n contentClassName,\n footerClassName,\n classes,\n}: MobileSheetLayoutProps): React.ReactElement {\n return (\n <Drawer open={open} onOpenChange={onOpenChange} modal={modal}>\n <DrawerContent\n aria-describedby={description ? undefined : 'responsive-sheet-description-empty'}\n className={cn(\n 'px-4 pb-[calc(env(safe-area-inset-bottom)+20px)]',\n mobileDrawerContentClassName,\n classes?.mobileContent,\n )}\n onInteractOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n onPointerDownOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n >\n <DrawerHeader className={cn('px-0 pb-4', classes?.header)}>\n <DrawerTitle className={classes?.title}>{title}</DrawerTitle>\n {description ? (\n <DrawerDescription className={classes?.description}>{description}</DrawerDescription>\n ) : (\n <DrawerDescription id=\"responsive-sheet-description-empty\" className=\"sr-only\">\n Dialog\n </DrawerDescription>\n )}\n </DrawerHeader>\n <div className=\"flex min-h-0 flex-1 flex-col gap-4\">\n <div\n className={cn(\n '-mx-1 flex-1 overflow-y-auto px-1 pb-3 [scrollbar-gutter:stable]',\n contentClassName,\n classes?.body,\n )}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn('shrink-0 border-t pt-4 pb-3', footerClassName, classes?.footer)}>\n {footer}\n </div>\n ) : null}\n </div>\n </DrawerContent>\n </Drawer>\n );\n}\n\ninterface DesktopSheetLayoutProps extends SharedSheetLayoutProps {\n readonly width: number;\n}\n\nexport function DesktopSheetLayout({\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n children,\n footer,\n width,\n contentClassName,\n footerClassName,\n classes,\n}: DesktopSheetLayoutProps): React.ReactElement {\n return (\n <Sheet open={open} onOpenChange={onOpenChange} modal={modal}>\n <SheetContent\n aria-describedby={description ? undefined : 'responsive-sheet-description-empty'}\n style={{ width: `${String(width)}px`, maxWidth: '85vw' }}\n className={cn('flex flex-col gap-0 p-0', classes?.desktopContent)}\n onInteractOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n onPointerDownOutside={(event) => {\n if (shouldPreventOutsideInteraction(event.target, outsideInteractionGuard)) {\n event.preventDefault();\n }\n }}\n >\n <SheetHeader className={cn('border-b px-4 py-4', classes?.header)}>\n <SheetDescriptionBlock title={title} description={description} classes={classes} />\n </SheetHeader>\n {description ? null : (\n <SheetDescription id=\"responsive-sheet-description-empty\" className=\"sr-only\">\n Dialog\n </SheetDescription>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div\n className={cn(\n 'flex-1 overflow-x-visible overflow-y-auto px-4 pt-4 pb-6 [scrollbar-gutter:stable]',\n contentClassName,\n classes?.body,\n )}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn('border-t px-4 py-4', footerClassName, classes?.footer)}>\n {footer}\n </div>\n ) : null}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useEffect, useState } from \"react\";\n\ninterface NavigatorWithUserAgentData extends Navigator {\n readonly userAgentData?: {\n readonly platform?: string;\n };\n}\n\nexport function getDesktopShortcutModifierLabel(): string {\n if (typeof navigator === \"undefined\") {\n return \"Ctrl\";\n }\n\n const navigatorWithUserAgentData = navigator as NavigatorWithUserAgentData;\n const platform =\n navigatorWithUserAgentData.userAgentData?.platform ?? navigator.userAgent;\n\n return /Mac|iPhone|iPad|iPod/i.test(platform) ? \"Cmd\" : \"Ctrl\";\n}\n\nexport function isAllowedConfirmShortcutEvent(\n event: KeyboardEvent,\n desktopModifierLabel: string,\n): boolean {\n if (event.key !== \"Enter\" || event.repeat || event.isComposing) {\n return false;\n }\n\n const expectsMetaKey = desktopModifierLabel === \"Cmd\";\n const usedExpectedModifier = expectsMetaKey ? event.metaKey : event.ctrlKey;\n const usedOtherModifier = expectsMetaKey ? event.ctrlKey : event.metaKey;\n const usedShiftModifier = event.shiftKey;\n const usedAltModifier = event.altKey;\n\n if (\n !usedExpectedModifier ||\n usedOtherModifier ||\n usedShiftModifier ||\n usedAltModifier\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function useDesktopShortcutModifierLabel(\n enabled: boolean,\n): string | null {\n const [desktopModifierLabel, setDesktopModifierLabel] = useState<\n string | null\n >(null);\n\n useEffect(() => {\n if (!enabled) {\n setDesktopModifierLabel(null);\n return;\n }\n\n setDesktopModifierLabel(getDesktopShortcutModifierLabel());\n }, [enabled]);\n\n return desktopModifierLabel;\n}\n\ninterface UseDesktopConfirmShortcutOptions {\n readonly open: boolean;\n readonly enabled: boolean;\n readonly confirmDisabled: boolean;\n readonly confirmLoading: boolean;\n readonly onConfirm?: () => void;\n}\n\nexport function useDesktopConfirmShortcut({\n open,\n enabled,\n confirmDisabled,\n confirmLoading,\n onConfirm,\n}: UseDesktopConfirmShortcutOptions): void {\n useEffect(() => {\n if (!open || !enabled || !onConfirm || confirmDisabled || confirmLoading) {\n return;\n }\n\n const desktopModifierLabel = getDesktopShortcutModifierLabel();\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (!isAllowedConfirmShortcutEvent(event, desktopModifierLabel)) {\n return;\n }\n\n event.preventDefault();\n onConfirm();\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [confirmDisabled, confirmLoading, enabled, onConfirm, open]);\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n const [matches, setMatches] = useState(defaultValue);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(query);\n\n const handleChange = (): void => {\n setMatches(mediaQuery.matches);\n };\n\n handleChange();\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [query]);\n\n return matches;\n}\n\nexport function useIsMobile(maxWidth = 767): boolean {\n return useMediaQuery(`(max-width: ${String(maxWidth)}px)`);\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { SheetActionFooter } from './responsive-sheet.footer';\nimport { DesktopSheetLayout, MobileSheetLayout } from './responsive-sheet.layouts';\nimport {\n useDesktopConfirmShortcut,\n useDesktopShortcutModifierLabel,\n} from './responsive-sheet.shortcuts';\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport interface SheetOutsideInteractionGuard {\n readonly selectors: readonly string[];\n}\n\nexport interface ResponsiveSheetClassNames {\n readonly desktopContent?: string;\n readonly mobileContent?: string;\n readonly header?: string;\n readonly body?: string;\n readonly footer?: string;\n readonly title?: string;\n readonly description?: string;\n}\n\nexport interface ResponsiveSheetProps {\n readonly open: boolean;\n readonly onOpenChange: (open: boolean) => void;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly footer?: ReactNode;\n readonly onCancel?: () => void;\n readonly cancelLabel?: ReactNode;\n readonly onConfirm?: () => void;\n readonly confirmLabel?: ReactNode;\n readonly confirmDisabled?: boolean;\n readonly confirmLoading?: boolean;\n readonly width?: number;\n readonly modal?: boolean;\n readonly outsideInteractionGuard?: SheetOutsideInteractionGuard;\n readonly enableDesktopConfirmShortcut?: boolean;\n readonly mobileDrawerContentClassName?: string;\n readonly className?: string;\n readonly contentClassName?: string;\n readonly footerClassName?: string;\n readonly classes?: ResponsiveSheetClassNames;\n}\n\nexport function ResponsiveSheet({\n open,\n onOpenChange,\n title,\n description,\n children,\n footer,\n onCancel,\n cancelLabel = 'Cancel',\n onConfirm,\n confirmLabel = 'Save',\n confirmDisabled = false,\n confirmLoading = false,\n width = 550,\n modal = true,\n outsideInteractionGuard,\n enableDesktopConfirmShortcut = true,\n mobileDrawerContentClassName,\n className,\n contentClassName,\n footerClassName,\n classes,\n}: ResponsiveSheetProps): React.ReactElement {\n const isMobile = useIsMobile();\n const desktopConfirmShortcutEnabled =\n !isMobile && enableDesktopConfirmShortcut && Boolean(onConfirm);\n const desktopModifierLabel = useDesktopShortcutModifierLabel(desktopConfirmShortcutEnabled);\n\n useDesktopConfirmShortcut({\n open,\n enabled: desktopConfirmShortcutEnabled,\n confirmDisabled,\n confirmLoading,\n onConfirm: onConfirm\n ? () => {\n onConfirm();\n }\n : undefined,\n });\n\n const resolvedFooter = (\n <SheetActionFooter\n footer={footer}\n onCancel={onCancel}\n cancelLabel={cancelLabel}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n confirmDisabled={confirmDisabled}\n confirmLoading={confirmLoading}\n desktopConfirmShortcutEnabled={desktopConfirmShortcutEnabled}\n desktopModifierLabel={desktopModifierLabel}\n />\n );\n const hasFooter = [footer, onCancel, onConfirm].some(\n (value) => value !== null && value !== undefined,\n );\n const sharedLayoutProps = {\n open,\n onOpenChange,\n modal,\n outsideInteractionGuard,\n title,\n description,\n footer: hasFooter ? resolvedFooter : null,\n children,\n contentClassName,\n footerClassName,\n mobileDrawerContentClassName,\n classes: {\n ...classes,\n desktopContent: cn(className, classes?.desktopContent),\n mobileContent: cn(className, mobileDrawerContentClassName, classes?.mobileContent),\n },\n };\n\n return isMobile ? (\n <MobileSheetLayout {...sharedLayoutProps} />\n ) : (\n <DesktopSheetLayout {...sharedLayoutProps} width={width} />\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md bg-foreground px-3 py-1.5 text-xs text-background z-50 w-fit max-w-[min(20rem,calc(100vw-1.5rem))] whitespace-normal break-words origin-(--radix-tooltip-content-transform-origin)\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\";\n\nimport { CircleHelp } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\n\nimport { ResponsiveSheet } from \"../overlays/responsive-sheet\";\nimport { Button } from \"./button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\nexport interface HelpInfoButtonProps {\n readonly ariaLabel: string;\n readonly tooltip: ReactNode;\n readonly title: ReactNode;\n readonly description?: ReactNode;\n readonly children: ReactNode;\n readonly width?: number;\n}\n\nexport function HelpInfoButton({\n ariaLabel,\n tooltip,\n title,\n description,\n children,\n width = 620,\n}: HelpInfoButtonProps): React.ReactElement {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 text-muted-foreground hover:text-foreground\"\n aria-label={ariaLabel}\n onClick={() => {\n setOpen(true);\n }}\n >\n <CircleHelp className=\"size-3.5\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n <ResponsiveSheet\n open={open}\n onOpenChange={setOpen}\n title={title}\n description={description}\n cancelLabel=\"Close\"\n onCancel={() => {\n setOpen(false);\n }}\n width={width}\n >\n {children}\n </ResponsiveSheet>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-8 rounded-lg border bg-transparent px-2.5 py-1 text-base transition-colors file:h-6 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","'use client';\n\nimport * as React from 'react';\nimport { Label as LabelPrimitive } from 'radix-ui';\n\nimport { cn } from '../utils/cn';\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","'use client';\n\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\n\nimport { Button } from '../primitives/button';\nimport { cn } from '../utils/cn';\n\nexport interface PaginationProps {\n /** Current page (1-indexed) */\n currentPage: number;\n /** Total number of pages */\n totalPages: number;\n /** Total number of items */\n totalItems: number;\n /** Items per page */\n pageSize: number;\n /** Start index of current page items (1-indexed for display) */\n startIndex: number;\n /** End index of current page items */\n endIndex: number;\n /** Go to specific page */\n onPageChange: (page: number) => void;\n /** Optional: page size options */\n pageSizeOptions?: number[];\n /** Optional: callback when page size changes */\n onPageSizeChange?: (size: number) => void;\n /** Optional: custom className */\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n totalItems,\n pageSize,\n startIndex,\n endIndex,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n className,\n}: PaginationProps): React.ReactElement | null {\n if (totalPages <= 1) {\n return null;\n }\n\n const hasPrevPage = currentPage > 1;\n const hasNextPage = currentPage < totalPages;\n\n return (\n <div className={cn('flex items-center justify-between gap-3 py-3', className)}>\n {/* Items info */}\n <div className=\"text-xs text-muted-foreground\">\n {totalItems === 0 ? (\n 'No items'\n ) : (\n <>\n Showing <span className=\"font-medium\">{startIndex + 1}</span> -{' '}\n <span className=\"font-medium\">{endIndex}</span> of{' '}\n <span className=\"font-medium\">{totalItems}</span>\n </>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n {/* Page size selector */}\n {pageSizeOptions && onPageSizeChange && (\n <div className=\"hidden items-center gap-1.5 sm:flex\">\n <span className=\"text-xs text-muted-foreground\">Rows:</span>\n <select\n value={String(pageSize)}\n onChange={(event) => {\n onPageSizeChange(Number(event.target.value));\n }}\n className=\"border-input bg-background h-7 w-[64px] rounded-md border px-2 text-xs\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={String(size)}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Page info */}\n <div className=\"hidden text-xs text-muted-foreground sm:block\">\n Page {currentPage} of {totalPages}\n </div>\n\n {/* Navigation buttons */}\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(1); }}\n disabled={!hasPrevPage}\n >\n <ChevronsLeft className=\"size-3.5\" />\n <span className=\"sr-only\">First page</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(currentPage - 1); }}\n disabled={!hasPrevPage}\n >\n <ChevronLeft className=\"size-3.5\" />\n <span className=\"sr-only\">Previous page</span>\n </Button>\n\n {/* Mobile page indicator */}\n <span className=\"px-1.5 text-xs sm:hidden\">\n {currentPage}/{totalPages}\n </span>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(currentPage + 1); }}\n disabled={!hasNextPage}\n >\n <ChevronRight className=\"size-3.5\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-7\"\n onClick={() => { onPageChange(totalPages); }}\n disabled={!hasNextPage}\n >\n <ChevronsRight className=\"size-3.5\" />\n <span className=\"sr-only\">Last page</span>\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n}\n","'use client';\n\nimport * as React from 'react';\n\nimport type { PointerEvent } from 'react';\n\nimport { cn } from '../utils/cn';\n\ntype ScrollFadeOrientation = 'horizontal' | 'vertical';\n\ninterface ScrollFadeAreaProps extends React.ComponentProps<'div'> {\n readonly fadeSize?: number;\n readonly orientation?: ScrollFadeOrientation;\n readonly scrollbarVisibility?: 'hidden' | 'section-hover';\n readonly viewportClassName?: string;\n}\n\ninterface VerticalScrollbarState {\n readonly isScrollable: boolean;\n readonly thumbHeight: number;\n readonly thumbTop: number;\n}\n\nconst MIN_THUMB_SIZE = 40;\nconst SCROLLBAR_INSET = 6;\n\nfunction getScrollFadeMask({\n canScrollEnd,\n canScrollStart,\n orientation,\n}: {\n readonly canScrollEnd: boolean;\n readonly canScrollStart: boolean;\n readonly orientation: ScrollFadeOrientation;\n}): string {\n const direction = orientation === 'horizontal' ? 'right' : 'bottom';\n\n if (canScrollStart && canScrollEnd) {\n return `linear-gradient(to ${direction}, transparent, black var(--scroll-fade-size), black calc(100% - var(--scroll-fade-size)), transparent)`;\n }\n\n if (canScrollStart) {\n return `linear-gradient(to ${direction}, transparent, black var(--scroll-fade-size))`;\n }\n\n if (canScrollEnd) {\n return `linear-gradient(to ${direction}, black calc(100% - var(--scroll-fade-size)), transparent)`;\n }\n\n return 'none';\n}\n\nfunction getScrollState(\n scrollArea: HTMLDivElement,\n orientation: ScrollFadeOrientation,\n): {\n canScrollEnd: boolean;\n canScrollStart: boolean;\n} {\n if (orientation === 'horizontal') {\n return {\n canScrollStart: scrollArea.scrollLeft > 1,\n canScrollEnd: scrollArea.scrollLeft + scrollArea.clientWidth < scrollArea.scrollWidth - 1,\n };\n }\n\n return {\n canScrollStart: scrollArea.scrollTop > 1,\n canScrollEnd: scrollArea.scrollTop + scrollArea.clientHeight < scrollArea.scrollHeight - 1,\n };\n}\n\nfunction getVerticalScrollbarState(scrollArea: HTMLDivElement): VerticalScrollbarState {\n const trackHeight = scrollArea.clientHeight - SCROLLBAR_INSET * 2;\n const maxScrollTop = scrollArea.scrollHeight - scrollArea.clientHeight;\n\n if (maxScrollTop <= 0 || trackHeight <= 0) {\n return {\n isScrollable: false,\n thumbHeight: 0,\n thumbTop: 0,\n };\n }\n\n const thumbHeight = Math.max(\n (scrollArea.clientHeight / scrollArea.scrollHeight) * trackHeight,\n MIN_THUMB_SIZE,\n );\n const maxThumbTop = trackHeight - thumbHeight;\n const scrollProgress = scrollArea.scrollTop / maxScrollTop;\n\n return {\n isScrollable: true,\n thumbHeight,\n thumbTop: maxThumbTop * scrollProgress,\n };\n}\n\nexport function ScrollFadeArea({\n children,\n className,\n fadeSize = 24,\n onPointerEnter,\n onPointerLeave,\n onScroll,\n orientation = 'vertical',\n scrollbarVisibility = 'hidden',\n style,\n viewportClassName,\n ...props\n}: ScrollFadeAreaProps): React.ReactElement {\n const scrollAreaRef = React.useRef<HTMLDivElement>(null);\n const dragOffsetRef = React.useRef(0);\n const [scrollState, setScrollState] = React.useState({\n canScrollStart: false,\n canScrollEnd: false,\n });\n const [verticalScrollbarState, setVerticalScrollbarState] =\n React.useState<VerticalScrollbarState>({\n isScrollable: false,\n thumbHeight: 0,\n thumbTop: 0,\n });\n const [isSectionActive, setIsSectionActive] = React.useState(false);\n const [isDraggingScrollbar, setIsDraggingScrollbar] = React.useState(false);\n const shouldRenderSectionScrollbar =\n orientation === 'vertical' && scrollbarVisibility === 'section-hover';\n const isSectionScrollbarVisible = isSectionActive || isDraggingScrollbar;\n\n const updateScrollState = React.useCallback(() => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n const nextScrollState = getScrollState(scrollArea, orientation);\n\n setScrollState((currentScrollState) => {\n if (\n currentScrollState.canScrollStart === nextScrollState.canScrollStart &&\n currentScrollState.canScrollEnd === nextScrollState.canScrollEnd\n ) {\n return currentScrollState;\n }\n\n return nextScrollState;\n });\n\n if (shouldRenderSectionScrollbar) {\n setVerticalScrollbarState(getVerticalScrollbarState(scrollArea));\n }\n }, [orientation, shouldRenderSectionScrollbar]);\n\n const scrollToThumbPosition = React.useCallback(\n (thumbTop: number): void => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n const trackHeight = scrollArea.clientHeight - SCROLLBAR_INSET * 2;\n const maxThumbTop = trackHeight - verticalScrollbarState.thumbHeight;\n const maxScrollTop = scrollArea.scrollHeight - scrollArea.clientHeight;\n const clampedThumbTop = Math.min(Math.max(thumbTop, 0), maxThumbTop);\n const scrollProgress = maxThumbTop > 0 ? clampedThumbTop / maxThumbTop : 0;\n\n scrollArea.scrollTop = maxScrollTop * scrollProgress;\n updateScrollState();\n },\n [updateScrollState, verticalScrollbarState.thumbHeight],\n );\n\n function handleTrackPointerDown(event: PointerEvent<HTMLDivElement>): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n\n scrollToThumbPosition(event.nativeEvent.offsetY - verticalScrollbarState.thumbHeight / 2);\n }\n\n function handleThumbPointerDown(event: PointerEvent<HTMLDivElement>): void {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n setIsDraggingScrollbar(true);\n dragOffsetRef.current = event.clientY - SCROLLBAR_INSET - verticalScrollbarState.thumbTop;\n }\n\n function handleThumbPointerMove(event: PointerEvent<HTMLDivElement>): void {\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) {\n return;\n }\n\n scrollToThumbPosition(event.clientY - SCROLLBAR_INSET - dragOffsetRef.current);\n }\n\n function handleThumbPointerUp(event: PointerEvent<HTMLDivElement>): void {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n\n setIsDraggingScrollbar(false);\n }\n\n React.useEffect(() => {\n const scrollArea = scrollAreaRef.current;\n\n if (!scrollArea) {\n return;\n }\n\n updateScrollState();\n\n const resizeObserver = new ResizeObserver(updateScrollState);\n resizeObserver.observe(scrollArea);\n\n if (scrollArea.firstElementChild) {\n resizeObserver.observe(scrollArea.firstElementChild);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [children, updateScrollState]);\n\n const maskImage = getScrollFadeMask({\n canScrollEnd: scrollState.canScrollEnd,\n canScrollStart: scrollState.canScrollStart,\n orientation,\n });\n const maskStyle = {\n '--scroll-fade-size': `${String(fadeSize)}px`,\n WebkitMaskImage: maskImage,\n maskImage,\n } satisfies React.CSSProperties & Record<'--scroll-fade-size', string>;\n\n return (\n <div\n className={cn('group/scroll-fade relative min-h-0 min-w-0', className)}\n style={style}\n onPointerEnter={(event) => {\n setIsSectionActive(true);\n onPointerEnter?.(event);\n }}\n onPointerLeave={(event) => {\n setIsSectionActive(false);\n onPointerLeave?.(event);\n }}\n {...props}\n >\n <div\n ref={scrollAreaRef}\n className={cn(\n 'min-h-0 min-w-0',\n orientation === 'horizontal' ? 'overflow-x-auto' : 'h-full overflow-y-auto',\n '[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n viewportClassName,\n )}\n style={maskStyle}\n onScroll={(event) => {\n updateScrollState();\n onScroll?.(event);\n }}\n >\n {children}\n </div>\n {shouldRenderSectionScrollbar && verticalScrollbarState.isScrollable ? (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'absolute top-1.5 right-0 bottom-1.5 z-10 w-3 transition-opacity duration-150',\n isSectionScrollbarVisible\n ? 'pointer-events-auto opacity-100'\n : 'pointer-events-none opacity-0',\n )}\n data-section-scrollbar=\"true\"\n onPointerDown={handleTrackPointerDown}\n >\n <div\n className=\"absolute right-1 w-1.5 rounded-full bg-black/15 transition-colors hover:bg-black/25\"\n onPointerDown={handleThumbPointerDown}\n onPointerMove={handleThumbPointerMove}\n onPointerUp={handleThumbPointerUp}\n onPointerCancel={handleThumbPointerUp}\n style={{\n height: `${String(verticalScrollbarState.thumbHeight)}px`,\n transform: `translateY(${String(verticalScrollbarState.thumbTop)}px)`,\n }}\n />\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tabs as TabsPrimitive } from 'radix-ui';\n\nimport { ScrollFadeArea } from './scroll-fade-area';\nimport { cn } from '../utils/cn';\n\nfunction Tabs({\n className,\n orientation = 'horizontal',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn('group/tabs flex gap-2 data-horizontal:flex-col', className)}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n 'gap-2 rounded-lg p-[3px] group-data-horizontal/tabs:h-8 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col',\n {\n variants: {\n variant: {\n default: 'bg-muted',\n line: 'gap-2 bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction TabsScrollArea({\n className,\n viewportClassName,\n ...props\n}: React.ComponentProps<typeof ScrollFadeArea>) {\n return (\n <ScrollFadeArea\n {...props}\n data-slot=\"tabs-scroll-area\"\n orientation=\"horizontal\"\n className={cn('w-full min-w-0', className)}\n viewportClassName={cn('min-w-0', viewportClassName)}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent',\n 'data-active:bg-background dark:data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 data-active:text-foreground',\n 'after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn('flex-1 text-sm outline-none', className)}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsScrollArea, TabsTrigger, TabsContent, tabsListVariants };\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { Tabs, TabsList, TabsScrollArea, TabsTrigger } from './tabs';\nimport { cn } from '../utils/cn';\n\nexport interface SegmentedToggleOption<TValue extends string> {\n readonly value: TValue;\n readonly label: string;\n readonly icon?: ReactNode;\n}\n\nexport interface SegmentedToggleProps<TValue extends string> {\n readonly value: TValue;\n readonly onChange: (value: TValue) => void;\n readonly options: readonly SegmentedToggleOption<TValue>[];\n readonly disabled?: boolean;\n readonly className?: string;\n readonly variant?: 'default' | 'primary';\n readonly scrollable?: boolean;\n}\n\nexport function SegmentedToggle<TValue extends string>({\n value,\n onChange,\n options,\n disabled = false,\n className,\n variant = 'default',\n scrollable = false,\n}: SegmentedToggleProps<TValue>): React.ReactElement {\n const isPrimaryVariant = variant === 'primary';\n\n return (\n <Tabs\n value={value}\n onValueChange={(nextValue) => {\n if (nextValue) {\n onChange(nextValue as TValue);\n }\n }}\n className={cn('w-full', disabled && 'opacity-50', className)}\n >\n {scrollable ? (\n <TabsScrollArea>\n <TabsList\n className={cn(\n 'w-full min-w-max',\n isPrimaryVariant &&\n 'border-border bg-background h-8 gap-0.5 rounded-lg border p-0.5 shadow-none',\n )}\n >\n {options.map((option) => (\n <TabsTrigger\n key={option.value}\n value={option.value}\n disabled={disabled}\n className={cn(\n 'shrink-0',\n isPrimaryVariant && [\n 'text-foreground h-full gap-1.5 rounded-md px-2 py-0 text-[13px] leading-5 font-medium tracking-[-0.28px] shadow-none',\n 'hover:text-foreground',\n 'data-active:border-border data-active:bg-accent data-active:text-accent-foreground data-active:shadow-none',\n '[&_svg:not([class*=size-])]:size-4',\n ],\n )}\n >\n {option.icon}\n {option.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </TabsScrollArea>\n ) : (\n <TabsList\n className={cn(\n 'w-full',\n isPrimaryVariant &&\n 'border-border bg-background h-8 gap-0.5 rounded-lg border p-0.5 shadow-none',\n )}\n >\n {options.map((option) => (\n <TabsTrigger\n key={option.value}\n value={option.value}\n disabled={disabled}\n className={cn(\n 'flex-1',\n isPrimaryVariant && [\n 'text-foreground h-full gap-1.5 rounded-md px-2 py-0 text-[13px] leading-5 font-medium tracking-[-0.28px] shadow-none',\n 'hover:text-foreground',\n 'data-active:border-border data-active:bg-accent data-active:text-accent-foreground data-active:shadow-none',\n '[&_svg:not([class*=size-])]:size-4',\n ],\n )}\n >\n {option.icon}\n {option.label}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n </Tabs>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-lg border bg-transparent py-1 pr-2 pl-2 text-sm transition-colors select-none focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronsUpDown className=\"text-muted-foreground size-4 pointer-events-none\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-[250px] rounded-lg shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"pointer-events-none size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronUp />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronDown />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectItem,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectTrigger,\n SelectValue,\n}\n","import { cn } from \"../utils/cn\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-md animate-pulse\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../utils/cn\"\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background pointer-events-none block size-5 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[22px] data-[state=unchecked]:translate-x-0.5\"\n )}\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","'use client';\n\nimport * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Table({ className, ...props }: React.ComponentProps<'table'>) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full min-w-0 overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn('w-full min-w-0 caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return <thead data-slot=\"table-header\" className={cn('[&_tr]:border-b', className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<'th'>) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n 'text-foreground h-10 overflow-hidden px-2 text-left align-middle font-medium text-ellipsis whitespace-nowrap [&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'overflow-hidden p-2 align-middle text-ellipsis whitespace-nowrap [&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import * as React from 'react';\n\nimport { cn } from '../utils/cn';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 min-h-24 rounded-lg border bg-transparent px-3 py-2 text-base transition-colors placeholder:text-muted-foreground w-full min-w-0 resize-y outline-none focus-visible:ring-3 aria-invalid:ring-3 md:text-sm disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","export interface UserPickerOption {\n readonly value: string;\n readonly label?: string | null;\n readonly email?: string | null;\n readonly imageUrl?: string | null;\n readonly archived?: boolean;\n readonly searchText?: string;\n}\n\nexport interface UserPickerCopy {\n readonly fallbackName?: string;\n readonly singlePlaceholder?: string;\n readonly multiplePlaceholder?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly selectedSingleLabel?: string;\n readonly selectedPluralLabel?: string;\n readonly formatSelectedCount?: (count: number) => string;\n}\n\nexport function formatUserDisplayName(\n user: UserPickerOption,\n fallbackName = 'User',\n): string {\n const label = user.label?.trim();\n if (label) {\n return label;\n }\n\n const email = user.email?.trim();\n if (email) {\n return email;\n }\n\n return fallbackName;\n}\n\nexport function formatSelectedUserSummary(\n selectedUsers: readonly UserPickerOption[],\n copy: UserPickerCopy = {},\n): string {\n const selectedNames = selectedUsers\n .slice(0, 2)\n .map((user) => formatUserDisplayName(user, copy.fallbackName));\n const remainingCount = selectedUsers.length - selectedNames.length;\n\n if (remainingCount <= 0) {\n return selectedNames.join(', ');\n }\n\n const remainingLabel =\n remainingCount === 1\n ? copy.selectedSingleLabel ?? 'person'\n : copy.selectedPluralLabel ?? 'people';\n\n return `${selectedNames.join(', ')} +${String(remainingCount)} ${remainingLabel}`;\n}\n\nexport function buildUserInitials(user: UserPickerOption, fallbackName?: string): string {\n const displayName = formatUserDisplayName(user, fallbackName);\n const nameParts = displayName\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2);\n\n if (nameParts.length > 1) {\n return nameParts.map((part) => part[0]?.toUpperCase()).join('');\n }\n\n return displayName[0]?.toUpperCase() ?? 'U';\n}\n\nexport function filterSelectableUsers(\n users: readonly UserPickerOption[],\n selectedValues: readonly string[],\n): UserPickerOption[] {\n const selectedValueSet = new Set(selectedValues);\n\n return users.filter((user) => !user.archived || selectedValueSet.has(user.value));\n}\n\nexport function filterUsersBySearch(\n users: readonly UserPickerOption[],\n search: string,\n fallbackName?: string,\n): UserPickerOption[] {\n const normalizedSearch = search.trim().toLowerCase();\n\n if (!normalizedSearch) {\n return [...users];\n }\n\n return users.filter((user) => {\n const searchableText = [\n formatUserDisplayName(user, fallbackName),\n user.email,\n user.searchText,\n ].filter(Boolean).join(' ').toLowerCase();\n\n return searchableText.includes(normalizedSearch);\n });\n}\n\nexport function toggleUserSelection(\n selectedValues: readonly string[],\n toggledValue: string,\n): string[] {\n if (selectedValues.includes(toggledValue)) {\n return selectedValues.filter((value) => value !== toggledValue);\n }\n\n return [...selectedValues, toggledValue];\n}\n","'use client';\n\nimport { Check, ChevronDown, Search } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport {\n buildUserInitials,\n filterUsersBySearch,\n filterSelectableUsers,\n formatUserDisplayName,\n formatSelectedUserSummary,\n toggleUserSelection,\n type UserPickerCopy,\n type UserPickerOption,\n} from './user-picker-utils';\n\nimport { Avatar, AvatarFallback, AvatarImage } from './avatar';\nimport { Button } from './button';\nimport { Input } from './input';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { cn } from '../utils/cn';\n\ninterface BaseUserPickerProps {\n readonly options: readonly UserPickerOption[];\n readonly placeholder?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly disabled?: boolean;\n readonly className?: string;\n readonly triggerClassName?: string;\n readonly copy?: UserPickerCopy;\n}\n\ninterface SingleUserPickerProps extends BaseUserPickerProps {\n readonly mode: 'single';\n readonly value?: string;\n readonly onValueChange: (value: string | undefined) => void;\n}\n\ninterface MultipleUserPickerProps extends BaseUserPickerProps {\n readonly mode: 'multiple';\n readonly value: readonly string[];\n readonly onValueChange: (value: string[]) => void;\n}\n\nexport type UserPickerProps = SingleUserPickerProps | MultipleUserPickerProps;\n\nfunction UserAvatar({ user, className, fallbackName }: {\n readonly user: UserPickerOption;\n readonly className?: string;\n readonly fallbackName?: string;\n}): React.ReactElement {\n return (\n <Avatar size=\"sm\" className={className}>\n {user.imageUrl ? <AvatarImage src={user.imageUrl} alt={formatUserDisplayName(user, fallbackName)} /> : null}\n <AvatarFallback>{buildUserInitials(user, fallbackName)}</AvatarFallback>\n </Avatar>\n );\n}\n\nfunction UserRow({\n user,\n fallbackName,\n}: {\n readonly user: UserPickerOption;\n readonly fallbackName?: string;\n}): React.ReactElement {\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <UserAvatar user={user} fallbackName={fallbackName} />\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium\">{formatUserDisplayName(user, fallbackName)}</span>\n {user.email ? (\n <span className=\"block truncate text-xs text-muted-foreground\">{user.email}</span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction MultipleUserValue({ selectedUsers, placeholder, copy }: {\n readonly selectedUsers: readonly UserPickerOption[];\n readonly placeholder: string;\n readonly copy: UserPickerCopy;\n}): React.ReactElement {\n if (selectedUsers.length === 0) {\n return <span className=\"text-muted-foreground\">{placeholder}</span>;\n }\n\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"flex -space-x-2\">\n {selectedUsers.slice(0, 3).map((user) => (\n <UserAvatar\n key={user.value}\n user={user}\n className=\"ring-2 ring-background\"\n fallbackName={copy.fallbackName}\n />\n ))}\n </span>\n <span className=\"truncate\">\n {copy.formatSelectedCount\n ? copy.formatSelectedCount(selectedUsers.length)\n : formatSelectedUserSummary(selectedUsers, copy)}\n </span>\n </span>\n );\n}\n\nexport function UserPicker(props: UserPickerProps): React.ReactElement {\n const {\n options,\n copy = {},\n placeholder = props.mode === 'single'\n ? copy.singlePlaceholder ?? 'Select person'\n : copy.multiplePlaceholder ?? 'Select people',\n searchPlaceholder = copy.searchPlaceholder ?? 'Search people...',\n emptyMessage = copy.emptyMessage ?? 'No people available',\n disabled = false,\n className,\n triggerClassName,\n } = props;\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const singleValue = props.mode === 'single' ? props.value : undefined;\n const multipleValue = props.mode === 'multiple' ? props.value : undefined;\n const selectedValues = useMemo(\n () => (props.mode === 'single' ? (singleValue ? [singleValue] : []) : [...(multipleValue ?? [])]),\n [multipleValue, props.mode, singleValue],\n );\n const selectedValueSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectableUsers = useMemo(\n () => filterSelectableUsers(options, selectedValues),\n [options, selectedValues],\n );\n const filteredUsers = useMemo(\n () => filterUsersBySearch(selectableUsers, search, copy.fallbackName),\n [copy.fallbackName, search, selectableUsers],\n );\n const selectedUsers = selectedValues\n .map((selectedValue) => options.find((option) => option.value === selectedValue))\n .filter((user): user is UserPickerOption => Boolean(user));\n const selectedUser = selectedUsers[0];\n\n function selectUser(userValue: string): void {\n if (props.mode === 'single') {\n props.onValueChange(userValue);\n setOpen(false);\n return;\n }\n\n props.onValueChange(toggleUserSelection(props.value, userValue));\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div className={cn('relative', className)}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n 'h-9 w-full justify-between gap-2 px-2 text-left font-normal',\n selectedValues.length === 0 && 'text-muted-foreground',\n triggerClassName,\n )}\n >\n <span className=\"min-w-0 flex-1\">\n {props.mode === 'single' ? (\n selectedUser ? <UserRow user={selectedUser} fallbackName={copy.fallbackName} /> : <span>{placeholder}</span>\n ) : (\n <MultipleUserValue selectedUsers={selectedUsers} placeholder={placeholder} copy={copy} />\n )}\n </span>\n <ChevronDown className=\"size-4 shrink-0 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n data-searchable-select-content=\"\"\n className=\"w-[var(--radix-popover-trigger-width)] min-w-72 p-2\"\n >\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(event) => {\n setSearch(event.target.value);\n }}\n placeholder={searchPlaceholder}\n className=\"h-8 pl-8\"\n />\n </div>\n <div className=\"max-h-72 space-y-1 overflow-y-auto\">\n {filteredUsers.map((user) => {\n const selected = selectedValueSet.has(user.value);\n\n return (\n <button\n key={user.value}\n type=\"button\"\n className={cn(\n 'flex w-full items-center justify-between gap-3 rounded-md px-2 py-2 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground',\n selected && 'bg-muted/70',\n )}\n onClick={() => {\n selectUser(user.value);\n }}\n >\n <UserRow user={user} fallbackName={copy.fallbackName} />\n {selected ? <Check className=\"size-4 shrink-0\" /> : null}\n </button>\n );\n })}\n {filteredUsers.length === 0 ? (\n <p className=\"px-2 py-4 text-sm text-muted-foreground\">{emptyMessage}</p>\n ) : null}\n </div>\n </PopoverContent>\n </div>\n </Popover>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { Card, CardContent } from \"../primitives/card\";\nimport { cn } from \"../utils/cn\";\n\nexport interface EmptyStateCardProps {\n readonly icon: ReactNode;\n readonly title: string;\n readonly subtitle: string;\n readonly actionLabel?: string;\n readonly onAction?: () => void;\n readonly actionHref?: string;\n readonly actionTarget?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n readonly actionRel?: string;\n readonly actionDisabled?: boolean;\n readonly actionIcon?: ReactNode;\n readonly className?: string;\n}\n\nexport function EmptyStateCard({\n icon,\n title,\n subtitle,\n actionLabel,\n onAction,\n actionHref,\n actionTarget = \"_self\",\n actionRel,\n actionDisabled = false,\n actionIcon,\n className,\n}: EmptyStateCardProps): React.ReactElement {\n const hasLinkAction = actionLabel !== undefined && actionHref !== undefined;\n const hasButtonAction = actionLabel !== undefined && onAction !== undefined;\n const hasDisabledAction = actionLabel !== undefined && actionDisabled;\n const hasAction = hasLinkAction || hasButtonAction || hasDisabledAction;\n\n return (\n <Card className={cn(\"w-full border border-dashed border-border shadow-none ring-0\", className)}>\n <CardContent className=\"flex flex-col items-center justify-start px-6 py-10 text-center\">\n <div className=\"mb-4 flex size-14 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n {icon}\n </div>\n <div className=\"space-y-1.5\">\n <h3 className=\"text-lg font-medium tracking-tight\">{title}</h3>\n <p className=\"max-w-2xl text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n {hasAction ? (\n hasLinkAction ? (\n <Button asChild className=\"mt-5\" disabled={actionDisabled}>\n <a href={actionHref} target={actionTarget} rel={actionRel}>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </a>\n </Button>\n ) : hasDisabledAction ? (\n <Button className=\"mt-5\" disabled>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </Button>\n ) : (\n <Button className=\"mt-5\" onClick={onAction} disabled={actionDisabled}>\n {actionIcon ? <span className=\"mr-2 inline-flex items-center\">{actionIcon}</span> : null}\n {actionLabel}\n </Button>\n )\n ) : null}\n </CardContent>\n </Card>\n );\n}\n","import { Inbox } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { EmptyStateCard } from \"./empty-state-card\";\n\nexport interface InitialEmptyStateProps {\n readonly icon?: ReactNode;\n readonly title: string;\n readonly subtitle: string;\n readonly actionLabel?: string;\n readonly onAction?: () => void;\n readonly actionIcon?: ReactNode;\n readonly className?: string;\n}\n\nexport function InitialEmptyState({\n icon = <Inbox className=\"size-7\" />,\n title,\n subtitle,\n actionLabel,\n onAction,\n actionIcon,\n className,\n}: InitialEmptyStateProps): React.ReactElement {\n return (\n <EmptyStateCard\n icon={icon}\n title={title}\n subtitle={subtitle}\n actionLabel={actionLabel}\n onAction={onAction}\n actionIcon={actionIcon}\n className={className}\n />\n );\n}\n","import { SearchX } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { EmptyStateCard } from \"./empty-state-card\";\n\nexport interface NoResultsStateProps {\n readonly icon?: ReactNode;\n readonly title?: string;\n readonly subtitle?: string;\n readonly className?: string;\n}\n\nexport function NoResultsState({\n icon = <SearchX className=\"size-7\" />,\n title = \"No results\",\n subtitle = \"Try changing your search or filters.\",\n className,\n}: NoResultsStateProps): React.ReactElement {\n return <EmptyStateCard icon={icon} title={title} subtitle={subtitle} className={className} />;\n}\n","export type CollectionEmptyState = \"none\" | \"initial\" | \"no-results\";\n\nexport interface ResolveCollectionEmptyStateOptions {\n readonly totalCount: number;\n readonly filteredCount: number;\n readonly hasSearch?: boolean;\n readonly hasFilters?: boolean;\n}\n\nexport function resolveCollectionEmptyState({\n totalCount,\n filteredCount,\n hasSearch = false,\n hasFilters = false,\n}: ResolveCollectionEmptyStateOptions): CollectionEmptyState {\n if (filteredCount > 0) {\n return \"none\";\n }\n\n if (totalCount === 0) {\n return \"initial\";\n }\n\n if (hasSearch || hasFilters) {\n return \"no-results\";\n }\n\n return \"initial\";\n}\n","function normalizeSearchValue(value: string): string {\n return value\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeSearchValue(value)\n .split(' ')\n .filter((token) => token.length > 0);\n}\n\nfunction flattenSearchPart(\n part: SearchTextPart,\n fragments: string[],\n): void {\n if (typeof part === 'string') {\n const normalized = part.trim();\n if (normalized.length > 0) {\n fragments.push(normalized);\n }\n return;\n }\n\n if (!part) {\n return;\n }\n\n for (const nestedPart of part) {\n flattenSearchPart(nestedPart, fragments);\n }\n}\n\nfunction getMaxDistance(term: string): number {\n if (term.length <= 4) {\n return 1;\n }\n\n if (term.length <= 8) {\n return 2;\n }\n\n return 3;\n}\n\nfunction damerauLevenshtein(left: string, right: string): number {\n const rows = left.length + 1;\n const columns = right.length + 1;\n const matrix = Array.from({ length: rows }, () => Array<number>(columns).fill(0));\n\n for (let row = 0; row < rows; row += 1) {\n const matrixRow = matrix[row];\n if (!matrixRow) {\n continue;\n }\n matrixRow[0] = row;\n }\n\n for (let column = 0; column < columns; column += 1) {\n const firstRow = matrix[0];\n if (!firstRow) {\n return 0;\n }\n firstRow[column] = column;\n }\n\n for (let row = 1; row < rows; row += 1) {\n const currentRow = matrix[row];\n const previousRow = matrix[row - 1];\n if (!currentRow || !previousRow) {\n continue;\n }\n\n for (let column = 1; column < columns; column += 1) {\n const substitutionCost = left[row - 1] === right[column - 1] ? 0 : 1;\n const leftCost = currentRow[column - 1];\n const topCost = previousRow[column];\n const diagonalCost = previousRow[column - 1];\n\n if (\n leftCost === undefined ||\n topCost === undefined ||\n diagonalCost === undefined\n ) {\n continue;\n }\n\n currentRow[column] = Math.min(\n topCost + 1,\n leftCost + 1,\n diagonalCost + substitutionCost,\n );\n\n if (\n row > 1 &&\n column > 1 &&\n left[row - 1] === right[column - 2] &&\n left[row - 2] === right[column - 1]\n ) {\n const transpositionRow = matrix[row - 2];\n const transpositionCost = transpositionRow?.[column - 2];\n\n if (transpositionCost !== undefined) {\n currentRow[column] = Math.min(currentRow[column] ?? Number.POSITIVE_INFINITY, transpositionCost + 1);\n }\n }\n }\n }\n\n return matrix[left.length]?.[right.length] ?? 0;\n}\n\nfunction scoreTokenMatch(\n searchTerm: string,\n candidateToken: string,\n isLastTerm: boolean,\n): number | null {\n if (candidateToken === searchTerm) {\n return 120;\n }\n\n if (isLastTerm && candidateToken.startsWith(searchTerm)) {\n return 90 - Math.max(candidateToken.length - searchTerm.length, 0);\n }\n\n const distance = damerauLevenshtein(searchTerm, candidateToken);\n if (distance > getMaxDistance(searchTerm)) {\n return null;\n }\n\n return 70 - distance * 10 - Math.abs(candidateToken.length - searchTerm.length);\n}\n\nexport type SearchTextPart =\n | string\n | null\n | undefined\n | readonly SearchTextPart[];\n\nexport function buildSearchText(...parts: SearchTextPart[]): string {\n const fragments: string[] = [];\n\n for (const part of parts) {\n flattenSearchPart(part, fragments);\n }\n\n return fragments.join(' ').replace(/\\s+/g, ' ').trim();\n}\n\nexport function scoreFuzzyMatch(query: string, candidate: string): number | null {\n const normalizedQuery = normalizeSearchValue(query);\n if (normalizedQuery.length === 0) {\n return 0;\n }\n\n const queryTerms = tokenize(normalizedQuery);\n const candidateTerms = tokenize(candidate);\n const normalizedCandidate = normalizeSearchValue(candidate);\n\n if (queryTerms.length === 0 || candidateTerms.length === 0) {\n return null;\n }\n\n let score = normalizedCandidate.includes(normalizedQuery) ? 40 : 0;\n\n for (const [index, queryTerm] of queryTerms.entries()) {\n let bestScore: number | null = null;\n\n for (const candidateTerm of candidateTerms) {\n const tokenScore = scoreTokenMatch(\n queryTerm,\n candidateTerm,\n index === queryTerms.length - 1,\n );\n\n if (tokenScore !== null && (bestScore === null || tokenScore > bestScore)) {\n bestScore = tokenScore;\n }\n }\n\n if (bestScore === null) {\n return null;\n }\n\n score += bestScore;\n }\n\n return score;\n}\n\nexport function filterAndRankBySearch<T extends { searchText: string }>(\n items: readonly T[],\n query: string,\n): T[] {\n const normalizedQuery = normalizeSearchValue(query);\n\n if (normalizedQuery.length === 0) {\n return [...items];\n }\n\n return items\n .map((item) => ({\n item,\n score: scoreFuzzyMatch(normalizedQuery, item.searchText),\n }))\n .filter((result): result is { item: T; score: number } => result.score !== null)\n .sort((left, right) => right.score - left.score)\n .map((result) => result.item);\n}\n\nexport function rankBySearch<T>(\n items: readonly T[],\n query: string,\n getSearchText: (item: T) => string,\n): T[] {\n return filterAndRankBySearch(\n items.map((item) => ({\n item,\n searchText: getSearchText(item),\n })),\n query,\n ).map((result) => result.item);\n}\n","export interface SearchableSelectRect {\n readonly top: number;\n readonly left: number;\n readonly right: number;\n readonly bottom: number;\n readonly width: number;\n readonly height: number;\n}\n\ninterface ResolveSearchableSelectDropdownPositionArgs {\n readonly triggerRect: SearchableSelectRect;\n readonly boundaryRect?: SearchableSelectRect;\n readonly portalRect?: SearchableSelectRect;\n readonly contentWidth: number;\n readonly contentHeight: number;\n readonly viewportWidth: number;\n readonly viewportHeight: number;\n readonly offset?: number;\n readonly padding?: number;\n}\n\ninterface SearchableSelectDropdownPosition {\n readonly top: number;\n readonly left: number;\n readonly width: number;\n readonly maxHeight: number;\n readonly direction: 'up' | 'down';\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n\n return Math.min(Math.max(value, min), max);\n}\n\nexport function resolveSearchableSelectDropdownPosition({\n triggerRect,\n boundaryRect,\n portalRect,\n contentWidth,\n contentHeight,\n viewportWidth,\n viewportHeight,\n offset = 8,\n padding = 8,\n}: ResolveSearchableSelectDropdownPositionArgs): SearchableSelectDropdownPosition {\n const boundaryLeftEdge = boundaryRect?.left ?? 0;\n const boundaryRightEdge = boundaryRect?.right ?? viewportWidth;\n const boundaryTopEdge = boundaryRect?.top ?? 0;\n const boundaryBottomEdge = boundaryRect?.bottom ?? viewportHeight;\n const boundaryLeft = Math.max(padding, boundaryLeftEdge + padding);\n const boundaryRight = Math.min(\n viewportWidth - padding,\n boundaryRightEdge - padding,\n );\n const boundaryTop = Math.max(padding, boundaryTopEdge + padding);\n const boundaryBottom = Math.min(\n viewportHeight - padding,\n boundaryBottomEdge - padding,\n );\n const availableWidth = Math.max(0, boundaryRight - boundaryLeft);\n const width = Math.min(contentWidth, availableWidth);\n const alignedRightLeft = triggerRect.right - width;\n const defaultLeft = triggerRect.left;\n const shouldAlignRight =\n defaultLeft + width > boundaryRight && alignedRightLeft >= boundaryLeft;\n const left = clamp(\n shouldAlignRight ? alignedRightLeft : defaultLeft,\n boundaryLeft,\n boundaryRight - width,\n );\n\n const spaceAbove = triggerRect.top - boundaryTop;\n const spaceBelow = boundaryBottom - triggerRect.bottom;\n const shouldOpenUp = spaceBelow < contentHeight + offset && spaceAbove > spaceBelow;\n const direction = shouldOpenUp ? 'up' : 'down';\n const maxHeight = Math.max(\n 120,\n Math.floor((shouldOpenUp ? spaceAbove : spaceBelow) - offset),\n );\n const renderedHeight = Math.min(contentHeight, maxHeight);\n const viewportTop = shouldOpenUp\n ? Math.max(boundaryTop, triggerRect.top - offset - renderedHeight)\n : Math.min(boundaryBottom - renderedHeight, triggerRect.bottom + offset);\n\n return {\n top: viewportTop - (portalRect?.top ?? 0),\n left: left - (portalRect?.left ?? 0),\n width,\n maxHeight,\n direction,\n };\n}\n","'use client';\n\nimport { Check, ChevronDown, Search } from 'lucide-react';\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { buildSearchText, rankBySearch } from '../utils/search';\n\nimport type { LucideIcon } from 'lucide-react';\n\nimport { Input } from '../primitives/input';\nimport { cn } from '../utils/cn';\nimport { resolveSearchableSelectDropdownPosition } from './searchable-select-position';\n\nexport const AUTO_SEARCHABLE_SELECT_THRESHOLD = 5;\n\nexport interface SearchableSelectOption {\n readonly value: string;\n readonly label: string;\n readonly searchText?: string;\n}\n\nexport interface SearchableSelectProps<TOption extends SearchableSelectOption> {\n readonly value: string;\n readonly onValueChange: (value: string) => void;\n readonly options: readonly TOption[];\n readonly placeholder?: string;\n readonly disabled?: boolean;\n readonly className?: string;\n readonly triggerClassName?: string;\n readonly contentClassName?: string;\n readonly ariaLabel?: string;\n readonly searchPlaceholder?: string;\n readonly emptyMessage?: string;\n readonly leadingIcon?: LucideIcon;\n readonly searchThreshold?: number;\n readonly size?: 'sm' | 'default';\n readonly renderOption?: (option: TOption) => React.ReactNode;\n readonly renderValue?: (option: TOption) => React.ReactNode;\n}\n\ninterface SearchableSelectBoundaryElement {\n contains(target: EventTarget | null): boolean;\n}\n\ninterface SearchableSelectPortalAnchor {\n closest(selectors: string): Element | null;\n}\n\nconst SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR =\n '[data-slot=\"sheet-content\"], [data-slot=\"drawer-content\"]';\n\nfunction getSearchableSelectBoundaryRect(element: HTMLElement): DOMRect | undefined {\n return element.closest(SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR)?.getBoundingClientRect();\n}\n\nexport function isSearchableSelectPointerInside(\n target: EventTarget | null,\n triggerContainer: SearchableSelectBoundaryElement | null,\n dropdownContent: SearchableSelectBoundaryElement | null,\n): boolean {\n return Boolean(triggerContainer?.contains(target) || dropdownContent?.contains(target));\n}\n\nexport function getSearchableSelectPortalContainer(\n trigger: SearchableSelectPortalAnchor | null,\n): Element | null {\n return trigger?.closest(SEARCHABLE_SELECT_MODAL_CONTENT_SELECTOR) ?? null;\n}\n\nexport function SearchableSelect<TOption extends SearchableSelectOption>({\n value,\n onValueChange,\n options,\n placeholder = 'Select...',\n disabled = false,\n className,\n triggerClassName,\n contentClassName,\n ariaLabel,\n searchPlaceholder = 'Search...',\n emptyMessage = 'No results found',\n leadingIcon: LeadingIcon,\n searchThreshold = AUTO_SEARCHABLE_SELECT_THRESHOLD,\n size = 'default',\n renderOption,\n renderValue,\n}: SearchableSelectProps<TOption>): React.ReactElement {\n const selectId = useId();\n const [isOpen, setIsOpen] = useState(false);\n const [isMounted, setIsMounted] = useState(false);\n const [search, setSearch] = useState('');\n const [highlightedOptionIndex, setHighlightedOptionIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const optionRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [portalContainer, setPortalContainer] = useState<Element | null>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n const selectedOption = options.find((option) => option.value === value);\n const showSearchInput = options.length > searchThreshold;\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n function closeOtherSearchableSelects(event: Event): void {\n if (event instanceof CustomEvent && event.detail !== selectId) {\n setIsOpen(false);\n }\n }\n\n window.addEventListener('searchable-select:open', closeOtherSearchableSelects);\n\n return () => {\n window.removeEventListener('searchable-select:open', closeOtherSearchableSelects);\n };\n }, [selectId]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n window.dispatchEvent(new CustomEvent('searchable-select:open', { detail: selectId }));\n }, [isOpen, selectId]);\n\n useEffect(() => {\n if (!showSearchInput || !isOpen) {\n setSearch('');\n return;\n }\n\n requestAnimationFrame(() => {\n searchInputRef.current?.focus();\n });\n }, [isOpen, showSearchInput]);\n\n useEffect(() => {\n function handlePointerDown(event: PointerEvent): void {\n if (isSearchableSelectPointerInside(event.target, containerRef.current, contentRef.current)) {\n return;\n }\n\n setIsOpen(false);\n }\n\n if (!isOpen) {\n return undefined;\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n };\n }, [isOpen]);\n\n const filteredOptions = useMemo(\n () =>\n rankBySearch(options, search, (option) => buildSearchText(option.label, option.searchText)),\n [options, search],\n );\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const selectedIndex = filteredOptions.findIndex((option) => option.value === value);\n if (selectedIndex >= 0) {\n setHighlightedOptionIndex(selectedIndex);\n return;\n }\n\n setHighlightedOptionIndex(0);\n }, [filteredOptions, isOpen, value]);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\n\n if (filteredOptions.length === 0) {\n setHighlightedOptionIndex(0);\n return;\n }\n\n setHighlightedOptionIndex((currentValue) => Math.min(currentValue, filteredOptions.length - 1));\n }, [filteredOptions]);\n\n useEffect(() => {\n if (!isOpen || filteredOptions.length === 0) {\n return;\n }\n\n optionRefs.current[highlightedOptionIndex]?.scrollIntoView({ block: 'nearest' });\n }, [filteredOptions.length, highlightedOptionIndex, isOpen]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setDropdownPosition(null);\n setPortalContainer(null);\n return;\n }\n\n function updateDropdownPosition(): void {\n const trigger = triggerRef.current;\n const content = contentRef.current;\n\n if (!trigger || !content) {\n return;\n }\n\n const nextPortalContainer = getSearchableSelectPortalContainer(trigger);\n setPortalContainer(nextPortalContainer);\n\n const triggerRect = trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const nextPosition = resolveSearchableSelectDropdownPosition({\n triggerRect,\n boundaryRect: getSearchableSelectBoundaryRect(trigger),\n portalRect: nextPortalContainer?.getBoundingClientRect(),\n contentWidth: Math.max(triggerRect.width, contentRect.width, 250),\n contentHeight: contentRect.height,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n\n setDropdownPosition((currentValue) => {\n if (\n currentValue?.top === nextPosition.top &&\n currentValue?.left === nextPosition.left &&\n currentValue?.width === nextPosition.width &&\n currentValue?.maxHeight === nextPosition.maxHeight\n ) {\n return currentValue;\n }\n\n return nextPosition;\n });\n }\n\n updateDropdownPosition();\n const animationFrameId = window.requestAnimationFrame(updateDropdownPosition);\n\n window.addEventListener('resize', updateDropdownPosition);\n window.addEventListener('scroll', updateDropdownPosition, true);\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n window.removeEventListener('resize', updateDropdownPosition);\n window.removeEventListener('scroll', updateDropdownPosition, true);\n };\n }, [filteredOptions.length, isOpen, search, showSearchInput]);\n\n function selectHighlightedOption(): void {\n const highlightedOption = filteredOptions[highlightedOptionIndex];\n\n if (!highlightedOption) {\n return;\n }\n\n onValueChange(highlightedOption.value);\n setIsOpen(false);\n }\n\n function selectOption(value: string): void {\n onValueChange(value);\n setIsOpen(false);\n }\n\n function moveHighlightedOption(direction: 'up' | 'down'): void {\n if (filteredOptions.length === 0) {\n return;\n }\n\n setHighlightedOptionIndex((currentValue) => {\n if (direction === 'down') {\n return (currentValue + 1) % filteredOptions.length;\n }\n\n return (currentValue - 1 + filteredOptions.length) % filteredOptions.length;\n });\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n disabled={disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n }}\n className={cn(\n 'border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 flex w-full items-center justify-between gap-1.5 rounded-lg border bg-transparent py-1 pr-2 pl-2 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3',\n size === 'sm' ? 'h-7 rounded-[min(var(--radius-md),10px)]' : 'h-8',\n triggerClassName,\n )}\n >\n {LeadingIcon ? (\n <LeadingIcon className=\"text-muted-foreground size-4 shrink-0\" strokeWidth={1.8} />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {selectedOption ? (\n (renderValue?.(selectedOption) ?? selectedOption.label)\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </span>\n <ChevronDown\n className={cn(\n 'text-muted-foreground size-4 shrink-0 transition-transform',\n isOpen && 'rotate-180',\n )}\n />\n </button>\n\n {isOpen && isMounted\n ? createPortal(\n <div\n ref={contentRef}\n data-searchable-select-content=\"\"\n className={cn(\n 'bg-popover text-popover-foreground pointer-events-auto z-[60] min-w-0 rounded-xl border p-2 shadow-lg',\n portalContainer ? 'absolute' : 'fixed',\n contentClassName,\n )}\n style={{\n top: dropdownPosition?.top ?? 0,\n left: dropdownPosition?.left ?? 0,\n width: dropdownPosition?.width ?? triggerRef.current?.getBoundingClientRect().width,\n visibility: dropdownPosition ? 'visible' : 'hidden',\n }}\n >\n {showSearchInput ? (\n <div className=\"relative mb-2\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n ref={searchInputRef}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveHighlightedOption('down');\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveHighlightedOption('up');\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n selectHighlightedOption();\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n setIsOpen(false);\n }\n }}\n placeholder={searchPlaceholder}\n className=\"pl-9\"\n />\n </div>\n ) : null}\n\n <div\n className=\"space-y-1 overflow-y-auto\"\n style={{\n maxHeight: Math.min(256, dropdownPosition?.maxHeight ?? 256),\n }}\n >\n {filteredOptions.map((option, index) => {\n const isSelected = option.value === value;\n\n return (\n <button\n key={option.value}\n ref={(element) => {\n optionRefs.current[index] = element;\n }}\n type=\"button\"\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex h-auto w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm transition-colors',\n isSelected && 'bg-muted/60',\n highlightedOptionIndex === index && 'bg-accent text-accent-foreground',\n )}\n onMouseEnter={() => setHighlightedOptionIndex(index)}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectOption(option.value);\n }}\n onClick={(event) => {\n if (event.detail === 0) {\n selectOption(option.value);\n }\n }}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {renderOption?.(option) ?? option.label}\n </span>\n {isSelected ? <Check className=\"size-4 shrink-0\" /> : null}\n </button>\n );\n })}\n\n {filteredOptions.length === 0 ? (\n <p className=\"text-muted-foreground px-2 py-4 text-sm\">{emptyMessage}</p>\n ) : null}\n </div>\n </div>,\n portalContainer ?? document.body,\n )\n : null}\n </div>\n );\n}\n","'use client';\n\nimport { Eye, Pencil, Trash2 } from 'lucide-react';\n\nimport type { ActionHandlers, ActionLabels, ActionType } from './types';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\n\nconst SMART_TABLE_ACTIONS_CONTAINER_CLASS = 'flex w-full items-center justify-end gap-1';\n\ninterface SmartTableActionsProps<T> {\n item: T;\n actions?: ActionType[];\n actionLabels?: ActionLabels;\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n}\n\nconst actionIcons: Record<ActionType, typeof Eye> = {\n view: Eye,\n edit: Pencil,\n delete: Trash2,\n};\n\nconst defaultActionLabels: Record<ActionType, string> = {\n view: 'View',\n edit: 'Edit',\n delete: 'Delete',\n};\n\nexport function SmartTableActions<T>({\n item,\n actions,\n actionLabels,\n actionHandlers,\n renderActions,\n}: SmartTableActionsProps<T>): React.ReactElement | null {\n if (renderActions) {\n return <div className={SMART_TABLE_ACTIONS_CONTAINER_CLASS}>{renderActions(item)}</div>;\n }\n\n if (!actions || !actionHandlers) {\n return null;\n }\n\n return (\n <div className={SMART_TABLE_ACTIONS_CONTAINER_CLASS}>\n {actions.map((action) => {\n const Icon = actionIcons[action];\n const handler = actionHandlers[\n `on${action.charAt(0).toUpperCase()}${action.slice(1)}` as keyof ActionHandlers<T>\n ];\n\n return (\n <Button\n key={action}\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n aria-label={actionLabels?.[action] ?? defaultActionLabels[action]}\n onClick={(event) => {\n event.stopPropagation();\n (handler as ((value: T) => void) | undefined)?.(item);\n }}\n >\n <Icon className=\"size-4\" />\n </Button>\n );\n })}\n </div>\n );\n}\n","import { createElement } from 'react';\n\nimport type { Column } from './types';\nimport type { ReactNode } from 'react';\n\n\nimport { DisplayDate } from '../primitives/display-date';\nimport { formatDisplayDate } from '../utils/date-display';\n\nfunction formatListEntry(value: unknown): string {\n const formatted = formatValue(value);\n\n if (typeof formatted === 'string' || typeof formatted === 'number') {\n return String(formatted);\n }\n\n return '—';\n}\n\n/**\n * Get nested value from object using dot notation\n * e.g., getNestedValue(obj, 'user.profile.name')\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n return path.split('.').reduce((acc, key) => {\n if (acc && typeof acc === 'object' && key in acc) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): ReactNode {\n if (value === null || value === undefined) {\n return '—';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return createElement(DisplayDate, { value });\n }\n\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '—';\n }\n\n return value.map((entry) => formatListEntry(entry)).join(', ');\n }\n\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n\n for (const key of ['label', 'name', 'title']) {\n const nestedValue = record[key];\n if (typeof nestedValue === 'string' || typeof nestedValue === 'number') {\n return String(nestedValue);\n }\n }\n }\n\n return '[Object]';\n}\n\nfunction formatValueAsText(value: unknown): string | null {\n if (value === null || value === undefined) {\n return '—';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return formatDisplayDate(value);\n }\n\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '—';\n }\n\n return value.map((entry) => formatValueAsText(entry) ?? '—').join(', ');\n }\n\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n\n for (const key of ['label', 'name', 'title']) {\n const nestedValue = record[key];\n if (typeof nestedValue === 'string' || typeof nestedValue === 'number') {\n return String(nestedValue);\n }\n }\n }\n\n return null;\n}\n\nexport function getColumnValue<T>(column: Column<T>, item: T): unknown {\n if (!column.accessor) {\n return null;\n }\n\n if (typeof column.accessor === 'string' && column.accessor.includes('.')) {\n return getNestedValue(item, column.accessor);\n }\n\n return (item as Record<string, unknown>)[column.accessor as string];\n}\n\nexport function renderColumnValue<T>(column: Column<T>, item: T): ReactNode {\n const value = getColumnValue(column, item);\n\n if (column.render) {\n return column.render(value, item);\n }\n\n return formatValue(value);\n}\n\nexport function getColumnTooltipText<T>(column: Column<T>, item: T): string | null {\n if (column.render) {\n return null;\n }\n\n return formatValueAsText(getColumnValue(column, item));\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\n\nimport { getColumnValue } from './utils';\n\nimport type { Column, SortDirection, SortState, SortValue } from './types';\n\ninterface UseTableSortingOptions<T> {\n readonly data: readonly T[];\n readonly columns: readonly Column<T>[];\n readonly initialSortState?: SortState;\n}\n\ninterface UseTableSortingResult<T> {\n readonly sortedData: T[];\n readonly sortState: SortState;\n readonly setSortState: (state: SortState) => void;\n}\n\nexport function getColumnSortKey<T>(column: Column<T>): string | null {\n if (column.sortable === false) {\n return null;\n }\n\n if (column.sortKey) {\n return column.sortKey;\n }\n\n return typeof column.accessor === 'string' ? column.accessor : null;\n}\n\nexport function getNextSortState(currentState: SortState, key: string): SortState {\n if (currentState?.key !== key) {\n return { key, direction: 'asc' };\n }\n\n if (currentState.direction === 'asc') {\n return { key, direction: 'desc' };\n }\n\n return null;\n}\n\nfunction normalizeSortValue(value: SortValue): string | number | boolean | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n return value;\n}\n\nfunction compareSortValues(left: SortValue, right: SortValue): number {\n const leftValue = normalizeSortValue(left);\n const rightValue = normalizeSortValue(right);\n\n if (leftValue === null && rightValue === null) {\n return 0;\n }\n\n if (leftValue === null) {\n return 1;\n }\n\n if (rightValue === null) {\n return -1;\n }\n\n if (typeof leftValue === 'number' && typeof rightValue === 'number') {\n return leftValue - rightValue;\n }\n\n if (typeof leftValue === 'boolean' && typeof rightValue === 'boolean') {\n return Number(leftValue) - Number(rightValue);\n }\n\n return String(leftValue).localeCompare(String(rightValue), 'it', {\n numeric: true,\n sensitivity: 'base',\n });\n}\n\nfunction getSortValue<T>(column: Column<T>, row: T): SortValue {\n if (column.sortAccessor) {\n return column.sortAccessor(row);\n }\n\n return getColumnValue(column, row) as SortValue;\n}\n\nfunction getSortColumn<T>(\n columns: readonly Column<T>[],\n sortState: SortState,\n): Column<T> | null {\n if (!sortState) {\n return null;\n }\n\n return columns.find((column) => getColumnSortKey(column) === sortState.key) ?? null;\n}\n\nfunction applyDirection(value: number, direction: SortDirection): number {\n return direction === 'asc' ? value : -value;\n}\n\nfunction sortTableData<T>(\n data: readonly T[],\n columns: readonly Column<T>[],\n sortState: SortState,\n): T[] {\n const sortColumn = getSortColumn(columns, sortState);\n\n if (!sortColumn || !sortState) {\n return [...data];\n }\n\n return data\n .map((row, index) => ({ row, index }))\n .sort((left, right) => {\n const compared = compareSortValues(\n getSortValue(sortColumn, left.row),\n getSortValue(sortColumn, right.row),\n );\n\n return compared === 0\n ? left.index - right.index\n : applyDirection(compared, sortState.direction);\n })\n .map(({ row }) => row);\n}\n\nexport function useTableSorting<T>({\n data,\n columns,\n initialSortState = null,\n}: UseTableSortingOptions<T>): UseTableSortingResult<T> {\n const [sortState, setSortState] = useState(initialSortState);\n const sortedData = useMemo(\n () => sortTableData(data, columns, sortState),\n [columns, data, sortState],\n );\n\n return { sortedData, sortState, setSortState };\n}\n","import type { ColumnAlign } from './types';\n\nexport function getTruncatedContentAlignmentClass(\n align?: ColumnAlign\n): string {\n if (align === 'right') {\n return 'text-right';\n }\n\n if (align === 'center') {\n return 'text-center';\n }\n\n return 'text-left';\n}\n\nexport function shouldRenderTooltipTrigger(options: {\n tooltip?: string | null;\n isOverflowing: boolean;\n}): boolean {\n return Boolean(options.tooltip) && options.isOverflowing;\n}\n","'use client';\n\nimport {\n getTruncatedContentAlignmentClass,\n shouldRenderTooltipTrigger,\n} from './truncated-content.utils';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { ReactNode } from 'react';\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../primitives/tooltip';\n\ninterface TruncatedContentProps {\n children: ReactNode;\n tooltip?: string | null;\n align?: 'left' | 'right' | 'center';\n className?: string;\n}\n\nexport function TruncatedContent({\n children,\n tooltip,\n align = 'left',\n className = '',\n}: TruncatedContentProps): React.ReactElement {\n const contentRef = useRef<HTMLDivElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n\n const updateOverflowState = (): boolean => {\n const element = contentRef.current;\n if (!element) {\n setIsOverflowing(false);\n return false;\n }\n\n const overflowing = element.scrollWidth > element.clientWidth + 1;\n setIsOverflowing(overflowing);\n return overflowing;\n };\n\n useEffect(() => {\n const element = contentRef.current;\n if (!element) {\n return;\n }\n\n updateOverflowState();\n\n const resizeObserver = new ResizeObserver(() => {\n updateOverflowState();\n });\n\n resizeObserver.observe(element);\n window.addEventListener('resize', updateOverflowState);\n\n return () => {\n resizeObserver.disconnect();\n window.removeEventListener('resize', updateOverflowState);\n };\n }, [children, className, align, tooltip]);\n\n useEffect(() => {\n if (!isOverflowing && isOpen) {\n setIsOpen(false);\n }\n }, [isOpen, isOverflowing]);\n\n const alignmentClass = getTruncatedContentAlignmentClass(align);\n const showTooltipTrigger = shouldRenderTooltipTrigger({\n tooltip,\n isOverflowing,\n });\n\n const content = (\n <div\n ref={contentRef}\n className={[\n 'block min-w-0 w-full truncate',\n alignmentClass,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </div>\n );\n\n if (!showTooltipTrigger) {\n return content;\n }\n\n return (\n <Tooltip\n delayDuration={100}\n open={isOverflowing ? isOpen : false}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n setIsOpen(false);\n return;\n }\n\n setIsOpen(updateOverflowState());\n }}\n >\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className={[\n 'block min-w-0 w-full overflow-hidden bg-transparent p-0 text-inherit outline-none',\n alignmentClass,\n isOverflowing ? 'cursor-help' : 'cursor-default',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseEnter={() => {\n updateOverflowState();\n }}\n onFocus={() => {\n updateOverflowState();\n }}\n onClick={(event) => {\n event.stopPropagation();\n const overflowing = updateOverflowState();\n if (overflowing) {\n setIsOpen((previous) => !previous);\n }\n }}\n >\n {content}\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align={align === 'right' ? 'end' : align === 'center' ? 'center' : 'start'}\n sideOffset={6}\n collisionPadding={12}\n avoidCollisions\n className=\"w-[min(20rem,calc(100vw-1.5rem))] max-w-[calc(100vw-1.5rem)] whitespace-normal break-words text-left\"\n >\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react';\n\nimport { SmartTableActions } from './SmartTableActions';\nimport { getColumnSortKey, getNextSortState } from './sorting';\nimport { TruncatedContent } from './TruncatedContent';\nimport { getColumnTooltipText, renderColumnValue } from './utils';\n\nimport type {\n ActionHandlers,\n ActionLabels,\n ActionType,\n Column,\n PaginationConfig,\n SortDirection,\n SortState,\n} from './types';\nimport type { ReactNode } from 'react';\n\nimport { Pagination } from '../primitives/pagination';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../primitives/table';\nimport { cn } from '../utils/cn';\n\ninterface DesktopViewProps<T> {\n data: T[];\n columns: Column<T>[];\n isLoading: boolean;\n skeletonRows: number;\n actions?: ActionType[];\n actionLabels?: ActionLabels;\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n noDataMessage: string;\n noDataContent?: ReactNode;\n getRowKey: (item: T) => string | number;\n onRowClick?: (item: T) => void;\n pagination?: PaginationConfig;\n stickyHeader?: boolean;\n maxHeight?: string;\n fullHeight?: boolean;\n sortState?: SortState;\n onSortChange?: (state: SortState) => void;\n}\n\nconst ACTION_COLUMN_WIDTH_PX = 112;\nconst ACTION_CELL_CLASS_NAME = 'w-28 min-w-28 overflow-visible whitespace-nowrap text-right';\n\nfunction SortIcon({\n activeDirection,\n}: {\n readonly activeDirection?: SortDirection;\n}): React.ReactElement {\n if (activeDirection === 'asc') {\n return <ArrowUp className=\"size-3.5\" aria-hidden=\"true\" />;\n }\n\n if (activeDirection === 'desc') {\n return <ArrowDown className=\"size-3.5\" aria-hidden=\"true\" />;\n }\n\n return <ChevronsUpDown className=\"size-3.5 opacity-45\" aria-hidden=\"true\" />;\n}\n\nfunction SortableHeaderContent<T>({\n column,\n sortState,\n onSortChange,\n}: {\n readonly column: Column<T>;\n readonly sortState?: SortState;\n readonly onSortChange?: (state: SortState) => void;\n}): React.ReactElement {\n const sortKey = getColumnSortKey(column);\n const activeDirection = sortState?.key === sortKey ? sortState.direction : undefined;\n\n if (!sortKey || !onSortChange) {\n return <>{column.header}</>;\n }\n\n return (\n <button\n type=\"button\"\n className={cn(\n 'hover:text-foreground focus-visible:ring-ring inline-flex max-w-full items-center gap-1.5 rounded-sm text-left font-medium transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',\n column.align === 'right' && 'ml-auto',\n column.align === 'center' && 'mx-auto',\n )}\n aria-label={`Sort by ${column.header}`}\n onClick={() => {\n onSortChange(getNextSortState(sortState ?? null, sortKey));\n }}\n >\n <span className=\"truncate\">{column.header}</span>\n <SortIcon activeDirection={activeDirection} />\n </button>\n );\n}\n\nexport function DesktopView<T>({\n data,\n columns,\n isLoading,\n skeletonRows,\n actions,\n actionLabels,\n actionHandlers,\n renderActions,\n noDataMessage,\n noDataContent,\n getRowKey,\n onRowClick,\n pagination,\n stickyHeader = false,\n maxHeight = 'calc(100vh - 300px)',\n fullHeight = false,\n sortState,\n onSortChange,\n}: DesktopViewProps<T>): React.ReactElement {\n const resolvedNoDataContent = noDataContent ?? noDataMessage;\n const hasActions = (actions?.length ?? 0) > 0 || renderActions !== undefined;\n const actionColumnWidth = hasActions ? `${String(ACTION_COLUMN_WIDTH_PX)}px` : undefined;\n const specifiedPercentageWidth = columns.reduce((total, column) => {\n if (typeof column.width === 'string' && column.width.endsWith('%')) {\n const parsedWidth = Number.parseFloat(column.width);\n return Number.isNaN(parsedWidth) ? total : total + parsedWidth;\n }\n\n return total;\n }, 0);\n const actionWidthPercentage = 0;\n const remainingPercentageForDataColumns = Math.max(\n 0,\n 100 - specifiedPercentageWidth - actionWidthPercentage,\n );\n const columnsWithoutWidth = columns.filter((column) => column.width === undefined).length;\n const defaultPercentageWidth =\n columnsWithoutWidth > 0 && remainingPercentageForDataColumns > 0\n ? `${String(remainingPercentageForDataColumns / columnsWithoutWidth)}%`\n : undefined;\n\n const columnGroup = (\n <colgroup>\n {columns.map((column) => (\n <col key={column.header} style={{ width: column.width ?? defaultPercentageWidth }} />\n ))}\n {hasActions && actionColumnWidth ? (\n <col style={{ width: actionColumnWidth, minWidth: actionColumnWidth }} />\n ) : null}\n </colgroup>\n );\n\n const tableHeader = (\n <TableHeader className={cn(stickyHeader && 'bg-muted/50 sticky top-0 z-10 backdrop-blur-sm')}>\n <TableRow>\n {columns.map((col) => (\n <TableHead\n key={col.header}\n style={{ width: col.width }}\n aria-sort={\n sortState?.key === getColumnSortKey(col)\n ? sortState.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n className={\n col.align === 'right' ? 'text-right' : col.align === 'center' ? 'text-center' : ''\n }\n >\n <SortableHeaderContent column={col} sortState={sortState} onSortChange={onSortChange} />\n </TableHead>\n ))}\n {hasActions ? (\n <TableHead\n style={\n actionColumnWidth\n ? { width: actionColumnWidth, minWidth: actionColumnWidth }\n : undefined\n }\n className=\"w-28 min-w-28 overflow-visible text-right whitespace-nowrap\"\n >\n Actions\n </TableHead>\n ) : null}\n </TableRow>\n </TableHeader>\n );\n\n // Determine scrollable container styles\n const scrollContainerClass = cn(\n 'min-w-0 rounded-lg border overflow-x-auto',\n fullHeight && 'flex-1 min-h-0 overflow-y-auto',\n !fullHeight && stickyHeader && 'overflow-y-auto',\n );\n const scrollContainerStyle = !fullHeight && stickyHeader ? { maxHeight } : undefined;\n\n if (isLoading) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className={scrollContainerClass} style={scrollContainerStyle}>\n <Table className=\"table-fixed\">\n {columnGroup}\n {tableHeader}\n <TableBody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <TableRow key={i}>\n {columns.map((col) => (\n <TableCell key={col.header}>\n <Skeleton className=\"h-5 w-full\" />\n </TableCell>\n ))}\n {hasActions ? (\n <TableCell className={ACTION_CELL_CLASS_NAME}>\n <div className=\"flex w-full justify-end\">\n <Skeleton className=\"h-8 w-20\" />\n </div>\n </TableCell>\n ) : null}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className=\"w-full py-0\">\n {typeof resolvedNoDataContent === 'string' ? (\n <div className=\"text-muted-foreground\">{resolvedNoDataContent}</div>\n ) : (\n resolvedNoDataContent\n )}\n </div>\n {pagination && pagination.totalItems > 0 && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n }\n\n return (\n <div className={cn('flex flex-col', fullHeight && 'min-h-0 flex-1')}>\n <div className={scrollContainerClass} style={scrollContainerStyle}>\n <Table className=\"table-fixed\">\n {columnGroup}\n {tableHeader}\n <TableBody>\n {data.map((item) => (\n <TableRow\n key={getRowKey(item)}\n className={onRowClick ? 'hover:bg-muted/50 cursor-pointer' : ''}\n onClick={() => onRowClick?.(item)}\n >\n {columns.map((col) => (\n <TableCell\n key={col.header}\n className={cn(\n 'max-w-0',\n col.align === 'right'\n ? 'text-right'\n : col.align === 'center'\n ? 'text-center'\n : '',\n )}\n >\n {col.truncate === false ? (\n <div\n className={cn(\n 'block w-full min-w-0',\n col.align === 'right'\n ? 'text-right'\n : col.align === 'center'\n ? 'text-center'\n : 'text-left',\n )}\n >\n {renderColumnValue(col, item)}\n </div>\n ) : (\n <TruncatedContent align={col.align} tooltip={getColumnTooltipText(col, item)}>\n {renderColumnValue(col, item)}\n </TruncatedContent>\n )}\n </TableCell>\n ))}\n {hasActions ? (\n <TableCell className={ACTION_CELL_CLASS_NAME}>\n <SmartTableActions\n item={item}\n actions={actions}\n actionLabels={actionLabels}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n />\n </TableCell>\n ) : null}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n {pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { SmartTableActions } from './SmartTableActions';\nimport { TruncatedContent } from './TruncatedContent';\nimport { getColumnTooltipText, renderColumnValue } from './utils';\n\nimport type { ActionHandlers, ActionLabels, ActionType, Column, PaginationConfig } from './types';\nimport type { ReactNode } from 'react';\n\nimport { Pagination } from '../primitives/pagination';\nimport { Card, CardContent } from '../primitives/card';\nimport { Skeleton } from '../primitives/skeleton';\nimport { cn } from '../utils/cn';\n\ninterface MobileViewProps<T> {\n data: T[];\n columns: Column<T>[];\n isLoading: boolean;\n skeletonRows: number;\n actions?: ActionType[];\n actionLabels?: ActionLabels;\n actionHandlers?: ActionHandlers<T>;\n renderActions?: (item: T) => ReactNode;\n noDataMessage: string;\n noDataContent?: ReactNode;\n getRowKey: (item: T) => string | number;\n onRowClick?: (item: T) => void;\n renderMobileCard?: (item: T) => ReactNode;\n pagination?: PaginationConfig;\n fullHeight?: boolean;\n}\n\nexport function MobileView<T>({\n data,\n columns,\n isLoading,\n skeletonRows,\n actions,\n actionLabels,\n actionHandlers,\n renderActions,\n noDataMessage,\n noDataContent,\n getRowKey,\n onRowClick,\n renderMobileCard,\n pagination,\n fullHeight = false,\n}: MobileViewProps<T>): React.ReactElement {\n const resolvedNoDataContent = noDataContent ?? noDataMessage;\n const visibleColumns = columns.filter((col) => !col.hideOnMobile);\n const hasActions = (actions?.length ?? 0) > 0 || renderActions !== undefined;\n\n const paginationComponent = pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n totalItems={pagination.totalItems}\n pageSize={pagination.pageSize}\n startIndex={pagination.startIndex}\n endIndex={pagination.endIndex}\n onPageChange={pagination.onPageChange}\n />\n );\n\n if (isLoading) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className={cn('space-y-2', fullHeight && 'flex-1 min-h-0 overflow-auto px-px')}>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <Card key={i} size=\"sm\" className=\"border border-border/80 shadow-none ring-0\">\n <CardContent className=\"px-3\">\n <div className=\"space-y-2\">\n {visibleColumns.map((column) => (\n <div key={column.header} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-3.5 w-20 shrink-0\" />\n <Skeleton className=\"h-4 w-full\" />\n </div>\n ))}\n {hasActions ? (\n <div className=\"flex justify-end border-t pt-3\">\n <Skeleton className=\"h-8 w-24\" />\n </div>\n ) : null}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n {paginationComponent}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className=\"w-full py-0\">\n {typeof resolvedNoDataContent === 'string' ? (\n <div className=\"text-muted-foreground\">{resolvedNoDataContent}</div>\n ) : (\n resolvedNoDataContent\n )}\n </div>\n {pagination && pagination.totalItems > 0 && paginationComponent}\n </div>\n );\n }\n\n return (\n <div className={cn('flex flex-col', fullHeight && 'flex-1 min-h-0')}>\n <div className={cn('space-y-2', fullHeight && 'flex-1 min-h-0 overflow-auto px-px')}>\n {data.map((item) => (\n <Card\n key={getRowKey(item)}\n size=\"sm\"\n className={cn(\n 'border border-border/80 shadow-none ring-0',\n onRowClick ? 'cursor-pointer hover:bg-muted/50' : ''\n )}\n onClick={() => onRowClick?.(item)}\n >\n <CardContent className=\"px-3\">\n {renderMobileCard ? (\n renderMobileCard(item)\n ) : (\n <div className=\"space-y-2.5\">\n {visibleColumns.map((col) => (\n <div\n key={col.header}\n className=\"flex items-center gap-3 overflow-hidden\"\n >\n <span className=\"w-20 shrink-0 truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {col.mobileLabel ?? col.header}\n </span>\n <div className=\"min-w-0 flex-1 text-sm\">\n {col.truncate === false ? (\n <div className=\"block min-w-0 w-full text-right text-sm\">\n {renderColumnValue(col, item)}\n </div>\n ) : (\n <TruncatedContent\n align=\"right\"\n tooltip={getColumnTooltipText(col, item)}\n className=\"text-sm\"\n >\n {renderColumnValue(col, item)}\n </TruncatedContent>\n )}\n </div>\n </div>\n ))}\n {hasActions ? (\n <div className=\"mt-3 flex justify-end border-t pt-2.5\">\n <SmartTableActions\n item={item}\n actions={actions}\n actionLabels={actionLabels}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n />\n </div>\n ) : null}\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n {paginationComponent}\n </div>\n );\n}\n","'use client';\n\nimport { DesktopView } from './DesktopView';\nimport { MobileView } from './MobileView';\n\nimport type { SmartTableProps } from './types';\n\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport function SmartTable<T>({\n data,\n columns,\n isLoading,\n skeletonRows = 5,\n actions,\n actionLabels,\n actionHandlers,\n renderActions,\n noDataMessage = 'No data available',\n noDataContent,\n getRowKey = (item) => {\n // Default: try _id, id, or index\n const record = item as Record<string, unknown>;\n if ('_id' in record) return String(record._id);\n if ('id' in record) return String(record.id);\n return data.indexOf(item);\n },\n onRowClick,\n renderMobileCard,\n pagination,\n stickyHeader,\n maxHeight,\n fullHeight,\n sortState,\n onSortChange,\n}: SmartTableProps<T>): React.ReactElement {\n const isMobile = useIsMobile();\n\n if (isMobile) {\n return (\n <div className={cn('min-w-0', fullHeight && 'flex min-h-0 flex-1 flex-col')}>\n <MobileView\n data={data}\n columns={columns}\n isLoading={isLoading}\n skeletonRows={skeletonRows}\n actions={actions}\n actionLabels={actionLabels}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n noDataMessage={noDataMessage}\n noDataContent={noDataContent}\n getRowKey={getRowKey}\n onRowClick={onRowClick}\n renderMobileCard={renderMobileCard}\n pagination={pagination}\n fullHeight={fullHeight}\n />\n </div>\n );\n }\n\n return (\n <div className={cn('min-w-0', fullHeight && 'flex min-h-0 flex-1 flex-col')}>\n <DesktopView\n data={data}\n columns={columns}\n isLoading={isLoading}\n skeletonRows={skeletonRows}\n actions={actions}\n actionLabels={actionLabels}\n actionHandlers={actionHandlers}\n renderActions={renderActions}\n noDataMessage={noDataMessage}\n noDataContent={noDataContent}\n getRowKey={getRowKey}\n onRowClick={onRowClick}\n pagination={pagination}\n stickyHeader={stickyHeader}\n maxHeight={maxHeight}\n fullHeight={fullHeight}\n sortState={sortState}\n onSortChange={onSortChange}\n />\n </div>\n );\n}\n","'use client';\n\nimport { Filter, Search, X } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../primitives/button';\nimport { Input } from '../primitives/input';\nimport { DesktopConfirmShortcutHint } from '../overlays/responsive-sheet.footer';\nimport { ResponsiveSheet } from '../overlays/responsive-sheet';\nimport { useDesktopShortcutModifierLabel } from '../overlays/responsive-sheet.shortcuts';\nimport { SearchableSelect } from '../search/searchable-select';\nimport { cn } from '../utils/cn';\nimport { useIsMobile } from '../utils/use-media-query';\n\nexport interface FilterOption<T extends string = string> {\n readonly value: T;\n readonly label: string;\n}\n\ninterface FilterDropdownProps<T extends string> {\n readonly label: string;\n readonly value: T | 'all';\n readonly options: readonly FilterOption<T>[];\n readonly onChange: (value: T | 'all') => void;\n readonly className?: string;\n readonly icon?: LucideIcon;\n readonly allowAll?: boolean;\n readonly allOptionLabel?: string;\n}\n\nexport function buildAllFilterOptionLabel(label: string, allOptionLabel?: string): string {\n return allOptionLabel ?? `All: ${label}`;\n}\n\nexport function FilterDropdown<T extends string>({\n label,\n value,\n options,\n onChange,\n className,\n allowAll = true,\n allOptionLabel,\n}: FilterDropdownProps<T>): React.ReactElement {\n return (\n <SearchableSelect\n value={value}\n onValueChange={(nextValue) => {\n onChange(nextValue as T | 'all');\n }}\n placeholder={label}\n className={className ?? 'w-full sm:w-[140px]'}\n searchPlaceholder={`Search ${label.toLocaleLowerCase()}...`}\n options={[\n ...(allowAll\n ? [{ value: 'all', label: buildAllFilterOptionLabel(label, allOptionLabel) }]\n : []),\n ...options,\n ]}\n />\n );\n}\n\ninterface SearchInputProps {\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder?: string;\n readonly className?: string;\n}\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n className,\n}: SearchInputProps): React.ReactElement {\n return (\n <div className={cn('relative', className)}>\n <Search className=\"text-muted-foreground absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={(event) => {\n onChange(event.target.value);\n }}\n className=\"pr-9 pl-9\"\n />\n {value ? (\n <button\n type=\"button\"\n onClick={() => {\n onChange('');\n }}\n className=\"text-muted-foreground hover:text-foreground absolute top-1/2 right-2.5 -translate-y-1/2\"\n >\n <X className=\"size-4\" />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport interface FilterConfig<T extends string = string> {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly options: readonly FilterOption<T>[];\n}\n\nexport interface TableToolbarLabels {\n readonly filtersButtonLabel: string;\n readonly filtersTitle: ReactNode;\n readonly filtersDescription?: ReactNode;\n readonly clearFiltersLabel: ReactNode;\n readonly showResultsLabel: (resultCount?: number) => ReactNode;\n readonly rangeMinPlaceholder: string;\n readonly rangeMaxPlaceholder: string;\n}\n\nexport type TableToolbarLabelsInput = Partial<TableToolbarLabels>;\n\nexport function resolveTableToolbarLabels(\n labels: TableToolbarLabelsInput = {},\n): TableToolbarLabels {\n return {\n filtersButtonLabel: labels.filtersButtonLabel ?? 'Filters',\n filtersTitle: labels.filtersTitle ?? 'Filters',\n filtersDescription:\n labels.filtersDescription ?? 'Narrow the list using the available criteria.',\n clearFiltersLabel: labels.clearFiltersLabel ?? 'Clear',\n showResultsLabel:\n labels.showResultsLabel ??\n ((resultCount?: number) =>\n typeof resultCount === 'number'\n ? `Show ${resultCount.toLocaleString('en-US')} ${\n resultCount === 1 ? 'result' : 'results'\n }`\n : 'Show results'),\n rangeMinPlaceholder: labels.rangeMinPlaceholder ?? 'Min',\n rangeMaxPlaceholder: labels.rangeMaxPlaceholder ?? 'Max',\n };\n}\n\ninterface SelectFilter {\n readonly config: FilterConfig;\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly allowAll?: boolean;\n readonly allOptionLabel?: string;\n readonly clearable?: boolean;\n}\n\ninterface TextFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder?: string;\n}\n\ninterface RangeFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly minValue: string;\n readonly maxValue: string;\n readonly onMinChange: (value: string) => void;\n readonly onMaxChange: (value: string) => void;\n readonly minPlaceholder?: string;\n readonly maxPlaceholder?: string;\n readonly inputType?: 'text' | 'date';\n readonly inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode'];\n}\n\nexport interface CustomTableToolbarFilter {\n readonly key: string;\n readonly label: string;\n readonly icon?: LucideIcon;\n readonly value: string;\n readonly clearValue?: string;\n readonly clearable?: boolean;\n readonly onChange: (value: string) => void;\n readonly render: (args: {\n readonly value: string;\n readonly setValue: (value: string) => void;\n }) => ReactNode;\n}\n\nexport interface TableToolbarProps {\n readonly search?: {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n };\n readonly filters?: SelectFilter[];\n readonly textFilters?: TextFilter[];\n readonly customFilters?: CustomTableToolbarFilter[];\n readonly rangeFilters?: RangeFilter[];\n readonly renderRangeInput?: (args: {\n readonly filter: RangeFilter;\n readonly input: 'min' | 'max';\n readonly value: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n }) => ReactNode;\n readonly inlineControls?: ReactNode;\n readonly onClearAll?: () => void;\n readonly getDraftResultCount?: (draftValues: Record<string, string>) => number | undefined;\n readonly labels?: TableToolbarLabelsInput;\n readonly children?: ReactNode;\n}\n\nexport function TableToolbar({\n search,\n filters,\n textFilters,\n customFilters,\n rangeFilters,\n renderRangeInput,\n inlineControls,\n onClearAll,\n getDraftResultCount,\n labels,\n children,\n}: TableToolbarProps): React.ReactElement {\n const resolvedLabels = resolveTableToolbarLabels(labels);\n const isMobile = useIsMobile();\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [draftFilterValues, setDraftFilterValues] = useState<Record<string, string>>({});\n const hasFilters = Boolean(\n (filters?.length ?? 0) +\n (textFilters?.length ?? 0) +\n (customFilters?.length ?? 0) +\n (rangeFilters?.length ?? 0),\n );\n const desktopConfirmShortcutEnabled = filtersOpen && !isMobile;\n const desktopModifierLabel = useDesktopShortcutModifierLabel(desktopConfirmShortcutEnabled);\n const clearableFilters = filters?.filter((filter) => filter.clearable !== false) ?? [];\n const clearableCustomFilters =\n customFilters?.filter((filter) => filter.clearable !== false) ?? [];\n const filterValues = useMemo(\n () => ({\n ...Object.fromEntries((filters ?? []).map((filter) => [filter.config.key, filter.value])),\n ...Object.fromEntries((textFilters ?? []).map((filter) => [filter.key, filter.value])),\n ...Object.fromEntries((customFilters ?? []).map((filter) => [filter.key, filter.value])),\n ...Object.fromEntries(\n (rangeFilters ?? []).flatMap((filter) => [\n [`${filter.key}Min`, filter.minValue],\n [`${filter.key}Max`, filter.maxValue],\n ]),\n ),\n }),\n [customFilters, filters, rangeFilters, textFilters],\n );\n\n const activeFilterCount = clearableFilters.filter((filter) => filter.value !== 'all').length;\n const activeCustomFilterCount = clearableCustomFilters.filter(\n (filter) => filter.value !== (filter.clearValue ?? 'all'),\n ).length;\n const activeRangeFilterCount =\n rangeFilters?.filter((filter) => filter.minValue.trim() || filter.maxValue.trim()).length ?? 0;\n const activeTextFilterCount =\n textFilters?.filter((filter) => filter.value.trim().length > 0).length ?? 0;\n const hasDraftFilters =\n clearableFilters.some((filter) => {\n const draftValue = draftFilterValues[filter.config.key] ?? filter.value;\n return draftValue !== 'all';\n }) ||\n clearableCustomFilters.some((filter) => {\n const draftValue = draftFilterValues[filter.key] ?? filter.value;\n return draftValue !== (filter.clearValue ?? 'all');\n }) ||\n (rangeFilters ?? []).some((filter) => {\n const minValue = draftFilterValues[`${filter.key}Min`] ?? filter.minValue;\n const maxValue = draftFilterValues[`${filter.key}Max`] ?? filter.maxValue;\n return Boolean(minValue.trim() || maxValue.trim());\n }) ||\n (textFilters ?? []).some((filter) => {\n const draftValue = draftFilterValues[filter.key] ?? filter.value;\n return draftValue.trim().length > 0;\n });\n const draftResultCount = useMemo(\n () => (filtersOpen ? getDraftResultCount?.(draftFilterValues) : undefined),\n [draftFilterValues, filtersOpen, getDraftResultCount],\n );\n const applyButtonLabel = resolvedLabels.showResultsLabel(draftResultCount);\n\n function openFiltersSheet(): void {\n setDraftFilterValues(filterValues);\n setFiltersOpen(true);\n }\n\n const activeFilterTotal =\n activeFilterCount + activeCustomFilterCount + activeRangeFilterCount + activeTextFilterCount;\n\n function updateDraftFilterValue(key: string, value: string): void {\n setDraftFilterValues((currentValues) => ({\n ...currentValues,\n [key]: value,\n }));\n }\n\n function clearAndApplyFilters(): void {\n const clearedValues = Object.fromEntries(\n clearableFilters.map((filter) => [filter.config.key, 'all']),\n );\n const clearedRangeValues = Object.fromEntries(\n (rangeFilters ?? []).flatMap((filter) => [\n [`${filter.key}Min`, ''],\n [`${filter.key}Max`, ''],\n ]),\n );\n const clearedTextValues = Object.fromEntries(\n (textFilters ?? []).map((filter) => [filter.key, '']),\n );\n const clearedCustomValues = Object.fromEntries(\n clearableCustomFilters.map((filter) => [filter.key, filter.clearValue ?? 'all']),\n );\n setDraftFilterValues((currentValues) => ({\n ...currentValues,\n ...clearedValues,\n ...clearedRangeValues,\n ...clearedTextValues,\n ...clearedCustomValues,\n }));\n filters?.forEach((filter) => {\n const nextValue = filter.clearable === false ? filter.value : 'all';\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n rangeFilters?.forEach((filter) => {\n if (filter.minValue) {\n filter.onMinChange('');\n }\n if (filter.maxValue) {\n filter.onMaxChange('');\n }\n });\n textFilters?.forEach((filter) => {\n if (filter.value) {\n filter.onChange('');\n }\n });\n customFilters?.forEach((filter) => {\n const nextValue = filter.clearable === false ? filter.value : (filter.clearValue ?? 'all');\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n setFiltersOpen(false);\n }\n\n function applyDraftFilters(): void {\n filters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.config.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n rangeFilters?.forEach((filter) => {\n const nextMinValue = draftFilterValues[`${filter.key}Min`] ?? filter.minValue;\n const nextMaxValue = draftFilterValues[`${filter.key}Max`] ?? filter.maxValue;\n if (nextMinValue !== filter.minValue) {\n filter.onMinChange(nextMinValue);\n }\n if (nextMaxValue !== filter.maxValue) {\n filter.onMaxChange(nextMaxValue);\n }\n });\n textFilters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n customFilters?.forEach((filter) => {\n const nextValue = draftFilterValues[filter.key] ?? filter.value;\n if (nextValue !== filter.value) {\n filter.onChange(nextValue);\n }\n });\n setFiltersOpen(false);\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {search ? (\n <SearchInput\n value={search.value}\n onChange={search.onChange}\n placeholder={search.placeholder}\n className=\"min-w-0 flex-1 sm:w-64 sm:flex-initial\"\n />\n ) : null}\n\n {inlineControls}\n\n {hasFilters ? (\n <Button variant=\"outline\" className=\"relative gap-2\" onClick={openFiltersSheet}>\n <Filter className=\"size-4\" />\n {resolvedLabels.filtersButtonLabel}\n {activeFilterTotal > 0 ? (\n <span className=\"bg-primary text-primary-foreground absolute -top-1 -right-1 flex size-4 items-center justify-center rounded-full text-[10px]\">\n {activeFilterTotal}\n </span>\n ) : null}\n </Button>\n ) : null}\n\n {children ? (\n <div className=\"hidden sm:ml-auto sm:flex sm:items-center sm:gap-2\">{children}</div>\n ) : null}\n </div>\n\n {hasFilters ? (\n <ResponsiveSheet\n open={filtersOpen}\n onOpenChange={setFiltersOpen}\n title={resolvedLabels.filtersTitle}\n description={resolvedLabels.filtersDescription}\n onConfirm={applyDraftFilters}\n footer={\n <div className=\"flex w-full gap-2\">\n {onClearAll ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!hasDraftFilters}\n onClick={clearAndApplyFilters}\n className=\"min-w-0 flex-1\"\n >\n <X className=\"mr-1 size-4\" />\n {resolvedLabels.clearFiltersLabel}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n onClick={applyDraftFilters}\n className={cn(\n 'relative min-w-0 flex-1',\n desktopConfirmShortcutEnabled ? 'pr-12' : null,\n )}\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <span className=\"min-w-0 truncate\">{applyButtonLabel}</span>\n {desktopConfirmShortcutEnabled && desktopModifierLabel ? (\n <span className=\"absolute top-1/2 right-2 -translate-y-1/2\">\n <DesktopConfirmShortcutHint desktopModifierLabel={desktopModifierLabel} />\n </span>\n ) : null}\n </span>\n </Button>\n </div>\n }\n width={420}\n >\n <div className=\"space-y-4\">\n {filters?.map((filter) => {\n const Icon = filter.config.icon;\n\n return (\n <div key={filter.config.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.config.label}\n </span>\n <FilterDropdown\n label={filter.config.label}\n value={draftFilterValues[filter.config.key] ?? filter.value}\n options={filter.config.options}\n onChange={(value) => {\n updateDraftFilterValue(filter.config.key, value);\n }}\n className=\"w-full\"\n allowAll={filter.allowAll}\n allOptionLabel={filter.allOptionLabel}\n />\n </div>\n );\n })}\n {customFilters?.map((filter) => {\n const Icon = filter.icon;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n {filter.render({\n value: draftFilterValues[filter.key] ?? filter.value,\n setValue: (value) => {\n updateDraftFilterValue(filter.key, value);\n },\n })}\n </div>\n );\n })}\n {textFilters?.map((filter) => {\n const Icon = filter.icon;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n <Input\n type=\"text\"\n value={draftFilterValues[filter.key] ?? filter.value}\n onChange={(event) => {\n updateDraftFilterValue(filter.key, event.target.value);\n }}\n placeholder={filter.placeholder ?? filter.label}\n />\n </div>\n );\n })}\n {rangeFilters?.map((filter) => {\n const Icon = filter.icon;\n const minKey = `${filter.key}Min`;\n const maxKey = `${filter.key}Max`;\n\n return (\n <div key={filter.key} className=\"flex flex-col gap-1.5\">\n <span className=\"text-foreground flex items-center gap-2 text-sm font-medium\">\n {Icon ? (\n <Icon className=\"text-foreground/70 size-3.5 shrink-0\" strokeWidth={1.8} />\n ) : null}\n {filter.label}\n </span>\n <div className=\"grid grid-cols-2 gap-2\">\n {renderRangeInput ? (\n <>\n {renderRangeInput({\n filter,\n input: 'min',\n value: draftFilterValues[minKey] ?? filter.minValue,\n onChange: (value) => {\n updateDraftFilterValue(minKey, value);\n },\n placeholder: filter.minPlaceholder ?? resolvedLabels.rangeMinPlaceholder,\n })}\n {renderRangeInput({\n filter,\n input: 'max',\n value: draftFilterValues[maxKey] ?? filter.maxValue,\n onChange: (value) => {\n updateDraftFilterValue(maxKey, value);\n },\n placeholder: filter.maxPlaceholder ?? resolvedLabels.rangeMaxPlaceholder,\n })}\n </>\n ) : (\n <>\n <Input\n type={filter.inputType ?? 'text'}\n inputMode={filter.inputMode ?? 'decimal'}\n value={draftFilterValues[minKey] ?? filter.minValue}\n onChange={(event) => {\n updateDraftFilterValue(minKey, event.target.value);\n }}\n placeholder={filter.minPlaceholder ?? resolvedLabels.rangeMinPlaceholder}\n />\n <Input\n type={filter.inputType ?? 'text'}\n inputMode={filter.inputMode ?? 'decimal'}\n value={draftFilterValues[maxKey] ?? filter.maxValue}\n onChange={(event) => {\n updateDraftFilterValue(maxKey, event.target.value);\n }}\n placeholder={filter.maxPlaceholder ?? resolvedLabels.rangeMaxPlaceholder}\n />\n </>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </ResponsiveSheet>\n ) : null}\n </div>\n );\n}\n","import { cn } from \"../utils/cn\";\n\nexport interface ErrorCodeProps {\n readonly code: string;\n readonly reference?: string | null;\n readonly className?: string;\n}\n\nexport function ErrorCode({ code, reference, className }: ErrorCodeProps): React.ReactElement {\n return (\n <p className={cn(\"text-xs text-muted-foreground/55\", className)}>\n Codice {code}\n {reference ? <span className=\"ml-2\">Rif. {reference}</span> : null}\n </p>\n );\n}\n","export type ErrorPageKind = \"error\" | \"not-found\";\n\nexport interface ErrorPageContent {\n readonly code: string;\n readonly title: string;\n readonly description: string;\n readonly shouldCapture: boolean;\n}\n\nexport interface ResolveErrorPageContentOptions {\n readonly fallbackCode?: string;\n readonly fallbackTitle?: string;\n readonly fallbackDescription?: string;\n}\n\nconst NOT_FOUND_STATUS = 404;\n\nfunction getErrorText(error: unknown): string {\n if (error instanceof Error) {\n const digest = \"digest\" in error ? String(error.digest) : \"\";\n return `${error.message} ${digest}`;\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as { readonly message?: unknown; readonly digest?: unknown };\n const message = typeof record.message === \"string\" ? record.message : \"\";\n const digest = typeof record.digest === \"string\" ? record.digest : \"\";\n return `${message} ${digest}`;\n }\n\n return typeof error === \"string\" ? error : \"\";\n}\n\nfunction getErrorStatusCode(error: unknown): number | null {\n const text = getErrorText(error);\n const fallbackMatch = /NEXT_HTTP_ERROR_FALLBACK;(\\d{3})/.exec(text);\n\n if (fallbackMatch) {\n return Number(fallbackMatch[1]);\n }\n\n const statusMatch = /\\bstatus(?:Code)?[=:]\\s*(\\d{3})\\b/i.exec(text);\n return statusMatch ? Number(statusMatch[1]) : null;\n}\n\nexport function resolveErrorPageContent(\n error: unknown,\n options: ResolveErrorPageContentOptions = {},\n): ErrorPageContent {\n if (getErrorStatusCode(error) === NOT_FOUND_STATUS) {\n return {\n code: \"404\",\n title: \"Page not found\",\n description: \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n };\n }\n\n return {\n code: options.fallbackCode ?? \"500\",\n title: options.fallbackTitle ?? \"An error occurred\",\n description:\n options.fallbackDescription ?? \"An unexpected error occurred. Please try again later.\",\n shouldCapture: true,\n };\n}\n\nexport function getNotFoundPageContent(): ErrorPageContent {\n return {\n code: \"404\",\n title: \"Page not found\",\n description: \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n };\n}\n","export interface PostHogErrorCapturePayload {\n readonly error: unknown;\n readonly code: string;\n readonly reference: string;\n readonly source?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\ninterface PostHogClient {\n capture: (eventName: string, properties?: Record<string, unknown>) => void;\n}\n\nfunction getPostHogClient(): PostHogClient | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const client = (window as typeof window & { readonly posthog?: PostHogClient }).posthog;\n return typeof client?.capture === \"function\" ? client : null;\n}\n\nfunction normalizeError(error: unknown): {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n readonly digest?: string;\n} {\n if (error instanceof Error) {\n const digest = \"digest\" in error && typeof error.digest === \"string\" ? error.digest : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n digest,\n };\n }\n\n return {\n name: \"UnknownError\",\n message: typeof error === \"string\" ? error : \"Unknown error\",\n };\n}\n\nexport function createErrorReference(error: unknown): string {\n if (error instanceof Error && \"digest\" in error && typeof error.digest === \"string\") {\n return error.digest;\n }\n\n return `err_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function captureErrorToPostHog({\n error,\n code,\n reference,\n source = \"error-page\",\n metadata,\n}: PostHogErrorCapturePayload): void {\n const posthog = getPostHogClient();\n\n if (!posthog) {\n return;\n }\n\n const normalizedError = normalizeError(error);\n\n try {\n posthog.capture(\"$exception\", {\n $exception_type: normalizedError.name,\n $exception_message: normalizedError.message,\n $exception_stack_trace: normalizedError.stack,\n code,\n digest: normalizedError.digest,\n error_reference: reference,\n pathname: window.location.pathname,\n source,\n ...metadata,\n });\n } catch {\n // Error pages must never fail while reporting an error.\n }\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { cn } from \"../utils/cn\";\nimport { ErrorCode } from \"./error-code\";\nimport {\n getNotFoundPageContent,\n resolveErrorPageContent,\n type ErrorPageContent,\n} from \"./error-page-content\";\nimport { captureErrorToPostHog, createErrorReference } from \"./posthog-error-capture\";\n\nexport interface SaasErrorPageProps {\n readonly error?: Error & { readonly digest?: string };\n readonly reset?: () => void;\n readonly homeHref?: string;\n readonly homeLabel?: string;\n readonly retryLabel?: string;\n readonly source?: string;\n readonly metadata?: Record<string, unknown>;\n readonly content?: Partial<ErrorPageContent>;\n readonly className?: string;\n readonly classes?: SaasErrorPageClassNames;\n}\n\nexport interface SaasErrorPageClassNames {\n readonly root?: string;\n readonly content?: string;\n readonly code?: string;\n readonly text?: string;\n readonly title?: string;\n readonly description?: string;\n readonly actions?: string;\n}\n\nfunction resolveContent(\n error: SaasErrorPageProps[\"error\"],\n content: SaasErrorPageProps[\"content\"],\n): ErrorPageContent {\n const resolvedContent = error ? resolveErrorPageContent(error) : getNotFoundPageContent();\n\n return {\n ...resolvedContent,\n ...content,\n shouldCapture: content?.shouldCapture ?? resolvedContent.shouldCapture,\n };\n}\n\nexport function SaasErrorPage({\n error,\n reset,\n homeHref = \"/\",\n homeLabel = \"Torna alla home\",\n retryLabel = \"Riprova\",\n source,\n metadata,\n content,\n className,\n classes,\n}: SaasErrorPageProps): React.ReactElement {\n const resolvedContent = useMemo(() => resolveContent(error, content), [content, error]);\n const [reference] = useState(() => (error ? createErrorReference(error) : null));\n\n useEffect(() => {\n if (!error || !resolvedContent.shouldCapture || !reference) {\n return;\n }\n\n captureErrorToPostHog({\n error,\n code: resolvedContent.code,\n reference,\n source,\n metadata,\n });\n }, [error, metadata, reference, resolvedContent.code, resolvedContent.shouldCapture, source]);\n\n return (\n <main\n className={cn(\n \"bg-background text-foreground flex min-h-screen flex-col items-center justify-center gap-4 px-6 text-center\",\n className,\n classes?.root,\n )}\n >\n <div className={cn(\"space-y-3\", classes?.content)}>\n <p\n className={cn(\n \"text-8xl font-semibold leading-none text-muted-foreground/25 sm:text-9xl\",\n classes?.code,\n )}\n >\n {resolvedContent.code}\n </p>\n <div className={cn(\"space-y-2\", classes?.text)}>\n <h1 className={cn(\"text-2xl font-semibold tracking-tight\", classes?.title)}>\n {resolvedContent.title}\n </h1>\n <p className={cn(\"mx-auto max-w-md text-sm text-muted-foreground\", classes?.description)}>\n {resolvedContent.description}\n </p>\n </div>\n </div>\n\n <ErrorCode code={resolvedContent.code} reference={reference} />\n\n <div className={cn(\"mt-2 flex flex-wrap justify-center gap-3\", classes?.actions)}>\n {reset ? (\n <Button type=\"button\" variant=\"outline\" onClick={reset}>\n {retryLabel}\n </Button>\n ) : null}\n <Button asChild>\n <a href={homeHref}>{homeLabel}</a>\n </Button>\n </div>\n </main>\n );\n}\n\nexport interface SaasNotFoundPageProps\n extends Omit<SaasErrorPageProps, \"error\" | \"reset\" | \"content\"> {\n readonly title?: string;\n readonly description?: string;\n}\n\nexport function SaasNotFoundPage({\n title,\n description,\n ...props\n}: SaasNotFoundPageProps): React.ReactElement {\n return (\n <SaasErrorPage\n {...props}\n content={{\n code: \"404\",\n title: title ?? \"Page not found\",\n description:\n description ?? \"The page you are looking for does not exist or has been moved.\",\n shouldCapture: false,\n }}\n />\n );\n}\n"],"mappings":"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"}