@postxl/ui-components 1.3.2 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +8 -8
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["day: Date","modifiers: any","e: React.MouseEvent<Element>","fromMonth: Date | undefined","toMonth: Date | undefined","date: Date","months: number","event: React.KeyboardEvent<HTMLDivElement>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Root>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Trigger>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Portal>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Close>>","iso?: string","r?: { from?: Date; to?: Date } | undefined","PRESETS: Preset[]","presetName: string","timelineStart?: Date","timelineEnd?: Date","value: { from?: Date; to?: Date } | undefined","variant?: Cell['variant']","direction: SortDirection","prev: SortingState","newSort: ColumnSort","event: React.PointerEvent<HTMLButtonElement>","value: React.ReactNode | ColumnMenuRendererFunction<TData, TValue>","HeaderComponents: Record<string, (props: any) => React.ReactNode | null>","rowIndex: number","columnId: string","cellKey: string","rowHeight: RowHeightValue","lineCountMap: Record<RowHeightValue, number>","onCloseAutoFocus: NonNullable<React.ComponentProps<typeof DropdownMenuContent>['onCloseAutoFocus']>","columnIds: string[]","updates: UpdateCell[]","ref: PossibleRef<T>","value: T","event: React.MouseEvent<HTMLDivElement>","callback: T | undefined","callback: T","delay: number","event: KeyboardEvent","event: React.KeyboardEvent","query: string","event: React.ChangeEvent<HTMLInputElement>","event: React.PointerEvent<HTMLButtonElement>","event: React.MouseEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLDivElement>","align: 'left' | 'right' | 'center'","event: React.MouseEvent<HTMLDivElement>","event: React.MouseEvent","event: React.KeyboardEvent<HTMLDivElement>","checked: boolean","event: React.KeyboardEvent<HTMLDivElement>","event: React.MouseEvent","event: React.MouseEvent<HTMLInputElement>","value: string | Date | null | undefined","date: Date","date: Date | undefined","isOpen: boolean","event: React.KeyboardEvent<HTMLDivElement>","newValue: string","event: React.ChangeEvent<HTMLTextAreaElement>","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLTextAreaElement>","val: string","options: CellSelectOption[]","value: string","valueToRemove: string","event?: React.MouseEvent","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLInputElement>","event: React.ChangeEvent<HTMLInputElement>","options?: { moveToNextRow?: boolean; direction?: 'left' | 'right' }","event: React.KeyboardEvent<HTMLDivElement>","options: CellSelectOption[]","newValue: string","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","editingContent: React.ReactNode","event: React.ChangeEvent<HTMLInputElement>","event: React.KeyboardEvent<HTMLDivElement>","ordered: ReturnType<typeof table.getAllColumns>[0][]","clientY: number","dragId: string","toIndex: number","e: React.PointerEvent","id: string","ev: PointerEvent","targetIndex: number | null","keys: string[]","fn: () => T","data: T","store: DataGridStore","selector: (state: DataGridState) => T","updates: UpdateCell | UpdateCell[]","rowIndex: number","columnId: string","start: CellPosition","end: CellPosition","rowIndices: number[]","rowsToDelete: TData[]","direction: NavigationDirection","opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }","open: boolean","query: string","matches: CellPosition[]","event?: React.MouseEvent","event: React.MouseEvent","_event: React.MouseEvent","event: KeyboardEvent","direction: NavigationDirection | null","updates: {\n rowIndex: number\n columnId: string\n value: unknown\n }[]","updater: Updater<SortingState>","updater: Updater<RowSelectionState>","selected: boolean","shiftKey: boolean","newRowSelection: RowSelectionState","updater: Updater<RowHeightValue>","defaultColumn: Partial<ColumnDef<TData>>","colSizes: Record<string, number>","opts: Partial<CellPosition>","event?: React.MouseEvent<HTMLDivElement>","event: MouseEvent","event: Event","value: number","formatter: NumberFormatter","intlFormatter?: Intl.NumberFormat","formatted: string","element: HTMLElement","cursor: 'start' | 'end'","e: React.MouseEvent<HTMLElement, MouseEvent>","e: React.KeyboardEvent<HTMLElement>","e: React.ChangeEvent<HTMLInputElement>","parsedValue: number | undefined","e: React.FocusEvent<HTMLInputElement>","value: boolean | ((value: boolean) => boolean)","event: KeyboardEvent","Comp: React.ElementType","storageKey: string | undefined","defaultValue: boolean","value: boolean","newVals: T[]","optionValue: T","checked: boolean"],"sources":["../src/lib/utils.ts","../src/accordion/accordion.tsx","../src/alert/alert.tsx","../src/button/button.tsx","../src/alert-dialog/alert-dialog.tsx","../src/avatar/avatar.tsx","../src/badge/badge.tsx","../src/breadcrumb/breadcrumb.tsx","../src/calendar/calendar.tsx","../src/card/card.tsx","../src/card-hover/card-hover.tsx","../src/carousel/carousel.tsx","../src/checkbox/checkbox.tsx","../src/collapse/collapse.tsx","../src/dialog/dialog.tsx","../src/command-palette/command-palette.tsx","../src/popover/popover.tsx","../src/combobox/combobox.tsx","../src/spinner/spinner.tsx","../src/command/command.tsx","../src/content-frame/content-frame.tsx","../src/context-menu/context-menu.tsx","../src/skeleton/skeleton.tsx","../src/dropdown-menu/dropdown-menu.tsx","../src/tooltip/tooltip.tsx","../src/select/select.tsx","../src/data-grid/cell-variants/utils/gantt-timerange-picker.tsx","../src/data-grid/cell-variants/utils/gantt-timeline.tsx","../src/data-grid/data-grid-column-header.tsx","../src/data-grid/data-grid-utils.ts","../src/data-grid/data-grid-context-menu.tsx","../src/lib/compose-refs.ts","../src/data-grid/data-grid-row.tsx","../src/hooks/use-callback-ref.ts","../src/hooks/use-debounced-callback.ts","../src/input/input.tsx","../src/data-grid/data-grid-search.tsx","../src/data-grid/data-grid.tsx","../src/data-grid/data-grid-cell-wrapper.tsx","../src/data-grid/cell-variants/checkbox-cell.tsx","../src/data-grid/cell-variants/date-cell.tsx","../src/data-grid/cell-variants/gantt-cell.tsx","../src/textarea/textarea.tsx","../src/data-grid/cell-variants/long-text-cell.tsx","../src/data-grid/cell-variants/multi-select-cell.tsx","../src/data-grid/cell-variants/number-cell.tsx","../src/data-grid/cell-variants/react-node-cell.tsx","../src/data-grid/cell-variants/select-cell.tsx","../src/data-grid/cell-variants/short-text-cell.tsx","../src/data-grid/data-grid-cell.tsx","../src/data-grid/data-grid-view-menu.tsx","../src/data-grid/hooks/use-data-grid.tsx","../src/date-picker/date-picker.tsx","../src/drawer/drawer.tsx","../src/label/label.tsx","../src/separator/separator.tsx","../src/field/field.tsx","../src/hooks/use-is-mobile.ts","../src/input/number-input.tsx","../src/mark-value-renderer/mark-value-renderer.tsx","../src/menubar/menubar.tsx","../src/modal/modal.tsx","../src/navigation-menu/navigation-menu.tsx","../src/pagination/pagination.tsx","../src/progress/progress.tsx","../src/radio-group/radio-group.tsx","../src/resizable/resizeable.tsx","../src/scroll-area/scroll-area.tsx","../src/sheet/sheet.tsx","../src/sidebar/sidebar.tsx","../src/slicer/slicer.tsx","../src/slider/slider.tsx","../src/switch/switch.tsx","../src/tabs/tabs.tsx","../src/toggle/toggle.tsx","../src/toggle-group/toggle-group.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDownIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item ref={ref} className={cn('border-b', className)} {...props} />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center cursor-pointer justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('pb-4 pt-0', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground',\n destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div ref={ref} role=\"alert\" className={cn(alertVariants({ variant }), className)} {...props} />\n))\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, children, ...props }, ref) => (\n <h5 ref={ref} className={cn('mb-1 font-medium leading-none tracking-tight', className)} {...props}>\n {children}\n </h5>\n ),\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm [&_p]:leading-relaxed', className)} {...props} />\n ),\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md cursor-pointer text-base font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n outlineInvert:\n 'border border-muted-foreground bg-background shadow-xs text-muted-foreground hover:bg-muted-foreground hover:text-background dark:bg-input/30 dark:border-input dark:hover:bg-input/70 dark:hover:text-foreground/80',\n extraGhost: 'bg-none hover:text-accent-foreground text-muted-foreground hover:text-foreground',\n extraGhost2: 'bg-none text-foreground hover:text-muted-foreground',\n neutral: 'bg-background',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 px-6 has-[>svg]:px-4',\n xs: 'py-1 px-2',\n xs2: 'px-2 py-0.5',\n icon: 'size-9',\n iconSm: 'size-7.5',\n smLow: 'h-7.5 gap-1.5 px-3 has-[>svg]:px-2.5',\n max: 'h-full w-full',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport type ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n /**\n * E2E test_id to identify the button.\n */\n __e2e_test_id__?: string\n }\n\nfunction Button({ className, variant, size, asChild = false, __e2e_test_id__, ...props }: ButtonProps) {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n {...props}\n data-test-id={__e2e_test_id__}\n className={cn(buttonVariants({ variant, size, className }))}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\n\nimport * as React from 'react'\n\nimport { buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold', className)} {...props} />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)}\n {...props}\n />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","import * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image ref={ref} className={cn('aspect-square h-full w-full', className)} {...props} />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn('flex h-full w-full items-center justify-center rounded-full bg-muted', className)}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-base font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n filter: 'bg-primary text-background border-0',\n info: 'bg-yellow-500 text-foreground border-0',\n },\n size: {\n default: '',\n xs: 'h-3.5 text-sm',\n sm: 'h-4.5 text-xs',\n md: 'h-6 text-md',\n lg: 'h-8 text-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nfunction Badge({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span'\n\n return <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant, size }), className)} {...props} />\n}\n\nexport { Badge, badgeVariants }\n","import { ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<'nav'> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = 'Breadcrumb'\n\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5',\n className,\n )}\n {...props}\n />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return <Comp ref={ref} className={cn('transition-colors hover:text-foreground', className)} {...props} />\n})\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('font-normal text-foreground', className)}\n {...props}\n />\n ),\n)\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nconst BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<'li'>) => (\n <li aria-hidden=\"true\" className={cn('[&>svg]:size-3.5', className)} {...props}>\n {children ?? <ChevronRightIcon />}\n </li>\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nconst BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsHorizontalIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = 'BreadcrumbElipssis'\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n DoubleArrowLeftIcon,\n DoubleArrowRightIcon,\n} from '@radix-ui/react-icons'\n\nimport * as React from 'react'\nimport { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker'\n\nimport { Button, buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n showYearNavigation = false,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n showYearNavigation?: boolean\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n // Track last selected field for range mode\n const [rangeSelectionStep, setRangeSelectionStep] = React.useState<'from' | 'to'>('from')\n // Custom onDayClick for range mode to make sure 'from' and 'to' are always set alternatingly\n const handleDayClick = React.useCallback(\n (day: Date, modifiers: any, e: React.MouseEvent<Element>) => {\n if (props.mode === 'range') {\n const range = props.selected as { from?: Date; to?: Date } | undefined\n\n // Always start a new range when selecting 'from'\n if (rangeSelectionStep === 'from') {\n props.onSelect?.({ from: day, to: undefined }, day, modifiers, e)\n setRangeSelectionStep('to')\n return\n }\n\n // Only set 'to' if 'from' is set and not the same day\n if (rangeSelectionStep === 'to') {\n if (range?.from && day.getTime() !== range.from.getTime()) {\n props.onSelect?.({ from: range.from, to: day }, day, modifiers, e)\n setRangeSelectionStep('from')\n }\n return\n }\n } else {\n props.onDayClick?.(day, modifiers, e)\n }\n },\n [props, rangeSelectionStep],\n )\n\n // default year range if caption layout has year dropdown: 100 years past and 100 years future unless user overrides\n // with the dropdown a range is required. if we don't set it manually it will be -100 years until now which is impractical for future events\n let fromMonth: Date | undefined\n let toMonth: Date | undefined\n if (captionLayout === 'dropdown-years' || captionLayout === 'dropdown') {\n const nowYear = new Date().getFullYear()\n fromMonth = props.startMonth ?? new Date(nowYear - 100, 0)\n toMonth = props.endMonth ?? new Date(nowYear + 100, 11)\n }\n\n // controlled month state so we can programmatically change months (and years)\n const [currentMonth, setCurrentMonth] = React.useState<Date>(props.defaultMonth ?? props.month ?? new Date())\n React.useEffect(() => {\n if (props.month) {\n setCurrentMonth(props.month)\n }\n }, [props.month])\n\n const addMonths = (date: Date, months: number) => {\n const d = new Date(date)\n d.setMonth(d.getMonth() + months)\n if (fromMonth && d < fromMonth) {\n return fromMonth\n }\n if (toMonth && d > toMonth) {\n return toMonth\n }\n return d\n }\n\n return (\n <DayPicker\n month={currentMonth}\n onMonthChange={(m) => {\n setCurrentMonth(m)\n props.onMonthChange?.(m)\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n 'bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent',\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className,\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),\n ...formatters,\n }}\n classNames={{\n root: cn('w-fit', defaultClassNames.root),\n months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),\n month: cn('flex flex-col w-full gap-4', defaultClassNames.month),\n nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_previous,\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_next,\n ),\n month_caption: cn(\n 'flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)',\n defaultClassNames.month_caption,\n ),\n dropdowns: cn(\n 'w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5',\n defaultClassNames.dropdowns,\n ),\n dropdown_root: cn(\n 'relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md',\n defaultClassNames.dropdown_root,\n ),\n dropdown: cn('absolute bg-popover inset-0 opacity-0', defaultClassNames.dropdown),\n caption_label: cn(\n 'select-none font-medium',\n captionLayout === 'label'\n ? 'text-sm'\n : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5',\n defaultClassNames.caption_label,\n ),\n table: 'w-full border-collapse',\n weekdays: cn('flex', defaultClassNames.weekdays),\n weekday: cn(\n 'text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none',\n defaultClassNames.weekday,\n ),\n week: cn('flex w-full mt-2', defaultClassNames.week),\n week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),\n week_number: cn('text-[0.8rem] select-none text-muted-foreground', defaultClassNames.week_number),\n day: cn(\n 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none',\n defaultClassNames.day,\n ),\n range_start: cn('rounded-l-md bg-accent', defaultClassNames.range_start),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_end: cn('rounded-r-md bg-accent', defaultClassNames.range_end),\n today: cn(\n 'bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none',\n defaultClassNames.today,\n ),\n outside: cn('text-muted-foreground aria-selected:text-muted-foreground', defaultClassNames.outside),\n disabled: cn('text-muted-foreground opacity-50', defaultClassNames.disabled),\n hidden: cn('invisible', defaultClassNames.hidden),\n ...classNames,\n }}\n // prefer startMonth/toMonth instead of deprecated fromYear/toYear\n startMonth={fromMonth}\n endMonth={toMonth}\n components={{\n // custom navigation: to add double-chevron year skip buttons\n // prettier-ignore\n Nav: ({ className }) => { //NOSONAR - inline component is intentional to access closure variables\n const btnClassNames = captionLayout === 'dropdown' && showYearNavigation ? 'size-6.5' : ''\n return (\n <div className={cn('mt-0.5', className)}>\n <div className=\"flex items-center\">\n {showYearNavigation && (\n <Button\n aria-label=\"previous year\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={fromMonth && currentMonth <= fromMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), -12))}\n >\n <DoubleArrowLeftIcon className=\"\" />\n </Button>\n )}\n <Button\n aria-label=\"previous month\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={fromMonth && currentMonth <= fromMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), -1))}\n >\n <ChevronLeftIcon />\n </Button>\n </div>\n\n <div className=\"flex items-center\">\n <Button\n aria-label=\"next month\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={toMonth && currentMonth >= toMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), 1))}\n >\n <ChevronRightIcon />\n </Button>\n {showYearNavigation && (\n <Button\n aria-label=\"next year\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={toMonth && currentMonth >= toMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), 12))}\n >\n <DoubleArrowRightIcon />\n </Button>\n )}\n </div>\n </div>\n )\n },\n // prettier-ignore\n Root: ({ className, rootRef, ...props }) => { //NOSONAR - default shadeCn\n return <div data-slot=\"calendar\" ref={rootRef} className={cn(className)} {...props} />\n },\n // prettier-ignore\n Chevron: ({ className, orientation, ...props }) => { //NOSONAR - default shadeCn\n if (orientation === 'left') {\n return <ChevronLeftIcon className={cn('size-4', className)} {...props} />\n }\n\n if (orientation === 'right') {\n return <ChevronRightIcon className={cn('size-4', className)} {...props} />\n }\n\n return <ChevronDownIcon className={cn('size-4', className)} {...props} />\n },\n DayButton: CalendarDayButton,\n // prettier-ignore\n WeekNumber: ({ children, ...props }) => { //NOSONAR - default shadeCn\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">{children}</div>\n </td>\n )\n },\n ...components,\n }}\n onDayClick={handleDayClick}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) {\n ref.current?.focus()\n }\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n 'data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70',\n defaultClassNames.day,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, children, ...props }, ref) => (\n <h3 ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...props}>\n {children}\n </h3>\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />,\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as HoverCardPrimitive from '@radix-ui/react-hover-card'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import { ArrowLeftIcon, ArrowRightIcon } from '@radix-ui/react-icons'\n\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: 'horizontal' | 'vertical'\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error('useCarousel must be used within a <Carousel />')\n }\n\n return context\n}\n\nconst Carousel = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & CarouselProps>(\n ({ orientation = 'horizontal', opts, setApi, plugins, className, children, ...props }, ref) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n },\n plugins,\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback(() => {\n if (!api) {\n return\n }\n\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [api])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext],\n )\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return\n }\n\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) {\n return\n }\n\n onSelect()\n api.on('reInit', onSelect)\n api.on('select', onSelect)\n\n return () => {\n api?.off('select', onSelect)\n }\n }, [api, onSelect])\n\n const memoizedValue = useMemo(\n () => ({\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === 'y' ? 'vertical' : 'horizontal'),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }),\n [api, canScrollNext, canScrollPrev, carouselRef, opts, orientation, scrollNext, scrollPrev],\n )\n\n return (\n <CarouselContext.Provider value={memoizedValue}>\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn('relative', className)}\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n },\n)\nCarousel.displayName = 'Carousel'\n\nconst CarouselContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn('flex', orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', className)}\n {...props}\n />\n </div>\n )\n },\n)\nCarouselContent.displayName = 'CarouselContent'\n\nconst CarouselItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { orientation } = useCarousel()\n\n return (\n <div\n ref={ref}\n aria-roledescription=\"slide\"\n className={cn('min-w-0 shrink-0 grow-0 basis-full', orientation === 'horizontal' ? 'pl-4' : 'pt-4', className)}\n {...props}\n />\n )\n },\n)\nCarouselItem.displayName = 'CarouselItem'\n\nconst CarouselPrevious = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(\n ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n 'absolute h-8 w-8 rounded-full',\n orientation === 'horizontal'\n ? '-left-12 top-1/2 -translate-y-1/2'\n : '-top-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n },\n)\nCarouselPrevious.displayName = 'CarouselPrevious'\n\nconst CarouselNext = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(\n ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n 'absolute h-8 w-8 rounded-full',\n orientation === 'horizontal'\n ? '-right-12 top-1/2 -translate-y-1/2'\n : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRightIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n },\n)\nCarouselNext.displayName = 'CarouselNext'\n\nexport { type CarouselApi, type CarouselProps, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext }\n","import { CheckIcon, Cross1Icon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { SquareIcon } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\ntype CheckboxProps = React.ComponentProps<'input'> &\n VariantProps<typeof checkboxVariants> & {\n label?: string\n /**\n * E2E test_id to identify the checkbox.\n */\n __e2e_test_id__?: string\n }\n\nconst checkboxVariants = cva(\n 'cursor-pointer peer appearance-none rounded border focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shrink-0 shadow-xs transition-shadow',\n {\n variants: {\n variant: {\n default: '',\n simple: ' border-input checked:bg-muted-foreground checked:border-muted-foreground',\n iconSolo: 'border-transparent shadow-none',\n },\n checkboxSize: {\n default: 'size-4 [&_svg]:size-3.5',\n sm: 'size-3.5 [&_svg]:size-3',\n lg: 'size-4.5 [&_svg]:size-4',\n },\n checkIcon: {\n default: 'cross',\n check: 'check',\n square: 'square',\n },\n iconStyle: {\n default: 'text-foreground',\n simple: 'text-primary-foreground',\n solo: 'text-muted-foreground shadow-none',\n },\n },\n defaultVariants: {\n variant: 'default',\n checkIcon: 'default',\n iconStyle: 'default',\n checkboxSize: 'default',\n },\n },\n)\n\nfunction Checkbox({\n label,\n className,\n variant,\n checkIcon,\n checkboxSize,\n iconStyle,\n __e2e_test_id__,\n ...props\n}: CheckboxProps) {\n const inputId = props.id ?? (label ? `${label}-checkbox` : undefined)\n\n let icon = <Cross1Icon />\n if (checkIcon === 'check') {\n icon = <CheckIcon />\n } else if (checkIcon === 'square') {\n icon = <SquareIcon fill=\"var(--muted-foreground)\" className=\"size-1/3\" />\n }\n\n return (\n <div className={cn('relative flex gap-2 items-center', className)} data-test-id={__e2e_test_id__}>\n <input {...props} type=\"checkbox\" id={inputId} className={cn(checkboxVariants({ variant, checkboxSize }))} />\n <span\n className={cn(\n checkboxVariants({ iconStyle, checkboxSize }),\n 'absolute opacity-0 peer-checked:opacity-100 top-1/2 left-0 transform -translate-y-1/2 pointer-events-none flex items-center justify-center border-transparent',\n )}\n >\n {icon}\n </span>\n <label htmlFor={inputId} className=\"cursor-pointer select-none\">\n {label}\n </label>\n </div>\n )\n}\n\nexport { Checkbox, checkboxVariants }\n","import * as CollapsePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapse = CollapsePrimitive.Root\n\nconst CollapseTrigger = CollapsePrimitive.CollapsibleTrigger\n\nconst CollapseContent = CollapsePrimitive.CollapsibleContent\n\nexport { Collapse, CollapseTrigger, CollapseContent }\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\n\nfunction Dialog(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Root>>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Trigger>>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Portal>>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Close>>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 dark:bg-gray-500/30',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n __e2e_test_id__?: string\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\" data-test-id={__e2e_test_id__}>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n title=\"Close\"\n data-slot=\"dialog-close\"\n className=\"flex ring-offset-background focus:ring-transparent data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-3 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 cursor-pointer\"\n >\n <Button\n asChild\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 rounded\"\n __e2e_test_id__={__e2e_test_id__ ? `${__e2e_test_id__}-close` : undefined}\n >\n <Cross2Icon />\n </Button>\n <span className=\"sr-only\">Close</span>\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('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import { type DialogProps } from '@radix-ui/react-dialog'\nimport { MagnifyingGlassIcon } from '@radix-ui/react-icons'\n\nimport { Command as CommandPalettePrimitive } from 'cmdk'\nimport * as React from 'react'\n\nimport { Dialog, DialogContent } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\n\nconst CommandPalette = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n))\nCommandPalette.displayName = CommandPalettePrimitive.displayName\n\ntype CommandPaletteDialogProps = DialogProps\n\nconst CommandPaletteDialog = ({ children, ...props }: CommandPaletteDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <CommandPalette className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </CommandPalette>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandPaletteInput = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" data-cmdk-input-wrapper=\"\">\n <MagnifyingGlassIcon className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPalettePrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n))\n\nCommandPaletteInput.displayName = CommandPalettePrimitive.Input.displayName\n\nconst CommandPaletteList = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandPaletteList.displayName = CommandPalettePrimitive.List.displayName\n\nconst CommandPaletteEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Empty>\n>((props, ref) => <CommandPalettePrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />)\n\nCommandPaletteEmpty.displayName = CommandPalettePrimitive.Empty.displayName\n\nconst CommandPaletteGroup = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\n\nCommandPaletteGroup.displayName = CommandPalettePrimitive.Group.displayName\n\nconst CommandPaletteSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Separator ref={ref} className={cn('-mx-1 h-px bg-border', className)} {...props} />\n))\nCommandPaletteSeparator.displayName = CommandPalettePrimitive.Separator.displayName\n\nconst CommandPaletteItem = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50',\n className,\n )}\n {...props}\n />\n))\n\nCommandPaletteItem.displayName = CommandPalettePrimitive.Item.displayName\n\nconst CommandPaletteShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nCommandPaletteShortcut.displayName = 'CommandPaletteShortcut'\n\nexport {\n CommandPalette,\n CommandPaletteDialog,\n CommandPaletteInput,\n CommandPaletteList,\n CommandPaletteEmpty,\n CommandPaletteGroup,\n CommandPaletteItem,\n CommandPaletteShortcut,\n CommandPaletteSeparator,\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Popover({ ...props }: Readonly<React.ComponentProps<typeof PopoverPrimitive.Root>>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: Readonly<React.ComponentProps<typeof PopoverPrimitive.Trigger>>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nconst popoverVariants = cva(\n 'outline-hidden border z-50 origin-(--radix-popover-content-transform-origin) data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n {\n variants: {\n variant: {\n default: 'bg-popover text-popover-foreground w-72 rounded p-4 shadow-md',\n simple: 'bg-background text-foreground w-auto border-(--discreet-border) shadow-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nfunction PopoverContent({\n className,\n variant,\n align = 'center',\n sideOffset = 4,\n ...props\n}: Readonly<React.ComponentProps<typeof PopoverPrimitive.Content> & VariantProps<typeof popoverVariants>>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(popoverVariants({ variant }), className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import { CaretSortIcon, CheckIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport {\n CommandPalette,\n CommandPaletteEmpty,\n CommandPaletteGroup,\n CommandPaletteInput,\n CommandPaletteItem,\n CommandPaletteList,\n} from '../command-palette/command-palette'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\nconst frameworks = [\n {\n value: 'next.js',\n label: 'Next.js',\n },\n {\n value: 'sveltekit',\n label: 'SvelteKit',\n },\n {\n value: 'nuxt.js',\n label: 'Nuxt.js',\n },\n {\n value: 'remix',\n label: 'Remix',\n },\n {\n value: 'astro',\n label: 'Astro',\n },\n]\n\nexport function ComboboxDemo() {\n const [open, setOpen] = React.useState(false)\n const [value, setValue] = React.useState('')\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" aria-expanded={open} className=\"w-[200px] justify-between\">\n {value ? frameworks.find((framework) => framework.value === value)?.label : 'Select framework...'}\n <CaretSortIcon className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-0\">\n <CommandPalette>\n <CommandPaletteInput placeholder=\"Search framework...\" className=\"h-9\" />\n <CommandPaletteList>\n <CommandPaletteEmpty>No framework found.</CommandPaletteEmpty>\n <CommandPaletteGroup>\n {frameworks.map((framework) => (\n <CommandPaletteItem\n key={framework.value}\n value={framework.value}\n onSelect={(currentValue) => {\n setValue(currentValue === value ? '' : currentValue)\n setOpen(false)\n }}\n >\n {framework.label}\n <CheckIcon\n className={cn('ml-auto h-4 w-4', value === framework.value ? 'opacity-100' : 'opacity-0')}\n />\n </CommandPaletteItem>\n ))}\n </CommandPaletteGroup>\n </CommandPaletteList>\n </CommandPalette>\n </PopoverContent>\n </Popover>\n )\n}\n","import { cn } from '../lib/utils'\n\nexport function Spinner({ classNames }: Readonly<{ classNames?: string }>) {\n return (\n <div className={cn('flex justify-center items-center w-full h-full', classNames)}>\n <svg\n className=\"w-auto text-[inherit] h-full animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n )\n}\n\ntype LoaderProps = Readonly<{\n label?: string\n disabled?: boolean\n}>\n\nexport function Loader({ label, disabled }: LoaderProps) {\n if (disabled) {\n return null\n }\n\n return (\n <div className=\"flex absolute z-1 left-0 top-0 bottom-0 right-0 bg-secondary/50\">\n <div className=\"flex items-center justify-center flex-1 flex-col\">\n <Spinner classNames=\"w-[24px] h-[25px]\" />\n {label && <h3 className=\"pb-0 pt-3 font-medium text-xl mb-2 text-muted-foreground\">{label}</h3>}\n </div>\n </div>\n )\n}\n","import { MagnifyingGlassIcon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport React from 'react'\n\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\nimport { Spinner } from '../spinner/spinner'\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className={cn('overflow-hidden p-0', className)} showCloseButton={showCloseButton}>\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst commandInputVariants = cva('', {\n variants: {\n variant: { default: '', borderless: 'border-none' },\n inputSize: {\n sm: 'h-7.5 py-2',\n md: 'h-9 py-3',\n lg: 'h-12 py-4',\n },\n },\n defaultVariants: { variant: 'default', inputSize: 'md' },\n})\n\nexport type CommandInputProps = Omit<React.ComponentProps<typeof CommandPrimitive.Input>, 'size'> &\n VariantProps<typeof commandInputVariants> & {\n wrapperClassName?: string\n loading?: boolean\n }\n\nexport const CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, wrapperClassName, loading, readOnly, variant, inputSize, ...props }, ref) => {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className={cn(\n 'flex items-center gap-2 border-b px-3',\n commandInputVariants({ variant, inputSize }),\n wrapperClassName,\n )}\n >\n {loading ? <Spinner classNames=\"size-4\" /> : <MagnifyingGlassIcon className=\"size-4 shrink-0 opacity-50\" />}\n <CommandPrimitive.Input\n ref={ref}\n data-slot=\"command-input\"\n className={cn(\n 'placeholder:text-muted-foreground flex w-full rounded bg-transparent text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n readOnly={loading || readOnly}\n {...props}\n />\n </div>\n )\n },\n)\nCommandInput.displayName = 'CommandInput'\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn('max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto', className)}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({ ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return <CommandPrimitive.Empty data-slot=\"command-empty\" className=\"py-6 text-center text-sm\" {...props} />\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n commandInputVariants,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import { EnterFullScreenIcon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { type PropsWithChildren, type ReactNode } from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\nimport { Loader } from '../spinner/spinner'\n\nconst gridContentFrameVariants = cva('flex flex-col border-1 border-(--discreet-border) h-full w-full', {\n variants: {\n variant: {\n default: '',\n inverted: 'bg-sidebar-border border-background border-e-transparent border-t-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nconst gridContentFrameHeaderVariants = cva('flex items-center overflow-hidden p-3 min-h-10 border-b-1', {\n variants: {\n variant: {\n default: 'border-(--discreet-border)',\n inverted: 'border-t-0 border-t-sidebar-border border-b-background',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\ntype Props = PropsWithChildren<{\n title: string\n controls?: ReactNode[]\n indicators?: ReactNode[]\n onExpand?: () => void\n collapsed?: boolean\n titleLink?: ReactNode\n isLoading?: boolean\n className?: string\n}> &\n VariantProps<typeof gridContentFrameVariants>\n\nexport const ContentFrame = ({\n title = '',\n controls = [],\n indicators = [],\n children,\n onExpand,\n variant,\n collapsed,\n titleLink,\n isLoading = false,\n className,\n}: Props) => {\n return (\n <div className={cn(gridContentFrameVariants({ variant }), className)}>\n {collapsed ? (\n <div className=\"flex gap-2.5 min-w-0 items-center [writing-mode:vertical-lr]\">\n <h2 className=\"text-xl flex self-center ms-4\">{title}</h2>\n {indicators.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{indicators}</div>}\n </div>\n ) : (\n <>\n {/* header */}\n <div className={cn(gridContentFrameHeaderVariants({ variant }))}>\n {/* Title + Indicators */}\n <div className=\"flex flex-grow gap-2 overflow-hidden\">\n <h2 className=\"text-xl overflow-hidden text-ellipsis whitespace-nowrap\">{titleLink ?? title}</h2>\n {indicators.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{indicators}</div>}\n </div>\n\n {/* Controls */}\n {controls.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{controls}</div>}\n\n {/* Expand button */}\n {onExpand && (\n <Button\n title=\"Expand\"\n onClick={onExpand}\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 ml-2\"\n __e2e_test_id__={`${title.toLowerCase().replaceAll(' ', '-')}-modal-button`}\n >\n <EnterFullScreenIcon />\n </Button>\n )}\n </div>\n\n {/* content */}\n <div className=\"h-full min-h-0 overflow-auto relative\">\n {children}\n {isLoading && <Loader label=\"Loading...\" />}\n </div>\n </>\n )}\n </div>\n )\n}\n","import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold text-foreground', inset && 'pl-8', className)}\n {...props}\n />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut'\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","import { cn } from '../lib/utils'\n\nfunction Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('animate-pulse rounded-md bg-primary/10', className)} {...props} />\n}\n\nexport { Skeleton }\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction DropdownMenu({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Root>>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Portal>>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuTrigger({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>>) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Content>>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Group>>) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\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 [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>>) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: Readonly<\n React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: Readonly<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\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Sub>>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: Readonly<\n React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\ntype SelectProps = React.ComponentProps<typeof SelectPrimitive.Root> & {\n /**\n * E2E test_id to identify the select.\n */\n __e2e_test_id__?: string\n}\n\nfunction Select({ __e2e_test_id__, ...rest }: SelectProps) {\n return <SelectPrimitive.Root data-test-id={__e2e_test_id__} {...rest} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nconst selectTriggerVariants = cva(\n \"data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex items-center gap-2 rounded-md border text-md shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n size: {\n default: 'h-9 px-3 py-2',\n sm: 'h-8 px-2.5 py-1.5',\n lg: 'h-10 px-4 py-2.5',\n xs: 'h-7 px-2 py-1',\n },\n variant: {\n default:\n 'justify-between 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:bg-input/30 dark:hover:bg-input/50 bg-transparent',\n simple:\n 'justify-start bg-background cursor-pointer border-foreground text-left data-[placeholder]:border-(--discreet-border)',\n },\n },\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n },\n)\nconst selectTriggerTextVariants = cva('', {\n variants: {\n variant: {\n default: '',\n simple: 'overflow-hidden whitespace-nowrap text-ellipsis',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nfunction SelectTrigger({\n className,\n size,\n variant,\n children,\n asChild = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n VariantProps<typeof selectTriggerVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : SelectPrimitive.Trigger\n\n return (\n <Comp\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(selectTriggerVariants({ size, variant, className }), '[&[data-state=open]>svg]:rotate-180')}\n {...props}\n >\n <span className={cn('flex-1', selectTriggerTextVariants({ variant }))}>{children}</span>\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"flex-none size-4 opacity-50 \" />\n </SelectPrimitive.Icon>\n </Comp>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md',\n className,\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n {...props}\n />\n )\n}\n\nconst selectItemVariants = cva(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded pr-8 pl-2 text-md outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n {\n variants: {\n type: {\n default: '',\n deselect: 'italic text-muted-foreground focus:text-muted-foreground',\n },\n spacing: {\n sm: 'py-1',\n md: 'py-1.5',\n lg: 'py-2.5',\n },\n },\n defaultVariants: {\n type: 'default',\n spacing: 'md',\n },\n },\n)\n\nfunction SelectItem({\n className,\n children,\n type,\n spacing,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item> & VariantProps<typeof selectItemVariants>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(selectItemVariants({ type, spacing, className }))}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4 \" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border pointer-events-none -mx-1 my-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\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('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","/* Modified DateRangePicker based DateRangePicker by John Polacek (https://github.com/johnpolacek/date-range-picker-for-shadcn) (MIT License) */\n\nimport { CalendarIcon, CrossIcon } from 'lucide-react'\nimport React, { useEffect, useState } from 'react'\n\nimport { Button } from '../../../button/button'\nimport { Calendar } from '../../../calendar/calendar'\nimport { cn } from '../../../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../select/select'\n\nexport type GanttTimerangePickerProps = {\n initialDateFrom?: Date\n initialDateTo?: Date\n // onRangeChange now receives ISO string date range (UTC-normalized) or undefined\n onRangeChange?: (values: ISODateRange | undefined) => void\n timelineStart?: Date\n timelineEnd?: Date\n}\n\ntype DateRange = {\n from?: Date\n to?: Date\n}\n\n// ISODateRange with ISO string dates for UTC-normalized range for querying\nexport type ISODateRange = {\n from?: string\n to?: string\n}\n\n// reusable helper: convert an ISO UTC-normalized date string back to a local Date\nexport const isoToLocalDate = (iso?: string): Date | undefined => {\n if (!iso) {\n return undefined\n }\n const d = new Date(iso) // parse ISO instant\n // build a local Date that has the same calendar day as the UTC date parts\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())\n}\n\n// helper to convert internal Date range to ISO strings normalized to UTC start/end of day\nconst convertRangeToISO = (r?: { from?: Date; to?: Date } | undefined): ISODateRange | undefined => {\n if (!(r?.from && r?.to)) {\n return undefined\n }\n const from = r.from\n const to = r.to\n\n const fromIso = new Date(\n Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), 0, 0, 0, 0),\n ).toISOString()\n const toIso = new Date(\n Date.UTC(to.getUTCFullYear(), to.getUTCMonth(), to.getUTCDate(), 23, 59, 59, 999),\n ).toISOString()\n\n return { from: fromIso, to: toIso }\n}\n\ntype Preset = {\n name: string\n label: string\n}\n\nconst PRESETS: Preset[] = [\n { name: 'sinceStart', label: 'Since timeline start' },\n { name: 'thisYear', label: 'This year' },\n { name: 'nextFullYear', label: 'Next full year' },\n { name: 'next1Year', label: 'Next 1 year' },\n { name: 'next2Year', label: 'Next 2 years' },\n { name: 'next3Year', label: 'Next 3 years' },\n { name: 'untilEnd', label: 'Until timeline end' },\n]\n\nexport const GanttTimerangePicker = ({\n initialDateFrom,\n initialDateTo,\n onRangeChange,\n timelineStart,\n timelineEnd,\n}: GanttTimerangePickerProps) => {\n const [range, setRange] = useState<DateRange | undefined>(\n initialDateFrom || initialDateTo ? { from: initialDateFrom, to: initialDateTo } : undefined,\n )\n const [isOpen, setIsOpen] = useState(false)\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(undefined)\n const [isSmallScreen, setIsSmallScreen] = useState(\n globalThis.innerWidth === undefined ? false : globalThis.innerWidth < 960,\n )\n\n // listen to window resize events to enable a small screen mode\n useEffect(() => {\n const handleResize = (): void => {\n setIsSmallScreen(globalThis.innerWidth < 960)\n }\n globalThis.addEventListener('resize', handleResize)\n // Clean up event listener on unmount\n return () => {\n globalThis.removeEventListener('resize', handleResize)\n }\n }, [])\n\n const getPresetRange = (presetName: string, timelineStart?: Date, timelineEnd?: Date): DateRange => {\n const preset = PRESETS.find(({ name }) => name === presetName)\n if (!preset) {\n throw new Error(`Unknown date range preset: ${presetName}`)\n }\n const from = new Date()\n const to = new Date()\n\n switch (preset.name) {\n case 'sinceStart':\n if (timelineStart) {\n from.setFullYear(timelineStart.getFullYear(), timelineStart.getMonth(), timelineStart.getDate())\n }\n from.setHours(0, 0, 0, 0)\n to.setHours(23, 59, 59, 999)\n break\n case 'thisYear':\n from.setFullYear(from.getFullYear(), 0, 1)\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear(), 11, 31)\n to.setHours(23, 59, 59, 999)\n break\n case 'nextFullYear':\n from.setFullYear(from.getFullYear() + 1, 0, 1)\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 1, 11, 31)\n to.setHours(23, 59, 59, 999)\n break\n case 'next1Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 1)\n to.setHours(23, 59, 59, 999)\n break\n case 'next2Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 2)\n to.setHours(23, 59, 59, 999)\n break\n case 'next3Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 3)\n to.setHours(23, 59, 59, 999)\n break\n case 'untilEnd':\n from.setHours(0, 0, 0, 0)\n if (timelineEnd) {\n to.setFullYear(timelineEnd.getFullYear(), timelineEnd.getMonth(), timelineEnd.getDate())\n }\n to.setHours(23, 59, 59, 999)\n break\n }\n\n return { from, to }\n }\n\n // automatically detect selected preset when range changes (internal Date range)\n useEffect(() => {\n if (!range?.from || !range.to) {\n setSelectedPreset(undefined)\n return\n }\n for (const preset of PRESETS) {\n const presetRange = getPresetRange(preset.name, timelineStart, timelineEnd)\n if (!presetRange.from || !presetRange.to) {\n continue\n }\n\n const normalizedRangeFrom = new Date(range.from)\n normalizedRangeFrom.setHours(0, 0, 0, 0)\n const normalizedPresetFrom = new Date(presetRange.from)\n normalizedPresetFrom.setHours(0, 0, 0, 0)\n\n const normalizedRangeTo = new Date(range.to)\n normalizedRangeTo.setHours(0, 0, 0, 0)\n const normalizedPresetTo = new Date(presetRange.to)\n normalizedPresetTo.setHours(0, 0, 0, 0)\n\n if (\n normalizedRangeFrom.getTime() === normalizedPresetFrom.getTime() &&\n normalizedRangeTo.getTime() === normalizedPresetTo.getTime()\n ) {\n setSelectedPreset(preset.name)\n return\n }\n }\n setSelectedPreset(undefined)\n }, [range, timelineStart, timelineEnd])\n\n return (\n <Popover\n modal={true}\n open={isOpen}\n onOpenChange={(isOpen) => {\n setIsOpen(isOpen)\n // on close, emit ISO-normalized range\n if (!isOpen) {\n onRangeChange?.(convertRangeToISO(range))\n }\n }}\n >\n <PopoverTrigger asChild>\n <Button size=\"iconSm\" variant=\"extraGhost2\">\n <CalendarIcon className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-auto p-2 m-2 relative\">\n <div className=\"flex justify-between items-center\">\n <span className=\"pl-2\">\n {range?.from && range?.to\n ? `${range.from.toLocaleDateString()} - ${range.to.toLocaleDateString()} selected`\n : 'No range selected'}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 rounded\"\n onClick={() => {\n setIsOpen(false)\n }}\n >\n <CrossIcon className=\"size-5\" />\n </Button>\n </div>\n <div className=\"flex\">\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n {isSmallScreen && (\n <Select\n defaultValue={selectedPreset}\n onValueChange={(value) => {\n setRange(getPresetRange(value))\n }}\n >\n <SelectTrigger size=\"xs\" className=\"w-[180px] mx-auto mt-2\">\n <SelectValue placeholder=\"Select...\" />\n </SelectTrigger>\n <SelectContent>\n {PRESETS.map((preset) => (\n <SelectItem key={preset.name} value={preset.name}>\n {preset.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <div className={cn('h-[325px]', isSmallScreen && 'mb-8')}>\n <Calendar\n mode=\"range\"\n showYearNavigation={true}\n disabled={(date) =>\n (timelineStart ? date < timelineStart : false) || (timelineEnd ? date > timelineEnd : false)\n }\n onSelect={(value: { from?: Date; to?: Date } | undefined) => {\n if (value?.from != null) {\n const from = value.from\n const to = value.to ?? value.from\n // Normalize the range so that from <= to\n setRange(to < from ? { from: to, to: from } : { from, to })\n }\n }}\n selected={range?.from && range?.to ? { from: range.from, to: range.to } : undefined}\n numberOfMonths={isSmallScreen ? 1 : 2}\n defaultMonth={new Date(new Date().setMonth(new Date().getMonth() - (isSmallScreen ? 0 : 1)))}\n />\n </div>\n </div>\n </div>\n {!isSmallScreen && (\n <div className=\"flex flex-col items-start gap-1 pr-2 pl-12 py-3\">\n {PRESETS.map((preset) => (\n <PresetButton\n key={preset.name}\n preset={preset.name}\n label={preset.label}\n isSelected={selectedPreset === preset.name}\n onSelect={(presetName) => setRange(getPresetRange(presetName))}\n />\n ))}\n </div>\n )}\n </div>\n <div className=\"flex gap-2 absolute bottom-3 right-3\">\n <Button\n variant=\"outlineInvert\"\n size=\"smLow\"\n className=\"\"\n onClick={() => {\n setRange(undefined)\n }}\n >\n Clear Range\n </Button>\n <Button\n size=\"smLow\"\n onClick={() => {\n setIsOpen(false)\n onRangeChange?.(convertRangeToISO(range))\n }}\n >\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nconst PresetButton = ({\n preset,\n label,\n isSelected,\n onSelect,\n}: {\n preset: string\n label: string\n isSelected: boolean\n onSelect: (preset: string) => void\n}): React.ReactNode => (\n <Button\n className={`w-full justify-start ${isSelected ? 'pointer-events-none bg-accent' : ''}`}\n variant=\"ghost\"\n size=\"smLow\"\n onClick={() => onSelect(preset)}\n >\n {label}\n </Button>\n)\n","import { useRef } from 'react'\n\nimport { GanttTimerangePicker } from './gantt-timerange-picker'\n\n// Gantt header component rendering the timeline scale\nexport const GanttTimeline = ({ header }: { header: any }) => {\n const cellOpts = header.column.columnDef.meta?.cell\n const containerRef = useRef<HTMLDivElement>(null)\n if (!cellOpts) {\n return null\n }\n const ts = cellOpts.dateRangeFrom ?? cellOpts.timelineStart\n const te = cellOpts.dateRangeTo ?? cellOpts.timelineEnd\n if (!(ts instanceof Date) || !(te instanceof Date)) {\n return null\n }\n const timelineStartMs = ts.getTime()\n const timelineEndMs = te.getTime()\n if (timelineEndMs <= timelineStartMs) {\n return null\n }\n const firstFullYear = ts.getFullYear() + 1\n const totalYears = te.getFullYear() - ts.getFullYear() + 1\n\n const scale = containerRef.current?.getBoundingClientRect().width\n ? containerRef.current.getBoundingClientRect().width / (totalYears ?? 1)\n : 1\n const showMonths = scale / 12 >= 5\n\n const timelineDurationMs = timelineEndMs - timelineStartMs\n const firstYearPartialMs = new Date(firstFullYear, 0, 1).getTime() - timelineStartMs\n const lastYearPartialMs = timelineEndMs - new Date(te.getFullYear(), 0, 1).getTime()\n\n const firstMonthPartialMs = new Date(ts.getFullYear(), ts.getMonth() + 1, 1).getTime() - timelineStartMs\n const lastMonthPartialMs = timelineEndMs - new Date(te.getFullYear(), te.getMonth(), 1).getTime()\n\n return (\n <>\n <div className=\"absolute right-8 top-1/2 z-10 -translate-y-1/2\">\n <GanttTimerangePicker\n initialDateFrom={cellOpts.dateRangeFrom ?? undefined}\n initialDateTo={cellOpts.dateRangeTo ?? undefined}\n onRangeChange={cellOpts.onRangeChange ?? undefined}\n timelineStart={cellOpts.timelineStart}\n timelineEnd={cellOpts.timelineEnd}\n />\n </div>\n <div ref={containerRef} className=\"pointer-events-none absolute left-0 right-0 bottom-0 z-0 h-3 flex px-1\">\n {Array.from({ length: totalYears }, (_, i) => firstFullYear + i - 1).map((year, index) => (\n /* distribute space between years with flex-grow except for first and last as they might only be partial */\n <div\n key={year}\n className=\"h-full relative flex grow border-l border-muted-foreground/30 first:border-none first:grow-0 last:grow-0 overflow-hidden\"\n style={\n // index == 0: first year, index == totalYears -1: last year\n index == 0 || index == totalYears - 1\n ? { width: `${((index == 0 ? firstYearPartialMs : lastYearPartialMs) / timelineDurationMs) * 100}%` }\n : undefined\n }\n >\n {showMonths && (\n /* first month with calculated width as it might only be partial */\n <div className=\"absolute bottom-0 left-0 right-0 flex h-1.5 w-full\">\n {index == 0 && ts.getMonth() < 11 && (\n <div\n className=\"h-full border-r border-dashed border-muted-foreground/30\"\n style={{ width: `${(firstMonthPartialMs / firstYearPartialMs) * 100}%` }}\n />\n )}\n {/* distribute rest of space between months with flex-grow */}\n {Array.from({\n length: (index == totalYears - 1 ? te.getMonth() : 12) - (index == 0 ? ts.getMonth() + 1 : 0),\n }).map((_, monthIndex) => (\n <div\n key={`${year}-${monthIndex}`}\n className=\"grow h-full border-r border-dashed border-muted-foreground/30 last:border-0\"\n />\n ))}\n {/* last month with calculated width as it might only be partial */}\n {index == totalYears - 1 && te.getMonth() > 0 && (\n <div className=\"h-full\" style={{ width: `${(lastMonthPartialMs / lastYearPartialMs) * 100}%` }} />\n )}\n </div>\n )}\n\n <span className=\"ps-0.5 -mt-px text-xs text-muted-foreground select-none z-1\">{year}</span>\n </div>\n ))}\n </div>\n </>\n )\n}\n","import type { ColumnSort, Header, SortDirection, SortingState, Table } from '@tanstack/react-table'\n\nimport {\n BaselineIcon,\n CalendarIcon,\n CheckSquareIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n EyeOffIcon,\n HashIcon,\n ListChecksIcon,\n ListIcon,\n PinIcon,\n PinOffIcon,\n TextInitialIcon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu/dropdown-menu'\nimport { cn } from '../lib/utils'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip/tooltip'\n\nimport { GanttTimeline } from './cell-variants/utils/gantt-timeline'\nimport type { Cell, ColumnMenuRendererFunction } from './data-grid-types'\n\nfunction getColumnVariant(variant?: Cell['variant']): {\n icon: React.ComponentType<React.SVGProps<SVGSVGElement>>\n label: string\n} | null {\n switch (variant) {\n case 'short-text':\n return { icon: BaselineIcon, label: 'Short text' }\n case 'long-text':\n return { icon: TextInitialIcon, label: 'Long text' }\n case 'number':\n return { icon: HashIcon, label: 'Number' }\n case 'select':\n return { icon: ListIcon, label: 'Select' }\n case 'multi-select':\n return { icon: ListChecksIcon, label: 'Multi-select' }\n case 'checkbox':\n return { icon: CheckSquareIcon, label: 'Checkbox' }\n case 'date':\n return { icon: CalendarIcon, label: 'Date' }\n default:\n return null\n }\n}\n\ntype DataGridColumnHeaderProps<TData, TValue> = {\n header: Header<TData, TValue>\n table: Table<TData>\n} & React.ComponentProps<typeof DropdownMenuTrigger>\n\nexport function DataGridColumnHeader<TData, TValue>({\n header,\n table,\n className,\n onPointerDown,\n ...props\n}: DataGridColumnHeaderProps<TData, TValue>) {\n const [open, setOpen] = React.useState(false)\n\n const column = header.column\n const label = column.columnDef.meta?.label\n ? column.columnDef.meta.label\n : typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id\n\n const isAnyColumnResizing = table.getState().columnSizingInfo.isResizingColumn\n\n const cellVariant = column.columnDef.meta?.cell\n const columnVariant = getColumnVariant(cellVariant?.variant)\n\n const pinnedPosition = column.getIsPinned()\n const isPinnedLeft = pinnedPosition === 'left'\n const isPinnedRight = pinnedPosition === 'right'\n\n const onSortingChange = React.useCallback(\n (direction: SortDirection) => {\n table.setSorting((prev: SortingState) => {\n const existingSortIndex = prev.findIndex((sort) => sort.id === column.id)\n const newSort: ColumnSort = {\n id: column.id,\n desc: direction === 'desc',\n }\n\n if (existingSortIndex >= 0) {\n const updated = [...prev]\n updated[existingSortIndex] = newSort\n return updated\n } else {\n return [...prev, newSort]\n }\n })\n },\n [column.id, table],\n )\n\n const onSortRemove = React.useCallback(() => {\n table.setSorting((prev: SortingState) => prev.filter((sort) => sort.id !== column.id))\n }, [column.id, table])\n\n const onLeftPin = React.useCallback(() => {\n column.pin('left')\n }, [column])\n\n const onRightPin = React.useCallback(() => {\n column.pin('right')\n }, [column])\n\n const onUnpin = React.useCallback(() => {\n column.pin(false)\n }, [column])\n\n const onTriggerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n onPointerDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (event.button !== 0) {\n return\n }\n table.options.meta?.onColumnClick?.(column.id)\n },\n [table.options.meta, column.id, onPointerDown],\n )\n\n return (\n <>\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger\n className={cn(\n 'flex size-full items-center justify-between gap-2 p-2 text-sm bg-sidebar-accent/80 font-bold hover:bg-secondary/40 data-[state=open]:bg-secondary/40 [&_svg]:size-4',\n isAnyColumnResizing && 'pointer-events-none',\n className,\n )}\n onPointerDown={onTriggerPointerDown}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {columnVariant && (\n <TooltipProvider>\n <Tooltip delayDuration={100}>\n <TooltipTrigger asChild>\n <columnVariant.icon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>{columnVariant.label}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <span className=\"truncate\">{label}</span>\n </div>\n <ChevronDownIcon className=\"shrink-0 text-muted-foreground\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={0} className=\"w-60\">\n {column.getCanSort() && (\n <>\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={column.getIsSorted() === 'asc'}\n onClick={() => onSortingChange('asc')}\n >\n <ChevronUpIcon />\n Sort asc\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={column.getIsSorted() === 'desc'}\n onClick={() => onSortingChange('desc')}\n >\n <ChevronDownIcon />\n Sort desc\n </DropdownMenuCheckboxItem>\n {column.getIsSorted() && (\n <DropdownMenuItem onClick={onSortRemove}>\n <XIcon />\n Remove sort\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanPin() && (\n <>\n {column.getCanSort() && <DropdownMenuSeparator />}\n\n {isPinnedLeft ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onUnpin}>\n <PinOffIcon />\n Unpin from left\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onLeftPin}>\n <PinIcon />\n Pin to left\n </DropdownMenuItem>\n )}\n {isPinnedRight ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onUnpin}>\n <PinOffIcon />\n Unpin from right\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onRightPin}>\n <PinIcon />\n Pin to right\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={!column.getIsVisible()}\n onClick={() => column.toggleVisibility(false)}\n >\n <EyeOffIcon />\n Hide column\n </DropdownMenuCheckboxItem>\n </>\n )}\n\n {/* Render header menu footer (custom optional component) */}\n {column.columnDef.meta?.headerMenuFooter && (\n <>\n <DropdownMenuSeparator />\n <div className=\"dropdown-footer\">\n {isMenuRendererFunction(column.columnDef.meta.headerMenuFooter)\n ? column.columnDef.meta.headerMenuFooter({ column, open, onOpenChange: setOpen })\n : column.columnDef.meta.headerMenuFooter}\n </div>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {/* Render any variant-provided header component from HeaderComponents. */}\n {(() => {\n const variant = column.columnDef.meta?.cell?.variant\n const variantHeader = variant ? HeaderComponents[variant] : undefined\n if (variantHeader) {\n return variantHeader({ header, table })\n }\n\n return null\n })()}\n\n {/* Render custom column header component (optional columnDef.meta) */}\n {column.columnDef.meta?.headerCustomComponent && (\n <>\n {isMenuRendererFunction(column.columnDef.meta.headerCustomComponent)\n ? column.columnDef.meta.headerCustomComponent({ column })\n : column.columnDef.meta.headerCustomComponent}\n </>\n )}\n\n {header.column.getCanResize() && <DataGridColumnResizer header={header} table={table} label={label} />}\n </>\n )\n}\n\nconst DataGridColumnResizer = React.memo(DataGridColumnResizerImpl, (prev, next) => {\n const prevColumn = prev.header.column\n const nextColumn = next.header.column\n\n if (prevColumn.getIsResizing() !== nextColumn.getIsResizing() || prevColumn.getSize() !== nextColumn.getSize()) {\n return false\n }\n\n if (prev.label !== next.label) {\n return false\n }\n\n return true\n}) as typeof DataGridColumnResizerImpl\n\ntype DataGridColumnResizerProps<TData, TValue> = {\n label: string\n} & DataGridColumnHeaderProps<TData, TValue>\n\nfunction DataGridColumnResizerImpl<TData, TValue>({ header, table, label }: DataGridColumnResizerProps<TData, TValue>) {\n const defaultColumnDef = table._getDefaultColumnDef()\n\n const onDoubleClick = React.useCallback(() => {\n header.column.resetSize()\n }, [header.column])\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${label} column`}\n aria-valuenow={header.column.getSize()}\n aria-valuemin={defaultColumnDef.minSize}\n aria-valuemax={defaultColumnDef.maxSize}\n tabIndex={0}\n className={cn(\n 'right-0 absolute top-0 z-50 h-full w-0 touch-none select-none cursor-ew-resize focus:outline-none',\n // visible thin line (use right positioning and a stable 1px width)\n \"before:content-[''] before:absolute before:inset-y-0 before:right-0 before:translate-x-1/2 before:w-px before:h-full before:bg-accent-foreground/70 before:opacity-0 before:transition-opacity before:duration-150\",\n // large invisible hit area\n \"after:content-[''] after:absolute after:inset-y-0 after:right-0 after:translate-x-1/2 after:w-[18px] after:h-full after:bg-transparent\",\n header.column.getIsResizing() ? 'before:opacity-100 before:bg-accent-foreground' : 'hover:before:opacity-100',\n )}\n style={{ willChange: 'transform, opacity', transform: 'translateZ(0)' }}\n onDoubleClick={onDoubleClick}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )\n}\n\nfunction isMenuRendererFunction<TData, TValue>(\n value: React.ReactNode | ColumnMenuRendererFunction<TData, TValue>,\n): value is ColumnMenuRendererFunction<TData, TValue> {\n return typeof value === 'function'\n}\n\n/**\n * Optional header components keyed by cell variant. Components receive { header, table } and\n * should return a React node (or null). This allows the column header to render variant-specific\n * header visuals without coupling the header implementation to variants.\n */\nexport const HeaderComponents: Record<string, (props: any) => React.ReactNode | null> = {\n gantt: (props) => <GanttTimeline {...props} />,\n}\n","import type { Column } from '@tanstack/react-table'\n\nimport type { CellPosition, RowHeightValue } from './data-grid-types'\n\nexport function getCellKey(rowIndex: number, columnId: string) {\n return `${rowIndex}:${columnId}`\n}\n\nexport function parseCellKey(cellKey: string): Required<CellPosition> {\n const parts = cellKey.split(':')\n const rowIndexStr = parts[0]\n const columnId = parts[1]\n if (rowIndexStr && columnId) {\n const rowIndex = parseInt(rowIndexStr, 10)\n if (!Number.isNaN(rowIndex)) {\n return { rowIndex, columnId }\n }\n }\n return { rowIndex: 0, columnId: '' }\n}\n\nexport function getRowHeightValue(rowHeight: RowHeightValue): number {\n // TODO: Make lineHeight configurable / use css variable: --data-grid-line-height\n const lineHeight = 16\n\n return lineHeight * getLineCount(rowHeight) + 12\n}\n\nexport function getLineCount(rowHeight: RowHeightValue): number {\n const lineCountMap: Record<RowHeightValue, number> = {\n short: 1,\n medium: 2,\n tall: 3,\n 'extra-tall': 4,\n }\n\n return lineCountMap[rowHeight]\n}\n\nexport function getCommonPinningStyles<TData>({\n column,\n withBorder = false,\n}: {\n column: Column<TData>\n withBorder?: boolean\n}): React.CSSProperties {\n const isPinned = column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && column.getIsLastColumn('left')\n const isFirstRightPinnedColumn = isPinned === 'right' && column.getIsFirstColumn('right')\n\n return {\n boxShadow: withBorder\n ? isLastLeftPinnedColumn\n ? '-4px 0 4px var(--border) inset'\n : isFirstRightPinnedColumn\n ? '4px 0 -4px var(--border) inset'\n : undefined\n : undefined,\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n opacity: isPinned ? 0.97 : 1,\n position: isPinned ? 'sticky' : 'relative',\n background: isPinned ? 'var(--background)' : 'var(--background)',\n width: column.getSize(),\n zIndex: isPinned ? 1 : undefined,\n }\n}\n","import type { Table, TableMeta } from '@tanstack/react-table'\n\nimport { CopyIcon, EraserIcon, TrashIcon } from 'lucide-react'\nimport * as React from 'react'\nimport { toast } from 'sonner'\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu/dropdown-menu'\n\nimport type { UpdateCell } from './data-grid-types'\nimport { parseCellKey } from './data-grid-utils'\n\ntype DataGridContextMenuProps<TData> = {\n table: Table<TData>\n}\n\nexport function DataGridContextMenu<TData>({ table }: DataGridContextMenuProps<TData>) {\n const meta = table.options.meta\n const contextMenu = meta?.contextMenu\n const onContextMenuOpenChange = meta?.onContextMenuOpenChange\n const selectionState = meta?.selectionState\n const dataGridRef = meta?.dataGridRef\n const onDataUpdate = meta?.onDataUpdate\n const onRowsDelete = meta?.onRowsDelete\n\n if (!contextMenu) {\n return null\n }\n\n return (\n <ContextMenu\n table={table}\n dataGridRef={dataGridRef}\n contextMenu={contextMenu}\n onContextMenuOpenChange={onContextMenuOpenChange}\n selectionState={selectionState}\n onDataUpdate={onDataUpdate}\n onRowsDelete={onRowsDelete}\n />\n )\n}\n\ntype ContextMenuProps<TData> = {\n table: Table<TData>\n} & Pick<\n TableMeta<TData>,\n 'dataGridRef' | 'onContextMenuOpenChange' | 'selectionState' | 'onDataUpdate' | 'onRowsDelete'\n> &\n Required<Pick<TableMeta<TData>, 'contextMenu'>>\n\nconst ContextMenu = React.memo(ContextMenuImpl, (prev, next) => {\n if (prev.contextMenu.open !== next.contextMenu.open) {\n return false\n }\n if (!next.contextMenu.open) {\n return true\n }\n if (prev.contextMenu.x !== next.contextMenu.x) {\n return false\n }\n if (prev.contextMenu.y !== next.contextMenu.y) {\n return false\n }\n\n const prevSize = prev.selectionState?.selectedCells?.size ?? 0\n const nextSize = next.selectionState?.selectedCells?.size ?? 0\n if (prevSize !== nextSize) {\n return false\n }\n\n return true\n}) as typeof ContextMenuImpl\n\nfunction ContextMenuImpl<TData>({\n table,\n dataGridRef,\n contextMenu,\n onContextMenuOpenChange,\n selectionState,\n onDataUpdate,\n onRowsDelete,\n}: ContextMenuProps<TData>) {\n const triggerStyle = React.useMemo<React.CSSProperties>(\n () => ({\n position: 'fixed',\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n width: '1px',\n height: '1px',\n padding: 0,\n margin: 0,\n border: 'none',\n background: 'transparent',\n pointerEvents: 'none',\n opacity: 0,\n }),\n [contextMenu.x, contextMenu.y],\n )\n\n const onCloseAutoFocus: NonNullable<React.ComponentProps<typeof DropdownMenuContent>['onCloseAutoFocus']> =\n React.useCallback(\n (event) => {\n event.preventDefault()\n dataGridRef?.current?.focus()\n },\n [dataGridRef],\n )\n\n const onCopy = React.useCallback(async () => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n const rows = table.getRowModel().rows\n const columnIds: string[] = []\n\n const selectedCellsArray = Array.from(selectionState.selectedCells)\n for (const cellKey of selectedCellsArray) {\n const { columnId } = parseCellKey(cellKey)\n if (columnId && !columnIds.includes(columnId)) {\n columnIds.push(columnId)\n }\n }\n\n const cellData = new Map<string, string>()\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n const row = rows[rowIndex]\n if (row) {\n const cell = row.getVisibleCells().find((c) => c.column.id === columnId)\n if (cell) {\n const value = cell.getValue()\n cellData.set(cellKey, String(value ?? ''))\n }\n }\n }\n\n const rowIndices = new Set<number>()\n const colIndices = new Set<number>()\n\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n rowIndices.add(rowIndex)\n const colIndex = columnIds.indexOf(columnId)\n if (colIndex >= 0) {\n colIndices.add(colIndex)\n }\n }\n\n const sortedRowIndices = Array.from(rowIndices).sort((a, b) => a - b)\n const sortedColIndices = Array.from(colIndices).sort((a, b) => a - b)\n const sortedColumnIds = sortedColIndices.map((i) => columnIds[i])\n\n const tsvData = sortedRowIndices\n .map((rowIndex) =>\n sortedColumnIds\n .map((columnId) => {\n const cellKey = `${rowIndex}:${columnId}`\n return cellData.get(cellKey) ?? ''\n })\n .join('\\t'),\n )\n .join('\\n')\n\n await navigator.clipboard.writeText(tsvData)\n toast.success(\n `${selectionState.selectedCells.size} cell${selectionState.selectedCells.size !== 1 ? 's' : ''} copied`,\n )\n }, [table, selectionState])\n\n // Determine whether the selected cells are all editable. If any selected cell belongs to a non-editable column (meta.editable === false), disable the Clear action.\n const canClear = React.useMemo(() => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return false\n }\n\n const visibleCols = table.getVisibleLeafColumns()\n const rows = table.getRowModel().rows\n\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n if (!columnId) {\n continue\n }\n const col = visibleCols.find((c) => c.id === columnId)\n const editable = col?.columnDef?.meta?.editable\n\n if (editable === false) {\n return false\n }\n\n if (typeof editable === 'function') {\n const row = rows[rowIndex]\n if (row && !editable(row.original)) {\n return false\n }\n }\n }\n\n return true\n }, [selectionState, table])\n\n const onClear = React.useCallback(() => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n if (!canClear) {\n return\n }\n\n const updates: UpdateCell[] = []\n\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n updates.push({ rowIndex, columnId, value: '' })\n }\n\n onDataUpdate?.(updates)\n\n toast.success(`${updates.length} cell${updates.length !== 1 ? 's' : ''} cleared`)\n }, [onDataUpdate, selectionState, canClear])\n\n const onDelete = React.useCallback(async () => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n const rowIndices = new Set<number>()\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex } = parseCellKey(cellKey)\n rowIndices.add(rowIndex)\n }\n\n const rowIndicesArray = Array.from(rowIndices).sort((a, b) => a - b)\n const rowCount = rowIndicesArray.length\n\n await onRowsDelete?.(rowIndicesArray)\n\n toast.success(`${rowCount} row${rowCount !== 1 ? 's' : ''} deleted`)\n }, [onRowsDelete, selectionState])\n\n return (\n <DropdownMenu open={contextMenu.open} onOpenChange={onContextMenuOpenChange}>\n <DropdownMenuTrigger style={triggerStyle} />\n <DropdownMenuContent data-grid-popover=\"\" align=\"start\" className=\"w-48\" onCloseAutoFocus={onCloseAutoFocus}>\n <DropdownMenuItem onSelect={onCopy}>\n <CopyIcon />\n Copy\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={onClear} disabled={!canClear}>\n <EraserIcon />\n Clear\n </DropdownMenuItem>\n {onRowsDelete && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem variant=\"destructive\" onSelect={onDelete}>\n <TrashIcon />\n Delete rows\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import * as React from 'react'\n\ntype PossibleRef<T> = React.Ref<T> | undefined\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === 'function') {\n return ref(value)\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node)\n if (!hasCleanup && typeof cleanup === 'function') {\n hasCleanup = true\n }\n return cleanup\n })\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i]\n if (typeof cleanup === 'function') {\n cleanup()\n } else {\n setRef(refs[i], null)\n }\n }\n }\n }\n return undefined\n }\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return React.useCallback(composeRefs(...refs), refs)\n}\n\nexport { composeRefs, useComposedRefs }\n","import { flexRender, type Row } from '@tanstack/react-table'\nimport type { Virtualizer } from '@tanstack/react-virtual'\n\nimport * as React from 'react'\n\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nimport type { CellPosition, RowHeightValue } from './data-grid-types'\nimport { getCommonPinningStyles, getLineCount } from './data-grid-utils'\n\ntype DataGridRowProps<TData> = {\n row: Row<TData>\n rowVirtualizer: Virtualizer<HTMLDivElement, Element>\n virtualRowIndex: number\n virtualStart: number\n rowMapRef: React.RefObject<Map<number, HTMLDivElement>>\n rowHeight: RowHeightValue\n focusedCell: CellPosition | null\n editingCell: CellPosition | null\n selectionSize: number\n visibleColumnIds: string\n /** Whether this row is highlighted (e.g., via keyField-based URL routing) */\n isHighlighted?: boolean\n /** Called when the row is clicked (for row-level navigation) */\n onRowClick?: (rowIndex: number) => void\n} & React.ComponentProps<'div'>\n\nexport const DataGridRow = React.memo(DataGridRowImpl, (prev, next) => {\n // Always re-render if row identity or data changed\n if (prev.row.id !== next.row.id) {\n return false\n }\n if (prev.row.original !== next.row.original) {\n return false\n }\n\n // Check focus changes - only re-render if THIS row's focus state changed\n const prevRowIndex = prev.virtualRowIndex\n const nextRowIndex = next.virtualRowIndex\n\n const prevHasFocus = prev.focusedCell?.rowIndex === prevRowIndex\n const nextHasFocus = next.focusedCell?.rowIndex === nextRowIndex\n\n if (prevHasFocus !== nextHasFocus) {\n return false\n }\n\n // If this row has focus, check if the focused column changed\n if (nextHasFocus && prevHasFocus) {\n if (prev.focusedCell?.columnId !== next.focusedCell?.columnId) {\n return false\n }\n }\n\n // Check editing changes - only re-render if THIS row's editing state changed\n const prevHasEditing = prev.editingCell?.rowIndex === prevRowIndex\n const nextHasEditing = next.editingCell?.rowIndex === nextRowIndex\n\n if (prevHasEditing !== nextHasEditing) {\n return false\n }\n\n // If this row has editing, check if the editing column changed\n if (nextHasEditing && prevHasEditing) {\n if (prev.editingCell?.columnId !== next.editingCell?.columnId) {\n return false\n }\n }\n\n // Check if selection state changed - re-render all rows when selection changes\n // This is a simpler approach than tracking per-row selection\n if (prev.selectionSize !== next.selectionSize) {\n return false\n }\n\n // Re-render if column visibility changed\n if (prev.visibleColumnIds !== next.visibleColumnIds) {\n return false\n }\n\n // Re-render if highlighted state changed\n if (prev.isHighlighted !== next.isHighlighted) {\n return false\n }\n\n // All relevant checks passed - skip re-render\n return true\n}) as typeof DataGridRowImpl\n\nfunction DataGridRowImpl<TData>({\n row,\n virtualRowIndex,\n virtualStart,\n rowVirtualizer,\n rowMapRef,\n rowHeight,\n focusedCell,\n // These props are used only in React.memo's arePropsEqual comparator above,\n // not in the render function. Prefixed with _ to indicate intentional non-use.\n editingCell: _editingCell,\n selectionSize: _selectionSize,\n visibleColumnIds: _visibleColumnIds,\n isHighlighted = false,\n onRowClick,\n ref,\n className,\n ...props\n}: DataGridRowProps<TData>) {\n const rowRef = useComposedRefs(ref, (node) => {\n if (node && typeof virtualRowIndex !== 'undefined') {\n rowVirtualizer.measureElement(node)\n rowMapRef.current.set(virtualRowIndex, node)\n }\n })\n\n const isRowSelected = row.getIsSelected()\n\n const handleRowClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n // Don't trigger row click if clicking on interactive elements like checkbox\n const target = event.target as HTMLElement\n if (target.closest('input, button, [role=\"checkbox\"]')) {\n return\n }\n // Only navigate on single clicks (detail === 1)\n // Double clicks (detail === 2) should enter edit mode instead, handled by cell's onDoubleClick\n if (event.detail === 1) {\n onRowClick?.(virtualRowIndex)\n }\n },\n [onRowClick, virtualRowIndex],\n )\n\n // Initial transform is set via style prop; subsequent updates happen via\n // direct DOM manipulation in useDataGrid's onChange callback\n return (\n <div\n key={row.id}\n role=\"row\"\n aria-rowindex={virtualRowIndex + 2}\n aria-selected={isRowSelected}\n data-index={virtualRowIndex}\n data-slot=\"grid-row\"\n data-highlighted={isHighlighted || undefined}\n ref={rowRef}\n tabIndex={-1}\n className={cn(\n 'absolute flex w-full border-b h-[calc(var(--data-grid-line-height)*(var(--line-count))+12px)]',\n onRowClick && !isHighlighted && 'cursor-pointer hover:bg-accent/30',\n isHighlighted && 'cursor-pointer bg-primary/10 border-t border-primary/40',\n className,\n )}\n style={\n {\n '--line-count': `${getLineCount(rowHeight)}`,\n transform: `translateY(${virtualStart}px)`,\n } as React.CSSProperties\n }\n onClick={onRowClick ? handleRowClick : undefined}\n {...props}\n >\n {row.getVisibleCells().map((cell, colIndex) => {\n const isCellFocused = focusedCell?.rowIndex === virtualRowIndex && focusedCell?.columnId === cell.column.id\n\n return (\n <div\n key={cell.id}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n data-highlighted={isCellFocused ? '' : undefined}\n data-slot=\"grid-cell\"\n tabIndex={-1}\n className={cn({\n 'border-r': cell.column.id !== 'select',\n })}\n style={{\n ...getCommonPinningStyles({ column: cell.column }),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(callback: T | undefined): T {\n const callbackRef = React.useRef(callback)\n\n React.useEffect(() => {\n callbackRef.current = callback\n })\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, [])\n}\n\nexport { useCallbackRef }\n","import * as React from 'react'\n\nimport { useCallbackRef } from './use-callback-ref'\n\nexport function useDebouncedCallback<T extends (...args: never[]) => unknown>(callback: T, delay: number) {\n const handleCallback = useCallbackRef(callback)\n const debounceTimerRef = React.useRef(0)\n React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), [])\n\n const setValue = React.useCallback(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current)\n debounceTimerRef.current = window.setTimeout(() => handleCallback(...args), delay)\n },\n [handleCallback, delay],\n )\n\n return setValue\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Input variants for styling the input element.\n * NOTE: When modifying variants, also update numberInputWrapperVariants in number-input.tsx\n */\nconst inputVariants = cva(\n 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n {\n variants: {\n variant: {\n default: 'min-h-9 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n simple: 'min-h-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\ntype InputProps = React.ComponentProps<'input'> &\n VariantProps<typeof inputVariants> & {\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n /**\n * Callback when Enter key is pressed\n */\n onEnter?: () => void\n /**\n * Additional classes for the wrapper container (only used if wrapper is rendered)\n */\n wrapperClassName?: string\n }\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant, __e2e_test_id__, onEnter, wrapperClassName, ...props }, ref) => {\n const input = (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ variant, className }))}\n data-test-id={__e2e_test_id__}\n onKeyDown={(e) => {\n props.onKeyDown?.(e)\n if (e.key === 'Enter') {\n onEnter?.()\n }\n }}\n ref={ref}\n {...props}\n />\n )\n\n // If wrapperClassName is provided, wrap the input\n if (wrapperClassName) {\n return <div className={wrapperClassName}>{input}</div>\n }\n\n return input\n },\n)\n\nInput.displayName = 'Input'\n\nexport { Input, inputVariants }\nexport type { InputProps }\n","import { ChevronDownIcon, ChevronUpIcon, CrossIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { useDebouncedCallback } from '../hooks/use-debounced-callback'\nimport { Input } from '../input/input'\n\nimport type { SearchState } from './data-grid-types'\n\ntype DataGridSearchProps = {} & SearchState\n\nexport const DataGridSearch = React.memo(DataGridSearchImpl, (prev, next) => {\n if (prev.searchOpen !== next.searchOpen) {\n return false\n }\n\n if (!next.searchOpen) {\n return true\n }\n\n if (prev.searchQuery !== next.searchQuery || prev.matchIndex !== next.matchIndex) {\n return false\n }\n\n if (prev.searchMatches.length !== next.searchMatches.length) {\n return false\n }\n\n for (let i = 0; i < prev.searchMatches.length; i++) {\n const prevMatch = prev.searchMatches[i]\n const nextMatch = next.searchMatches[i]\n\n if (!prevMatch || !nextMatch) {\n return false\n }\n\n if (prevMatch.rowIndex !== nextMatch.rowIndex || prevMatch.columnId !== nextMatch.columnId) {\n return false\n }\n }\n\n return true\n})\n\nfunction DataGridSearchImpl({\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n}: DataGridSearchProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (searchOpen) {\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n })\n }\n }, [searchOpen])\n\n React.useEffect(() => {\n if (!searchOpen) {\n return\n }\n\n function onEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault()\n onSearchOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', onEscape)\n return () => document.removeEventListener('keydown', onEscape)\n }, [searchOpen, onSearchOpenChange])\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n event.stopPropagation()\n\n if (event.key === 'Enter') {\n event.preventDefault()\n if (event.shiftKey) {\n onNavigateToPrevMatch()\n } else {\n onNavigateToNextMatch()\n }\n }\n },\n [onNavigateToNextMatch, onNavigateToPrevMatch],\n )\n\n const debouncedSearch = useDebouncedCallback((query: string) => {\n onSearch(query)\n }, 150)\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value\n onSearchQueryChange(value)\n debouncedSearch(value)\n },\n [onSearchQueryChange, debouncedSearch],\n )\n\n const onTriggerPointerDown = React.useCallback((event: React.PointerEvent<HTMLButtonElement>) => {\n // prevent implicit pointer capture\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n return\n }\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId)\n }\n\n // Only prevent default if we're not clicking on the input\n // This allows text selection in the input while still preventing focus stealing elsewhere\n if (\n event.button === 0 &&\n event.ctrlKey === false &&\n event.pointerType === 'mouse' &&\n !(event.target instanceof HTMLInputElement)\n ) {\n event.preventDefault()\n }\n }, [])\n\n const onPrevMatchPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => onTriggerPointerDown(event),\n [onTriggerPointerDown],\n )\n\n const onNextMatchPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => onTriggerPointerDown(event),\n [onTriggerPointerDown],\n )\n\n const onClose = React.useCallback(() => {\n onSearchOpenChange(false)\n }, [onSearchOpenChange])\n\n if (!searchOpen) {\n return null\n }\n\n return (\n <div\n role=\"search\"\n data-slot=\"grid-search\"\n className=\"fade-in-0 slide-in-from-top-2 absolute top-4 right-4 z-50 flex animate-in flex-col gap-2 rounded-lg border border-border bg-background p-2 shadow-lg\"\n >\n <div className=\"flex items-center gap-2\">\n <Input\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n placeholder=\"Find in table...\"\n className=\"h-8 w-64\"\n ref={inputRef}\n value={searchQuery}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n <div className=\"flex items-center gap-1\">\n <Button\n aria-label=\"Previous match\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onNavigateToPrevMatch}\n onPointerDown={onPrevMatchPointerDown}\n disabled={searchMatches.length === 0}\n >\n <ChevronUpIcon />\n </Button>\n <Button\n aria-label=\"Next match\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onNavigateToNextMatch}\n onPointerDown={onNextMatchPointerDown}\n disabled={searchMatches.length === 0}\n >\n <ChevronDownIcon />\n </Button>\n <Button aria-label=\"Close search\" variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={onClose}>\n <CrossIcon />\n </Button>\n </div>\n </div>\n <div className=\"flex items-center gap-1 whitespace-nowrap text-muted-foreground\">\n {searchMatches.length > 0 ? (\n <span>\n {matchIndex + 1} of {searchMatches.length}\n </span>\n ) : searchQuery ? (\n <span>No results</span>\n ) : (\n <span>Type to search</span>\n )}\n </div>\n </div>\n )\n}\n","import { flexRender } from '@tanstack/react-table'\n\nimport { PlusIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { Skeleton } from '../skeleton/skeleton'\n\nimport type { useDataGrid } from './hooks/use-data-grid'\nimport { DataGridColumnHeader } from './data-grid-column-header'\nimport { DataGridContextMenu } from './data-grid-context-menu'\nimport { DataGridRow } from './data-grid-row'\nimport { DataGridSearch } from './data-grid-search'\nimport { getCommonPinningStyles } from './data-grid-utils'\n\ntype DataGridProps<TData> = {\n height?: number\n} & ReturnType<typeof useDataGrid<TData>> &\n React.ComponentProps<'div'>\n\nexport function DataGrid<TData>({\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n table,\n rowVirtualizer,\n height,\n searchState,\n columnSizeVars,\n onRowAdd,\n className,\n ...props\n}: DataGridProps<TData>) {\n const rows = table.getRowModel().rows\n const columns = table.getAllColumns()\n\n const meta = table.options.meta\n const rowHeight = meta?.rowHeight ?? 'short'\n const focusedCell = meta?.focusedCell ?? null\n const editingCell = meta?.editingCell ?? null\n const selectionSize = meta?.selectionState?.selectedCells?.size ?? 0\n const highlightedRowIndex = meta?.highlightedRowIndex ?? -1\n const onRowClick = meta?.onRowClick\n // Create a key that changes when column visibility changes\n const visibleColumnIds = table\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .join(',')\n\n // Clear row map when visibility changes to avoid stale DOM references.\n // This must happen during render (before child rows set their refs), not in an effect.\n const prevVisibleColumnIdsRef = React.useRef(visibleColumnIds)\n if (prevVisibleColumnIdsRef.current !== visibleColumnIds) {\n rowMapRef.current.clear()\n prevVisibleColumnIdsRef.current = visibleColumnIds\n }\n\n const onGridContextMenu = React.useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault()\n }, [])\n\n const onAddRowKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!onRowAdd) {\n return\n }\n\n if (event.key === 'Enter' || event.key === '') {\n event.preventDefault()\n await onRowAdd()\n }\n },\n [onRowAdd],\n )\n\n // calculate header/footer heights using simple measurements (no observers)\n // previous fallbacks were header ~58 and footer ~13\n const headerHeight = headerRef?.current?.clientHeight ?? 58\n const footerHeight = onRowAdd ? (footerRef?.current?.clientHeight ?? 12) + 1 : 0\n\n // if the grid has a horizontal scrollbar, measure its height so it doesn't overlap content\n let scrollbarHeight = 0\n if (dataGridRef?.current) {\n const el = dataGridRef.current\n if (el.scrollWidth > el.clientWidth) {\n // offsetHeight - clientHeight approximates the scrollbar thickness (includes borders)\n scrollbarHeight = Math.max(0, el.offsetHeight - el.clientHeight)\n }\n }\n\n return (\n <div data-slot=\"grid-wrapper\" className={cn('relative flex w-full flex-col', className)} {...props}>\n {searchState && <DataGridSearch {...searchState} />}\n <DataGridContextMenu table={table} />\n <div\n role=\"grid\"\n aria-label=\"Data grid\"\n aria-rowcount={rows.length + (onRowAdd ? 1 : 0)}\n aria-colcount={columns.length}\n data-slot=\"grid\"\n tabIndex={0}\n ref={dataGridRef}\n className=\"relative grid select-none overflow-auto rounded-md border border-border focus:outline-none\"\n style={{\n ...columnSizeVars,\n // dynamically include measured header/footer heights (falling back to previous magic numbers)\n // include horizontal scrollbar height when present, and add a small buffer of 3px\n height: `${Math.min(\n rowVirtualizer.getTotalSize() + headerHeight + footerHeight + scrollbarHeight + 3,\n height ?? Infinity,\n )}px`,\n }}\n onContextMenu={onGridContextMenu}\n >\n <div\n role=\"rowgroup\"\n data-slot=\"grid-header\"\n ref={headerRef}\n className=\"sticky top-0 z-10 grid border-b bg-background\"\n >\n {table.getHeaderGroups().map((headerGroup, rowIndex) => (\n <div\n key={headerGroup.id}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n data-slot=\"grid-header-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n {headerGroup.headers.map((header, colIndex) => {\n const sorting = table.getState().sorting\n const currentSort = sorting.find((sort) => sort.id === header.column.id)\n const isSortable = header.column.getCanSort()\n\n return (\n <div\n key={header.id}\n role=\"columnheader\"\n aria-colindex={colIndex + 1}\n aria-sort={\n currentSort?.desc === false\n ? 'ascending'\n : currentSort?.desc === true\n ? 'descending'\n : isSortable\n ? 'none'\n : undefined\n }\n data-slot=\"grid-header-cell\"\n tabIndex={-1}\n className={cn('relative', {\n 'border-r': header.column.id !== 'select',\n })}\n style={{\n ...getCommonPinningStyles({ column: header.column }),\n width: `calc(var(--header-${header.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : typeof header.column.columnDef.header === 'function' ? (\n <div className=\"size-full px-3 py-1.5 bg-sidebar-accent/80 hover:bg-secondary/40\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </div>\n ) : (\n <DataGridColumnHeader header={header} table={table} />\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n <div\n role=\"rowgroup\"\n data-slot=\"grid-body\"\n className=\"relative grid\"\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const row = rows[virtualItem.index]\n\n // Render skeleton row for unloaded data\n if (!row) {\n return (\n <div\n key={`skeleton-${virtualItem.index}`}\n className=\"absolute flex items-center w-full border-b\"\n style={{\n height: virtualItem.size,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {table.getVisibleLeafColumns().map((col) => (\n <div key={col.id} className=\"px-3\" style={{ width: `calc(var(--col-${col.id}-size) * 1px)` }}>\n <Skeleton className=\"h-4 w-full\" />\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <DataGridRow\n key={row.id}\n row={row}\n rowMapRef={rowMapRef}\n virtualRowIndex={virtualItem.index}\n virtualStart={virtualItem.start}\n rowVirtualizer={rowVirtualizer}\n rowHeight={rowHeight}\n focusedCell={focusedCell}\n editingCell={editingCell}\n selectionSize={selectionSize}\n visibleColumnIds={visibleColumnIds}\n isHighlighted={highlightedRowIndex === virtualItem.index}\n onRowClick={onRowClick}\n />\n )\n })}\n </div>\n {onRowAdd && (\n <div\n role=\"rowgroup\"\n data-slot=\"grid-footer\"\n ref={footerRef}\n className=\"sticky bottom-0 z-10 grid border-t bg-background\"\n >\n <div\n role=\"row\"\n aria-rowindex={rows.length + 2}\n data-slot=\"grid-add-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n <div\n role=\"gridcell\"\n tabIndex={0}\n className=\"relative flex h-9 grow items-center bg-secondary/30 transition-colors hover:bg-secondary/50 focus:bg-secondary/50 focus:outline-none\"\n style={{\n width: table.getTotalSize(),\n minWidth: table.getTotalSize(),\n }}\n onClick={onRowAdd}\n onKeyDown={onAddRowKeyDown}\n >\n <div className=\"sticky left-0 flex items-center gap-2 px-3 text-muted-foreground\">\n <PlusIcon className=\"size-3.5\" />\n <span className=\"text-sm\">Add row</span>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\ntype DataGridCellWrapperProps<TData, TValue> = {\n cell: Cell<TData, TValue>\n table: Table<TData>\n rowIndex: number\n columnId: string\n isEditing: boolean\n isFocused: boolean\n isSelected: boolean\n} & React.ComponentProps<'div'>\n\nexport function DataGridCellWrapper<TData, TValue>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n className,\n onClick: onClickProp,\n onKeyDown: onKeyDownProp,\n children,\n ...props\n}: DataGridCellWrapperProps<TData, TValue>) {\n const meta = table.options.meta\n\n const rowOriginal = (cell?.row?.original ?? {}) as any\n const colCellMeta = cell?.column?.columnDef?.meta as any\n const align: 'left' | 'right' | 'center' = colCellMeta?.align ?? 'left'\n\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colCellMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colCellMeta?.editable])\n const isEditable = editableResolver(rowOriginal)\n\n // Normalize className to a resolver function and memoize to avoid typeof checks per cell\n const classNameResolver = React.useMemo(() => {\n const v = colCellMeta?.className\n return typeof v === 'function' ? (v as (row: any) => string | undefined) : () => v as string | undefined\n }, [colCellMeta?.className])\n const colCellClassName = classNameResolver(rowOriginal)\n\n const isSearchMatch = meta?.getIsSearchMatch?.(rowIndex, columnId) ?? false\n const isActiveSearchMatch = meta?.getIsActiveSearchMatch?.(rowIndex, columnId) ?? false\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isEditing) {\n event.preventDefault()\n onClickProp?.(event)\n // Single click should only focus the cell, not enter edit mode\n // Edit mode is triggered by double-click, F2, or Enter key\n meta?.onCellClick?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing, onClickProp],\n )\n\n const onContextMenu = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellContextMenu?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellMouseDown?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseEnter = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellMouseEnter?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseUp = React.useCallback(() => {\n if (!isEditing) {\n meta?.onCellMouseUp?.()\n }\n }, [meta, isEditing])\n\n const onDoubleClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n event.preventDefault()\n if (isEditable) {\n meta?.onCellDoubleClick?.(rowIndex, columnId)\n }\n }\n },\n [meta, rowIndex, columnId, isEditing, isEditable],\n )\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDownProp?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n if (\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'Home' ||\n event.key === 'End' ||\n event.key === 'PageUp' ||\n event.key === 'PageDown' ||\n event.key === 'Enter' ||\n event.key === 'Tab'\n ) {\n return\n }\n\n if (isFocused && !isEditing) {\n if (event.key === 'F2') {\n event.preventDefault()\n event.stopPropagation()\n if (isEditable) {\n meta?.onCellEditingStart?.(rowIndex, columnId)\n }\n return\n }\n\n if (event.key === '') {\n event.preventDefault()\n event.stopPropagation()\n meta?.onCellEditingStart?.(rowIndex, columnId)\n return\n }\n\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n event.preventDefault()\n event.stopPropagation()\n if (isEditable) {\n meta?.onCellEditingStart?.(rowIndex, columnId)\n }\n }\n }\n },\n [onKeyDownProp, isFocused, isEditing, meta, rowIndex, columnId, isEditable],\n )\n\n const rowHeight = meta?.rowHeight ?? 'short'\n\n // Render cell overlay if defined\n const cellOverlay = colCellMeta?.cellOverlay\n const overlayContent = cellOverlay ? cellOverlay(rowOriginal, cell.getValue(), rowIndex, columnId) : null\n\n return (\n <div\n role=\"button\"\n data-slot=\"grid-cell-wrapper\"\n data-editing={isEditing ? '' : undefined}\n data-focused={isFocused ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n tabIndex={isFocused && !isEditing ? 0 : -1}\n className={cn(\n 'size-full px-2 py-1.5 text-sm outline-none -has-data-[slot=checkbox]:pt-2.5', // why has-data-[slot=checkbox] ?\n {\n 'text-left': align === 'left',\n 'text-right': align === 'right',\n 'text-center': align === 'center',\n },\n {\n 'ring-1 ring-foreground ring-inset dark:ring-secondary-foreground': isFocused,\n 'bg-yellow-100 dark:bg-yellow-900/30': isSearchMatch && !isActiveSearchMatch,\n 'bg-orange-200 dark:bg-orange-900/50': isActiveSearchMatch,\n 'bg-accent-foreground/10': isSelected && !isEditing,\n 'cursor-default': !isEditing,\n '**:data-[slot=grid-cell-content]:line-clamp-1': !isEditing && rowHeight === 'short',\n '**:data-[slot=grid-cell-content]:line-clamp-2': !isEditing && rowHeight === 'medium',\n '**:data-[slot=grid-cell-content]:line-clamp-3': !isEditing && rowHeight === 'tall',\n '**:data-[slot=grid-cell-content]:line-clamp-4': !isEditing && rowHeight === 'extra-tall',\n 'relative overflow-visible': !!overlayContent, // Enable relative positioning and overflow when overlay is present\n },\n colCellClassName,\n className,\n )}\n onClick={onClick}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseUp={onMouseUp}\n onKeyDown={onKeyDown}\n {...props}\n >\n {children}\n {overlayContent}\n </div>\n )\n}\n","import * as React from 'react'\n\nimport { Checkbox } from '../../checkbox/checkbox'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function CheckboxCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, boolean>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(Boolean(initialValue))\n const containerRef = React.useRef<HTMLDivElement>(null)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n\n const onCheckedChange = React.useCallback(\n (checked: boolean) => {\n setValue(checked)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: checked })\n },\n [meta, rowIndex, columnId],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isEditable) {\n return\n }\n if (isFocused && (event.key === '' || event.key === 'Enter')) {\n event.preventDefault()\n event.stopPropagation()\n onCheckedChange(!value)\n }\n },\n [isFocused, value, onCheckedChange, isEditable],\n )\n\n React.useEffect(() => {\n setValue(Boolean(initialValue))\n }, [initialValue])\n\n React.useEffect(() => {\n if (isFocused && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, meta?.searchOpen, meta?.isScrolling])\n\n const onWrapperClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditable) {\n return\n }\n if (isFocused) {\n event.preventDefault()\n event.stopPropagation()\n onCheckedChange(!value)\n }\n },\n [isFocused, value, onCheckedChange, isEditable],\n )\n\n const onCheckboxClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={false}\n isFocused={isFocused}\n isSelected={isSelected}\n onClick={onWrapperClick}\n onKeyDown={onWrapperKeyDown}\n className=\"flex size-full justify-center\"\n >\n <Checkbox\n variant=\"simple\"\n iconStyle=\"simple\"\n checkIcon=\"check\"\n checked={value}\n onChange={(event) => onCheckedChange(event.target.checked)}\n onClick={onCheckboxClick}\n onMouseDown={onCheckboxMouseDown}\n onDoubleClick={onCheckboxDoubleClick}\n className=\"border-secondary-foreground\"\n />\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { Calendar } from '../../calendar/calendar'\nimport { cn } from '../../lib/utils'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\n/**\n * Parse a date value (Date object or ISO string YYYY-MM-DD) as a local date, not UTC.\n * new Date('2025-12-01') interprets as UTC, causing timezone shifts.\n */\nfunction parseToLocalDate(value: string | Date | null | undefined): Date | undefined {\n if (!value) {\n return undefined\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value !== 'string') {\n return undefined\n }\n\n // Parse ISO date string in local timezone by explicitly setting year, month, day\n const regex = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n const match = regex.exec(value)\n if (!match) {\n return undefined\n }\n\n const year = Number.parseInt(match[1]!, 10)\n const month = Number.parseInt(match[2]!, 10) - 1 // months are 0-indexed\n const day = Number.parseInt(match[3]!, 10)\n\n return new Date(year, month, day)\n}\n\nfunction formatDateToISOString(date: Date): string {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nexport function DateCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue() as string | Date | null | undefined\n const [value, setValue] = React.useState<Date | undefined>(parseToLocalDate(initialValue))\n const [open, setOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already stopped editing to prevent double onCellEditingStop\n const hasStoppedRef = React.useRef(false)\n const meta = table.options.meta\n\n const prevInitialValueRef = React.useRef(initialValue)\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue\n setValue(parseToLocalDate(initialValue))\n }\n\n // Reset stopped flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasStoppedRef.current = false\n }\n }, [isEditing])\n\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date) {\n return\n }\n\n setValue(date)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: formatDateToISOString(date) })\n hasStoppedRef.current = true\n setOpen(false)\n meta?.onCellEditingStop?.()\n },\n [meta, rowIndex, columnId],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen && isEditing && !hasStoppedRef.current) {\n hasStoppedRef.current = true\n meta?.onCellEditingStop?.()\n }\n },\n [isEditing, meta],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n hasStoppedRef.current = true\n setValue(parseToLocalDate(initialValue))\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasStoppedRef.current = true\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, initialValue, meta],\n )\n\n React.useEffect(() => {\n setOpen(isEditing)\n }, [isEditing])\n\n React.useEffect(() => {\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <span\n data-slot=\"grid-cell-content\"\n className={cn('tabular-nums', (cell.column.columnDef.meta as any)?.align ?? 'text-right')}\n >\n {value?.toLocaleDateString() ?? ''}\n </span>\n </PopoverAnchor>\n {isEditing && (\n <PopoverContent data-grid-cell-editor=\"\" align=\"start\" sideOffset={10} className=\"w-auto p-0\">\n <Calendar\n showYearNavigation={true}\n autoFocus\n captionLayout=\"dropdown\"\n mode=\"single\"\n className=\"rounded-md border border-border shadow-sm\"\n defaultMonth={value}\n selected={value}\n onSelect={onDateSelect}\n />\n </PopoverContent>\n )}\n </Popover>\n </DataGridCellWrapper>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../../lib/utils'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nexport type GanttCellProps<TData> = {\n cell: Cell<TData, { start: Date; end: Date; barClassName?: string } | null>\n table: Table<TData>\n rowIndex: number\n columnId: string\n isEditing: boolean\n isFocused: boolean\n isSelected: boolean\n}\n\nexport function GanttCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<GanttCellProps<TData>>) {\n const initialValue = cell.getValue() as { start: Date; end: Date; barClassName?: string } | null\n const containerRef = React.useRef<HTMLDivElement>(null)\n const cellOpts = (cell.column.columnDef.meta as any)?.cell\n\n const ts = cellOpts?.dateRangeFrom ?? cellOpts?.timelineStart\n const te = cellOpts?.dateRangeTo ?? cellOpts?.timelineEnd\n\n const timelineStartMs = ts instanceof Date ? ts.getTime() : undefined\n const timelineEndMs = te instanceof Date ? te.getTime() : undefined\n\n if (!timelineStartMs || !timelineEndMs) {\n return null\n }\n\n const timelineDurationMs = timelineEndMs - timelineStartMs\n const hasValidDates = initialValue && initialValue.start instanceof Date && initialValue.end instanceof Date\n\n const msUntilStart = hasValidDates ? initialValue.start.getTime() - timelineStartMs : 0\n // end - start time considering timeline bounds\n const barWidthMs = hasValidDates\n ? Math.min(initialValue.end.getTime(), timelineEndMs) - Math.max(initialValue.start.getTime(), timelineStartMs)\n : 0\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n className=\"px-1\"\n >\n <div className=\"size-full flex overflow-hidden\">\n {hasValidDates && (\n <>\n <div\n className=\"shrink-0\"\n style={{\n width: `${Math.max(0, (msUntilStart / timelineDurationMs) * 100)}%`,\n }}\n />\n <div\n className={cn('shrink-0 h-full rounded-sm bg-primary', initialValue.barClassName)}\n style={{\n width: `${(barWidthMs / timelineDurationMs) * 100}%`,\n }}\n />\n </>\n )}\n </div>\n </DataGridCellWrapper>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst textareaVariants = cva(\n 'border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n simple: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\ntype TextareaProps = React.ComponentProps<'textarea'> &\n VariantProps<typeof textareaVariants> & {\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n }\n\nfunction Textarea({ className, variant, __e2e_test_id__, ...props }: TextareaProps) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(textareaVariants({ variant, className }))}\n {...props}\n data-test-id={__e2e_test_id__}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from 'react'\n\nimport { useDebouncedCallback } from '../../hooks/use-debounced-callback'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { Textarea } from '../../textarea/textarea'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function LongTextCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue ?? '')\n const [open, setOpen] = React.useState(false)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already submitted to prevent double-submit on blur after Ctrl+Enter\n const hasSubmittedRef = React.useRef(false)\n const meta = table.options.meta\n const sideOffset = -(containerRef.current?.clientHeight ?? 0)\n\n const prevInitialValueRef = React.useRef(initialValue)\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue\n setValue(initialValue ?? '')\n }\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n // Debounced auto-save (300ms delay)\n const debouncedSave = useDebouncedCallback((newValue: string) => {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n }, 300)\n\n const onSave = React.useCallback(() => {\n // Skip if we've already submitted\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Immediately save any pending changes and close the popover\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, value, initialValue, rowIndex, columnId])\n\n const onCancel = React.useCallback(() => {\n // Skip if we've already submitted\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Restore the original value\n setValue(initialValue ?? '')\n meta?.onDataUpdate?.({ rowIndex, columnId, value: initialValue })\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, initialValue, rowIndex, columnId])\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value\n setValue(newValue)\n // Debounced auto-save\n debouncedSave(newValue)\n },\n [debouncedSave],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen && !hasSubmittedRef.current) {\n hasSubmittedRef.current = true\n // Immediately save any pending changes when closing\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n meta?.onCellEditingStop?.()\n }\n },\n [meta, value, initialValue, rowIndex, columnId],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n if (textareaRef.current) {\n textareaRef.current.focus()\n const length = textareaRef.current.value.length\n textareaRef.current.setSelectionRange(length, length)\n }\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && !open) {\n if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasSubmittedRef.current = true\n // Save any pending changes\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, open, meta, value, initialValue, rowIndex, columnId],\n )\n\n const onTextareaKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onCancel()\n } else if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault()\n onSave()\n }\n // Stop propagation to prevent grid navigation\n event.stopPropagation()\n },\n [onCancel, onSave],\n )\n\n const onTextareaBlur = React.useCallback(() => {\n // Skip if we've already submitted via Ctrl+Enter/Escape\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Immediately save any pending changes on blur\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, value, initialValue, rowIndex, columnId])\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n <span data-slot=\"grid-cell-content\">{value}</span>\n </DataGridCellWrapper>\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={onChange}\n onKeyDown={onTextareaKeyDown}\n onBlur={onTextareaBlur}\n className=\"min-h-[150px] resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n placeholder=\"Enter text...\"\n />\n </PopoverContent>\n </Popover>\n )\n}\n","import { CheckIcon, CrossIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Badge } from '../../badge/badge'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../command/command'\nimport { cn } from '../../lib/utils'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellSelectOption } from '../data-grid-types'\nimport { getLineCount } from '../data-grid-utils'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function MultiSelectCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string[]>>) {\n const cellValue = React.useMemo(() => cell.getValue() ?? [], [cell])\n\n const cellId = `${rowIndex}-${columnId}`\n const prevCellIdRef = React.useRef(cellId)\n\n const [selectedValues, setSelectedValues] = React.useState<string[]>(cellValue)\n const [open, setOpen] = React.useState(false)\n const [searchValue, setSearchValue] = React.useState('')\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const meta = table.options.meta\n const cellOpts = cell.column.columnDef.meta?.cell\n const sideOffset = -(containerRef.current?.clientHeight ?? 0)\n\n // Support both array options (enums/static) and Map options (relations)\n const arrayOptions = cellOpts?.variant === 'multi-select' ? cellOpts.options : undefined\n const optionsMap = cellOpts?.variant === 'multi-select' ? cellOpts.optionsMap : undefined\n\n // For array options, create a lookup Map once (memoized)\n const arrayOptionsLabelMap = React.useMemo(\n () => (arrayOptions ? new Map(arrayOptions.map((opt) => [opt.value, opt.label])) : null),\n [arrayOptions],\n )\n\n // O(1) label lookup - works for both array and Map options\n const getLabel = React.useCallback(\n (val: string): string => {\n // Map-based options: direct O(1) lookup\n if (optionsMap) {\n return optionsMap.get(val) ?? val\n }\n // Array-based options: use pre-built lookup Map\n if (arrayOptionsLabelMap) {\n return arrayOptionsLabelMap.get(val) ?? val\n }\n return val\n },\n [optionsMap, arrayOptionsLabelMap],\n )\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n const options: CellSelectOption[] = React.useMemo(() => {\n if (!isEditing) {\n return []\n }\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label }))\n }\n return []\n }, [isEditing, arrayOptions, optionsMap])\n\n if (prevCellIdRef.current !== cellId) {\n prevCellIdRef.current = cellId\n setSelectedValues(cellValue)\n setOpen(false)\n setSearchValue('')\n }\n\n const onValueChange = React.useCallback(\n (value: string) => {\n const newValues = selectedValues.includes(value)\n ? selectedValues.filter((v) => v !== value)\n : [...selectedValues, value]\n\n setSelectedValues(newValues)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValues })\n // Clear search input and focus back on input after selection\n setSearchValue('')\n queueMicrotask(() => inputRef.current?.focus())\n },\n [selectedValues, meta, rowIndex, columnId],\n )\n\n const removeValue = React.useCallback(\n (valueToRemove: string, event?: React.MouseEvent) => {\n event?.stopPropagation()\n event?.preventDefault()\n const newValues = selectedValues.filter((v) => v !== valueToRemove)\n setSelectedValues(newValues)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValues })\n // Focus back on input after removing\n setTimeout(() => inputRef.current?.focus(), 0)\n },\n [selectedValues, meta, rowIndex, columnId],\n )\n\n const clearAll = React.useCallback(() => {\n setSelectedValues([])\n meta?.onDataUpdate?.({ rowIndex, columnId, value: [] })\n queueMicrotask(() => inputRef.current?.focus())\n }, [meta, rowIndex, columnId])\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen) {\n setSearchValue('')\n meta?.onCellEditingStop?.()\n }\n },\n [meta],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSelectedValues(cellValue)\n setSearchValue('')\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setSearchValue('')\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, cellValue, meta],\n )\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Handle backspace when input is empty - remove last selected item\n if (event.key === 'Backspace' && searchValue === '' && selectedValues.length > 0) {\n event.preventDefault()\n const lastValue = selectedValues.at(-1)\n if (lastValue) {\n removeValue(lastValue)\n }\n }\n // Prevent escape from propagating to close the popover immediately\n // Let the command handle it first\n if (event.key === 'Escape') {\n event.stopPropagation()\n }\n },\n [searchValue, selectedValues, removeValue],\n )\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n // Focus input when popover opens\n React.useEffect(() => {\n if (open && inputRef.current) {\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n }, [open])\n\n const displayLabels = selectedValues.map(getLabel).filter(Boolean)\n\n const rowHeight = table.options.meta?.rowHeight ?? 'short'\n\n const lineCount = getLineCount(rowHeight)\n const maxVisibleBadgeCount = lineCount * 3\n\n const visibleLabels = displayLabels.slice(0, maxVisibleBadgeCount)\n const hiddenBadgeCount = Math.max(0, displayLabels.length - maxVisibleBadgeCount)\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[300px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command className=\"[&_[data-slot=command-input-wrapper]]:h-auto [&_[data-slot=command-input-wrapper]]:border-none [&_[data-slot=command-input-wrapper]]:p-0 [&_[data-slot=command-input-wrapper]_svg]:hidden\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-1 border-b px-3 py-1.5\">\n {selectedValues.map((value) => (\n <Badge key={value} variant=\"secondary\" className=\"h-5 gap-1 px-1.5 text-xs\">\n {getLabel(value)}\n <button\n type=\"button\"\n onClick={(event) => removeValue(value, event)}\n onPointerDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n >\n <CrossIcon className=\"size-3\" />\n </button>\n </Badge>\n ))}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n onKeyDown={onInputKeyDown}\n placeholder=\"Search...\"\n className=\"h-auto flex-1 p-0\"\n />\n </div>\n <CommandList className=\"max-h-full\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] scroll-py-1 overflow-y-auto overflow-x-hidden\">\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <CommandItem key={option.value} value={option.label} onSelect={() => onValueChange(option.value)}>\n <div\n className={cn(\n 'flex size-4 items-center justify-center rounded-sm border border-border',\n isSelected ? 'bg-accent-foreground text-secondary' : 'opacity-50 [&_svg]:invisible',\n )}\n >\n <CheckIcon className=\"size-3\" />\n </div>\n <span>{option.label}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem onSelect={clearAll} className=\"justify-center text-muted-foreground\">\n Clear all\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : null}\n {displayLabels.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleLabels.map((label, index) => (\n <Badge key={selectedValues[index]} variant=\"secondary\" className=\"h-5 shrink-0 px-1.5 text-xs\">\n {label}\n </Badge>\n ))}\n {hiddenBadgeCount > 0 && (\n <Badge variant=\"outline\" className=\"h-5 shrink-0 px-1.5 text-muted-foreground text-xs\">\n +{hiddenBadgeCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n )\n}\n","import type { ColumnMeta } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../../lib/utils'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function NumberCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, number>>) {\n const initialValue = cell.getValue() as number | null\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta as ColumnMeta<TData, number>\n const cellOptions = colMeta?.cell\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n const { min, max, step, prefix, suffix, fallbackValue = '' } = cellOptions?.variant === 'number' ? cellOptions : {}\n\n // Resolve prefix/suffix - support both string and function forms\n const resolvedPrefix = React.useMemo(() => {\n if (typeof prefix === 'function') {\n return prefix(cell.row.original, initialValue)\n }\n return prefix ?? null\n }, [prefix, cell.row.original, initialValue])\n\n const resolvedSuffix = React.useMemo(() => {\n if (typeof suffix === 'function') {\n return suffix(cell.row.original, initialValue)\n }\n return suffix ?? null\n }, [suffix, cell.row.original, initialValue])\n\n // Keep an unformatted string for editing (no grouping separators)\n const [editValue, setEditValue] = React.useState<string>(\n initialValue !== null && initialValue !== undefined ? String(initialValue) : '',\n )\n // Track if we've already submitted to prevent double-submit on blur after Enter/Tab\n const hasSubmittedRef = React.useRef(false)\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n const onBlur = React.useCallback(() => {\n // Skip if we've already submitted via Enter/Tab\n if (hasSubmittedRef.current) {\n return\n }\n const numValue = editValue === '' ? null : Number(editValue)\n if (numValue !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: numValue })\n }\n meta?.onCellEditingStop?.()\n }, [meta, rowIndex, columnId, initialValue, editValue])\n\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setEditValue(event.target.value)\n }, [])\n const parseNumValue = React.useCallback((): number | null => {\n return editValue === '' ? null : Number(editValue)\n }, [editValue])\n\n const saveAndStop = React.useCallback(\n (options?: { moveToNextRow?: boolean; direction?: 'left' | 'right' }) => {\n hasSubmittedRef.current = true\n const numValue = parseNumValue()\n // Always send update on explicit Enter/Tab (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: numValue })\n meta?.onCellEditingStop?.(options)\n },\n [parseNumValue, meta, rowIndex, columnId],\n )\n\n const handleEditingKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n saveAndStop({ moveToNextRow: true })\n } else if (event.key === 'Tab') {\n event.preventDefault()\n saveAndStop({ direction: event.shiftKey ? 'left' : 'right' })\n } else if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true // Don't submit on blur after Escape\n setEditValue(initialValue !== null && initialValue !== undefined ? String(initialValue) : '')\n inputRef.current?.blur()\n meta?.onCellEditingStop?.()\n }\n },\n [saveAndStop, initialValue, meta],\n )\n\n const handleFocusedKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isEditable) {\n return\n }\n\n if (event.key === 'Backspace') {\n setEditValue('')\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n setEditValue(event.key)\n }\n },\n [isEditable],\n )\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n handleEditingKeyDown(event)\n } else if (isFocused) {\n handleFocusedKeyDown(event)\n }\n },\n [isEditing, isFocused, handleEditingKeyDown, handleFocusedKeyDown],\n )\n\n React.useEffect(() => {\n setEditValue(initialValue !== null && initialValue !== undefined ? String(initialValue) : '')\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"number\"\n value={editValue}\n min={min}\n max={max}\n step={step}\n onBlur={onBlur}\n onChange={onChange}\n className=\"w-full border-none bg-transparent p-0 outline-none\"\n />\n ) : (\n <span data-slot=\"grid-cell-content\" className={cn('tabular-nums', colMeta?.align ?? 'text-right')}>\n {initialValue === null || initialValue === undefined ? (\n fallbackValue\n ) : (\n <>\n {resolvedPrefix}\n {initialValue.toLocaleString()}\n {resolvedSuffix}\n </>\n )}\n </span>\n )}\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function ReactNodeCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isSelected,\n isEditing,\n}: Readonly<CellVariantProps<TData, React.ReactNode>>) {\n const containerRef = React.useRef<HTMLDivElement>(null)\n const cellOpts = cell.column.columnDef.meta?.cell\n const renderFn = cellOpts?.variant === 'react-node' ? cellOpts.render : undefined\n\n // If render function provided, call it with full props\n // Otherwise fall back to getValue() (backward compatible)\n const children = renderFn\n ? renderFn({ cell, table, rowIndex, columnId, isFocused, isSelected, isEditing })\n : cell.getValue()\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n className=\"flex size-full justify-center p-0\"\n >\n {children ?? null}\n </DataGridCellWrapper>\n )\n}\n","import { CheckIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../../command/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../select/select'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellSelectOption } from '../data-grid-types'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function SelectCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue)\n const [open, setOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const meta = table.options.meta\n const cellOpts = cell.column.columnDef.meta?.cell\n const hasSearch = (cellOpts?.variant === 'select' && cellOpts?.hasSearch) ?? false\n const sideOffset = -(inputRef.current?.clientHeight ?? 0)\n\n // Support both array options (enums/static) and Map options (relations)\n const arrayOptions = cellOpts?.variant === 'select' ? cellOpts.options : undefined\n const optionsMap = cellOpts?.variant === 'select' ? cellOpts.optionsMap : undefined\n\n // For array options, create a lookup Map once (memoized)\n const arrayOptionsLabelMap = React.useMemo(\n () => (arrayOptions ? new Map(arrayOptions.map((opt) => [opt.value, opt.label])) : null),\n [arrayOptions],\n )\n\n // O(1) display label lookup - works for both array and Map options\n const displayLabel = React.useMemo(() => {\n if (!value) {\n return value\n }\n // Map-based options: direct O(1) lookup\n if (optionsMap) {\n return optionsMap.get(value) ?? value\n }\n // Array-based options: use pre-built lookup Map\n if (arrayOptionsLabelMap) {\n return arrayOptionsLabelMap.get(value) ?? value\n }\n return value\n }, [value, optionsMap, arrayOptionsLabelMap])\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n const options: CellSelectOption[] = React.useMemo(() => {\n if (!isEditing) {\n return []\n } // Don't build array if not editing\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label }))\n }\n return []\n }, [isEditing, arrayOptions, optionsMap])\n\n const onValueChange = React.useCallback(\n (newValue: string) => {\n setValue(newValue)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n meta?.onCellEditingStop?.()\n },\n [meta, rowIndex, columnId],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen) {\n meta?.onCellEditingStop?.()\n }\n },\n [meta],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n setValue(initialValue)\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, initialValue, meta],\n )\n\n React.useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n let editingContent: React.ReactNode\n\n if (hasSearch) {\n editingContent = (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <div className=\"size-full items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1\">\n {displayLabel}\n </div>\n </PopoverTrigger>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"max-w-[500px] w-full rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command>\n <CommandList>\n <CommandInput ref={inputRef} placeholder=\"Search...\" className=\"h-auto flex-1 p-0\" />\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n onSelect={() => {\n onValueChange(option.value)\n }}\n >\n <span>{option.label}</span>\n {value === option.value ? <CheckIcon className=\"ml-auto h-4 w-4\" /> : null}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n } else {\n editingContent = (\n <Select value={value} onValueChange={onValueChange} open={open} onOpenChange={onOpenChange}>\n <SelectTrigger className=\"size-full items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent\n data-grid-cell-editor=\"\"\n // compensate for the wrapper padding\n align=\"start\"\n alignOffset={-8}\n sideOffset={-2}\n className=\"min-w-[calc(var(--radix-select-trigger-width)+16px)]\"\n >\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value} spacing=\"sm\">\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? editingContent : <span data-slot=\"grid-cell-content\">{displayLabel}</span>}\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function ShortTextCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already submitted to prevent double-submit on blur after Enter/Tab\n const hasSubmittedRef = React.useRef(false)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n const onBlur = React.useCallback(() => {\n // Skip if we've already submitted via Enter/Tab\n if (hasSubmittedRef.current) {\n return\n }\n const currentValue = inputRef.current?.value ?? ''\n // Treat null/undefined as empty string for comparison\n const normalizedInitial = initialValue ?? ''\n if (currentValue !== normalizedInitial) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n }\n meta?.onCellEditingStop?.()\n }, [meta, rowIndex, columnId, initialValue])\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }, [])\n const handleEditingKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n hasSubmittedRef.current = true\n const currentValue = inputRef.current?.value ?? ''\n // Always send update on explicit Enter (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n meta?.onCellEditingStop?.({ moveToNextRow: true })\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasSubmittedRef.current = true\n const currentValue = inputRef.current?.value ?? ''\n // Always send update on explicit Tab (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n } else if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true // Don't submit on blur after Escape\n setValue(initialValue)\n inputRef.current?.blur()\n meta?.onCellEditingStop?.()\n }\n },\n [initialValue, meta, rowIndex, columnId],\n )\n\n const handleFocusedKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // For non-editable columns we must not change the displayed value when the user types while focused.\n if (!isEditable) {\n return\n }\n\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key)\n }\n },\n [isEditable],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n handleEditingKeyDown(event)\n } else if (isFocused) {\n handleFocusedKeyDown(event)\n }\n },\n [isEditing, isFocused, handleEditingKeyDown, handleFocusedKeyDown],\n )\n\n React.useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.setSelectionRange(inputRef.current.value.length, inputRef.current.value.length)\n }\n // Don't focus if we're in the middle of a scroll operation\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={value ?? ''}\n onBlur={onBlur}\n onChange={onChange}\n className=\"size-full bg-transparent outline-none\"\n />\n ) : (\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden outline-none\">\n {value}\n </div>\n )}\n </DataGridCellWrapper>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport { CheckboxCell } from './cell-variants/checkbox-cell'\nimport { DateCell } from './cell-variants/date-cell'\nimport { GanttCell } from './cell-variants/gantt-cell'\nimport { LongTextCell } from './cell-variants/long-text-cell'\nimport { MultiSelectCell } from './cell-variants/multi-select-cell'\nimport { NumberCell } from './cell-variants/number-cell'\nimport { ReactNodeCell } from './cell-variants/react-node-cell'\nimport { SelectCell } from './cell-variants/select-cell'\nimport { ShortTextCell } from './cell-variants/short-text-cell'\n\ntype DataGridCellProps<TData> = {\n cell: Cell<TData, unknown>\n table: Table<TData>\n}\n\nexport function DataGridCell<TData>({ cell, table }: DataGridCellProps<TData>) {\n const meta = table.options.meta\n const originalRowIndex = cell.row.index\n\n const rows = table.getRowModel().rows\n const displayRowIndex = rows.findIndex((row) => row.original === cell.row.original)\n const rowIndex = displayRowIndex >= 0 ? displayRowIndex : originalRowIndex\n const columnId = cell.column.id\n\n const isFocused = meta?.focusedCell?.rowIndex === rowIndex && meta?.focusedCell?.columnId === columnId\n const isEditing = meta?.editingCell?.rowIndex === rowIndex && meta?.editingCell?.columnId === columnId\n const isSelected = meta?.getIsCellSelected?.(rowIndex, columnId) ?? false\n\n const cellOpts = cell.column.columnDef.meta?.cell\n const variant = cellOpts?.variant ?? 'text'\n\n switch (variant) {\n case 'short-text':\n return (\n <ShortTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'long-text':\n return (\n <LongTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'number':\n return (\n <NumberCell\n cell={cell as Cell<TData, number>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'select':\n return (\n <SelectCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'multi-select':\n return (\n <MultiSelectCell\n cell={cell as Cell<TData, string[]>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'checkbox':\n return (\n <CheckboxCell\n cell={cell as Cell<TData, boolean>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'date':\n return (\n <DateCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'react-node':\n return (\n <ReactNodeCell\n cell={cell as Cell<TData, React.ReactNode>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'gantt':\n return (\n <GanttCell\n cell={cell as Cell<TData, { start: Date; end: Date } | null>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n\n default:\n return (\n <ShortTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n }\n}\n","import type { Table } from '@tanstack/react-table'\n\nimport { CheckIcon, GripHorizontalIcon, Settings2Icon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../command/command'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\ntype DataGridViewMenuProps<TData> = {\n table: Table<TData>\n} & React.ComponentProps<typeof PopoverContent>\n\nexport function DataGridViewMenu<TData>({ table, ...props }: DataGridViewMenuProps<TData>) {\n // Columns that are shown in the view menu. We include any column with an accessor\n // so users can see the full column list, even when a column cannot be hidden.\n const viewableColumns = React.useMemo(\n () => table.getAllColumns().filter((column) => typeof column.accessorFn !== 'undefined'),\n [table],\n )\n\n // Local order state for displaying items in the menu\n const [order, setOrder] = React.useState<string[]>(() => {\n const stateOrder = table.getState().columnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n return stateOrder\n }\n return table.getAllColumns().map((c) => c.id)\n })\n\n // Search state for the CommandInput — used to conditionally show the empty state\n const [searchQuery, setSearchQuery] = React.useState<string>('')\n\n // Drag state\n const [isDragging, setIsDragging] = React.useState(false)\n const [insertionIndex, setInsertionIndex] = React.useState<number | null>(null)\n\n // Keep order in sync with external changes to table state\n React.useEffect(() => {\n const stateOrder = table.getState().columnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n setOrder(stateOrder)\n return\n }\n setOrder(table.getAllColumns().map((c) => c.id))\n }, [table])\n\n const visibleSet = React.useMemo(() => new Set(viewableColumns.map((c) => c.id)), [viewableColumns])\n\n // Derive the ordered columns we will show in the menu (filter to hideable ones)\n const orderedColumns = React.useMemo(() => {\n const ordered: ReturnType<typeof table.getAllColumns>[0][] = []\n for (const id of order) {\n const col = viewableColumns.find((c) => c.id === id)\n if (col) {\n ordered.push(col)\n }\n }\n // Add any missing viewable columns at the end\n for (const col of viewableColumns) {\n if (!ordered.find((c) => c.id === col.id)) {\n ordered.push(col)\n }\n }\n return ordered\n }, [order, viewableColumns, table])\n\n const draggingRef = React.useRef<string | null>(null)\n const groupRef = React.useRef<HTMLDivElement | null>(null)\n\n const getBaseOrder = React.useCallback((): string[] => {\n return (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n }, [table])\n\n const computeInsertionIndex = React.useCallback(\n (clientY: number) => {\n const baseOrder = getBaseOrder()\n\n const el = groupRef.current\n if (!el) {\n return baseOrder.length\n }\n\n const nodes = Array.from(el.querySelectorAll('[data-col-id]')) as HTMLElement[]\n for (const node of nodes) {\n const rect = node.getBoundingClientRect()\n const mid = rect.top + rect.height / 2\n if (clientY < mid) {\n const id = node.dataset.colId as string\n const pos = baseOrder.indexOf(id)\n const newIndex = pos === -1 ? baseOrder.length : pos\n return newIndex\n }\n }\n return baseOrder.length\n },\n [getBaseOrder],\n )\n\n // moveItemInArray was removed; we compute insertion index directly on pointer drag\n\n function onDragEnd() {\n draggingRef.current = null\n setIsDragging(false)\n setInsertionIndex(null)\n }\n\n const doDrop = React.useCallback(\n (dragId: string, toIndex: number) => {\n // Build a base order that includes all columns (so hidden columns are preserved)\n const baseOrder = (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n\n const fromIndex = baseOrder.indexOf(dragId)\n if (fromIndex === -1) {\n onDragEnd()\n return\n }\n\n const copy = baseOrder.slice()\n copy.splice(fromIndex, 1)\n\n // If the dragged element came from before the target index,\n // removing it shifts indices left by 1, so adjust insertion index.\n let insertAt = toIndex\n if (fromIndex < toIndex) {\n insertAt = toIndex - 1\n }\n insertAt = Math.min(Math.max(0, insertAt), copy.length)\n copy.splice(insertAt, 0, dragId)\n\n table.setColumnOrder(copy)\n\n // Update our local order view (only for hideable columns)\n setOrder(copy.filter((id) => visibleSet.has(id)))\n onDragEnd()\n },\n [table, visibleSet],\n )\n\n const startPointerDrag = React.useCallback(\n (e: React.PointerEvent, id: string) => {\n e.preventDefault()\n draggingRef.current = id\n setIsDragging(true)\n // initialize insertion index\n setInsertionIndex(computeInsertionIndex(e.clientY))\n\n const onMove = (ev: PointerEvent) => {\n const idx = computeInsertionIndex(ev.clientY)\n setInsertionIndex(idx)\n }\n\n const onUp = (ev: PointerEvent) => {\n globalThis.removeEventListener('pointermove', onMove)\n globalThis.removeEventListener('pointerup', onUp)\n const dragId = draggingRef.current\n const toIndex = computeInsertionIndex(ev.clientY)\n if (dragId) {\n doDrop(dragId, toIndex)\n }\n draggingRef.current = null\n setIsDragging(false)\n setInsertionIndex(null)\n }\n\n globalThis.addEventListener('pointermove', onMove)\n globalThis.addEventListener('pointerup', onUp)\n },\n [computeInsertionIndex, doDrop],\n )\n\n function insertionWouldBeNoOp(targetIndex: number | null) {\n if (targetIndex === null) {\n return false\n }\n const dragId = draggingRef.current\n if (!dragId) {\n return false\n }\n const base = getBaseOrder()\n const fromIndex = base.indexOf(dragId)\n if (fromIndex === -1) {\n return false\n }\n let insertAt = targetIndex\n if (fromIndex < targetIndex) {\n insertAt = targetIndex - 1\n }\n return insertAt === fromIndex\n }\n\n const dragFromHandle = React.useRef(false)\n\n function resetTableView() {\n const defaultOrder = table.getAllColumns().map((c) => c.id)\n\n try {\n table.reset()\n } finally {\n // Clear persisted localStorage keys for this path\n try {\n if (typeof window !== 'undefined') {\n const path = globalThis.location?.pathname ?? 'unknown'\n const prefix = `pxl.dataGrid:${path}:`\n const keys: string[] = []\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i)\n if (k && k.startsWith(prefix)) {\n keys.push(k)\n }\n }\n for (const k of keys) {\n localStorage.removeItem(k)\n }\n // Also update the local menu order so the UI reflects the reset immediately\n try {\n setOrder(defaultOrder.filter((id) => visibleSet.has(id)))\n } catch (_) {\n // ignore\n }\n }\n } catch (_) {\n // ignore storage errors\n }\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n aria-label=\"Toggle columns\"\n role=\"combobox\"\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto hidden h-8 font-normal lg:flex\"\n >\n <Settings2Icon className=\"text-muted-foreground\" />\n View\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn('w-56 p-0 m-4 mt-0', isDragging ? 'cursor-grabbing' : '')} {...props}>\n <Command>\n <CommandInput placeholder=\"Search columns...\" onValueChange={setSearchQuery} />\n <CommandList>\n {searchQuery.trim() ? <CommandEmpty>No columns found.</CommandEmpty> : null}\n <div ref={groupRef}>\n <CommandGroup className=\"p-1\">\n {/* Insertion indicator at top */}\n {isDragging && insertionIndex === 0 && !insertionWouldBeNoOp(0) ? (\n <div className=\"h-0.5 bg-accent w-full my-1 rounded\" />\n ) : null}\n {orderedColumns.map((column) => {\n const currentBase = (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n const pos = currentBase.indexOf(column.id)\n const isHideable = column.getCanHide()\n return (\n <React.Fragment key={column.id}>\n <CommandItem\n value={column.id}\n data-col-id={column.id}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded',\n !isDragging\n ? 'data-[selected=true]:bg-accent'\n : 'data-[selected=true]:bg-transparent cursor-grabbing',\n draggingRef.current === column.id && isDragging && 'bg-accent data-[selected=true]:bg-accent',\n )}\n onSelect={() => {\n if (dragFromHandle.current) {\n dragFromHandle.current = false\n return\n }\n if (!isHideable) {\n // Column cannot be hidden; do nothing when clicked.\n return\n }\n column.toggleVisibility(!column.getIsVisible())\n }}\n >\n <span\n onPointerDown={(e) => {\n if (searchQuery.trim() !== '') {\n return\n }\n\n dragFromHandle.current = true\n e.stopPropagation()\n e.preventDefault()\n startPointerDrag(e, column.id)\n }}\n className={cn(\n 'size-4 text-muted-foreground',\n searchQuery.trim() !== '' && 'opacity-10',\n searchQuery.trim() === '' && (isDragging ? 'cursor-grabbing' : 'cursor-grab'),\n )}\n >\n <GripHorizontalIcon />\n </span>\n <span className=\"truncate\">{(column.columnDef.meta as any)?.label ?? column.id}</span>\n <CheckIcon\n className={cn(\n 'ml-auto size-4 shrink-0',\n // Visible columns show the check; non-hideable columns show a muted check\n isHideable\n ? column.getIsVisible()\n ? 'opacity-100'\n : 'opacity-0'\n : 'opacity-50 text-muted-foreground',\n )}\n />\n </CommandItem>\n\n {/* Insertion indicator after the item (between items) */}\n {isDragging && insertionIndex === pos + 1 && !insertionWouldBeNoOp(pos + 1) ? (\n <div className=\"h-0.5 bg-accent w-full my-1 rounded\" />\n ) : null}\n </React.Fragment>\n )\n })}\n </CommandGroup>\n </div>\n </CommandList>\n </Command>\n <div className=\"border-t px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n // Reset table state: order, visibility, pinning and sizing\n resetTableView()\n }}\n >\n Reset view\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import {\n type ColumnDef,\n getCoreRowModel,\n getSortedRowModel,\n type RowSelectionState,\n type SortingState,\n type TableOptions,\n type Updater,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer, type Virtualizer } from '@tanstack/react-virtual'\n\nimport * as React from 'react'\n\nimport { useDebouncedCallback } from '../../hooks/use-debounced-callback'\nimport { DataGridCell } from '../data-grid-cell'\nimport type {\n CellPosition,\n ContextMenuState,\n NavigationDirection,\n RowHeightValue,\n SearchState,\n SelectionState,\n UpdateCell,\n} from '../data-grid-types'\nimport { getCellKey, getRowHeightValue, parseCellKey } from '../data-grid-utils'\n\nconst DEFAULT_ROW_HEIGHT = 'short'\nconst OVERSCAN = 3\nconst VIEWPORT_OFFSET = 1\nconst MIN_COLUMN_SIZE = 60\nconst MAX_COLUMN_SIZE = 800\nconst SEARCH_SHORTCUT_KEY = 'f'\nconst NON_NAVIGABLE_COLUMN_IDS = ['select', 'actions']\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nfunction useLazyRef<T>(fn: () => T): React.RefObject<T> {\n const ref = React.useRef<T | null>(null)\n if (ref.current === null) {\n ref.current = fn()\n }\n return ref as React.RefObject<T>\n}\n\nfunction useAsRef<T>(data: T) {\n const ref = React.useRef<T>(data)\n\n useIsomorphicLayoutEffect(() => {\n ref.current = data\n })\n\n return ref\n}\n\ntype DataGridState = {\n sorting: SortingState\n rowHeight: RowHeightValue\n rowSelection: RowSelectionState\n selectionState: SelectionState\n focusedCell: CellPosition | null\n editingCell: CellPosition | null\n contextMenu: ContextMenuState\n searchQuery: string\n searchMatches: CellPosition[]\n matchIndex: number\n searchOpen: boolean\n lastClickedRowIndex: number | null\n isScrolling: boolean\n}\n\ntype DataGridStore = {\n subscribe: (callback: () => void) => () => void\n getState: () => DataGridState\n setState: <K extends keyof DataGridState>(key: K, value: DataGridState[K]) => void\n notify: () => void\n batch: (fn: () => void) => void\n}\n\nfunction useStore<T>(store: DataGridStore, selector: (state: DataGridState) => T): T {\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector])\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot)\n}\n\ntype UseDataGridProps<TData> = {\n onDataChange?: (data: TData[]) => void\n onRowAdd?: (event?: React.MouseEvent<HTMLDivElement>) =>\n | Partial<CellPosition>\n | Promise<Partial<CellPosition>>\n | null\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n | void // void is needed here to allow functions without explicit return\n onRowsDelete?: (rows: TData[], rowIndices: number[]) => void | Promise<void>\n onCellFocus?: (args: { rowIndex: number; columnId: string }) => void\n /**\n * Called when a row is clicked. Receives the row index.\n * Use this for row-level selection/navigation (e.g., keyField-based routing).\n */\n onRowClick?: (rowIndex: number) => void\n /**\n * Index of the row to highlight (e.g., for keyField-based URL routing).\n * The highlighted row gets a subtle background color.\n */\n highlightedRowIndex?: number\n rowHeight?: RowHeightValue\n overscan?: number\n autoFocus?: boolean | Partial<CellPosition>\n enableColumnSelection?: boolean\n enableSearch?: boolean\n // Server-side sorting props (passed as top-level for convenience, hook puts them in state)\n manualSorting?: boolean\n sorting?: SortingState\n onSortingChange?: (updater: Updater<SortingState>) => void\n /**\n * Called when scrolling near the end of loaded data.\n * Use this to trigger fetching the next page for infinite scroll.\n *\n * Note: This callback may be invoked multiple times during scroll while\n * the threshold condition is met. If using TanStack Query's `fetchNextPage`,\n * it handles deduplication internally. Otherwise, implement your own guard\n * (e.g., check `isFetching` state) to prevent duplicate requests.\n */\n onLoadMore?: () => void\n /**\n * Number of rows from the end at which to trigger onLoadMore.\n * Lower values load data later (closer to the end), higher values load earlier.\n * @default 25\n */\n loadMoreThreshold?: number\n /**\n * Total number of rows (including unloaded ones) for proper scrollbar sizing.\n * If provided, the scrollbar will reflect the full dataset size.\n */\n totalRowCount?: number\n} & Omit<TableOptions<TData>, 'pageCount' | 'getCoreRowModel' | 'manualSorting' | 'onSortingChange'>\n\nfunction useDataGrid<TData>({\n columns,\n data,\n onDataChange,\n onRowAdd: onRowAddProp,\n onRowsDelete: onRowsDeleteProp,\n onCellFocus: onCellFocusProp,\n onRowClick: onRowClickProp,\n highlightedRowIndex,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n overscan = OVERSCAN,\n initialState,\n autoFocus = false,\n enableColumnSelection = false,\n enableSearch = false,\n // Extract server-side sorting props\n manualSorting,\n sorting: externalSorting,\n onSortingChange: externalOnSortingChange,\n // Infinite scroll\n onLoadMore,\n loadMoreThreshold = 25,\n totalRowCount,\n ...dataGridProps\n}: UseDataGridProps<TData>) {\n const dataGridRef = React.useRef<HTMLDivElement>(null)\n const tableRef = React.useRef<ReturnType<typeof useReactTable<TData>>>(null)\n const rowVirtualizerRef = React.useRef<Virtualizer<HTMLDivElement, Element>>(null)\n const headerRef = React.useRef<HTMLDivElement>(null)\n const rowMapRef = React.useRef<Map<number, HTMLDivElement>>(new Map())\n const footerRef = React.useRef<HTMLDivElement>(null)\n\n const dataGridPropsRef = useAsRef(dataGridProps)\n const listenersRef = useLazyRef(() => new Set<() => void>())\n\n const stateRef = useLazyRef<DataGridState>(() => {\n return {\n sorting: initialState?.sorting ?? [],\n rowHeight: rowHeightProp,\n rowSelection: initialState?.rowSelection ?? {},\n selectionState: {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n },\n focusedCell: null,\n editingCell: null,\n contextMenu: {\n open: false,\n x: 0,\n y: 0,\n },\n searchQuery: '',\n searchMatches: [],\n matchIndex: -1,\n searchOpen: false,\n lastClickedRowIndex: null,\n isScrolling: false,\n }\n })\n\n const store = React.useMemo<DataGridStore>(() => {\n let isBatching = false\n let pendingNotification = false\n\n return {\n subscribe: (callback) => {\n listenersRef.current.add(callback)\n return () => listenersRef.current.delete(callback)\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) {\n return\n }\n stateRef.current[key] = value\n\n if (isBatching) {\n pendingNotification = true\n } else {\n if (!pendingNotification) {\n pendingNotification = true\n queueMicrotask(() => {\n pendingNotification = false\n store.notify()\n })\n }\n }\n },\n notify: () => {\n for (const listener of listenersRef.current) {\n listener()\n }\n },\n batch: (fn) => {\n if (isBatching) {\n fn()\n return\n }\n\n isBatching = true\n const wasPending = pendingNotification\n pendingNotification = false\n\n try {\n fn()\n } finally {\n isBatching = false\n if (pendingNotification || wasPending) {\n pendingNotification = false\n store.notify()\n }\n }\n },\n }\n }, [listenersRef, stateRef])\n\n React.useEffect(() => {\n store.setState('rowHeight', rowHeightProp)\n }, [rowHeightProp, store])\n\n const focusedCell = useStore(store, (state) => state.focusedCell)\n const editingCell = useStore(store, (state) => state.editingCell)\n const selectionState = useStore(store, (state) => state.selectionState)\n const searchQuery = useStore(store, (state) => state.searchQuery)\n const searchMatches = useStore(store, (state) => state.searchMatches)\n const matchIndex = useStore(store, (state) => state.matchIndex)\n const searchOpen = useStore(store, (state) => state.searchOpen)\n const sorting = useStore(store, (state) => state.sorting)\n const rowSelection = useStore(store, (state) => state.rowSelection)\n const contextMenu = useStore(store, (state) => state.contextMenu)\n const rowHeight = useStore(store, (state) => state.rowHeight)\n const isScrolling = useStore(store, (state) => state.isScrolling)\n\n const rowHeightValue = getRowHeightValue(rowHeight)\n\n const columnIds = React.useMemo(() => {\n return columns\n .map((c) => {\n if (c.id) {\n return c.id\n }\n if ('accessorKey' in c) {\n return c.accessorKey as string\n }\n return undefined\n })\n .filter((id): id is string => Boolean(id))\n }, [columns])\n\n // Build a storage key for this table. We use the current pathname plus the column ids so different tables/pages get separate storage slots\n const storageKey = React.useMemo(() => {\n if (typeof window === 'undefined') {\n return undefined\n }\n const path = globalThis.location?.pathname ?? 'unknown'\n const cols = columnIds.join('|')\n return `pxl.dataGrid:${path}:${cols}`\n }, [columnIds])\n\n // Try to load persisted table state (order/visibility/pinning) from localStorage and merge it into the initial state the table will be created with.\n const persistedState = React.useMemo(() => {\n if (!storageKey) {\n return undefined\n }\n try {\n const raw = localStorage.getItem(storageKey)\n if (!raw) {\n return undefined\n }\n const parsed = JSON.parse(raw)\n return parsed\n } catch (_) {\n return undefined\n }\n }, [storageKey])\n\n // Merge persisted state (if any) into the table initial state so stored column order / visibility / pinning get reapplied on load.\n const mergedInitialState = React.useMemo(() => {\n const base = { ...(initialState ?? {}) } as Record<string, unknown>\n\n if (persistedState) {\n try {\n if (persistedState.columnOrder) {\n base.columnOrder = persistedState.columnOrder\n }\n if (persistedState.columnVisibility) {\n base.columnVisibility = persistedState.columnVisibility\n }\n if (persistedState.columnPinning) {\n base.columnPinning = persistedState.columnPinning\n }\n } catch (_) {\n // ignore malformed persisted state\n }\n }\n\n return base as typeof initialState\n }, [initialState, persistedState])\n\n // Derive the current visible, ordered column ids from the table when available.\n // This respects `table.setColumnOrder(...)` and column visibility.\n const getNavigableColumnIds = React.useCallback(() => {\n const t = tableRef.current\n if (t) {\n return t\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .filter((c) => !NON_NAVIGABLE_COLUMN_IDS.includes(c))\n }\n return columnIds.filter((c) => !NON_NAVIGABLE_COLUMN_IDS.includes(c))\n }, [columnIds])\n\n const onDataUpdate = React.useCallback(\n (updates: UpdateCell | UpdateCell[]) => {\n const updateArray = Array.isArray(updates) ? updates : [updates]\n\n if (updateArray.length === 0) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows\n\n const rowUpdatesMap = new Map<number, Omit<UpdateCell, 'rowIndex'>[]>()\n\n for (const update of updateArray) {\n if (!rows || !currentTable) {\n const existingUpdates = rowUpdatesMap.get(update.rowIndex) ?? []\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value,\n })\n rowUpdatesMap.set(update.rowIndex, existingUpdates)\n } else {\n const row = rows[update.rowIndex]\n if (!row) {\n continue\n }\n\n const originalData = row.original\n const originalRowIndex = data.indexOf(originalData)\n if (originalRowIndex === -1) {\n continue\n }\n\n const existingUpdates = rowUpdatesMap.get(originalRowIndex) ?? []\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value,\n })\n rowUpdatesMap.set(originalRowIndex, existingUpdates)\n }\n }\n // Also notify any per-cell change handler if present on the table meta.\n const currentMeta = tableRef.current?.options.meta\n if (currentMeta?.onCellChange) {\n for (const u of updateArray) {\n try {\n currentMeta.onCellChange(u)\n } catch (_) {\n // Ignore handler errors here to avoid breaking the grid behavior\n }\n }\n }\n\n const newData = data.map((row, index) => {\n const updates = rowUpdatesMap.get(index)\n if (!updates) {\n return row\n }\n\n const updatedRow = { ...row } as Record<string, unknown>\n for (const { columnId, value } of updates) {\n updatedRow[columnId] = value\n }\n return updatedRow as TData\n })\n\n onDataChange?.(newData)\n },\n [data, onDataChange],\n )\n\n const getIsCellSelected = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return selectionState.selectedCells.has(getCellKey(rowIndex, columnId))\n },\n [selectionState.selectedCells],\n )\n\n const clearSelection = React.useCallback(() => {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('rowSelection', {})\n })\n }, [store])\n\n const selectAll = React.useCallback(() => {\n const allCells = new Set<string>()\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n for (const columnId of columnIds) {\n allCells.add(getCellKey(rowIndex, columnId))\n }\n }\n\n const firstColumnId = columnIds[0]\n const lastColumnId = columnIds[columnIds.length - 1]\n\n store.setState('selectionState', {\n selectedCells: allCells,\n selectionRange:\n columnIds.length > 0 && rowCount > 0 && firstColumnId && lastColumnId\n ? {\n start: { rowIndex: 0, columnId: firstColumnId },\n end: { rowIndex: rowCount - 1, columnId: lastColumnId },\n }\n : null,\n isSelecting: false,\n })\n }, [columnIds, data.length, store])\n\n const selectColumn = React.useCallback(\n (columnId: string) => {\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n if (rowCount === 0) {\n return\n }\n\n const selectedCells = new Set<string>()\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n\n store.setState('selectionState', {\n selectedCells,\n selectionRange: {\n start: { rowIndex: 0, columnId },\n end: { rowIndex: rowCount - 1, columnId },\n },\n isSelecting: false,\n })\n },\n [data.length, store],\n )\n\n const selectRange = React.useCallback(\n (start: CellPosition, end: CellPosition, isSelecting = false) => {\n // Use the current visible/displayed column order so drag selection\n // follows the UI when users reorder columns.\n const visibleCols = getNavigableColumnIds()\n const startColIndex = visibleCols.indexOf(start.columnId)\n const endColIndex = visibleCols.indexOf(end.columnId)\n\n const minRow = Math.min(start.rowIndex, end.rowIndex)\n const maxRow = Math.max(start.rowIndex, end.rowIndex)\n const minCol = Math.min(startColIndex, endColIndex)\n const maxCol = Math.max(startColIndex, endColIndex)\n\n const selectedCells = new Set<string>()\n\n for (let rowIndex = minRow; rowIndex <= maxRow; rowIndex++) {\n for (let colIndex = minCol; colIndex <= maxCol; colIndex++) {\n const columnId = visibleCols[colIndex]\n if (columnId) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n }\n }\n\n store.setState('selectionState', {\n selectedCells,\n selectionRange: { start, end },\n isSelecting,\n })\n },\n [getNavigableColumnIds, store],\n )\n\n const focusCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState('focusedCell', { rowIndex, columnId })\n store.setState('editingCell', null)\n })\n\n // Notify parent component about cell focus change\n onCellFocusProp?.({ rowIndex, columnId })\n\n const currentState = store.getState()\n\n if (currentState.searchOpen) {\n return\n }\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus()\n }\n },\n [store, onCellFocusProp],\n )\n\n const onRowsDelete = React.useCallback(\n async (rowIndices: number[]) => {\n if (!onRowsDeleteProp || rowIndices.length === 0) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows\n\n if (!rows || rows.length === 0) {\n return\n }\n\n const currentState = store.getState()\n const currentFocusedColumn = currentState.focusedCell?.columnId ?? getNavigableColumnIds()[0]\n\n const minDeletedRowIndex = Math.min(...rowIndices)\n\n const rowsToDelete: TData[] = []\n for (const rowIndex of rowIndices) {\n const row = rows[rowIndex]\n if (row) {\n rowsToDelete.push(row.original)\n }\n }\n\n await onRowsDeleteProp(rowsToDelete, rowIndices)\n\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('rowSelection', {})\n store.setState('editingCell', null)\n })\n\n requestAnimationFrame(() => {\n const currentTable = tableRef.current\n const currentRows = currentTable?.getRowModel().rows ?? []\n const newRowCount = currentRows.length ?? data.length\n\n if (newRowCount > 0 && currentFocusedColumn) {\n const targetRowIndex = Math.min(minDeletedRowIndex, newRowCount - 1)\n focusCell(targetRowIndex, currentFocusedColumn)\n }\n })\n },\n [onRowsDeleteProp, data.length, store, getNavigableColumnIds, focusCell],\n )\n\n /**\n * Debounced row click handler - KEYBOARD NAVIGATION ONLY\n *\n * This debounced version (300ms delay) is used exclusively for keyboard navigation\n * (arrow keys, Page Up/Down, etc.) to prevent browser history pollution from rapid\n * key presses when using keyField-based URL routing.\n *\n * Mouse clicks use the immediate `onRowClickProp` handler directly (passed via table.meta.onRowClick)\n * since clicks are deliberate user actions that don't require debouncing.\n */\n const debouncedRowClick = useDebouncedCallback((rowIndex: number) => {\n onRowClickProp?.(rowIndex)\n }, 300)\n\n const navigateCell = React.useCallback(\n (direction: NavigationDirection) => {\n const currentState = store.getState()\n if (!currentState.focusedCell) {\n return\n }\n\n const { rowIndex, columnId } = currentState.focusedCell\n const _navCols = getNavigableColumnIds()\n const currentColIndex = _navCols.indexOf(columnId)\n const rowVirtualizer = rowVirtualizerRef.current\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n let newRowIndex = rowIndex\n let newColumnId = columnId\n\n switch (direction) {\n case 'up':\n newRowIndex = Math.max(0, rowIndex - 1)\n break\n case 'down':\n newRowIndex = Math.min(rowCount - 1, rowIndex + 1)\n break\n case 'left':\n if (currentColIndex > 0) {\n const prevColumnId = _navCols[currentColIndex - 1]\n if (prevColumnId) {\n newColumnId = prevColumnId\n }\n }\n break\n case 'right':\n if (currentColIndex < _navCols.length - 1) {\n const nextColumnId = _navCols[currentColIndex + 1]\n if (nextColumnId) {\n newColumnId = nextColumnId\n }\n }\n break\n case 'home': {\n const _navCols2 = getNavigableColumnIds()\n if (_navCols2.length > 0) {\n newColumnId = _navCols2[0] ?? columnId\n }\n break\n }\n case 'end': {\n const _navCols3 = getNavigableColumnIds()\n if (_navCols3.length > 0) {\n newColumnId = _navCols3[_navCols3.length - 1] ?? columnId\n }\n break\n }\n case 'ctrl+home': {\n newRowIndex = 0\n const _navCols4 = getNavigableColumnIds()\n if (_navCols4.length > 0) {\n newColumnId = _navCols4[0] ?? columnId\n }\n break\n }\n case 'ctrl+end': {\n newRowIndex = Math.max(0, rowCount - 1)\n const _navCols5 = getNavigableColumnIds()\n if (_navCols5.length > 0) {\n newColumnId = _navCols5[_navCols5.length - 1] ?? columnId\n }\n break\n }\n case 'pageup':\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems()\n const pageSize = visibleRange.length ?? 10\n newRowIndex = Math.max(0, rowIndex - pageSize)\n } else {\n newRowIndex = Math.max(0, rowIndex - 10)\n }\n break\n case 'pagedown':\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems()\n const pageSize = visibleRange.length ?? 10\n newRowIndex = Math.min(rowCount - 1, rowIndex + pageSize)\n } else {\n newRowIndex = Math.min(rowCount - 1, rowIndex + 10)\n }\n break\n }\n\n if (newRowIndex !== rowIndex || newColumnId !== columnId) {\n const rowDiff = newRowIndex - rowIndex\n const rowChanged = newRowIndex !== rowIndex\n\n // Trigger debounced row click for keyboard navigation\n // Uses 300ms delay to prevent browser history pollution from rapid arrow key presses\n // (mouse clicks use the immediate onRowClickProp handler via table.meta.onRowClick)\n if (rowChanged && onRowClickProp) {\n debouncedRowClick(newRowIndex)\n }\n\n // For single-row vertical navigation (up/down arrows)\n if (Math.abs(rowDiff) === 1 && (direction === 'up' || direction === 'down')) {\n const container = dataGridRef.current\n const currentRow = rowMapRef.current.get(rowIndex)\n const targetRow = rowMapRef.current.get(newRowIndex)\n\n if (!container || !currentRow) {\n // Fallback to simple focus if we can't find elements\n focusCell(newRowIndex, newColumnId)\n return\n }\n\n // Check viewport boundaries\n const containerRect = container.getBoundingClientRect()\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET\n\n // If target row already exists, check if it's visible\n if (targetRow) {\n const rowRect = targetRow.getBoundingClientRect()\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom\n\n if (isFullyVisible) {\n // Row is fully visible, just focus it\n focusCell(newRowIndex, newColumnId)\n return\n }\n\n // Row exists but not fully visible, scroll it into view\n focusCell(newRowIndex, newColumnId)\n\n if (direction === 'down') {\n // Scroll just enough to show the row at the bottom\n const scrollNeeded = rowRect.bottom - viewportBottom\n container.scrollTop += scrollNeeded\n } else {\n // Scroll just enough to show the row at the top\n const scrollNeeded = viewportTop - rowRect.top\n container.scrollTop -= scrollNeeded\n }\n return\n }\n\n // Target row is not rendered yet\n // Focus immediately so the ring appears as the row is revealed\n focusCell(newRowIndex, newColumnId)\n\n // Scroll by exactly one row height to reveal it smoothly\n if (direction === 'down') {\n container.scrollTop += rowHeightValue\n } else {\n // For arrow up, ensure we don't go below 0\n const currentScrollTop = container.scrollTop\n const targetScrollTop = Math.max(0, currentScrollTop - rowHeightValue)\n container.scrollTop = targetScrollTop\n }\n return\n }\n\n // For larger jumps (page up/down, ctrl+home/end, etc.)\n if (rowVirtualizer && Math.abs(rowDiff) > 1) {\n const align =\n direction === 'pageup' || direction === 'ctrl+home'\n ? 'start'\n : direction === 'pagedown' || direction === 'ctrl+end'\n ? 'end'\n : 'center'\n rowVirtualizer.scrollToIndex(newRowIndex, { align })\n requestAnimationFrame(() => {\n focusCell(newRowIndex, newColumnId)\n })\n return\n }\n\n // For horizontal navigation or when row is already visible\n focusCell(newRowIndex, newColumnId)\n }\n },\n [store, getNavigableColumnIds, focusCell, data.length, rowHeightValue, onRowClickProp, debouncedRowClick],\n )\n\n const onCellEditingStart = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState('focusedCell', { rowIndex, columnId })\n store.setState('editingCell', { rowIndex, columnId })\n })\n },\n [store],\n )\n\n const onCellEditingStop = React.useCallback(\n (opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }) => {\n const currentState = store.getState()\n const currentEditing = currentState.editingCell\n\n store.setState('editingCell', null)\n\n if (opts?.moveToNextRow && currentEditing) {\n const { rowIndex, columnId } = currentEditing\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n const nextRowIndex = rowIndex + 1\n if (nextRowIndex < rowCount) {\n requestAnimationFrame(() => {\n focusCell(nextRowIndex, columnId)\n })\n }\n } else if (opts?.direction && currentEditing) {\n // Focus the current editing cell first, then navigate\n const { rowIndex, columnId } = currentEditing\n focusCell(rowIndex, columnId)\n requestAnimationFrame(() => {\n navigateCell(opts.direction ?? 'right')\n })\n }\n },\n [store, data.length, focusCell, navigateCell],\n )\n\n const onSearchOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n store.setState('searchOpen', true)\n return\n }\n\n const currentState = store.getState()\n const currentMatch = currentState.matchIndex >= 0 && currentState.searchMatches[currentState.matchIndex]\n\n store.batch(() => {\n store.setState('searchOpen', false)\n store.setState('searchQuery', '')\n store.setState('searchMatches', [])\n store.setState('matchIndex', -1)\n\n if (currentMatch) {\n store.setState('focusedCell', {\n rowIndex: currentMatch.rowIndex,\n columnId: currentMatch.columnId,\n })\n }\n })\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus()\n }\n },\n [store],\n )\n\n const onSearch = React.useCallback(\n (query: string) => {\n if (!query.trim()) {\n store.batch(() => {\n store.setState('searchMatches', [])\n store.setState('matchIndex', -1)\n })\n return\n }\n\n const matches: CellPosition[] = []\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n\n const lowerQuery = query.toLowerCase()\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex]\n if (!row) {\n continue\n }\n\n for (const columnId of columnIds) {\n const cell = row.getVisibleCells().find((c) => c.column.id === columnId)\n if (!cell) {\n continue\n }\n\n const value = cell.getValue()\n const stringValue = String(value ?? '').toLowerCase()\n\n if (stringValue.includes(lowerQuery)) {\n matches.push({ rowIndex, columnId })\n }\n }\n }\n\n store.batch(() => {\n store.setState('searchMatches', matches)\n store.setState('matchIndex', matches.length > 0 ? 0 : -1)\n })\n\n // Scroll to first match but don't focus it (to keep focus in search input)\n if (matches.length > 0 && matches[0]) {\n const firstMatch = matches[0]\n rowVirtualizerRef.current?.scrollToIndex(firstMatch.rowIndex, {\n align: 'center',\n })\n }\n },\n [columnIds, store],\n )\n\n const onSearchQueryChange = React.useCallback((query: string) => store.setState('searchQuery', query), [store])\n\n const onNavigateToPrevMatch = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.searchMatches.length === 0) {\n return\n }\n\n const prevIndex =\n currentState.matchIndex - 1 < 0 ? currentState.searchMatches.length - 1 : currentState.matchIndex - 1\n const match = currentState.searchMatches[prevIndex]\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: 'center',\n })\n\n requestAnimationFrame(() => {\n store.setState('matchIndex', prevIndex)\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId)\n })\n })\n }\n }, [store, focusCell])\n\n const onNavigateToNextMatch = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.searchMatches.length === 0) {\n return\n }\n\n const nextIndex = (currentState.matchIndex + 1) % currentState.searchMatches.length\n const match = currentState.searchMatches[nextIndex]\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: 'center',\n })\n\n requestAnimationFrame(() => {\n store.setState('matchIndex', nextIndex)\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId)\n })\n })\n }\n }, [store, focusCell])\n\n const getIsSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return searchMatches.some((match) => match.rowIndex === rowIndex && match.columnId === columnId)\n },\n [searchMatches],\n )\n\n const getIsActiveSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n if (matchIndex < 0) {\n return false\n }\n const currentMatch = searchMatches[matchIndex]\n return currentMatch?.rowIndex === rowIndex && currentMatch?.columnId === columnId\n },\n [searchMatches, matchIndex],\n )\n\n const blurCell = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.editingCell && document.activeElement instanceof HTMLElement) {\n document.activeElement.blur()\n }\n\n store.batch(() => {\n store.setState('focusedCell', null)\n store.setState('editingCell', null)\n })\n }, [store])\n\n const onCellClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n // Ignore right-click (button 2) - let onCellContextMenu handle it\n if (event?.button === 2) {\n return\n }\n\n const currentState = store.getState()\n const currentFocused = currentState.focusedCell\n\n if (event) {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n const cellKey = getCellKey(rowIndex, columnId)\n const newSelectedCells = new Set(currentState.selectionState.selectedCells)\n\n if (newSelectedCells.has(cellKey)) {\n newSelectedCells.delete(cellKey)\n } else {\n newSelectedCells.add(cellKey)\n }\n\n store.setState('selectionState', {\n selectedCells: newSelectedCells,\n selectionRange: null,\n isSelecting: false,\n })\n focusCell(rowIndex, columnId)\n return\n }\n\n if (event.shiftKey && currentState.focusedCell) {\n event.preventDefault()\n selectRange(currentState.focusedCell, { rowIndex, columnId })\n return\n }\n }\n\n // Clear selection if there are selected cells or rows\n const hasSelectedCells = currentState.selectionState.selectedCells.size > 0\n const hasSelectedRows = Object.keys(currentState.rowSelection).length > 0\n\n if (hasSelectedCells && !currentState.selectionState.isSelecting) {\n // If there's a cell selection but we're not actively selecting (drag just finished),\n // don't clear it - keep the selection\n // Only clear if clicking elsewhere\n const cellKey = getCellKey(rowIndex, columnId)\n const isClickingSelectedCell = currentState.selectionState.selectedCells.has(cellKey)\n\n if (!isClickingSelectedCell) {\n clearSelection()\n } else {\n // Clicking on an already selected cell - just focus it\n focusCell(rowIndex, columnId)\n return\n }\n } else if (hasSelectedRows && columnId !== 'select') {\n // If there are selected rows but we're clicking on a non-checkbox cell, clear selections\n clearSelection()\n }\n\n if (currentFocused?.rowIndex === rowIndex && currentFocused?.columnId === columnId) {\n onCellEditingStart(rowIndex, columnId)\n } else {\n focusCell(rowIndex, columnId)\n }\n },\n [store, focusCell, onCellEditingStart, selectRange, clearSelection],\n )\n\n const onCellDoubleClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.defaultPrevented) {\n return\n }\n\n onCellEditingStart(rowIndex, columnId)\n },\n [onCellEditingStart],\n )\n\n const onCellMouseDown = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n // Ignore right-click (button 2) - let onCellContextMenu handle it\n if (event.button === 2) {\n return\n }\n\n event.preventDefault()\n\n // Only start drag selection if no modifier keys are pressed\n // Clear any existing selection and prepare for potential drag\n if (!event.ctrlKey && !event.metaKey && !event.shiftKey) {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId },\n },\n isSelecting: true,\n })\n store.setState('rowSelection', {})\n })\n }\n },\n [store],\n )\n\n const onCellMouseEnter = React.useCallback(\n (rowIndex: number, columnId: string, _event: React.MouseEvent) => {\n const currentState = store.getState()\n if (currentState.selectionState.isSelecting && currentState.selectionState.selectionRange) {\n const start = currentState.selectionState.selectionRange.start\n const end = { rowIndex, columnId }\n\n if (\n currentState.focusedCell?.rowIndex !== start.rowIndex ||\n currentState.focusedCell?.columnId !== start.columnId\n ) {\n focusCell(start.rowIndex, start.columnId)\n }\n\n selectRange(start, end, true)\n }\n },\n [store, selectRange, focusCell],\n )\n\n const onCellMouseUp = React.useCallback(() => {\n const currentState = store.getState()\n store.setState('selectionState', {\n ...currentState.selectionState,\n isSelecting: false,\n })\n }, [store])\n\n const onCellContextMenu = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n const currentState = store.getState()\n const cellKey = getCellKey(rowIndex, columnId)\n const isTargetCellSelected = currentState.selectionState.selectedCells.has(cellKey)\n\n // If right-clicking on a non-selected cell, select only that cell\n if (!isTargetCellSelected) {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set([cellKey]),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId },\n },\n isSelecting: false,\n })\n store.setState('focusedCell', { rowIndex, columnId })\n })\n }\n\n // Open context menu at cursor position\n store.setState('contextMenu', {\n open: true,\n x: event.clientX,\n y: event.clientY,\n })\n },\n [store],\n )\n\n const onContextMenuOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n const currentMenu = store.getState().contextMenu\n store.setState('contextMenu', {\n open: false,\n x: currentMenu.x,\n y: currentMenu.y,\n })\n }\n },\n [store],\n )\n\n const onDataGridKeyDown = React.useCallback(\n (event: KeyboardEvent) => {\n const currentState = store.getState()\n const { key, ctrlKey, metaKey, shiftKey } = event\n const isCtrlPressed = ctrlKey || metaKey\n\n // Handle Cmd+F / Ctrl+F to open search (highest priority, works even when editing)\n if (enableSearch && isCtrlPressed && key === SEARCH_SHORTCUT_KEY) {\n event.preventDefault()\n onSearchOpenChange(true)\n return\n }\n\n // Handle search navigation when search is open\n if (enableSearch && currentState.searchOpen && !currentState.editingCell) {\n if (key === 'Enter') {\n event.preventDefault()\n if (shiftKey) {\n onNavigateToPrevMatch()\n } else {\n onNavigateToNextMatch()\n }\n return\n }\n if (key === 'Escape') {\n event.preventDefault()\n onSearchOpenChange(false)\n return\n }\n // When search is open, don't let data grid handle any other keys\n // (they should only affect the search input)\n return\n }\n\n if (currentState.editingCell) {\n return\n }\n\n if (!currentState.focusedCell) {\n return\n }\n\n let direction: NavigationDirection | null = null\n\n if (isCtrlPressed && key === 'a') {\n event.preventDefault()\n selectAll()\n return\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n if (currentState.selectionState.selectedCells.size > 0) {\n event.preventDefault()\n // If any selected cell is not editable, do nothing (mirror context-menu Clear behavior)\n const currentTable = tableRef.current\n const visibleCols = currentTable?.getVisibleLeafColumns() ?? []\n let canClear = true\n for (const cellKey of currentState.selectionState.selectedCells) {\n if (!canClear) {\n break\n }\n const { columnId } = parseCellKey(cellKey)\n const col = visibleCols.find((c) => c.id === columnId)\n const editable = col?.columnDef?.meta?.editable\n if (editable === false) {\n canClear = false\n }\n }\n\n if (!canClear) {\n return\n }\n\n const updates: {\n rowIndex: number\n columnId: string\n value: unknown\n }[] = []\n\n currentState.selectionState.selectedCells.forEach((cellKey) => {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n updates.push({ rowIndex, columnId, value: '' })\n })\n\n onDataUpdate(updates)\n clearSelection()\n }\n return\n }\n\n switch (key) {\n case 'ArrowUp':\n direction = 'up'\n break\n case 'ArrowDown':\n direction = 'down'\n break\n case 'ArrowLeft':\n direction = 'left'\n break\n case 'ArrowRight':\n direction = 'right'\n break\n case 'Home':\n direction = isCtrlPressed ? 'ctrl+home' : 'home'\n break\n case 'End':\n direction = isCtrlPressed ? 'ctrl+end' : 'end'\n break\n case 'PageUp':\n direction = 'pageup'\n break\n case 'PageDown':\n direction = 'pagedown'\n break\n case 'Escape':\n event.preventDefault()\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n clearSelection()\n } else {\n blurCell()\n }\n return\n case 'F2':\n // Enter edit mode on the focused cell\n if (currentState.focusedCell) {\n event.preventDefault()\n onCellEditingStart(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId)\n }\n return\n case 'Enter':\n event.preventDefault()\n direction = shiftKey ? 'up' : 'down'\n break\n case 'Tab':\n event.preventDefault()\n direction = event.shiftKey ? 'left' : 'right'\n break\n }\n\n if (direction) {\n event.preventDefault()\n\n // Tab navigation should not trigger selection, even with Shift\n if (shiftKey && key !== 'Tab' && currentState.focusedCell) {\n const _navCols = getNavigableColumnIds()\n const currentColIndex = _navCols.indexOf(currentState.focusedCell.columnId)\n let newRowIndex = currentState.focusedCell.rowIndex\n let newColumnId = currentState.focusedCell.columnId\n\n switch (direction) {\n case 'up':\n newRowIndex = Math.max(0, currentState.focusedCell.rowIndex - 1)\n break\n case 'down':\n newRowIndex = Math.min(\n (tableRef.current?.getRowModel().rows.length || data.length) - 1,\n currentState.focusedCell.rowIndex + 1,\n )\n break\n case 'left':\n if (currentColIndex > 0) {\n const prevColumnId = _navCols[currentColIndex - 1]\n if (prevColumnId) {\n newColumnId = prevColumnId\n }\n }\n break\n case 'right':\n if (currentColIndex < _navCols.length - 1) {\n const nextColumnId = _navCols[currentColIndex + 1]\n if (nextColumnId) {\n newColumnId = nextColumnId\n }\n }\n break\n }\n\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell\n selectRange(selectionStart, {\n rowIndex: newRowIndex,\n columnId: newColumnId,\n })\n focusCell(newRowIndex, newColumnId)\n } else {\n if (currentState.selectionState.selectedCells.size > 0) {\n clearSelection()\n }\n navigateCell(direction)\n }\n }\n },\n [\n store,\n blurCell,\n navigateCell,\n selectAll,\n onDataUpdate,\n clearSelection,\n getNavigableColumnIds,\n data.length,\n selectRange,\n focusCell,\n onSearchOpenChange,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n enableSearch,\n onCellEditingStart,\n ],\n )\n\n const onSortingChange = React.useCallback(\n (updater: Updater<SortingState>) => {\n // If using server-side sorting (manualSorting), call external callback\n if (manualSorting && externalOnSortingChange) {\n externalOnSortingChange(updater)\n } else {\n // Otherwise use internal state\n const currentState = store.getState()\n const newSorting = typeof updater === 'function' ? updater(currentState.sorting) : updater\n store.setState('sorting', newSorting)\n }\n },\n [store, manualSorting, externalOnSortingChange],\n )\n\n const onRowSelectionChange = React.useCallback(\n (updater: Updater<RowSelectionState>) => {\n const currentState = store.getState()\n const newRowSelection = typeof updater === 'function' ? updater(currentState.rowSelection) : updater\n\n const selectedRows = Object.keys(newRowSelection).filter((key) => newRowSelection[key])\n\n const selectedCells = new Set<string>()\n const rows = tableRef.current?.getRowModel().rows ?? []\n\n for (const rowId of selectedRows) {\n const rowIndex = rows.findIndex((r) => r.id === rowId)\n if (rowIndex === -1) {\n continue\n }\n\n for (const columnId of columnIds) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n }\n\n store.batch(() => {\n store.setState('rowSelection', newRowSelection)\n store.setState('selectionState', {\n selectedCells,\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('focusedCell', null)\n store.setState('editingCell', null)\n })\n },\n [store, columnIds],\n )\n\n const onRowSelect = React.useCallback(\n (rowIndex: number, selected: boolean, shiftKey: boolean) => {\n const currentState = store.getState()\n const rows = tableRef.current?.getRowModel().rows ?? []\n const currentRow = rows[rowIndex]\n if (!currentRow) {\n return\n }\n\n if (shiftKey && currentState.lastClickedRowIndex !== null) {\n const startIndex = Math.min(currentState.lastClickedRowIndex, rowIndex)\n const endIndex = Math.max(currentState.lastClickedRowIndex, rowIndex)\n\n const newRowSelection: RowSelectionState = {\n ...currentState.rowSelection,\n }\n\n for (let i = startIndex; i <= endIndex; i++) {\n const row = rows[i]\n if (row) {\n newRowSelection[row.id] = selected\n }\n }\n\n onRowSelectionChange(newRowSelection)\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected,\n })\n }\n\n store.setState('lastClickedRowIndex', rowIndex)\n },\n [store, onRowSelectionChange],\n )\n\n const onRowHeightChange = React.useCallback(\n (updater: Updater<RowHeightValue>) => {\n const currentState = store.getState()\n const newRowHeight = typeof updater === 'function' ? updater(currentState.rowHeight) : updater\n store.setState('rowHeight', newRowHeight)\n },\n [store],\n )\n\n const onColumnClick = React.useCallback(\n (columnId: string) => {\n if (!enableColumnSelection) {\n clearSelection()\n return\n }\n\n selectColumn(columnId)\n },\n [enableColumnSelection, selectColumn, clearSelection],\n )\n\n const defaultColumn: Partial<ColumnDef<TData>> = React.useMemo(\n () => ({\n cell: DataGridCell,\n minSize: MIN_COLUMN_SIZE,\n maxSize: MAX_COLUMN_SIZE,\n }),\n [],\n )\n\n // Use external sorting state when manualSorting is true, otherwise use internal state\n const effectiveSorting = manualSorting && externalSorting ? externalSorting : sorting\n\n const tableOptions = React.useMemo<TableOptions<TData>>(\n () => ({\n ...dataGridPropsRef.current,\n data,\n columns,\n defaultColumn,\n initialState: mergedInitialState,\n manualSorting,\n state: {\n ...dataGridPropsRef.current.state,\n sorting: effectiveSorting,\n rowSelection,\n },\n onRowSelectionChange,\n onSortingChange,\n columnResizeMode: 'onChange',\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n meta: {\n ...dataGridPropsRef.current.meta,\n dataGridRef,\n focusedCell,\n editingCell,\n selectionState,\n searchOpen,\n rowHeight,\n isScrolling,\n highlightedRowIndex,\n // Immediate (non-debounced) row click handler for mouse clicks\n // Keyboard navigation uses debouncedRowClick instead (see navigateCell)\n onRowClick: onRowClickProp,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n onRowHeightChange,\n onRowSelect,\n onRowsDelete: onRowsDeleteProp ? onRowsDelete : undefined,\n onDataUpdate,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n contextMenu,\n onContextMenuOpenChange,\n },\n }),\n [\n dataGridPropsRef,\n data,\n columns,\n defaultColumn,\n mergedInitialState,\n effectiveSorting,\n manualSorting,\n rowSelection,\n onRowSelectionChange,\n onSortingChange,\n focusedCell,\n editingCell,\n selectionState,\n searchOpen,\n isScrolling,\n highlightedRowIndex,\n onRowClickProp,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n onDataUpdate,\n onRowsDeleteProp,\n onRowsDelete,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n contextMenu,\n onContextMenuOpenChange,\n rowHeight,\n onRowHeightChange,\n onRowSelect,\n ],\n )\n\n const table = useReactTable(tableOptions)\n\n if (!tableRef.current) {\n tableRef.current = table\n }\n\n // Extract columnSizing and columnVisibility so they can be used in hook dependency arrays\n const columnSizing = table.getState().columnSizing\n const columnVisibility = table.getState().columnVisibility\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: we need to memoize the column size vars\n const columnSizeVars = React.useMemo(() => {\n // reference these so they are used dependencies (recomputes when sizing or visibility changes)\n void columnSizing\n void columnVisibility\n const headers = table.getFlatHeaders()\n const colSizes: Record<string, number> = {}\n for (const header of headers) {\n // Prefer the current header size, but fall back to the columnDef `size`\n // or the MIN_COLUMN_SIZE so the CSS variables exist on first render.\n const headerSize =\n (typeof header.getSize === 'function' ? header.getSize() : undefined) ??\n (header.column.columnDef as any)?.size ??\n MIN_COLUMN_SIZE\n const colSize =\n (typeof header.column.getSize === 'function' ? header.column.getSize() : undefined) ??\n (header.column.columnDef as any)?.size ??\n MIN_COLUMN_SIZE\n\n colSizes[`--header-${header.id}-size`] = headerSize\n colSizes[`--col-${header.column.id}-size`] = colSize\n }\n return colSizes\n // Recompute whenever the table's column sizing or visibility state changes\n }, [table, columnSizing, columnVisibility])\n\n // Track loaded row count for infinite scroll detection\n const loadedRowCount = table.getRowModel().rows.length\n // Use totalRowCount for scrollbar sizing if provided, otherwise use loaded count\n const virtualizerRowCount = totalRowCount ?? loadedRowCount\n\n const rowVirtualizer = useVirtualizer({\n count: virtualizerRowCount,\n getScrollElement: () => dataGridRef.current,\n estimateSize: () => rowHeightValue,\n overscan,\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n onChange: (instance) => {\n // Sync virtualizer's isScrolling state to our store\n const virtualizerIsScrolling = instance.isScrolling\n const currentIsScrolling = store.getState().isScrolling\n\n if (virtualizerIsScrolling !== currentIsScrolling) {\n store.setState('isScrolling', virtualizerIsScrolling)\n }\n\n const virtualItems = instance.getVirtualItems()\n if (virtualItems.length === 0) {\n return\n }\n\n // Trigger onLoadMore when approaching the end of loaded data\n if (onLoadMore) {\n const lastVirtualItem = virtualItems.at(-1)\n // Load more when within threshold rows of the end (gives time to fetch before reaching bottom)\n if (lastVirtualItem && lastVirtualItem.index >= loadedRowCount - loadMoreThreshold) {\n onLoadMore()\n }\n }\n\n // Update row positions directly on DOM - batched via rAF for performance\n requestAnimationFrame(() => {\n for (const virtualRow of virtualItems) {\n const rowRef = rowMapRef.current.get(virtualRow.index)\n if (rowRef) {\n rowRef.style.transform = `translateY(${virtualRow.start}px)`\n }\n }\n })\n },\n })\n\n if (!rowVirtualizerRef.current) {\n rowVirtualizerRef.current = rowVirtualizer\n }\n\n const onScrollToRow = React.useCallback(\n (opts: Partial<CellPosition>) => {\n const rowIndex = opts?.rowIndex ?? 0\n const columnId = opts?.columnId\n\n rowVirtualizer.scrollToIndex(rowIndex, {\n align: 'center',\n })\n\n const targetColumnId = columnId ?? getNavigableColumnIds()[0]\n\n if (!targetColumnId) {\n return\n }\n\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n store.batch(() => {\n store.setState('focusedCell', {\n rowIndex,\n columnId: targetColumnId,\n })\n store.setState('editingCell', null)\n })\n })\n })\n })\n },\n [rowVirtualizer, getNavigableColumnIds, store],\n )\n\n const onRowAdd = React.useCallback(\n async (event?: React.MouseEvent<HTMLDivElement>) => {\n if (!onRowAddProp) {\n return\n }\n\n const result = await onRowAddProp(event)\n\n if (event?.defaultPrevented || result === null) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n\n if (result) {\n const adjustedRowIndex = (result.rowIndex ?? 0) >= rows.length ? rows.length : result.rowIndex\n\n onScrollToRow({\n rowIndex: adjustedRowIndex,\n columnId: result.columnId,\n })\n return\n }\n\n onScrollToRow({ rowIndex: rows.length })\n },\n [onRowAddProp, onScrollToRow],\n )\n\n // Persist table column state (order, visibility, pinning) whenever it changes.\n // Use a layout effect so persistence stays in sync with table layout updates.\n useIsomorphicLayoutEffect(() => {\n if (!storageKey) {\n return\n }\n\n try {\n const state = table.getState()\n const payload = {\n columnOrder: state.columnOrder,\n columnVisibility: state.columnVisibility,\n columnPinning: state.columnPinning,\n }\n localStorage.setItem(storageKey, JSON.stringify(payload))\n } catch (_) {\n // ignore storage errors\n }\n }, [storageKey, table.getState().columnOrder, table.getState().columnVisibility, table.getState().columnPinning])\n\n const searchState = React.useMemo<SearchState | undefined>(() => {\n if (!enableSearch) {\n return undefined\n }\n\n return {\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n }\n }, [\n enableSearch,\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n ])\n\n React.useEffect(() => {\n const dataGridElement = dataGridRef.current\n if (!dataGridElement) {\n return\n }\n\n dataGridElement.addEventListener('keydown', onDataGridKeyDown)\n return () => {\n dataGridElement.removeEventListener('keydown', onDataGridKeyDown)\n }\n }, [onDataGridKeyDown])\n\n React.useEffect(() => {\n function onGlobalKeyDown(event: KeyboardEvent) {\n const dataGridElement = dataGridRef.current\n if (!dataGridElement) {\n return\n }\n\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n return\n }\n\n const { key, ctrlKey, metaKey } = event\n const isCtrlPressed = ctrlKey || metaKey\n\n if (enableSearch && isCtrlPressed && key === SEARCH_SHORTCUT_KEY) {\n const isInInput = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA'\n const isInDataGrid = dataGridElement.contains(target)\n const isInSearchInput = target.closest('[role=search]') !== null\n\n if (isInDataGrid || isInSearchInput || !isInInput) {\n event.preventDefault()\n event.stopPropagation()\n onSearchOpenChange(true)\n\n if (!isInDataGrid && !isInSearchInput) {\n requestAnimationFrame(() => {\n dataGridElement.focus()\n })\n }\n return\n }\n }\n\n const isInDataGrid = dataGridElement.contains(target)\n if (!isInDataGrid) {\n return\n }\n\n if (key === 'Escape') {\n const currentState = store.getState()\n const hasSelections =\n currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0\n\n if (hasSelections) {\n event.preventDefault()\n event.stopPropagation()\n clearSelection()\n }\n }\n }\n\n globalThis.addEventListener('keydown', onGlobalKeyDown, true)\n return () => {\n globalThis.removeEventListener('keydown', onGlobalKeyDown, true)\n }\n }, [enableSearch, onSearchOpenChange, store, clearSelection])\n\n React.useEffect(() => {\n const currentState = store.getState()\n if (autoFocus && data.length > 0 && columns.length > 0 && !currentState.focusedCell) {\n const _nav = getNavigableColumnIds()\n if (_nav.length > 0) {\n const rafId = requestAnimationFrame(() => {\n if (typeof autoFocus === 'object') {\n const { rowIndex, columnId } = autoFocus\n if (columnId) {\n focusCell(rowIndex ?? 0, columnId)\n }\n return\n }\n\n const firstColumnId = _nav[0]\n if (firstColumnId) {\n focusCell(0, firstColumnId)\n }\n })\n return () => cancelAnimationFrame(rafId)\n }\n }\n return undefined\n }, [autoFocus, data.length, columns.length, store, getNavigableColumnIds, focusCell])\n\n React.useEffect(() => {\n function onOutsideClick(event: MouseEvent) {\n if (event.button === 2) {\n return\n }\n\n if (dataGridRef.current && !dataGridRef.current.contains(event.target as Node)) {\n const target = event.target\n const isInsidePopover =\n target instanceof HTMLElement &&\n (target.closest('[data-grid-cell-editor]') || target.closest('[data-grid-popover]'))\n\n if (!isInsidePopover) {\n blurCell()\n const currentState = store.getState()\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n clearSelection()\n }\n }\n }\n }\n\n document.addEventListener('mousedown', onOutsideClick)\n return () => {\n document.removeEventListener('mousedown', onOutsideClick)\n }\n }, [store, blurCell, clearSelection])\n\n React.useEffect(() => {\n function onCleanup() {\n document.removeEventListener('selectstart', preventSelection)\n document.removeEventListener('contextmenu', preventContextMenu)\n document.body.style.userSelect = ''\n }\n\n function preventSelection(event: Event) {\n event.preventDefault()\n }\n function preventContextMenu(event: Event) {\n event.preventDefault()\n }\n\n const onUnsubscribe = store.subscribe(() => {\n const currentState = store.getState()\n if (currentState.selectionState.isSelecting) {\n document.addEventListener('selectstart', preventSelection)\n document.addEventListener('contextmenu', preventContextMenu)\n document.body.style.userSelect = 'none'\n } else {\n onCleanup()\n }\n })\n\n return () => {\n onCleanup()\n onUnsubscribe()\n }\n }, [store])\n\n useIsomorphicLayoutEffect(() => {\n const rafId = requestAnimationFrame(() => {\n rowVirtualizer.measure()\n })\n return () => cancelAnimationFrame(rafId)\n }, [\n data,\n table.getState().columnFilters,\n table.getState().columnOrder,\n table.getState().columnPinning,\n table.getState().columnSizing,\n table.getState().columnVisibility,\n table.getState().expanded,\n table.getState().globalFilter,\n table.getState().grouping,\n table.getState().rowSelection,\n table.getState().sorting,\n rowHeight,\n ])\n\n return {\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n table,\n rowVirtualizer,\n searchState,\n columnSizeVars,\n onRowAdd: onRowAddProp ? onRowAdd : undefined,\n }\n}\n\nexport { useDataGrid, type UseDataGridProps }\n","import { CalendarIcon } from '@radix-ui/react-icons'\n\nimport { format } from 'date-fns'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Calendar } from '../calendar/calendar'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\nexport function DatePickerDemo() {\n const [date, setDate] = React.useState<Date>()\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={'outline'}\n className={cn('w-[240px] justify-start text-left font-normal', !date && 'text-muted-foreground')}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, 'PPP') : <span>Pick a date</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar mode=\"single\" selected={date} onSelect={setDate} initialFocus />\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { Drawer as DrawerPrimitive } from 'vaul'\n\nimport { cn } from '../lib/utils'\n\nconst Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) => (\n <DrawerPrimitive.Root shouldScaleBackground={shouldScaleBackground} {...props} />\n)\nDrawer.displayName = 'Drawer'\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerPortal = DrawerPrimitive.Portal\n\nconst DrawerClose = DrawerPrimitive.Close\n\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Overlay ref={ref} className={cn('fixed inset-0 z-50 bg-black/80', className)} {...props} />\n))\nDrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background',\n className,\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n))\nDrawerContent.displayName = 'DrawerContent'\n\nconst DrawerHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('grid gap-1.5 p-4 text-center sm:text-left', className)} {...props} />\n)\nDrawerHeader.displayName = 'DrawerHeader'\n\nconst DrawerFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />\n)\nDrawerFooter.displayName = 'DrawerFooter'\n\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDrawerTitle.displayName = DrawerPrimitive.Title.displayName\n\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nDrawerDescription.displayName = DrawerPrimitive.Description.displayName\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","import * as LabelPrimitive from '@radix-ui/react-label'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\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-base 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","import * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn('shrink-0 bg-border', orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]', className)}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { useMemo } from 'react'\n\nimport { Label } from '../label/label'\nimport { cn } from '../lib/utils'\nimport { Separator } from '../separator/separator'\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n 'flex flex-col gap-6',\n 'has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium', 'data-[variant=legend]:text-base', 'data-[variant=label]:text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva('group/field flex w-full gap-3 data-[invalid=true]:text-destructive', {\n variants: {\n orientation: {\n vertical: ['flex-col [&>*]:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '[&>[data-slot=field-label]]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto',\n '@md/field-group:[&>[data-slot=field-label]]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\nfunction Field({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<'fieldset'> & VariantProps<typeof fieldVariants>) {\n return (\n <fieldset\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), 'border-0 p-0 m-0', className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn('group/field-content flex flex-1 flex-col gap-1.5 leading-snug', className)}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50',\n 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4',\n 'has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n 'text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance',\n 'last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5',\n '[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'div'> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<'div'> & {\n errors?: ({ message?: string } | undefined)[]\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map((error) => error?.message && <li key={error.message}>{error.message}</li>)}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn('text-destructive text-sm font-normal', className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","import * as React from 'react'\n\nexport function useIsMobile(mobileBreakpoint = 768) {\n const [isMobile, setIsMobile] = React.useState<boolean>(false)\n\n React.useEffect(() => {\n const mql = globalThis.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`)\n const onChange = () => {\n setIsMobile(globalThis.innerWidth < mobileBreakpoint)\n }\n mql.addEventListener('change', onChange)\n setIsMobile(globalThis.innerWidth < mobileBreakpoint)\n return () => mql.removeEventListener('change', onChange)\n }, [mobileBreakpoint])\n\n return isMobile\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nimport { inputVariants } from './input'\n\n/**\n * Format configuration for number display using Intl.NumberFormat options\n */\nexport type NumberFormatConfig = {\n /**\n * Locale string (e.g., 'en-US', 'de-DE', 'fr-FR')\n * Defaults to user's browser locale if not specified\n */\n locale?: string\n /**\n * Intl.NumberFormat options for fine-grained control\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat\n */\n options?: Intl.NumberFormatOptions\n}\n\n/**\n * Number formatter - either a custom function or Intl.NumberFormat configuration\n */\nexport type NumberFormatter = ((value: number) => string) | NumberFormatConfig\n\n/**\n * Formats a number according to the provided formatter\n */\nfunction formatNumber(value: number, formatter: NumberFormatter, intlFormatter?: Intl.NumberFormat): string {\n // If formatter is a function, use it directly\n if (typeof formatter === 'function') {\n return formatter(value)\n }\n\n // Use the memoized formatter if provided, otherwise create a new one\n if (intlFormatter) {\n return intlFormatter.format(value)\n }\n\n // Fallback: create formatter (should rarely happen if memoization works)\n const { locale, options } = formatter\n return new Intl.NumberFormat(locale, options).format(value)\n}\n\n/**\n * Parses a formatted string back to a number using the format configuration\n * This is more robust than heuristics as it uses the actual locale/format settings\n */\nfunction parseFormattedNumber(\n formatted: string,\n formatter: NumberFormatter,\n intlFormatter?: Intl.NumberFormat,\n): number | undefined {\n if (formatted === '') {\n return undefined\n }\n\n // If formatter is a function, we can't determine the format rules,\n // so fall back to a best-effort heuristic parser\n if (typeof formatter === 'function') {\n return parseFormattedNumberHeuristic(formatted)\n }\n\n // Use the memoized formatter if provided, otherwise create a new one\n const formatterToUse = intlFormatter ?? new Intl.NumberFormat(formatter.locale, formatter.options)\n const parts = formatterToUse.formatToParts(12345.6)\n\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ''\n const decimalSeparator = parts.find((p) => p.type === 'decimal')?.value ?? '.'\n\n // Normalize the input by removing group separators and replacing decimal separator\n const normalized = formatted\n .replaceAll(groupSeparator, '')\n .replaceAll(decimalSeparator, '.')\n .replaceAll(/[^\\d.-]/g, '') // Strip all non-numeric characters (currency symbols, %, spaces, etc.)\n\n let parsed = Number(normalized)\n if (Number.isNaN(parsed)) {\n return undefined\n }\n\n // Handle percentage formatting: Intl.NumberFormat with style: 'percent' multiplies by 100\n // So \"85%\" represents 0.85. When parsing back, we need to divide by 100.\n if (formatter.options?.style === 'percent') {\n parsed = parsed / 100\n }\n\n return parsed\n}\n\n/**\n * Fallback parser for custom format functions where we don't know the format rules\n * Uses heuristics to guess the decimal separator\n */\nfunction parseFormattedNumberHeuristic(formatted: string): number | undefined {\n let cleaned = formatted.trim()\n\n // Find the last occurrence of comma or period (potential decimal separator)\n const lastComma = cleaned.lastIndexOf(',')\n const lastPeriod = cleaned.lastIndexOf('.')\n\n // Determine which is the decimal separator based on position\n if (lastComma > lastPeriod) {\n // Comma is likely the decimal separator (e.g., European format)\n cleaned = cleaned.replaceAll(/[.\\s']/g, '') // Remove periods, spaces, apostrophes\n cleaned = cleaned.replace(',', '.') // Replace comma with period (only one occurrence expected)\n } else if (lastPeriod > lastComma) {\n // Period is likely the decimal separator (e.g., US format)\n cleaned = cleaned.replaceAll(/[,\\s']/g, '') // Remove commas, spaces, apostrophes\n } else {\n // No decimal separator found, just remove all grouping chars\n cleaned = cleaned.replaceAll(/[,.\\s']/g, '')\n }\n\n // Remove any remaining non-numeric characters except minus and decimal point\n cleaned = cleaned.replaceAll(/[^0-9.-]/g, '')\n\n const parsed = Number(cleaned)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\n/**\n * Wrapper variants that mirror inputVariants but use focus-within (for wrapper)\n * instead of focus-visible (for input element).\n * Note: When modifying variants, also update inputVariants in input.tsx\n */\nconst numberInputWrapperVariants = cva(\n 'border-input bg-background grid grid-cols-[auto_1fr_auto] items-center overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] has-[input:disabled]:pointer-events-none has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50',\n {\n variants: {\n variant: {\n default: 'min-h-9 focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]',\n simple: 'min-h-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nexport type NumberInputProps = Omit<React.ComponentProps<'input'>, 'type' | 'value' | 'defaultValue' | 'onChange'> &\n VariantProps<typeof inputVariants> & {\n /**\n * The current value of the input (controlled mode). Must be a number.\n */\n value?: number\n /**\n * The default value of the input (uncontrolled mode). Must be a number.\n */\n defaultValue?: number\n /**\n * Callback fired when the value changes. Receives the numeric value or undefined.\n * - When the input is empty, receives undefined\n * - When the input contains a valid number, receives that number\n */\n onChange?: (value: number | undefined) => void\n /**\n * Text displayed before the input (e.g., \"$\", \"EUR\")\n */\n prefix?: string\n /**\n * Text displayed after the input (e.g., \"%\", \"kg\", \"USD\")\n */\n suffix?: string\n /**\n * Additional classes for the wrapper container\n */\n wrapperClassName?: string\n /**\n * Display the native browser spin buttons (up/down arrows).\n * Defaults to false.\n */\n showSpinButtons?: boolean\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n /**\n * Callback when Enter key is pressed\n */\n onEnter?: () => void\n /**\n * Optional formatter for the number value.\n * Can be a function that takes a number and returns a formatted string,\n * or a configuration object with formatting options.\n * When format is provided, the input switches to text mode to display formatted values.\n */\n format?: NumberFormatter\n }\n\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n className,\n wrapperClassName,\n prefix,\n suffix,\n variant,\n showSpinButtons = false,\n __e2e_test_id__,\n onEnter,\n onChange,\n format,\n value: controlledValue,\n ...props\n },\n ref,\n ) => {\n // Track whether the input is focused - when focused, show raw value for editing\n const [isFocused, setIsFocused] = React.useState(false)\n // Track the raw input string when in focus (for formatted inputs)\n const [inputString, setInputString] = React.useState('')\n\n // Memoize the Intl.NumberFormat instance to avoid recreating it on every render\n const intlFormatter = React.useMemo(() => {\n if (!format || typeof format === 'function') {\n return undefined\n }\n return new Intl.NumberFormat(format.locale, format.options)\n }, [format])\n\n const focusInputAtPosition = (element: HTMLElement, cursor: 'start' | 'end') => {\n const parent = element.parentElement\n if (!parent) {\n return\n }\n\n const input = parent.querySelector('input')\n if (!input) {\n return\n }\n\n // Save the original input type to restore it later\n const originalType = input.type\n\n // Temporarily change input type to text to set cursor position\n // This is needed because setSelectionRange doesn't work on number inputs\n // Only switch if it's currently a number input\n if (originalType === 'number') {\n input.type = 'text'\n }\n\n if (cursor === 'start') {\n input.setSelectionRange(0, 0)\n } else {\n const length = input.value.length\n input.setSelectionRange(length, length)\n }\n\n // Restore the original input type\n input.type = originalType\n input.click()\n input.focus()\n }\n\n const handleLabelClick = (e: React.MouseEvent<HTMLElement, MouseEvent>, cursor: 'start' | 'end') => {\n e.preventDefault()\n focusInputAtPosition(e.target as HTMLElement, cursor)\n }\n\n const handleLabelKeyDown = (e: React.KeyboardEvent<HTMLElement>, cursor: 'start' | 'end') => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n focusInputAtPosition(e.target as HTMLElement, cursor)\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n\n // If we're using formatting, store the raw input string\n if (format) {\n setInputString(value)\n }\n\n // Parse the value based on whether we're using formatting\n let parsedValue: number | undefined\n if (format) {\n // Use format-aware parser that uses the actual locale/format settings\n parsedValue = parseFormattedNumber(value, format, intlFormatter)\n } else {\n // Standard number parsing\n parsedValue = value === '' ? undefined : Number(value)\n }\n\n onChange?.(parsedValue)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false)\n // Clear input string on blur so next focus shows the formatted value without separators\n // This is safe because onChange has already fired synchronously for any typed value\n setInputString('')\n props.onBlur?.(e)\n }\n\n // Determine what value to display in the input\n const displayValue = React.useMemo(() => {\n // When focused and using format, show the raw input string or unformatted value\n if (isFocused && format) {\n // If user is typing, show their input string\n if (inputString !== '') {\n return inputString\n }\n // Otherwise show formatted value without thousands separators\n // This preserves the decimal precision from the format configuration\n if (controlledValue !== undefined) {\n const formatted = formatNumber(controlledValue, format, intlFormatter)\n\n // Remove thousands separators but keep the decimal precision\n if (typeof format !== 'function' && intlFormatter) {\n const parts = intlFormatter.formatToParts(controlledValue)\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ''\n return formatted.replaceAll(groupSeparator, '')\n }\n\n // For custom format functions, just use toString\n return controlledValue.toString()\n }\n return ''\n }\n\n // When not focused and format is provided, show formatted value\n if (!isFocused && format && controlledValue !== undefined) {\n return formatNumber(controlledValue, format, intlFormatter)\n }\n\n // Default: show the raw numeric value\n return controlledValue?.toString() ?? ''\n }, [isFocused, format, inputString, controlledValue, intlFormatter])\n\n return (\n <div className={cn(numberInputWrapperVariants({ variant }), wrapperClassName)}>\n {prefix && (\n <span\n className=\"text-muted-foreground flex h-full cursor-text items-center pl-2 pr-1\"\n onClick={(e) => handleLabelClick(e, 'start')}\n onKeyDown={(e) => handleLabelKeyDown(e, 'start')}\n >\n {prefix}\n </span>\n )}\n <input\n type={format ? 'text' : 'number'}\n data-slot=\"input\"\n className={cn(\n inputVariants({ variant }),\n // Remove border/shadow/ring from input since wrapper handles it\n // Use min-h-full to override min-h-9/min-h-8 from inputVariants - wrapper controls height - never use explicit h-* in input since it breaks the spinner buttons for some browsers\n 'min-h-full border-0 shadow-none focus-visible:ring-0 p-0 tabular-nums',\n !prefix && !suffix ? 'col-span-3' : !prefix || !suffix ? 'col-span-2' : 'col-span-1',\n 'text-right',\n !prefix && 'pl-2',\n !suffix && (showSpinButtons ? 'pr-1' : 'pr-2'),\n !showSpinButtons && !format && 'appearance-none',\n className,\n )}\n data-test-id={__e2e_test_id__}\n ref={ref}\n value={displayValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={(e) => {\n props.onKeyDown?.(e)\n if (e.key === 'Enter') {\n onEnter?.()\n }\n }}\n {...props}\n />\n {suffix && (\n <span\n className={cn(\n 'text-muted-foreground flex h-full cursor-text items-center pr-2',\n showSpinButtons ? 'pl-0' : 'pl-1',\n )}\n onClick={(e) => handleLabelClick(e, 'end')}\n onKeyDown={(e) => handleLabelKeyDown(e, 'end')}\n >\n {suffix}\n </span>\n )}\n </div>\n )\n },\n)\n\nNumberInput.displayName = 'NumberInput'\n\nexport { NumberInput }\n","import { memo } from 'react'\n\n/**\n * Adds a mark tag around all search hits in the text,\n * so that the given searchValues are highlighted in the text\n */\nconst MarkValueRenderer = memo(({ text, searchValues }: { text: string; searchValues: string[] | undefined }) => {\n if (!searchValues || searchValues.length === 0) {\n return <span>{text}</span>\n }\n\n // escape special characters; empty strings are removed using .filter(Boolean)\n const escapedFilterValues = searchValues\n .map((value) => {\n return value.replaceAll(/[|\\\\{}()[\\]^$+*?.]/g, String.raw`\\$&`)\n })\n .filter(Boolean)\n\n // no words to highlight\n if (escapedFilterValues.length === 0) {\n return <span>{text}</span>\n }\n\n // The split method is used to divide the \"text\" string into parts based on the regular expression.\n // This results in an array (\"parts\") where the matching words and the non-matching segments are separated.\n const regex = new RegExp(`(${escapedFilterValues.join('|')})`, 'gi')\n const parts = text.split(regex)\n\n return (\n <span>\n {parts.map((part, index) => {\n // to compare the parts with the words, the parts also have to be escaped\n const escapedPart = part.replaceAll(/[|\\\\{}()[\\]^$+*?.]/g, String.raw`\\$&`)\n return escapedFilterValues.some((escapedWord) => escapedPart.toLowerCase() === escapedWord.toLowerCase()) ? (\n <mark key={`${part}_${index}`} className=\"text-primary font-semibold bg-transparent\">\n {part}\n </mark>\n ) : (\n part\n )\n })}\n </span>\n )\n})\n\nMarkValueRenderer.displayName = 'MarkCellValueRenderer'\n\nexport { MarkValueRenderer }\n","import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'\nimport * as MenubarPrimitive from '@radix-ui/react-menubar'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst MenubarMenu = MenubarPrimitive.Menu\n\nconst MenubarGroup = MenubarPrimitive.Group\n\nconst MenubarPortal = MenubarPrimitive.Portal\n\nconst MenubarSub = MenubarPrimitive.Sub\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn('flex h-9 items-center space-x-1 rounded-md border bg-background p-1 shadow-sm', className)}\n {...props}\n />\n))\nMenubar.displayName = MenubarPrimitive.Root.displayName\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n className,\n )}\n {...props}\n />\n))\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n))\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(({ className, align = 'start', alignOffset = -4, sideOffset = 8, ...props }, ref) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n))\nMenubarContent.displayName = MenubarPrimitive.Content.displayName\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nMenubarItem.displayName = MenubarPrimitive.Item.displayName\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n))\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n))\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n))\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName\n\nconst MenubarShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nMenubarShortcut.displayname = 'MenubarShortcut'\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarSub,\n MenubarShortcut,\n}\n","import { type Dispatch, type PropsWithChildren, type ReactNode, type SetStateAction } from 'react'\n\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\n\ntype ModalProps = {\n title?: ReactNode | string\n subtitle?: ReactNode\n showCloseButton?: boolean\n isOpen: boolean\n setIsOpen: Dispatch<SetStateAction<boolean>>\n __e2e_test_id__?: string\n footer?: ReactNode\n controls?: ReactNode[]\n preventClickOutsideToDismiss?: boolean\n size?: 'fit-content' | 'full-height' | 'full-size' | 'fit-content-width'\n contentClass?: string\n onOpenAutoFocus?: (event: Event) => void\n}\n\nexport const Modal = ({\n title = '',\n subtitle,\n isOpen,\n showCloseButton = true,\n setIsOpen,\n children,\n controls = [],\n footer,\n preventClickOutsideToDismiss,\n size = 'fit-content',\n contentClass = '',\n __e2e_test_id__,\n onOpenAutoFocus,\n}: PropsWithChildren<ModalProps>) => {\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogContent\n onOpenAutoFocus={onOpenAutoFocus}\n className={cn(\n 'sm:max-w-xl min-w-[425px] max-h-[95vh] flex flex-col p-0 gap-0 border-(--discreet-border) rounded',\n size === 'full-height' && 'h-[95vh]',\n size === 'full-size' && 'w-[95vw] h-[95vh] sm:max-w-[95vw]',\n size === 'fit-content-width' && 'max-w-fit w-auto sm:max-w-fit',\n contentClass,\n )}\n showCloseButton={showCloseButton}\n __e2e_test_id__={__e2e_test_id__}\n onInteractOutside={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}\n >\n <DialogHeader\n className={cn(\n 'flex flex-row flex-shrink-0 items-center gap-2 p-3 min-h-10 border-b-1 border-(--discreet-border)',\n showCloseButton ? 'pr-12' : '',\n subtitle ? 'pb-0' : '',\n )}\n >\n <div className=\"overflow-hidden\">\n {title && (\n <DialogTitle className=\"text-xl overflow-hidden text-ellipsis whitespace-nowrap\">{title}</DialogTitle>\n )}\n {subtitle}\n </div>\n {controls.length > 0 && (\n <div className=\"flex flex-grow justify-end items-baseline gap-2 whitespace-nowrap flex-1\">{controls}</div>\n )}\n </DialogHeader>\n\n <div className=\"max-h-full h-full overflow-auto flex-grow\">{children}</div>\n\n {footer && (\n <DialogFooter className=\"sm:justify-center flex-shrink-0 p-3 border-t-1 border-(--discreet-border)\">\n {footer}\n </DialogFooter>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { ChevronDownIcon } from '@radix-ui/react-icons'\nimport * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'\n\nimport { cva } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n viewport?: boolean\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn('group/navigation-menu relative flex max-w-max flex-1 items-center justify-center', className)}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn('group flex flex-1 list-none items-center justify-center gap-1', className)}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item data-slot=\"navigation-menu-item\" className={cn('relative', className)} {...props} />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n 'group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1',\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), 'group', className)}\n {...props}\n >\n {children}{' '}\n <ChevronDownIcon\n className=\"relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n 'data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto',\n 'group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn('absolute top-full left-0 isolate z-50 flex justify-center')}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n 'origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]',\n className,\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction NavigationMenuLink({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"data-[active=true]:focus:bg-accent data-[active=true]:hover:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n 'data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden',\n className,\n )}\n {...props}\n >\n <div className=\"bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n}\n","import { ChevronLeftIcon, ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { ButtonProps, buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn('mx-auto flex w-full justify-center', className)}\n {...props}\n />\n)\nPagination.displayName = 'Pagination'\n\nconst PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul ref={ref} className={cn('flex flex-row items-center gap-1', className)} {...props} />\n ),\n)\nPaginationContent.displayName = 'PaginationContent'\n\nconst PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn('', className)} {...props} />\n))\nPaginationItem.displayName = 'PaginationItem'\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, 'size'> &\n React.ComponentProps<'a'>\n\nconst PaginationLink = ({ className, isActive, size = 'icon', children, ...props }: PaginationLinkProps) => (\n <a\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? 'outline' : 'ghost',\n size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </a>\n)\nPaginationLink.displayName = 'PaginationLink'\n\nconst PaginationPrevious = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink aria-label=\"Go to previous page\" size=\"default\" className={cn('gap-1 pl-2.5', className)} {...props}>\n <ChevronLeftIcon className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = 'PaginationPrevious'\n\nconst PaginationNext = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink aria-label=\"Go to next page\" size=\"default\" className={cn('gap-1 pr-2.5', className)} {...props}>\n <span>Next</span>\n <ChevronRightIcon className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = 'PaginationNext'\n\nconst PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsHorizontalIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = 'PaginationEllipsis'\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import type { CSSProperties } from 'react'\n\nexport const Progress = ({ value, size = '100%' }: { value: number; size?: string }) => {\n return (\n <div\n style={{ '--parent-width': size } as CSSProperties}\n className=\"w-(--parent-width) flex justify-center relative rounded-md overflow-hidden h-2 mt-8\"\n >\n <div className=\"w-full absolute top-0 left-0 h-2.5 bg-(--discreet-border)\" data-testid=\"progress-bg\" />\n <div\n style={{ '--child-width': `calc(${value}*100%)` } as CSSProperties}\n className=\"w-(--child-width) absolute h-2.5 top-0 left-0 bg-primary\"\n data-testid=\"progress-filled\"\n />\n </div>\n )\n}\n","import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction RadioGroup({\n className,\n __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root> & { __e2e_test_id__?: string }) {\n return (\n <RadioGroupPrimitive.Root\n data-test-id={__e2e_test_id__}\n data-slot=\"radio-group\"\n className={cn('grid gap-3', className)}\n {...props}\n />\n )\n}\n\nconst radioGroupVariants = cva(\n 'cursor-pointer border-input text-primary 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:bg-input/30 aspect-square shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n circleVariant: {\n default: '',\n grayThick: 'aria-checked:border-muted-foreground aria-checked:border-2',\n },\n size: {\n default: 'size-4',\n sm: 'size-3.5',\n },\n },\n defaultVariants: {\n circleVariant: 'default',\n size: 'default',\n },\n },\n)\n\ntype RadioGroupItemProps = React.ComponentProps<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupVariants>\n\nfunction RadioGroupItem({ className, circleVariant, size, ...props }: RadioGroupItemProps) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(radioGroupVariants({ circleVariant, size, className }))}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <div\n className={`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full ${\n circleVariant === 'grayThick' ? 'bg-muted-foreground' : 'bg-primary'\n }\n ${size === 'sm' ? 'size-2' : 'size-2.25'}`}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","import { DragHandleDots2Icon } from '@radix-ui/react-icons'\n\nimport * as ResizablePrimitive from 'react-resizable-panels'\n\nimport { cn } from '../lib/utils'\n\nconst ResizablePanelGroup = ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (\n <ResizablePrimitive.PanelGroup\n className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}\n {...props}\n />\n)\n\nconst ResizablePanel = ResizablePrimitive.Panel\n\nconst ResizableHandle = ({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n withHandle?: boolean\n}) => (\n <ResizablePrimitive.PanelResizeHandle\n className={cn(\n 'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90',\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <DragHandleDots2Icon className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n)\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle }\n","import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root ref={ref} className={cn('relative overflow-hidden', className)} {...props}>\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">{children}</ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-[1px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import * as SheetPrimitive from '@radix-ui/react-dialog'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out',\n {\n variants: {\n side: {\n top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',\n right:\n 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n },\n)\n\ntype SheetContentProps = React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> &\n VariantProps<typeof sheetVariants>\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content ref={ref} className={cn(sheetVariants({ side }), className)} {...props}>\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n ),\n)\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n)\nSheetHeader.displayName = 'SheetHeader'\n\nconst SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nSheetFooter.displayName = 'SheetFooter'\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-foreground', className)} {...props} />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { PanelLeftIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport {\n Button,\n cn,\n Input,\n Separator,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n Skeleton,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n useIsMobile,\n} from '../index'\n\nconst SIDEBAR_WIDTH = '16rem'\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\nconst SIDEBAR_WIDTH_ICON = '3rem'\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed'\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n },\n [setOpenProp, open],\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n globalThis.addEventListener('keydown', handleKeyDown)\n return () => globalThis.removeEventListener('keydown', handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed'\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right'\n variant?: 'sidebar' | 'floating' | 'inset'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp: React.ElementType = asChild ? Slot : 'div'\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n widths = [50],\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean\n widths?: number[]\n}) {\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n {widths.map((width) => {\n return (\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n )\n })}\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean\n size?: 'sm' | 'md'\n isActive?: boolean\n}) {\n const Comp: React.ElementType = asChild ? Slot : 'a'\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import { ChevronUpIcon, FilterX } from 'lucide-react'\nimport { Key, useCallback, useMemo, useState } from 'react'\n\nimport { Button, Card, CardContent, CardHeader, CardTitle, Checkbox, Input, Skeleton } from '../index'\nimport { cn } from '../lib/utils'\n\nfunction usePersistedState(storageKey: string | undefined, defaultValue: boolean): [boolean, (value: boolean) => void] {\n const [state, setState] = useState<boolean>(() => {\n if (!storageKey) {\n return defaultValue\n }\n try {\n const stored = localStorage.getItem(storageKey)\n return stored === null ? defaultValue : JSON.parse(stored)\n } catch {\n return defaultValue\n }\n })\n\n const setPersistedState = useCallback(\n (value: boolean) => {\n setState(value)\n if (storageKey) {\n try {\n localStorage.setItem(storageKey, JSON.stringify(value))\n } catch {\n // Ignore localStorage errors (e.g., quota exceeded, private browsing)\n }\n }\n },\n [storageKey],\n )\n\n return [state, setPersistedState]\n}\n\nexport function Slicer<T extends Key>({\n filterValues,\n selectedValues,\n onChange,\n title,\n isLoading = false,\n optionsHeight = 200,\n className,\n defaultCollapsed = false,\n storageKey,\n}: Readonly<{\n filterValues: { value: T; label: string; hasMatches: boolean }[]\n selectedValues: Set<T>\n onChange: (val: T[]) => void\n title: string\n isLoading?: boolean\n optionsHeight?: number\n className?: string\n defaultCollapsed?: boolean\n /** Storage key for persisting collapsed state. Defaults to a key based on the title. Set to null to disable persistence. */\n storageKey?: string | null\n}>) {\n const effectiveStorageKey = storageKey === null ? undefined : (storageKey ?? `slicer-collapsed-${title}`)\n const [isCollapsed, setIsCollapsed] = usePersistedState(effectiveStorageKey, defaultCollapsed)\n const [searchQuery, setSearchQuery] = useState('')\n\n const filteredOptions = useMemo(() => {\n if (!searchQuery) {\n return filterValues\n }\n const lowerQuery = searchQuery.toLowerCase()\n return filterValues.filter((option) => option.label.toLowerCase().includes(lowerQuery))\n }, [filterValues, searchQuery])\n\n const areAllSelected = filterValues.length > 0 && filterValues.every((option) => selectedValues.has(option.value))\n const areAllFilteredSelected =\n filteredOptions.length > 0 && filteredOptions.every((option) => selectedValues.has(option.value))\n const isAnyFilteredSelected = filteredOptions.some((option) => selectedValues.has(option.value))\n\n const handleClear = () => {\n onChange([])\n }\n\n // Handle select all / select search results\n const handleSelectAll = () => {\n let newVals: T[] = []\n if (searchQuery.length > 0) {\n const newSelected = new Set(selectedValues)\n if (areAllFilteredSelected) {\n filteredOptions.forEach((o) => newSelected.delete(o.value))\n } else {\n filteredOptions.forEach((o) => newSelected.add(o.value))\n }\n newVals = Array.from(newSelected)\n } else if (areAllSelected) {\n newVals = []\n } else {\n newVals = filterValues.map((o) => o.value)\n }\n onChange(newVals)\n }\n\n // Handle individual option toggle\n const handleOptionToggle = (optionValue: T, checked: boolean) => {\n const newSelected = new Set(selectedValues)\n if (checked) {\n newSelected.add(optionValue)\n } else {\n newSelected.delete(optionValue)\n }\n onChange(Array.from(newSelected))\n }\n\n return (\n <Card className={cn('flex flex-col overflow-hidden w-56 rounded shadow-sm shrink-0', className)}>\n <CardHeader className=\"px-2 py-0 pt-2 flex space-y-0 border-b border-border bg-muted/50 relative min-h-9\">\n <CardTitle className=\"text-base font-semibold\">{title}</CardTitle>\n {!isCollapsed && (\n <Input\n className=\"border-none shadow-none rounded-sm text-sm p-0 h-6.5\"\n variant=\"simple\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n )}\n\n <Button\n variant=\"ghost\"\n size=\"iconSm\"\n onClick={() => {\n if (!isCollapsed) {\n setSearchQuery('')\n }\n setIsCollapsed(!isCollapsed)\n }}\n title={isCollapsed ? 'Expand slicer' : 'Collapse slicer'}\n className=\"size-7 absolute top-1 right-9 text-muted-foreground\"\n >\n <ChevronUpIcon className={cn(isCollapsed && 'rotate-180')} />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"iconSm\"\n disabled={selectedValues.size === 0}\n onClick={handleClear}\n title=\"Clear filter\"\n className=\"size-7 absolute top-1 right-1 text-muted-foreground\"\n >\n <FilterX />\n </Button>\n </CardHeader>\n {!isCollapsed && (\n <CardContent className=\"p-1 flex flex-col\">\n {/* Select all button */}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className=\"w-full justify-start px-2 py-1 rounded-sm text-sm font-normal\"\n onClick={handleSelectAll}\n >\n {searchQuery.length > 0 ? (\n <Checkbox\n readOnly\n checked={isAnyFilteredSelected}\n disabled={filteredOptions.length === 0}\n label=\"Select Search Results\"\n className=\"pointer-events-none\"\n checkboxSize=\"sm\"\n variant={areAllFilteredSelected ? 'simple' : 'default'}\n iconStyle={areAllFilteredSelected ? 'simple' : 'solo'}\n checkIcon={areAllFilteredSelected ? 'check' : 'square'}\n />\n ) : (\n <Checkbox\n readOnly\n checked={selectedValues.size > 0}\n disabled={filterValues.length === 0}\n label=\"Select All\"\n className=\"pointer-events-none\"\n checkboxSize=\"sm\"\n variant={areAllSelected ? 'simple' : 'default'}\n iconStyle={areAllSelected ? 'simple' : 'solo'}\n checkIcon={areAllSelected ? 'check' : 'square'}\n />\n )}\n </Button>\n\n <div\n className={`px-2 py-1 h-(--optionsHeight) shrink-0 overflow-auto`}\n style={{ '--optionsHeight': `${optionsHeight}px` } as React.CSSProperties}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"flex size-full items-center justify-center text-sm\">\n {filterValues.length === 0 ? 'No options available' : 'No results found'}\n </div>\n ) : (\n <>\n {isLoading ? (\n <>\n <Skeleton className=\"h-5 w-full\" />\n <Skeleton className=\"h-5 w-3/4\" />\n <Skeleton className=\"h-5 w-5/6\" />\n </>\n ) : (\n <>\n {filteredOptions.map((option) => (\n <SlicerItem\n key={option.value}\n option={option}\n isSelected={selectedValues.has(option.value)}\n onToggle={handleOptionToggle}\n />\n ))}\n </>\n )}\n </>\n )}\n </div>\n </CardContent>\n )}\n </Card>\n )\n}\n\nconst SlicerItem = <T extends Key>({\n option,\n isSelected,\n onToggle,\n}: {\n option: { label: string; value: T; hasMatches: boolean }\n isSelected: boolean\n onToggle: (value: T, checked: boolean) => void\n}) => {\n return (\n <Checkbox\n key={option.value}\n checked={isSelected}\n onChange={(e) => onToggle(option.value, e.target.checked)}\n checkIcon=\"check\"\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !option.hasMatches && 'opacity-50',\n (option.value == '' || option.value == null || option.value == undefined) && 'italic',\n )}\n label={option.label}\n />\n )\n}\n","import * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport type { CSSProperties } from 'react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst sliderVariants = cva('absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full', {\n variants: {\n sliderVariant: {\n default: 'bg-primary',\n gray: 'bg-muted-foreground',\n },\n },\n defaultVariants: {\n sliderVariant: 'default',\n },\n})\n\nconst knobVariants = cva(\n 'bg-background block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n knobVariant: {\n default: 'border-primary ring-ring/50 hover:ring-4 focus-visible:ring-4',\n gray: 'border-muted-foreground border-2',\n },\n },\n defaultVariants: {\n knobVariant: 'default',\n },\n },\n)\n\ntype SliderProps = React.ComponentProps<typeof SliderPrimitive.Root> &\n VariantProps<typeof sliderVariants> &\n VariantProps<typeof knobVariants> & { knobSize?: number }\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n sliderVariant,\n knobVariant,\n knobSize,\n ...props\n}: SliderProps) {\n const _values = React.useMemo(() => {\n if (Array.isArray(value)) {\n return value\n } else if (Array.isArray(defaultValue)) {\n return defaultValue\n }\n return [min, max]\n }, [value, defaultValue, min, max])\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n 'cursor-pointer relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5',\n )}\n >\n <SliderPrimitive.Range data-slot=\"slider-range\" className={cn(sliderVariants({ sliderVariant }))} />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className={cn(\n knobVariants({\n knobVariant,\n }),\n knobSize ? 'size-(--knob-size)' : '',\n )}\n style={{ '--knob-size': `${knobSize}px` } as CSSProperties}\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider, sliderVariants, knobVariants }\n","import * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import { Slot } from '@radix-ui/react-slot'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport type { ComponentProps } from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Tabs({ className, ...props }: ComponentProps<typeof TabsPrimitive.Root>) {\n return <TabsPrimitive.Root data-slot=\"tabs\" className={cn('flex flex-col gap-2', className)} {...props} />\n}\n\nconst tabsListVariants = cva('w-fit text-muted-foreground inline-flex items-center justify-center rounded-lg', {\n variants: {\n variant: {\n default: 'bg-muted p-[3px]',\n protocol: 'bg-transparent',\n },\n size: {\n default: 'h-9',\n sm: 'h-6',\n lg: 'h-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n})\n\nfunction TabsList({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : TabsPrimitive.List\n return <Comp data-slot=\"tabs-list\" className={cn(tabsListVariants({ variant, size, className }))} {...props} />\n}\n\nconst tabsTriggerVariants = cva(\n \"h-[100%] text-lg inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 text-foreground\",\n {\n variants: {\n variant: {\n default:\n 'h-[calc(100%-1px)] flex-1 rounded-md border border-transparent px-2 py-1 transition-[color,box-shadow] dark:text-muted-foreground data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:shadow-sm',\n protocol:\n 'bg-transparent border-b-2 border-b-transparent hover:text-primary hover:border-b-primary data-[state=active]:border-b-primary data-[state=active]:text-primary',\n },\n },\n },\n)\n\nfunction TabsTrigger({\n className,\n variant,\n asChild = false,\n ...props\n}: ComponentProps<typeof TabsPrimitive.Trigger> & VariantProps<typeof tabsTriggerVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : TabsPrimitive.Trigger\n return <Comp data-slot=\"tabs-trigger\" className={cn(tabsTriggerVariants({ variant, className }))} {...props} />\n}\n\nfunction TabsContent({ className, ...props }: ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as TogglePrimitive from '@radix-ui/react-toggle'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground cursor-pointer',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-3',\n sm: 'h-8 px-2',\n lg: 'h-10 px-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root ref={ref} className={cn(toggleVariants({ variant, size, className }))} {...props} />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'\n\nimport { type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from '../toggle/toggle'\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => {\n const memoizedValue = useMemo(() => ({ variant, size }), [size, variant])\n return (\n <ToggleGroupPrimitive.Root ref={ref} className={cn('flex items-center justify-center gap-1', className)} {...props}>\n <ToggleGroupContext.Provider value={memoizedValue}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n})\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["day: Date","modifiers: any","e: React.MouseEvent<Element>","fromMonth: Date | undefined","toMonth: Date | undefined","date: Date","months: number","event: React.KeyboardEvent<HTMLDivElement>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Root>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Trigger>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Portal>>","props: Readonly<React.ComponentProps<typeof DialogPrimitive.Close>>","iso?: string","r?: { from?: Date; to?: Date } | undefined","PRESETS: Preset[]","presetName: string","timelineStart?: Date","timelineEnd?: Date","value: { from?: Date; to?: Date } | undefined","variant?: Cell['variant']","direction: SortDirection","prev: SortingState","newSort: ColumnSort","event: React.PointerEvent<HTMLButtonElement>","value: React.ReactNode | ColumnMenuRendererFunction<TData, TValue>","HeaderComponents: Record<string, (props: any) => React.ReactNode | null>","rowIndex: number","columnId: string","cellKey: string","rowHeight: RowHeightValue","lineCountMap: Record<RowHeightValue, number>","onCloseAutoFocus: NonNullable<React.ComponentProps<typeof DropdownMenuContent>['onCloseAutoFocus']>","columnIds: string[]","updates: UpdateCell[]","ref: PossibleRef<T>","value: T","event: React.MouseEvent<HTMLDivElement>","callback: T | undefined","callback: T","delay: number","event: KeyboardEvent","event: React.KeyboardEvent","query: string","event: React.ChangeEvent<HTMLInputElement>","event: React.PointerEvent<HTMLButtonElement>","event: React.MouseEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLDivElement>","align: 'left' | 'right' | 'center'","event: React.MouseEvent<HTMLDivElement>","event: React.MouseEvent","event: React.KeyboardEvent<HTMLDivElement>","checked: boolean","event: React.KeyboardEvent<HTMLDivElement>","event: React.MouseEvent","event: React.MouseEvent<HTMLInputElement>","value: string | Date | null | undefined","date: Date","date: Date | undefined","isOpen: boolean","event: React.KeyboardEvent<HTMLDivElement>","newValue: string","event: React.ChangeEvent<HTMLTextAreaElement>","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLTextAreaElement>","val: string","options: CellSelectOption[]","value: string","valueToRemove: string","event?: React.MouseEvent","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","event: React.KeyboardEvent<HTMLInputElement>","event: React.ChangeEvent<HTMLInputElement>","options?: { moveToNextRow?: boolean; direction?: 'left' | 'right' }","event: React.KeyboardEvent<HTMLDivElement>","options: CellSelectOption[]","newValue: string","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","editingContent: React.ReactNode","event: React.ChangeEvent<HTMLInputElement>","event: React.KeyboardEvent<HTMLDivElement>","ordered: ReturnType<typeof table.getAllColumns>[0][]","clientY: number","dragId: string","toIndex: number","e: React.PointerEvent","id: string","ev: PointerEvent","targetIndex: number | null","keys: string[]","fn: () => T","data: T","store: DataGridStore","selector: (state: DataGridState) => T","updates: UpdateCell | UpdateCell[]","rowIndex: number","columnId: string","start: CellPosition","end: CellPosition","rowIndices: number[]","rowsToDelete: TData[]","direction: NavigationDirection","opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }","open: boolean","query: string","matches: CellPosition[]","event?: React.MouseEvent","event: React.MouseEvent","_event: React.MouseEvent","event: KeyboardEvent","direction: NavigationDirection | null","updates: {\n rowIndex: number\n columnId: string\n value: unknown\n }[]","updater: Updater<SortingState>","updater: Updater<RowSelectionState>","selected: boolean","shiftKey: boolean","newRowSelection: RowSelectionState","updater: Updater<RowHeightValue>","defaultColumn: Partial<ColumnDef<TData>>","colSizes: Record<string, number>","opts: Partial<CellPosition>","event?: React.MouseEvent<HTMLDivElement>","event: MouseEvent","event: Event","value: number","formatter: NumberFormatter","intlFormatter?: Intl.NumberFormat","formatted: string","element: HTMLElement","cursor: 'start' | 'end'","e: React.MouseEvent<HTMLElement, MouseEvent>","e: React.KeyboardEvent<HTMLElement>","e: React.ChangeEvent<HTMLInputElement>","parsedValue: number | undefined","e: React.FocusEvent<HTMLInputElement>","value: boolean | ((value: boolean) => boolean)","event: KeyboardEvent","Comp: React.ElementType","storageKey: string | undefined","defaultValue: boolean","value: boolean","newVals: T[]","optionValue: T","checked: boolean"],"sources":["../src/lib/utils.ts","../src/accordion/accordion.tsx","../src/alert/alert.tsx","../src/button/button.tsx","../src/alert-dialog/alert-dialog.tsx","../src/avatar/avatar.tsx","../src/badge/badge.tsx","../src/breadcrumb/breadcrumb.tsx","../src/calendar/calendar.tsx","../src/card/card.tsx","../src/card-hover/card-hover.tsx","../src/carousel/carousel.tsx","../src/checkbox/checkbox.tsx","../src/collapse/collapse.tsx","../src/dialog/dialog.tsx","../src/command-palette/command-palette.tsx","../src/popover/popover.tsx","../src/combobox/combobox.tsx","../src/spinner/spinner.tsx","../src/command/command.tsx","../src/content-frame/content-frame.tsx","../src/context-menu/context-menu.tsx","../src/skeleton/skeleton.tsx","../src/dropdown-menu/dropdown-menu.tsx","../src/tooltip/tooltip.tsx","../src/select/select.tsx","../src/data-grid/cell-variants/utils/gantt-timerange-picker.tsx","../src/data-grid/cell-variants/utils/gantt-timeline.tsx","../src/data-grid/data-grid-column-header.tsx","../src/data-grid/data-grid-utils.ts","../src/data-grid/data-grid-context-menu.tsx","../src/lib/compose-refs.ts","../src/data-grid/data-grid-row.tsx","../src/hooks/use-callback-ref.ts","../src/hooks/use-debounced-callback.ts","../src/input/input.tsx","../src/data-grid/data-grid-search.tsx","../src/data-grid/data-grid.tsx","../src/data-grid/data-grid-cell-wrapper.tsx","../src/data-grid/cell-variants/checkbox-cell.tsx","../src/data-grid/cell-variants/date-cell.tsx","../src/data-grid/cell-variants/gantt-cell.tsx","../src/textarea/textarea.tsx","../src/data-grid/cell-variants/long-text-cell.tsx","../src/data-grid/cell-variants/multi-select-cell.tsx","../src/data-grid/cell-variants/number-cell.tsx","../src/data-grid/cell-variants/react-node-cell.tsx","../src/data-grid/cell-variants/select-cell.tsx","../src/data-grid/cell-variants/short-text-cell.tsx","../src/data-grid/data-grid-cell.tsx","../src/data-grid/data-grid-view-menu.tsx","../src/data-grid/hooks/use-data-grid.tsx","../src/date-picker/date-picker.tsx","../src/drawer/drawer.tsx","../src/label/label.tsx","../src/separator/separator.tsx","../src/field/field.tsx","../src/hooks/use-is-mobile.ts","../src/input/number-input.tsx","../src/mark-value-renderer/mark-value-renderer.tsx","../src/menubar/menubar.tsx","../src/modal/modal.tsx","../src/navigation-menu/navigation-menu.tsx","../src/pagination/pagination.tsx","../src/progress/progress.tsx","../src/radio-group/radio-group.tsx","../src/resizable/resizeable.tsx","../src/scroll-area/scroll-area.tsx","../src/sheet/sheet.tsx","../src/sidebar/sidebar.tsx","../src/slicer/slicer.tsx","../src/slider/slider.tsx","../src/switch/switch.tsx","../src/tabs/tabs.tsx","../src/toggle/toggle.tsx","../src/toggle-group/toggle-group.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDownIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item ref={ref} className={cn('border-b', className)} {...props} />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center cursor-pointer justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('pb-4 pt-0', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground',\n destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div ref={ref} role=\"alert\" className={cn(alertVariants({ variant }), className)} {...props} />\n))\nAlert.displayName = 'Alert'\n\nconst AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, children, ...props }, ref) => (\n <h5 ref={ref} className={cn('mb-1 font-medium leading-none tracking-tight', className)} {...props}>\n {children}\n </h5>\n ),\n)\nAlertTitle.displayName = 'AlertTitle'\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('text-sm [&_p]:leading-relaxed', className)} {...props} />\n ),\n)\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md cursor-pointer text-base font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n outlineInvert:\n 'border border-muted-foreground bg-background shadow-xs text-muted-foreground hover:bg-muted-foreground hover:text-background dark:bg-input/30 dark:border-input dark:hover:bg-input/70 dark:hover:text-foreground/80',\n extraGhost: 'bg-none hover:text-accent-foreground text-muted-foreground hover:text-foreground',\n extraGhost2: 'bg-none text-foreground hover:text-muted-foreground',\n neutral: 'bg-background',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 px-6 has-[>svg]:px-4',\n xs: 'py-1 px-2',\n xs2: 'px-2 py-0.5',\n icon: 'size-9',\n iconSm: 'size-7.5',\n smLow: 'h-7.5 gap-1.5 px-3 has-[>svg]:px-2.5',\n max: 'h-full w-full',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport type ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n /**\n * E2E test_id to identify the button.\n */\n __e2e_test_id__?: string\n }\n\nfunction Button({ className, variant, size, asChild = false, __e2e_test_id__, ...props }: ButtonProps) {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n {...props}\n data-test-id={__e2e_test_id__}\n className={cn(buttonVariants({ variant, size, className }))}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\n\nimport * as React from 'react'\n\nimport { buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold', className)} {...props} />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)}\n {...props}\n />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","import * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image ref={ref} className={cn('aspect-square h-full w-full', className)} {...props} />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn('flex h-full w-full items-center justify-center rounded-full bg-muted', className)}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-base font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n filter: 'bg-primary text-background border-0',\n info: 'bg-yellow-500 text-foreground border-0',\n },\n size: {\n default: '',\n xs: 'h-3.5 text-sm',\n sm: 'h-4.5 text-xs',\n md: 'h-6 text-md',\n lg: 'h-8 text-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nfunction Badge({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span'\n\n return <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant, size }), className)} {...props} />\n}\n\nexport { Badge, badgeVariants }\n","import { ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<'nav'> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = 'Breadcrumb'\n\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5',\n className,\n )}\n {...props}\n />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return <Comp ref={ref} className={cn('transition-colors hover:text-foreground', className)} {...props} />\n})\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('font-normal text-foreground', className)}\n {...props}\n />\n ),\n)\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nconst BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<'li'>) => (\n <li aria-hidden=\"true\" className={cn('[&>svg]:size-3.5', className)} {...props}>\n {children ?? <ChevronRightIcon />}\n </li>\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nconst BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden=\"true\" className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsHorizontalIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = 'BreadcrumbElipssis'\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n DoubleArrowLeftIcon,\n DoubleArrowRightIcon,\n} from '@radix-ui/react-icons'\n\nimport * as React from 'react'\nimport { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker'\n\nimport { Button, buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n showYearNavigation = false,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n showYearNavigation?: boolean\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n // Track last selected field for range mode\n const [rangeSelectionStep, setRangeSelectionStep] = React.useState<'from' | 'to'>('from')\n // Custom onDayClick for range mode to make sure 'from' and 'to' are always set alternatingly\n const handleDayClick = React.useCallback(\n (day: Date, modifiers: any, e: React.MouseEvent<Element>) => {\n if (props.mode === 'range') {\n const range = props.selected as { from?: Date; to?: Date } | undefined\n\n // Always start a new range when selecting 'from'\n if (rangeSelectionStep === 'from') {\n props.onSelect?.({ from: day, to: undefined }, day, modifiers, e)\n setRangeSelectionStep('to')\n return\n }\n\n // Only set 'to' if 'from' is set and not the same day\n if (rangeSelectionStep === 'to') {\n if (range?.from && day.getTime() !== range.from.getTime()) {\n props.onSelect?.({ from: range.from, to: day }, day, modifiers, e)\n setRangeSelectionStep('from')\n }\n return\n }\n } else {\n props.onDayClick?.(day, modifiers, e)\n }\n },\n [props, rangeSelectionStep],\n )\n\n // default year range if caption layout has year dropdown: 100 years past and 100 years future unless user overrides\n // with the dropdown a range is required. if we don't set it manually it will be -100 years until now which is impractical for future events\n let fromMonth: Date | undefined\n let toMonth: Date | undefined\n if (captionLayout === 'dropdown-years' || captionLayout === 'dropdown') {\n const nowYear = new Date().getFullYear()\n fromMonth = props.startMonth ?? new Date(nowYear - 100, 0)\n toMonth = props.endMonth ?? new Date(nowYear + 100, 11)\n }\n\n // controlled month state so we can programmatically change months (and years)\n const [currentMonth, setCurrentMonth] = React.useState<Date>(props.defaultMonth ?? props.month ?? new Date())\n React.useEffect(() => {\n if (props.month) {\n setCurrentMonth(props.month)\n }\n }, [props.month])\n\n const addMonths = (date: Date, months: number) => {\n const d = new Date(date)\n d.setMonth(d.getMonth() + months)\n if (fromMonth && d < fromMonth) {\n return fromMonth\n }\n if (toMonth && d > toMonth) {\n return toMonth\n }\n return d\n }\n\n return (\n <DayPicker\n month={currentMonth}\n onMonthChange={(m) => {\n setCurrentMonth(m)\n props.onMonthChange?.(m)\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n 'bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent',\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className,\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),\n ...formatters,\n }}\n classNames={{\n root: cn('w-fit', defaultClassNames.root),\n months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),\n month: cn('flex flex-col w-full gap-4', defaultClassNames.month),\n nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_previous,\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',\n defaultClassNames.button_next,\n ),\n month_caption: cn(\n 'flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)',\n defaultClassNames.month_caption,\n ),\n dropdowns: cn(\n 'w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5',\n defaultClassNames.dropdowns,\n ),\n dropdown_root: cn(\n 'relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md',\n defaultClassNames.dropdown_root,\n ),\n dropdown: cn('absolute bg-popover inset-0 opacity-0', defaultClassNames.dropdown),\n caption_label: cn(\n 'select-none font-medium',\n captionLayout === 'label'\n ? 'text-sm'\n : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5',\n defaultClassNames.caption_label,\n ),\n table: 'w-full border-collapse',\n weekdays: cn('flex', defaultClassNames.weekdays),\n weekday: cn(\n 'text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none',\n defaultClassNames.weekday,\n ),\n week: cn('flex w-full mt-2', defaultClassNames.week),\n week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),\n week_number: cn('text-[0.8rem] select-none text-muted-foreground', defaultClassNames.week_number),\n day: cn(\n 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none',\n defaultClassNames.day,\n ),\n range_start: cn('rounded-l-md bg-accent', defaultClassNames.range_start),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_end: cn('rounded-r-md bg-accent', defaultClassNames.range_end),\n today: cn(\n 'bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none',\n defaultClassNames.today,\n ),\n outside: cn('text-muted-foreground aria-selected:text-muted-foreground', defaultClassNames.outside),\n disabled: cn('text-muted-foreground opacity-50', defaultClassNames.disabled),\n hidden: cn('invisible', defaultClassNames.hidden),\n ...classNames,\n }}\n // prefer startMonth/toMonth instead of deprecated fromYear/toYear\n startMonth={fromMonth}\n endMonth={toMonth}\n components={{\n // custom navigation: to add double-chevron year skip buttons\n // prettier-ignore\n Nav: ({ className }) => { //NOSONAR - inline component is intentional to access closure variables\n const btnClassNames = captionLayout === 'dropdown' && showYearNavigation ? 'size-6.5' : ''\n return (\n <div className={cn('mt-0.5', className)}>\n <div className=\"flex items-center\">\n {showYearNavigation && (\n <Button\n aria-label=\"previous year\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={fromMonth && currentMonth <= fromMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), -12))}\n >\n <DoubleArrowLeftIcon className=\"\" />\n </Button>\n )}\n <Button\n aria-label=\"previous month\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={fromMonth && currentMonth <= fromMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), -1))}\n >\n <ChevronLeftIcon />\n </Button>\n </div>\n\n <div className=\"flex items-center\">\n <Button\n aria-label=\"next month\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={toMonth && currentMonth >= toMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), 1))}\n >\n <ChevronRightIcon />\n </Button>\n {showYearNavigation && (\n <Button\n aria-label=\"next year\"\n variant={buttonVariant}\n size=\"iconSm\"\n disabled={toMonth && currentMonth >= toMonth}\n className={btnClassNames}\n onClick={() => setCurrentMonth((m) => addMonths(m ?? new Date(), 12))}\n >\n <DoubleArrowRightIcon />\n </Button>\n )}\n </div>\n </div>\n )\n },\n // prettier-ignore\n Root: ({ className, rootRef, ...props }) => { //NOSONAR - default shadeCn\n return <div data-slot=\"calendar\" ref={rootRef} className={cn(className)} {...props} />\n },\n // prettier-ignore\n Chevron: ({ className, orientation, ...props }) => { //NOSONAR - default shadeCn\n if (orientation === 'left') {\n return <ChevronLeftIcon className={cn('size-4', className)} {...props} />\n }\n\n if (orientation === 'right') {\n return <ChevronRightIcon className={cn('size-4', className)} {...props} />\n }\n\n return <ChevronDownIcon className={cn('size-4', className)} {...props} />\n },\n DayButton: CalendarDayButton,\n // prettier-ignore\n WeekNumber: ({ children, ...props }) => { //NOSONAR - default shadeCn\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">{children}</div>\n </td>\n )\n },\n ...components,\n }}\n onDayClick={handleDayClick}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) {\n ref.current?.focus()\n }\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n 'data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70',\n defaultClassNames.day,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('rounded-xl border bg-card text-card-foreground shadow', className)} {...props} />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, children, ...props }, ref) => (\n <h3 ref={ref} className={cn('font-semibold leading-none tracking-tight', className)} {...props}>\n {children}\n </h3>\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />,\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as HoverCardPrimitive from '@radix-ui/react-hover-card'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import { ArrowLeftIcon, ArrowRightIcon } from '@radix-ui/react-icons'\n\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: 'horizontal' | 'vertical'\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error('useCarousel must be used within a <Carousel />')\n }\n\n return context\n}\n\nconst Carousel = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & CarouselProps>(\n ({ orientation = 'horizontal', opts, setApi, plugins, className, children, ...props }, ref) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n },\n plugins,\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback(() => {\n if (!api) {\n return\n }\n\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [api])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext],\n )\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return\n }\n\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) {\n return\n }\n\n onSelect()\n api.on('reInit', onSelect)\n api.on('select', onSelect)\n\n return () => {\n api?.off('select', onSelect)\n }\n }, [api, onSelect])\n\n const memoizedValue = useMemo(\n () => ({\n carouselRef,\n api: api,\n opts,\n orientation: orientation || (opts?.axis === 'y' ? 'vertical' : 'horizontal'),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }),\n [api, canScrollNext, canScrollPrev, carouselRef, opts, orientation, scrollNext, scrollPrev],\n )\n\n return (\n <CarouselContext.Provider value={memoizedValue}>\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn('relative', className)}\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n },\n)\nCarousel.displayName = 'Carousel'\n\nconst CarouselContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn('flex', orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', className)}\n {...props}\n />\n </div>\n )\n },\n)\nCarouselContent.displayName = 'CarouselContent'\n\nconst CarouselItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { orientation } = useCarousel()\n\n return (\n <div\n ref={ref}\n aria-roledescription=\"slide\"\n className={cn('min-w-0 shrink-0 grow-0 basis-full', orientation === 'horizontal' ? 'pl-4' : 'pt-4', className)}\n {...props}\n />\n )\n },\n)\nCarouselItem.displayName = 'CarouselItem'\n\nconst CarouselPrevious = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(\n ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n 'absolute h-8 w-8 rounded-full',\n orientation === 'horizontal'\n ? '-left-12 top-1/2 -translate-y-1/2'\n : '-top-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n },\n)\nCarouselPrevious.displayName = 'CarouselPrevious'\n\nconst CarouselNext = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(\n ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n 'absolute h-8 w-8 rounded-full',\n orientation === 'horizontal'\n ? '-right-12 top-1/2 -translate-y-1/2'\n : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRightIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n },\n)\nCarouselNext.displayName = 'CarouselNext'\n\nexport { type CarouselApi, type CarouselProps, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext }\n","import { CheckIcon, Cross1Icon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { SquareIcon } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\ntype CheckboxProps = React.ComponentProps<'input'> &\n VariantProps<typeof checkboxVariants> & {\n label?: string\n /**\n * E2E test_id to identify the checkbox.\n */\n __e2e_test_id__?: string\n }\n\nconst checkboxVariants = cva(\n 'cursor-pointer peer appearance-none rounded border focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shrink-0 shadow-xs transition-shadow',\n {\n variants: {\n variant: {\n default: '',\n simple: ' border-input checked:bg-muted-foreground checked:border-muted-foreground',\n iconSolo: 'border-transparent shadow-none',\n },\n checkboxSize: {\n default: 'size-4 [&_svg]:size-3.5',\n sm: 'size-3.5 [&_svg]:size-3',\n lg: 'size-4.5 [&_svg]:size-4',\n },\n checkIcon: {\n default: 'cross',\n check: 'check',\n square: 'square',\n },\n iconStyle: {\n default: 'text-foreground',\n simple: 'text-primary-foreground',\n solo: 'text-muted-foreground shadow-none',\n },\n },\n defaultVariants: {\n variant: 'default',\n checkIcon: 'default',\n iconStyle: 'default',\n checkboxSize: 'default',\n },\n },\n)\n\nfunction Checkbox({\n label,\n className,\n variant,\n checkIcon,\n checkboxSize,\n iconStyle,\n __e2e_test_id__,\n ...props\n}: CheckboxProps) {\n const inputId = props.id ?? (label ? `${label}-checkbox` : undefined)\n\n let icon = <Cross1Icon />\n if (checkIcon === 'check') {\n icon = <CheckIcon />\n } else if (checkIcon === 'square') {\n icon = <SquareIcon fill=\"var(--muted-foreground)\" className=\"size-1/3\" />\n }\n\n return (\n <div className={cn('relative flex gap-2 items-center', className)} data-test-id={__e2e_test_id__}>\n <input {...props} type=\"checkbox\" id={inputId} className={cn(checkboxVariants({ variant, checkboxSize }))} />\n <span\n className={cn(\n checkboxVariants({ iconStyle, checkboxSize }),\n 'absolute opacity-0 peer-checked:opacity-100 top-1/2 left-0 transform -translate-y-1/2 pointer-events-none flex items-center justify-center border-transparent',\n )}\n >\n {icon}\n </span>\n <label htmlFor={inputId} className=\"cursor-pointer select-none\">\n {label}\n </label>\n </div>\n )\n}\n\nexport { Checkbox, checkboxVariants }\n","import * as CollapsePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapse = CollapsePrimitive.Root\n\nconst CollapseTrigger = CollapsePrimitive.CollapsibleTrigger\n\nconst CollapseContent = CollapsePrimitive.CollapsibleContent\n\nexport { Collapse, CollapseTrigger, CollapseContent }\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\n\nfunction Dialog(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Root>>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Trigger>>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Portal>>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose(props: Readonly<React.ComponentProps<typeof DialogPrimitive.Close>>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 dark:bg-gray-500/30',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n __e2e_test_id__?: string\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\" data-test-id={__e2e_test_id__}>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n title=\"Close\"\n data-slot=\"dialog-close\"\n className=\"flex ring-offset-background focus:ring-transparent data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-3 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 cursor-pointer\"\n >\n <Button\n asChild\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 rounded\"\n __e2e_test_id__={__e2e_test_id__ ? `${__e2e_test_id__}-close` : undefined}\n >\n <Cross2Icon />\n </Button>\n <span className=\"sr-only\">Close</span>\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('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import { type DialogProps } from '@radix-ui/react-dialog'\nimport { MagnifyingGlassIcon } from '@radix-ui/react-icons'\n\nimport { Command as CommandPalettePrimitive } from 'cmdk'\nimport * as React from 'react'\n\nimport { Dialog, DialogContent } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\n\nconst CommandPalette = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n))\nCommandPalette.displayName = CommandPalettePrimitive.displayName\n\ntype CommandPaletteDialogProps = DialogProps\n\nconst CommandPaletteDialog = ({ children, ...props }: CommandPaletteDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <CommandPalette className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </CommandPalette>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandPaletteInput = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" data-cmdk-input-wrapper=\"\">\n <MagnifyingGlassIcon className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPalettePrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n))\n\nCommandPaletteInput.displayName = CommandPalettePrimitive.Input.displayName\n\nconst CommandPaletteList = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandPaletteList.displayName = CommandPalettePrimitive.List.displayName\n\nconst CommandPaletteEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Empty>\n>((props, ref) => <CommandPalettePrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />)\n\nCommandPaletteEmpty.displayName = CommandPalettePrimitive.Empty.displayName\n\nconst CommandPaletteGroup = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\n\nCommandPaletteGroup.displayName = CommandPalettePrimitive.Group.displayName\n\nconst CommandPaletteSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Separator ref={ref} className={cn('-mx-1 h-px bg-border', className)} {...props} />\n))\nCommandPaletteSeparator.displayName = CommandPalettePrimitive.Separator.displayName\n\nconst CommandPaletteItem = React.forwardRef<\n React.ElementRef<typeof CommandPalettePrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPalettePrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPalettePrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50',\n className,\n )}\n {...props}\n />\n))\n\nCommandPaletteItem.displayName = CommandPalettePrimitive.Item.displayName\n\nconst CommandPaletteShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nCommandPaletteShortcut.displayName = 'CommandPaletteShortcut'\n\nexport {\n CommandPalette,\n CommandPaletteDialog,\n CommandPaletteInput,\n CommandPaletteList,\n CommandPaletteEmpty,\n CommandPaletteGroup,\n CommandPaletteItem,\n CommandPaletteShortcut,\n CommandPaletteSeparator,\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Popover({ ...props }: Readonly<React.ComponentProps<typeof PopoverPrimitive.Root>>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({ ...props }: Readonly<React.ComponentProps<typeof PopoverPrimitive.Trigger>>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nconst popoverVariants = cva(\n 'outline-hidden border z-50 origin-(--radix-popover-content-transform-origin) data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n {\n variants: {\n variant: {\n default: 'bg-popover text-popover-foreground w-72 rounded p-4 shadow-md',\n simple: 'bg-background text-foreground w-auto border-(--discreet-border) shadow-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nfunction PopoverContent({\n className,\n variant,\n align = 'center',\n sideOffset = 4,\n ...props\n}: Readonly<React.ComponentProps<typeof PopoverPrimitive.Content> & VariantProps<typeof popoverVariants>>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(popoverVariants({ variant }), className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import { CaretSortIcon, CheckIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport {\n CommandPalette,\n CommandPaletteEmpty,\n CommandPaletteGroup,\n CommandPaletteInput,\n CommandPaletteItem,\n CommandPaletteList,\n} from '../command-palette/command-palette'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\nconst frameworks = [\n {\n value: 'next.js',\n label: 'Next.js',\n },\n {\n value: 'sveltekit',\n label: 'SvelteKit',\n },\n {\n value: 'nuxt.js',\n label: 'Nuxt.js',\n },\n {\n value: 'remix',\n label: 'Remix',\n },\n {\n value: 'astro',\n label: 'Astro',\n },\n]\n\nexport function ComboboxDemo() {\n const [open, setOpen] = React.useState(false)\n const [value, setValue] = React.useState('')\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" aria-expanded={open} className=\"w-[200px] justify-between\">\n {value ? frameworks.find((framework) => framework.value === value)?.label : 'Select framework...'}\n <CaretSortIcon className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-0\">\n <CommandPalette>\n <CommandPaletteInput placeholder=\"Search framework...\" className=\"h-9\" />\n <CommandPaletteList>\n <CommandPaletteEmpty>No framework found.</CommandPaletteEmpty>\n <CommandPaletteGroup>\n {frameworks.map((framework) => (\n <CommandPaletteItem\n key={framework.value}\n value={framework.value}\n onSelect={(currentValue) => {\n setValue(currentValue === value ? '' : currentValue)\n setOpen(false)\n }}\n >\n {framework.label}\n <CheckIcon\n className={cn('ml-auto h-4 w-4', value === framework.value ? 'opacity-100' : 'opacity-0')}\n />\n </CommandPaletteItem>\n ))}\n </CommandPaletteGroup>\n </CommandPaletteList>\n </CommandPalette>\n </PopoverContent>\n </Popover>\n )\n}\n","import { cn } from '../lib/utils'\n\nexport function Spinner({ classNames }: Readonly<{ classNames?: string }>) {\n return (\n <div className={cn('flex justify-center items-center w-full h-full', classNames)}>\n <svg\n className=\"w-auto text-[inherit] h-full animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n )\n}\n\ntype LoaderProps = Readonly<{\n label?: string\n disabled?: boolean\n}>\n\nexport function Loader({ label, disabled }: LoaderProps) {\n if (disabled) {\n return null\n }\n\n return (\n <div className=\"flex absolute z-1 left-0 top-0 bottom-0 right-0 bg-secondary/50\">\n <div className=\"flex items-center justify-center flex-1 flex-col\">\n <Spinner classNames=\"w-[24px] h-[25px]\" />\n {label && <h3 className=\"pb-0 pt-3 font-medium text-xl mb-2 text-muted-foreground\">{label}</h3>}\n </div>\n </div>\n )\n}\n","import { MagnifyingGlassIcon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport React from 'react'\n\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\nimport { Spinner } from '../spinner/spinner'\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className={cn('overflow-hidden p-0', className)} showCloseButton={showCloseButton}>\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst commandInputVariants = cva('', {\n variants: {\n variant: { default: '', borderless: 'border-none' },\n inputSize: {\n sm: 'h-7.5 py-2',\n md: 'h-9 py-3',\n lg: 'h-12 py-4',\n },\n },\n defaultVariants: { variant: 'default', inputSize: 'md' },\n})\n\nexport type CommandInputProps = Omit<React.ComponentProps<typeof CommandPrimitive.Input>, 'size'> &\n VariantProps<typeof commandInputVariants> & {\n wrapperClassName?: string\n loading?: boolean\n }\n\nexport const CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(\n ({ className, wrapperClassName, loading, readOnly, variant, inputSize, ...props }, ref) => {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className={cn(\n 'flex items-center gap-2 border-b px-3',\n commandInputVariants({ variant, inputSize }),\n wrapperClassName,\n )}\n >\n {loading ? <Spinner classNames=\"size-4\" /> : <MagnifyingGlassIcon className=\"size-4 shrink-0 opacity-50\" />}\n <CommandPrimitive.Input\n ref={ref}\n data-slot=\"command-input\"\n className={cn(\n 'placeholder:text-muted-foreground flex w-full rounded bg-transparent text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n readOnly={loading || readOnly}\n {...props}\n />\n </div>\n )\n },\n)\nCommandInput.displayName = 'CommandInput'\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn('max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto', className)}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({ ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return <CommandPrimitive.Empty data-slot=\"command-empty\" className=\"py-6 text-center text-sm\" {...props} />\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n commandInputVariants,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import { EnterFullScreenIcon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { type PropsWithChildren, type ReactNode } from 'react'\n\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\nimport { Loader } from '../spinner/spinner'\n\nconst gridContentFrameVariants = cva('flex flex-col border-1 border-(--discreet-border) h-full w-full', {\n variants: {\n variant: {\n default: '',\n inverted: 'bg-sidebar-border border-background border-e-transparent border-t-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nconst gridContentFrameHeaderVariants = cva('flex items-center overflow-hidden p-3 min-h-10 border-b-1', {\n variants: {\n variant: {\n default: 'border-(--discreet-border)',\n inverted: 'border-t-0 border-t-sidebar-border border-b-background',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\ntype Props = PropsWithChildren<{\n title: string\n controls?: ReactNode[]\n indicators?: ReactNode[]\n onExpand?: () => void\n collapsed?: boolean\n titleLink?: ReactNode\n isLoading?: boolean\n className?: string\n}> &\n VariantProps<typeof gridContentFrameVariants>\n\nexport const ContentFrame = ({\n title = '',\n controls = [],\n indicators = [],\n children,\n onExpand,\n variant,\n collapsed,\n titleLink,\n isLoading = false,\n className,\n}: Props) => {\n return (\n <div className={cn(gridContentFrameVariants({ variant }), className)}>\n {collapsed ? (\n <div className=\"flex gap-2.5 min-w-0 items-center [writing-mode:vertical-lr]\">\n <h2 className=\"text-xl flex self-center ms-4\">{title}</h2>\n {indicators.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{indicators}</div>}\n </div>\n ) : (\n <>\n {/* header */}\n <div className={cn(gridContentFrameHeaderVariants({ variant }))}>\n {/* Title + Indicators */}\n <div className=\"flex flex-grow gap-2 overflow-hidden\">\n <h2 className=\"text-xl overflow-hidden text-ellipsis whitespace-nowrap\">{titleLink ?? title}</h2>\n {indicators.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{indicators}</div>}\n </div>\n\n {/* Controls */}\n {controls.length > 0 && <div className=\"flex gap-2 whitespace-nowrap\">{controls}</div>}\n\n {/* Expand button */}\n {onExpand && (\n <Button\n title=\"Expand\"\n onClick={onExpand}\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 ml-2\"\n __e2e_test_id__={`${title.toLowerCase().replaceAll(' ', '-')}-modal-button`}\n >\n <EnterFullScreenIcon />\n </Button>\n )}\n </div>\n\n {/* content */}\n <div className=\"h-full min-h-0 overflow-auto relative\">\n {children}\n {isLoading && <Loader label=\"Loading...\" />}\n </div>\n </>\n )}\n </div>\n )\n}\n","import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold text-foreground', inset && 'pl-8', className)}\n {...props}\n />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nContextMenuShortcut.displayName = 'ContextMenuShortcut'\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n}\n","import { cn } from '../lib/utils'\n\nfunction Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('animate-pulse rounded-md bg-primary/10', className)} {...props} />\n}\n\nexport { Skeleton }\n","import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction DropdownMenu({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Root>>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Portal>>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuTrigger({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>>) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Content>>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Group>>) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\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 [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>>) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: Readonly<\n React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: Readonly<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\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({ ...props }: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.Sub>>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: Readonly<\n React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: Readonly<React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\ntype SelectProps = React.ComponentProps<typeof SelectPrimitive.Root> & {\n /**\n * E2E test_id to identify the select.\n */\n __e2e_test_id__?: string\n}\n\nfunction Select({ __e2e_test_id__, ...rest }: SelectProps) {\n return <SelectPrimitive.Root data-test-id={__e2e_test_id__} {...rest} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nconst selectTriggerVariants = cva(\n \"data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex items-center gap-2 rounded-md border text-md shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n size: {\n default: 'h-9 px-3 py-2',\n sm: 'h-8 px-2.5 py-1.5',\n lg: 'h-10 px-4 py-2.5',\n xs: 'h-7 px-2 py-1',\n },\n variant: {\n default:\n 'justify-between 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:bg-input/30 dark:hover:bg-input/50 bg-transparent',\n simple:\n 'justify-start bg-background cursor-pointer border-foreground text-left data-[placeholder]:border-(--discreet-border)',\n },\n },\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n },\n)\nconst selectTriggerTextVariants = cva('', {\n variants: {\n variant: {\n default: '',\n simple: 'overflow-hidden whitespace-nowrap text-ellipsis',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nfunction SelectTrigger({\n className,\n size,\n variant,\n children,\n asChild = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n VariantProps<typeof selectTriggerVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : SelectPrimitive.Trigger\n\n return (\n <Comp\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(selectTriggerVariants({ size, variant, className }), '[&[data-state=open]>svg]:rotate-180')}\n {...props}\n >\n <span className={cn('flex-1', selectTriggerTextVariants({ variant }))}>{children}</span>\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"flex-none size-4 opacity-50 \" />\n </SelectPrimitive.Icon>\n </Comp>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md',\n className,\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n {...props}\n />\n )\n}\n\nconst selectItemVariants = cva(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded pr-8 pl-2 text-md outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n {\n variants: {\n type: {\n default: '',\n deselect: 'italic text-muted-foreground focus:text-muted-foreground',\n },\n spacing: {\n sm: 'py-1',\n md: 'py-1.5',\n lg: 'py-2.5',\n },\n },\n defaultVariants: {\n type: 'default',\n spacing: 'md',\n },\n },\n)\n\nfunction SelectItem({\n className,\n children,\n type,\n spacing,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item> & VariantProps<typeof selectItemVariants>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(selectItemVariants({ type, spacing, className }))}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4 \" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border pointer-events-none -mx-1 my-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\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('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","/* Modified DateRangePicker based DateRangePicker by John Polacek (https://github.com/johnpolacek/date-range-picker-for-shadcn) (MIT License) */\n\nimport { CalendarIcon, CrossIcon } from 'lucide-react'\nimport React, { useEffect, useState } from 'react'\n\nimport { Button } from '../../../button/button'\nimport { Calendar } from '../../../calendar/calendar'\nimport { cn } from '../../../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../select/select'\n\nexport type GanttTimerangePickerProps = {\n initialDateFrom?: Date\n initialDateTo?: Date\n // onRangeChange now receives ISO string date range (UTC-normalized) or undefined\n onRangeChange?: (values: ISODateRange | undefined) => void\n timelineStart?: Date\n timelineEnd?: Date\n}\n\ntype DateRange = {\n from?: Date\n to?: Date\n}\n\n// ISODateRange with ISO string dates for UTC-normalized range for querying\nexport type ISODateRange = {\n from?: string\n to?: string\n}\n\n// reusable helper: convert an ISO UTC-normalized date string back to a local Date\nexport const isoToLocalDate = (iso?: string): Date | undefined => {\n if (!iso) {\n return undefined\n }\n const d = new Date(iso) // parse ISO instant\n // build a local Date that has the same calendar day as the UTC date parts\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())\n}\n\n// helper to convert internal Date range to ISO strings normalized to UTC start/end of day\nconst convertRangeToISO = (r?: { from?: Date; to?: Date } | undefined): ISODateRange | undefined => {\n if (!(r?.from && r?.to)) {\n return undefined\n }\n const from = r.from\n const to = r.to\n\n const fromIso = new Date(\n Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), 0, 0, 0, 0),\n ).toISOString()\n const toIso = new Date(\n Date.UTC(to.getUTCFullYear(), to.getUTCMonth(), to.getUTCDate(), 23, 59, 59, 999),\n ).toISOString()\n\n return { from: fromIso, to: toIso }\n}\n\ntype Preset = {\n name: string\n label: string\n}\n\nconst PRESETS: Preset[] = [\n { name: 'sinceStart', label: 'Since timeline start' },\n { name: 'thisYear', label: 'This year' },\n { name: 'nextFullYear', label: 'Next full year' },\n { name: 'next1Year', label: 'Next 1 year' },\n { name: 'next2Year', label: 'Next 2 years' },\n { name: 'next3Year', label: 'Next 3 years' },\n { name: 'untilEnd', label: 'Until timeline end' },\n]\n\nexport const GanttTimerangePicker = ({\n initialDateFrom,\n initialDateTo,\n onRangeChange,\n timelineStart,\n timelineEnd,\n}: GanttTimerangePickerProps) => {\n const [range, setRange] = useState<DateRange | undefined>(\n initialDateFrom || initialDateTo ? { from: initialDateFrom, to: initialDateTo } : undefined,\n )\n const [isOpen, setIsOpen] = useState(false)\n const [selectedPreset, setSelectedPreset] = useState<string | undefined>(undefined)\n const [isSmallScreen, setIsSmallScreen] = useState(\n globalThis.innerWidth === undefined ? false : globalThis.innerWidth < 960,\n )\n\n // listen to window resize events to enable a small screen mode\n useEffect(() => {\n const handleResize = (): void => {\n setIsSmallScreen(globalThis.innerWidth < 960)\n }\n globalThis.addEventListener('resize', handleResize)\n // Clean up event listener on unmount\n return () => {\n globalThis.removeEventListener('resize', handleResize)\n }\n }, [])\n\n const getPresetRange = (presetName: string, timelineStart?: Date, timelineEnd?: Date): DateRange => {\n const preset = PRESETS.find(({ name }) => name === presetName)\n if (!preset) {\n throw new Error(`Unknown date range preset: ${presetName}`)\n }\n const from = new Date()\n const to = new Date()\n\n switch (preset.name) {\n case 'sinceStart':\n if (timelineStart) {\n from.setFullYear(timelineStart.getFullYear(), timelineStart.getMonth(), timelineStart.getDate())\n }\n from.setHours(0, 0, 0, 0)\n to.setHours(23, 59, 59, 999)\n break\n case 'thisYear':\n from.setFullYear(from.getFullYear(), 0, 1)\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear(), 11, 31)\n to.setHours(23, 59, 59, 999)\n break\n case 'nextFullYear':\n from.setFullYear(from.getFullYear() + 1, 0, 1)\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 1, 11, 31)\n to.setHours(23, 59, 59, 999)\n break\n case 'next1Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 1)\n to.setHours(23, 59, 59, 999)\n break\n case 'next2Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 2)\n to.setHours(23, 59, 59, 999)\n break\n case 'next3Year':\n from.setHours(0, 0, 0, 0)\n to.setFullYear(to.getFullYear() + 3)\n to.setHours(23, 59, 59, 999)\n break\n case 'untilEnd':\n from.setHours(0, 0, 0, 0)\n if (timelineEnd) {\n to.setFullYear(timelineEnd.getFullYear(), timelineEnd.getMonth(), timelineEnd.getDate())\n }\n to.setHours(23, 59, 59, 999)\n break\n }\n\n return { from, to }\n }\n\n // automatically detect selected preset when range changes (internal Date range)\n useEffect(() => {\n if (!range?.from || !range.to) {\n setSelectedPreset(undefined)\n return\n }\n for (const preset of PRESETS) {\n const presetRange = getPresetRange(preset.name, timelineStart, timelineEnd)\n if (!presetRange.from || !presetRange.to) {\n continue\n }\n\n const normalizedRangeFrom = new Date(range.from)\n normalizedRangeFrom.setHours(0, 0, 0, 0)\n const normalizedPresetFrom = new Date(presetRange.from)\n normalizedPresetFrom.setHours(0, 0, 0, 0)\n\n const normalizedRangeTo = new Date(range.to)\n normalizedRangeTo.setHours(0, 0, 0, 0)\n const normalizedPresetTo = new Date(presetRange.to)\n normalizedPresetTo.setHours(0, 0, 0, 0)\n\n if (\n normalizedRangeFrom.getTime() === normalizedPresetFrom.getTime() &&\n normalizedRangeTo.getTime() === normalizedPresetTo.getTime()\n ) {\n setSelectedPreset(preset.name)\n return\n }\n }\n setSelectedPreset(undefined)\n }, [range, timelineStart, timelineEnd])\n\n return (\n <Popover\n modal={true}\n open={isOpen}\n onOpenChange={(isOpen) => {\n setIsOpen(isOpen)\n // on close, emit ISO-normalized range\n if (!isOpen) {\n onRangeChange?.(convertRangeToISO(range))\n }\n }}\n >\n <PopoverTrigger asChild>\n <Button size=\"iconSm\" variant=\"extraGhost2\">\n <CalendarIcon className=\"size-3\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-auto p-2 m-2 relative\">\n <div className=\"flex justify-between items-center\">\n <span className=\"pl-2\">\n {range?.from && range?.to\n ? `${range.from.toLocaleDateString()} - ${range.to.toLocaleDateString()} selected`\n : 'No range selected'}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"size-6 rounded\"\n onClick={() => {\n setIsOpen(false)\n }}\n >\n <CrossIcon className=\"size-5\" />\n </Button>\n </div>\n <div className=\"flex\">\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n {isSmallScreen && (\n <Select\n defaultValue={selectedPreset}\n onValueChange={(value) => {\n setRange(getPresetRange(value))\n }}\n >\n <SelectTrigger size=\"xs\" className=\"w-[180px] mx-auto mt-2\">\n <SelectValue placeholder=\"Select...\" />\n </SelectTrigger>\n <SelectContent>\n {PRESETS.map((preset) => (\n <SelectItem key={preset.name} value={preset.name}>\n {preset.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <div className={cn('h-[325px]', isSmallScreen && 'mb-8')}>\n <Calendar\n mode=\"range\"\n showYearNavigation={true}\n disabled={(date) =>\n (timelineStart ? date < timelineStart : false) || (timelineEnd ? date > timelineEnd : false)\n }\n onSelect={(value: { from?: Date; to?: Date } | undefined) => {\n if (value?.from != null) {\n const from = value.from\n const to = value.to ?? value.from\n // Normalize the range so that from <= to\n setRange(to < from ? { from: to, to: from } : { from, to })\n }\n }}\n selected={range?.from && range?.to ? { from: range.from, to: range.to } : undefined}\n numberOfMonths={isSmallScreen ? 1 : 2}\n defaultMonth={new Date(new Date().setMonth(new Date().getMonth() - (isSmallScreen ? 0 : 1)))}\n />\n </div>\n </div>\n </div>\n {!isSmallScreen && (\n <div className=\"flex flex-col items-start gap-1 pr-2 pl-12 py-3\">\n {PRESETS.map((preset) => (\n <PresetButton\n key={preset.name}\n preset={preset.name}\n label={preset.label}\n isSelected={selectedPreset === preset.name}\n onSelect={(presetName) => setRange(getPresetRange(presetName))}\n />\n ))}\n </div>\n )}\n </div>\n <div className=\"flex gap-2 absolute bottom-3 right-3\">\n <Button\n variant=\"outlineInvert\"\n size=\"smLow\"\n className=\"\"\n onClick={() => {\n setRange(undefined)\n }}\n >\n Clear Range\n </Button>\n <Button\n size=\"smLow\"\n onClick={() => {\n setIsOpen(false)\n onRangeChange?.(convertRangeToISO(range))\n }}\n >\n Apply\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nconst PresetButton = ({\n preset,\n label,\n isSelected,\n onSelect,\n}: {\n preset: string\n label: string\n isSelected: boolean\n onSelect: (preset: string) => void\n}): React.ReactNode => (\n <Button\n className={`w-full justify-start ${isSelected ? 'pointer-events-none bg-accent' : ''}`}\n variant=\"ghost\"\n size=\"smLow\"\n onClick={() => onSelect(preset)}\n >\n {label}\n </Button>\n)\n","import { useRef } from 'react'\n\nimport { GanttTimerangePicker } from './gantt-timerange-picker'\n\n// Gantt header component rendering the timeline scale\nexport const GanttTimeline = ({ header }: { header: any }) => {\n const cellOpts = header.column.columnDef.meta?.cell\n const containerRef = useRef<HTMLDivElement>(null)\n if (!cellOpts) {\n return null\n }\n const ts = cellOpts.dateRangeFrom ?? cellOpts.timelineStart\n const te = cellOpts.dateRangeTo ?? cellOpts.timelineEnd\n if (!(ts instanceof Date) || !(te instanceof Date)) {\n return null\n }\n const timelineStartMs = ts.getTime()\n const timelineEndMs = te.getTime()\n if (timelineEndMs <= timelineStartMs) {\n return null\n }\n const firstFullYear = ts.getFullYear() + 1\n const totalYears = te.getFullYear() - ts.getFullYear() + 1\n\n const scale = containerRef.current?.getBoundingClientRect().width\n ? containerRef.current.getBoundingClientRect().width / (totalYears ?? 1)\n : 1\n const showMonths = scale / 12 >= 5\n\n const timelineDurationMs = timelineEndMs - timelineStartMs\n const firstYearPartialMs = new Date(firstFullYear, 0, 1).getTime() - timelineStartMs\n const lastYearPartialMs = timelineEndMs - new Date(te.getFullYear(), 0, 1).getTime()\n\n const firstMonthPartialMs = new Date(ts.getFullYear(), ts.getMonth() + 1, 1).getTime() - timelineStartMs\n const lastMonthPartialMs = timelineEndMs - new Date(te.getFullYear(), te.getMonth(), 1).getTime()\n\n return (\n <>\n <div className=\"absolute right-8 top-1/2 z-10 -translate-y-1/2\">\n <GanttTimerangePicker\n initialDateFrom={cellOpts.dateRangeFrom ?? undefined}\n initialDateTo={cellOpts.dateRangeTo ?? undefined}\n onRangeChange={cellOpts.onRangeChange ?? undefined}\n timelineStart={cellOpts.timelineStart}\n timelineEnd={cellOpts.timelineEnd}\n />\n </div>\n <div ref={containerRef} className=\"pointer-events-none absolute left-0 right-0 bottom-0 z-0 h-3 flex px-1\">\n {Array.from({ length: totalYears }, (_, i) => firstFullYear + i - 1).map((year, index) => (\n /* distribute space between years with flex-grow except for first and last as they might only be partial */\n <div\n key={year}\n className=\"h-full relative flex grow border-l border-muted-foreground/30 first:border-none first:grow-0 last:grow-0 overflow-hidden\"\n style={\n // index == 0: first year, index == totalYears -1: last year\n index == 0 || index == totalYears - 1\n ? { width: `${((index == 0 ? firstYearPartialMs : lastYearPartialMs) / timelineDurationMs) * 100}%` }\n : undefined\n }\n >\n {showMonths && (\n /* first month with calculated width as it might only be partial */\n <div className=\"absolute bottom-0 left-0 right-0 flex h-1.5 w-full\">\n {index == 0 && ts.getMonth() < 11 && (\n <div\n className=\"h-full border-r border-dashed border-muted-foreground/30\"\n style={{ width: `${(firstMonthPartialMs / firstYearPartialMs) * 100}%` }}\n />\n )}\n {/* distribute rest of space between months with flex-grow */}\n {Array.from({\n length: (index == totalYears - 1 ? te.getMonth() : 12) - (index == 0 ? ts.getMonth() + 1 : 0),\n }).map((_, monthIndex) => (\n <div\n key={`${year}-${monthIndex}`}\n className=\"grow h-full border-r border-dashed border-muted-foreground/30 last:border-0\"\n />\n ))}\n {/* last month with calculated width as it might only be partial */}\n {index == totalYears - 1 && te.getMonth() > 0 && (\n <div className=\"h-full\" style={{ width: `${(lastMonthPartialMs / lastYearPartialMs) * 100}%` }} />\n )}\n </div>\n )}\n\n <span className=\"ps-0.5 -mt-px text-xs text-muted-foreground select-none z-1\">{year}</span>\n </div>\n ))}\n </div>\n </>\n )\n}\n","import type { ColumnSort, Header, SortDirection, SortingState, Table } from '@tanstack/react-table'\n\nimport {\n BaselineIcon,\n CalendarIcon,\n CheckSquareIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n EyeOffIcon,\n HashIcon,\n ListChecksIcon,\n ListIcon,\n PinIcon,\n PinOffIcon,\n TextInitialIcon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu/dropdown-menu'\nimport { cn } from '../lib/utils'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip/tooltip'\n\nimport { GanttTimeline } from './cell-variants/utils/gantt-timeline'\nimport type { Cell, ColumnMenuRendererFunction } from './data-grid-types'\n\nfunction getColumnVariant(variant?: Cell['variant']): {\n icon: React.ComponentType<React.SVGProps<SVGSVGElement>>\n label: string\n} | null {\n switch (variant) {\n case 'short-text':\n return { icon: BaselineIcon, label: 'Short text' }\n case 'long-text':\n return { icon: TextInitialIcon, label: 'Long text' }\n case 'number':\n return { icon: HashIcon, label: 'Number' }\n case 'select':\n return { icon: ListIcon, label: 'Select' }\n case 'multi-select':\n return { icon: ListChecksIcon, label: 'Multi-select' }\n case 'checkbox':\n return { icon: CheckSquareIcon, label: 'Checkbox' }\n case 'date':\n return { icon: CalendarIcon, label: 'Date' }\n default:\n return null\n }\n}\n\ntype DataGridColumnHeaderProps<TData, TValue> = {\n header: Header<TData, TValue>\n table: Table<TData>\n} & React.ComponentProps<typeof DropdownMenuTrigger>\n\nexport function DataGridColumnHeader<TData, TValue>({\n header,\n table,\n className,\n onPointerDown,\n ...props\n}: DataGridColumnHeaderProps<TData, TValue>) {\n const [open, setOpen] = React.useState(false)\n\n const column = header.column\n const label = column.columnDef.meta?.label\n ? column.columnDef.meta.label\n : typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id\n\n const isAnyColumnResizing = table.getState().columnSizingInfo.isResizingColumn\n\n const cellVariant = column.columnDef.meta?.cell\n const columnVariant = getColumnVariant(cellVariant?.variant)\n\n const pinnedPosition = column.getIsPinned()\n const isPinnedLeft = pinnedPosition === 'left'\n const isPinnedRight = pinnedPosition === 'right'\n\n const onSortingChange = React.useCallback(\n (direction: SortDirection) => {\n table.setSorting((prev: SortingState) => {\n const existingSortIndex = prev.findIndex((sort) => sort.id === column.id)\n const newSort: ColumnSort = {\n id: column.id,\n desc: direction === 'desc',\n }\n\n if (existingSortIndex >= 0) {\n const updated = [...prev]\n updated[existingSortIndex] = newSort\n return updated\n } else {\n return [...prev, newSort]\n }\n })\n },\n [column.id, table],\n )\n\n const onSortRemove = React.useCallback(() => {\n table.setSorting((prev: SortingState) => prev.filter((sort) => sort.id !== column.id))\n }, [column.id, table])\n\n const onLeftPin = React.useCallback(() => {\n column.pin('left')\n }, [column])\n\n const onRightPin = React.useCallback(() => {\n column.pin('right')\n }, [column])\n\n const onUnpin = React.useCallback(() => {\n column.pin(false)\n }, [column])\n\n const onTriggerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n onPointerDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (event.button !== 0) {\n return\n }\n table.options.meta?.onColumnClick?.(column.id)\n },\n [table.options.meta, column.id, onPointerDown],\n )\n\n return (\n <>\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger\n className={cn(\n 'flex size-full items-center justify-between gap-2 p-2 text-sm bg-sidebar-accent/80 font-bold hover:bg-secondary/40 data-[state=open]:bg-secondary/40 [&_svg]:size-4',\n isAnyColumnResizing && 'pointer-events-none',\n className,\n )}\n onPointerDown={onTriggerPointerDown}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {columnVariant && (\n <TooltipProvider>\n <Tooltip delayDuration={100}>\n <TooltipTrigger asChild>\n <columnVariant.icon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>{columnVariant.label}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <span className=\"truncate\">{label}</span>\n </div>\n <ChevronDownIcon className=\"shrink-0 text-muted-foreground\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={0} className=\"w-60\">\n {column.getCanSort() && (\n <>\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={column.getIsSorted() === 'asc'}\n onClick={() => onSortingChange('asc')}\n >\n <ChevronUpIcon />\n Sort asc\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={column.getIsSorted() === 'desc'}\n onClick={() => onSortingChange('desc')}\n >\n <ChevronDownIcon />\n Sort desc\n </DropdownMenuCheckboxItem>\n {column.getIsSorted() && (\n <DropdownMenuItem onClick={onSortRemove}>\n <XIcon />\n Remove sort\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanPin() && (\n <>\n {column.getCanSort() && <DropdownMenuSeparator />}\n\n {isPinnedLeft ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onUnpin}>\n <PinOffIcon />\n Unpin from left\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onLeftPin}>\n <PinIcon />\n Pin to left\n </DropdownMenuItem>\n )}\n {isPinnedRight ? (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onUnpin}>\n <PinOffIcon />\n Unpin from right\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem className=\"[&_svg]:text-muted-foreground\" onClick={onRightPin}>\n <PinIcon />\n Pin to right\n </DropdownMenuItem>\n )}\n </>\n )}\n {column.getCanHide() && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuCheckboxItem\n className=\"relative pr-8 pl-2 [&>span:first-child]:right-2 [&>span:first-child]:left-auto [&_svg]:text-muted-foreground\"\n checked={!column.getIsVisible()}\n onClick={() => column.toggleVisibility(false)}\n >\n <EyeOffIcon />\n Hide column\n </DropdownMenuCheckboxItem>\n </>\n )}\n\n {/* Render header menu footer (custom optional component) */}\n {column.columnDef.meta?.headerMenuFooter && (\n <>\n <DropdownMenuSeparator />\n <div className=\"dropdown-footer\">\n {isMenuRendererFunction(column.columnDef.meta.headerMenuFooter)\n ? column.columnDef.meta.headerMenuFooter({ column, open, onOpenChange: setOpen })\n : column.columnDef.meta.headerMenuFooter}\n </div>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {/* Render any variant-provided header component from HeaderComponents. */}\n {(() => {\n const variant = column.columnDef.meta?.cell?.variant\n const variantHeader = variant ? HeaderComponents[variant] : undefined\n if (variantHeader) {\n return variantHeader({ header, table })\n }\n\n return null\n })()}\n\n {/* Render custom column header component (optional columnDef.meta) */}\n {column.columnDef.meta?.headerCustomComponent && (\n <>\n {isMenuRendererFunction(column.columnDef.meta.headerCustomComponent)\n ? column.columnDef.meta.headerCustomComponent({ column })\n : column.columnDef.meta.headerCustomComponent}\n </>\n )}\n\n {header.column.getCanResize() && <DataGridColumnResizer header={header} table={table} label={label} />}\n </>\n )\n}\n\nconst DataGridColumnResizer = React.memo(DataGridColumnResizerImpl, (prev, next) => {\n const prevColumn = prev.header.column\n const nextColumn = next.header.column\n\n if (prevColumn.getIsResizing() !== nextColumn.getIsResizing() || prevColumn.getSize() !== nextColumn.getSize()) {\n return false\n }\n\n if (prev.label !== next.label) {\n return false\n }\n\n return true\n}) as typeof DataGridColumnResizerImpl\n\ntype DataGridColumnResizerProps<TData, TValue> = {\n label: string\n} & DataGridColumnHeaderProps<TData, TValue>\n\nfunction DataGridColumnResizerImpl<TData, TValue>({ header, table, label }: DataGridColumnResizerProps<TData, TValue>) {\n const defaultColumnDef = table._getDefaultColumnDef()\n\n const onDoubleClick = React.useCallback(() => {\n header.column.resetSize()\n }, [header.column])\n\n return (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${label} column`}\n aria-valuenow={header.column.getSize()}\n aria-valuemin={defaultColumnDef.minSize}\n aria-valuemax={defaultColumnDef.maxSize}\n tabIndex={0}\n className={cn(\n 'right-0 absolute top-0 z-50 h-full w-0 touch-none select-none cursor-ew-resize focus:outline-none',\n // visible thin line (use right positioning and a stable 1px width)\n \"before:content-[''] before:absolute before:inset-y-0 before:right-0 before:translate-x-1/2 before:w-px before:h-full before:bg-accent-foreground/70 before:opacity-0 before:transition-opacity before:duration-150\",\n // large invisible hit area\n \"after:content-[''] after:absolute after:inset-y-0 after:right-0 after:translate-x-1/2 after:w-[18px] after:h-full after:bg-transparent\",\n header.column.getIsResizing() ? 'before:opacity-100 before:bg-accent-foreground' : 'hover:before:opacity-100',\n )}\n style={{ willChange: 'transform, opacity', transform: 'translateZ(0)' }}\n onDoubleClick={onDoubleClick}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )\n}\n\nfunction isMenuRendererFunction<TData, TValue>(\n value: React.ReactNode | ColumnMenuRendererFunction<TData, TValue>,\n): value is ColumnMenuRendererFunction<TData, TValue> {\n return typeof value === 'function'\n}\n\n/**\n * Optional header components keyed by cell variant. Components receive { header, table } and\n * should return a React node (or null). This allows the column header to render variant-specific\n * header visuals without coupling the header implementation to variants.\n */\nexport const HeaderComponents: Record<string, (props: any) => React.ReactNode | null> = {\n gantt: (props) => <GanttTimeline {...props} />,\n}\n","import type { Column } from '@tanstack/react-table'\n\nimport type { CellPosition, RowHeightValue } from './data-grid-types'\n\nexport function getCellKey(rowIndex: number, columnId: string) {\n return `${rowIndex}:${columnId}`\n}\n\nexport function parseCellKey(cellKey: string): Required<CellPosition> {\n const parts = cellKey.split(':')\n const rowIndexStr = parts[0]\n const columnId = parts[1]\n if (rowIndexStr && columnId) {\n const rowIndex = parseInt(rowIndexStr, 10)\n if (!Number.isNaN(rowIndex)) {\n return { rowIndex, columnId }\n }\n }\n return { rowIndex: 0, columnId: '' }\n}\n\nexport function getRowHeightValue(rowHeight: RowHeightValue): number {\n // TODO: Make lineHeight configurable / use css variable: --data-grid-line-height\n const lineHeight = 16\n\n return lineHeight * getLineCount(rowHeight) + 12\n}\n\nexport function getLineCount(rowHeight: RowHeightValue): number {\n const lineCountMap: Record<RowHeightValue, number> = {\n short: 1,\n medium: 2,\n tall: 3,\n 'extra-tall': 4,\n }\n\n return lineCountMap[rowHeight]\n}\n\nexport function getCommonPinningStyles<TData>({\n column,\n withBorder = false,\n}: {\n column: Column<TData>\n withBorder?: boolean\n}): React.CSSProperties {\n const isPinned = column.getIsPinned()\n const isLastLeftPinnedColumn = isPinned === 'left' && column.getIsLastColumn('left')\n const isFirstRightPinnedColumn = isPinned === 'right' && column.getIsFirstColumn('right')\n\n return {\n boxShadow: withBorder\n ? isLastLeftPinnedColumn\n ? '-4px 0 4px var(--border) inset'\n : isFirstRightPinnedColumn\n ? '4px 0 -4px var(--border) inset'\n : undefined\n : undefined,\n left: isPinned === 'left' ? `${column.getStart('left')}px` : undefined,\n right: isPinned === 'right' ? `${column.getAfter('right')}px` : undefined,\n opacity: isPinned ? 0.97 : 1,\n position: isPinned ? 'sticky' : 'relative',\n background: isPinned ? 'var(--background)' : 'var(--background)',\n width: column.getSize(),\n zIndex: isPinned ? 1 : undefined,\n }\n}\n","import type { Table, TableMeta } from '@tanstack/react-table'\n\nimport { CopyIcon, EraserIcon, TrashIcon } from 'lucide-react'\nimport * as React from 'react'\nimport { toast } from 'sonner'\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu/dropdown-menu'\n\nimport type { UpdateCell } from './data-grid-types'\nimport { parseCellKey } from './data-grid-utils'\n\ntype DataGridContextMenuProps<TData> = {\n table: Table<TData>\n}\n\nexport function DataGridContextMenu<TData>({ table }: DataGridContextMenuProps<TData>) {\n const meta = table.options.meta\n const contextMenu = meta?.contextMenu\n const onContextMenuOpenChange = meta?.onContextMenuOpenChange\n const selectionState = meta?.selectionState\n const dataGridRef = meta?.dataGridRef\n const onDataUpdate = meta?.onDataUpdate\n const onRowsDelete = meta?.onRowsDelete\n\n if (!contextMenu) {\n return null\n }\n\n return (\n <ContextMenu\n table={table}\n dataGridRef={dataGridRef}\n contextMenu={contextMenu}\n onContextMenuOpenChange={onContextMenuOpenChange}\n selectionState={selectionState}\n onDataUpdate={onDataUpdate}\n onRowsDelete={onRowsDelete}\n />\n )\n}\n\ntype ContextMenuProps<TData> = {\n table: Table<TData>\n} & Pick<\n TableMeta<TData>,\n 'dataGridRef' | 'onContextMenuOpenChange' | 'selectionState' | 'onDataUpdate' | 'onRowsDelete'\n> &\n Required<Pick<TableMeta<TData>, 'contextMenu'>>\n\nconst ContextMenu = React.memo(ContextMenuImpl, (prev, next) => {\n if (prev.contextMenu.open !== next.contextMenu.open) {\n return false\n }\n if (!next.contextMenu.open) {\n return true\n }\n if (prev.contextMenu.x !== next.contextMenu.x) {\n return false\n }\n if (prev.contextMenu.y !== next.contextMenu.y) {\n return false\n }\n\n const prevSize = prev.selectionState?.selectedCells?.size ?? 0\n const nextSize = next.selectionState?.selectedCells?.size ?? 0\n if (prevSize !== nextSize) {\n return false\n }\n\n return true\n}) as typeof ContextMenuImpl\n\nfunction ContextMenuImpl<TData>({\n table,\n dataGridRef,\n contextMenu,\n onContextMenuOpenChange,\n selectionState,\n onDataUpdate,\n onRowsDelete,\n}: ContextMenuProps<TData>) {\n const triggerStyle = React.useMemo<React.CSSProperties>(\n () => ({\n position: 'fixed',\n left: `${contextMenu.x}px`,\n top: `${contextMenu.y}px`,\n width: '1px',\n height: '1px',\n padding: 0,\n margin: 0,\n border: 'none',\n background: 'transparent',\n pointerEvents: 'none',\n opacity: 0,\n }),\n [contextMenu.x, contextMenu.y],\n )\n\n const onCloseAutoFocus: NonNullable<React.ComponentProps<typeof DropdownMenuContent>['onCloseAutoFocus']> =\n React.useCallback(\n (event) => {\n event.preventDefault()\n dataGridRef?.current?.focus()\n },\n [dataGridRef],\n )\n\n const onCopy = React.useCallback(async () => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n const rows = table.getRowModel().rows\n const columnIds: string[] = []\n\n const selectedCellsArray = Array.from(selectionState.selectedCells)\n for (const cellKey of selectedCellsArray) {\n const { columnId } = parseCellKey(cellKey)\n if (columnId && !columnIds.includes(columnId)) {\n columnIds.push(columnId)\n }\n }\n\n const cellData = new Map<string, string>()\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n const row = rows[rowIndex]\n if (row) {\n const cell = row.getVisibleCells().find((c) => c.column.id === columnId)\n if (cell) {\n const value = cell.getValue()\n cellData.set(cellKey, String(value ?? ''))\n }\n }\n }\n\n const rowIndices = new Set<number>()\n const colIndices = new Set<number>()\n\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n rowIndices.add(rowIndex)\n const colIndex = columnIds.indexOf(columnId)\n if (colIndex >= 0) {\n colIndices.add(colIndex)\n }\n }\n\n const sortedRowIndices = Array.from(rowIndices).sort((a, b) => a - b)\n const sortedColIndices = Array.from(colIndices).sort((a, b) => a - b)\n const sortedColumnIds = sortedColIndices.map((i) => columnIds[i])\n\n const tsvData = sortedRowIndices\n .map((rowIndex) =>\n sortedColumnIds\n .map((columnId) => {\n const cellKey = `${rowIndex}:${columnId}`\n return cellData.get(cellKey) ?? ''\n })\n .join('\\t'),\n )\n .join('\\n')\n\n await navigator.clipboard.writeText(tsvData)\n toast.success(\n `${selectionState.selectedCells.size} cell${selectionState.selectedCells.size !== 1 ? 's' : ''} copied`,\n )\n }, [table, selectionState])\n\n // Determine whether the selected cells are all editable. If any selected cell belongs to a non-editable column (meta.editable === false), disable the Clear action.\n const canClear = React.useMemo(() => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return false\n }\n\n const visibleCols = table.getVisibleLeafColumns()\n const rows = table.getRowModel().rows\n\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n if (!columnId) {\n continue\n }\n const col = visibleCols.find((c) => c.id === columnId)\n const editable = col?.columnDef?.meta?.editable\n\n if (editable === false) {\n return false\n }\n\n if (typeof editable === 'function') {\n const row = rows[rowIndex]\n if (row && !editable(row.original)) {\n return false\n }\n }\n }\n\n return true\n }, [selectionState, table])\n\n const onClear = React.useCallback(() => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n if (!canClear) {\n return\n }\n\n const updates: UpdateCell[] = []\n\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n updates.push({ rowIndex, columnId, value: '' })\n }\n\n onDataUpdate?.(updates)\n\n toast.success(`${updates.length} cell${updates.length !== 1 ? 's' : ''} cleared`)\n }, [onDataUpdate, selectionState, canClear])\n\n const onDelete = React.useCallback(async () => {\n if (!selectionState?.selectedCells || selectionState.selectedCells.size === 0) {\n return\n }\n\n const rowIndices = new Set<number>()\n for (const cellKey of selectionState.selectedCells) {\n const { rowIndex } = parseCellKey(cellKey)\n rowIndices.add(rowIndex)\n }\n\n const rowIndicesArray = Array.from(rowIndices).sort((a, b) => a - b)\n const rowCount = rowIndicesArray.length\n\n await onRowsDelete?.(rowIndicesArray)\n\n toast.success(`${rowCount} row${rowCount !== 1 ? 's' : ''} deleted`)\n }, [onRowsDelete, selectionState])\n\n return (\n <DropdownMenu open={contextMenu.open} onOpenChange={onContextMenuOpenChange}>\n <DropdownMenuTrigger style={triggerStyle} />\n <DropdownMenuContent data-grid-popover=\"\" align=\"start\" className=\"w-48\" onCloseAutoFocus={onCloseAutoFocus}>\n <DropdownMenuItem onSelect={onCopy}>\n <CopyIcon />\n Copy\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={onClear} disabled={!canClear}>\n <EraserIcon />\n Clear\n </DropdownMenuItem>\n {onRowsDelete && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem variant=\"destructive\" onSelect={onDelete}>\n <TrashIcon />\n Delete rows\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import * as React from 'react'\n\ntype PossibleRef<T> = React.Ref<T> | undefined\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === 'function') {\n return ref(value)\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node)\n if (!hasCleanup && typeof cleanup === 'function') {\n hasCleanup = true\n }\n return cleanup\n })\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i]\n if (typeof cleanup === 'function') {\n cleanup()\n } else {\n setRef(refs[i], null)\n }\n }\n }\n }\n return undefined\n }\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return React.useCallback(composeRefs(...refs), refs)\n}\n\nexport { composeRefs, useComposedRefs }\n","import { flexRender, type Row } from '@tanstack/react-table'\nimport type { Virtualizer } from '@tanstack/react-virtual'\n\nimport * as React from 'react'\n\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nimport type { CellPosition, RowHeightValue } from './data-grid-types'\nimport { getCommonPinningStyles, getLineCount } from './data-grid-utils'\n\ntype DataGridRowProps<TData> = {\n row: Row<TData>\n rowVirtualizer: Virtualizer<HTMLDivElement, Element>\n virtualRowIndex: number\n virtualStart: number\n rowMapRef: React.RefObject<Map<number, HTMLDivElement>>\n rowHeight: RowHeightValue\n focusedCell: CellPosition | null\n editingCell: CellPosition | null\n selectionSize: number\n visibleColumnIds: string\n /** Whether this row is highlighted (e.g., via keyField-based URL routing) */\n isHighlighted?: boolean\n /** Called when the row is clicked (for row-level navigation) */\n onRowClick?: (rowIndex: number) => void\n} & React.ComponentProps<'div'>\n\nexport const DataGridRow = React.memo(DataGridRowImpl, (prev, next) => {\n // Always re-render if row identity or data changed\n if (prev.row.id !== next.row.id) {\n return false\n }\n if (prev.row.original !== next.row.original) {\n return false\n }\n\n // Check focus changes - only re-render if THIS row's focus state changed\n const prevRowIndex = prev.virtualRowIndex\n const nextRowIndex = next.virtualRowIndex\n\n const prevHasFocus = prev.focusedCell?.rowIndex === prevRowIndex\n const nextHasFocus = next.focusedCell?.rowIndex === nextRowIndex\n\n if (prevHasFocus !== nextHasFocus) {\n return false\n }\n\n // If this row has focus, check if the focused column changed\n if (nextHasFocus && prevHasFocus) {\n if (prev.focusedCell?.columnId !== next.focusedCell?.columnId) {\n return false\n }\n }\n\n // Check editing changes - only re-render if THIS row's editing state changed\n const prevHasEditing = prev.editingCell?.rowIndex === prevRowIndex\n const nextHasEditing = next.editingCell?.rowIndex === nextRowIndex\n\n if (prevHasEditing !== nextHasEditing) {\n return false\n }\n\n // If this row has editing, check if the editing column changed\n if (nextHasEditing && prevHasEditing) {\n if (prev.editingCell?.columnId !== next.editingCell?.columnId) {\n return false\n }\n }\n\n // Check if selection state changed - re-render all rows when selection changes\n // This is a simpler approach than tracking per-row selection\n if (prev.selectionSize !== next.selectionSize) {\n return false\n }\n\n // Re-render if column visibility changed\n if (prev.visibleColumnIds !== next.visibleColumnIds) {\n return false\n }\n\n // Re-render if highlighted state changed\n if (prev.isHighlighted !== next.isHighlighted) {\n return false\n }\n\n // All relevant checks passed - skip re-render\n return true\n}) as typeof DataGridRowImpl\n\nfunction DataGridRowImpl<TData>({\n row,\n virtualRowIndex,\n virtualStart,\n rowVirtualizer,\n rowMapRef,\n rowHeight,\n focusedCell,\n // These props are used only in React.memo's arePropsEqual comparator above,\n // not in the render function. Prefixed with _ to indicate intentional non-use.\n editingCell: _editingCell,\n selectionSize: _selectionSize,\n visibleColumnIds: _visibleColumnIds,\n isHighlighted = false,\n onRowClick,\n ref,\n className,\n ...props\n}: DataGridRowProps<TData>) {\n const rowRef = useComposedRefs(ref, (node) => {\n if (node && typeof virtualRowIndex !== 'undefined') {\n rowVirtualizer.measureElement(node)\n rowMapRef.current.set(virtualRowIndex, node)\n }\n })\n\n const isRowSelected = row.getIsSelected()\n\n const handleRowClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n // Don't trigger row click if clicking on interactive elements like checkbox\n const target = event.target as HTMLElement\n if (target.closest('input, button, [role=\"checkbox\"]')) {\n return\n }\n // Only navigate on single clicks (detail === 1)\n // Double clicks (detail === 2) should enter edit mode instead, handled by cell's onDoubleClick\n if (event.detail === 1) {\n onRowClick?.(virtualRowIndex)\n }\n },\n [onRowClick, virtualRowIndex],\n )\n\n // Initial transform is set via style prop; subsequent updates happen via\n // direct DOM manipulation in useDataGrid's onChange callback\n return (\n <div\n key={row.id}\n role=\"row\"\n aria-rowindex={virtualRowIndex + 2}\n aria-selected={isRowSelected}\n data-index={virtualRowIndex}\n data-slot=\"grid-row\"\n data-highlighted={isHighlighted || undefined}\n ref={rowRef}\n tabIndex={-1}\n className={cn(\n 'absolute flex w-full border-b h-[calc(var(--data-grid-line-height)*(var(--line-count))+12px)]',\n onRowClick && !isHighlighted && 'cursor-pointer hover:bg-accent/30',\n isHighlighted && 'cursor-pointer bg-primary/10 border-t border-primary/40',\n className,\n )}\n style={\n {\n '--line-count': `${getLineCount(rowHeight)}`,\n transform: `translateY(${virtualStart}px)`,\n } as React.CSSProperties\n }\n onClick={onRowClick ? handleRowClick : undefined}\n {...props}\n >\n {row.getVisibleCells().map((cell, colIndex) => {\n const isCellFocused = focusedCell?.rowIndex === virtualRowIndex && focusedCell?.columnId === cell.column.id\n\n return (\n <div\n key={cell.id}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n data-highlighted={isCellFocused ? '' : undefined}\n data-slot=\"grid-cell\"\n tabIndex={-1}\n className={cn({\n 'border-r': cell.column.id !== 'select',\n })}\n style={{\n ...getCommonPinningStyles({ column: cell.column }),\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(callback: T | undefined): T {\n const callbackRef = React.useRef(callback)\n\n React.useEffect(() => {\n callbackRef.current = callback\n })\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, [])\n}\n\nexport { useCallbackRef }\n","import * as React from 'react'\n\nimport { useCallbackRef } from './use-callback-ref'\n\nexport function useDebouncedCallback<T extends (...args: never[]) => unknown>(callback: T, delay: number) {\n const handleCallback = useCallbackRef(callback)\n const debounceTimerRef = React.useRef(0)\n React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), [])\n\n const setValue = React.useCallback(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current)\n debounceTimerRef.current = window.setTimeout(() => handleCallback(...args), delay)\n },\n [handleCallback, delay],\n )\n\n return setValue\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Input variants for styling the input element.\n * NOTE: When modifying variants, also update numberInputWrapperVariants in number-input.tsx\n */\nconst inputVariants = cva(\n 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n {\n variants: {\n variant: {\n default: 'min-h-9 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n simple: 'min-h-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\ntype InputProps = React.ComponentProps<'input'> &\n VariantProps<typeof inputVariants> & {\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n /**\n * Callback when Enter key is pressed\n */\n onEnter?: () => void\n /**\n * Additional classes for the wrapper container (only used if wrapper is rendered)\n */\n wrapperClassName?: string\n }\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant, __e2e_test_id__, onEnter, wrapperClassName, ...props }, ref) => {\n const input = (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ variant, className }))}\n data-test-id={__e2e_test_id__}\n onKeyDown={(e) => {\n props.onKeyDown?.(e)\n if (e.key === 'Enter') {\n onEnter?.()\n }\n }}\n ref={ref}\n {...props}\n />\n )\n\n // If wrapperClassName is provided, wrap the input\n if (wrapperClassName) {\n return <div className={wrapperClassName}>{input}</div>\n }\n\n return input\n },\n)\n\nInput.displayName = 'Input'\n\nexport { Input, inputVariants }\nexport type { InputProps }\n","import { ChevronDownIcon, ChevronUpIcon, CrossIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { useDebouncedCallback } from '../hooks/use-debounced-callback'\nimport { Input } from '../input/input'\n\nimport type { SearchState } from './data-grid-types'\n\ntype DataGridSearchProps = {} & SearchState\n\nexport const DataGridSearch = React.memo(DataGridSearchImpl, (prev, next) => {\n if (prev.searchOpen !== next.searchOpen) {\n return false\n }\n\n if (!next.searchOpen) {\n return true\n }\n\n if (prev.searchQuery !== next.searchQuery || prev.matchIndex !== next.matchIndex) {\n return false\n }\n\n if (prev.searchMatches.length !== next.searchMatches.length) {\n return false\n }\n\n for (let i = 0; i < prev.searchMatches.length; i++) {\n const prevMatch = prev.searchMatches[i]\n const nextMatch = next.searchMatches[i]\n\n if (!prevMatch || !nextMatch) {\n return false\n }\n\n if (prevMatch.rowIndex !== nextMatch.rowIndex || prevMatch.columnId !== nextMatch.columnId) {\n return false\n }\n }\n\n return true\n})\n\nfunction DataGridSearchImpl({\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n}: DataGridSearchProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (searchOpen) {\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n })\n }\n }, [searchOpen])\n\n React.useEffect(() => {\n if (!searchOpen) {\n return\n }\n\n function onEscape(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault()\n onSearchOpenChange(false)\n }\n }\n\n document.addEventListener('keydown', onEscape)\n return () => document.removeEventListener('keydown', onEscape)\n }, [searchOpen, onSearchOpenChange])\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n event.stopPropagation()\n\n if (event.key === 'Enter') {\n event.preventDefault()\n if (event.shiftKey) {\n onNavigateToPrevMatch()\n } else {\n onNavigateToNextMatch()\n }\n }\n },\n [onNavigateToNextMatch, onNavigateToPrevMatch],\n )\n\n const debouncedSearch = useDebouncedCallback((query: string) => {\n onSearch(query)\n }, 150)\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value\n onSearchQueryChange(value)\n debouncedSearch(value)\n },\n [onSearchQueryChange, debouncedSearch],\n )\n\n const onTriggerPointerDown = React.useCallback((event: React.PointerEvent<HTMLButtonElement>) => {\n // prevent implicit pointer capture\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n return\n }\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId)\n }\n\n // Only prevent default if we're not clicking on the input\n // This allows text selection in the input while still preventing focus stealing elsewhere\n if (\n event.button === 0 &&\n event.ctrlKey === false &&\n event.pointerType === 'mouse' &&\n !(event.target instanceof HTMLInputElement)\n ) {\n event.preventDefault()\n }\n }, [])\n\n const onPrevMatchPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => onTriggerPointerDown(event),\n [onTriggerPointerDown],\n )\n\n const onNextMatchPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => onTriggerPointerDown(event),\n [onTriggerPointerDown],\n )\n\n const onClose = React.useCallback(() => {\n onSearchOpenChange(false)\n }, [onSearchOpenChange])\n\n if (!searchOpen) {\n return null\n }\n\n return (\n <div\n role=\"search\"\n data-slot=\"grid-search\"\n className=\"fade-in-0 slide-in-from-top-2 absolute top-4 right-4 z-50 flex animate-in flex-col gap-2 rounded-lg border border-border bg-background p-2 shadow-lg\"\n >\n <div className=\"flex items-center gap-2\">\n <Input\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n placeholder=\"Find in table...\"\n className=\"h-8 w-64\"\n ref={inputRef}\n value={searchQuery}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n <div className=\"flex items-center gap-1\">\n <Button\n aria-label=\"Previous match\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onNavigateToPrevMatch}\n onPointerDown={onPrevMatchPointerDown}\n disabled={searchMatches.length === 0}\n >\n <ChevronUpIcon />\n </Button>\n <Button\n aria-label=\"Next match\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n onClick={onNavigateToNextMatch}\n onPointerDown={onNextMatchPointerDown}\n disabled={searchMatches.length === 0}\n >\n <ChevronDownIcon />\n </Button>\n <Button aria-label=\"Close search\" variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={onClose}>\n <CrossIcon />\n </Button>\n </div>\n </div>\n <div className=\"flex items-center gap-1 whitespace-nowrap text-muted-foreground\">\n {searchMatches.length > 0 ? (\n <span>\n {matchIndex + 1} of {searchMatches.length}\n </span>\n ) : searchQuery ? (\n <span>No results</span>\n ) : (\n <span>Type to search</span>\n )}\n </div>\n </div>\n )\n}\n","import { flexRender } from '@tanstack/react-table'\n\nimport { PlusIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { Skeleton } from '../skeleton/skeleton'\n\nimport type { useDataGrid } from './hooks/use-data-grid'\nimport { DataGridColumnHeader } from './data-grid-column-header'\nimport { DataGridContextMenu } from './data-grid-context-menu'\nimport { DataGridRow } from './data-grid-row'\nimport { DataGridSearch } from './data-grid-search'\nimport { getCommonPinningStyles } from './data-grid-utils'\n\ntype DataGridProps<TData> = {\n height?: number\n} & ReturnType<typeof useDataGrid<TData>> &\n React.ComponentProps<'div'>\n\nexport function DataGrid<TData>({\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n table,\n rowVirtualizer,\n height,\n searchState,\n columnSizeVars,\n onRowAdd,\n className,\n ...props\n}: DataGridProps<TData>) {\n const rows = table.getRowModel().rows\n const columns = table.getAllColumns()\n\n const meta = table.options.meta\n const rowHeight = meta?.rowHeight ?? 'short'\n const focusedCell = meta?.focusedCell ?? null\n const editingCell = meta?.editingCell ?? null\n const selectionSize = meta?.selectionState?.selectedCells?.size ?? 0\n const highlightedRowIndex = meta?.highlightedRowIndex ?? -1\n const onRowClick = meta?.onRowClick\n // Create a key that changes when column visibility changes\n const visibleColumnIds = table\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .join(',')\n\n // Clear row map when visibility changes to avoid stale DOM references.\n // This must happen during render (before child rows set their refs), not in an effect.\n const prevVisibleColumnIdsRef = React.useRef(visibleColumnIds)\n if (prevVisibleColumnIdsRef.current !== visibleColumnIds) {\n rowMapRef.current.clear()\n prevVisibleColumnIdsRef.current = visibleColumnIds\n }\n\n const onGridContextMenu = React.useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault()\n }, [])\n\n const onAddRowKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!onRowAdd) {\n return\n }\n\n if (event.key === 'Enter' || event.key === '') {\n event.preventDefault()\n await onRowAdd()\n }\n },\n [onRowAdd],\n )\n\n // calculate header/footer heights using simple measurements (no observers)\n // previous fallbacks were header ~58 and footer ~13\n const headerHeight = headerRef?.current?.clientHeight ?? 58\n const footerHeight = onRowAdd ? (footerRef?.current?.clientHeight ?? 12) + 1 : 0\n\n // if the grid has a horizontal scrollbar, measure its height so it doesn't overlap content\n let scrollbarHeight = 0\n if (dataGridRef?.current) {\n const el = dataGridRef.current\n if (el.scrollWidth > el.clientWidth) {\n // offsetHeight - clientHeight approximates the scrollbar thickness (includes borders)\n scrollbarHeight = Math.max(0, el.offsetHeight - el.clientHeight)\n }\n }\n\n return (\n <div data-slot=\"grid-wrapper\" className={cn('relative flex w-full flex-col', className)} {...props}>\n {searchState && <DataGridSearch {...searchState} />}\n <DataGridContextMenu table={table} />\n <div\n role=\"grid\"\n aria-label=\"Data grid\"\n aria-rowcount={rows.length + (onRowAdd ? 1 : 0)}\n aria-colcount={columns.length}\n data-slot=\"grid\"\n tabIndex={0}\n ref={dataGridRef}\n className=\"relative grid select-none overflow-auto rounded-md border border-border focus:outline-none\"\n style={{\n ...columnSizeVars,\n // dynamically include measured header/footer heights (falling back to previous magic numbers)\n // include horizontal scrollbar height when present, and add a small buffer of 3px\n height: `${Math.min(\n rowVirtualizer.getTotalSize() + headerHeight + footerHeight + scrollbarHeight + 3,\n height ?? Infinity,\n )}px`,\n }}\n onContextMenu={onGridContextMenu}\n >\n <div\n role=\"rowgroup\"\n data-slot=\"grid-header\"\n ref={headerRef}\n className=\"sticky top-0 z-10 grid border-b bg-background\"\n >\n {table.getHeaderGroups().map((headerGroup, rowIndex) => (\n <div\n key={headerGroup.id}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n data-slot=\"grid-header-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n {headerGroup.headers.map((header, colIndex) => {\n const sorting = table.getState().sorting\n const currentSort = sorting.find((sort) => sort.id === header.column.id)\n const isSortable = header.column.getCanSort()\n\n return (\n <div\n key={header.id}\n role=\"columnheader\"\n aria-colindex={colIndex + 1}\n aria-sort={\n currentSort?.desc === false\n ? 'ascending'\n : currentSort?.desc === true\n ? 'descending'\n : isSortable\n ? 'none'\n : undefined\n }\n data-slot=\"grid-header-cell\"\n tabIndex={-1}\n className={cn('relative', {\n 'border-r': header.column.id !== 'select',\n })}\n style={{\n ...getCommonPinningStyles({ column: header.column }),\n width: `calc(var(--header-${header.id}-size) * 1px)`,\n }}\n >\n {header.isPlaceholder ? null : typeof header.column.columnDef.header === 'function' ? (\n <div className=\"size-full px-3 py-1.5 bg-sidebar-accent/80 hover:bg-secondary/40\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </div>\n ) : (\n <DataGridColumnHeader header={header} table={table} />\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n <div\n role=\"rowgroup\"\n data-slot=\"grid-body\"\n className=\"relative grid\"\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const row = rows[virtualItem.index]\n\n // Render skeleton row for unloaded data\n if (!row) {\n return (\n <div\n key={`skeleton-${virtualItem.index}`}\n className=\"absolute flex items-center w-full border-b\"\n style={{\n height: virtualItem.size,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {table.getVisibleLeafColumns().map((col) => (\n <div key={col.id} className=\"px-3\" style={{ width: `calc(var(--col-${col.id}-size) * 1px)` }}>\n <Skeleton className=\"h-4 w-full\" />\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <DataGridRow\n key={row.id}\n row={row}\n rowMapRef={rowMapRef}\n virtualRowIndex={virtualItem.index}\n virtualStart={virtualItem.start}\n rowVirtualizer={rowVirtualizer}\n rowHeight={rowHeight}\n focusedCell={focusedCell}\n editingCell={editingCell}\n selectionSize={selectionSize}\n visibleColumnIds={visibleColumnIds}\n isHighlighted={highlightedRowIndex === virtualItem.index}\n onRowClick={onRowClick}\n />\n )\n })}\n </div>\n {onRowAdd && (\n <div\n role=\"rowgroup\"\n data-slot=\"grid-footer\"\n ref={footerRef}\n className=\"sticky bottom-0 z-10 grid border-t bg-background\"\n >\n <div\n role=\"row\"\n aria-rowindex={rows.length + 2}\n data-slot=\"grid-add-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n <div\n role=\"gridcell\"\n tabIndex={0}\n className=\"relative flex h-9 grow items-center bg-secondary/30 transition-colors hover:bg-secondary/50 focus:bg-secondary/50 focus:outline-none\"\n style={{\n width: table.getTotalSize(),\n minWidth: table.getTotalSize(),\n }}\n onClick={onRowAdd}\n onKeyDown={onAddRowKeyDown}\n >\n <div className=\"sticky left-0 flex items-center gap-2 px-3 text-muted-foreground\">\n <PlusIcon className=\"size-3.5\" />\n <span className=\"text-sm\">Add row</span>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\ntype DataGridCellWrapperProps<TData, TValue> = {\n cell: Cell<TData, TValue>\n table: Table<TData>\n rowIndex: number\n columnId: string\n isEditing: boolean\n isFocused: boolean\n isSelected: boolean\n} & React.ComponentProps<'div'>\n\nexport function DataGridCellWrapper<TData, TValue>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n className,\n onClick: onClickProp,\n onKeyDown: onKeyDownProp,\n children,\n ...props\n}: DataGridCellWrapperProps<TData, TValue>) {\n const meta = table.options.meta\n\n const rowOriginal = (cell?.row?.original ?? {}) as any\n const colCellMeta = cell?.column?.columnDef?.meta as any\n const align: 'left' | 'right' | 'center' = colCellMeta?.align ?? 'left'\n\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colCellMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colCellMeta?.editable])\n const isEditable = editableResolver(rowOriginal)\n\n // Normalize className to a resolver function and memoize to avoid typeof checks per cell\n const classNameResolver = React.useMemo(() => {\n const v = colCellMeta?.className\n return typeof v === 'function' ? (v as (row: any) => string | undefined) : () => v as string | undefined\n }, [colCellMeta?.className])\n const colCellClassName = classNameResolver(rowOriginal)\n\n const isSearchMatch = meta?.getIsSearchMatch?.(rowIndex, columnId) ?? false\n const isActiveSearchMatch = meta?.getIsActiveSearchMatch?.(rowIndex, columnId) ?? false\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isEditing) {\n event.preventDefault()\n onClickProp?.(event)\n // Single click should only focus the cell, not enter edit mode\n // Edit mode is triggered by double-click, F2, or Enter key\n meta?.onCellClick?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing, onClickProp],\n )\n\n const onContextMenu = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellContextMenu?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellMouseDown?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseEnter = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n meta?.onCellMouseEnter?.(rowIndex, columnId, event)\n }\n },\n [meta, rowIndex, columnId, isEditing],\n )\n\n const onMouseUp = React.useCallback(() => {\n if (!isEditing) {\n meta?.onCellMouseUp?.()\n }\n }, [meta, isEditing])\n\n const onDoubleClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditing) {\n event.preventDefault()\n if (isEditable) {\n meta?.onCellDoubleClick?.(rowIndex, columnId)\n }\n }\n },\n [meta, rowIndex, columnId, isEditing, isEditable],\n )\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDownProp?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n if (\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'Home' ||\n event.key === 'End' ||\n event.key === 'PageUp' ||\n event.key === 'PageDown' ||\n event.key === 'Enter' ||\n event.key === 'Tab'\n ) {\n return\n }\n\n if (isFocused && !isEditing) {\n if (event.key === 'F2') {\n event.preventDefault()\n event.stopPropagation()\n if (isEditable) {\n meta?.onCellEditingStart?.(rowIndex, columnId)\n }\n return\n }\n\n if (event.key === '') {\n event.preventDefault()\n event.stopPropagation()\n meta?.onCellEditingStart?.(rowIndex, columnId)\n return\n }\n\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n event.preventDefault()\n event.stopPropagation()\n if (isEditable) {\n meta?.onCellEditingStart?.(rowIndex, columnId)\n }\n }\n }\n },\n [onKeyDownProp, isFocused, isEditing, meta, rowIndex, columnId, isEditable],\n )\n\n const rowHeight = meta?.rowHeight ?? 'short'\n\n // Render cell overlay if defined\n const cellOverlay = colCellMeta?.cellOverlay\n const overlayContent = cellOverlay ? cellOverlay(rowOriginal, cell.getValue(), rowIndex, columnId) : null\n\n return (\n <div\n role=\"button\"\n data-slot=\"grid-cell-wrapper\"\n data-editing={isEditing ? '' : undefined}\n data-focused={isFocused ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n tabIndex={isFocused && !isEditing ? 0 : -1}\n className={cn(\n 'size-full px-2 py-1.5 text-sm outline-none -has-data-[slot=checkbox]:pt-2.5', // why has-data-[slot=checkbox] ?\n {\n 'text-left': align === 'left',\n 'text-right': align === 'right',\n 'text-center': align === 'center',\n },\n {\n 'ring-1 ring-foreground ring-inset dark:ring-secondary-foreground': isFocused,\n 'bg-yellow-100 dark:bg-yellow-900/30': isSearchMatch && !isActiveSearchMatch,\n 'bg-orange-200 dark:bg-orange-900/50': isActiveSearchMatch,\n 'bg-accent-foreground/10': isSelected && !isEditing,\n 'cursor-default': !isEditing,\n '**:data-[slot=grid-cell-content]:line-clamp-1': !isEditing && rowHeight === 'short',\n '**:data-[slot=grid-cell-content]:line-clamp-2': !isEditing && rowHeight === 'medium',\n '**:data-[slot=grid-cell-content]:line-clamp-3': !isEditing && rowHeight === 'tall',\n '**:data-[slot=grid-cell-content]:line-clamp-4': !isEditing && rowHeight === 'extra-tall',\n 'relative overflow-visible': !!overlayContent, // Enable relative positioning and overflow when overlay is present\n },\n colCellClassName,\n className,\n )}\n onClick={onClick}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseUp={onMouseUp}\n onKeyDown={onKeyDown}\n {...props}\n >\n {children}\n {overlayContent}\n </div>\n )\n}\n","import * as React from 'react'\n\nimport { Checkbox } from '../../checkbox/checkbox'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function CheckboxCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, boolean>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(Boolean(initialValue))\n const containerRef = React.useRef<HTMLDivElement>(null)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n\n const onCheckedChange = React.useCallback(\n (checked: boolean) => {\n setValue(checked)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: checked })\n },\n [meta, rowIndex, columnId],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isEditable) {\n return\n }\n if (isFocused && (event.key === '' || event.key === 'Enter')) {\n event.preventDefault()\n event.stopPropagation()\n onCheckedChange(!value)\n }\n },\n [isFocused, value, onCheckedChange, isEditable],\n )\n\n React.useEffect(() => {\n setValue(Boolean(initialValue))\n }, [initialValue])\n\n React.useEffect(() => {\n if (isFocused && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, meta?.searchOpen, meta?.isScrolling])\n\n const onWrapperClick = React.useCallback(\n (event: React.MouseEvent) => {\n if (!isEditable) {\n return\n }\n if (isFocused) {\n event.preventDefault()\n event.stopPropagation()\n onCheckedChange(!value)\n }\n },\n [isFocused, value, onCheckedChange, isEditable],\n )\n\n const onCheckboxClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {\n event.stopPropagation()\n }, [])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={false}\n isFocused={isFocused}\n isSelected={isSelected}\n onClick={onWrapperClick}\n onKeyDown={onWrapperKeyDown}\n className=\"flex size-full justify-center\"\n >\n <Checkbox\n variant=\"simple\"\n iconStyle=\"simple\"\n checkIcon=\"check\"\n checked={value}\n onChange={(event) => onCheckedChange(event.target.checked)}\n onClick={onCheckboxClick}\n onMouseDown={onCheckboxMouseDown}\n onDoubleClick={onCheckboxDoubleClick}\n className=\"border-secondary-foreground\"\n />\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { Calendar } from '../../calendar/calendar'\nimport { cn } from '../../lib/utils'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\n/**\n * Parse a date value (Date object or ISO string YYYY-MM-DD) as a local date, not UTC.\n * new Date('2025-12-01') interprets as UTC, causing timezone shifts.\n */\nfunction parseToLocalDate(value: string | Date | null | undefined): Date | undefined {\n if (!value) {\n return undefined\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value !== 'string') {\n return undefined\n }\n\n // Parse ISO date string in local timezone by explicitly setting year, month, day\n const regex = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n const match = regex.exec(value)\n if (!match) {\n return undefined\n }\n\n const year = Number.parseInt(match[1]!, 10)\n const month = Number.parseInt(match[2]!, 10) - 1 // months are 0-indexed\n const day = Number.parseInt(match[3]!, 10)\n\n return new Date(year, month, day)\n}\n\nfunction formatDateToISOString(date: Date): string {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nexport function DateCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue() as string | Date | null | undefined\n const [value, setValue] = React.useState<Date | undefined>(parseToLocalDate(initialValue))\n const [open, setOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already stopped editing to prevent double onCellEditingStop\n const hasStoppedRef = React.useRef(false)\n const meta = table.options.meta\n\n const prevInitialValueRef = React.useRef(initialValue)\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue\n setValue(parseToLocalDate(initialValue))\n }\n\n // Reset stopped flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasStoppedRef.current = false\n }\n }, [isEditing])\n\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date) {\n return\n }\n\n setValue(date)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: formatDateToISOString(date) })\n hasStoppedRef.current = true\n setOpen(false)\n meta?.onCellEditingStop?.()\n },\n [meta, rowIndex, columnId],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen && isEditing && !hasStoppedRef.current) {\n hasStoppedRef.current = true\n meta?.onCellEditingStop?.()\n }\n },\n [isEditing, meta],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n hasStoppedRef.current = true\n setValue(parseToLocalDate(initialValue))\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasStoppedRef.current = true\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, initialValue, meta],\n )\n\n React.useEffect(() => {\n setOpen(isEditing)\n }, [isEditing])\n\n React.useEffect(() => {\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <span\n data-slot=\"grid-cell-content\"\n className={cn('tabular-nums', (cell.column.columnDef.meta as any)?.align ?? 'text-right')}\n >\n {value?.toLocaleDateString() ?? ''}\n </span>\n </PopoverAnchor>\n {isEditing && (\n <PopoverContent data-grid-cell-editor=\"\" align=\"start\" sideOffset={10} className=\"w-auto p-0\">\n <Calendar\n showYearNavigation={true}\n autoFocus\n captionLayout=\"dropdown\"\n mode=\"single\"\n className=\"rounded-md border border-border shadow-sm\"\n defaultMonth={value}\n selected={value}\n onSelect={onDateSelect}\n />\n </PopoverContent>\n )}\n </Popover>\n </DataGridCellWrapper>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../../lib/utils'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nexport type GanttCellProps<TData> = {\n cell: Cell<TData, { start: Date; end: Date; barClassName?: string } | null>\n table: Table<TData>\n rowIndex: number\n columnId: string\n isEditing: boolean\n isFocused: boolean\n isSelected: boolean\n}\n\nexport function GanttCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<GanttCellProps<TData>>) {\n const initialValue = cell.getValue() as { start: Date; end: Date; barClassName?: string } | null\n const containerRef = React.useRef<HTMLDivElement>(null)\n const cellOpts = (cell.column.columnDef.meta as any)?.cell\n\n const ts = cellOpts?.dateRangeFrom ?? cellOpts?.timelineStart\n const te = cellOpts?.dateRangeTo ?? cellOpts?.timelineEnd\n\n const timelineStartMs = ts instanceof Date ? ts.getTime() : undefined\n const timelineEndMs = te instanceof Date ? te.getTime() : undefined\n\n if (!timelineStartMs || !timelineEndMs) {\n return null\n }\n\n const timelineDurationMs = timelineEndMs - timelineStartMs\n const hasValidDates = initialValue && initialValue.start instanceof Date && initialValue.end instanceof Date\n\n const msUntilStart = hasValidDates ? initialValue.start.getTime() - timelineStartMs : 0\n // end - start time considering timeline bounds\n const barWidthMs = hasValidDates\n ? Math.min(initialValue.end.getTime(), timelineEndMs) - Math.max(initialValue.start.getTime(), timelineStartMs)\n : 0\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n className=\"px-1\"\n >\n <div className=\"size-full flex overflow-hidden\">\n {hasValidDates && (\n <>\n <div\n className=\"shrink-0\"\n style={{\n width: `${Math.max(0, (msUntilStart / timelineDurationMs) * 100)}%`,\n }}\n />\n <div\n className={cn('shrink-0 h-full rounded-sm bg-primary', initialValue.barClassName)}\n style={{\n width: `${(barWidthMs / timelineDurationMs) * 100}%`,\n }}\n />\n </>\n )}\n </div>\n </DataGridCellWrapper>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst textareaVariants = cva(\n 'border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n simple: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\ntype TextareaProps = React.ComponentProps<'textarea'> &\n VariantProps<typeof textareaVariants> & {\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n }\n\nfunction Textarea({ className, variant, __e2e_test_id__, ...props }: TextareaProps) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(textareaVariants({ variant, className }))}\n {...props}\n data-test-id={__e2e_test_id__}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from 'react'\n\nimport { useDebouncedCallback } from '../../hooks/use-debounced-callback'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { Textarea } from '../../textarea/textarea'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function LongTextCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue ?? '')\n const [open, setOpen] = React.useState(false)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already submitted to prevent double-submit on blur after Ctrl+Enter\n const hasSubmittedRef = React.useRef(false)\n const meta = table.options.meta\n const sideOffset = -(containerRef.current?.clientHeight ?? 0)\n\n const prevInitialValueRef = React.useRef(initialValue)\n if (initialValue !== prevInitialValueRef.current) {\n prevInitialValueRef.current = initialValue\n setValue(initialValue ?? '')\n }\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n // Debounced auto-save (300ms delay)\n const debouncedSave = useDebouncedCallback((newValue: string) => {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n }, 300)\n\n const onSave = React.useCallback(() => {\n // Skip if we've already submitted\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Immediately save any pending changes and close the popover\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, value, initialValue, rowIndex, columnId])\n\n const onCancel = React.useCallback(() => {\n // Skip if we've already submitted\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Restore the original value\n setValue(initialValue ?? '')\n meta?.onDataUpdate?.({ rowIndex, columnId, value: initialValue })\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, initialValue, rowIndex, columnId])\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value\n setValue(newValue)\n // Debounced auto-save\n debouncedSave(newValue)\n },\n [debouncedSave],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen && !hasSubmittedRef.current) {\n hasSubmittedRef.current = true\n // Immediately save any pending changes when closing\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n meta?.onCellEditingStop?.()\n }\n },\n [meta, value, initialValue, rowIndex, columnId],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n if (textareaRef.current) {\n textareaRef.current.focus()\n const length = textareaRef.current.value.length\n textareaRef.current.setSelectionRange(length, length)\n }\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing && !open) {\n if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasSubmittedRef.current = true\n // Save any pending changes\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, open, meta, value, initialValue, rowIndex, columnId],\n )\n\n const onTextareaKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onCancel()\n } else if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault()\n onSave()\n }\n // Stop propagation to prevent grid navigation\n event.stopPropagation()\n },\n [onCancel, onSave],\n )\n\n const onTextareaBlur = React.useCallback(() => {\n // Skip if we've already submitted via Ctrl+Enter/Escape\n if (hasSubmittedRef.current) {\n return\n }\n hasSubmittedRef.current = true\n // Immediately save any pending changes on blur\n if (value !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value })\n }\n setOpen(false)\n meta?.onCellEditingStop?.()\n }, [meta, value, initialValue, rowIndex, columnId])\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n <span data-slot=\"grid-cell-content\">{value}</span>\n </DataGridCellWrapper>\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={sideOffset}\n className=\"w-[400px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={onChange}\n onKeyDown={onTextareaKeyDown}\n onBlur={onTextareaBlur}\n className=\"min-h-[150px] resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n placeholder=\"Enter text...\"\n />\n </PopoverContent>\n </Popover>\n )\n}\n","import { CheckIcon, CrossIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Badge } from '../../badge/badge'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../command/command'\nimport { cn } from '../../lib/utils'\nimport { Popover, PopoverAnchor, PopoverContent } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellSelectOption } from '../data-grid-types'\nimport { getLineCount } from '../data-grid-utils'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function MultiSelectCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string[]>>) {\n const cellValue = React.useMemo(() => cell.getValue() ?? [], [cell])\n\n const cellId = `${rowIndex}-${columnId}`\n const prevCellIdRef = React.useRef(cellId)\n\n const [selectedValues, setSelectedValues] = React.useState<string[]>(cellValue)\n const [open, setOpen] = React.useState(false)\n const [searchValue, setSearchValue] = React.useState('')\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const meta = table.options.meta\n const cellOpts = cell.column.columnDef.meta?.cell\n const sideOffset = -(containerRef.current?.clientHeight ?? 0)\n\n // Support both array options (enums/static) and Map options (relations)\n const arrayOptions = cellOpts?.variant === 'multi-select' ? cellOpts.options : undefined\n const optionsMap = cellOpts?.variant === 'multi-select' ? cellOpts.optionsMap : undefined\n\n // For array options, create a lookup Map once (memoized)\n const arrayOptionsLabelMap = React.useMemo(\n () => (arrayOptions ? new Map(arrayOptions.map((opt) => [opt.value, opt.label])) : null),\n [arrayOptions],\n )\n\n // O(1) label lookup - works for both array and Map options\n const getLabel = React.useCallback(\n (val: string): string => {\n // Map-based options: direct O(1) lookup\n if (optionsMap) {\n return optionsMap.get(val) ?? val\n }\n // Array-based options: use pre-built lookup Map\n if (arrayOptionsLabelMap) {\n return arrayOptionsLabelMap.get(val) ?? val\n }\n return val\n },\n [optionsMap, arrayOptionsLabelMap],\n )\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n const options: CellSelectOption[] = React.useMemo(() => {\n if (!isEditing) {\n return []\n }\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label }))\n }\n return []\n }, [isEditing, arrayOptions, optionsMap])\n\n if (prevCellIdRef.current !== cellId) {\n prevCellIdRef.current = cellId\n setSelectedValues(cellValue)\n setOpen(false)\n setSearchValue('')\n }\n\n const onValueChange = React.useCallback(\n (value: string) => {\n const newValues = selectedValues.includes(value)\n ? selectedValues.filter((v) => v !== value)\n : [...selectedValues, value]\n\n setSelectedValues(newValues)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValues })\n // Clear search input and focus back on input after selection\n setSearchValue('')\n queueMicrotask(() => inputRef.current?.focus())\n },\n [selectedValues, meta, rowIndex, columnId],\n )\n\n const removeValue = React.useCallback(\n (valueToRemove: string, event?: React.MouseEvent) => {\n event?.stopPropagation()\n event?.preventDefault()\n const newValues = selectedValues.filter((v) => v !== valueToRemove)\n setSelectedValues(newValues)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValues })\n // Focus back on input after removing\n setTimeout(() => inputRef.current?.focus(), 0)\n },\n [selectedValues, meta, rowIndex, columnId],\n )\n\n const clearAll = React.useCallback(() => {\n setSelectedValues([])\n meta?.onDataUpdate?.({ rowIndex, columnId, value: [] })\n queueMicrotask(() => inputRef.current?.focus())\n }, [meta, rowIndex, columnId])\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen) {\n setSearchValue('')\n meta?.onCellEditingStop?.()\n }\n },\n [meta],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n setSelectedValues(cellValue)\n setSearchValue('')\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setSearchValue('')\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, cellValue, meta],\n )\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Handle backspace when input is empty - remove last selected item\n if (event.key === 'Backspace' && searchValue === '' && selectedValues.length > 0) {\n event.preventDefault()\n const lastValue = selectedValues.at(-1)\n if (lastValue) {\n removeValue(lastValue)\n }\n }\n // Prevent escape from propagating to close the popover immediately\n // Let the command handle it first\n if (event.key === 'Escape') {\n event.stopPropagation()\n }\n },\n [searchValue, selectedValues, removeValue],\n )\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n // Focus input when popover opens\n React.useEffect(() => {\n if (open && inputRef.current) {\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n }, [open])\n\n const displayLabels = selectedValues.map(getLabel).filter(Boolean)\n\n const rowHeight = table.options.meta?.rowHeight ?? 'short'\n\n const lineCount = getLineCount(rowHeight)\n const maxVisibleBadgeCount = lineCount * 3\n\n const visibleLabels = displayLabels.slice(0, maxVisibleBadgeCount)\n const hiddenBadgeCount = Math.max(0, displayLabels.length - maxVisibleBadgeCount)\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverAnchor asChild>\n <div className=\"absolute inset-0\" />\n </PopoverAnchor>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"w-[300px] rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command className=\"[&_[data-slot=command-input-wrapper]]:h-auto [&_[data-slot=command-input-wrapper]]:border-none [&_[data-slot=command-input-wrapper]]:p-0 [&_[data-slot=command-input-wrapper]_svg]:hidden\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-1 border-b px-3 py-1.5\">\n {selectedValues.map((value) => (\n <Badge key={value} variant=\"secondary\" className=\"h-5 gap-1 px-1.5 text-xs\">\n {getLabel(value)}\n <button\n type=\"button\"\n onClick={(event) => removeValue(value, event)}\n onPointerDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n >\n <CrossIcon className=\"size-3\" />\n </button>\n </Badge>\n ))}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n onKeyDown={onInputKeyDown}\n placeholder=\"Search...\"\n className=\"h-auto flex-1 p-0\"\n />\n </div>\n <CommandList className=\"max-h-full\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] scroll-py-1 overflow-y-auto overflow-x-hidden\">\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <CommandItem key={option.value} value={option.label} onSelect={() => onValueChange(option.value)}>\n <div\n className={cn(\n 'flex size-4 items-center justify-center rounded-sm border border-border',\n isSelected ? 'bg-accent-foreground text-secondary' : 'opacity-50 [&_svg]:invisible',\n )}\n >\n <CheckIcon className=\"size-3\" />\n </div>\n <span>{option.label}</span>\n </CommandItem>\n )\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem onSelect={clearAll} className=\"justify-center text-muted-foreground\">\n Clear all\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : null}\n {displayLabels.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1 overflow-hidden\">\n {visibleLabels.map((label, index) => (\n <Badge key={selectedValues[index]} variant=\"secondary\" className=\"h-5 shrink-0 px-1.5 text-xs\">\n {label}\n </Badge>\n ))}\n {hiddenBadgeCount > 0 && (\n <Badge variant=\"outline\" className=\"h-5 shrink-0 px-1.5 text-muted-foreground text-xs\">\n +{hiddenBadgeCount}\n </Badge>\n )}\n </div>\n ) : null}\n </DataGridCellWrapper>\n )\n}\n","import type { ColumnMeta } from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport { cn } from '../../lib/utils'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function NumberCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, number>>) {\n const initialValue = cell.getValue() as number | null\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta as ColumnMeta<TData, number>\n const cellOptions = colMeta?.cell\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n const { min, max, step, prefix, suffix, fallbackValue = '' } = cellOptions?.variant === 'number' ? cellOptions : {}\n\n // Resolve prefix/suffix - support both string and function forms\n const resolvedPrefix = React.useMemo(() => {\n if (typeof prefix === 'function') {\n return prefix(cell.row.original, initialValue)\n }\n return prefix ?? null\n }, [prefix, cell.row.original, initialValue])\n\n const resolvedSuffix = React.useMemo(() => {\n if (typeof suffix === 'function') {\n return suffix(cell.row.original, initialValue)\n }\n return suffix ?? null\n }, [suffix, cell.row.original, initialValue])\n\n // Keep an unformatted string for editing (no grouping separators)\n const [editValue, setEditValue] = React.useState<string>(\n initialValue !== null && initialValue !== undefined ? String(initialValue) : '',\n )\n // Track if we've already submitted to prevent double-submit on blur after Enter/Tab\n const hasSubmittedRef = React.useRef(false)\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n const onBlur = React.useCallback(() => {\n // Skip if we've already submitted via Enter/Tab\n if (hasSubmittedRef.current) {\n return\n }\n const numValue = editValue === '' ? null : Number(editValue)\n if (numValue !== initialValue) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: numValue })\n }\n meta?.onCellEditingStop?.()\n }, [meta, rowIndex, columnId, initialValue, editValue])\n\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setEditValue(event.target.value)\n }, [])\n const parseNumValue = React.useCallback((): number | null => {\n return editValue === '' ? null : Number(editValue)\n }, [editValue])\n\n const saveAndStop = React.useCallback(\n (options?: { moveToNextRow?: boolean; direction?: 'left' | 'right' }) => {\n hasSubmittedRef.current = true\n const numValue = parseNumValue()\n // Always send update on explicit Enter/Tab (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: numValue })\n meta?.onCellEditingStop?.(options)\n },\n [parseNumValue, meta, rowIndex, columnId],\n )\n\n const handleEditingKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n saveAndStop({ moveToNextRow: true })\n } else if (event.key === 'Tab') {\n event.preventDefault()\n saveAndStop({ direction: event.shiftKey ? 'left' : 'right' })\n } else if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true // Don't submit on blur after Escape\n setEditValue(initialValue !== null && initialValue !== undefined ? String(initialValue) : '')\n inputRef.current?.blur()\n meta?.onCellEditingStop?.()\n }\n },\n [saveAndStop, initialValue, meta],\n )\n\n const handleFocusedKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isEditable) {\n return\n }\n\n if (event.key === 'Backspace') {\n setEditValue('')\n } else if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n setEditValue(event.key)\n }\n },\n [isEditable],\n )\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n handleEditingKeyDown(event)\n } else if (isFocused) {\n handleFocusedKeyDown(event)\n }\n },\n [isEditing, isFocused, handleEditingKeyDown, handleFocusedKeyDown],\n )\n\n React.useEffect(() => {\n setEditValue(initialValue !== null && initialValue !== undefined ? String(initialValue) : '')\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"number\"\n value={editValue}\n min={min}\n max={max}\n step={step}\n onBlur={onBlur}\n onChange={onChange}\n className=\"w-full border-none bg-transparent p-0 outline-none\"\n />\n ) : (\n <span data-slot=\"grid-cell-content\" className={cn('tabular-nums', colMeta?.align ?? 'text-right')}>\n {initialValue === null || initialValue === undefined ? (\n fallbackValue\n ) : (\n <>\n {resolvedPrefix}\n {initialValue.toLocaleString()}\n {resolvedSuffix}\n </>\n )}\n </span>\n )}\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function ReactNodeCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isSelected,\n isEditing,\n}: Readonly<CellVariantProps<TData, React.ReactNode>>) {\n const containerRef = React.useRef<HTMLDivElement>(null)\n const cellOpts = cell.column.columnDef.meta?.cell\n const renderFn = cellOpts?.variant === 'react-node' ? cellOpts.render : undefined\n\n // If render function provided, call it with full props\n // Otherwise fall back to getValue() (backward compatible)\n const children = renderFn\n ? renderFn({ cell, table, rowIndex, columnId, isFocused, isSelected, isEditing })\n : cell.getValue()\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n className=\"flex size-full justify-center p-0\"\n >\n {children ?? null}\n </DataGridCellWrapper>\n )\n}\n","import { CheckIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../../command/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../select/select'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellSelectOption } from '../data-grid-types'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function SelectCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isFocused,\n isEditing,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue)\n const [open, setOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const meta = table.options.meta\n const cellOpts = cell.column.columnDef.meta?.cell\n const hasSearch = (cellOpts?.variant === 'select' && cellOpts?.hasSearch) ?? false\n const sideOffset = -(inputRef.current?.clientHeight ?? 0)\n\n // Support both array options (enums/static) and Map options (relations)\n const arrayOptions = cellOpts?.variant === 'select' ? cellOpts.options : undefined\n const optionsMap = cellOpts?.variant === 'select' ? cellOpts.optionsMap : undefined\n\n // For array options, create a lookup Map once (memoized)\n const arrayOptionsLabelMap = React.useMemo(\n () => (arrayOptions ? new Map(arrayOptions.map((opt) => [opt.value, opt.label])) : null),\n [arrayOptions],\n )\n\n // O(1) display label lookup - works for both array and Map options\n const displayLabel = React.useMemo(() => {\n if (!value) {\n return value\n }\n // Map-based options: direct O(1) lookup\n if (optionsMap) {\n return optionsMap.get(value) ?? value\n }\n // Array-based options: use pre-built lookup Map\n if (arrayOptionsLabelMap) {\n return arrayOptionsLabelMap.get(value) ?? value\n }\n return value\n }, [value, optionsMap, arrayOptionsLabelMap])\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n const options: CellSelectOption[] = React.useMemo(() => {\n if (!isEditing) {\n return []\n } // Don't build array if not editing\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label }))\n }\n return []\n }, [isEditing, arrayOptions, optionsMap])\n\n const onValueChange = React.useCallback(\n (newValue: string) => {\n setValue(newValue)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n meta?.onCellEditingStop?.()\n },\n [meta, rowIndex, columnId],\n )\n\n const onOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen)\n if (!isOpen) {\n meta?.onCellEditingStop?.()\n }\n },\n [meta],\n )\n\n const onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']> =\n React.useCallback((event) => {\n event.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n if (event.key === 'Escape') {\n event.preventDefault()\n setValue(initialValue)\n setOpen(false)\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n }\n }\n },\n [isEditing, initialValue, meta],\n )\n\n React.useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && !open) {\n setOpen(true)\n }\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, open, meta?.searchOpen, meta?.isScrolling])\n\n let editingContent: React.ReactNode\n\n if (hasSearch) {\n editingContent = (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <div className=\"size-full items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1\">\n {displayLabel}\n </div>\n </PopoverTrigger>\n <PopoverContent\n data-grid-cell-editor=\"\"\n align=\"start\"\n sideOffset={sideOffset}\n className=\"max-w-[500px] w-full rounded-none p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n >\n <Command>\n <CommandList>\n <CommandInput ref={inputRef} placeholder=\"Search...\" className=\"h-auto flex-1 p-0\" />\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n onSelect={() => {\n onValueChange(option.value)\n }}\n >\n <span>{option.label}</span>\n {value === option.value ? <CheckIcon className=\"ml-auto h-4 w-4\" /> : null}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n } else {\n editingContent = (\n <Select value={value} onValueChange={onValueChange} open={open} onOpenChange={onOpenChange}>\n <SelectTrigger className=\"size-full items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent\n data-grid-cell-editor=\"\"\n // compensate for the wrapper padding\n align=\"start\"\n alignOffset={-8}\n sideOffset={-2}\n className=\"min-w-[calc(var(--radix-select-trigger-width)+16px)]\"\n >\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value} spacing=\"sm\">\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? editingContent : <span data-slot=\"grid-cell-content\">{displayLabel}</span>}\n </DataGridCellWrapper>\n )\n}\n","import * as React from 'react'\n\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport { CellVariantProps } from './cell-variant-types'\n\nexport function ShortTextCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, string>>) {\n const initialValue = cell.getValue()\n const [value, setValue] = React.useState(initialValue)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n // Track if we've already submitted to prevent double-submit on blur after Enter/Tab\n const hasSubmittedRef = React.useRef(false)\n const meta = table.options.meta\n const colMeta = cell.column.columnDef.meta\n // Normalize editable to a resolver function and memoize to avoid typeof checks per cell\n const editableResolver = React.useMemo(() => {\n const v = colMeta?.editable\n if (v === undefined) {\n return () => true\n }\n return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)\n }, [colMeta?.editable])\n const isEditable = editableResolver(cell.row.original)\n\n // Reset submitted flag when editing starts\n React.useEffect(() => {\n if (isEditing) {\n hasSubmittedRef.current = false\n }\n }, [isEditing])\n\n const onBlur = React.useCallback(() => {\n // Skip if we've already submitted via Enter/Tab\n if (hasSubmittedRef.current) {\n return\n }\n const currentValue = inputRef.current?.value ?? ''\n // Treat null/undefined as empty string for comparison\n const normalizedInitial = initialValue ?? ''\n if (currentValue !== normalizedInitial) {\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n }\n meta?.onCellEditingStop?.()\n }, [meta, rowIndex, columnId, initialValue])\n const onChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value)\n }, [])\n const handleEditingKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n hasSubmittedRef.current = true\n const currentValue = inputRef.current?.value ?? ''\n // Always send update on explicit Enter (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n meta?.onCellEditingStop?.({ moveToNextRow: true })\n } else if (event.key === 'Tab') {\n event.preventDefault()\n hasSubmittedRef.current = true\n const currentValue = inputRef.current?.value ?? ''\n // Always send update on explicit Tab (allows \"locking\" a value)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: currentValue })\n meta?.onCellEditingStop?.({\n direction: event.shiftKey ? 'left' : 'right',\n })\n } else if (event.key === 'Escape') {\n event.preventDefault()\n hasSubmittedRef.current = true // Don't submit on blur after Escape\n setValue(initialValue)\n inputRef.current?.blur()\n meta?.onCellEditingStop?.()\n }\n },\n [initialValue, meta, rowIndex, columnId],\n )\n\n const handleFocusedKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n // For non-editable columns we must not change the displayed value when the user types while focused.\n if (!isEditable) {\n return\n }\n\n // Handle typing to pre-fill the value when editing starts\n setValue(event.key)\n }\n },\n [isEditable],\n )\n\n const onWrapperKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isEditing) {\n handleEditingKeyDown(event)\n } else if (isFocused) {\n handleFocusedKeyDown(event)\n }\n },\n [isEditing, isFocused, handleEditingKeyDown, handleFocusedKeyDown],\n )\n\n React.useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n React.useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.setSelectionRange(inputRef.current.value.length, inputRef.current.value.length)\n }\n // Don't focus if we're in the middle of a scroll operation\n if (isFocused && !isEditing && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {\n containerRef.current.focus()\n }\n }, [isFocused, isEditing, meta?.searchOpen, meta?.isScrolling])\n\n return (\n <DataGridCellWrapper\n ref={containerRef}\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n onKeyDown={onWrapperKeyDown}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={value ?? ''}\n onBlur={onBlur}\n onChange={onChange}\n className=\"size-full bg-transparent outline-none\"\n />\n ) : (\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden outline-none\">\n {value}\n </div>\n )}\n </DataGridCellWrapper>\n )\n}\n","import type { Cell, Table } from '@tanstack/react-table'\n\nimport { CheckboxCell } from './cell-variants/checkbox-cell'\nimport { DateCell } from './cell-variants/date-cell'\nimport { GanttCell } from './cell-variants/gantt-cell'\nimport { LongTextCell } from './cell-variants/long-text-cell'\nimport { MultiSelectCell } from './cell-variants/multi-select-cell'\nimport { NumberCell } from './cell-variants/number-cell'\nimport { ReactNodeCell } from './cell-variants/react-node-cell'\nimport { SelectCell } from './cell-variants/select-cell'\nimport { ShortTextCell } from './cell-variants/short-text-cell'\n\ntype DataGridCellProps<TData> = {\n cell: Cell<TData, unknown>\n table: Table<TData>\n}\n\nexport function DataGridCell<TData>({ cell, table }: DataGridCellProps<TData>) {\n const meta = table.options.meta\n const originalRowIndex = cell.row.index\n\n const rows = table.getRowModel().rows\n const displayRowIndex = rows.findIndex((row) => row.original === cell.row.original)\n const rowIndex = displayRowIndex >= 0 ? displayRowIndex : originalRowIndex\n const columnId = cell.column.id\n\n const isFocused = meta?.focusedCell?.rowIndex === rowIndex && meta?.focusedCell?.columnId === columnId\n const isEditing = meta?.editingCell?.rowIndex === rowIndex && meta?.editingCell?.columnId === columnId\n const isSelected = meta?.getIsCellSelected?.(rowIndex, columnId) ?? false\n\n const cellOpts = cell.column.columnDef.meta?.cell\n const variant = cellOpts?.variant ?? 'text'\n\n switch (variant) {\n case 'short-text':\n return (\n <ShortTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'long-text':\n return (\n <LongTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'number':\n return (\n <NumberCell\n cell={cell as Cell<TData, number>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'select':\n return (\n <SelectCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'multi-select':\n return (\n <MultiSelectCell\n cell={cell as Cell<TData, string[]>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'checkbox':\n return (\n <CheckboxCell\n cell={cell as Cell<TData, boolean>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'date':\n return (\n <DateCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'react-node':\n return (\n <ReactNodeCell\n cell={cell as Cell<TData, React.ReactNode>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n case 'gantt':\n return (\n <GanttCell\n cell={cell as Cell<TData, { start: Date; end: Date } | null>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n\n default:\n return (\n <ShortTextCell\n cell={cell as Cell<TData, string>}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n />\n )\n }\n}\n","import type { Table } from '@tanstack/react-table'\n\nimport { CheckIcon, GripHorizontalIcon, Settings2Icon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../command/command'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\ntype DataGridViewMenuProps<TData> = {\n table: Table<TData>\n} & React.ComponentProps<typeof PopoverContent>\n\nexport function DataGridViewMenu<TData>({ table, ...props }: DataGridViewMenuProps<TData>) {\n // Columns that are shown in the view menu. We include any column with an accessor\n // so users can see the full column list, even when a column cannot be hidden.\n const viewableColumns = React.useMemo(\n () => table.getAllColumns().filter((column) => typeof column.accessorFn !== 'undefined'),\n [table],\n )\n\n // Local order state for displaying items in the menu\n const [order, setOrder] = React.useState<string[]>(() => {\n const stateOrder = table.getState().columnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n return stateOrder\n }\n return table.getAllColumns().map((c) => c.id)\n })\n\n // Search state for the CommandInput — used to conditionally show the empty state\n const [searchQuery, setSearchQuery] = React.useState<string>('')\n\n // Drag state\n const [isDragging, setIsDragging] = React.useState(false)\n const [insertionIndex, setInsertionIndex] = React.useState<number | null>(null)\n\n // Keep order in sync with external changes to table state\n React.useEffect(() => {\n const stateOrder = table.getState().columnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n setOrder(stateOrder)\n return\n }\n setOrder(table.getAllColumns().map((c) => c.id))\n }, [table])\n\n const visibleSet = React.useMemo(() => new Set(viewableColumns.map((c) => c.id)), [viewableColumns])\n\n // Derive the ordered columns we will show in the menu (filter to hideable ones)\n const orderedColumns = React.useMemo(() => {\n const ordered: ReturnType<typeof table.getAllColumns>[0][] = []\n for (const id of order) {\n const col = viewableColumns.find((c) => c.id === id)\n if (col) {\n ordered.push(col)\n }\n }\n // Add any missing viewable columns at the end\n for (const col of viewableColumns) {\n if (!ordered.find((c) => c.id === col.id)) {\n ordered.push(col)\n }\n }\n return ordered\n }, [order, viewableColumns, table])\n\n const draggingRef = React.useRef<string | null>(null)\n const groupRef = React.useRef<HTMLDivElement | null>(null)\n\n const getBaseOrder = React.useCallback((): string[] => {\n return (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n }, [table])\n\n const computeInsertionIndex = React.useCallback(\n (clientY: number) => {\n const baseOrder = getBaseOrder()\n\n const el = groupRef.current\n if (!el) {\n return baseOrder.length\n }\n\n const nodes = Array.from(el.querySelectorAll('[data-col-id]')) as HTMLElement[]\n for (const node of nodes) {\n const rect = node.getBoundingClientRect()\n const mid = rect.top + rect.height / 2\n if (clientY < mid) {\n const id = node.dataset.colId as string\n const pos = baseOrder.indexOf(id)\n const newIndex = pos === -1 ? baseOrder.length : pos\n return newIndex\n }\n }\n return baseOrder.length\n },\n [getBaseOrder],\n )\n\n // moveItemInArray was removed; we compute insertion index directly on pointer drag\n\n function onDragEnd() {\n draggingRef.current = null\n setIsDragging(false)\n setInsertionIndex(null)\n }\n\n const doDrop = React.useCallback(\n (dragId: string, toIndex: number) => {\n // Build a base order that includes all columns (so hidden columns are preserved)\n const baseOrder = (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n\n const fromIndex = baseOrder.indexOf(dragId)\n if (fromIndex === -1) {\n onDragEnd()\n return\n }\n\n const copy = baseOrder.slice()\n copy.splice(fromIndex, 1)\n\n // If the dragged element came from before the target index,\n // removing it shifts indices left by 1, so adjust insertion index.\n let insertAt = toIndex\n if (fromIndex < toIndex) {\n insertAt = toIndex - 1\n }\n insertAt = Math.min(Math.max(0, insertAt), copy.length)\n copy.splice(insertAt, 0, dragId)\n\n table.setColumnOrder(copy)\n\n // Update our local order view (only for hideable columns)\n setOrder(copy.filter((id) => visibleSet.has(id)))\n onDragEnd()\n },\n [table, visibleSet],\n )\n\n const startPointerDrag = React.useCallback(\n (e: React.PointerEvent, id: string) => {\n e.preventDefault()\n draggingRef.current = id\n setIsDragging(true)\n // initialize insertion index\n setInsertionIndex(computeInsertionIndex(e.clientY))\n\n const onMove = (ev: PointerEvent) => {\n const idx = computeInsertionIndex(ev.clientY)\n setInsertionIndex(idx)\n }\n\n const onUp = (ev: PointerEvent) => {\n globalThis.removeEventListener('pointermove', onMove)\n globalThis.removeEventListener('pointerup', onUp)\n const dragId = draggingRef.current\n const toIndex = computeInsertionIndex(ev.clientY)\n if (dragId) {\n doDrop(dragId, toIndex)\n }\n draggingRef.current = null\n setIsDragging(false)\n setInsertionIndex(null)\n }\n\n globalThis.addEventListener('pointermove', onMove)\n globalThis.addEventListener('pointerup', onUp)\n },\n [computeInsertionIndex, doDrop],\n )\n\n function insertionWouldBeNoOp(targetIndex: number | null) {\n if (targetIndex === null) {\n return false\n }\n const dragId = draggingRef.current\n if (!dragId) {\n return false\n }\n const base = getBaseOrder()\n const fromIndex = base.indexOf(dragId)\n if (fromIndex === -1) {\n return false\n }\n let insertAt = targetIndex\n if (fromIndex < targetIndex) {\n insertAt = targetIndex - 1\n }\n return insertAt === fromIndex\n }\n\n const dragFromHandle = React.useRef(false)\n\n function resetTableView() {\n const defaultOrder = table.getAllColumns().map((c) => c.id)\n\n try {\n table.reset()\n } finally {\n // Clear persisted localStorage keys for this path\n try {\n if (typeof window !== 'undefined') {\n const path = globalThis.location?.pathname ?? 'unknown'\n const prefix = `pxl.dataGrid:${path}:`\n const keys: string[] = []\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i)\n if (k && k.startsWith(prefix)) {\n keys.push(k)\n }\n }\n for (const k of keys) {\n localStorage.removeItem(k)\n }\n // Also update the local menu order so the UI reflects the reset immediately\n try {\n setOrder(defaultOrder.filter((id) => visibleSet.has(id)))\n } catch (_) {\n // ignore\n }\n }\n } catch (_) {\n // ignore storage errors\n }\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n aria-label=\"Toggle columns\"\n role=\"combobox\"\n variant=\"outline\"\n size=\"sm\"\n className=\"ml-auto hidden h-8 font-normal lg:flex\"\n >\n <Settings2Icon className=\"text-muted-foreground\" />\n View\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn('w-56 p-0 m-4 mt-0', isDragging ? 'cursor-grabbing' : '')} {...props}>\n <Command>\n <CommandInput placeholder=\"Search columns...\" onValueChange={setSearchQuery} />\n <CommandList>\n {searchQuery.trim() ? <CommandEmpty>No columns found.</CommandEmpty> : null}\n <div ref={groupRef}>\n <CommandGroup className=\"p-1\">\n {/* Insertion indicator at top */}\n {isDragging && insertionIndex === 0 && !insertionWouldBeNoOp(0) ? (\n <div className=\"h-0.5 bg-accent w-full my-1 rounded\" />\n ) : null}\n {orderedColumns.map((column) => {\n const currentBase = (\n table.getState().columnOrder && table.getState().columnOrder.length\n ? table.getState().columnOrder.slice()\n : table.getAllColumns().map((c) => c.id)\n ) as string[]\n const pos = currentBase.indexOf(column.id)\n const isHideable = column.getCanHide()\n return (\n <React.Fragment key={column.id}>\n <CommandItem\n value={column.id}\n data-col-id={column.id}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded',\n !isDragging\n ? 'data-[selected=true]:bg-accent'\n : 'data-[selected=true]:bg-transparent cursor-grabbing',\n draggingRef.current === column.id && isDragging && 'bg-accent data-[selected=true]:bg-accent',\n )}\n onSelect={() => {\n if (dragFromHandle.current) {\n dragFromHandle.current = false\n return\n }\n if (!isHideable) {\n // Column cannot be hidden; do nothing when clicked.\n return\n }\n column.toggleVisibility(!column.getIsVisible())\n }}\n >\n <span\n onPointerDown={(e) => {\n if (searchQuery.trim() !== '') {\n return\n }\n\n dragFromHandle.current = true\n e.stopPropagation()\n e.preventDefault()\n startPointerDrag(e, column.id)\n }}\n className={cn(\n 'size-4 text-muted-foreground',\n searchQuery.trim() !== '' && 'opacity-10',\n searchQuery.trim() === '' && (isDragging ? 'cursor-grabbing' : 'cursor-grab'),\n )}\n >\n <GripHorizontalIcon />\n </span>\n <span className=\"truncate\">{(column.columnDef.meta as any)?.label ?? column.id}</span>\n <CheckIcon\n className={cn(\n 'ml-auto size-4 shrink-0',\n // Visible columns show the check; non-hideable columns show a muted check\n isHideable\n ? column.getIsVisible()\n ? 'opacity-100'\n : 'opacity-0'\n : 'opacity-50 text-muted-foreground',\n )}\n />\n </CommandItem>\n\n {/* Insertion indicator after the item (between items) */}\n {isDragging && insertionIndex === pos + 1 && !insertionWouldBeNoOp(pos + 1) ? (\n <div className=\"h-0.5 bg-accent w-full my-1 rounded\" />\n ) : null}\n </React.Fragment>\n )\n })}\n </CommandGroup>\n </div>\n </CommandList>\n </Command>\n <div className=\"border-t px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n // Reset table state: order, visibility, pinning and sizing\n resetTableView()\n }}\n >\n Reset view\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import {\n type ColumnDef,\n getCoreRowModel,\n getSortedRowModel,\n type RowSelectionState,\n type SortingState,\n type TableOptions,\n type Updater,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer, type Virtualizer } from '@tanstack/react-virtual'\n\nimport * as React from 'react'\n\nimport { useDebouncedCallback } from '../../hooks/use-debounced-callback'\nimport { DataGridCell } from '../data-grid-cell'\nimport type {\n CellPosition,\n ContextMenuState,\n NavigationDirection,\n RowHeightValue,\n SearchState,\n SelectionState,\n UpdateCell,\n} from '../data-grid-types'\nimport { getCellKey, getRowHeightValue, parseCellKey } from '../data-grid-utils'\n\nconst DEFAULT_ROW_HEIGHT = 'short'\nconst OVERSCAN = 3\nconst VIEWPORT_OFFSET = 1\nconst MIN_COLUMN_SIZE = 60\nconst MAX_COLUMN_SIZE = 800\nconst SEARCH_SHORTCUT_KEY = 'f'\nconst NON_NAVIGABLE_COLUMN_IDS = ['select', 'actions']\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nfunction useLazyRef<T>(fn: () => T): React.RefObject<T> {\n const ref = React.useRef<T | null>(null)\n if (ref.current === null) {\n ref.current = fn()\n }\n return ref as React.RefObject<T>\n}\n\nfunction useAsRef<T>(data: T) {\n const ref = React.useRef<T>(data)\n\n useIsomorphicLayoutEffect(() => {\n ref.current = data\n })\n\n return ref\n}\n\ntype DataGridState = {\n sorting: SortingState\n rowHeight: RowHeightValue\n rowSelection: RowSelectionState\n selectionState: SelectionState\n focusedCell: CellPosition | null\n editingCell: CellPosition | null\n contextMenu: ContextMenuState\n searchQuery: string\n searchMatches: CellPosition[]\n matchIndex: number\n searchOpen: boolean\n lastClickedRowIndex: number | null\n isScrolling: boolean\n}\n\ntype DataGridStore = {\n subscribe: (callback: () => void) => () => void\n getState: () => DataGridState\n setState: <K extends keyof DataGridState>(key: K, value: DataGridState[K]) => void\n notify: () => void\n batch: (fn: () => void) => void\n}\n\nfunction useStore<T>(store: DataGridStore, selector: (state: DataGridState) => T): T {\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector])\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot)\n}\n\ntype UseDataGridProps<TData> = {\n onDataChange?: (data: TData[]) => void\n onRowAdd?: (event?: React.MouseEvent<HTMLDivElement>) =>\n | Partial<CellPosition>\n | Promise<Partial<CellPosition>>\n | null\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n | void // void is needed here to allow functions without explicit return\n onRowsDelete?: (rows: TData[], rowIndices: number[]) => void | Promise<void>\n onCellFocus?: (args: { rowIndex: number; columnId: string }) => void\n /**\n * Called when a row is clicked. Receives the row index.\n * Use this for row-level selection/navigation (e.g., keyField-based routing).\n */\n onRowClick?: (rowIndex: number) => void\n /**\n * Index of the row to highlight (e.g., for keyField-based URL routing).\n * The highlighted row gets a subtle background color.\n */\n highlightedRowIndex?: number\n rowHeight?: RowHeightValue\n overscan?: number\n autoFocus?: boolean | Partial<CellPosition>\n enableColumnSelection?: boolean\n enableSearch?: boolean\n // Server-side sorting props (passed as top-level for convenience, hook puts them in state)\n manualSorting?: boolean\n sorting?: SortingState\n onSortingChange?: (updater: Updater<SortingState>) => void\n /**\n * Called when scrolling near the end of loaded data.\n * Use this to trigger fetching the next page for infinite scroll.\n *\n * Note: This callback may be invoked multiple times during scroll while\n * the threshold condition is met. If using TanStack Query's `fetchNextPage`,\n * it handles deduplication internally. Otherwise, implement your own guard\n * (e.g., check `isFetching` state) to prevent duplicate requests.\n */\n onLoadMore?: () => void\n /**\n * Number of rows from the end at which to trigger onLoadMore.\n * Lower values load data later (closer to the end), higher values load earlier.\n * @default 25\n */\n loadMoreThreshold?: number\n /**\n * Total number of rows (including unloaded ones) for proper scrollbar sizing.\n * If provided, the scrollbar will reflect the full dataset size.\n */\n totalRowCount?: number\n} & Omit<TableOptions<TData>, 'pageCount' | 'getCoreRowModel' | 'manualSorting' | 'onSortingChange'>\n\nfunction useDataGrid<TData>({\n columns,\n data,\n onDataChange,\n onRowAdd: onRowAddProp,\n onRowsDelete: onRowsDeleteProp,\n onCellFocus: onCellFocusProp,\n onRowClick: onRowClickProp,\n highlightedRowIndex,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n overscan = OVERSCAN,\n initialState,\n autoFocus = false,\n enableColumnSelection = false,\n enableSearch = false,\n // Extract server-side sorting props\n manualSorting,\n sorting: externalSorting,\n onSortingChange: externalOnSortingChange,\n // Infinite scroll\n onLoadMore,\n loadMoreThreshold = 25,\n totalRowCount,\n ...dataGridProps\n}: UseDataGridProps<TData>) {\n const dataGridRef = React.useRef<HTMLDivElement>(null)\n const tableRef = React.useRef<ReturnType<typeof useReactTable<TData>>>(null)\n const rowVirtualizerRef = React.useRef<Virtualizer<HTMLDivElement, Element>>(null)\n const headerRef = React.useRef<HTMLDivElement>(null)\n const rowMapRef = React.useRef<Map<number, HTMLDivElement>>(new Map())\n const footerRef = React.useRef<HTMLDivElement>(null)\n\n const dataGridPropsRef = useAsRef(dataGridProps)\n const listenersRef = useLazyRef(() => new Set<() => void>())\n\n const stateRef = useLazyRef<DataGridState>(() => {\n return {\n sorting: initialState?.sorting ?? [],\n rowHeight: rowHeightProp,\n rowSelection: initialState?.rowSelection ?? {},\n selectionState: {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n },\n focusedCell: null,\n editingCell: null,\n contextMenu: {\n open: false,\n x: 0,\n y: 0,\n },\n searchQuery: '',\n searchMatches: [],\n matchIndex: -1,\n searchOpen: false,\n lastClickedRowIndex: null,\n isScrolling: false,\n }\n })\n\n const store = React.useMemo<DataGridStore>(() => {\n let isBatching = false\n let pendingNotification = false\n\n return {\n subscribe: (callback) => {\n listenersRef.current.add(callback)\n return () => listenersRef.current.delete(callback)\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) {\n return\n }\n stateRef.current[key] = value\n\n if (isBatching) {\n pendingNotification = true\n } else {\n if (!pendingNotification) {\n pendingNotification = true\n queueMicrotask(() => {\n pendingNotification = false\n store.notify()\n })\n }\n }\n },\n notify: () => {\n for (const listener of listenersRef.current) {\n listener()\n }\n },\n batch: (fn) => {\n if (isBatching) {\n fn()\n return\n }\n\n isBatching = true\n const wasPending = pendingNotification\n pendingNotification = false\n\n try {\n fn()\n } finally {\n isBatching = false\n if (pendingNotification || wasPending) {\n pendingNotification = false\n store.notify()\n }\n }\n },\n }\n }, [listenersRef, stateRef])\n\n React.useEffect(() => {\n store.setState('rowHeight', rowHeightProp)\n }, [rowHeightProp, store])\n\n const focusedCell = useStore(store, (state) => state.focusedCell)\n const editingCell = useStore(store, (state) => state.editingCell)\n const selectionState = useStore(store, (state) => state.selectionState)\n const searchQuery = useStore(store, (state) => state.searchQuery)\n const searchMatches = useStore(store, (state) => state.searchMatches)\n const matchIndex = useStore(store, (state) => state.matchIndex)\n const searchOpen = useStore(store, (state) => state.searchOpen)\n const sorting = useStore(store, (state) => state.sorting)\n const rowSelection = useStore(store, (state) => state.rowSelection)\n const contextMenu = useStore(store, (state) => state.contextMenu)\n const rowHeight = useStore(store, (state) => state.rowHeight)\n const isScrolling = useStore(store, (state) => state.isScrolling)\n\n const rowHeightValue = getRowHeightValue(rowHeight)\n\n const columnIds = React.useMemo(() => {\n return columns\n .map((c) => {\n if (c.id) {\n return c.id\n }\n if ('accessorKey' in c) {\n return c.accessorKey as string\n }\n return undefined\n })\n .filter((id): id is string => Boolean(id))\n }, [columns])\n\n // Build a storage key for this table. We use the current pathname plus the column ids so different tables/pages get separate storage slots\n const storageKey = React.useMemo(() => {\n if (typeof window === 'undefined') {\n return undefined\n }\n const path = globalThis.location?.pathname ?? 'unknown'\n const cols = columnIds.join('|')\n return `pxl.dataGrid:${path}:${cols}`\n }, [columnIds])\n\n // Try to load persisted table state (order/visibility/pinning) from localStorage and merge it into the initial state the table will be created with.\n const persistedState = React.useMemo(() => {\n if (!storageKey) {\n return undefined\n }\n try {\n const raw = localStorage.getItem(storageKey)\n if (!raw) {\n return undefined\n }\n const parsed = JSON.parse(raw)\n return parsed\n } catch (_) {\n return undefined\n }\n }, [storageKey])\n\n // Merge persisted state (if any) into the table initial state so stored column order / visibility / pinning get reapplied on load.\n const mergedInitialState = React.useMemo(() => {\n const base = { ...(initialState ?? {}) } as Record<string, unknown>\n\n if (persistedState) {\n try {\n if (persistedState.columnOrder) {\n base.columnOrder = persistedState.columnOrder\n }\n if (persistedState.columnVisibility) {\n base.columnVisibility = persistedState.columnVisibility\n }\n if (persistedState.columnPinning) {\n base.columnPinning = persistedState.columnPinning\n }\n } catch (_) {\n // ignore malformed persisted state\n }\n }\n\n return base as typeof initialState\n }, [initialState, persistedState])\n\n // Derive the current visible, ordered column ids from the table when available.\n // This respects `table.setColumnOrder(...)` and column visibility.\n const getNavigableColumnIds = React.useCallback(() => {\n const t = tableRef.current\n if (t) {\n return t\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .filter((c) => !NON_NAVIGABLE_COLUMN_IDS.includes(c))\n }\n return columnIds.filter((c) => !NON_NAVIGABLE_COLUMN_IDS.includes(c))\n }, [columnIds])\n\n const onDataUpdate = React.useCallback(\n (updates: UpdateCell | UpdateCell[]) => {\n const updateArray = Array.isArray(updates) ? updates : [updates]\n\n if (updateArray.length === 0) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows\n\n const rowUpdatesMap = new Map<number, Omit<UpdateCell, 'rowIndex'>[]>()\n\n for (const update of updateArray) {\n if (!rows || !currentTable) {\n const existingUpdates = rowUpdatesMap.get(update.rowIndex) ?? []\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value,\n })\n rowUpdatesMap.set(update.rowIndex, existingUpdates)\n } else {\n const row = rows[update.rowIndex]\n if (!row) {\n continue\n }\n\n const originalData = row.original\n const originalRowIndex = data.indexOf(originalData)\n if (originalRowIndex === -1) {\n continue\n }\n\n const existingUpdates = rowUpdatesMap.get(originalRowIndex) ?? []\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value,\n })\n rowUpdatesMap.set(originalRowIndex, existingUpdates)\n }\n }\n // Also notify any per-cell change handler if present on the table meta.\n const currentMeta = tableRef.current?.options.meta\n if (currentMeta?.onCellChange) {\n for (const u of updateArray) {\n try {\n currentMeta.onCellChange(u)\n } catch (_) {\n // Ignore handler errors here to avoid breaking the grid behavior\n }\n }\n }\n\n const newData = data.map((row, index) => {\n const updates = rowUpdatesMap.get(index)\n if (!updates) {\n return row\n }\n\n const updatedRow = { ...row } as Record<string, unknown>\n for (const { columnId, value } of updates) {\n updatedRow[columnId] = value\n }\n return updatedRow as TData\n })\n\n onDataChange?.(newData)\n },\n [data, onDataChange],\n )\n\n const getIsCellSelected = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return selectionState.selectedCells.has(getCellKey(rowIndex, columnId))\n },\n [selectionState.selectedCells],\n )\n\n const clearSelection = React.useCallback(() => {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('rowSelection', {})\n })\n }, [store])\n\n const selectAll = React.useCallback(() => {\n const allCells = new Set<string>()\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n for (const columnId of columnIds) {\n allCells.add(getCellKey(rowIndex, columnId))\n }\n }\n\n const firstColumnId = columnIds[0]\n const lastColumnId = columnIds[columnIds.length - 1]\n\n store.setState('selectionState', {\n selectedCells: allCells,\n selectionRange:\n columnIds.length > 0 && rowCount > 0 && firstColumnId && lastColumnId\n ? {\n start: { rowIndex: 0, columnId: firstColumnId },\n end: { rowIndex: rowCount - 1, columnId: lastColumnId },\n }\n : null,\n isSelecting: false,\n })\n }, [columnIds, data.length, store])\n\n const selectColumn = React.useCallback(\n (columnId: string) => {\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n if (rowCount === 0) {\n return\n }\n\n const selectedCells = new Set<string>()\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n\n store.setState('selectionState', {\n selectedCells,\n selectionRange: {\n start: { rowIndex: 0, columnId },\n end: { rowIndex: rowCount - 1, columnId },\n },\n isSelecting: false,\n })\n },\n [data.length, store],\n )\n\n const selectRange = React.useCallback(\n (start: CellPosition, end: CellPosition, isSelecting = false) => {\n // Use the current visible/displayed column order so drag selection\n // follows the UI when users reorder columns.\n const visibleCols = getNavigableColumnIds()\n const startColIndex = visibleCols.indexOf(start.columnId)\n const endColIndex = visibleCols.indexOf(end.columnId)\n\n const minRow = Math.min(start.rowIndex, end.rowIndex)\n const maxRow = Math.max(start.rowIndex, end.rowIndex)\n const minCol = Math.min(startColIndex, endColIndex)\n const maxCol = Math.max(startColIndex, endColIndex)\n\n const selectedCells = new Set<string>()\n\n for (let rowIndex = minRow; rowIndex <= maxRow; rowIndex++) {\n for (let colIndex = minCol; colIndex <= maxCol; colIndex++) {\n const columnId = visibleCols[colIndex]\n if (columnId) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n }\n }\n\n store.setState('selectionState', {\n selectedCells,\n selectionRange: { start, end },\n isSelecting,\n })\n },\n [getNavigableColumnIds, store],\n )\n\n const focusCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState('focusedCell', { rowIndex, columnId })\n store.setState('editingCell', null)\n })\n\n // Notify parent component about cell focus change\n onCellFocusProp?.({ rowIndex, columnId })\n\n const currentState = store.getState()\n\n if (currentState.searchOpen) {\n return\n }\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus()\n }\n },\n [store, onCellFocusProp],\n )\n\n const onRowsDelete = React.useCallback(\n async (rowIndices: number[]) => {\n if (!onRowsDeleteProp || rowIndices.length === 0) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows\n\n if (!rows || rows.length === 0) {\n return\n }\n\n const currentState = store.getState()\n const currentFocusedColumn = currentState.focusedCell?.columnId ?? getNavigableColumnIds()[0]\n\n const minDeletedRowIndex = Math.min(...rowIndices)\n\n const rowsToDelete: TData[] = []\n for (const rowIndex of rowIndices) {\n const row = rows[rowIndex]\n if (row) {\n rowsToDelete.push(row.original)\n }\n }\n\n await onRowsDeleteProp(rowsToDelete, rowIndices)\n\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('rowSelection', {})\n store.setState('editingCell', null)\n })\n\n requestAnimationFrame(() => {\n const currentTable = tableRef.current\n const currentRows = currentTable?.getRowModel().rows ?? []\n const newRowCount = currentRows.length ?? data.length\n\n if (newRowCount > 0 && currentFocusedColumn) {\n const targetRowIndex = Math.min(minDeletedRowIndex, newRowCount - 1)\n focusCell(targetRowIndex, currentFocusedColumn)\n }\n })\n },\n [onRowsDeleteProp, data.length, store, getNavigableColumnIds, focusCell],\n )\n\n /**\n * Debounced row click handler - KEYBOARD NAVIGATION ONLY\n *\n * This debounced version (300ms delay) is used exclusively for keyboard navigation\n * (arrow keys, Page Up/Down, etc.) to prevent browser history pollution from rapid\n * key presses when using keyField-based URL routing.\n *\n * Mouse clicks use the immediate `onRowClickProp` handler directly (passed via table.meta.onRowClick)\n * since clicks are deliberate user actions that don't require debouncing.\n */\n const debouncedRowClick = useDebouncedCallback((rowIndex: number) => {\n onRowClickProp?.(rowIndex)\n }, 300)\n\n const navigateCell = React.useCallback(\n (direction: NavigationDirection) => {\n const currentState = store.getState()\n if (!currentState.focusedCell) {\n return\n }\n\n const { rowIndex, columnId } = currentState.focusedCell\n const _navCols = getNavigableColumnIds()\n const currentColIndex = _navCols.indexOf(columnId)\n const rowVirtualizer = rowVirtualizerRef.current\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n let newRowIndex = rowIndex\n let newColumnId = columnId\n\n switch (direction) {\n case 'up':\n newRowIndex = Math.max(0, rowIndex - 1)\n break\n case 'down':\n newRowIndex = Math.min(rowCount - 1, rowIndex + 1)\n break\n case 'left':\n if (currentColIndex > 0) {\n const prevColumnId = _navCols[currentColIndex - 1]\n if (prevColumnId) {\n newColumnId = prevColumnId\n }\n }\n break\n case 'right':\n if (currentColIndex < _navCols.length - 1) {\n const nextColumnId = _navCols[currentColIndex + 1]\n if (nextColumnId) {\n newColumnId = nextColumnId\n }\n }\n break\n case 'home': {\n const _navCols2 = getNavigableColumnIds()\n if (_navCols2.length > 0) {\n newColumnId = _navCols2[0] ?? columnId\n }\n break\n }\n case 'end': {\n const _navCols3 = getNavigableColumnIds()\n if (_navCols3.length > 0) {\n newColumnId = _navCols3[_navCols3.length - 1] ?? columnId\n }\n break\n }\n case 'ctrl+home': {\n newRowIndex = 0\n const _navCols4 = getNavigableColumnIds()\n if (_navCols4.length > 0) {\n newColumnId = _navCols4[0] ?? columnId\n }\n break\n }\n case 'ctrl+end': {\n newRowIndex = Math.max(0, rowCount - 1)\n const _navCols5 = getNavigableColumnIds()\n if (_navCols5.length > 0) {\n newColumnId = _navCols5[_navCols5.length - 1] ?? columnId\n }\n break\n }\n case 'pageup':\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems()\n const pageSize = visibleRange.length ?? 10\n newRowIndex = Math.max(0, rowIndex - pageSize)\n } else {\n newRowIndex = Math.max(0, rowIndex - 10)\n }\n break\n case 'pagedown':\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems()\n const pageSize = visibleRange.length ?? 10\n newRowIndex = Math.min(rowCount - 1, rowIndex + pageSize)\n } else {\n newRowIndex = Math.min(rowCount - 1, rowIndex + 10)\n }\n break\n }\n\n if (newRowIndex !== rowIndex || newColumnId !== columnId) {\n const rowDiff = newRowIndex - rowIndex\n const rowChanged = newRowIndex !== rowIndex\n\n // Trigger debounced row click for keyboard navigation\n // Uses 300ms delay to prevent browser history pollution from rapid arrow key presses\n // (mouse clicks use the immediate onRowClickProp handler via table.meta.onRowClick)\n if (rowChanged && onRowClickProp) {\n debouncedRowClick(newRowIndex)\n }\n\n // For single-row vertical navigation (up/down arrows)\n if (Math.abs(rowDiff) === 1 && (direction === 'up' || direction === 'down')) {\n const container = dataGridRef.current\n const currentRow = rowMapRef.current.get(rowIndex)\n const targetRow = rowMapRef.current.get(newRowIndex)\n\n if (!container || !currentRow) {\n // Fallback to simple focus if we can't find elements\n focusCell(newRowIndex, newColumnId)\n return\n }\n\n // Check viewport boundaries\n const containerRect = container.getBoundingClientRect()\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET\n\n // If target row already exists, check if it's visible\n if (targetRow) {\n const rowRect = targetRow.getBoundingClientRect()\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom\n\n if (isFullyVisible) {\n // Row is fully visible, just focus it\n focusCell(newRowIndex, newColumnId)\n return\n }\n\n // Row exists but not fully visible, scroll it into view\n focusCell(newRowIndex, newColumnId)\n\n if (direction === 'down') {\n // Scroll just enough to show the row at the bottom\n const scrollNeeded = rowRect.bottom - viewportBottom\n container.scrollTop += scrollNeeded\n } else {\n // Scroll just enough to show the row at the top\n const scrollNeeded = viewportTop - rowRect.top\n container.scrollTop -= scrollNeeded\n }\n return\n }\n\n // Target row is not rendered yet\n // Focus immediately so the ring appears as the row is revealed\n focusCell(newRowIndex, newColumnId)\n\n // Scroll by exactly one row height to reveal it smoothly\n if (direction === 'down') {\n container.scrollTop += rowHeightValue\n } else {\n // For arrow up, ensure we don't go below 0\n const currentScrollTop = container.scrollTop\n const targetScrollTop = Math.max(0, currentScrollTop - rowHeightValue)\n container.scrollTop = targetScrollTop\n }\n return\n }\n\n // For larger jumps (page up/down, ctrl+home/end, etc.)\n if (rowVirtualizer && Math.abs(rowDiff) > 1) {\n const align =\n direction === 'pageup' || direction === 'ctrl+home'\n ? 'start'\n : direction === 'pagedown' || direction === 'ctrl+end'\n ? 'end'\n : 'center'\n rowVirtualizer.scrollToIndex(newRowIndex, { align })\n requestAnimationFrame(() => {\n focusCell(newRowIndex, newColumnId)\n })\n return\n }\n\n // For horizontal navigation or when row is already visible\n focusCell(newRowIndex, newColumnId)\n }\n },\n [store, getNavigableColumnIds, focusCell, data.length, rowHeightValue, onRowClickProp, debouncedRowClick],\n )\n\n const onCellEditingStart = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState('focusedCell', { rowIndex, columnId })\n store.setState('editingCell', { rowIndex, columnId })\n })\n },\n [store],\n )\n\n const onCellEditingStop = React.useCallback(\n (opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }) => {\n const currentState = store.getState()\n const currentEditing = currentState.editingCell\n\n store.setState('editingCell', null)\n\n if (opts?.moveToNextRow && currentEditing) {\n const { rowIndex, columnId } = currentEditing\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n const rowCount = rows.length ?? data.length\n\n const nextRowIndex = rowIndex + 1\n if (nextRowIndex < rowCount) {\n requestAnimationFrame(() => {\n focusCell(nextRowIndex, columnId)\n })\n }\n } else if (opts?.direction && currentEditing) {\n // Focus the current editing cell first, then navigate\n const { rowIndex, columnId } = currentEditing\n focusCell(rowIndex, columnId)\n requestAnimationFrame(() => {\n navigateCell(opts.direction ?? 'right')\n })\n }\n },\n [store, data.length, focusCell, navigateCell],\n )\n\n const onSearchOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n store.setState('searchOpen', true)\n return\n }\n\n const currentState = store.getState()\n const currentMatch = currentState.matchIndex >= 0 && currentState.searchMatches[currentState.matchIndex]\n\n store.batch(() => {\n store.setState('searchOpen', false)\n store.setState('searchQuery', '')\n store.setState('searchMatches', [])\n store.setState('matchIndex', -1)\n\n if (currentMatch) {\n store.setState('focusedCell', {\n rowIndex: currentMatch.rowIndex,\n columnId: currentMatch.columnId,\n })\n }\n })\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus()\n }\n },\n [store],\n )\n\n const onSearch = React.useCallback(\n (query: string) => {\n if (!query.trim()) {\n store.batch(() => {\n store.setState('searchMatches', [])\n store.setState('matchIndex', -1)\n })\n return\n }\n\n const matches: CellPosition[] = []\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n\n const lowerQuery = query.toLowerCase()\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex]\n if (!row) {\n continue\n }\n\n for (const columnId of columnIds) {\n const cell = row.getVisibleCells().find((c) => c.column.id === columnId)\n if (!cell) {\n continue\n }\n\n const value = cell.getValue()\n const stringValue = String(value ?? '').toLowerCase()\n\n if (stringValue.includes(lowerQuery)) {\n matches.push({ rowIndex, columnId })\n }\n }\n }\n\n store.batch(() => {\n store.setState('searchMatches', matches)\n store.setState('matchIndex', matches.length > 0 ? 0 : -1)\n })\n\n // Scroll to first match but don't focus it (to keep focus in search input)\n if (matches.length > 0 && matches[0]) {\n const firstMatch = matches[0]\n rowVirtualizerRef.current?.scrollToIndex(firstMatch.rowIndex, {\n align: 'center',\n })\n }\n },\n [columnIds, store],\n )\n\n const onSearchQueryChange = React.useCallback((query: string) => store.setState('searchQuery', query), [store])\n\n const onNavigateToPrevMatch = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.searchMatches.length === 0) {\n return\n }\n\n const prevIndex =\n currentState.matchIndex - 1 < 0 ? currentState.searchMatches.length - 1 : currentState.matchIndex - 1\n const match = currentState.searchMatches[prevIndex]\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: 'center',\n })\n\n requestAnimationFrame(() => {\n store.setState('matchIndex', prevIndex)\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId)\n })\n })\n }\n }, [store, focusCell])\n\n const onNavigateToNextMatch = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.searchMatches.length === 0) {\n return\n }\n\n const nextIndex = (currentState.matchIndex + 1) % currentState.searchMatches.length\n const match = currentState.searchMatches[nextIndex]\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: 'center',\n })\n\n requestAnimationFrame(() => {\n store.setState('matchIndex', nextIndex)\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId)\n })\n })\n }\n }, [store, focusCell])\n\n const getIsSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return searchMatches.some((match) => match.rowIndex === rowIndex && match.columnId === columnId)\n },\n [searchMatches],\n )\n\n const getIsActiveSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n if (matchIndex < 0) {\n return false\n }\n const currentMatch = searchMatches[matchIndex]\n return currentMatch?.rowIndex === rowIndex && currentMatch?.columnId === columnId\n },\n [searchMatches, matchIndex],\n )\n\n const blurCell = React.useCallback(() => {\n const currentState = store.getState()\n if (currentState.editingCell && document.activeElement instanceof HTMLElement) {\n document.activeElement.blur()\n }\n\n store.batch(() => {\n store.setState('focusedCell', null)\n store.setState('editingCell', null)\n })\n }, [store])\n\n const onCellClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n // Ignore right-click (button 2) - let onCellContextMenu handle it\n if (event?.button === 2) {\n return\n }\n\n const currentState = store.getState()\n const currentFocused = currentState.focusedCell\n\n if (event) {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n const cellKey = getCellKey(rowIndex, columnId)\n const newSelectedCells = new Set(currentState.selectionState.selectedCells)\n\n if (newSelectedCells.has(cellKey)) {\n newSelectedCells.delete(cellKey)\n } else {\n newSelectedCells.add(cellKey)\n }\n\n store.setState('selectionState', {\n selectedCells: newSelectedCells,\n selectionRange: null,\n isSelecting: false,\n })\n focusCell(rowIndex, columnId)\n return\n }\n\n if (event.shiftKey && currentState.focusedCell) {\n event.preventDefault()\n selectRange(currentState.focusedCell, { rowIndex, columnId })\n return\n }\n }\n\n // Clear selection if there are selected cells or rows\n const hasSelectedCells = currentState.selectionState.selectedCells.size > 0\n const hasSelectedRows = Object.keys(currentState.rowSelection).length > 0\n\n if (hasSelectedCells && !currentState.selectionState.isSelecting) {\n // If there's a cell selection but we're not actively selecting (drag just finished),\n // don't clear it - keep the selection\n // Only clear if clicking elsewhere\n const cellKey = getCellKey(rowIndex, columnId)\n const isClickingSelectedCell = currentState.selectionState.selectedCells.has(cellKey)\n\n if (!isClickingSelectedCell) {\n clearSelection()\n } else {\n // Clicking on an already selected cell - just focus it\n focusCell(rowIndex, columnId)\n return\n }\n } else if (hasSelectedRows && columnId !== 'select') {\n // If there are selected rows but we're clicking on a non-checkbox cell, clear selections\n clearSelection()\n }\n\n if (currentFocused?.rowIndex === rowIndex && currentFocused?.columnId === columnId) {\n onCellEditingStart(rowIndex, columnId)\n } else {\n focusCell(rowIndex, columnId)\n }\n },\n [store, focusCell, onCellEditingStart, selectRange, clearSelection],\n )\n\n const onCellDoubleClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.defaultPrevented) {\n return\n }\n\n onCellEditingStart(rowIndex, columnId)\n },\n [onCellEditingStart],\n )\n\n const onCellMouseDown = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n // Ignore right-click (button 2) - let onCellContextMenu handle it\n if (event.button === 2) {\n return\n }\n\n event.preventDefault()\n\n // Only start drag selection if no modifier keys are pressed\n // Clear any existing selection and prepare for potential drag\n if (!event.ctrlKey && !event.metaKey && !event.shiftKey) {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set(),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId },\n },\n isSelecting: true,\n })\n store.setState('rowSelection', {})\n })\n }\n },\n [store],\n )\n\n const onCellMouseEnter = React.useCallback(\n (rowIndex: number, columnId: string, _event: React.MouseEvent) => {\n const currentState = store.getState()\n if (currentState.selectionState.isSelecting && currentState.selectionState.selectionRange) {\n const start = currentState.selectionState.selectionRange.start\n const end = { rowIndex, columnId }\n\n if (\n currentState.focusedCell?.rowIndex !== start.rowIndex ||\n currentState.focusedCell?.columnId !== start.columnId\n ) {\n focusCell(start.rowIndex, start.columnId)\n }\n\n selectRange(start, end, true)\n }\n },\n [store, selectRange, focusCell],\n )\n\n const onCellMouseUp = React.useCallback(() => {\n const currentState = store.getState()\n store.setState('selectionState', {\n ...currentState.selectionState,\n isSelecting: false,\n })\n }, [store])\n\n const onCellContextMenu = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n const currentState = store.getState()\n const cellKey = getCellKey(rowIndex, columnId)\n const isTargetCellSelected = currentState.selectionState.selectedCells.has(cellKey)\n\n // If right-clicking on a non-selected cell, select only that cell\n if (!isTargetCellSelected) {\n store.batch(() => {\n store.setState('selectionState', {\n selectedCells: new Set([cellKey]),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId },\n },\n isSelecting: false,\n })\n store.setState('focusedCell', { rowIndex, columnId })\n })\n }\n\n // Open context menu at cursor position\n store.setState('contextMenu', {\n open: true,\n x: event.clientX,\n y: event.clientY,\n })\n },\n [store],\n )\n\n const onContextMenuOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n const currentMenu = store.getState().contextMenu\n store.setState('contextMenu', {\n open: false,\n x: currentMenu.x,\n y: currentMenu.y,\n })\n }\n },\n [store],\n )\n\n const onDataGridKeyDown = React.useCallback(\n (event: KeyboardEvent) => {\n const currentState = store.getState()\n const { key, ctrlKey, metaKey, shiftKey } = event\n const isCtrlPressed = ctrlKey || metaKey\n\n // Handle Cmd+F / Ctrl+F to open search (highest priority, works even when editing)\n if (enableSearch && isCtrlPressed && key === SEARCH_SHORTCUT_KEY) {\n event.preventDefault()\n onSearchOpenChange(true)\n return\n }\n\n // Handle search navigation when search is open\n if (enableSearch && currentState.searchOpen && !currentState.editingCell) {\n if (key === 'Enter') {\n event.preventDefault()\n if (shiftKey) {\n onNavigateToPrevMatch()\n } else {\n onNavigateToNextMatch()\n }\n return\n }\n if (key === 'Escape') {\n event.preventDefault()\n onSearchOpenChange(false)\n return\n }\n // When search is open, don't let data grid handle any other keys\n // (they should only affect the search input)\n return\n }\n\n if (currentState.editingCell) {\n return\n }\n\n if (!currentState.focusedCell) {\n return\n }\n\n let direction: NavigationDirection | null = null\n\n if (isCtrlPressed && key === 'a') {\n event.preventDefault()\n selectAll()\n return\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n if (currentState.selectionState.selectedCells.size > 0) {\n event.preventDefault()\n // If any selected cell is not editable, do nothing (mirror context-menu Clear behavior)\n const currentTable = tableRef.current\n const visibleCols = currentTable?.getVisibleLeafColumns() ?? []\n let canClear = true\n for (const cellKey of currentState.selectionState.selectedCells) {\n if (!canClear) {\n break\n }\n const { columnId } = parseCellKey(cellKey)\n const col = visibleCols.find((c) => c.id === columnId)\n const editable = col?.columnDef?.meta?.editable\n if (editable === false) {\n canClear = false\n }\n }\n\n if (!canClear) {\n return\n }\n\n const updates: {\n rowIndex: number\n columnId: string\n value: unknown\n }[] = []\n\n currentState.selectionState.selectedCells.forEach((cellKey) => {\n const { rowIndex, columnId } = parseCellKey(cellKey)\n updates.push({ rowIndex, columnId, value: '' })\n })\n\n onDataUpdate(updates)\n clearSelection()\n }\n return\n }\n\n switch (key) {\n case 'ArrowUp':\n direction = 'up'\n break\n case 'ArrowDown':\n direction = 'down'\n break\n case 'ArrowLeft':\n direction = 'left'\n break\n case 'ArrowRight':\n direction = 'right'\n break\n case 'Home':\n direction = isCtrlPressed ? 'ctrl+home' : 'home'\n break\n case 'End':\n direction = isCtrlPressed ? 'ctrl+end' : 'end'\n break\n case 'PageUp':\n direction = 'pageup'\n break\n case 'PageDown':\n direction = 'pagedown'\n break\n case 'Escape':\n event.preventDefault()\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n clearSelection()\n } else {\n blurCell()\n }\n return\n case 'F2':\n // Enter edit mode on the focused cell\n if (currentState.focusedCell) {\n event.preventDefault()\n onCellEditingStart(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId)\n }\n return\n case 'Enter':\n event.preventDefault()\n direction = shiftKey ? 'up' : 'down'\n break\n case 'Tab':\n event.preventDefault()\n direction = event.shiftKey ? 'left' : 'right'\n break\n }\n\n if (direction) {\n event.preventDefault()\n\n // Tab navigation should not trigger selection, even with Shift\n if (shiftKey && key !== 'Tab' && currentState.focusedCell) {\n const _navCols = getNavigableColumnIds()\n const currentColIndex = _navCols.indexOf(currentState.focusedCell.columnId)\n let newRowIndex = currentState.focusedCell.rowIndex\n let newColumnId = currentState.focusedCell.columnId\n\n switch (direction) {\n case 'up':\n newRowIndex = Math.max(0, currentState.focusedCell.rowIndex - 1)\n break\n case 'down':\n newRowIndex = Math.min(\n (tableRef.current?.getRowModel().rows.length || data.length) - 1,\n currentState.focusedCell.rowIndex + 1,\n )\n break\n case 'left':\n if (currentColIndex > 0) {\n const prevColumnId = _navCols[currentColIndex - 1]\n if (prevColumnId) {\n newColumnId = prevColumnId\n }\n }\n break\n case 'right':\n if (currentColIndex < _navCols.length - 1) {\n const nextColumnId = _navCols[currentColIndex + 1]\n if (nextColumnId) {\n newColumnId = nextColumnId\n }\n }\n break\n }\n\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell\n selectRange(selectionStart, {\n rowIndex: newRowIndex,\n columnId: newColumnId,\n })\n focusCell(newRowIndex, newColumnId)\n } else {\n if (currentState.selectionState.selectedCells.size > 0) {\n clearSelection()\n }\n navigateCell(direction)\n }\n }\n },\n [\n store,\n blurCell,\n navigateCell,\n selectAll,\n onDataUpdate,\n clearSelection,\n getNavigableColumnIds,\n data.length,\n selectRange,\n focusCell,\n onSearchOpenChange,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n enableSearch,\n onCellEditingStart,\n ],\n )\n\n const onSortingChange = React.useCallback(\n (updater: Updater<SortingState>) => {\n // If using server-side sorting (manualSorting), call external callback\n if (manualSorting && externalOnSortingChange) {\n externalOnSortingChange(updater)\n } else {\n // Otherwise use internal state\n const currentState = store.getState()\n const newSorting = typeof updater === 'function' ? updater(currentState.sorting) : updater\n store.setState('sorting', newSorting)\n }\n },\n [store, manualSorting, externalOnSortingChange],\n )\n\n const onRowSelectionChange = React.useCallback(\n (updater: Updater<RowSelectionState>) => {\n const currentState = store.getState()\n const newRowSelection = typeof updater === 'function' ? updater(currentState.rowSelection) : updater\n\n const selectedRows = Object.keys(newRowSelection).filter((key) => newRowSelection[key])\n\n const selectedCells = new Set<string>()\n const rows = tableRef.current?.getRowModel().rows ?? []\n\n for (const rowId of selectedRows) {\n const rowIndex = rows.findIndex((r) => r.id === rowId)\n if (rowIndex === -1) {\n continue\n }\n\n for (const columnId of columnIds) {\n selectedCells.add(getCellKey(rowIndex, columnId))\n }\n }\n\n store.batch(() => {\n store.setState('rowSelection', newRowSelection)\n store.setState('selectionState', {\n selectedCells,\n selectionRange: null,\n isSelecting: false,\n })\n store.setState('focusedCell', null)\n store.setState('editingCell', null)\n })\n },\n [store, columnIds],\n )\n\n const onRowSelect = React.useCallback(\n (rowIndex: number, selected: boolean, shiftKey: boolean) => {\n const currentState = store.getState()\n const rows = tableRef.current?.getRowModel().rows ?? []\n const currentRow = rows[rowIndex]\n if (!currentRow) {\n return\n }\n\n if (shiftKey && currentState.lastClickedRowIndex !== null) {\n const startIndex = Math.min(currentState.lastClickedRowIndex, rowIndex)\n const endIndex = Math.max(currentState.lastClickedRowIndex, rowIndex)\n\n const newRowSelection: RowSelectionState = {\n ...currentState.rowSelection,\n }\n\n for (let i = startIndex; i <= endIndex; i++) {\n const row = rows[i]\n if (row) {\n newRowSelection[row.id] = selected\n }\n }\n\n onRowSelectionChange(newRowSelection)\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected,\n })\n }\n\n store.setState('lastClickedRowIndex', rowIndex)\n },\n [store, onRowSelectionChange],\n )\n\n const onRowHeightChange = React.useCallback(\n (updater: Updater<RowHeightValue>) => {\n const currentState = store.getState()\n const newRowHeight = typeof updater === 'function' ? updater(currentState.rowHeight) : updater\n store.setState('rowHeight', newRowHeight)\n },\n [store],\n )\n\n const onColumnClick = React.useCallback(\n (columnId: string) => {\n if (!enableColumnSelection) {\n clearSelection()\n return\n }\n\n selectColumn(columnId)\n },\n [enableColumnSelection, selectColumn, clearSelection],\n )\n\n const defaultColumn: Partial<ColumnDef<TData>> = React.useMemo(\n () => ({\n cell: DataGridCell,\n minSize: MIN_COLUMN_SIZE,\n maxSize: MAX_COLUMN_SIZE,\n }),\n [],\n )\n\n // Use external sorting state when manualSorting is true, otherwise use internal state\n const effectiveSorting = manualSorting && externalSorting ? externalSorting : sorting\n\n const tableOptions = React.useMemo<TableOptions<TData>>(\n () => ({\n ...dataGridPropsRef.current,\n data,\n columns,\n defaultColumn,\n initialState: mergedInitialState,\n manualSorting,\n state: {\n ...dataGridPropsRef.current.state,\n sorting: effectiveSorting,\n rowSelection,\n },\n onRowSelectionChange,\n onSortingChange,\n columnResizeMode: 'onChange',\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n meta: {\n ...dataGridPropsRef.current.meta,\n dataGridRef,\n focusedCell,\n editingCell,\n selectionState,\n searchOpen,\n rowHeight,\n isScrolling,\n highlightedRowIndex,\n // Immediate (non-debounced) row click handler for mouse clicks\n // Keyboard navigation uses debouncedRowClick instead (see navigateCell)\n onRowClick: onRowClickProp,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n onRowHeightChange,\n onRowSelect,\n onRowsDelete: onRowsDeleteProp ? onRowsDelete : undefined,\n onDataUpdate,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n contextMenu,\n onContextMenuOpenChange,\n },\n }),\n [\n dataGridPropsRef,\n data,\n columns,\n defaultColumn,\n mergedInitialState,\n effectiveSorting,\n manualSorting,\n rowSelection,\n onRowSelectionChange,\n onSortingChange,\n focusedCell,\n editingCell,\n selectionState,\n searchOpen,\n isScrolling,\n highlightedRowIndex,\n onRowClickProp,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n onDataUpdate,\n onRowsDeleteProp,\n onRowsDelete,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n contextMenu,\n onContextMenuOpenChange,\n rowHeight,\n onRowHeightChange,\n onRowSelect,\n ],\n )\n\n const table = useReactTable(tableOptions)\n\n if (!tableRef.current) {\n tableRef.current = table\n }\n\n // Extract columnSizing and columnVisibility so they can be used in hook dependency arrays\n const columnSizing = table.getState().columnSizing\n const columnVisibility = table.getState().columnVisibility\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: we need to memoize the column size vars\n const columnSizeVars = React.useMemo(() => {\n // reference these so they are used dependencies (recomputes when sizing or visibility changes)\n void columnSizing\n void columnVisibility\n const headers = table.getFlatHeaders()\n const colSizes: Record<string, number> = {}\n for (const header of headers) {\n // Prefer the current header size, but fall back to the columnDef `size`\n // or the MIN_COLUMN_SIZE so the CSS variables exist on first render.\n const headerSize =\n (typeof header.getSize === 'function' ? header.getSize() : undefined) ??\n (header.column.columnDef as any)?.size ??\n MIN_COLUMN_SIZE\n const colSize =\n (typeof header.column.getSize === 'function' ? header.column.getSize() : undefined) ??\n (header.column.columnDef as any)?.size ??\n MIN_COLUMN_SIZE\n\n colSizes[`--header-${header.id}-size`] = headerSize\n colSizes[`--col-${header.column.id}-size`] = colSize\n }\n return colSizes\n // Recompute whenever the table's column sizing or visibility state changes\n }, [table, columnSizing, columnVisibility])\n\n // Track loaded row count for infinite scroll detection\n const loadedRowCount = table.getRowModel().rows.length\n // Use totalRowCount for scrollbar sizing if provided, otherwise use loaded count\n const virtualizerRowCount = totalRowCount ?? loadedRowCount\n\n const rowVirtualizer = useVirtualizer({\n count: virtualizerRowCount,\n getScrollElement: () => dataGridRef.current,\n estimateSize: () => rowHeightValue,\n overscan,\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1\n ? (element) => element?.getBoundingClientRect().height\n : undefined,\n onChange: (instance) => {\n // Sync virtualizer's isScrolling state to our store\n const virtualizerIsScrolling = instance.isScrolling\n const currentIsScrolling = store.getState().isScrolling\n\n if (virtualizerIsScrolling !== currentIsScrolling) {\n store.setState('isScrolling', virtualizerIsScrolling)\n }\n\n const virtualItems = instance.getVirtualItems()\n if (virtualItems.length === 0) {\n return\n }\n\n // Trigger onLoadMore when approaching the end of loaded data\n if (onLoadMore) {\n const lastVirtualItem = virtualItems.at(-1)\n // Load more when within threshold rows of the end (gives time to fetch before reaching bottom)\n if (lastVirtualItem && lastVirtualItem.index >= loadedRowCount - loadMoreThreshold) {\n onLoadMore()\n }\n }\n\n // Update row positions directly on DOM - batched via rAF for performance\n requestAnimationFrame(() => {\n for (const virtualRow of virtualItems) {\n const rowRef = rowMapRef.current.get(virtualRow.index)\n if (rowRef) {\n rowRef.style.transform = `translateY(${virtualRow.start}px)`\n }\n }\n })\n },\n })\n\n if (!rowVirtualizerRef.current) {\n rowVirtualizerRef.current = rowVirtualizer\n }\n\n const onScrollToRow = React.useCallback(\n (opts: Partial<CellPosition>) => {\n const rowIndex = opts?.rowIndex ?? 0\n const columnId = opts?.columnId\n\n rowVirtualizer.scrollToIndex(rowIndex, {\n align: 'center',\n })\n\n const targetColumnId = columnId ?? getNavigableColumnIds()[0]\n\n if (!targetColumnId) {\n return\n }\n\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n store.batch(() => {\n store.setState('focusedCell', {\n rowIndex,\n columnId: targetColumnId,\n })\n store.setState('editingCell', null)\n })\n })\n })\n })\n },\n [rowVirtualizer, getNavigableColumnIds, store],\n )\n\n const onRowAdd = React.useCallback(\n async (event?: React.MouseEvent<HTMLDivElement>) => {\n if (!onRowAddProp) {\n return\n }\n\n const result = await onRowAddProp(event)\n\n if (event?.defaultPrevented || result === null) {\n return\n }\n\n const currentTable = tableRef.current\n const rows = currentTable?.getRowModel().rows ?? []\n\n if (result) {\n const adjustedRowIndex = (result.rowIndex ?? 0) >= rows.length ? rows.length : result.rowIndex\n\n onScrollToRow({\n rowIndex: adjustedRowIndex,\n columnId: result.columnId,\n })\n return\n }\n\n onScrollToRow({ rowIndex: rows.length })\n },\n [onRowAddProp, onScrollToRow],\n )\n\n // Persist table column state (order, visibility, pinning) whenever it changes.\n // Use a layout effect so persistence stays in sync with table layout updates.\n useIsomorphicLayoutEffect(() => {\n if (!storageKey) {\n return\n }\n\n try {\n const state = table.getState()\n const payload = {\n columnOrder: state.columnOrder,\n columnVisibility: state.columnVisibility,\n columnPinning: state.columnPinning,\n }\n localStorage.setItem(storageKey, JSON.stringify(payload))\n } catch (_) {\n // ignore storage errors\n }\n }, [storageKey, table.getState().columnOrder, table.getState().columnVisibility, table.getState().columnPinning])\n\n const searchState = React.useMemo<SearchState | undefined>(() => {\n if (!enableSearch) {\n return undefined\n }\n\n return {\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n }\n }, [\n enableSearch,\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n ])\n\n React.useEffect(() => {\n const dataGridElement = dataGridRef.current\n if (!dataGridElement) {\n return\n }\n\n dataGridElement.addEventListener('keydown', onDataGridKeyDown)\n return () => {\n dataGridElement.removeEventListener('keydown', onDataGridKeyDown)\n }\n }, [onDataGridKeyDown])\n\n React.useEffect(() => {\n function onGlobalKeyDown(event: KeyboardEvent) {\n const dataGridElement = dataGridRef.current\n if (!dataGridElement) {\n return\n }\n\n const target = event.target\n if (!(target instanceof HTMLElement)) {\n return\n }\n\n const { key, ctrlKey, metaKey } = event\n const isCtrlPressed = ctrlKey || metaKey\n\n if (enableSearch && isCtrlPressed && key === SEARCH_SHORTCUT_KEY) {\n const isInInput = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA'\n const isInDataGrid = dataGridElement.contains(target)\n const isInSearchInput = target.closest('[role=search]') !== null\n\n if (isInDataGrid || isInSearchInput || !isInInput) {\n event.preventDefault()\n event.stopPropagation()\n onSearchOpenChange(true)\n\n if (!isInDataGrid && !isInSearchInput) {\n requestAnimationFrame(() => {\n dataGridElement.focus()\n })\n }\n return\n }\n }\n\n const isInDataGrid = dataGridElement.contains(target)\n if (!isInDataGrid) {\n return\n }\n\n if (key === 'Escape') {\n const currentState = store.getState()\n const hasSelections =\n currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0\n\n if (hasSelections) {\n event.preventDefault()\n event.stopPropagation()\n clearSelection()\n }\n }\n }\n\n globalThis.addEventListener('keydown', onGlobalKeyDown, true)\n return () => {\n globalThis.removeEventListener('keydown', onGlobalKeyDown, true)\n }\n }, [enableSearch, onSearchOpenChange, store, clearSelection])\n\n React.useEffect(() => {\n const currentState = store.getState()\n if (autoFocus && data.length > 0 && columns.length > 0 && !currentState.focusedCell) {\n const _nav = getNavigableColumnIds()\n if (_nav.length > 0) {\n const rafId = requestAnimationFrame(() => {\n if (typeof autoFocus === 'object') {\n const { rowIndex, columnId } = autoFocus\n if (columnId) {\n focusCell(rowIndex ?? 0, columnId)\n }\n return\n }\n\n const firstColumnId = _nav[0]\n if (firstColumnId) {\n focusCell(0, firstColumnId)\n }\n })\n return () => cancelAnimationFrame(rafId)\n }\n }\n return undefined\n }, [autoFocus, data.length, columns.length, store, getNavigableColumnIds, focusCell])\n\n React.useEffect(() => {\n function onOutsideClick(event: MouseEvent) {\n if (event.button === 2) {\n return\n }\n\n if (dataGridRef.current && !dataGridRef.current.contains(event.target as Node)) {\n const target = event.target\n const isInsidePopover =\n target instanceof HTMLElement &&\n (target.closest('[data-grid-cell-editor]') || target.closest('[data-grid-popover]'))\n\n if (!isInsidePopover) {\n blurCell()\n const currentState = store.getState()\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n clearSelection()\n }\n }\n }\n }\n\n document.addEventListener('mousedown', onOutsideClick)\n return () => {\n document.removeEventListener('mousedown', onOutsideClick)\n }\n }, [store, blurCell, clearSelection])\n\n React.useEffect(() => {\n function onCleanup() {\n document.removeEventListener('selectstart', preventSelection)\n document.removeEventListener('contextmenu', preventContextMenu)\n document.body.style.userSelect = ''\n }\n\n function preventSelection(event: Event) {\n event.preventDefault()\n }\n function preventContextMenu(event: Event) {\n event.preventDefault()\n }\n\n const onUnsubscribe = store.subscribe(() => {\n const currentState = store.getState()\n if (currentState.selectionState.isSelecting) {\n document.addEventListener('selectstart', preventSelection)\n document.addEventListener('contextmenu', preventContextMenu)\n document.body.style.userSelect = 'none'\n } else {\n onCleanup()\n }\n })\n\n return () => {\n onCleanup()\n onUnsubscribe()\n }\n }, [store])\n\n useIsomorphicLayoutEffect(() => {\n const rafId = requestAnimationFrame(() => {\n rowVirtualizer.measure()\n })\n return () => cancelAnimationFrame(rafId)\n }, [\n data,\n table.getState().columnFilters,\n table.getState().columnOrder,\n table.getState().columnPinning,\n table.getState().columnSizing,\n table.getState().columnVisibility,\n table.getState().expanded,\n table.getState().globalFilter,\n table.getState().grouping,\n table.getState().rowSelection,\n table.getState().sorting,\n rowHeight,\n ])\n\n return {\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n table,\n rowVirtualizer,\n searchState,\n columnSizeVars,\n onRowAdd: onRowAddProp ? onRowAdd : undefined,\n }\n}\n\nexport { useDataGrid, type UseDataGridProps }\n","import { CalendarIcon } from '@radix-ui/react-icons'\n\nimport { format } from 'date-fns'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Calendar } from '../calendar/calendar'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\n\nexport function DatePickerDemo() {\n const [date, setDate] = React.useState<Date>()\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant={'outline'}\n className={cn('w-[240px] justify-start text-left font-normal', !date && 'text-muted-foreground')}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {date ? format(date, 'PPP') : <span>Pick a date</span>}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar mode=\"single\" selected={date} onSelect={setDate} initialFocus />\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { Drawer as DrawerPrimitive } from 'vaul'\n\nimport { cn } from '../lib/utils'\n\nconst Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) => (\n <DrawerPrimitive.Root shouldScaleBackground={shouldScaleBackground} {...props} />\n)\nDrawer.displayName = 'Drawer'\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerPortal = DrawerPrimitive.Portal\n\nconst DrawerClose = DrawerPrimitive.Close\n\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Overlay ref={ref} className={cn('fixed inset-0 z-50 bg-black/80', className)} {...props} />\n))\nDrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background',\n className,\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n))\nDrawerContent.displayName = 'DrawerContent'\n\nconst DrawerHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('grid gap-1.5 p-4 text-center sm:text-left', className)} {...props} />\n)\nDrawerHeader.displayName = 'DrawerHeader'\n\nconst DrawerFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />\n)\nDrawerFooter.displayName = 'DrawerFooter'\n\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nDrawerTitle.displayName = DrawerPrimitive.Title.displayName\n\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nDrawerDescription.displayName = DrawerPrimitive.Description.displayName\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","import * as LabelPrimitive from '@radix-ui/react-label'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\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-base 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","import * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn('shrink-0 bg-border', orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]', className)}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { useMemo } from 'react'\n\nimport { Label } from '../label/label'\nimport { cn } from '../lib/utils'\nimport { Separator } from '../separator/separator'\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n 'flex flex-col gap-6',\n 'has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium', 'data-[variant=legend]:text-base', 'data-[variant=label]:text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva('group/field flex w-full gap-3 data-[invalid=true]:text-destructive', {\n variants: {\n orientation: {\n vertical: ['flex-col [&>*]:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '[&>[data-slot=field-label]]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto',\n '@md/field-group:[&>[data-slot=field-label]]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\nfunction Field({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<'fieldset'> & VariantProps<typeof fieldVariants>) {\n return (\n <fieldset\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), 'border-0 p-0 m-0', className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn('group/field-content flex flex-1 flex-col gap-1.5 leading-snug', className)}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50',\n 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4',\n 'has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n 'text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance',\n 'last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5',\n '[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'div'> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<'div'> & {\n errors?: ({ message?: string } | undefined)[]\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map((error) => error?.message && <li key={error.message}>{error.message}</li>)}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn('text-destructive text-sm font-normal', className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","import * as React from 'react'\n\nexport function useIsMobile(mobileBreakpoint = 768) {\n const [isMobile, setIsMobile] = React.useState<boolean>(false)\n\n React.useEffect(() => {\n const mql = globalThis.matchMedia(`(max-width: ${mobileBreakpoint - 1}px)`)\n const onChange = () => {\n setIsMobile(globalThis.innerWidth < mobileBreakpoint)\n }\n mql.addEventListener('change', onChange)\n setIsMobile(globalThis.innerWidth < mobileBreakpoint)\n return () => mql.removeEventListener('change', onChange)\n }, [mobileBreakpoint])\n\n return isMobile\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nimport { inputVariants } from './input'\n\n/**\n * Format configuration for number display using Intl.NumberFormat options\n */\nexport type NumberFormatConfig = {\n /**\n * Locale string (e.g., 'en-US', 'de-DE', 'fr-FR')\n * Defaults to user's browser locale if not specified\n */\n locale?: string\n /**\n * Intl.NumberFormat options for fine-grained control\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat\n */\n options?: Intl.NumberFormatOptions\n}\n\n/**\n * Number formatter - either a custom function or Intl.NumberFormat configuration\n */\nexport type NumberFormatter = ((value: number) => string) | NumberFormatConfig\n\n/**\n * Formats a number according to the provided formatter\n */\nfunction formatNumber(value: number, formatter: NumberFormatter, intlFormatter?: Intl.NumberFormat): string {\n // If formatter is a function, use it directly\n if (typeof formatter === 'function') {\n return formatter(value)\n }\n\n // Use the memoized formatter if provided, otherwise create a new one\n if (intlFormatter) {\n return intlFormatter.format(value)\n }\n\n // Fallback: create formatter (should rarely happen if memoization works)\n const { locale, options } = formatter\n return new Intl.NumberFormat(locale, options).format(value)\n}\n\n/**\n * Parses a formatted string back to a number using the format configuration\n * This is more robust than heuristics as it uses the actual locale/format settings\n */\nfunction parseFormattedNumber(\n formatted: string,\n formatter: NumberFormatter,\n intlFormatter?: Intl.NumberFormat,\n): number | undefined {\n if (formatted === '') {\n return undefined\n }\n\n // If formatter is a function, we can't determine the format rules,\n // so fall back to a best-effort heuristic parser\n if (typeof formatter === 'function') {\n return parseFormattedNumberHeuristic(formatted)\n }\n\n // Use the memoized formatter if provided, otherwise create a new one\n const formatterToUse = intlFormatter ?? new Intl.NumberFormat(formatter.locale, formatter.options)\n const parts = formatterToUse.formatToParts(12345.6)\n\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ''\n const decimalSeparator = parts.find((p) => p.type === 'decimal')?.value ?? '.'\n\n // Normalize the input by removing group separators and replacing decimal separator\n const normalized = formatted\n .replaceAll(groupSeparator, '')\n .replaceAll(decimalSeparator, '.')\n .replaceAll(/[^\\d.-]/g, '') // Strip all non-numeric characters (currency symbols, %, spaces, etc.)\n\n let parsed = Number(normalized)\n if (Number.isNaN(parsed)) {\n return undefined\n }\n\n // Handle percentage formatting: Intl.NumberFormat with style: 'percent' multiplies by 100\n // So \"85%\" represents 0.85. When parsing back, we need to divide by 100.\n if (formatter.options?.style === 'percent') {\n parsed = parsed / 100\n }\n\n return parsed\n}\n\n/**\n * Fallback parser for custom format functions where we don't know the format rules\n * Uses heuristics to guess the decimal separator\n */\nfunction parseFormattedNumberHeuristic(formatted: string): number | undefined {\n let cleaned = formatted.trim()\n\n // Find the last occurrence of comma or period (potential decimal separator)\n const lastComma = cleaned.lastIndexOf(',')\n const lastPeriod = cleaned.lastIndexOf('.')\n\n // Determine which is the decimal separator based on position\n if (lastComma > lastPeriod) {\n // Comma is likely the decimal separator (e.g., European format)\n cleaned = cleaned.replaceAll(/[.\\s']/g, '') // Remove periods, spaces, apostrophes\n cleaned = cleaned.replace(',', '.') // Replace comma with period (only one occurrence expected)\n } else if (lastPeriod > lastComma) {\n // Period is likely the decimal separator (e.g., US format)\n cleaned = cleaned.replaceAll(/[,\\s']/g, '') // Remove commas, spaces, apostrophes\n } else {\n // No decimal separator found, just remove all grouping chars\n cleaned = cleaned.replaceAll(/[,.\\s']/g, '')\n }\n\n // Remove any remaining non-numeric characters except minus and decimal point\n cleaned = cleaned.replaceAll(/[^0-9.-]/g, '')\n\n const parsed = Number(cleaned)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\n/**\n * Wrapper variants that mirror inputVariants but use focus-within (for wrapper)\n * instead of focus-visible (for input element).\n * Note: When modifying variants, also update inputVariants in input.tsx\n */\nconst numberInputWrapperVariants = cva(\n 'border-input bg-background grid grid-cols-[auto_1fr_auto] items-center overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] has-[input:disabled]:pointer-events-none has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50',\n {\n variants: {\n variant: {\n default: 'min-h-9 focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]',\n simple: 'min-h-8',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nexport type NumberInputProps = Omit<React.ComponentProps<'input'>, 'type' | 'value' | 'defaultValue' | 'onChange'> &\n VariantProps<typeof inputVariants> & {\n /**\n * The current value of the input (controlled mode). Must be a number.\n */\n value?: number\n /**\n * The default value of the input (uncontrolled mode). Must be a number.\n */\n defaultValue?: number\n /**\n * Callback fired when the value changes. Receives the numeric value or undefined.\n * - When the input is empty, receives undefined\n * - When the input contains a valid number, receives that number\n */\n onChange?: (value: number | undefined) => void\n /**\n * Text displayed before the input (e.g., \"$\", \"EUR\")\n */\n prefix?: string\n /**\n * Text displayed after the input (e.g., \"%\", \"kg\", \"USD\")\n */\n suffix?: string\n /**\n * Additional classes for the wrapper container\n */\n wrapperClassName?: string\n /**\n * Display the native browser spin buttons (up/down arrows).\n * Defaults to false.\n */\n showSpinButtons?: boolean\n /**\n * E2E test_id to identify the input.\n */\n __e2e_test_id__?: string\n /**\n * Callback when Enter key is pressed\n */\n onEnter?: () => void\n /**\n * Optional formatter for the number value.\n * Can be a function that takes a number and returns a formatted string,\n * or a configuration object with formatting options.\n * When format is provided, the input switches to text mode to display formatted values.\n */\n format?: NumberFormatter\n }\n\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n className,\n wrapperClassName,\n prefix,\n suffix,\n variant,\n showSpinButtons = false,\n __e2e_test_id__,\n onEnter,\n onChange,\n format,\n value: controlledValue,\n ...props\n },\n ref,\n ) => {\n // Track whether the input is focused - when focused, show raw value for editing\n const [isFocused, setIsFocused] = React.useState(false)\n // Track the raw input string when in focus (for formatted inputs)\n const [inputString, setInputString] = React.useState('')\n\n // Memoize the Intl.NumberFormat instance to avoid recreating it on every render\n const intlFormatter = React.useMemo(() => {\n if (!format || typeof format === 'function') {\n return undefined\n }\n return new Intl.NumberFormat(format.locale, format.options)\n }, [format])\n\n const focusInputAtPosition = (element: HTMLElement, cursor: 'start' | 'end') => {\n const parent = element.parentElement\n if (!parent) {\n return\n }\n\n const input = parent.querySelector('input')\n if (!input) {\n return\n }\n\n // Save the original input type to restore it later\n const originalType = input.type\n\n // Temporarily change input type to text to set cursor position\n // This is needed because setSelectionRange doesn't work on number inputs\n // Only switch if it's currently a number input\n if (originalType === 'number') {\n input.type = 'text'\n }\n\n if (cursor === 'start') {\n input.setSelectionRange(0, 0)\n } else {\n const length = input.value.length\n input.setSelectionRange(length, length)\n }\n\n // Restore the original input type\n input.type = originalType\n input.click()\n input.focus()\n }\n\n const handleLabelClick = (e: React.MouseEvent<HTMLElement, MouseEvent>, cursor: 'start' | 'end') => {\n e.preventDefault()\n focusInputAtPosition(e.target as HTMLElement, cursor)\n }\n\n const handleLabelKeyDown = (e: React.KeyboardEvent<HTMLElement>, cursor: 'start' | 'end') => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n focusInputAtPosition(e.target as HTMLElement, cursor)\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n\n // If we're using formatting, store the raw input string\n if (format) {\n setInputString(value)\n }\n\n // Parse the value based on whether we're using formatting\n let parsedValue: number | undefined\n if (format) {\n // Use format-aware parser that uses the actual locale/format settings\n parsedValue = parseFormattedNumber(value, format, intlFormatter)\n } else {\n // Standard number parsing\n parsedValue = value === '' ? undefined : Number(value)\n }\n\n onChange?.(parsedValue)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false)\n // Clear input string on blur so next focus shows the formatted value without separators\n // This is safe because onChange has already fired synchronously for any typed value\n setInputString('')\n props.onBlur?.(e)\n }\n\n // Determine what value to display in the input\n const displayValue = React.useMemo(() => {\n // When focused and using format, show the raw input string or unformatted value\n if (isFocused && format) {\n // If user is typing, show their input string\n if (inputString !== '') {\n return inputString\n }\n // Otherwise show formatted value without thousands separators\n // This preserves the decimal precision from the format configuration\n if (controlledValue !== undefined) {\n const formatted = formatNumber(controlledValue, format, intlFormatter)\n\n // Remove thousands separators but keep the decimal precision\n if (typeof format !== 'function' && intlFormatter) {\n const parts = intlFormatter.formatToParts(controlledValue)\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ''\n return formatted.replaceAll(groupSeparator, '')\n }\n\n // For custom format functions, just use toString\n return controlledValue.toString()\n }\n return ''\n }\n\n // When not focused and format is provided, show formatted value\n if (!isFocused && format && controlledValue !== undefined) {\n return formatNumber(controlledValue, format, intlFormatter)\n }\n\n // Default: show the raw numeric value\n return controlledValue?.toString() ?? ''\n }, [isFocused, format, inputString, controlledValue, intlFormatter])\n\n return (\n <div className={cn(numberInputWrapperVariants({ variant }), wrapperClassName)}>\n {prefix && (\n <span\n className=\"text-muted-foreground flex h-full cursor-text items-center pl-2 pr-1\"\n onClick={(e) => handleLabelClick(e, 'start')}\n onKeyDown={(e) => handleLabelKeyDown(e, 'start')}\n >\n {prefix}\n </span>\n )}\n <input\n type={format ? 'text' : 'number'}\n data-slot=\"input\"\n className={cn(\n inputVariants({ variant }),\n // Remove border/shadow/ring from input since wrapper handles it\n // Use min-h-full to override min-h-9/min-h-8 from inputVariants - wrapper controls height - never use explicit h-* in input since it breaks the spinner buttons for some browsers\n 'min-h-full border-0 shadow-none focus-visible:ring-0 p-0 tabular-nums',\n !prefix && !suffix ? 'col-span-3' : !prefix || !suffix ? 'col-span-2' : 'col-span-1',\n 'text-right',\n !prefix && 'pl-2',\n !suffix && (showSpinButtons ? 'pr-1' : 'pr-2'),\n !showSpinButtons && !format && 'appearance-none',\n className,\n )}\n data-test-id={__e2e_test_id__}\n ref={ref}\n value={displayValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={(e) => {\n props.onKeyDown?.(e)\n if (e.key === 'Enter') {\n onEnter?.()\n }\n }}\n {...props}\n />\n {suffix && (\n <span\n className={cn(\n 'text-muted-foreground flex h-full cursor-text items-center pr-2',\n showSpinButtons ? 'pl-0' : 'pl-1',\n )}\n onClick={(e) => handleLabelClick(e, 'end')}\n onKeyDown={(e) => handleLabelKeyDown(e, 'end')}\n >\n {suffix}\n </span>\n )}\n </div>\n )\n },\n)\n\nNumberInput.displayName = 'NumberInput'\n\nexport { NumberInput }\n","import { memo } from 'react'\n\n/**\n * Adds a mark tag around all search hits in the text,\n * so that the given searchValues are highlighted in the text\n */\nconst MarkValueRenderer = memo(({ text, searchValues }: { text: string; searchValues: string[] | undefined }) => {\n if (!searchValues || searchValues.length === 0) {\n return <span>{text}</span>\n }\n\n // escape special characters; empty strings are removed using .filter(Boolean)\n const escapedFilterValues = searchValues\n .map((value) => {\n return value.replaceAll(/[|\\\\{}()[\\]^$+*?.]/g, String.raw`\\$&`)\n })\n .filter(Boolean)\n\n // no words to highlight\n if (escapedFilterValues.length === 0) {\n return <span>{text}</span>\n }\n\n // The split method is used to divide the \"text\" string into parts based on the regular expression.\n // This results in an array (\"parts\") where the matching words and the non-matching segments are separated.\n const regex = new RegExp(`(${escapedFilterValues.join('|')})`, 'gi')\n const parts = text.split(regex)\n\n return (\n <span>\n {parts.map((part, index) => {\n // to compare the parts with the words, the parts also have to be escaped\n const escapedPart = part.replaceAll(/[|\\\\{}()[\\]^$+*?.]/g, String.raw`\\$&`)\n return escapedFilterValues.some((escapedWord) => escapedPart.toLowerCase() === escapedWord.toLowerCase()) ? (\n <mark key={`${part}_${index}`} className=\"text-primary font-semibold bg-transparent\">\n {part}\n </mark>\n ) : (\n part\n )\n })}\n </span>\n )\n})\n\nMarkValueRenderer.displayName = 'MarkCellValueRenderer'\n\nexport { MarkValueRenderer }\n","import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'\nimport * as MenubarPrimitive from '@radix-ui/react-menubar'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst MenubarMenu = MenubarPrimitive.Menu\n\nconst MenubarGroup = MenubarPrimitive.Group\n\nconst MenubarPortal = MenubarPrimitive.Portal\n\nconst MenubarSub = MenubarPrimitive.Sub\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn('flex h-9 items-center space-x-1 rounded-md border bg-background p-1 shadow-sm', className)}\n {...props}\n />\n))\nMenubar.displayName = MenubarPrimitive.Root.displayName\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n className,\n )}\n {...props}\n />\n))\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n))\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(({ className, align = 'start', alignOffset = -4, sideOffset = 8, ...props }, ref) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n))\nMenubarContent.displayName = MenubarPrimitive.Content.displayName\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nMenubarItem.displayName = MenubarPrimitive.Item.displayName\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n))\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n))\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n))\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n))\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName\n\nconst MenubarShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />\n}\nMenubarShortcut.displayname = 'MenubarShortcut'\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarSub,\n MenubarShortcut,\n}\n","import { type Dispatch, type PropsWithChildren, type ReactNode, type SetStateAction } from 'react'\n\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../dialog/dialog'\nimport { cn } from '../lib/utils'\n\ntype ModalProps = {\n title?: ReactNode | string\n subtitle?: ReactNode\n showCloseButton?: boolean\n isOpen: boolean\n setIsOpen: Dispatch<SetStateAction<boolean>>\n __e2e_test_id__?: string\n footer?: ReactNode\n controls?: ReactNode[]\n preventClickOutsideToDismiss?: boolean\n size?: 'fit-content' | 'full-height' | 'full-size' | 'fit-content-width'\n contentClass?: string\n onOpenAutoFocus?: (event: Event) => void\n}\n\nexport const Modal = ({\n title = '',\n subtitle,\n isOpen,\n showCloseButton = true,\n setIsOpen,\n children,\n controls = [],\n footer,\n preventClickOutsideToDismiss,\n size = 'fit-content',\n contentClass = '',\n __e2e_test_id__,\n onOpenAutoFocus,\n}: PropsWithChildren<ModalProps>) => {\n return (\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogContent\n onOpenAutoFocus={onOpenAutoFocus}\n className={cn(\n 'sm:max-w-xl min-w-[425px] max-h-[95vh] flex flex-col p-0 gap-0 border-(--discreet-border) rounded',\n size === 'full-height' && 'h-[95vh]',\n size === 'full-size' && 'w-[95vw] h-[95vh] sm:max-w-[95vw]',\n size === 'fit-content-width' && 'max-w-fit w-auto sm:max-w-fit',\n contentClass,\n )}\n showCloseButton={showCloseButton}\n __e2e_test_id__={__e2e_test_id__}\n onInteractOutside={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}\n onEscapeKeyDown={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}\n >\n <DialogHeader\n className={cn(\n 'flex flex-row flex-shrink-0 items-center gap-2 p-3 min-h-10 border-b-1 border-(--discreet-border)',\n showCloseButton ? 'pr-12' : '',\n subtitle ? 'pb-0' : '',\n )}\n >\n <div className=\"overflow-hidden\">\n {title && (\n <DialogTitle className=\"text-xl overflow-hidden text-ellipsis whitespace-nowrap\">{title}</DialogTitle>\n )}\n {subtitle}\n </div>\n {controls.length > 0 && (\n <div className=\"flex flex-grow justify-end items-baseline gap-2 whitespace-nowrap flex-1\">{controls}</div>\n )}\n </DialogHeader>\n\n <div className=\"max-h-full h-full overflow-auto flex-grow\">{children}</div>\n\n {footer && (\n <DialogFooter className=\"sm:justify-center flex-shrink-0 p-3 border-t-1 border-(--discreet-border)\">\n {footer}\n </DialogFooter>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","import { ChevronDownIcon } from '@radix-ui/react-icons'\nimport * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'\n\nimport { cva } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n viewport?: boolean\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn('group/navigation-menu relative flex max-w-max flex-1 items-center justify-center', className)}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn('group flex flex-1 list-none items-center justify-center gap-1', className)}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item data-slot=\"navigation-menu-item\" className={cn('relative', className)} {...props} />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n 'group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1',\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), 'group', className)}\n {...props}\n >\n {children}{' '}\n <ChevronDownIcon\n className=\"relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n 'data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto',\n 'group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div className={cn('absolute top-full left-0 isolate z-50 flex justify-center')}>\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n 'origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]',\n className,\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction NavigationMenuLink({ className, ...props }: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"data-[active=true]:focus:bg-accent data-[active=true]:hover:bg-accent data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-ring/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n 'data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden',\n className,\n )}\n {...props}\n >\n <div className=\"bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n}\n","import { ChevronLeftIcon, ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons'\n\nimport * as React from 'react'\n\nimport { ButtonProps, buttonVariants } from '../button/button'\nimport { cn } from '../lib/utils'\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn('mx-auto flex w-full justify-center', className)}\n {...props}\n />\n)\nPagination.displayName = 'Pagination'\n\nconst PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul ref={ref} className={cn('flex flex-row items-center gap-1', className)} {...props} />\n ),\n)\nPaginationContent.displayName = 'PaginationContent'\n\nconst PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn('', className)} {...props} />\n))\nPaginationItem.displayName = 'PaginationItem'\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, 'size'> &\n React.ComponentProps<'a'>\n\nconst PaginationLink = ({ className, isActive, size = 'icon', children, ...props }: PaginationLinkProps) => (\n <a\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? 'outline' : 'ghost',\n size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </a>\n)\nPaginationLink.displayName = 'PaginationLink'\n\nconst PaginationPrevious = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink aria-label=\"Go to previous page\" size=\"default\" className={cn('gap-1 pl-2.5', className)} {...props}>\n <ChevronLeftIcon className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = 'PaginationPrevious'\n\nconst PaginationNext = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink aria-label=\"Go to next page\" size=\"default\" className={cn('gap-1 pr-2.5', className)} {...props}>\n <span>Next</span>\n <ChevronRightIcon className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = 'PaginationNext'\n\nconst PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span aria-hidden className={cn('flex h-9 w-9 items-center justify-center', className)} {...props}>\n <DotsHorizontalIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = 'PaginationEllipsis'\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import type { CSSProperties } from 'react'\n\nexport const Progress = ({ value, size = '100%' }: { value: number; size?: string }) => {\n return (\n <div\n style={{ '--parent-width': size } as CSSProperties}\n className=\"w-(--parent-width) flex justify-center relative rounded-md overflow-hidden h-2 mt-8\"\n >\n <div className=\"w-full absolute top-0 left-0 h-2.5 bg-(--discreet-border)\" data-testid=\"progress-bg\" />\n <div\n style={{ '--child-width': `calc(${value}*100%)` } as CSSProperties}\n className=\"w-(--child-width) absolute h-2.5 top-0 left-0 bg-primary\"\n data-testid=\"progress-filled\"\n />\n </div>\n )\n}\n","import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction RadioGroup({\n className,\n __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root> & { __e2e_test_id__?: string }) {\n return (\n <RadioGroupPrimitive.Root\n data-test-id={__e2e_test_id__}\n data-slot=\"radio-group\"\n className={cn('grid gap-3', className)}\n {...props}\n />\n )\n}\n\nconst radioGroupVariants = cva(\n 'cursor-pointer border-input text-primary 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:bg-input/30 aspect-square shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',\n {\n variants: {\n circleVariant: {\n default: '',\n grayThick: 'aria-checked:border-muted-foreground aria-checked:border-2',\n },\n size: {\n default: 'size-4',\n sm: 'size-3.5',\n },\n },\n defaultVariants: {\n circleVariant: 'default',\n size: 'default',\n },\n },\n)\n\ntype RadioGroupItemProps = React.ComponentProps<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupVariants>\n\nfunction RadioGroupItem({ className, circleVariant, size, ...props }: RadioGroupItemProps) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(radioGroupVariants({ circleVariant, size, className }))}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <div\n className={`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full ${\n circleVariant === 'grayThick' ? 'bg-muted-foreground' : 'bg-primary'\n }\n ${size === 'sm' ? 'size-2' : 'size-2.25'}`}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","import { DragHandleDots2Icon } from '@radix-ui/react-icons'\n\nimport * as ResizablePrimitive from 'react-resizable-panels'\n\nimport { cn } from '../lib/utils'\n\nconst ResizablePanelGroup = ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (\n <ResizablePrimitive.PanelGroup\n className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}\n {...props}\n />\n)\n\nconst ResizablePanel = ResizablePrimitive.Panel\n\nconst ResizableHandle = ({\n withHandle,\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n withHandle?: boolean\n}) => (\n <ResizablePrimitive.PanelResizeHandle\n className={cn(\n 'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90',\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n <DragHandleDots2Icon className=\"h-2.5 w-2.5\" />\n </div>\n )}\n </ResizablePrimitive.PanelResizeHandle>\n)\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle }\n","import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root ref={ref} className={cn('relative overflow-hidden', className)} {...props}>\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">{children}</ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-[1px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import * as SheetPrimitive from '@radix-ui/react-dialog'\nimport { Cross2Icon } from '@radix-ui/react-icons'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out',\n {\n variants: {\n side: {\n top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',\n left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',\n right:\n 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n },\n)\n\ntype SheetContentProps = React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> &\n VariantProps<typeof sheetVariants>\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content ref={ref} className={cn(sheetVariants({ side }), className)} {...props}>\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <Cross2Icon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n ),\n)\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-2 text-center sm:text-left', className)} {...props} />\n)\nSheetHeader.displayName = 'SheetHeader'\n\nconst SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />\n)\nSheetFooter.displayName = 'SheetFooter'\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-foreground', className)} {...props} />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { PanelLeftIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport {\n Button,\n cn,\n Input,\n Separator,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n Skeleton,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n useIsMobile,\n} from '../index'\n\nconst SIDEBAR_WIDTH = '16rem'\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\nconst SIDEBAR_WIDTH_ICON = '3rem'\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed'\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n },\n [setOpenProp, open],\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n globalThis.addEventListener('keydown', handleKeyDown)\n return () => globalThis.removeEventListener('keydown', handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed'\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right'\n variant?: 'sidebar' | 'floating' | 'inset'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('bg-background h-8 w-full shadow-none', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('bg-sidebar-border mx-2 w-auto', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-2', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp: React.ElementType = asChild ? Slot : 'div'\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('w-full text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-1', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp: React.ElementType = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n widths = [50],\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean\n widths?: number[]\n}) {\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n {widths.map((width) => {\n return (\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n )\n })}\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('group/menu-sub-item relative', className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean\n size?: 'sm' | 'md'\n isActive?: boolean\n}) {\n const Comp: React.ElementType = asChild ? Slot : 'a'\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import { ChevronUpIcon, FilterX } from 'lucide-react'\nimport { Key, useCallback, useMemo, useState } from 'react'\n\nimport { Button, Card, CardContent, CardHeader, CardTitle, Checkbox, Input, Skeleton } from '../index'\nimport { cn } from '../lib/utils'\n\nfunction usePersistedState(storageKey: string | undefined, defaultValue: boolean): [boolean, (value: boolean) => void] {\n const [state, setState] = useState<boolean>(() => {\n if (!storageKey) {\n return defaultValue\n }\n try {\n const stored = localStorage.getItem(storageKey)\n return stored === null ? defaultValue : JSON.parse(stored)\n } catch {\n return defaultValue\n }\n })\n\n const setPersistedState = useCallback(\n (value: boolean) => {\n setState(value)\n if (storageKey) {\n try {\n localStorage.setItem(storageKey, JSON.stringify(value))\n } catch {\n // Ignore localStorage errors (e.g., quota exceeded, private browsing)\n }\n }\n },\n [storageKey],\n )\n\n return [state, setPersistedState]\n}\n\nexport function Slicer<T extends Key>({\n filterValues,\n selectedValues,\n onChange,\n title,\n isLoading = false,\n optionsHeight = 200,\n className,\n defaultCollapsed = false,\n storageKey,\n}: Readonly<{\n filterValues: { value: T; label: string; hasMatches: boolean }[]\n selectedValues: Set<T>\n onChange: (val: T[]) => void\n title: string\n isLoading?: boolean\n optionsHeight?: number\n className?: string\n defaultCollapsed?: boolean\n /** Storage key for persisting collapsed state. Defaults to a key based on the title. Set to null to disable persistence. */\n storageKey?: string | null\n}>) {\n const effectiveStorageKey = storageKey === null ? undefined : (storageKey ?? `slicer-collapsed-${title}`)\n const [isCollapsed, setIsCollapsed] = usePersistedState(effectiveStorageKey, defaultCollapsed)\n const [searchQuery, setSearchQuery] = useState('')\n\n const filteredOptions = useMemo(() => {\n if (!searchQuery) {\n return filterValues\n }\n const lowerQuery = searchQuery.toLowerCase()\n return filterValues.filter((option) => option.label.toLowerCase().includes(lowerQuery))\n }, [filterValues, searchQuery])\n\n const areAllSelected = filterValues.length > 0 && filterValues.every((option) => selectedValues.has(option.value))\n const areAllFilteredSelected =\n filteredOptions.length > 0 && filteredOptions.every((option) => selectedValues.has(option.value))\n const isAnyFilteredSelected = filteredOptions.some((option) => selectedValues.has(option.value))\n\n const handleClear = () => {\n onChange([])\n }\n\n // Handle select all / select search results\n const handleSelectAll = () => {\n let newVals: T[] = []\n if (searchQuery.length > 0) {\n const newSelected = new Set(selectedValues)\n if (areAllFilteredSelected) {\n filteredOptions.forEach((o) => newSelected.delete(o.value))\n } else {\n filteredOptions.forEach((o) => newSelected.add(o.value))\n }\n newVals = Array.from(newSelected)\n } else if (areAllSelected) {\n newVals = []\n } else {\n newVals = filterValues.map((o) => o.value)\n }\n onChange(newVals)\n }\n\n // Handle individual option toggle\n const handleOptionToggle = (optionValue: T, checked: boolean) => {\n const newSelected = new Set(selectedValues)\n if (checked) {\n newSelected.add(optionValue)\n } else {\n newSelected.delete(optionValue)\n }\n onChange(Array.from(newSelected))\n }\n\n return (\n <Card className={cn('flex flex-col overflow-hidden w-56 rounded shadow-sm shrink-0', className)}>\n <CardHeader className=\"px-2 py-0 pt-2 flex space-y-0 border-b border-border bg-muted/50 relative min-h-9\">\n <CardTitle className=\"text-base font-semibold\">{title}</CardTitle>\n {!isCollapsed && (\n <Input\n className=\"border-none shadow-none rounded-sm text-sm p-0 min-h-6.5\"\n variant=\"simple\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n )}\n\n <Button\n variant=\"ghost\"\n size=\"iconSm\"\n onClick={() => {\n if (!isCollapsed) {\n setSearchQuery('')\n }\n setIsCollapsed(!isCollapsed)\n }}\n title={isCollapsed ? 'Expand slicer' : 'Collapse slicer'}\n className=\"size-7 absolute top-1 right-9 text-muted-foreground\"\n >\n <ChevronUpIcon className={cn(isCollapsed && 'rotate-180')} />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"iconSm\"\n disabled={selectedValues.size === 0}\n onClick={handleClear}\n title=\"Clear filter\"\n className=\"size-7 absolute top-1 right-1 text-muted-foreground\"\n >\n <FilterX />\n </Button>\n </CardHeader>\n {!isCollapsed && (\n <CardContent className=\"p-1 flex flex-col\">\n {/* Select all button */}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className=\"w-full justify-start px-2 py-1 rounded-sm text-sm font-normal\"\n onClick={handleSelectAll}\n >\n {searchQuery.length > 0 ? (\n <Checkbox\n readOnly\n checked={isAnyFilteredSelected}\n disabled={filteredOptions.length === 0}\n label=\"Select Search Results\"\n className=\"pointer-events-none\"\n checkboxSize=\"sm\"\n variant={areAllFilteredSelected ? 'simple' : 'default'}\n iconStyle={areAllFilteredSelected ? 'simple' : 'solo'}\n checkIcon={areAllFilteredSelected ? 'check' : 'square'}\n />\n ) : (\n <Checkbox\n readOnly\n checked={selectedValues.size > 0}\n disabled={filterValues.length === 0}\n label=\"Select All\"\n className=\"pointer-events-none\"\n checkboxSize=\"sm\"\n variant={areAllSelected ? 'simple' : 'default'}\n iconStyle={areAllSelected ? 'simple' : 'solo'}\n checkIcon={areAllSelected ? 'check' : 'square'}\n />\n )}\n </Button>\n\n <div\n className={`px-2 py-1 h-(--optionsHeight) shrink-0 overflow-auto`}\n style={{ '--optionsHeight': `${optionsHeight}px` } as React.CSSProperties}\n >\n {filteredOptions.length === 0 ? (\n <div className=\"flex size-full items-center justify-center text-sm\">\n {filterValues.length === 0 ? 'No options available' : 'No results found'}\n </div>\n ) : (\n <>\n {isLoading ? (\n <>\n <Skeleton className=\"h-5 w-full\" />\n <Skeleton className=\"h-5 w-3/4\" />\n <Skeleton className=\"h-5 w-5/6\" />\n </>\n ) : (\n <>\n {filteredOptions.map((option) => (\n <SlicerItem\n key={option.value}\n option={option}\n isSelected={selectedValues.has(option.value)}\n onToggle={handleOptionToggle}\n />\n ))}\n </>\n )}\n </>\n )}\n </div>\n </CardContent>\n )}\n </Card>\n )\n}\n\nconst SlicerItem = <T extends Key>({\n option,\n isSelected,\n onToggle,\n}: {\n option: { label: string; value: T; hasMatches: boolean }\n isSelected: boolean\n onToggle: (value: T, checked: boolean) => void\n}) => {\n return (\n <Checkbox\n key={option.value}\n checked={isSelected}\n onChange={(e) => onToggle(option.value, e.target.checked)}\n checkIcon=\"check\"\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !option.hasMatches && 'opacity-50',\n (option.value == '' || option.value == null || option.value == undefined) && 'italic',\n )}\n label={option.label}\n />\n )\n}\n","import * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport type { CSSProperties } from 'react'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst sliderVariants = cva('absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full', {\n variants: {\n sliderVariant: {\n default: 'bg-primary',\n gray: 'bg-muted-foreground',\n },\n },\n defaultVariants: {\n sliderVariant: 'default',\n },\n})\n\nconst knobVariants = cva(\n 'bg-background block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n knobVariant: {\n default: 'border-primary ring-ring/50 hover:ring-4 focus-visible:ring-4',\n gray: 'border-muted-foreground border-2',\n },\n },\n defaultVariants: {\n knobVariant: 'default',\n },\n },\n)\n\ntype SliderProps = React.ComponentProps<typeof SliderPrimitive.Root> &\n VariantProps<typeof sliderVariants> &\n VariantProps<typeof knobVariants> & { knobSize?: number }\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n sliderVariant,\n knobVariant,\n knobSize,\n ...props\n}: SliderProps) {\n const _values = React.useMemo(() => {\n if (Array.isArray(value)) {\n return value\n } else if (Array.isArray(defaultValue)) {\n return defaultValue\n }\n return [min, max]\n }, [value, defaultValue, min, max])\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n 'cursor-pointer relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5',\n )}\n >\n <SliderPrimitive.Range data-slot=\"slider-range\" className={cn(sliderVariants({ sliderVariant }))} />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className={cn(\n knobVariants({\n knobVariant,\n }),\n knobSize ? 'size-(--knob-size)' : '',\n )}\n style={{ '--knob-size': `${knobSize}px` } as CSSProperties}\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider, sliderVariants, knobVariants }\n","import * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import { Slot } from '@radix-ui/react-slot'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport type { ComponentProps } from 'react'\n\nimport { cn } from '../lib/utils'\n\nfunction Tabs({ className, ...props }: ComponentProps<typeof TabsPrimitive.Root>) {\n return <TabsPrimitive.Root data-slot=\"tabs\" className={cn('flex flex-col gap-2', className)} {...props} />\n}\n\nconst tabsListVariants = cva('w-fit text-muted-foreground inline-flex items-center justify-center rounded-lg', {\n variants: {\n variant: {\n default: 'bg-muted p-[3px]',\n protocol: 'bg-transparent',\n },\n size: {\n default: 'h-9',\n sm: 'h-6',\n lg: 'h-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n})\n\nfunction TabsList({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : TabsPrimitive.List\n return <Comp data-slot=\"tabs-list\" className={cn(tabsListVariants({ variant, size, className }))} {...props} />\n}\n\nconst tabsTriggerVariants = cva(\n \"h-[100%] text-lg inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 text-foreground\",\n {\n variants: {\n variant: {\n default:\n 'h-[calc(100%-1px)] flex-1 rounded-md border border-transparent px-2 py-1 transition-[color,box-shadow] dark:text-muted-foreground data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:shadow-sm',\n protocol:\n 'bg-transparent border-b-2 border-b-transparent hover:text-primary hover:border-b-primary data-[state=active]:border-b-primary data-[state=active]:text-primary',\n },\n },\n },\n)\n\nfunction TabsTrigger({\n className,\n variant,\n asChild = false,\n ...props\n}: ComponentProps<typeof TabsPrimitive.Trigger> & VariantProps<typeof tabsTriggerVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : TabsPrimitive.Trigger\n return <Comp data-slot=\"tabs-trigger\" className={cn(tabsTriggerVariants({ variant, className }))} {...props} />\n}\n\nfunction TabsContent({ className, ...props }: ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as TogglePrimitive from '@radix-ui/react-toggle'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground cursor-pointer',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-3',\n sm: 'h-8 px-2',\n lg: 'h-10 px-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root ref={ref} className={cn(toggleVariants({ variant, size, className }))} {...props} />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'\n\nimport { type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from '../toggle/toggle'\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => {\n const memoizedValue = useMemo(() => ({ variant, size }), [size, variant])\n return (\n <ToggleGroupPrimitive.Root ref={ref} className={cn('flex items-center justify-center gap-1', className)} {...props}>\n <ToggleGroupContext.Provider value={memoizedValue}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n})\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"mappings":"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"}
|