@postxl/ui-components 1.5.2 → 1.5.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 +132 -138
- package/dist/index.js.map +1 -1
- package/package.json +38 -38
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["baseId: string | undefined","suffix: string","day: Date","modifiers: any","e: React.MouseEvent<Element>","fromMonth: Date | undefined","toMonth: Date | undefined","date: Date","months: number","event: React.KeyboardEvent<HTMLDivElement>","comments: CommentItem[] | CommentGroup[]","name: string","items: CommentItem[]","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","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>","align: 'left' | 'right' | 'center'","event: React.MouseEvent<HTMLDivElement>","event: React.MouseEvent","event: React.KeyboardEvent<HTMLDivElement>","option: CellHierarchyOption","ids: string[]","options: CellHierarchyOption[]","id: string","path: string[]","targetId: string","currentPath: string[]","searchTerm: string","selectedValue: string | null | undefined","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","e: React.KeyboardEvent","newValue: string","options: CellSelectOption[]","value: string","val: boolean","id: string","option: CellHierarchyOption","date: Date | undefined","indices: number[]","updates: UpdateCell[]","e: Event","editorProps: EditorProps","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>","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>","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[]","options: SelectColumnOptions<TData>","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","variantStyles: Record<InfoCardVariant, { titleClass: string; messageContainerClass: string }>","directions: string[]","coordinateGetter: KeyboardCoordinateGetter","filteredContainers: DroppableContainer[]","consumerName: string","props: KanbanRootProps<T>","item: T","id: UniqueIdentifier","collisionDetection: CollisionDetection","event: DragStartEvent","event: DragOverEvent","event: DragEndEvent","newColumns: Record<UniqueIdentifier, T[]>","event: DragCancelEvent","announcements: Announcements","props: KanbanBoardProps","animateLayoutChanges: AnimateLayoutChanges","props: KanbanColumnProps","node: HTMLElement | null","props: KanbanColumnHandleProps","props: KanbanItemProps","props: KanbanItemHandleProps","dropAnimation: DropAnimation","props: KanbanOverlayProps","e: React.ChangeEvent<HTMLInputElement>","e: React.FocusEvent<HTMLInputElement>","e: React.KeyboardEvent<HTMLInputElement>","newValue: number | undefined","e: React.FocusEvent<HTMLInputElement>","sidebarId?: string","value: boolean","value: number","states: Record<string, boolean>","states: Record<string, number | undefined>","toStore: StoredSidebarStates","id: string","open: boolean","width: number","config: SidebarRegistryEntry","event: KeyboardEvent","e: React.MouseEvent","moveEvent: MouseEvent","newWidth: number","Comp: React.ElementType","side: SidebarSide","tab: SidebarTabDefinition","tabId: string","tabId: string | null","map: Map<string, SidebarTabDefinition>","side?: SidebarSide","tabId: string","option: SlicerFilterOption<T>","values: T[]","searchTerm: string","storageKey: string | undefined","defaultValue: boolean","value: boolean","value: T","newVals: T[]","optionValue: T","props: T","fn: () => T","id: string","variant: 'trigger' | 'content' | 'title' | 'description'","value: string","MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent>","key: string","dir?: Direction","event: React.KeyboardEvent<TriggerElement>","orientation?: Orientation","candidates: React.RefObject<TriggerElement | null>[]","array: T[]","startIndex: number","value: string | undefined","itemValue: string","stepState: StepState | undefined","steps: Map<string, StepState>","variant: 'item' | 'separator'","consumerName: string","selector: (state: StoreState) => T","props: StepperProps","newStep: StepState","updatedStep: StepState","props: DivProps","tabStopId: string","item: ItemData","event: React.FocusEvent<ListElement>","event: React.MouseEvent<ListElement>","props: StepperItemProps","props: ButtonProps","event: KeyboardEvent","event: React.MouseEvent<TriggerElement>","event: React.FocusEvent<TriggerElement>","direction: NavigationDirection","props: StepperIndicatorProps","props: StepperSeparatorProps","props: StepperTitleProps","props: StepperDescriptionProps","props: StepperContentProps","event: React.MouseEvent<HTMLButtonElement>","e: React.ChangeEvent<HTMLTextAreaElement>","e: React.FocusEvent<HTMLTextAreaElement>"],"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/textarea/textarea.tsx","../src/comment/comment.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/input/input.tsx","../src/input/number-input.tsx","../src/data-grid/data-grid-cell-wrapper.tsx","../src/data-grid/cell-variants/hierarchy-cell.tsx","../src/data-grid/bulk-edit-popover.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/data-grid/data-grid-search.tsx","../src/data-grid/data-grid.tsx","../src/data-grid/cell-variants/checkbox-cell.tsx","../src/data-grid/cell-variants/date-cell.tsx","../src/data-grid/cell-variants/download-file-cell.tsx","../src/data-grid/cell-variants/gantt-cell.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/separator/separator.tsx","../src/data-grid/data-grid-view-menu.tsx","../src/data-grid/column-presets/select-column.tsx","../src/data-grid/hooks/use-data-grid.tsx","../src/date-picker/date-picker.tsx","../src/drawer/drawer.tsx","../src/label/label.tsx","../src/field/field.tsx","../src/hooks/use-is-mobile.ts","../src/info-card/info-card.tsx","../src/kanban/kanban.tsx","../src/input/deferred-input.tsx","../src/input/deferred-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-context-provider.tsx","../src/sidebar/sidebar.tsx","../src/sidebar/sidebar-tab-context-provider.tsx","../src/sidebar/sidebar-tab.tsx","../src/slicer/slicer.tsx","../src/slider/slider.tsx","../src/hooks/use-isomorphic-layout-effect.ts","../src/hooks/use-as-ref.ts","../src/hooks/use-lazy-ref.ts","../src/stepper/stepper.tsx","../src/switch/switch.tsx","../src/tabs/tabs.tsx","../src/textarea/deferred-textarea.tsx","../src/toggle/toggle.tsx","../src/toggle-group/toggle-group.tsx","../src/tree-view/tree-view.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\n/**\n * Generates a test ID by combining a base ID with a suffix.\n * Returns undefined if no base ID is provided.\n *\n * For the root element, use `data-test-id={__e2e_test_id__}` directly.\n * Use this function only for sub-elements that need a suffix.\n *\n * @example\n * <div data-test-id={__e2e_test_id__}> // root element - use directly\n * <input data-test-id={testId(__e2e_test_id__, 'search')}> // sub-element - returns `${baseId}-search` or undefined\n */\nexport function testId(baseId: string | undefined, suffix: string): string | undefined {\n if (!baseId) {\n return undefined\n }\n return `${baseId}-${suffix}`\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 iconXs: 'size-6',\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, testId } 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 __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n showYearNavigation?: boolean\n __e2e_test_id__?: string\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 __e2e_test_id__={testId(__e2e_test_id__, 'prev-year')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'prev-month')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'next-month')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'next-year')}\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\" data-test-id={__e2e_test_id__} 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 { MinusIcon, 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-sm 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 minus: 'minus',\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 } else if (checkIcon === 'minus') {\n icon = <MinusIcon />\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 { 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 discreet:\n 'border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30',\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 {\n ChevronDownIcon,\n ChevronUpIcon,\n CircleCheckIcon,\n EyeIcon,\n EyeOffIcon,\n MessageSquareIcon,\n MinusIcon,\n PlusIcon,\n} from 'lucide-react'\nimport { useState } from 'react'\n\nimport { Avatar, AvatarFallback } from '../avatar/avatar'\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\nimport { Textarea } from '../textarea/textarea'\n\nexport type CommentItem = {\n id: string\n userName: string\n userAvatar?: React.ReactNode\n createdAt: Date\n comment: string\n isResolved?: boolean\n replies?: CommentItem[]\n}\n\nexport type CommentGroup = {\n groupId: string\n groupName: string\n comments: CommentItem[]\n}\n\nexport type CommentCallbacks = {\n onReply?: (parentCommentId: string, comment: string) => void\n onResolve?: (commentId: string, isResolve: boolean) => void\n onCreate?: (comment: string, groupId?: string) => void\n}\n\nfunction isCommentGroupArray(comments: CommentItem[] | CommentGroup[]): comments is CommentGroup[] {\n return comments.length > 0 && 'groupName' in comments[0]!\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length >= 2) {\n return `${parts[0]![0]}${parts[1]![0]}`.toUpperCase()\n }\n return (parts[0]?.[0] ?? 'AA').toUpperCase()\n}\n\nfunction CommentThread({\n comment,\n depth = 0,\n threadResolved = false,\n onReply,\n onResolve,\n}: Readonly<\n { comment: CommentItem; depth?: number; threadResolved?: boolean } & Pick<CommentCallbacks, 'onReply' | 'onResolve'>\n>) {\n const isResolved = comment.isResolved || threadResolved\n const [repliesOpen, setRepliesOpen] = useState(true)\n const [contentVisible, setContentVisible] = useState(!comment.isResolved)\n const [replying, setReplying] = useState(false)\n const hasReplies = comment.replies && comment.replies.length > 0\n\n return (\n <div data-slot=\"comment-thread\" className={cn('flex flex-col', depth > 0 && 'mt-1')}>\n {/* Comment body */}\n <div className=\"flex flex-col items-start\">\n {/* Header row */}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative size-7 mt-0.5 shrink-0\">\n <div className={cn('size-full', isResolved && 'opacity-25')}>\n {comment.userAvatar ?? (\n <Avatar className=\"size-full text-sm\">\n <AvatarFallback>{getInitials(comment.userName)}</AvatarFallback>\n </Avatar>\n )}\n </div>\n {isResolved && <CircleCheckIcon className=\"absolute inset-0 size-full opacity-50 text-muted-foreground\" />}\n </div>\n <span\n className={cn(\n 'text-sm font-semibold',\n isResolved ? 'text-muted-foreground line-through' : 'text-foreground',\n )}\n >\n {comment.userName}\n </span>\n <span\n className={cn('text-xs', isResolved ? 'text-muted-foreground/50 line-through' : 'text-muted-foreground/70')}\n >\n {comment.createdAt.toLocaleDateString()}\n </span>\n {comment.isResolved && depth === 0 && (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setContentVisible((v) => !v)} className=\"ml-5 h-5.5\">\n {contentVisible ? <EyeIcon className=\"size-3\" /> : <EyeOffIcon className=\"size-3\" />}\n Resolved\n </Button>\n )}\n </div>\n\n {/* Comment text (hideable for resolved comments) */}\n {contentVisible && (\n <>\n {/* Command */}\n <p\n className={cn(\n 'ml-9 text-sm whitespace-pre-wrap',\n isResolved ? 'text-muted-foreground line-through' : 'text-foreground/90',\n )}\n >\n {comment.comment}\n </p>\n\n <div className=\"flex items-center mt-1\">\n {/* Expand / collapse replies */}\n <div className=\"w-9 px-0.5\">\n {hasReplies && contentVisible && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n onClick={() => setRepliesOpen((open) => !open)}\n >\n {repliesOpen ? <MinusIcon className=\"size-3\" /> : <PlusIcon className=\"size-3\" />}\n </Button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-5\">\n {/* Reply number (+ expand) */}\n {hasReplies && contentVisible && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n onClick={() => setRepliesOpen(true)}\n >\n {comment.replies!.length} {comment.replies!.length === 1 ? 'reply' : 'replies'}\n </Button>\n )}\n {/* Reply */}\n {onReply && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n onClick={() => setReplying(true)}\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n >\n <MessageSquareIcon className=\"size-3\" />\n Reply\n </Button>\n )}\n {/* Resolve conversation */}\n {onResolve && depth === 0 && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n onClick={() => {\n onResolve(comment.id, !comment.isResolved)\n if (!comment.isResolved) {\n setContentVisible(false)\n }\n }}\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n >\n <CircleCheckIcon className=\"size-3\" />\n {comment.isResolved ? 'Reopen' : 'Resolve'}\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n {onReply && replying && (\n <CommentCreate\n className=\"pl-9 mt-4\"\n onSubmit={(commentText) => {\n onReply(comment.id, commentText)\n setReplying(false)\n setRepliesOpen(true)\n }}\n onCancel={() => setReplying(false)}\n />\n )}\n </div>\n\n {/* Replies — kept mounted to preserve child collapse state */}\n {hasReplies && (\n <div\n className={cn('mt-1 mb-2 ml-3 border-l border-border/50 pl-3', !(contentVisible && repliesOpen) && 'hidden')}\n >\n {comment.replies!.map((reply) => (\n <CommentThread\n key={reply.id}\n comment={reply}\n depth={depth + 1}\n threadResolved={isResolved}\n onReply={onReply}\n onResolve={onResolve}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction CommentCreate({\n onSubmit,\n onCancel,\n className,\n}: Readonly<{ onSubmit: (comment: string) => void; onCancel: () => void; className?: string }>) {\n const [comment, setComment] = useState('')\n\n const submitComment = () => {\n if (comment.trim() === '') {\n return\n }\n onSubmit(comment)\n setComment('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2 w-full', className)}>\n <Textarea\n variant=\"simple\"\n className=\"min-h-8.5 h-12.5 w-full\"\n placeholder=\"Write a comment...\"\n autoFocus\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"smLow\"\n onClick={() => {\n setComment('')\n onCancel()\n }}\n >\n Cancel\n </Button>\n <Button variant=\"default\" size=\"smLow\" onClick={() => submitComment()}>\n Submit\n </Button>\n </div>\n </div>\n )\n}\n\nfunction sortComments(items: CommentItem[]): CommentItem[] {\n return [...items]\n .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())\n .map((item) => (item.replies?.length ? { ...item, replies: sortComments(item.replies) } : item))\n}\n\nfunction CommentGroupSection({\n group,\n onReply,\n onResolve,\n onCreate,\n}: Readonly<{ group: CommentGroup } & CommentCallbacks>) {\n const [collapsed, setCollapsed] = useState(false)\n const [creating, setCreating] = useState(false)\n\n return (\n <div data-slot=\"comment-group\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-foreground\">{group.groupName}</h3>\n <Button variant=\"ghost\" size=\"iconXs\" onClick={() => setCollapsed((c) => !c)}>\n {collapsed ? <ChevronDownIcon className=\"size-4\" /> : <ChevronUpIcon className=\"size-4\" />}\n </Button>\n </div>\n <div className={cn(collapsed && 'hidden')}>\n {onCreate && (\n <>\n {creating ? (\n <CommentCreate\n className=\"my-2\"\n onSubmit={(comment) => {\n onCreate?.(comment, group.groupId)\n setCreating(false)\n }}\n onCancel={() => setCreating(false)}\n />\n ) : (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setCreating(true)} className=\"mt-1 mb-2\">\n Add comment\n </Button>\n )}\n </>\n )}\n <div className=\"mt-2 flex flex-col gap-3\">\n {sortComments(group.comments).map((comment) => (\n <CommentThread key={comment.id} comment={comment} onReply={onReply} onResolve={onResolve} />\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nfunction CommentList({\n comments,\n className,\n onReply,\n onResolve,\n onCreate,\n}: Readonly<{ comments: CommentItem[] | CommentGroup[]; className?: string } & CommentCallbacks>) {\n const [creating, setCreating] = useState(false)\n\n if (isCommentGroupArray(comments)) {\n return (\n <div data-slot=\"comment-list\" className={cn('flex flex-col gap-6', className)}>\n {comments.map((group, i) => (\n <div key={i}>\n <CommentGroupSection group={group} onReply={onReply} onResolve={onResolve} onCreate={onCreate} />\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div data-slot=\"comment-list\" className={cn('flex flex-col gap-2', className)}>\n {onCreate && (\n <>\n {creating ? (\n <CommentCreate\n className=\"my-2\"\n onSubmit={(comment) => {\n onCreate?.(comment)\n setCreating(false)\n }}\n onCancel={() => setCreating(false)}\n />\n ) : (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setCreating(true)} className=\"mb-2 self-start\">\n Add comment\n </Button>\n )}\n </>\n )}\n {sortComments(comments).map((comment) => (\n <CommentThread key={comment.id} comment={comment} onReply={onReply} onResolve={onResolve} />\n ))}\n </div>\n )\n}\n\nexport { CommentCreate, CommentList, CommentThread }\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, testId } 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 data-test-id={__e2e_test_id__}\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__={testId(__e2e_test_id__, 'close')}\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 w-full\">{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, XIcon } 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 <XIcon 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 {cellOpts.onRangeChange && (\n <div className=\"absolute right-8 top-1/2 -translate-y-1/2\">\n <GanttTimerangePicker\n initialDateFrom={cellOpts.dateRangeFrom ?? undefined}\n initialDateTo={cellOpts.dateRangeTo ?? undefined}\n onRangeChange={cellOpts.onRangeChange}\n timelineStart={cellOpts.timelineStart}\n timelineEnd={cellOpts.timelineEnd}\n />\n </div>\n )}\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 { 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 discreet:\n 'py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30',\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 { 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 discreet:\n 'py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus-within:border-input focus-within:shadow-sm bg-transparent hover:bg-accent/30',\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 bg-transparent hover:bg-transparent 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 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 // Resolve row-level className from table meta\n const rowClassNameMeta = meta?.rowClassName\n const rowCellClassName = React.useMemo(() => {\n if (!rowClassNameMeta) {\n return undefined\n }\n if (typeof rowClassNameMeta === 'function') {\n return rowClassNameMeta(cell.row)\n }\n return rowClassNameMeta\n }, [rowClassNameMeta, cell.row])\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 rowCellClassName,\n colCellClassName,\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 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 { CheckIcon, ChevronDownIcon, ChevronRightIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../..'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../../command/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellHierarchyOption } from '../data-grid-types'\n\nimport { CellVariantProps } from './cell-variant-types'\n\n/**\n * Collects all descendant IDs from a hierarchy option.\n */\nfunction getAllDescendantIds(option: CellHierarchyOption): string[] {\n const ids: string[] = []\n if (option.children) {\n for (const child of option.children) {\n ids.push(child.id)\n ids.push(...getAllDescendantIds(child))\n }\n }\n return ids\n}\n\n/**\n * Collects all IDs in the hierarchy tree (including the option itself).\n */\nfunction getAllIds(option: CellHierarchyOption): string[] {\n return [option.id, ...getAllDescendantIds(option)]\n}\n\n/**\n * Finds an option by ID in the hierarchy tree.\n */\nfunction findOptionById(options: CellHierarchyOption[], id: string): CellHierarchyOption | null {\n for (const opt of options) {\n if (opt.id === id) {\n return opt\n }\n if (opt.children) {\n const found = findOptionById(opt.children, id)\n if (found) {\n return found\n }\n }\n }\n return null\n}\n\n/**\n * Gets the label path from root to the given ID.\n */\nfunction getLabelPath(\n options: CellHierarchyOption[],\n id: string,\n path: string[] = [],\n): { found: boolean; path: string[] } {\n for (const opt of options) {\n if (opt.id === id) {\n return { found: true, path: [...path, opt.label] }\n }\n if (opt.children) {\n const result = getLabelPath(opt.children, id, [...path, opt.label])\n if (result.found) {\n return result\n }\n }\n }\n return { found: false, path }\n}\n\n/**\n * Gets the ancestor IDs (parent chain) from root to the given ID.\n * Returns the IDs of all ancestors, NOT including the target ID itself.\n */\nfunction getAncestorIds(options: CellHierarchyOption[], targetId: string, currentPath: string[] = []): string[] | null {\n for (const opt of options) {\n if (opt.id === targetId) {\n return currentPath\n }\n if (opt.children) {\n const result = getAncestorIds(opt.children, targetId, [...currentPath, opt.id])\n if (result !== null) {\n return result\n }\n }\n }\n return null\n}\n\n/**\n * Builds a flat lookup map from ID to label for O(1) display lookups.\n */\nfunction buildLabelMap(options: CellHierarchyOption[], map = new Map<string, string>()): Map<string, string> {\n for (const opt of options) {\n map.set(opt.id, opt.label)\n if (opt.children) {\n buildLabelMap(opt.children, map)\n }\n }\n return map\n}\n\n/**\n * Checks if an option or any of its descendants contain the search term.\n */\nfunction matchesSearch(option: CellHierarchyOption, searchTerm: string): boolean {\n const term = searchTerm.toLowerCase()\n if (option.label.toLowerCase().includes(term)) {\n return true\n }\n if (option.children) {\n return option.children.some((child) => matchesSearch(child, term))\n }\n return false\n}\n\n/**\n * Computes the initial expanded IDs.\n * - If there's only one top-level option with children, expand it by default.\n * - If there's a selected value, expand all ancestors to show it.\n */\nfunction getInitialExpandedIds(options: CellHierarchyOption[], selectedValue: string | null | undefined): Set<string> {\n const expandedIds = new Set<string>()\n\n // Auto-expand single top-level option\n const firstOption = options[0]\n if (options.length === 1 && firstOption?.children && firstOption.children.length > 0) {\n expandedIds.add(firstOption.id)\n }\n\n // Expand ancestors of selected value\n if (selectedValue) {\n const ancestors = getAncestorIds(options, selectedValue)\n if (ancestors) {\n for (const id of ancestors) {\n expandedIds.add(id)\n }\n }\n }\n\n return expandedIds\n}\n\ntype HierarchyItemProps = {\n option: CellHierarchyOption\n selectedValue: string | null | undefined\n expandedIds: Set<string>\n onToggleExpand: (id: string) => void\n onSelect: (option: CellHierarchyOption) => void\n depth?: number\n searchTerm?: string\n /** When true, an ancestor matched the search so this item should be shown regardless of match */\n ancestorMatched?: boolean\n}\n\n/**\n * Renders a single hierarchy item with expand/collapse and selection capabilities.\n */\nfunction HierarchyItem({\n option,\n selectedValue,\n expandedIds,\n onToggleExpand,\n onSelect,\n depth = 0,\n searchTerm = '',\n ancestorMatched = false,\n}: HierarchyItemProps) {\n const hasChildren = option.children && option.children.length > 0\n const isExpanded = expandedIds.has(option.id)\n const isSelected = option.id === selectedValue\n\n // When searching, check if this item matches\n const matchesSelf = searchTerm && option.label.toLowerCase().includes(searchTerm.toLowerCase())\n const childrenMatchSearch = searchTerm && hasChildren && option.children!.some((c) => matchesSearch(c, searchTerm))\n\n // Don't render if searching and neither self, descendants, nor ancestors match\n // Option A: When an ancestor matched, show all descendants\n if (searchTerm && !matchesSelf && !childrenMatchSearch && !ancestorMatched) {\n return null\n }\n\n const shouldShowExpanded = isExpanded || (searchTerm !== '' && childrenMatchSearch)\n\n return (\n <>\n <CommandItem\n value={`${option.label}-${option.id}`}\n onSelect={() => onSelect(option)}\n style={{ paddingLeft: `${depth * 20 + 8}px` }}\n >\n {/* Expand/Collapse button */}\n {hasChildren ? (\n <Button\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand(option.id)\n }}\n variant=\"extraGhost\"\n size=\"sm\"\n className=\"size-4\"\n >\n {shouldShowExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </Button>\n ) : (\n <span className=\"size-4\" />\n )}\n {/* Label */}\n <span className=\"flex-1 truncate\">{option.label}</span>\n {/* Selection indicator */}\n {isSelected && <CheckIcon className=\"ml-auto h-4 w-4\" />}\n </CommandItem>\n\n {/* Render children if expanded */}\n {hasChildren && shouldShowExpanded && (\n <>\n {option.children!.map((child) => (\n <HierarchyItem\n key={child.id}\n option={child}\n selectedValue={selectedValue}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onSelect}\n depth={depth + 1}\n searchTerm={searchTerm}\n ancestorMatched={ancestorMatched || !!matchesSelf}\n />\n ))}\n </>\n )}\n </>\n )\n}\n\nexport function HierarchyCell<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 [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 const options = cellOpts?.variant === 'hierarchy' ? cellOpts.options : []\n\n // Initialize expandedIds with auto-expand for single top-level option and selected value path\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => getInitialExpandedIds(options, initialValue))\n\n // Build label lookup map for O(1) display\n const labelMap = React.useMemo(() => buildLabelMap(options), [options])\n\n // Get display label for current value\n const displayLabel = React.useMemo(() => {\n if (!value) {\n return ''\n }\n return labelMap.get(value) ?? value\n }, [value, labelMap])\n\n const toggleExpand = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const onOptionSelect = React.useCallback(\n (option: CellHierarchyOption) => {\n const newValue = option.id\n setValue(newValue)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n meta?.onCellEditingStop?.()\n setOpen(false)\n },\n [meta, rowIndex, columnId],\n )\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 setValue(initialValue)\n setOpen(false)\n setSearchValue('')\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n setSearchValue('')\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 // When value changes, ensure ancestors are expanded\n React.useEffect(() => {\n if (value) {\n const ancestors = getAncestorIds(options, value)\n if (ancestors && ancestors.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n for (const id of ancestors) {\n next.add(id)\n }\n return next\n })\n }\n }\n }, [value, options])\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 <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 <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 shouldFilter={false}>\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n placeholder=\"Search...\"\n className=\"h-auto flex-1 p-0 rounded-none\"\n />\n <CommandList>\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <HierarchyItem\n key={option.id}\n option={option}\n selectedValue={value}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onSelect={onOptionSelect}\n searchTerm={searchValue}\n />\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : (\n <span data-slot=\"grid-cell-content\">{displayLabel}</span>\n )}\n </DataGridCellWrapper>\n )\n}\n\n// Export utility functions for use in filters\nexport {\n getAllDescendantIds,\n getAllIds,\n findOptionById,\n getLabelPath,\n buildLabelMap,\n getAncestorIds,\n getInitialExpandedIds,\n HierarchyItem,\n}\nexport type { HierarchyItemProps }\n","import type { Table } from '@tanstack/react-table'\n\nimport { CheckSquareIcon, SquareIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Badge } from '../badge/badge'\nimport { Button } from '../button/button'\nimport { Calendar } from '../calendar/calendar'\nimport { Checkbox } from '../checkbox/checkbox'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../command/command'\nimport { Input } from '../input/input'\nimport { NumberInput } from '../input/number-input'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\nimport { Textarea } from '../textarea/textarea'\n\nimport { getInitialExpandedIds, HierarchyItem } from './cell-variants/hierarchy-cell'\nimport type { Cell, CellHierarchyOption, CellSelectOption, UpdateCell } from './data-grid-types'\n\n// ---------------------------------------------------------------------------\n// Shared types\n// ---------------------------------------------------------------------------\n\ntype EditorProps = Readonly<{\n cell: Cell\n columnId: string\n selectedRowIndices: number[]\n onApply: (updates: UpdateCell[]) => void\n onCancel: () => void\n}>\n\nconst EditableCellVariants = [\n 'short-text',\n 'long-text',\n 'number',\n 'select',\n 'multi-select',\n 'checkbox',\n 'date',\n 'hierarchy',\n] as const\nexport const EditableCellVariantsSet = new Set(EditableCellVariants)\nexport type EditableCellVariant = (typeof EditableCellVariants)[number]\n\n// ---------------------------------------------------------------------------\n// Utility: stop propagation wrapper for keyboard events inside the popover\n// ---------------------------------------------------------------------------\n\nfunction stopGridKeys(e: React.KeyboardEvent) {\n // Allow Escape to bubble so the popover can close, but stop everything else\n // from reaching the grid's keyboard handler\n if (e.key !== 'Escape') {\n e.stopPropagation()\n }\n}\n\n// ---------------------------------------------------------------------------\n// Footer with Apply / Cancel buttons\n// ---------------------------------------------------------------------------\n\nfunction EditorFooter({ count, onApply, onCancel }: { count: number; onApply?: () => void; onCancel: () => void }) {\n return (\n <div className=\"flex items-center justify-between border-t px-3 py-2\">\n <span className=\"text-muted-foreground text-xs\">{count} rows</span>\n <div className=\"flex gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n {onApply && (\n <Button size=\"sm\" onClick={onApply}>\n Apply\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Short text editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditShortText({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if (e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <Input ref={inputRef} value={value} onChange={(e) => setValue(e.target.value)} placeholder=\"Enter value...\" />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Long text editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditLongText({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState('')\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n textareaRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Enter value...\"\n className=\"min-h-[100px] resize-none\"\n />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Number editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditNumber({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState<number | undefined>(undefined)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const { min, max, step, prefix, suffix } = cell.variant === 'number' ? cell : ({} as Record<string, undefined>)\n\n // Only use string prefixes/suffixes — function variants need a row context we don't have\n const stringPrefix = typeof prefix === 'string' ? prefix : undefined\n const stringSuffix = typeof suffix === 'string' ? suffix : undefined\n\n const handleApply = React.useCallback(() => {\n const numValue = value ?? null\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: numValue })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if (e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <NumberInput\n ref={inputRef}\n value={value}\n onChange={setValue}\n placeholder=\"Enter number...\"\n min={min}\n max={max}\n step={step}\n prefix={stringPrefix}\n suffix={stringSuffix}\n variant=\"default\"\n />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Select editor (single-select — applies immediately on selection)\n// ---------------------------------------------------------------------------\n\nfunction BulkEditSelect({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const {\n options: arrayOptions,\n optionsMap,\n optionsRenderer,\n } = cell.variant === 'select' ? cell : ({} as Record<string, undefined>)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n // Stores { value, data } where data is the raw value from the map (string or object).\n // Mirrors the pattern used in select-cell.tsx for consistency.\n const options = React.useMemo(() => {\n if (arrayOptions) {\n return arrayOptions.map((opt) => ({ value: opt.value, data: opt.label as unknown }))\n }\n if (optionsMap) {\n return Array.from(optionsMap.entries()).map(([id, data]) => ({ value: id, data }))\n }\n return []\n }, [arrayOptions, optionsMap])\n\n const handleSelect = React.useCallback(\n (newValue: string) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: newValue })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Command>\n <CommandInput ref={inputRef} placeholder=\"Search...\" />\n <CommandList className=\"max-h-[300px]\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value || '__empty__'}\n // For optionsRenderer items, omit value so cmdk derives it from\n // textContent — this enables text-based search and avoids empty-string issues.\n // For plain string labels, pass value explicitly for accurate search matching.\n {...(optionsRenderer ? {} : { value: String(option.data) })}\n onSelect={() => handleSelect(option.value)}\n >\n {optionsRenderer ? optionsRenderer(option.data, 'option') : <span>{String(option.data)}</span>}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Multi-select editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditMultiSelect({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const { options: arrayOptions, optionsMap } =\n cell.variant === 'multi-select' ? cell : ({} as Record<string, undefined>)\n const [selectedValues, setSelectedValues] = React.useState<string[]>([])\n const [searchValue, setSearchValue] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const options: CellSelectOption[] = React.useMemo(() => {\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label: String(label) }))\n }\n return []\n }, [arrayOptions, optionsMap])\n\n const toggleValue = React.useCallback((value: string) => {\n setSelectedValues((prev) => (prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value]))\n setSearchValue('')\n queueMicrotask(() => inputRef.current?.focus())\n }, [])\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: selectedValues })))\n }, [selectedRowIndices, columnId, selectedValues, onApply])\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\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-2 border-b px-3 py-1.5\">\n {selectedValues.map((val) => {\n const opt = options.find((o) => o.value === val)\n return (\n <Badge key={val} variant=\"secondary\" className=\"h-5 gap-1 px-1.5 text-xs\">\n {opt?.label ?? val}\n </Badge>\n )\n })}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\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 return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={() => toggleValue(option.value)}\n className=\"cursor-pointer\"\n >\n <Checkbox\n readOnly\n className=\"pointer-events-none\"\n checked={isSelected}\n label={option.label}\n variant=\"default\"\n checkIcon=\"check\"\n checkboxSize=\"default\"\n />\n </CommandItem>\n )\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n setSelectedValues([])\n queueMicrotask(() => inputRef.current?.focus())\n }}\n className=\"justify-center text-muted-foreground\"\n >\n Clear all\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Checkbox editor — two action buttons\n// ---------------------------------------------------------------------------\n\nfunction BulkEditCheckbox({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const setAll = React.useCallback(\n (val: boolean) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: val })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <div className=\"flex flex-col gap-1 p-2\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start gap-2\" onClick={() => setAll(true)}>\n <CheckSquareIcon className=\"size-4\" />\n Check all\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start gap-2\" onClick={() => setAll(false)}>\n <SquareIcon className=\"size-4\" />\n Uncheck all\n </Button>\n </div>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Hierarchy editor — applies on selection\n// ---------------------------------------------------------------------------\n\nfunction BulkEditHierarchy({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const options = cell.variant === 'hierarchy' ? cell.options : []\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [searchValue, setSearchValue] = React.useState('')\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => getInitialExpandedIds(options, null))\n\n const toggleExpand = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const handleSelect = React.useCallback(\n (option: CellHierarchyOption) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: option.id })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Command shouldFilter={false}>\n <CommandInput ref={inputRef} value={searchValue} onValueChange={setSearchValue} placeholder=\"Search...\" />\n <CommandList className=\"max-h-[300px]\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <HierarchyItem\n key={option.id}\n option={option}\n selectedValue={null}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onSelect={handleSelect}\n searchTerm={searchValue}\n />\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Date editor — applies on selection\n// ---------------------------------------------------------------------------\n\nfunction BulkEditDate({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date) {\n return\n }\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 const isoDate = `${year}-${month}-${day}`\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: isoDate })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Calendar showYearNavigation={true} autoFocus captionLayout=\"dropdown\" mode=\"single\" onSelect={onDateSelect} />\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main popover component\n// ---------------------------------------------------------------------------\n\nexport function BulkEditPopover<TData>({\n table,\n cell,\n columnId,\n open,\n onOpenChange,\n children,\n}: Readonly<{\n table: Table<TData>\n cell: Cell\n columnId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n selectedRowCount: number\n children: React.ReactNode\n}>) {\n // Compute visual row indices for selected rows.\n // onDataUpdate expects the visual index (position in getRowModel().rows),\n // not the original data index (row.index).\n const selectedRowIndices = React.useMemo(() => {\n if (!open) {\n return []\n }\n const allRows = table.getRowModel().rows\n const indices: number[] = []\n for (let i = 0; i < allRows.length; i++) {\n if (allRows[i]!.getIsSelected()) {\n indices.push(i)\n }\n }\n return indices\n }, [open, table])\n\n // Close if all rows get deselected while open\n React.useEffect(() => {\n if (open && selectedRowIndices.length === 0) {\n onOpenChange(false)\n }\n }, [open, selectedRowIndices.length, onOpenChange])\n\n const onApply = React.useCallback(\n (updates: UpdateCell[]) => {\n table.options.meta?.onDataUpdate?.(updates)\n onOpenChange(false)\n },\n [table, onOpenChange],\n )\n\n const onCancel = React.useCallback(() => {\n onOpenChange(false)\n }, [onOpenChange])\n\n const onOpenAutoFocus = React.useCallback((e: Event) => {\n e.preventDefault()\n }, [])\n\n const editorProps: EditorProps = { cell, columnId, selectedRowIndices, onApply, onCancel }\n\n const editor = React.useMemo(() => {\n switch (cell.variant) {\n case 'short-text':\n return <BulkEditShortText {...editorProps} />\n case 'long-text':\n return <BulkEditLongText {...editorProps} />\n case 'number':\n return <BulkEditNumber {...editorProps} />\n case 'select':\n return <BulkEditSelect {...editorProps} />\n case 'multi-select':\n return <BulkEditMultiSelect {...editorProps} />\n case 'checkbox':\n return <BulkEditCheckbox {...editorProps} />\n case 'date':\n return <BulkEditDate {...editorProps} />\n case 'hierarchy':\n return <BulkEditHierarchy {...editorProps} />\n default:\n return null\n }\n }, [cell.variant, columnId, selectedRowIndices, onApply, onCancel])\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n data-grid-popover=\"\"\n align=\"start\"\n sideOffset={4}\n className=\"w-[280px] p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {editor}\n </PopoverContent>\n </Popover>\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 DownloadIcon,\n EyeOffIcon,\n HashIcon,\n ListChecksIcon,\n ListIcon,\n ListTreeIcon,\n PencilIcon,\n PinIcon,\n PinOffIcon,\n TextInitialIcon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\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 { BulkEditPopover, EditableCellVariant, EditableCellVariantsSet } from './bulk-edit-popover'\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 'hierarchy':\n return { icon: ListTreeIcon, label: 'Hierarchy' }\n case 'checkbox':\n return { icon: CheckSquareIcon, label: 'Checkbox' }\n case 'date':\n return { icon: CalendarIcon, label: 'Date' }\n case 'download-file':\n return { icon: DownloadIcon, label: 'File download' }\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 const [bulkEditOpen, setBulkEditOpen] = 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 enableBulkEdit = column.columnDef.meta?.enableBulkEdit ?? false\n const selectedRowCount = Object.keys(table.getState().rowSelection).length\n const showBulkEdit =\n enableBulkEdit &&\n selectedRowCount > 1 &&\n cellVariant != null &&\n EditableCellVariantsSet.has(cellVariant?.variant as EditableCellVariant)\n\n // close the popover properly if rows are no longer selected (e.g. user clicked somewhere else)\n React.useEffect(() => {\n if (!showBulkEdit) {\n setBulkEditOpen(false)\n }\n }, [showBulkEdit])\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={bulkEditOpen ? false : 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 {showBulkEdit ? (\n // Spacer that reserves space for the pencil button (rendered outside the trigger to avoid nesting interactive elements)\n <span className=\"inline-block size-4 shrink-0\" />\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 ) : null}\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 {/* Bulk edit button + popover — rendered outside the DropdownMenu to avoid event nesting */}\n {showBulkEdit && cellVariant && (\n <BulkEditPopover\n table={table}\n cell={cellVariant}\n columnId={column.id}\n open={bulkEditOpen}\n onOpenChange={setBulkEditOpen}\n selectedRowCount={selectedRowCount}\n >\n <Button\n title={`Bulk edit ${label}`}\n variant=\"ghost\"\n size=\"iconSm\"\n className=\"absolute left-2 top-1/2 -translate-y-1/2 size-5 hover:bg-primary hover:text-background\"\n >\n <PencilIcon className=\"size-3.5\" />\n </Button>\n </BulkEditPopover>\n )}\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): (() => void) | undefined => {\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\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 // biome-ignore lint/correctness/useExhaustiveDependencies: we want to memoize by all values\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 /** Key that changes when column pinning state changes */\n columnPinningKey: string\n /** Version number that changes when column definitions/metadata change (e.g., gantt date ranges) */\n columnDefsVersion: number\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 column pinning changed\n if (prev.columnPinningKey !== next.columnPinningKey) {\n return false\n }\n\n // Re-render if highlighted state changed\n if (prev.isHighlighted !== next.isHighlighted) {\n return false\n }\n\n // Re-render if column definitions version changed (e.g., gantt date range picker)\n if (prev.columnDefsVersion !== next.columnDefsVersion) {\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 columnPinningKey: _columnPinningKey,\n columnDefsVersion: _columnDefsVersion,\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('shrink-0 overflow-hidden', {\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 { ChevronDownIcon, ChevronUpIcon, XIcon } 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 <XIcon />\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 forceHeight?: boolean\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 forceHeight = false,\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 const columnDefsVersion = meta?.columnDefsVersion ?? 0\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 // Create a key that changes when column pinning changes\n const pinningState = table.getState().columnPinning\n const columnPinningKey = `${(pinningState.left ?? []).join(',')}|${(pinningState.right ?? []).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={cn(\n 'relative grid select-none overflow-auto rounded-md border border-border focus:outline-none',\n forceHeight && 'content-start',\n )}\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: `${\n forceHeight && height\n ? height\n : Math.min(\n rowVirtualizer.getTotalSize() + headerHeight + footerHeight + scrollbarHeight + 3,\n height ?? Infinity,\n )\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 shrink-0', {\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\n key={col.id}\n className=\"shrink-0 px-3\"\n style={{ width: `calc(var(--col-${col.id}-size) * 1px)` }}\n >\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 columnPinningKey={columnPinningKey}\n columnDefsVersion={columnDefsVersion}\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 * 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 cellValue = cell.getValue()\n const cellValueAsBoolean = Boolean(cellValue)\n const [value, setValue] = React.useState(cellValueAsBoolean)\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(cellValueAsBoolean)\n }, [cellValueAsBoolean])\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 { DownloadIcon } from 'lucide-react'\n\nimport { Button } from '../../button/button'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport type { CellVariantProps } from './cell-variant-types'\n\nexport function DownloadFileCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, unknown>>) {\n const cellOpts = cell.column.columnDef.meta?.cell\n const downloadCellOpts = cellOpts?.variant === 'download-file' ? cellOpts : undefined\n const cellValue = cell.getValue()\n const row = cell.row.original\n\n const resolvedUrl =\n downloadCellOpts?.getUrl?.(cellValue, row) ?? (typeof cellValue === 'string' ? cellValue : undefined)\n\n const resolvedFileName =\n typeof downloadCellOpts?.fileName === 'function'\n ? downloadCellOpts.fileName(row, cellValue)\n : downloadCellOpts?.fileName\n\n const label = downloadCellOpts?.label ?? 'Download'\n\n return (\n <DataGridCellWrapper\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n >\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden outline-none\">\n {resolvedUrl ? (\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"h-7 gap-1 px-2\">\n <a href={resolvedUrl} download={resolvedFileName} target=\"_blank\" rel=\"noreferrer\">\n <DownloadIcon className=\"size-3.5\" />\n {label}\n </a>\n </Button>\n ) : (\n <span className=\"text-muted-foreground\">-</span>\n )}\n </div>\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 // Calculate the visible portion of the bar within the timeline bounds\n // barWidthMs will be negative if there's no overlap (bar completely outside timeline)\n const barWidthMs = hasValidDates\n ? Math.min(initialValue.end.getTime(), timelineEndMs) - Math.max(initialValue.start.getTime(), timelineStartMs)\n : 0\n\n // Only show bar if there's actual overlap with the timeline (positive width)\n const hasVisibleBar = hasValidDates && barWidthMs > 0\n\n // Calculate spacer width (distance from timeline start to bar start, clamped to timeline bounds)\n const msUntilStart = hasVisibleBar ? Math.max(0, initialValue.start.getTime() - timelineStartMs) : 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 {hasVisibleBar && (\n <>\n <div\n className=\"shrink-0\"\n style={{\n width: `${(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 * 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, XIcon } 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 // Sync internal state when the external data changes (e.g. from bulk edit).\n // SelectCell has an equivalent useEffect for its scalar value.\n React.useEffect(() => {\n setSelectedValues(cellValue)\n }, [cellValue])\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 <XIcon 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 rounded-none\"\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 { cn } from '../../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../select/select'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\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 { options: arrayOptions, optionsMap, optionsRenderer } = cellOpts?.variant === 'select' ? cellOpts : {}\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 // Map-based options: direct O(1) lookup\n if (optionsMap) {\n const data = optionsMap.get(value ?? '')\n if (optionsRenderer) {\n return optionsRenderer(data, 'cell')\n }\n return data ?? 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, optionsRenderer])\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n // Stores { value, data } where data is the raw value from the map (string or object)\n const options = React.useMemo(() => {\n if (!isEditing) {\n return []\n } // Don't build array if not editing\n if (arrayOptions) {\n return arrayOptions.map((opt) => ({ value: opt.value, data: opt.label }))\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, data]) => ({ value: id, data }))\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 || optionsRenderer) {\n editingContent = (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <div\n className={cn(\n 'size-full',\n !optionsRenderer &&\n 'items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1',\n )}\n >\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 {hasSearch && (\n <CommandInput ref={inputRef} placeholder=\"Search...\" className=\"h-auto flex-1 p-0 rounded-none\" />\n )}\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n className={optionsRenderer ? 'py-1' : undefined}\n onSelect={() => {\n onValueChange(option.value)\n }}\n >\n {optionsRenderer ? optionsRenderer(option.data, 'option') : <span>{option.data}</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.data}\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 ? (\n editingContent\n ) : optionsRenderer ? (\n displayLabel\n ) : (\n <span data-slot=\"grid-cell-content\">{displayLabel}</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 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 { DownloadFileCell } from './cell-variants/download-file-cell'\nimport { GanttCell } from './cell-variants/gantt-cell'\nimport { HierarchyCell } from './cell-variants/hierarchy-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 'hierarchy':\n return (\n <HierarchyCell\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 'download-file':\n return (\n <DownloadFileCell\n cell={cell as Cell<TData, unknown>}\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 * 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 type { Table } from '@tanstack/react-table'\n\nimport {\n BookmarkIcon,\n CheckIcon,\n GlobeIcon,\n GripHorizontalIcon,\n PlusIcon,\n SaveIcon,\n Settings2Icon,\n TagIcon,\n Trash2Icon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Checkbox } from '../checkbox/checkbox'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../command/command'\nimport { Input } from '../input/input'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\nimport { Separator } from '../separator/separator'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip/tooltip'\n\nexport type SavedView = {\n id: string\n name: string\n isGlobal: boolean\n userId: string\n}\n\nexport type DataGridViewMenuProps<TData> = {\n table: Table<TData>\n /** List of saved views (both user's own and global views). */\n savedViews?: SavedView[]\n /** The currently active/applied saved view ID. */\n activeViewId?: string | null\n /** The current user's ID - used to determine which views the user can edit/delete. */\n currentUserId?: string\n /** Whether the current user has admin privileges. Controls visibility of the \"share with all users\" option and edit/delete on global views. */\n isAdmin?: boolean\n /** Called when the user selects a saved view to apply. */\n onApplyView?: (viewId: string) => void\n /** Called when the user wants to save the current table state as a new view. */\n onSaveView?: (args: { name: string; isGlobal: boolean }) => void\n /** Called when the user wants to update an existing view with the current table state. */\n onUpdateView?: (viewId: string) => void\n /** Called when the user renames a view. */\n onRenameView?: (viewId: string, name: string) => void\n /** Called when the user deletes a view. */\n onDeleteView?: (viewId: string) => void\n /** Called when the user clears the active view (back to default). */\n onClearView?: () => void\n} & React.ComponentProps<typeof PopoverContent>\n\nexport function DataGridViewMenu<TData>({\n table,\n savedViews,\n activeViewId,\n currentUserId,\n isAdmin,\n onApplyView,\n onSaveView,\n onUpdateView,\n onRenameView,\n onDeleteView,\n onClearView,\n ...props\n}: 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 // Saved views UI state\n const [isCreating, setIsCreating] = React.useState(false)\n const [newViewName, setNewViewName] = React.useState('')\n const [newViewGlobal, setNewViewGlobal] = React.useState(false)\n const [renamingViewId, setRenamingViewId] = React.useState<string | null>(null)\n const [renameValue, setRenameValue] = React.useState('')\n const [deletingViewId, setDeletingViewId] = React.useState<string | null>(null)\n const [updatingViewId, setUpdatingViewId] = React.useState<string | null>(null)\n\n function resetAllStates() {\n setIsCreating(false)\n setNewViewName('')\n setRenamingViewId(null)\n setRenameValue('')\n setDeletingViewId(null)\n setUpdatingViewId(null)\n setSearchQuery('')\n }\n\n // Keep order in sync with external changes to table state\n const tableColumnOrder = table.getState().columnOrder\n React.useEffect(() => {\n const stateOrder = tableColumnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n setOrder(stateOrder)\n return\n }\n setOrder(table.getAllColumns().map((c) => c.id))\n }, [table, tableColumnOrder])\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 // Sort views: global first, then personal; alphabetical by name within each group\n const sortedViews = React.useMemo(() => {\n if (!savedViews || savedViews.length === 0) {\n return savedViews\n }\n return [...savedViews].sort((a, b) => {\n if (a.isGlobal !== b.isGlobal) {\n return a.isGlobal ? -1 : 1\n }\n return a.name.localeCompare(b.name)\n })\n }, [savedViews])\n\n const hasSavedViews = sortedViews && sortedViews.length > 0\n const hasViewsFeature = onSaveView !== undefined\n\n function handleSaveView() {\n if (!newViewName.trim() || !onSaveView) {\n return\n }\n onSaveView({ name: newViewName.trim(), isGlobal: newViewGlobal })\n resetAllStates()\n }\n\n function handleRenameView() {\n if (!renamingViewId || !renameValue.trim() || !onRenameView) {\n return\n }\n onRenameView(renamingViewId, renameValue.trim())\n resetAllStates()\n }\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (open) {\n resetAllStates()\n }\n }}\n >\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-64 p-0 m-4 mt-0', isDragging ? 'cursor-grabbing' : '')} {...props}>\n {/* Saved Views Section */}\n {hasViewsFeature && (\n <>\n <div className=\"px-3 pt-3 pb-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Saved Views</span>\n </div>\n </div>\n {hasSavedViews ? (\n <div className=\"px-1 pb-1 max-h-40 overflow-y-auto\">\n {sortedViews.map((view) => {\n const isActive = activeViewId === view.id\n const isOwner = currentUserId === view.userId\n const canEdit = view.isGlobal ? !!isAdmin : isOwner\n\n if (renamingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <Input\n variant=\"simple\"\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleRenameView()\n }\n if (e.key === 'Escape') {\n setRenamingViewId(null)\n setRenameValue('')\n }\n }}\n className=\"min-h-6\"\n autoFocus\n />\n <Button variant=\"ghost\" size=\"iconXs\" onClick={handleRenameView}>\n <CheckIcon className=\"size-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n setRenamingViewId(null)\n setRenameValue('')\n }}\n >\n <XIcon className=\"size-3\" />\n </Button>\n </div>\n )\n }\n\n if (deletingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <span className=\"text-xs text-destructive truncate flex-1\">\n Delete "{view.name}"?\n </span>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n onDeleteView?.(view.id)\n setDeletingViewId(null)\n }}\n >\n Delete\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n setDeletingViewId(null)\n }}\n >\n Cancel\n </Button>\n </div>\n )\n }\n\n if (updatingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <span className=\"text-xs text-muted-foreground truncate flex-1\">\n Overwrite "{view.name}"?\n </span>\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n onUpdateView?.(view.id)\n setUpdatingViewId(null)\n }}\n >\n Overwrite\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n setUpdatingViewId(null)\n }}\n >\n Cancel\n </Button>\n </div>\n )\n }\n\n return (\n <div\n key={view.id}\n className={cn(\n 'relative flex items-center text-start gap-1 px-2 h-6 rounded-sm cursor-pointer group hover:bg-accent',\n isActive && 'bg-accent/50',\n )}\n >\n <button\n type=\"button\"\n className=\"absolute inset-0 hover:cursor-pointer\"\n onClick={() => onApplyView?.(view.id)}\n aria-label={`Apply view \"${view.name}\"`}\n />\n {view.isGlobal ? (\n <GlobeIcon\n className={cn('size-3.5 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground')}\n />\n ) : (\n <BookmarkIcon\n className={cn('size-3.5 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground')}\n />\n )}\n <span className=\"text-sm truncate flex-1\">{view.name}</span>\n\n {isActive ? <CheckIcon className=\"group-hover:hidden size-3.5 text-primary shrink-0\" /> : null}\n {canEdit && (\n <div className=\"relative z-10 hidden group-hover:flex items-center shrink-0\">\n {onUpdateView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n resetAllStates()\n setUpdatingViewId(view.id)\n }}\n >\n <SaveIcon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Overwrite with current state</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n {onRenameView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n resetAllStates()\n setRenamingViewId(view.id)\n setRenameValue(view.name)\n }}\n >\n <TagIcon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Rename view</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n {onDeleteView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => {\n resetAllStates()\n setDeletingViewId(view.id)\n }}\n >\n <Trash2Icon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Delete view</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ) : (\n !isCreating && (\n <div className=\"px-3 pb-1\">\n <span className=\"text-xs text-muted-foreground\">No saved views</span>\n </div>\n )\n )}\n\n {/* Create new view form */}\n {isCreating ? (\n <div className=\"px-2 pb-2 space-y-1\">\n <Input\n variant=\"simple\"\n value={newViewName}\n onChange={(e) => setNewViewName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleSaveView()\n }\n if (e.key === 'Escape') {\n resetAllStates()\n }\n }}\n placeholder=\"View name...\"\n className=\"min-h-7 text-xs\"\n autoFocus\n />\n <div className=\"flex items-center justify-between gap-2\">\n {isAdmin && (\n <label className=\"flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer select-none\">\n <Checkbox checked={newViewGlobal} onChange={(e) => setNewViewGlobal(e.target.checked)} />\n <GlobeIcon className=\"size-4\" />\n Share with all users\n </label>\n )}\n <div className=\"ml-auto flex items-center gap-1 py-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={() => {\n resetAllStates()\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={handleSaveView}\n disabled={!newViewName.trim()}\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"px-2 pb-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs w-full justify-start gap-1\"\n onClick={() => {\n resetAllStates()\n setIsCreating(true)\n }}\n >\n <PlusIcon className=\"size-3\" />\n Save current view\n </Button>\n </div>\n )}\n\n <Separator />\n </>\n )}\n\n {/* Column Settings Section */}\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 )}\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\">\n {column.columnDef.meta?.label ??\n (typeof column.columnDef.header === 'string' ? column.columnDef.header : column.id)}\n </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 )}\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 resetAllStates()\n resetTableView()\n onClearView?.()\n }}\n >\n Reset view\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ColumnDef, RowData } from '@tanstack/react-table'\n\nimport { TrashIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../../button/button'\nimport { Checkbox } from '../../checkbox/checkbox'\n\ntype RowWithId = { id: string }\n\ntype SelectColumnOptions<TData extends RowData & RowWithId> = {\n /**\n * Callback to handle removing selected rows.\n * Receives array of row IDs. If not provided, delete button won't show.\n */\n onRemoveRows?: (ids: TData['id'][]) => void\n /**\n * Column ID. Defaults to 'select'.\n */\n id?: string\n /**\n * Width of the column in pixels.\n * @default 70\n */\n size?: number\n}\n\n/**\n * Creates a selection column with checkboxes for row selection.\n * Includes a header checkbox for selecting all rows and an optional delete button.\n *\n * @example\n * ```tsx\n * const columns = [\n * createSelectColumn<MyDataType>({\n * onRemoveRows: (ids) => handleDelete(ids),\n * }),\n * // ... other columns\n * ]\n * ```\n */\nexport function createSelectColumn<TData extends RowData & RowWithId>(\n options: SelectColumnOptions<TData> = {},\n): ColumnDef<TData, unknown> {\n const { onRemoveRows, id = 'select', size = 70 } = options\n\n return {\n id,\n header: ({ table }) => (\n <div className=\"size-full p-0 m-0 flex items-center gap-2\">\n <Checkbox\n variant={table.getIsSomePageRowsSelected() ? 'default' : 'simple'}\n iconStyle={table.getIsSomePageRowsSelected() ? 'default' : 'simple'}\n checkIcon=\"check\"\n checked={table.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()}\n onChange={(e) => table.toggleAllPageRowsSelected(!!e.target.checked)}\n />\n {onRemoveRows && (\n <Button\n variant=\"ghost\"\n className=\"size-5 hover:[&_svg]:text-background hover:bg-destructive/90\"\n onClick={() => {\n const toRemove = table.getSelectedRowModel().rows.map((row) => row.original.id)\n if (toRemove.length === 0) {\n return\n }\n onRemoveRows(toRemove)\n table.toggleAllRowsSelected(false)\n }}\n >\n <TrashIcon />\n </Button>\n )}\n </div>\n ),\n cell: ({ row }) => (\n <div className=\"size-full flex items-center px-3\">\n <Checkbox\n variant=\"simple\"\n iconStyle=\"simple\"\n checkIcon=\"check\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onChange={(e) => row.toggleSelected(!!e.target.checked)}\n />\n </div>\n ),\n size,\n enableSorting: false,\n enableHiding: false,\n }\n}\n","import {\n type ColumnDef,\n getCoreRowModel,\n getSortedRowModel,\n type Row,\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 /** Optional className applied to each row. Can be a static string or a function receiving the TanStack Row object. */\n rowClassName?: string | ((row: Row<TData>) => string | undefined)\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 /**\n * Whether to persist column state (order, visibility, pinning) to localStorage.\n * Set by default to `false` for using a view system that manages its own persistence.\n * @default false\n */\n persistColumnState?: boolean\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 rowClassName,\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 persistColumnState = false,\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 // Track column definitions version - increments when columns array reference changes.\n // This is used to force row re-renders when column metadata (like gantt date ranges) changes.\n const columnDefsVersionRef = React.useRef(0)\n const prevColumnsRef = React.useRef(columns)\n if (prevColumnsRef.current !== columns) {\n prevColumnsRef.current = columns\n columnDefsVersionRef.current += 1\n }\n const columnDefsVersion = columnDefsVersionRef.current\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 // When persistColumnState is false (e.g. when a view system manages persistence), skip localStorage entirely.\n const storageKey = React.useMemo(() => {\n if (!persistColumnState || 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, persistColumnState])\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(...)`, column visibility, and column pinning.\n // Columns are returned in visual order: left-pinned, center (unpinned), right-pinned.\n const getNavigableColumnIds = React.useCallback(() => {\n const t = tableRef.current\n if (t) {\n return [...t.getLeftVisibleLeafColumns(), ...t.getCenterVisibleLeafColumns(), ...t.getRightVisibleLeafColumns()]\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 // Use rowUpdatesMap (which has original data indices) instead of the raw\n // updateArray (which may contain visual row indices).\n const currentMeta = tableRef.current?.options.meta\n if (currentMeta?.onCellChange) {\n for (const [originalRowIndex, cellUpdates] of rowUpdatesMap) {\n for (const { columnId, value } of cellUpdates) {\n try {\n currentMeta.onCellChange({ rowIndex: originalRowIndex, columnId, value })\n } catch (_) {\n // Ignore handler errors here to avoid breaking the grid behavior\n }\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 // Resolve the actual data property key: prefer accessorKey over columnId\n // so columns where id !== accessorKey (e.g. id:'assignee', accessorKey:'assigneeId') update correctly.\n const col = currentTable?.getColumn(columnId)\n const colDef = col?.columnDef as Record<string, unknown> | undefined\n const dataKey = typeof colDef?.accessorKey === 'string' ? colDef.accessorKey : columnId\n updatedRow[dataKey] = 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 // Check column-level editability before entering edit mode\n const col = tableRef.current?.getColumn(columnId)\n const editable = col?.columnDef?.meta?.editable\n if (editable === false) {\n return\n }\n if (typeof editable === 'function') {\n const row = tableRef.current?.getRowModel().rows[rowIndex]?.original\n if (row && !editable(row)) {\n return\n }\n }\n\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 rowClassName,\n columnDefsVersion,\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 rowClassName,\n columnDefsVersion,\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 { 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<'div'> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), 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 { Button } from '../button/button'\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../card/card'\nimport { Spinner } from '../spinner/spinner'\n\nexport type InfoCardVariant = 'loading' | 'error' | 'info' | 'not-found'\n\ntype InfoCardProps = {\n variant: InfoCardVariant\n title: string\n message: string\n showHomeButton?: boolean\n children?: React.ReactNode\n}\n\nconst variantStyles: Record<InfoCardVariant, { titleClass: string; messageContainerClass: string }> = {\n loading: {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n error: {\n titleClass: 'text-destructive',\n messageContainerClass: 'p-4 bg-destructive/10 border border-destructive/20 rounded-md',\n },\n info: {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n 'not-found': {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n}\n\nexport const InfoCard = ({ variant, title, message, showHomeButton = false, children }: InfoCardProps) => {\n const styles = variantStyles[variant]\n\n return (\n <div className=\"flex w-full pt-4 px-4 h-(--content-without-header) items-center justify-center\">\n <Card className=\"max-w-xl w-full\">\n <CardHeader>\n <CardTitle className={styles.titleClass}>\n <span className=\"flex items-center gap-2\">\n {variant === 'loading' && (\n /* using style instead of className here since the spinner would flash full screen for the split second the class names aren't loaded yet after reload */\n <div style={{ width: 20, height: 20 }}>\n <Spinner />\n </div>\n )}\n {title}\n </span>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className={styles.messageContainerClass}>\n <p className=\"text-sm wrap-break-word\">{message}</p>\n </div>\n {children}\n </CardContent>\n {showHomeButton && (\n <CardFooter>\n <Button asChild>\n <a href=\"/\">Back to Home</a>\n </Button>\n </CardFooter>\n )}\n </Card>\n </div>\n )\n}\n","import {\n type Announcements,\n closestCenter,\n closestCorners,\n type CollisionDetection,\n defaultDropAnimationSideEffects,\n DndContext,\n type DndContextProps,\n type DragCancelEvent,\n type DragEndEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n type DropAnimation,\n type DroppableContainer,\n getFirstCollision,\n KeyboardCode,\n type KeyboardCoordinateGetter,\n KeyboardSensor,\n MeasuringStrategy,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n type UniqueIdentifier,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n type AnimateLayoutChanges,\n arrayMove,\n defaultAnimateLayoutChanges,\n horizontalListSortingStrategy,\n SortableContext,\n type SortableContextProps,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nconst directions: string[] = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left]\n\nconst coordinateGetter: KeyboardCoordinateGetter = (event, { context }) => {\n const { active, droppableRects, droppableContainers, collisionRect } = context\n\n if (directions.includes(event.code)) {\n event.preventDefault()\n\n if (!active || !collisionRect) {\n return\n }\n\n const filteredContainers: DroppableContainer[] = []\n\n for (const entry of droppableContainers.getEnabled()) {\n if (!entry || entry?.disabled) {\n return\n }\n\n const rect = droppableRects.get(entry.id)\n\n if (!rect) {\n return\n }\n\n const data = entry.data.current\n\n if (data) {\n const { type, children } = data\n\n if (type === 'container' && children?.length > 0) {\n if (active.data.current?.type !== 'container') {\n return\n }\n }\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Left:\n if (collisionRect.left >= rect.left + rect.width) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Right:\n if (collisionRect.left + collisionRect.width <= rect.left) {\n filteredContainers.push(entry)\n }\n break\n }\n }\n\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null,\n })\n const closestId = getFirstCollision(collisions, 'id')\n\n if (closestId != null) {\n const newDroppable = droppableContainers.get(closestId)\n const newNode = newDroppable?.node.current\n const newRect = newDroppable?.rect.current\n\n if (newNode && newRect) {\n if (newDroppable.id === 'placeholder') {\n return {\n x: newRect.left + (newRect.width - collisionRect.width) / 2,\n y: newRect.top + (newRect.height - collisionRect.height) / 2,\n }\n }\n\n if (newDroppable.data.current?.type === 'container') {\n return {\n x: newRect.left + 20,\n y: newRect.top + 74,\n }\n }\n\n return {\n x: newRect.left,\n y: newRect.top,\n }\n }\n }\n }\n\n return undefined\n}\n\nconst ROOT_NAME = 'Kanban'\nconst BOARD_NAME = 'KanbanBoard'\nconst COLUMN_NAME = 'KanbanColumn'\nconst COLUMN_HANDLE_NAME = 'KanbanColumnHandle'\nconst ITEM_NAME = 'KanbanItem'\nconst ITEM_HANDLE_NAME = 'KanbanItemHandle'\nconst OVERLAY_NAME = 'KanbanOverlay'\n\ntype KanbanContextValue<T> = {\n id: string\n items: Record<UniqueIdentifier, T[]>\n modifiers: DndContextProps['modifiers']\n strategy: SortableContextProps['strategy']\n orientation: 'horizontal' | 'vertical'\n activeId: UniqueIdentifier | null\n setActiveId: (id: UniqueIdentifier | null) => void\n getItemValue: (item: T) => UniqueIdentifier\n flatCursor: boolean\n}\n\nconst KanbanContext = React.createContext<KanbanContextValue<unknown> | null>(null)\n\nfunction useKanbanContext(consumerName: string) {\n const context = React.useContext(KanbanContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\ntype GetItemValue<T> = {\n /**\n * Callback that returns a unique identifier for each kanban item. Required for array of objects.\n * @example getItemValue={(item) => item.id}\n */\n getItemValue: (item: T) => UniqueIdentifier\n}\n\ntype KanbanRootProps<T> = Omit<DndContextProps, 'collisionDetection'> &\n (T extends object ? GetItemValue<T> : Partial<GetItemValue<T>>) & {\n value: Record<UniqueIdentifier, T[]>\n onValueChange?: (columns: Record<UniqueIdentifier, T[]>) => void\n onMove?: (event: DragEndEvent & { activeIndex: number; overIndex: number }) => void\n strategy?: SortableContextProps['strategy']\n orientation?: 'horizontal' | 'vertical'\n flatCursor?: boolean\n }\n\nfunction KanbanRoot<T>(props: KanbanRootProps<T>) {\n const {\n value,\n onValueChange,\n modifiers,\n strategy = verticalListSortingStrategy,\n orientation = 'horizontal',\n onMove,\n getItemValue: getItemValueProp,\n accessibility,\n flatCursor = false,\n ...kanbanProps\n } = props\n\n const id = React.useId()\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n const lastOverIdRef = React.useRef<UniqueIdentifier | null>(null)\n const hasMovedRef = React.useRef(false)\n const sensors = useSensors(\n useSensor(MouseSensor),\n useSensor(TouchSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n )\n\n const getItemValue = React.useCallback(\n (item: T): UniqueIdentifier => {\n if (typeof item === 'object' && !getItemValueProp) {\n throw new Error('`getItemValue` is required when using array of objects')\n }\n return getItemValueProp ? getItemValueProp(item) : (item as UniqueIdentifier)\n },\n [getItemValueProp],\n )\n\n const getColumn = React.useCallback(\n (id: UniqueIdentifier) => {\n if (id in value) {\n return id\n }\n\n for (const [columnId, items] of Object.entries(value)) {\n if (items.some((item) => getItemValue(item) === id)) {\n return columnId\n }\n }\n\n return null\n },\n [value, getItemValue],\n )\n\n const collisionDetection: CollisionDetection = React.useCallback(\n (args) => {\n if (activeId && activeId in value) {\n return closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter((container) => container.id in value),\n })\n }\n\n const pointerIntersections = pointerWithin(args)\n const intersections = pointerIntersections.length > 0 ? pointerIntersections : rectIntersection(args)\n let overId = getFirstCollision(intersections, 'id')\n\n if (!overId) {\n if (hasMovedRef.current) {\n lastOverIdRef.current = activeId\n }\n return lastOverIdRef.current ? [{ id: lastOverIdRef.current }] : []\n }\n\n if (overId in value) {\n const containerItems = value[overId]\n if (containerItems && containerItems.length > 0) {\n const closestItem = closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (container) =>\n container.id !== overId && containerItems.some((item) => getItemValue(item) === container.id),\n ),\n })\n\n if (closestItem.length > 0) {\n overId = closestItem[0]?.id ?? overId\n }\n }\n }\n\n lastOverIdRef.current = overId\n return [{ id: overId }]\n },\n [activeId, value, getItemValue],\n )\n\n const onDragStart = React.useCallback(\n (event: DragStartEvent) => {\n kanbanProps.onDragStart?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n setActiveId(event.active.id)\n },\n [kanbanProps],\n )\n\n const onDragOver = React.useCallback(\n (event: DragOverEvent) => {\n kanbanProps.onDragOver?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n const { active, over } = event\n if (!over) {\n return\n }\n\n const activeColumn = getColumn(active.id)\n const overColumn = getColumn(over.id)\n\n if (!activeColumn || !overColumn) {\n return\n }\n\n if (activeColumn === overColumn) {\n const items = value[activeColumn]\n if (!items) {\n return\n }\n\n const activeIndex = items.findIndex((item) => getItemValue(item) === active.id)\n const overIndex = items.findIndex((item) => getItemValue(item) === over.id)\n\n if (activeIndex !== overIndex) {\n const newColumns = { ...value }\n newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex)\n onValueChange?.(newColumns)\n }\n } else {\n const activeItems = value[activeColumn]\n const overItems = value[overColumn]\n\n if (!activeItems || !overItems) {\n return\n }\n\n const activeIndex = activeItems.findIndex((item) => getItemValue(item) === active.id)\n\n if (activeIndex === -1) {\n return\n }\n\n const activeItem = activeItems[activeIndex]\n if (!activeItem) {\n return\n }\n\n const updatedItems = {\n ...value,\n [activeColumn]: activeItems.filter((item) => getItemValue(item) !== active.id),\n [overColumn]: [...overItems, activeItem],\n }\n\n onValueChange?.(updatedItems)\n hasMovedRef.current = true\n }\n },\n [kanbanProps, getColumn, value, getItemValue, onValueChange],\n )\n\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n kanbanProps.onDragEnd?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n return\n }\n\n if (active.id in value && over.id in value) {\n const activeIndex = Object.keys(value).indexOf(active.id as string)\n const overIndex = Object.keys(value).indexOf(over.id as string)\n\n if (activeIndex !== overIndex) {\n const orderedColumns = Object.keys(value)\n const newOrder = arrayMove(orderedColumns, activeIndex, overIndex)\n\n const newColumns: Record<UniqueIdentifier, T[]> = {}\n for (const key of newOrder) {\n const items = value[key]\n if (items) {\n newColumns[key] = items\n }\n }\n\n if (onMove) {\n onMove({ ...event, activeIndex, overIndex })\n } else {\n onValueChange?.(newColumns)\n }\n }\n } else {\n const activeColumn = getColumn(active.id)\n const overColumn = getColumn(over.id)\n\n if (!activeColumn || !overColumn) {\n setActiveId(null)\n return\n }\n\n if (activeColumn === overColumn) {\n const items = value[activeColumn]\n if (!items) {\n setActiveId(null)\n return\n }\n\n const activeIndex = items.findIndex((item) => getItemValue(item) === active.id)\n const overIndex = items.findIndex((item) => getItemValue(item) === over.id)\n\n if (activeIndex !== overIndex) {\n const newColumns = { ...value }\n newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex)\n if (onMove) {\n onMove({\n ...event,\n activeIndex,\n overIndex,\n })\n } else {\n onValueChange?.(newColumns)\n }\n }\n }\n }\n\n setActiveId(null)\n hasMovedRef.current = false\n },\n [kanbanProps, value, onMove, onValueChange, getColumn, getItemValue],\n )\n\n const onDragCancel = React.useCallback(\n (event: DragCancelEvent) => {\n kanbanProps.onDragCancel?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n setActiveId(null)\n hasMovedRef.current = false\n },\n [kanbanProps],\n )\n\n const announcements: Announcements = React.useMemo(\n () => ({\n onDragStart({ active }) {\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(active.id as string) + 1\n : (() => {\n const column = getColumn(active.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === active.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(active.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n return `Picked up ${itemType} at position ${position} of ${total}`\n },\n onDragOver({ active, over }) {\n if (!over) {\n return\n }\n\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(over.id as string) + 1\n : (() => {\n const column = getColumn(over.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === over.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(over.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n const overColumn = getColumn(over.id)\n const activeColumn = getColumn(active.id)\n\n if (isColumn) {\n return `${itemType} is now at position ${position} of ${total}`\n }\n\n if (activeColumn !== overColumn) {\n return `${itemType} is now at position ${position} of ${total} in ${overColumn}`\n }\n\n return `${itemType} is now at position ${position} of ${total}`\n },\n onDragEnd({ active, over }) {\n if (!over) {\n return\n }\n\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(over.id as string) + 1\n : (() => {\n const column = getColumn(over.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === over.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(over.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n const overColumn = getColumn(over.id)\n const activeColumn = getColumn(active.id)\n\n if (isColumn) {\n return `${itemType} was dropped at position ${position} of ${total}`\n }\n\n if (activeColumn !== overColumn) {\n return `${itemType} was dropped at position ${position} of ${total} in ${overColumn}`\n }\n\n return `${itemType} was dropped at position ${position} of ${total}`\n },\n onDragCancel({ active }) {\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n return `Dragging was cancelled. ${itemType} was dropped.`\n },\n }),\n [value, getColumn, getItemValue],\n )\n\n const contextValue = React.useMemo<KanbanContextValue<T>>(\n () => ({\n id,\n items: value,\n modifiers,\n strategy,\n orientation,\n activeId,\n setActiveId,\n getItemValue,\n flatCursor,\n }),\n [id, value, activeId, modifiers, strategy, orientation, getItemValue, flatCursor],\n )\n\n return (\n <KanbanContext.Provider value={contextValue as KanbanContextValue<unknown>}>\n <DndContext\n collisionDetection={collisionDetection}\n modifiers={modifiers}\n sensors={sensors}\n {...kanbanProps}\n id={id}\n measuring={{\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n }}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n announcements,\n screenReaderInstructions: {\n draggable: `\n To pick up a kanban item or column, press space or enter.\n While dragging, use the arrow keys to move the item.\n Press space or enter again to drop the item in its new position, or press escape to cancel.\n `,\n },\n ...accessibility,\n }}\n />\n </KanbanContext.Provider>\n )\n}\n\nconst KanbanBoardContext = React.createContext<boolean>(false)\n\ntype KanbanBoardProps = {\n children: React.ReactNode\n asChild?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanBoard(props: KanbanBoardProps) {\n const { asChild, className, ref, ...boardProps } = props\n\n const context = useKanbanContext(BOARD_NAME)\n\n const columns = React.useMemo(() => {\n return Object.keys(context.items)\n }, [context.items])\n\n const BoardPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanBoardContext.Provider value={true}>\n <SortableContext\n items={columns}\n strategy={context.orientation === 'horizontal' ? horizontalListSortingStrategy : verticalListSortingStrategy}\n >\n <BoardPrimitive\n aria-orientation={context.orientation}\n data-orientation={context.orientation}\n data-slot=\"kanban-board\"\n {...boardProps}\n ref={ref}\n className={cn(\n 'flex size-full gap-4',\n context.orientation === 'horizontal' ? 'flex-row' : 'flex-col',\n className,\n )}\n />\n </SortableContext>\n </KanbanBoardContext.Provider>\n )\n}\n\ntype KanbanColumnContextValue = {\n id: string\n attributes: DraggableAttributes\n listeners: DraggableSyntheticListeners | undefined\n setActivatorNodeRef: (node: HTMLElement | null) => void\n isDragging?: boolean\n disabled?: boolean\n}\n\nconst KanbanColumnContext = React.createContext<KanbanColumnContextValue | null>(null)\n\nfunction useKanbanColumnContext(consumerName: string) {\n const context = React.useContext(KanbanColumnContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${COLUMN_NAME}\\``)\n }\n return context\n}\n\nconst animateLayoutChanges: AnimateLayoutChanges = (args) => defaultAnimateLayoutChanges({ ...args, wasDragging: true })\n\ntype KanbanColumnProps = {\n value: UniqueIdentifier\n children: React.ReactNode\n asChild?: boolean\n asHandle?: boolean\n disabled?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanColumn(props: KanbanColumnProps) {\n const { value, asChild, asHandle, disabled, className, style, ref, ...columnProps } = props\n\n const id = React.useId()\n const context = useKanbanContext(COLUMN_NAME)\n const inBoard = React.useContext(KanbanBoardContext)\n const inOverlay = React.useContext(KanbanOverlayContext)\n\n if (!inBoard && !inOverlay) {\n throw new Error(`\\`${COLUMN_NAME}\\` must be used within \\`${BOARD_NAME}\\` or \\`${OVERLAY_NAME}\\``)\n }\n\n if (value === '') {\n throw new Error(`\\`${COLUMN_NAME}\\` value cannot be an empty string`)\n }\n\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: value,\n disabled,\n animateLayoutChanges,\n })\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (disabled) {\n return\n }\n setNodeRef(node)\n })\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Transform.toString(transform),\n transition,\n ...style,\n }\n }, [transform, transition, style])\n\n const items = React.useMemo(() => {\n const items = context.items[value] ?? []\n return items.map((item) => context.getItemValue(item))\n }, [context, value])\n\n const columnContext = React.useMemo<KanbanColumnContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n )\n\n const ColumnPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanColumnContext.Provider value={columnContext}>\n <SortableContext\n items={items}\n strategy={context.orientation === 'horizontal' ? horizontalListSortingStrategy : verticalListSortingStrategy}\n >\n <ColumnPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? '' : undefined}\n data-slot=\"kanban-column\"\n {...columnProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n 'flex size-full flex-col gap-2 rounded-lg border bg-zinc-100 p-2.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:bg-zinc-900',\n {\n 'touch-none select-none': asHandle,\n 'cursor-default': context.flatCursor,\n 'data-dragging:cursor-grabbing': !context.flatCursor,\n 'cursor-grab': !isDragging && asHandle && !context.flatCursor,\n 'opacity-50': isDragging,\n 'pointer-events-none opacity-50': disabled,\n },\n className,\n )}\n />\n </SortableContext>\n </KanbanColumnContext.Provider>\n )\n}\n\ntype KanbanColumnHandleProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\nfunction KanbanColumnHandle(props: KanbanColumnHandleProps) {\n const { asChild, disabled, className, ref, ...columnHandleProps } = props\n\n const context = useKanbanContext(COLUMN_NAME)\n const columnContext = useKanbanColumnContext(COLUMN_HANDLE_NAME)\n\n const isDisabled = disabled ?? columnContext.disabled\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (isDisabled) {\n return\n }\n columnContext.setActivatorNodeRef(node)\n })\n\n const HandlePrimitive = asChild ? Slot : 'button'\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={columnContext.id}\n data-disabled={isDisabled}\n data-dragging={columnContext.isDragging ? '' : undefined}\n data-slot=\"kanban-column-handle\"\n {...columnHandleProps}\n {...(isDisabled ? {} : columnContext.attributes)}\n {...(isDisabled ? {} : columnContext.listeners)}\n ref={composedRef}\n className={cn(\n 'select-none disabled:pointer-events-none disabled:opacity-50',\n context.flatCursor ? 'cursor-default' : 'cursor-grab data-dragging:cursor-grabbing',\n className,\n )}\n disabled={isDisabled}\n />\n )\n}\n\ntype KanbanItemContextValue = {\n id: string\n attributes: DraggableAttributes\n listeners: DraggableSyntheticListeners | undefined\n setActivatorNodeRef: (node: HTMLElement | null) => void\n isDragging?: boolean\n disabled?: boolean\n}\n\nconst KanbanItemContext = React.createContext<KanbanItemContextValue | null>(null)\n\nfunction useKanbanItemContext(consumerName: string) {\n const context = React.useContext(KanbanItemContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``)\n }\n return context\n}\n\ntype KanbanItemProps = {\n value: UniqueIdentifier\n asHandle?: boolean\n asChild?: boolean\n disabled?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanItem(props: KanbanItemProps) {\n const { value, style, asHandle, asChild, disabled, className, ref, ...itemProps } = props\n\n const id = React.useId()\n const context = useKanbanContext(ITEM_NAME)\n const inBoard = React.useContext(KanbanBoardContext)\n const inOverlay = React.useContext(KanbanOverlayContext)\n\n if (!inBoard && !inOverlay) {\n throw new Error(`\\`${ITEM_NAME}\\` must be used within \\`${BOARD_NAME}\\``)\n }\n\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: value,\n disabled,\n })\n\n if (value === '') {\n throw new Error(`\\`${ITEM_NAME}\\` value cannot be an empty string`)\n }\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (disabled) {\n return\n }\n setNodeRef(node)\n })\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Transform.toString(transform),\n transition,\n ...style,\n }\n }, [transform, transition, style])\n\n const itemContext = React.useMemo<KanbanItemContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n )\n\n const ItemPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanItemContext.Provider value={itemContext}>\n <ItemPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? '' : undefined}\n data-slot=\"kanban-item\"\n {...itemProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n 'focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1',\n {\n 'touch-none select-none': asHandle,\n 'cursor-default': context.flatCursor,\n 'data-dragging:cursor-grabbing': !context.flatCursor,\n 'cursor-grab': !isDragging && asHandle && !context.flatCursor,\n 'opacity-50': isDragging,\n 'pointer-events-none opacity-50': disabled,\n },\n className,\n )}\n />\n </KanbanItemContext.Provider>\n )\n}\n\ntype KanbanItemHandleProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\nfunction KanbanItemHandle(props: KanbanItemHandleProps) {\n const { asChild, disabled, className, ref, ...itemHandleProps } = props\n\n const context = useKanbanContext(ITEM_HANDLE_NAME)\n const itemContext = useKanbanItemContext(ITEM_HANDLE_NAME)\n\n const isDisabled = disabled ?? itemContext.disabled\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (isDisabled) {\n return\n }\n itemContext.setActivatorNodeRef(node)\n })\n\n const HandlePrimitive = asChild ? Slot : 'button'\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={itemContext.id}\n data-disabled={isDisabled}\n data-dragging={itemContext.isDragging ? '' : undefined}\n data-slot=\"kanban-item-handle\"\n {...itemHandleProps}\n {...(isDisabled ? {} : itemContext.attributes)}\n {...(isDisabled ? {} : itemContext.listeners)}\n ref={composedRef}\n className={cn(\n 'select-none disabled:pointer-events-none disabled:opacity-50',\n context.flatCursor ? 'cursor-default' : 'cursor-grab data-dragging:cursor-grabbing',\n className,\n )}\n disabled={isDisabled}\n />\n )\n}\n\nconst KanbanOverlayContext = React.createContext(false)\n\nconst dropAnimation: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.4',\n },\n },\n }),\n}\n\ntype KanbanOverlayProps = {\n container?: Element | DocumentFragment | null\n children?: React.ReactNode | ((params: { value: UniqueIdentifier; variant: 'column' | 'item' }) => React.ReactNode)\n} & Omit<React.ComponentProps<typeof DragOverlay>, 'children'>\n\nfunction KanbanOverlay(props: KanbanOverlayProps) {\n const { container: containerProp, children, ...overlayProps } = props\n\n const context = useKanbanContext(OVERLAY_NAME)\n\n const [mounted, setMounted] = React.useState(false)\n\n React.useLayoutEffect(() => setMounted(true), [])\n\n const container = containerProp ?? (mounted ? globalThis.document?.body : null)\n\n if (!container) {\n return null\n }\n\n const variant = context.activeId && context.activeId in context.items ? 'column' : 'item'\n\n return ReactDOM.createPortal(\n <DragOverlay\n dropAnimation={dropAnimation}\n modifiers={context.modifiers}\n className={cn(!context.flatCursor && 'cursor-grabbing')}\n {...overlayProps}\n >\n <KanbanOverlayContext.Provider value={true}>\n {context.activeId && children\n ? typeof children === 'function'\n ? children({\n value: context.activeId,\n variant,\n })\n : children\n : null}\n </KanbanOverlayContext.Provider>\n </DragOverlay>,\n container,\n )\n}\n\nexport {\n KanbanRoot as Kanban,\n KanbanBoard,\n KanbanColumn,\n KanbanColumnHandle,\n KanbanItem,\n KanbanItemHandle,\n KanbanOverlay,\n //\n KanbanRoot as Root,\n KanbanBoard as Board,\n KanbanColumn as Column,\n KanbanColumnHandle as ColumnHandle,\n KanbanItem as Item,\n KanbanItemHandle as ItemHandle,\n KanbanOverlay as Overlay,\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nimport { Input, type InputProps } from '..'\n\nexport type DeferredInputProps = Omit<InputProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: string\n /**\n * Called when the user commits the value (on blur or Enter key)\n * Only fires if the value has actually changed\n */\n onCommit: (value: string) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: string) => void\n /**\n * If true, also commits on Enter key press (default: true)\n */\n commitOnEnter?: boolean\n}\n\n/**\n * An Input that buffers changes locally and only commits to the parent\n * on blur or Enter key press. Useful for forms where you don't want to\n * trigger expensive operations (like API calls) on every keystroke.\n */\nexport function DeferredInput({\n value,\n onCommit,\n onValueChange,\n commitOnEnter = true,\n onBlur,\n onKeyDown,\n ...props\n}: DeferredInputProps) {\n const [localValue, setLocalValue] = useState(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n onValueChange?.(newValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (commitOnEnter && e.key === 'Enter') {\n e.currentTarget.blur()\n }\n onKeyDown?.(e)\n },\n [commitOnEnter, onKeyDown],\n )\n\n return <Input {...props} value={localValue} onChange={handleChange} onBlur={handleBlur} onKeyDown={handleKeyDown} />\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nimport { NumberInput, type NumberInputProps } from '..'\n\nexport type DeferredNumberInputProps = Omit<NumberInputProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: number | null\n /**\n * Called when the user commits the value (on blur or Enter key)\n * Only fires if the value has actually changed\n */\n onCommit: (value: number | null) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: number | null) => void\n /**\n * If true, also commits on Enter key press (default: true)\n */\n commitOnEnter?: boolean\n}\n\n/**\n * A NumberInput that buffers changes locally and only commits to the parent\n * on blur or Enter key press. Useful for forms where you don't want to\n * trigger expensive operations (like API calls) on every keystroke.\n */\nexport function DeferredNumberInput({\n value,\n onCommit,\n onValueChange,\n commitOnEnter = true,\n onBlur,\n onEnter,\n ...props\n}: DeferredNumberInputProps) {\n const [localValue, setLocalValue] = useState<number | null>(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (newValue: number | undefined) => {\n const normalizedValue = newValue ?? null\n setLocalValue(normalizedValue)\n onValueChange?.(normalizedValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n const handleEnter = useCallback(() => {\n if (commitOnEnter) {\n commitValue()\n }\n onEnter?.()\n }, [commitOnEnter, commitValue, onEnter])\n\n return (\n <NumberInput\n {...props}\n value={localValue ?? undefined}\n onChange={handleChange}\n onBlur={handleBlur}\n onEnter={handleEnter}\n />\n )\n}\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, DialogDescription, 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 aria-describedby={subtitle ? undefined : 'modal-content'}\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 && <DialogDescription asChild>{subtitle}</DialogDescription>}\n {!subtitle && <DialogDescription className=\"sr-only\">Modal content</DialogDescription>}\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\" id=\"modal-content\">\n {children}\n </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, testId } 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 __e2e_test_id__?: string\n }\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, __e2e_test_id__, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n data-test-id={__e2e_test_id__}\n {...props}\n >\n <SheetPrimitive.Close\n 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 data-test-id={testId(__e2e_test_id__, 'close')}\n >\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 * as React from 'react'\n\nimport { cn, TooltipProvider, useIsMobile } from '../index'\n\nexport const SIDEBAR_WIDTH = '16rem'\nexport const SIDEBAR_WIDTH_MOBILE = '18rem'\nexport const SIDEBAR_WIDTH_ICON = '3rem'\nexport const SIDEBAR_KEYBOARD_SHORTCUT = 'b'\nexport const SIDEBAR_KEYBOARD_SHORTCUT_RIGHT = '.'\nexport const SIDEBAR_MIN_WIDTH = 200\nexport const SIDEBAR_MAX_WIDTH = 600\n\n// -- Public types --\n\nexport type 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 width: number | undefined\n setWidth: (width: number) => void\n isResizing: boolean\n minWidth: number\n maxWidth: number\n}\n\n// -- Internal store type --\n\ntype SidebarRegistryEntry = { side: 'left' | 'right'; minWidth: number; maxWidth: number }\n\ntype SidebarProviderState = {\n openStates: Record<string, boolean>\n mobileStates: Record<string, boolean>\n widthStates: Record<string, number | undefined>\n sidebarRegistry: Record<string, SidebarRegistryEntry>\n setOpen: (id: string, open: boolean) => void\n setOpenMobile: (id: string, open: boolean) => void\n setWidth: (id: string, width: number) => void\n registerSidebar: (id: string, config: SidebarRegistryEntry) => void\n unregisterSidebar: (id: string) => void\n isMobile: boolean\n defaultOpen: boolean\n isResizing: boolean\n setIsResizing: React.Dispatch<React.SetStateAction<boolean>>\n providerMinWidth: number\n providerMaxWidth: number\n}\n\n// -- Contexts --\n\n/**\n * Internal store context. Exported for use by `Sidebar` component in the same\n * package to build per-sidebar resize contexts.\n */\nexport const SidebarContext = React.createContext<SidebarProviderState | null>(null)\n\n/**\n * Context that identifies which sidebar a component belongs to.\n * Set by `<Sidebar sidebarId=\"...\">`, consumed by `useSidebar()`.\n */\nexport const SidebarIdContext = React.createContext<string>('default')\n\n// -- Hook --\n\n/**\n * Returns the state and controls for a specific sidebar.\n *\n * @param sidebarId - Optional explicit sidebar ID. Falls back to the nearest\n * `SidebarIdContext` (set by the parent `<Sidebar>`), then to `\"default\"`.\n */\nexport function useSidebar(sidebarId?: string): SidebarContextProps {\n const store = React.useContext(SidebarContext)\n const ctxId = React.useContext(SidebarIdContext)\n const id = sidebarId ?? ctxId\n\n if (!store) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n const open = store.openStates[id] ?? store.defaultOpen\n const openMobile = store.mobileStates[id] ?? false\n const width = store.widthStates[id]\n const { isMobile, isResizing } = store\n\n const registry = store.sidebarRegistry[id]\n const minWidth = registry?.minWidth ?? store.providerMinWidth\n const maxWidth = registry?.maxWidth ?? store.providerMaxWidth\n\n const setOpen = React.useCallback((value: boolean) => store.setOpen(id, value), [store.setOpen, id])\n\n const setOpenMobile = React.useCallback((value: boolean) => store.setOpenMobile(id, value), [store.setOpenMobile, id])\n\n const setWidth = React.useCallback((value: number) => store.setWidth(id, value), [store.setWidth, id])\n\n const toggleSidebar = React.useCallback(() => {\n if (store.isMobile) {\n store.setOpenMobile(id, !(store.mobileStates[id] ?? false))\n } else {\n store.setOpen(id, !(store.openStates[id] ?? store.defaultOpen))\n }\n }, [store, id])\n\n const state = open ? 'expanded' : 'collapsed'\n\n return React.useMemo(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n width,\n setWidth,\n isResizing,\n minWidth,\n maxWidth,\n }),\n [\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n width,\n setWidth,\n isResizing,\n minWidth,\n maxWidth,\n ],\n )\n}\n\n/**\n * Returns a list of all registered sidebars with their IDs and sides.\n */\nexport function useRegisteredSidebars(): { sidebarId: string; side: 'left' | 'right' }[] {\n const store = React.useContext(SidebarContext)\n if (!store) {\n throw new Error('useRegisteredSidebars must be used within a SidebarProvider.')\n }\n return React.useMemo(\n () => Object.entries(store.sidebarRegistry).map(([sidebarId, entry]) => ({ sidebarId, side: entry.side })),\n [store.sidebarRegistry],\n )\n}\n\n// -- Provider --\n\n/** Shape persisted to localStorage under `storageKey`. */\ntype StoredSidebarStates = Record<string, { open: boolean; width?: number }>\n\nexport function SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n width: widthProp,\n onWidthChange,\n minWidth = SIDEBAR_MIN_WIDTH,\n maxWidth = SIDEBAR_MAX_WIDTH,\n storageKey,\n defaultOpenSidebars,\n defaultWidths,\n keyboardShortcuts,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n /** Controlled width for the \"default\" sidebar (backward compat). */\n width?: number\n /** Called when the \"default\" sidebar width changes via resize (backward compat). */\n onWidthChange?: (width: number) => void\n minWidth?: number\n maxWidth?: number\n storageKey?: string\n defaultOpenSidebars?: Record<string, boolean>\n /** Default widths per sidebar ID (in pixels). */\n defaultWidths?: Record<string, number>\n /** Keyboard shortcuts mapping: key character → sidebar ID. Uses Ctrl/Cmd modifier.\n * Defaults to `{ b: 'default' }`. Set to `false` to disable all shortcuts. */\n keyboardShortcuts?: Record<string, string> | false\n}) {\n const isMobile = useIsMobile()\n const [isResizing, setIsResizing] = React.useState(false)\n\n // Read localStorage once on mount for both open & width states\n const storedRef = React.useRef<StoredSidebarStates | null>(null)\n if (storedRef.current === null && storageKey) {\n try {\n storedRef.current = JSON.parse(localStorage.getItem(storageKey) ?? '{}') as StoredSidebarStates\n } catch {\n storedRef.current = {}\n }\n }\n\n // -- Open states --\n\n const [openStates, setOpenStates] = React.useState<Record<string, boolean>>(() => {\n const states: Record<string, boolean> = { default: defaultOpen }\n if (defaultOpenSidebars) {\n Object.assign(states, defaultOpenSidebars)\n }\n if (storedRef.current) {\n for (const [id, data] of Object.entries(storedRef.current)) {\n if (data && typeof data === 'object' && 'open' in data) {\n states[id] = data.open\n }\n }\n }\n return states\n })\n\n const [mobileStates, setMobileStates] = React.useState<Record<string, boolean>>({})\n\n // Sync controlled \"default\" sidebar from parent\n React.useEffect(() => {\n if (openProp !== undefined) {\n setOpenStates((prev) => (prev['default'] === openProp ? prev : { ...prev, default: openProp }))\n }\n }, [openProp])\n\n // Compute effective open states (controlled mode override for \"default\")\n const effectiveOpenStates = React.useMemo(() => {\n if (openProp !== undefined) {\n return { ...openStates, default: openProp }\n }\n return openStates\n }, [openStates, openProp])\n\n // -- Width states --\n\n const [widthStates, setWidthStates] = React.useState<Record<string, number | undefined>>(() => {\n const states: Record<string, number | undefined> = {}\n if (widthProp !== undefined) {\n states['default'] = widthProp\n }\n if (defaultWidths) {\n Object.assign(states, defaultWidths)\n }\n if (storedRef.current) {\n for (const [id, data] of Object.entries(storedRef.current)) {\n if (data && typeof data === 'object' && typeof data.width === 'number') {\n states[id] = data.width\n }\n }\n }\n return states\n })\n\n // Sync controlled \"default\" sidebar width from parent\n React.useEffect(() => {\n if (widthProp !== undefined) {\n setWidthStates((prev) => (prev['default'] === widthProp ? prev : { ...prev, default: widthProp }))\n }\n }, [widthProp])\n\n // Compute effective width states (controlled mode override for \"default\")\n const effectiveWidthStates = React.useMemo(() => {\n if (widthProp !== undefined) {\n return { ...widthStates, default: widthProp }\n }\n return widthStates\n }, [widthStates, widthProp])\n\n // -- Persistence --\n\n React.useEffect(() => {\n if (!storageKey) {\n return\n }\n const toStore: StoredSidebarStates = {}\n const allIds = new Set([...Object.keys(openStates), ...Object.keys(widthStates)])\n for (const id of allIds) {\n toStore[id] = {\n open: openStates[id] ?? defaultOpen,\n ...(widthStates[id] === undefined ? {} : { width: widthStates[id] }),\n }\n }\n localStorage.setItem(storageKey, JSON.stringify(toStore))\n }, [storageKey, openStates, widthStates, defaultOpen])\n\n // -- Callbacks --\n\n const setOpen = React.useCallback(\n (id: string, open: boolean) => {\n if (id === 'default' && setOpenProp) {\n setOpenProp(open)\n }\n setOpenStates((prev) => ({ ...prev, [id]: open }))\n },\n [setOpenProp],\n )\n\n const setOpenMobile = React.useCallback((id: string, open: boolean) => {\n setMobileStates((prev) => ({ ...prev, [id]: open }))\n }, [])\n\n const setWidth = React.useCallback(\n (id: string, width: number) => {\n if (id === 'default' && onWidthChange) {\n onWidthChange(width)\n }\n setWidthStates((prev) => ({ ...prev, [id]: width }))\n },\n [onWidthChange],\n )\n\n // -- Sidebar registry (sidebarId → side + resize bounds) --\n\n const [sidebarRegistry, setSidebarRegistry] = React.useState<Record<string, SidebarRegistryEntry>>({})\n\n const registerSidebar = React.useCallback((id: string, config: SidebarRegistryEntry) => {\n setSidebarRegistry((prev) => {\n const existing = prev[id]\n if (\n existing &&\n existing.side === config.side &&\n existing.minWidth === config.minWidth &&\n existing.maxWidth === config.maxWidth\n ) {\n return prev\n }\n return { ...prev, [id]: config }\n })\n }, [])\n\n const unregisterSidebar = React.useCallback((id: string) => {\n setSidebarRegistry((prev) => {\n const { [id]: _, ...rest } = prev\n return rest\n })\n }, [])\n\n // -- Keyboard shortcuts --\n\n const effectiveOpenStatesRef = React.useRef(effectiveOpenStates)\n effectiveOpenStatesRef.current = effectiveOpenStates\n\n const resolvedShortcuts = React.useMemo(() => {\n if (keyboardShortcuts === false) {\n return {}\n }\n return keyboardShortcuts ?? { [SIDEBAR_KEYBOARD_SHORTCUT]: 'default' }\n }, [keyboardShortcuts])\n\n React.useEffect(() => {\n const entries = Object.entries(resolvedShortcuts)\n if (entries.length === 0) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey)) {\n return\n }\n\n for (const [key, sidebarId] of entries) {\n if (event.key === key) {\n event.preventDefault()\n if (isMobile) {\n setMobileStates((prev) => ({ ...prev, [sidebarId]: !(prev[sidebarId] ?? false) }))\n } else {\n const currentOpen = effectiveOpenStatesRef.current[sidebarId] ?? defaultOpen\n setOpen(sidebarId, !currentOpen)\n }\n return\n }\n }\n }\n\n globalThis.addEventListener('keydown', handleKeyDown)\n return () => globalThis.removeEventListener('keydown', handleKeyDown)\n }, [resolvedShortcuts, isMobile, defaultOpen, setOpen])\n\n // -- Store value --\n\n const storeValue = React.useMemo<SidebarProviderState>(\n () => ({\n openStates: effectiveOpenStates,\n mobileStates,\n widthStates: effectiveWidthStates,\n sidebarRegistry,\n setOpen,\n setOpenMobile,\n setWidth,\n registerSidebar,\n unregisterSidebar,\n isMobile,\n defaultOpen,\n isResizing,\n setIsResizing,\n providerMinWidth: minWidth,\n providerMaxWidth: maxWidth,\n }),\n [\n effectiveOpenStates,\n mobileStates,\n effectiveWidthStates,\n sidebarRegistry,\n setOpen,\n setOpenMobile,\n setWidth,\n registerSidebar,\n unregisterSidebar,\n isMobile,\n defaultOpen,\n isResizing,\n minWidth,\n maxWidth,\n ],\n )\n\n // Default sidebar width for the CSS variable on the wrapper\n const defaultWidth = effectiveWidthStates['default']\n const sidebarWidthValue = defaultWidth ? `${defaultWidth}px` : SIDEBAR_WIDTH\n\n return (\n <SidebarContext.Provider value={storeValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': sidebarWidthValue,\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","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { PanelLeftIcon, PanelRightIcon } 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 TooltipTrigger,\n} from '../index'\n\nimport {\n SIDEBAR_MAX_WIDTH,\n SIDEBAR_MIN_WIDTH,\n SIDEBAR_WIDTH,\n SIDEBAR_WIDTH_ICON,\n SIDEBAR_WIDTH_MOBILE,\n SidebarContext,\n SidebarIdContext,\n useSidebar,\n} from './sidebar-context-provider'\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n sidebarId = 'default',\n minWidth,\n maxWidth,\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 sidebarId?: string\n minWidth?: number\n maxWidth?: number\n}) {\n const { isMobile, state, openMobile, setOpenMobile, width, isResizing } = useSidebar(sidebarId)\n const store = React.useContext(SidebarContext)\n\n // Register this sidebar (side + resize bounds) on mount; unregister on unmount.\n // Use a ref for store to avoid re-triggering the effect when store reference\n // changes (registerSidebar itself causes a store update).\n const storeRef = React.useRef(store)\n storeRef.current = store\n\n const effectiveMinWidth = minWidth ?? store?.providerMinWidth ?? SIDEBAR_MIN_WIDTH\n const effectiveMaxWidth = maxWidth ?? store?.providerMaxWidth ?? SIDEBAR_MAX_WIDTH\n\n React.useEffect(() => {\n storeRef.current?.registerSidebar(sidebarId, { side, minWidth: effectiveMinWidth, maxWidth: effectiveMaxWidth })\n return () => storeRef.current?.unregisterSidebar(sidebarId)\n }, [sidebarId, side, effectiveMinWidth, effectiveMaxWidth])\n\n // Compute CSS variable for this sidebar's width\n const sidebarWidthValue = width ? `${width}px` : SIDEBAR_WIDTH\n const sidebarStyle = {\n '--sidebar-width': sidebarWidthValue,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n } as React.CSSProperties\n\n const wrappedChildren = <SidebarIdContext.Provider value={sidebarId}>{children}</SidebarIdContext.Provider>\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n style={sidebarStyle}\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {wrappedChildren}\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\">{wrappedChildren}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n style={sidebarStyle}\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 isResizing && 'duration-0',\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 isResizing && 'duration-0',\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 {wrappedChildren}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n sidebarId,\n children,\n ...props\n}: React.ComponentProps<typeof Button> & { sidebarId?: string }) {\n const { toggleSidebar } = useSidebar(sidebarId)\n const store = React.useContext(SidebarContext)\n const ctxId = React.useContext(SidebarIdContext)\n const resolvedId = sidebarId ?? ctxId\n const side = store?.sidebarRegistry[resolvedId]?.side\n const Icon = side === 'right' ? PanelRightIcon : PanelLeftIcon\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 {children ?? (\n <>\n <Icon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </>\n )}\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar, setWidth, minWidth, maxWidth } = useSidebar()\n const store = React.useContext(SidebarContext)\n const startXRef = React.useRef(0)\n const hasDraggedRef = React.useRef(false)\n\n const sidebarId = React.useContext(SidebarIdContext)\n const isResizable = !!store?.sidebarRegistry[sidebarId]\n\n const handleMouseDown = React.useCallback(\n (e: React.MouseEvent) => {\n if (!isResizable) {\n return\n }\n e.preventDefault()\n startXRef.current = e.clientX\n hasDraggedRef.current = false\n store?.setIsResizing(true)\n\n const sidebarEl = (e.target as HTMLElement).closest('[data-slot=\"sidebar-container\"]')\n const sidebarLeft = sidebarEl?.getBoundingClientRect().left ?? 0\n const side = (e.target as HTMLElement).closest('[data-side]')?.getAttribute('data-side')\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (Math.abs(moveEvent.clientX - startXRef.current) > 3) {\n hasDraggedRef.current = true\n }\n let newWidth: number\n if (side === 'right') {\n const sidebarRight = sidebarEl?.getBoundingClientRect().right ?? globalThis.innerWidth\n newWidth = sidebarRight - moveEvent.clientX\n } else {\n newWidth = moveEvent.clientX - sidebarLeft\n }\n if (newWidth >= minWidth && newWidth <= maxWidth) {\n setWidth(newWidth)\n }\n }\n\n const handleMouseUp = () => {\n store?.setIsResizing(false)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n },\n [isResizable, store, setWidth, minWidth, maxWidth],\n )\n\n const handleClick = React.useCallback(() => {\n if (hasDraggedRef.current) {\n return\n }\n toggleSidebar()\n }, [toggleSidebar])\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseDown={isResizable ? handleMouseDown : undefined}\n title={isResizable ? 'Resize / Toggle Sidebar' : '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 isResizable\n ? 'cursor-col-resize'\n : [\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 ],\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 SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n}\n","import type { badgeVariants } from '@/badge/badge'\n\nimport type { VariantProps } from 'class-variance-authority'\nimport type { LucideIcon } from 'lucide-react'\nimport * as React from 'react'\n\nexport type SidebarSide = 'left' | 'right'\n\nexport type SidebarTabBadge = {\n label: string\n variant?: VariantProps<typeof badgeVariants>['variant']\n className?: string\n}\n\nexport type SidebarTabDefinition = {\n id: string\n icon: LucideIcon\n label: string\n render: () => React.ReactNode\n order?: number\n badge?: SidebarTabBadge\n}\n\ntype SidebarTabsState = {\n tabs: Partial<Record<SidebarSide, SidebarTabDefinition[]>>\n activeTab: Partial<Record<SidebarSide, string | null>>\n register: (side: SidebarSide, tab: SidebarTabDefinition) => void\n unregister: (side: SidebarSide, tabId: string) => void\n setActiveTab: (side: SidebarSide, tabId: string | null) => void\n}\n\nexport const SidebarTabsContext = React.createContext<SidebarTabsState | null>(null)\n\nexport function SidebarTabsProvider({ children }: Readonly<{ children: React.ReactNode }>) {\n const [tabsMap, setTabsMap] = React.useState<Partial<Record<SidebarSide, Map<string, SidebarTabDefinition>>>>({})\n const [activeTab, setActiveTabState] = React.useState<Partial<Record<SidebarSide, string | null>>>({})\n\n const register = React.useCallback((side: SidebarSide, tab: SidebarTabDefinition) => {\n setTabsMap((prev) => {\n const next = new Map(prev[side])\n next.set(tab.id, tab)\n return { ...prev, [side]: next }\n })\n // Auto-select first tab if nothing active\n setActiveTabState((prev) => {\n if (prev[side] === undefined || prev[side] === null) {\n return { ...prev, [side]: tab.id }\n }\n return prev\n })\n }, [])\n\n const unregister = React.useCallback((side: SidebarSide, tabId: string) => {\n setTabsMap((prev) => {\n const next = new Map(prev[side])\n next.delete(tabId)\n return { ...prev, [side]: next }\n })\n setActiveTabState((prev) => {\n if (prev[side] === tabId) {\n return { ...prev, [side]: null }\n }\n return prev\n })\n }, [])\n\n const setActiveTab = React.useCallback((side: SidebarSide, tabId: string | null) => {\n setActiveTabState((prev) => {\n if (prev[side] === tabId) {\n return prev\n }\n return { ...prev, [side]: tabId }\n })\n }, [])\n\n const sortedTabs = React.useMemo(() => {\n const sort = (map: Map<string, SidebarTabDefinition>) =>\n [...map.values()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n const result = {} as Record<SidebarSide, SidebarTabDefinition[]>\n for (const [side, map] of Object.entries(tabsMap) as [SidebarSide, Map<string, SidebarTabDefinition>][]) {\n result[side] = sort(map)\n }\n return result\n }, [tabsMap])\n\n const value = React.useMemo<SidebarTabsState>(\n () => ({\n tabs: sortedTabs,\n activeTab,\n register,\n unregister,\n setActiveTab,\n }),\n [sortedTabs, activeTab, register, unregister, setActiveTab],\n )\n\n return <SidebarTabsContext.Provider value={value}>{children}</SidebarTabsContext.Provider>\n}\n\nexport function useSidebarTabs(side?: SidebarSide) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('useSidebarTabs must be used within a SidebarTabsProvider.')\n }\n\n const boundSetActiveTab = React.useCallback(\n (tabId: string | null) => {\n if (side) {\n ctx.setActiveTab(side, tabId)\n }\n },\n [ctx.setActiveTab, side],\n )\n\n const boundResult = React.useMemo(\n () =>\n side\n ? {\n tabs: ctx.tabs[side] ?? [],\n activeTab: ctx.activeTab[side] ?? null,\n setActiveTab: boundSetActiveTab,\n }\n : null,\n [side, ctx.tabs, ctx.activeTab, boundSetActiveTab],\n )\n\n if (side) {\n return boundResult!\n }\n return ctx\n}\n","import * as React from 'react'\n\nimport { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from '../index'\n\nimport { Sidebar, SidebarContent, SidebarHeader, SidebarRail, SidebarSeparator } from './sidebar'\nimport { useSidebar } from './sidebar-context-provider'\nimport { type SidebarSide, type SidebarTabDefinition, SidebarTabsContext } from './sidebar-tab-context-provider'\n\n// ---------------------------------------------------------------------------\n// SidebarTab — declarative registration component\n// ---------------------------------------------------------------------------\n\nexport function SidebarTab({\n side,\n id,\n icon,\n label,\n render,\n order,\n badge,\n}: {\n side: SidebarSide\n} & SidebarTabDefinition) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('SidebarTab must be used within a SidebarTabsProvider.')\n }\n\n const { register, unregister } = ctx\n\n // Keep refs to the latest render fn and icon so we don't re-register on every render\n const renderRef = React.useRef(render)\n renderRef.current = render\n const iconRef = React.useRef(icon)\n iconRef.current = icon\n\n const stableRender = React.useCallback(() => renderRef.current(), [])\n\n React.useEffect(() => {\n register(side, { id, icon: iconRef.current, label, render: stableRender, order, badge })\n return () => unregister(side, id)\n // icon is accessed via iconRef to avoid re-registration when the reference changes\n }, [side, id, label, order, badge, register, unregister, stableRender])\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// DynamicTabbedSidebar — composed sidebar with icon tabbar from context\n// ---------------------------------------------------------------------------\n\nexport function DynamicTabbedSidebar({\n side,\n orientation = 'horizontal',\n collapsible = 'offcanvas',\n className,\n ...sidebarProps\n}: {\n side: SidebarSide\n orientation?: 'horizontal' | 'vertical'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n} & Omit<React.ComponentProps<typeof Sidebar>, 'side' | 'collapsible' | 'sidebarId'>) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('DynamicTabbedSidebar must be used within a SidebarTabsProvider.')\n }\n\n const { setActiveTab } = ctx\n const tabs = ctx.tabs[side] ?? []\n const activeTabId = ctx.activeTab[side] ?? null\n const activeTab = tabs.find((t) => t.id === activeTabId)\n\n // Fallback: auto-select first tab when current active is missing\n React.useEffect(() => {\n if (tabs.length > 0 && tabs[0] && !activeTab) {\n setActiveTab(side, tabs[0].id)\n }\n }, [tabs, activeTab, side, setActiveTab])\n\n const isVertical = orientation === 'vertical'\n\n // For vertical orientation, default to 'icon' collapsible so the tab strip\n // remains visible when collapsed (VS Code Activity Bar behavior).\n const effectiveCollapsible = isVertical && collapsible === 'offcanvas' ? 'icon' : collapsible\n\n // for now, we only allow one sidebar per side, so we can use the side as the sidebarId\n return (\n <Sidebar side={side} sidebarId={side} collapsible={effectiveCollapsible} className={className} {...sidebarProps}>\n <TabbedSidebarContent\n side={side}\n tabs={tabs}\n activeTabId={activeTabId}\n activeTab={activeTab}\n isVertical={isVertical}\n collapsible={effectiveCollapsible}\n />\n <SidebarRail />\n </Sidebar>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal layout wrapper — handles collapsed vs expanded for tabbed sidebars\n// ---------------------------------------------------------------------------\n\nfunction TabbedSidebarContent({\n side,\n tabs,\n activeTabId,\n activeTab,\n isVertical,\n collapsible,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n activeTab: SidebarTabDefinition | undefined\n isVertical: boolean\n collapsible: 'offcanvas' | 'icon' | 'none'\n}>) {\n const { state } = useSidebar(side)\n const isCollapsed = state === 'collapsed'\n const isIconCollapsible = collapsible === 'icon'\n\n // When collapsed with icon mode, both orientations show vertical icon strip\n if (isCollapsed && isIconCollapsible) {\n return (\n <div className=\"flex h-full flex-col\">\n <VerticalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n </div>\n )\n }\n\n if (isVertical) {\n return (\n <div className=\"flex h-full flex-row\">\n <VerticalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <SidebarContent>{activeTab?.render()}</SidebarContent>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <HorizontalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n {tabs.length > 0 && <SidebarSeparator />}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <SidebarContent>{activeTab?.render()}</SidebarContent>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal tab bar sub-components\n// ---------------------------------------------------------------------------\n\nfunction HorizontalTabBar({\n side,\n tabs,\n activeTabId,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n}>) {\n const ctx = React.useContext(SidebarTabsContext)!\n const { state, toggleSidebar } = useSidebar(side)\n\n if (tabs.length === 0) {\n return null\n }\n\n const handleTabClick = (tabId: string) => {\n if (state === 'collapsed') {\n ctx.setActiveTab(side, tabId)\n toggleSidebar()\n } else if (tabId === activeTabId) {\n toggleSidebar()\n } else {\n ctx.setActiveTab(side, tabId)\n }\n }\n\n return (\n <SidebarHeader>\n <div className=\"flex w-full items-center gap-0.5 rounded-md bg-muted p-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon\n const isActive = tab.id === activeTabId\n const badge = tab.badge\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={cn(\n 'flex flex-1 items-center justify-center rounded-sm p-1.5 transition-colors cursor-pointer group/button',\n isActive\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground',\n badge && 'pt-1',\n )}\n onClick={() => handleTabClick(tab.id)}\n >\n <Icon className=\"size-4\" />\n {badge && (\n <Badge\n size=\"xs\"\n variant={badge.variant}\n className={cn(\n 'ml-0.5 h-3.25 mb-1.25 px-1.5 group-hover/button:opacity-100 opacity-70 transition-opacity',\n isActive && 'opacity-100',\n badge.className,\n )}\n >\n {badge.label}\n </Badge>\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tab.label}</TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </SidebarHeader>\n )\n}\n\nfunction VerticalTabBar({\n side,\n tabs,\n activeTabId,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n}>) {\n const ctx = React.useContext(SidebarTabsContext)!\n const { state, toggleSidebar } = useSidebar(side)\n const isCollapsed = state === 'collapsed'\n\n if (tabs.length === 0) {\n return null\n }\n\n const handleTabClick = (tabId: string) => {\n if (isCollapsed) {\n // Collapsed: expand and select the clicked tab\n ctx.setActiveTab(side, tabId)\n toggleSidebar()\n } else if (tabId === activeTabId) {\n // Expanded + clicking active tab: collapse\n toggleSidebar()\n } else {\n // Expanded + clicking different tab: just switch\n ctx.setActiveTab(side, tabId)\n }\n }\n\n return (\n <div className=\"flex flex-col gap-1 border-r border-sidebar-border p-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon\n const isActive = tab.id === activeTabId\n const badge = tab.badge\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={cn(\n 'size-9 flex items-center justify-center rounded-md transition-colors cursor-pointer group/button',\n isActive\n ? 'bg-sidebar-accent text-sidebar-accent-foreground'\n : 'text-muted-foreground hover:text-foreground hover:bg-sidebar-accent/50',\n )}\n onClick={() => handleTabClick(tab.id)}\n >\n <Icon className=\"size-4\" />\n {badge && (\n <Badge\n size=\"xs\"\n variant={badge.variant}\n className={cn(\n 'ml-0.5 h-3.25 mb-1.25 px-1.5 group-hover/button:opacity-100 opacity-70 transition-opacity',\n isActive && 'opacity-100',\n badge.className,\n )}\n >\n {badge.label}\n </Badge>\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side={side === 'left' ? 'right' : 'left'} hidden={state === 'expanded'}>\n {tab.label}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n )\n}\n","import { ChevronDownIcon, ChevronRightIcon, 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, testId } from '../lib/utils'\n\n/**\n * Unified filter option type for slicer - supports both flat and hierarchical structures.\n * For hierarchy mode, items can have nested children forming a tree structure.\n */\nexport type SlicerFilterOption<T extends Key = string> = {\n value: T\n label: string\n /** Whether this option has matches in current cross-filter state. Defaults to true. */\n hasMatches?: boolean\n /** Child options for hierarchy mode. Presence of children on any item indicates hierarchy. */\n children?: SlicerFilterOption<T>[]\n}\n\n/**\n * Collects all descendant values from a hierarchy option.\n */\nexport function getAllDescendantValues<T extends Key>(option: SlicerFilterOption<T>): T[] {\n const values: T[] = []\n if (option.children) {\n for (const child of option.children) {\n values.push(child.value, ...getAllDescendantValues(child))\n }\n }\n return values\n}\n\n/**\n * Checks if an option or any of its descendants contain the search term.\n */\nexport function matchesSearch<T extends Key>(option: SlicerFilterOption<T>, searchTerm: string): boolean {\n const term = searchTerm.toLowerCase()\n if (option.label.toLowerCase().includes(term)) {\n return true\n }\n if (option.children) {\n return option.children.some((child) => matchesSearch(child, term))\n }\n return false\n}\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 isHierarchy,\n __e2e_test_id__,\n}: Readonly<{\n /** Filter options - can be flat or hierarchical (with children). */\n filterValues: SlicerFilterOption<T>[]\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 /** Explicitly enable hierarchy mode. If not set, auto-detects based on presence of children in filterValues. */\n isHierarchy?: boolean\n __e2e_test_id__?: string\n}>) {\n // Auto-detect hierarchy mode if not explicitly set\n const isHierarchyMode = isHierarchy ?? filterValues.some((opt) => opt.children && opt.children.length > 0)\n\n // Expanded state for hierarchy mode\n const [expandedIds, setExpandedIds] = useState<Set<T>>(() => {\n // Auto-expand single top-level item\n const firstOption = filterValues[0]\n if (filterValues.length === 1 && firstOption?.children?.length) {\n return new Set([firstOption.value])\n }\n return new Set()\n })\n\n const toggleExpand = useCallback((value: T) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n next.add(value)\n }\n return next\n })\n }, [])\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 option toggle (used by both flat and hierarchy modes)\n const handleOptionToggle = useCallback(\n (optionValue: T) => {\n const newSelected = new Set(selectedValues)\n if (newSelected.has(optionValue)) {\n newSelected.delete(optionValue)\n } else {\n newSelected.add(optionValue)\n }\n onChange(Array.from(newSelected))\n },\n [selectedValues, onChange],\n )\n\n return (\n <Card\n className={cn('flex flex-col overflow-hidden w-56 rounded shadow-sm shrink-0', className)}\n data-test-id={__e2e_test_id__}\n >\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 data-test-id={testId(__e2e_test_id__, 'search')}\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 data-test-id={testId(__e2e_test_id__, 'collapse')}\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 data-test-id={testId(__e2e_test_id__, 'clear')}\n >\n <FilterX />\n </Button>\n </CardHeader>\n {!isCollapsed && (\n <CardContent className=\"p-1 flex flex-col\">\n {/* Select all button - hidden for hierarchy mode because \"select all\" is ambiguous:\n would it select all items at every level, only top-level items (implicitly selecting\n everything underneath), only visible/expanded items, or only leaf nodes? Each\n interpretation has different filtering effects, so we omit it to avoid confusion. */}\n {!isHierarchyMode && (\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 data-test-id={testId(__e2e_test_id__, 'select-all')}\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\n <div\n className={cn('px-2 py-1 h-(--optionsHeight) shrink-0 overflow-auto', isHierarchyMode && 'px-1')}\n style={{ '--optionsHeight': `${optionsHeight}px` } as React.CSSProperties}\n >\n <SlicerOptions\n isLoading={isLoading}\n isHierarchyMode={isHierarchyMode}\n filterValues={filterValues}\n filteredOptions={filteredOptions}\n selectedValues={selectedValues}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onOptionToggle={handleOptionToggle}\n searchQuery={searchQuery}\n />\n </div>\n </CardContent>\n )}\n </Card>\n )\n}\n\nconst SlicerOptions = <T extends Key>({\n isLoading,\n isHierarchyMode,\n filterValues,\n filteredOptions,\n selectedValues,\n expandedIds,\n onToggleExpand,\n onOptionToggle,\n searchQuery,\n}: {\n isLoading: boolean\n isHierarchyMode: boolean\n filterValues: SlicerFilterOption<T>[]\n filteredOptions: SlicerFilterOption<T>[]\n selectedValues: Set<T>\n expandedIds: Set<T>\n onToggleExpand: (value: T) => void\n onOptionToggle: (value: T) => void\n searchQuery: string\n}) => {\n if (isLoading) {\n return (\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\n if (filterValues.length === 0) {\n return <div className=\"flex size-full items-center justify-center text-sm\">No options available</div>\n }\n\n // Hierarchy mode handles its own filtering via matchesSearch in SlicerHierarchyItem\n if (isHierarchyMode) {\n return filterValues.map((option) => (\n <SlicerHierarchyItem\n key={option.value}\n option={option}\n selectedValues={selectedValues}\n inheritedSelected={false}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onOptionToggle}\n searchTerm={searchQuery}\n />\n ))\n }\n\n // Flat mode - check if search filtered out all options\n if (filteredOptions.length === 0) {\n return <div className=\"flex size-full items-center justify-center text-sm\">No results found</div>\n }\n\n return filteredOptions.map((option) => (\n <SlicerItem\n key={option.value}\n option={option}\n isSelected={selectedValues.has(option.value)}\n onToggle={onOptionToggle}\n />\n ))\n}\n\nconst SlicerItem = <T extends Key>({\n option,\n isSelected,\n onToggle,\n}: {\n option: SlicerFilterOption<T>\n isSelected: boolean\n onToggle: (value: T) => void\n}) => {\n const hasMatches = option.hasMatches ?? true\n return (\n <Checkbox\n key={option.value}\n checked={isSelected}\n onChange={() => onToggle(option.value)}\n checkIcon=\"check\"\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !hasMatches && 'opacity-50',\n (option.value === '' || option.value == null) && 'italic',\n )}\n label={option.label}\n />\n )\n}\n\n/**\n * Hierarchy item component for slicer - renders a single item in the hierarchy tree.\n * Can also be used directly for hierarchy filters in other components like TableFilter.\n */\nexport const SlicerHierarchyItem = <T extends Key>({\n option,\n selectedValues,\n inheritedSelected,\n expandedIds,\n onToggleExpand,\n onSelect,\n depth = 0,\n searchTerm = '',\n}: {\n option: SlicerFilterOption<T>\n selectedValues: Set<T>\n inheritedSelected: boolean\n expandedIds: Set<T>\n onToggleExpand: (value: T) => void\n onSelect: (value: T) => void\n depth?: number\n searchTerm?: string\n}) => {\n const hasChildren = option.children && option.children.length > 0\n const isExpanded = expandedIds.has(option.value)\n const isDirectlySelected = selectedValues.has(option.value)\n const isSelected = isDirectlySelected || inheritedSelected\n const hasMatches = option.hasMatches ?? true\n\n // Check if any descendants are selected (for partial state)\n const hasSelectedDescendants = useMemo(() => {\n if (!hasChildren) {\n return false\n }\n const descendantValues = getAllDescendantValues(option)\n return descendantValues.some((val) => selectedValues.has(val))\n }, [option, selectedValues, hasChildren])\n\n // Display states: check (directly selected), minus (inherited from parent), square (some descendants selected)\n const isPartiallySelected = !isDirectlySelected && hasSelectedDescendants && !inheritedSelected\n\n // When searching, auto-expand if descendants match\n const matchesSelf = searchTerm && option.label.toLowerCase().includes(searchTerm.toLowerCase())\n const childrenMatchSearch = searchTerm && hasChildren && option.children!.some((c) => matchesSearch(c, searchTerm))\n\n // Don't render if searching and neither self nor descendants match\n if (searchTerm && !matchesSelf && !childrenMatchSearch) {\n return null\n }\n\n const shouldShowExpanded = isExpanded || (searchTerm !== '' && childrenMatchSearch)\n\n return (\n <>\n <div className=\"flex items-center\" style={{ paddingLeft: `${depth * 12}px` }}>\n {/* Expand/Collapse button */}\n {hasChildren ? (\n <Button onClick={() => onToggleExpand(option.value)} variant=\"extraGhost\" size=\"iconXs\" className=\"size-4\">\n {shouldShowExpanded ? <ChevronDownIcon className=\"size-3.5\" /> : <ChevronRightIcon className=\"size-3.5\" />}\n </Button>\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n\n {/* Checkbox with label */}\n <Checkbox\n checked={isSelected || isPartiallySelected}\n onChange={() => onSelect(option.value)}\n iconStyle={isPartiallySelected || !isDirectlySelected ? 'solo' : 'default'}\n checkIcon={isPartiallySelected ? 'square' : !isDirectlySelected ? 'minus' : 'check'}\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !hasMatches && 'opacity-50',\n inheritedSelected && !isDirectlySelected && '[&_svg]:opacity-50',\n )}\n label={option.label}\n />\n </div>\n\n {/* Render children if expanded */}\n {hasChildren && shouldShowExpanded && (\n <>\n {option.children!.map((child) => (\n <SlicerHierarchyItem\n key={child.value}\n option={child}\n selectedValues={selectedValues}\n inheritedSelected={isSelected}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onSelect}\n depth={depth + 1}\n searchTerm={searchTerm}\n />\n ))}\n </>\n )}\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 React from 'react'\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nexport { useIsomorphicLayoutEffect }\n","import * as React from 'react'\n\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect'\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props)\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props\n })\n\n return ref\n}\n\nexport { useAsRef }\n","import * as React from 'react'\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null)\n\n if (ref.current === null) {\n ref.current = fn()\n }\n\n return ref as React.RefObject<T>\n}\n\nexport { useLazyRef }\n","import { useDirection } from '@radix-ui/react-direction'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { Check } from 'lucide-react'\nimport * as React from 'react'\n\nimport { useAsRef } from '../hooks/use-as-ref'\nimport { useIsomorphicLayoutEffect } from '../hooks/use-isomorphic-layout-effect'\nimport { useLazyRef } from '../hooks/use-lazy-ref'\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nconst ROOT_NAME = 'Stepper'\nconst LIST_NAME = 'StepperList'\nconst ITEM_NAME = 'StepperItem'\nconst TRIGGER_NAME = 'StepperTrigger'\nconst INDICATOR_NAME = 'StepperIndicator'\nconst SEPARATOR_NAME = 'StepperSeparator'\nconst TITLE_NAME = 'StepperTitle'\nconst DESCRIPTION_NAME = 'StepperDescription'\nconst CONTENT_NAME = 'StepperContent'\nconst PREV_NAME = 'StepperPrev'\nconst NEXT_NAME = 'StepperNext'\n\nconst ENTRY_FOCUS = 'stepperFocusGroup.onEntryFocus'\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true }\nconst ARROW_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']\n\ntype Direction = 'ltr' | 'rtl'\ntype Orientation = 'horizontal' | 'vertical'\ntype NavigationDirection = 'next' | 'prev'\ntype ActivationMode = 'automatic' | 'manual'\ntype DataState = 'inactive' | 'active' | 'completed'\n\ntype DivProps = {\n asChild?: boolean\n} & React.ComponentProps<'div'>\ntype ButtonProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\ntype ListElement = React.ComponentRef<typeof StepperList>\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>\n\nfunction getId(id: string, variant: 'trigger' | 'content' | 'title' | 'description', value: string) {\n return `${id}-${variant}-${value}`\n}\n\ntype FocusIntent = 'first' | 'last' | 'prev' | 'next'\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: 'prev',\n ArrowUp: 'prev',\n ArrowRight: 'next',\n ArrowDown: 'next',\n PageUp: 'first',\n Home: 'first',\n PageDown: 'last',\n End: 'last',\n}\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== 'rtl') {\n return key\n }\n return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key\n}\n\nfunction getFocusIntent(event: React.KeyboardEvent<TriggerElement>, dir?: Direction, orientation?: Orientation) {\n const key = getDirectionAwareKey(event.key, dir)\n if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key)) {\n return undefined\n }\n if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key)) {\n return undefined\n }\n return MAP_KEY_TO_FOCUS_INTENT[key]\n}\n\nfunction focusFirst(candidates: React.RefObject<TriggerElement | null>[], preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current\n if (!candidate) {\n continue\n }\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) {\n return\n }\n candidate.focus({ preventScroll })\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) {\n return\n }\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>((_, index) => array[(startIndex + index) % array.length] as T)\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: 'item' | 'separator' = 'item',\n): DataState {\n const stepKeys = Array.from(steps.keys())\n const currentIndex = stepKeys.indexOf(itemValue)\n\n if (stepState?.completed) {\n return 'completed'\n }\n\n if (value === itemValue) {\n return variant === 'separator' ? 'inactive' : 'active'\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value)\n\n if (activeIndex > currentIndex) {\n return 'completed'\n }\n }\n\n return 'inactive'\n}\n\ntype StepState = {\n value: string\n completed: boolean\n disabled: boolean\n}\n\ntype StoreState = {\n steps: Map<string, StepState>\n value: string\n}\n\ntype Store = {\n subscribe: (callback: () => void) => () => void\n getState: () => StoreState\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void\n setStateWithValidation: (value: string, direction: NavigationDirection) => Promise<boolean>\n hasValidation: () => boolean\n notify: () => void\n addStep: (value: string, completed: boolean, disabled: boolean) => void\n removeStep: (value: string) => void\n setStep: (value: string, completed: boolean, disabled: boolean) => void\n}\n\nconst StoreContext = React.createContext<Store | null>(null)\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext('useStore')\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector])\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot)\n}\n\ntype ItemData = {\n id: string\n ref: React.RefObject<TriggerElement | null>\n value: string\n active: boolean\n disabled: boolean\n}\n\ntype StepperContextValue = {\n rootId: string\n dir: Direction\n orientation: Orientation\n activationMode: ActivationMode\n disabled: boolean\n nonInteractive: boolean\n loop: boolean\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null)\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\ntype StepperProps = {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n onValueComplete?: (value: string, completed: boolean) => void\n onValueAdd?: (value: string) => void\n onValueRemove?: (value: string) => void\n onValidate?: (value: string, direction: NavigationDirection) => boolean | Promise<boolean>\n activationMode?: ActivationMode\n dir?: Direction\n orientation?: Orientation\n disabled?: boolean\n loop?: boolean\n nonInteractive?: boolean\n} & DivProps\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = 'horizontal',\n activationMode = 'automatic',\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props\n\n const listenersRef = useLazyRef(() => new Set<() => void>())\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? '',\n }))\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n })\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb)\n return () => listenersRef.current.delete(cb)\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) {\n return\n }\n\n if (key === 'value' && typeof value === 'string') {\n stateRef.current.value = value\n propsRef.current.onValueChange?.(value)\n } else {\n stateRef.current[key] = value\n }\n\n store.notify()\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState('value', value)\n return true\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction)\n if (isValid) {\n store.setState('value', value)\n }\n return isValid\n } catch {\n return false\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled }\n stateRef.current.steps.set(value, newStep)\n propsRef.current.onValueAdd?.(value)\n store.notify()\n },\n removeStep: (value) => {\n stateRef.current.steps.delete(value)\n propsRef.current.onValueRemove?.(value)\n store.notify()\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value)\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled }\n stateRef.current.steps.set(value, updatedStep)\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed)\n }\n\n store.notify()\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb()\n }\n },\n }\n }, [listenersRef, stateRef, propsRef])\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState('value', value)\n }\n }, [value])\n\n const dir = useDirection(dirProp)\n\n const instanceId = React.useId()\n const rootId = id ?? instanceId\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n )\n\n const RootPrimitive = asChild ? Slot : 'div'\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? '' : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn('flex gap-6', orientation === 'horizontal' ? 'w-full flex-col' : 'flex-row', className)}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n )\n}\n\ntype FocusContextValue = {\n tabStopId: string | null\n onItemFocus: (tabStopId: string) => void\n onItemShiftTab: () => void\n onFocusableItemAdd: () => void\n onFocusableItemRemove: () => void\n onItemRegister: (item: ItemData) => void\n onItemUnregister: (id: string) => void\n getItems: () => ItemData[]\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null)\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`FocusProvider\\``)\n }\n return context\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props\n\n const context = useStepperContext(LIST_NAME)\n const orientation = context.orientation\n const currentValue = useStore((state) => state.value)\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n })\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null)\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false)\n const [focusableItemCount, setFocusableItemCount] = React.useState(0)\n const isClickFocusRef = React.useRef(false)\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map())\n const listRef = React.useRef<ListElement>(null)\n const composedRef = useComposedRefs(ref, listRef)\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId)\n }, [])\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true)\n }, [])\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1)\n }, [])\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1)\n }, [])\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item)\n }, [])\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id)\n }, [])\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current\n const elementB = b.ref.current\n if (!elementA || !elementB) {\n return 0\n }\n const position = elementA.compareDocumentPosition(elementB)\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1\n }\n return 0\n })\n }, [])\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n setIsTabbingBackOut(false)\n },\n [propsRef],\n )\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n const isKeyboardFocus = !isClickFocusRef.current\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS)\n event.currentTarget.dispatchEvent(entryFocusEvent)\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter((item) => !item.disabled)\n const selectedItem = currentValue ? items.find((item) => item.value === currentValue) : undefined\n const activeItem = items.find((item) => item.active)\n const currentItem = items.find((item) => item.id === tabStopId)\n\n const candidateItems = [selectedItem, activeItem, currentItem, ...items].filter(Boolean) as ItemData[]\n const candidateRefs = candidateItems.map((item) => item.ref)\n focusFirst(candidateRefs, false)\n }\n }\n isClickFocusRef.current = false\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n isClickFocusRef.current = true\n },\n [propsRef],\n )\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n )\n\n const ListPrimitive = asChild ? Slot : 'div'\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n 'flex outline-none',\n orientation === 'horizontal' ? 'flex-row items-center' : 'flex-col items-start',\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n )\n}\n\ntype StepperItemContextValue = {\n value: string\n stepState: StepState | undefined\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(null)\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``)\n }\n return context\n}\n\ntype StepperItemProps = {\n value: string\n completed?: boolean\n disabled?: boolean\n} & DivProps\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props\n\n const context = useStepperContext(ITEM_NAME)\n const store = useStoreContext(ITEM_NAME)\n const orientation = context.orientation\n const value = useStore((state) => state.value)\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled)\n\n return () => {\n store.removeStep(itemValue)\n }\n }, [itemValue, completed, disabled])\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled)\n }, [itemValue, completed, disabled])\n\n const stepState = useStore((state) => state.steps.get(itemValue))\n const steps = useStore((state) => state.steps)\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n )\n\n const ItemPrimitive = asChild ? Slot : 'div'\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? '' : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n 'relative flex not-last:flex-1 items-center',\n orientation === 'horizontal' ? 'flex-row' : 'flex-col',\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n )\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props\n\n const context = useStepperContext(TRIGGER_NAME)\n const itemContext = useStepperItemContext(TRIGGER_NAME)\n const itemValue = itemContext.value\n\n const store = useStoreContext(TRIGGER_NAME)\n const focusContext = useFocusContext(TRIGGER_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n const stepState = useStore((state) => state.steps.get(itemValue))\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n })\n\n const activationMode = context.activationMode\n const orientation = context.orientation\n const loop = context.loop\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue)\n\n const stepPosition = stepIndex + 1\n const stepCount = steps.size\n\n const triggerId = getId(context.rootId, 'trigger', itemValue)\n const contentId = getId(context.rootId, 'content', itemValue)\n const titleId = getId(context.rootId, 'title', itemValue)\n const descriptionId = getId(context.rootId, 'description', itemValue)\n\n const isDisabled = disabled || stepState?.disabled || context.disabled\n const isActive = value === itemValue\n const isTabStop = focusContext.tabStopId === triggerId\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const triggerRef = React.useRef<TriggerElement>(null)\n const composedRef = useComposedRefs(ref, triggerRef)\n const isArrowKeyPressedRef = React.useRef(false)\n const isMouseClickRef = React.useRef(false)\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false\n }\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('keyup', onKeyUp)\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('keyup', onKeyUp)\n }\n }, [])\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n })\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd()\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId)\n if (!isDisabled) {\n focusContext.onFocusableItemRemove()\n }\n }\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled])\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue)\n const direction = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n await store.setStateWithValidation(itemValue, direction)\n }\n },\n [isDisabled, context.nonInteractive, store, itemValue, value, steps, propsRef],\n )\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n focusContext.onItemFocus(triggerId)\n\n const isKeyboardFocus = !isMouseClickRef.current\n\n if (!isActive && !isDisabled && activationMode !== 'manual' && !context.nonInteractive && isKeyboardFocus) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue)\n const direction = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n await store.setStateWithValidation(itemValue, direction)\n }\n\n isMouseClickRef.current = false\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n )\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (event.key === 'Enter' && context.nonInteractive) {\n event.preventDefault()\n return\n }\n\n if ((event.key === 'Enter' || event.key === ' ') && activationMode === 'manual' && !context.nonInteractive) {\n event.preventDefault()\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click()\n }\n return\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n focusContext.onItemShiftTab()\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n const focusIntent = getFocusIntent(event, context.dir, orientation)\n\n if (focusIntent !== undefined) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return\n }\n event.preventDefault()\n\n const items = focusContext.getItems().filter((item) => !item.disabled)\n let candidateRefs = items.map((item) => item.ref)\n\n if (focusIntent === 'last') {\n candidateRefs.reverse()\n } else if (focusIntent === 'prev' || focusIntent === 'next') {\n if (focusIntent === 'prev') {\n candidateRefs.reverse()\n }\n const currentIndex = candidateRefs.findIndex((ref) => ref.current === event.currentTarget)\n candidateRefs = loop ? wrapArray(candidateRefs, currentIndex + 1) : candidateRefs.slice(currentIndex + 1)\n }\n\n if (store.hasValidation() && candidateRefs.length > 0) {\n const nextRef = candidateRefs[0]\n const nextElement = nextRef?.current\n const nextItem = items.find((item) => item.ref.current === nextElement)\n\n if (nextItem && nextItem.value !== itemValue) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value)\n const direction: NavigationDirection = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n if (direction === 'next') {\n const isValid = await store.setStateWithValidation(nextItem.value, direction)\n if (!isValid) {\n return\n }\n } else {\n store.setState('value', nextItem.value)\n }\n\n queueMicrotask(() => nextElement?.focus())\n return\n }\n }\n\n queueMicrotask(() => focusFirst(candidateRefs))\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n isMouseClickRef.current = true\n\n if (isDisabled) {\n event.preventDefault()\n } else {\n focusContext.onItemFocus(triggerId)\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n )\n\n const TriggerPrimitive = asChild ? Slot : 'button'\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? 'step' : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? '' : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n 'not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full',\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n )\n}\n\ntype StepperIndicatorProps = {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode)\n} & Omit<DivProps, 'children'>\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props\n\n const context = useStepperContext(INDICATOR_NAME)\n const itemContext = useStepperItemContext(INDICATOR_NAME)\n\n const value = useStore((state) => state.value)\n const itemValue = itemContext.value\n const stepState = useStore((state) => state.steps.get(itemValue))\n const steps = useStore((state) => state.steps)\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1\n\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const IndicatorPrimitive = asChild ? Slot : 'div'\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n 'flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground',\n className,\n )}\n >\n {typeof children === 'function' ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === 'completed' ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n )\n}\n\ntype StepperSeparatorProps = {\n forceMount?: boolean\n} & DivProps\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const { className, asChild, forceMount = false, ref, ...separatorProps } = props\n\n const context = useStepperContext(SEPARATOR_NAME)\n const itemContext = useStepperItemContext(SEPARATOR_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const orientation = context.orientation\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value)\n\n const isLastStep = stepIndex === steps.size - 1\n\n if (isLastStep && !forceMount) {\n return null\n }\n\n const dataState = getDataState(value, itemContext.value, itemContext.stepState, steps, 'separator')\n\n const SeparatorPrimitive = asChild ? Slot : 'div'\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n 'bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary',\n orientation === 'horizontal' ? 'h-px flex-1' : 'h-10 w-px',\n className,\n )}\n />\n )\n}\n\ntype StepperTitleProps = {\n asChild?: boolean\n} & React.ComponentProps<'span'>\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props\n\n const context = useStepperContext(TITLE_NAME)\n const itemContext = useStepperItemContext(TITLE_NAME)\n\n const titleId = getId(context.rootId, 'title', itemContext.value)\n\n const TitlePrimitive = asChild ? Slot : 'span'\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn('font-medium text-sm', className)}\n />\n )\n}\n\ntype StepperDescriptionProps = {\n asChild?: boolean\n} & React.ComponentProps<'span'>\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props\n\n const context = useStepperContext(DESCRIPTION_NAME)\n const itemContext = useStepperItemContext(DESCRIPTION_NAME)\n\n const descriptionId = getId(context.rootId, 'description', itemContext.value)\n\n const DescriptionPrimitive = asChild ? Slot : 'span'\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn('text-muted-foreground text-xs', className)}\n />\n )\n}\n\ntype StepperContentProps = {\n value: string\n forceMount?: boolean\n} & DivProps\n\nfunction StepperContent(props: StepperContentProps) {\n const { value: valueProp, asChild, forceMount = false, ref, className, ...contentProps } = props\n\n const context = useStepperContext(CONTENT_NAME)\n const value = useStore((state) => state.value)\n\n const contentId = getId(context.rootId, 'content', valueProp)\n const triggerId = getId(context.rootId, 'trigger', valueProp)\n\n if (valueProp !== value && !forceMount) {\n return null\n }\n\n const ContentPrimitive = asChild ? Slot : 'div'\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn('flex-1 outline-none', className)}\n />\n )\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props\n\n const store = useStoreContext(PREV_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n })\n\n const stepKeys = Array.from(steps.keys())\n const currentIndex = value ? stepKeys.indexOf(value) : -1\n const isDisabled = disabled || currentIndex <= 0\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented || isDisabled) {\n return\n }\n\n const prevIndex = Math.max(currentIndex - 1, 0)\n const prevStepValue = stepKeys[prevIndex]\n\n if (prevStepValue) {\n store.setState('value', prevStepValue)\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n )\n\n const PrevPrimitive = asChild ? Slot : 'button'\n\n return <PrevPrimitive type=\"button\" data-slot=\"stepper-prev\" disabled={isDisabled} {...prevProps} onClick={onClick} />\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props\n\n const store = useStoreContext(NEXT_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n })\n\n const stepKeys = Array.from(steps.keys())\n const currentIndex = value ? stepKeys.indexOf(value) : -1\n const isDisabled = disabled || currentIndex >= stepKeys.length - 1\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented || isDisabled) {\n return\n }\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1)\n const nextStepValue = stepKeys[nextIndex]\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, 'next')\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n )\n\n const NextPrimitive = asChild ? Slot : 'button'\n\n return <NextPrimitive type=\"button\" data-slot=\"stepper-next\" disabled={isDisabled} {...nextProps} onClick={onClick} />\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n}\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 { useCallback, useEffect, useState } from 'react'\n\nimport { Textarea } from '..'\n\ntype TextareaProps = React.ComponentProps<typeof Textarea>\n\nexport type DeferredTextareaProps = Omit<TextareaProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: string\n /**\n * Called when the user commits the value (on blur)\n * Only fires if the value has actually changed\n */\n onCommit: (value: string) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: string) => void\n}\n\n/**\n * A Textarea that buffers changes locally and only commits to the parent\n * on blur. Useful for forms where you don't want to trigger expensive\n * operations (like API calls) on every keystroke.\n */\nexport function DeferredTextarea({ value, onCommit, onValueChange, onBlur, ...props }: DeferredTextareaProps) {\n const [localValue, setLocalValue] = useState(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n onValueChange?.(newValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n return <Textarea {...props} value={localValue} onChange={handleChange} onBlur={handleBlur} />\n}\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","import { MinusIcon, PlusIcon } from 'lucide-react'\nimport * as React from 'react'\nimport { CSSProperties } from 'react'\n\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../accordion/accordion'\nimport { cn } from '../lib/utils'\n\nexport type TreeNode = {\n id: string\n name: string\n type: 'node' | 'group'\n children?: TreeNode[]\n className?: string\n icon?: React.ReactNode\n trailing?: React.ReactNode\n}\n\ntype Callbacks = {\n onNodeSelect?: (node: TreeNode) => void\n onGroupSelect?: (node: TreeNode) => void\n onToggleGroup?: ({ isExpanded, node }: { isExpanded: boolean; node: TreeNode }) => void\n}\n\nexport type TreeViewProps = Callbacks & {\n data: TreeNode[]\n className?: string\n defaultExpandedIds?: string[]\n selectedId?: string | undefined\n}\n\ntype TreeBranchProps = Callbacks & {\n node: TreeNode\n level: number\n isLast?: boolean\n parentIsLast?: boolean[]\n defaultExpandedIds?: string[]\n selectedId?: string | undefined\n}\n\nconst TreeBranch = ({\n node,\n level,\n onNodeSelect,\n onGroupSelect,\n onToggleGroup,\n isLast = false,\n parentIsLast = [],\n defaultExpandedIds = [],\n selectedId,\n}: TreeBranchProps) => {\n const isGroup = node.type === 'group'\n const hasChildren = node.children && node.children.length > 0\n\n if (!isGroup) {\n // render node\n return (\n <div\n data-test-id={`tree-node-${node.id}`}\n className={cn(\n 'relative flex items-center gap-2 py-1.5 px-2 rounded-md cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors border border-transparent hover:border hover:border-(--discreet-border)',\n node.className,\n {\n 'bg-primary text-primary-foreground hover:border hover:border-(--discreet-border)': selectedId === node.id,\n },\n )}\n style={{ marginLeft: `${level * 24}px` }}\n onClick={() => onNodeSelect?.(node)}\n >\n {node.icon}\n <span className=\"text-sm select-none truncate\">{node.name}</span>\n {node.trailing}\n </div>\n )\n }\n\n return (\n <AccordionItem value={node.id} className=\"border-0\" data-test-id={`tree-group-${node.id}`}>\n <AccordionTrigger\n style={{ '--margin-left': `calc(${level * 24 + 16}px - 16px)` } as CSSProperties}\n className={cn(\n 'flex flex-1 overflow-hidden items-center gap-2 py-1.5 px-2 rounded-md ml-(--margin-left) hover:bg-accent hover:text-accent-foreground hover:no-underline transition-colors border border-transparent hover:border hover:border-(--discreet-border)',\n '[&>svg:last-child]:hidden', // Hide default accordion chevron\n node.className,\n {\n 'bg-primary text-primary-foreground': selectedId === node.id,\n },\n )}\n >\n <PlusIcon\n data-test-id={`tree-expand-${node.id}`}\n className=\"size-4 shrink-0 hidden [[data-state=closed]>&]:block hover:border rounded\"\n onClick={() => {\n onToggleGroup?.({ isExpanded: true, node })\n }}\n />\n <MinusIcon\n data-test-id={`tree-collapse-${node.id}`}\n className=\"size-4 shrink-0 hidden [[data-state=open]>&]:block hover:border rounded\"\n onClick={() => {\n onToggleGroup?.({ isExpanded: false, node })\n }}\n />\n\n <div\n data-test-id={`tree-group-label-${node.id}`}\n className=\"flex w-[calc(100%-16px)] gap-2\" // without the plus/minus icons\n onClick={(e) => {\n e.stopPropagation()\n onGroupSelect?.(node)\n }}\n >\n {node.icon}\n <span className=\"text-sm select-none truncate text-left\">{node.name}</span>\n {node.trailing}\n </div>\n </AccordionTrigger>\n\n {hasChildren && (\n <AccordionContent className=\"pb-0 pt-0 relative\">\n <div\n style={{ '--left-offset': `calc(${level * 24 + 32}px - 16px)` } as CSSProperties}\n className=\"before:absolute before:top-0 before:start-(--left-offset) before:w-0.5 before:-ms-px before:h-full before:bg-sidebar-ring dark:before:bg-sidebar-ring\"\n />\n <Accordion type=\"multiple\" value={defaultExpandedIds}>\n {node.children?.map((child, index) => (\n <TreeBranch\n key={child.id}\n node={child}\n level={level + 1}\n onNodeSelect={onNodeSelect}\n onGroupSelect={onGroupSelect}\n onToggleGroup={onToggleGroup}\n isLast={index === node.children!.length - 1}\n parentIsLast={[...parentIsLast, isLast]}\n defaultExpandedIds={defaultExpandedIds}\n selectedId={selectedId}\n />\n ))}\n </Accordion>\n </AccordionContent>\n )}\n </AccordionItem>\n )\n}\n\nexport const TreeView = React.forwardRef<HTMLDivElement, TreeViewProps>(\n ({ data, onNodeSelect, onGroupSelect, onToggleGroup, className, defaultExpandedIds = [], selectedId }, ref) => {\n return (\n <div ref={ref} className={cn('w-full select-none', className)}>\n <Accordion type=\"multiple\" value={defaultExpandedIds}>\n {data.map((node, index) => (\n <TreeBranch\n key={node.id}\n node={node}\n level={0}\n onNodeSelect={onNodeSelect}\n onGroupSelect={onGroupSelect}\n onToggleGroup={onToggleGroup}\n isLast={index === data.length - 1}\n parentIsLast={[]}\n defaultExpandedIds={defaultExpandedIds}\n selectedId={selectedId}\n />\n ))}\n </Accordion>\n </div>\n )\n },\n)\n\nTreeView.displayName = 'TreeView'\n\nexport { TreeBranch }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["baseId: string | undefined","suffix: string","day: Date","modifiers: any","e: React.MouseEvent<Element>","fromMonth: Date | undefined","toMonth: Date | undefined","date: Date","months: number","event: React.KeyboardEvent<HTMLDivElement>","comments: CommentItem[] | CommentGroup[]","name: string","items: CommentItem[]","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","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>","align: 'left' | 'right' | 'center'","event: React.MouseEvent<HTMLDivElement>","event: React.MouseEvent","event: React.KeyboardEvent<HTMLDivElement>","option: CellHierarchyOption","ids: string[]","options: CellHierarchyOption[]","id: string","path: string[]","targetId: string","currentPath: string[]","searchTerm: string","selectedValue: string | null | undefined","isOpen: boolean","onOpenAutoFocus: NonNullable<React.ComponentProps<typeof PopoverContent>['onOpenAutoFocus']>","event: React.KeyboardEvent<HTMLDivElement>","e: React.KeyboardEvent","newValue: string","options: CellSelectOption[]","value: string","val: boolean","id: string","option: CellHierarchyOption","date: Date | undefined","indices: number[]","updates: UpdateCell[]","e: Event","editorProps: EditorProps","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>","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>","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[]","options: SelectColumnOptions<TData>","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","variantStyles: Record<InfoCardVariant, { titleClass: string; messageContainerClass: string }>","directions: string[]","coordinateGetter: KeyboardCoordinateGetter","filteredContainers: DroppableContainer[]","consumerName: string","props: KanbanRootProps<T>","item: T","id: UniqueIdentifier","collisionDetection: CollisionDetection","event: DragStartEvent","event: DragOverEvent","event: DragEndEvent","newColumns: Record<UniqueIdentifier, T[]>","event: DragCancelEvent","announcements: Announcements","props: KanbanBoardProps","animateLayoutChanges: AnimateLayoutChanges","props: KanbanColumnProps","node: HTMLElement | null","props: KanbanColumnHandleProps","props: KanbanItemProps","props: KanbanItemHandleProps","dropAnimation: DropAnimation","props: KanbanOverlayProps","e: React.ChangeEvent<HTMLInputElement>","e: React.FocusEvent<HTMLInputElement>","e: React.KeyboardEvent<HTMLInputElement>","newValue: number | undefined","e: React.FocusEvent<HTMLInputElement>","MenubarMenu: typeof MenubarPrimitive.Menu","sidebarId?: string","value: boolean","value: number","states: Record<string, boolean>","states: Record<string, number | undefined>","toStore: StoredSidebarStates","id: string","open: boolean","width: number","config: SidebarRegistryEntry","event: KeyboardEvent","e: React.MouseEvent","moveEvent: MouseEvent","newWidth: number","Comp: React.ElementType","side: SidebarSide","tab: SidebarTabDefinition","tabId: string","tabId: string | null","map: Map<string, SidebarTabDefinition>","side?: SidebarSide","tabId: string","option: SlicerFilterOption<T>","values: T[]","searchTerm: string","storageKey: string | undefined","defaultValue: boolean","value: boolean","value: T","newVals: T[]","optionValue: T","props: T","fn: () => T","id: string","variant: 'trigger' | 'content' | 'title' | 'description'","value: string","MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent>","key: string","dir?: Direction","event: React.KeyboardEvent<TriggerElement>","orientation?: Orientation","candidates: React.RefObject<TriggerElement | null>[]","array: T[]","startIndex: number","value: string | undefined","itemValue: string","stepState: StepState | undefined","steps: Map<string, StepState>","variant: 'item' | 'separator'","consumerName: string","selector: (state: StoreState) => T","props: StepperProps","newStep: StepState","updatedStep: StepState","props: DivProps","tabStopId: string","item: ItemData","event: React.FocusEvent<ListElement>","event: React.MouseEvent<ListElement>","props: StepperItemProps","props: ButtonProps","event: KeyboardEvent","event: React.MouseEvent<TriggerElement>","event: React.FocusEvent<TriggerElement>","direction: NavigationDirection","props: StepperIndicatorProps","props: StepperSeparatorProps","props: StepperTitleProps","props: StepperDescriptionProps","props: StepperContentProps","event: React.MouseEvent<HTMLButtonElement>","e: React.ChangeEvent<HTMLTextAreaElement>","e: React.FocusEvent<HTMLTextAreaElement>"],"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/textarea/textarea.tsx","../src/comment/comment.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/input/input.tsx","../src/input/number-input.tsx","../src/data-grid/data-grid-cell-wrapper.tsx","../src/data-grid/cell-variants/hierarchy-cell.tsx","../src/data-grid/bulk-edit-popover.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/data-grid/data-grid-search.tsx","../src/data-grid/data-grid.tsx","../src/data-grid/cell-variants/checkbox-cell.tsx","../src/data-grid/cell-variants/date-cell.tsx","../src/data-grid/cell-variants/download-file-cell.tsx","../src/data-grid/cell-variants/gantt-cell.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/separator/separator.tsx","../src/data-grid/data-grid-view-menu.tsx","../src/data-grid/column-presets/select-column.tsx","../src/data-grid/hooks/use-data-grid.tsx","../src/date-picker/date-picker.tsx","../src/drawer/drawer.tsx","../src/label/label.tsx","../src/field/field.tsx","../src/hooks/use-is-mobile.ts","../src/info-card/info-card.tsx","../src/kanban/kanban.tsx","../src/input/deferred-input.tsx","../src/input/deferred-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-context-provider.tsx","../src/sidebar/sidebar.tsx","../src/sidebar/sidebar-tab-context-provider.tsx","../src/sidebar/sidebar-tab.tsx","../src/slicer/slicer.tsx","../src/slider/slider.tsx","../src/hooks/use-isomorphic-layout-effect.ts","../src/hooks/use-as-ref.ts","../src/hooks/use-lazy-ref.ts","../src/stepper/stepper.tsx","../src/switch/switch.tsx","../src/tabs/tabs.tsx","../src/textarea/deferred-textarea.tsx","../src/toggle/toggle.tsx","../src/toggle-group/toggle-group.tsx","../src/tree-view/tree-view.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\n/**\n * Generates a test ID by combining a base ID with a suffix.\n * Returns undefined if no base ID is provided.\n *\n * For the root element, use `data-test-id={__e2e_test_id__}` directly.\n * Use this function only for sub-elements that need a suffix.\n *\n * @example\n * <div data-test-id={__e2e_test_id__}> // root element - use directly\n * <input data-test-id={testId(__e2e_test_id__, 'search')}> // sub-element - returns `${baseId}-search` or undefined\n */\nexport function testId(baseId: string | undefined, suffix: string): string | undefined {\n if (!baseId) {\n return undefined\n }\n return `${baseId}-${suffix}`\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 iconXs: 'size-6',\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, testId } 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 __e2e_test_id__,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>['variant']\n showYearNavigation?: boolean\n __e2e_test_id__?: string\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 __e2e_test_id__={testId(__e2e_test_id__, 'prev-year')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'prev-month')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'next-month')}\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 __e2e_test_id__={testId(__e2e_test_id__, 'next-year')}\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\" data-test-id={__e2e_test_id__} 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 { MinusIcon, 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-sm 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 minus: 'minus',\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 } else if (checkIcon === 'minus') {\n icon = <MinusIcon />\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 { 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 discreet:\n 'border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30',\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 {\n ChevronDownIcon,\n ChevronUpIcon,\n CircleCheckIcon,\n EyeIcon,\n EyeOffIcon,\n MessageSquareIcon,\n MinusIcon,\n PlusIcon,\n} from 'lucide-react'\nimport { useState } from 'react'\n\nimport { Avatar, AvatarFallback } from '../avatar/avatar'\nimport { Button } from '../button/button'\nimport { cn } from '../lib/utils'\nimport { Textarea } from '../textarea/textarea'\n\nexport type CommentItem = {\n id: string\n userName: string\n userAvatar?: React.ReactNode\n createdAt: Date\n comment: string\n isResolved?: boolean\n replies?: CommentItem[]\n}\n\nexport type CommentGroup = {\n groupId: string\n groupName: string\n comments: CommentItem[]\n}\n\nexport type CommentCallbacks = {\n onReply?: (parentCommentId: string, comment: string) => void\n onResolve?: (commentId: string, isResolve: boolean) => void\n onCreate?: (comment: string, groupId?: string) => void\n}\n\nfunction isCommentGroupArray(comments: CommentItem[] | CommentGroup[]): comments is CommentGroup[] {\n return comments.length > 0 && 'groupName' in comments[0]!\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length >= 2) {\n return `${parts[0]![0]}${parts[1]![0]}`.toUpperCase()\n }\n return (parts[0]?.[0] ?? 'AA').toUpperCase()\n}\n\nfunction CommentThread({\n comment,\n depth = 0,\n threadResolved = false,\n onReply,\n onResolve,\n}: Readonly<\n { comment: CommentItem; depth?: number; threadResolved?: boolean } & Pick<CommentCallbacks, 'onReply' | 'onResolve'>\n>) {\n const isResolved = comment.isResolved || threadResolved\n const [repliesOpen, setRepliesOpen] = useState(true)\n const [contentVisible, setContentVisible] = useState(!comment.isResolved)\n const [replying, setReplying] = useState(false)\n const hasReplies = comment.replies && comment.replies.length > 0\n\n return (\n <div data-slot=\"comment-thread\" className={cn('flex flex-col', depth > 0 && 'mt-1')}>\n {/* Comment body */}\n <div className=\"flex flex-col items-start\">\n {/* Header row */}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative size-7 mt-0.5 shrink-0\">\n <div className={cn('size-full', isResolved && 'opacity-25')}>\n {comment.userAvatar ?? (\n <Avatar className=\"size-full text-sm\">\n <AvatarFallback>{getInitials(comment.userName)}</AvatarFallback>\n </Avatar>\n )}\n </div>\n {isResolved && <CircleCheckIcon className=\"absolute inset-0 size-full opacity-50 text-muted-foreground\" />}\n </div>\n <span\n className={cn(\n 'text-sm font-semibold',\n isResolved ? 'text-muted-foreground line-through' : 'text-foreground',\n )}\n >\n {comment.userName}\n </span>\n <span\n className={cn('text-xs', isResolved ? 'text-muted-foreground/50 line-through' : 'text-muted-foreground/70')}\n >\n {comment.createdAt.toLocaleDateString()}\n </span>\n {comment.isResolved && depth === 0 && (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setContentVisible((v) => !v)} className=\"ml-5 h-5.5\">\n {contentVisible ? <EyeIcon className=\"size-3\" /> : <EyeOffIcon className=\"size-3\" />}\n Resolved\n </Button>\n )}\n </div>\n\n {/* Comment text (hideable for resolved comments) */}\n {contentVisible && (\n <>\n {/* Command */}\n <p\n className={cn(\n 'ml-9 text-sm whitespace-pre-wrap',\n isResolved ? 'text-muted-foreground line-through' : 'text-foreground/90',\n )}\n >\n {comment.comment}\n </p>\n\n <div className=\"flex items-center mt-1\">\n {/* Expand / collapse replies */}\n <div className=\"w-9 px-0.5\">\n {hasReplies && contentVisible && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n onClick={() => setRepliesOpen((open) => !open)}\n >\n {repliesOpen ? <MinusIcon className=\"size-3\" /> : <PlusIcon className=\"size-3\" />}\n </Button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-5\">\n {/* Reply number (+ expand) */}\n {hasReplies && contentVisible && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n onClick={() => setRepliesOpen(true)}\n >\n {comment.replies!.length} {comment.replies!.length === 1 ? 'reply' : 'replies'}\n </Button>\n )}\n {/* Reply */}\n {onReply && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n onClick={() => setReplying(true)}\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n >\n <MessageSquareIcon className=\"size-3\" />\n Reply\n </Button>\n )}\n {/* Resolve conversation */}\n {onResolve && depth === 0 && (\n <Button\n variant=\"extraGhost\"\n size=\"xs\"\n onClick={() => {\n onResolve(comment.id, !comment.isResolved)\n if (!comment.isResolved) {\n setContentVisible(false)\n }\n }}\n className=\"text-sm py-0 px-1 not-hover:opacity-70\"\n >\n <CircleCheckIcon className=\"size-3\" />\n {comment.isResolved ? 'Reopen' : 'Resolve'}\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n {onReply && replying && (\n <CommentCreate\n className=\"pl-9 mt-4\"\n onSubmit={(commentText) => {\n onReply(comment.id, commentText)\n setReplying(false)\n setRepliesOpen(true)\n }}\n onCancel={() => setReplying(false)}\n />\n )}\n </div>\n\n {/* Replies — kept mounted to preserve child collapse state */}\n {hasReplies && (\n <div\n className={cn('mt-1 mb-2 ml-3 border-l border-border/50 pl-3', !(contentVisible && repliesOpen) && 'hidden')}\n >\n {comment.replies!.map((reply) => (\n <CommentThread\n key={reply.id}\n comment={reply}\n depth={depth + 1}\n threadResolved={isResolved}\n onReply={onReply}\n onResolve={onResolve}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction CommentCreate({\n onSubmit,\n onCancel,\n className,\n}: Readonly<{ onSubmit: (comment: string) => void; onCancel: () => void; className?: string }>) {\n const [comment, setComment] = useState('')\n\n const submitComment = () => {\n if (comment.trim() === '') {\n return\n }\n onSubmit(comment)\n setComment('')\n }\n\n return (\n <div className={cn('flex flex-col gap-2 w-full', className)}>\n <Textarea\n variant=\"simple\"\n className=\"min-h-8.5 h-12.5 w-full\"\n placeholder=\"Write a comment...\"\n autoFocus\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"smLow\"\n onClick={() => {\n setComment('')\n onCancel()\n }}\n >\n Cancel\n </Button>\n <Button variant=\"default\" size=\"smLow\" onClick={() => submitComment()}>\n Submit\n </Button>\n </div>\n </div>\n )\n}\n\nfunction sortComments(items: CommentItem[]): CommentItem[] {\n return [...items]\n .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())\n .map((item) => (item.replies?.length ? { ...item, replies: sortComments(item.replies) } : item))\n}\n\nfunction CommentGroupSection({\n group,\n onReply,\n onResolve,\n onCreate,\n}: Readonly<{ group: CommentGroup } & CommentCallbacks>) {\n const [collapsed, setCollapsed] = useState(false)\n const [creating, setCreating] = useState(false)\n\n return (\n <div data-slot=\"comment-group\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-foreground\">{group.groupName}</h3>\n <Button variant=\"ghost\" size=\"iconXs\" onClick={() => setCollapsed((c) => !c)}>\n {collapsed ? <ChevronDownIcon className=\"size-4\" /> : <ChevronUpIcon className=\"size-4\" />}\n </Button>\n </div>\n <div className={cn(collapsed && 'hidden')}>\n {onCreate && (\n <>\n {creating ? (\n <CommentCreate\n className=\"my-2\"\n onSubmit={(comment) => {\n onCreate?.(comment, group.groupId)\n setCreating(false)\n }}\n onCancel={() => setCreating(false)}\n />\n ) : (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setCreating(true)} className=\"mt-1 mb-2\">\n Add comment\n </Button>\n )}\n </>\n )}\n <div className=\"mt-2 flex flex-col gap-3\">\n {sortComments(group.comments).map((comment) => (\n <CommentThread key={comment.id} comment={comment} onReply={onReply} onResolve={onResolve} />\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nfunction CommentList({\n comments,\n className,\n onReply,\n onResolve,\n onCreate,\n}: Readonly<{ comments: CommentItem[] | CommentGroup[]; className?: string } & CommentCallbacks>) {\n const [creating, setCreating] = useState(false)\n\n if (isCommentGroupArray(comments)) {\n return (\n <div data-slot=\"comment-list\" className={cn('flex flex-col gap-6', className)}>\n {comments.map((group, i) => (\n <div key={i}>\n <CommentGroupSection group={group} onReply={onReply} onResolve={onResolve} onCreate={onCreate} />\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div data-slot=\"comment-list\" className={cn('flex flex-col gap-2', className)}>\n {onCreate && (\n <>\n {creating ? (\n <CommentCreate\n className=\"my-2\"\n onSubmit={(comment) => {\n onCreate?.(comment)\n setCreating(false)\n }}\n onCancel={() => setCreating(false)}\n />\n ) : (\n <Button variant=\"outline\" size=\"smLow\" onClick={() => setCreating(true)} className=\"mb-2 self-start\">\n Add comment\n </Button>\n )}\n </>\n )}\n {sortComments(comments).map((comment) => (\n <CommentThread key={comment.id} comment={comment} onReply={onReply} onResolve={onResolve} />\n ))}\n </div>\n )\n}\n\nexport { CommentCreate, CommentList, CommentThread }\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, testId } 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 data-test-id={__e2e_test_id__}\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__={testId(__e2e_test_id__, 'close')}\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 w-full\">{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, XIcon } 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 <XIcon 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 {cellOpts.onRangeChange && (\n <div className=\"absolute right-8 top-1/2 -translate-y-1/2\">\n <GanttTimerangePicker\n initialDateFrom={cellOpts.dateRangeFrom ?? undefined}\n initialDateTo={cellOpts.dateRangeTo ?? undefined}\n onRangeChange={cellOpts.onRangeChange}\n timelineStart={cellOpts.timelineStart}\n timelineEnd={cellOpts.timelineEnd}\n />\n </div>\n )}\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 { 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 discreet:\n 'py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30',\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 { 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 discreet:\n 'py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus-within:border-input focus-within:shadow-sm bg-transparent hover:bg-accent/30',\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 bg-transparent hover:bg-transparent 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 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 // Resolve row-level className from table meta\n const rowClassNameMeta = meta?.rowClassName\n const rowCellClassName = React.useMemo(() => {\n if (!rowClassNameMeta) {\n return undefined\n }\n if (typeof rowClassNameMeta === 'function') {\n return rowClassNameMeta(cell.row)\n }\n return rowClassNameMeta\n }, [rowClassNameMeta, cell.row])\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 rowCellClassName,\n colCellClassName,\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 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 { CheckIcon, ChevronDownIcon, ChevronRightIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../..'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../../command/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\nimport type { CellHierarchyOption } from '../data-grid-types'\n\nimport { CellVariantProps } from './cell-variant-types'\n\n/**\n * Collects all descendant IDs from a hierarchy option.\n */\nfunction getAllDescendantIds(option: CellHierarchyOption): string[] {\n const ids: string[] = []\n if (option.children) {\n for (const child of option.children) {\n ids.push(child.id)\n ids.push(...getAllDescendantIds(child))\n }\n }\n return ids\n}\n\n/**\n * Collects all IDs in the hierarchy tree (including the option itself).\n */\nfunction getAllIds(option: CellHierarchyOption): string[] {\n return [option.id, ...getAllDescendantIds(option)]\n}\n\n/**\n * Finds an option by ID in the hierarchy tree.\n */\nfunction findOptionById(options: CellHierarchyOption[], id: string): CellHierarchyOption | null {\n for (const opt of options) {\n if (opt.id === id) {\n return opt\n }\n if (opt.children) {\n const found = findOptionById(opt.children, id)\n if (found) {\n return found\n }\n }\n }\n return null\n}\n\n/**\n * Gets the label path from root to the given ID.\n */\nfunction getLabelPath(\n options: CellHierarchyOption[],\n id: string,\n path: string[] = [],\n): { found: boolean; path: string[] } {\n for (const opt of options) {\n if (opt.id === id) {\n return { found: true, path: [...path, opt.label] }\n }\n if (opt.children) {\n const result = getLabelPath(opt.children, id, [...path, opt.label])\n if (result.found) {\n return result\n }\n }\n }\n return { found: false, path }\n}\n\n/**\n * Gets the ancestor IDs (parent chain) from root to the given ID.\n * Returns the IDs of all ancestors, NOT including the target ID itself.\n */\nfunction getAncestorIds(options: CellHierarchyOption[], targetId: string, currentPath: string[] = []): string[] | null {\n for (const opt of options) {\n if (opt.id === targetId) {\n return currentPath\n }\n if (opt.children) {\n const result = getAncestorIds(opt.children, targetId, [...currentPath, opt.id])\n if (result !== null) {\n return result\n }\n }\n }\n return null\n}\n\n/**\n * Builds a flat lookup map from ID to label for O(1) display lookups.\n */\nfunction buildLabelMap(options: CellHierarchyOption[], map = new Map<string, string>()): Map<string, string> {\n for (const opt of options) {\n map.set(opt.id, opt.label)\n if (opt.children) {\n buildLabelMap(opt.children, map)\n }\n }\n return map\n}\n\n/**\n * Checks if an option or any of its descendants contain the search term.\n */\nfunction matchesSearch(option: CellHierarchyOption, searchTerm: string): boolean {\n const term = searchTerm.toLowerCase()\n if (option.label.toLowerCase().includes(term)) {\n return true\n }\n if (option.children) {\n return option.children.some((child) => matchesSearch(child, term))\n }\n return false\n}\n\n/**\n * Computes the initial expanded IDs.\n * - If there's only one top-level option with children, expand it by default.\n * - If there's a selected value, expand all ancestors to show it.\n */\nfunction getInitialExpandedIds(options: CellHierarchyOption[], selectedValue: string | null | undefined): Set<string> {\n const expandedIds = new Set<string>()\n\n // Auto-expand single top-level option\n const firstOption = options[0]\n if (options.length === 1 && firstOption?.children && firstOption.children.length > 0) {\n expandedIds.add(firstOption.id)\n }\n\n // Expand ancestors of selected value\n if (selectedValue) {\n const ancestors = getAncestorIds(options, selectedValue)\n if (ancestors) {\n for (const id of ancestors) {\n expandedIds.add(id)\n }\n }\n }\n\n return expandedIds\n}\n\ntype HierarchyItemProps = {\n option: CellHierarchyOption\n selectedValue: string | null | undefined\n expandedIds: Set<string>\n onToggleExpand: (id: string) => void\n onSelect: (option: CellHierarchyOption) => void\n depth?: number\n searchTerm?: string\n /** When true, an ancestor matched the search so this item should be shown regardless of match */\n ancestorMatched?: boolean\n}\n\n/**\n * Renders a single hierarchy item with expand/collapse and selection capabilities.\n */\nfunction HierarchyItem({\n option,\n selectedValue,\n expandedIds,\n onToggleExpand,\n onSelect,\n depth = 0,\n searchTerm = '',\n ancestorMatched = false,\n}: HierarchyItemProps) {\n const hasChildren = option.children && option.children.length > 0\n const isExpanded = expandedIds.has(option.id)\n const isSelected = option.id === selectedValue\n\n // When searching, check if this item matches\n const matchesSelf = searchTerm && option.label.toLowerCase().includes(searchTerm.toLowerCase())\n const childrenMatchSearch = searchTerm && hasChildren && option.children!.some((c) => matchesSearch(c, searchTerm))\n\n // Don't render if searching and neither self, descendants, nor ancestors match\n // Option A: When an ancestor matched, show all descendants\n if (searchTerm && !matchesSelf && !childrenMatchSearch && !ancestorMatched) {\n return null\n }\n\n const shouldShowExpanded = isExpanded || (searchTerm !== '' && childrenMatchSearch)\n\n return (\n <>\n <CommandItem\n value={`${option.label}-${option.id}`}\n onSelect={() => onSelect(option)}\n style={{ paddingLeft: `${depth * 20 + 8}px` }}\n >\n {/* Expand/Collapse button */}\n {hasChildren ? (\n <Button\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand(option.id)\n }}\n variant=\"extraGhost\"\n size=\"sm\"\n className=\"size-4\"\n >\n {shouldShowExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </Button>\n ) : (\n <span className=\"size-4\" />\n )}\n {/* Label */}\n <span className=\"flex-1 truncate\">{option.label}</span>\n {/* Selection indicator */}\n {isSelected && <CheckIcon className=\"ml-auto h-4 w-4\" />}\n </CommandItem>\n\n {/* Render children if expanded */}\n {hasChildren && shouldShowExpanded && (\n <>\n {option.children!.map((child) => (\n <HierarchyItem\n key={child.id}\n option={child}\n selectedValue={selectedValue}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onSelect}\n depth={depth + 1}\n searchTerm={searchTerm}\n ancestorMatched={ancestorMatched || !!matchesSelf}\n />\n ))}\n </>\n )}\n </>\n )\n}\n\nexport function HierarchyCell<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 [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 const options = cellOpts?.variant === 'hierarchy' ? cellOpts.options : []\n\n // Initialize expandedIds with auto-expand for single top-level option and selected value path\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => getInitialExpandedIds(options, initialValue))\n\n // Build label lookup map for O(1) display\n const labelMap = React.useMemo(() => buildLabelMap(options), [options])\n\n // Get display label for current value\n const displayLabel = React.useMemo(() => {\n if (!value) {\n return ''\n }\n return labelMap.get(value) ?? value\n }, [value, labelMap])\n\n const toggleExpand = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const onOptionSelect = React.useCallback(\n (option: CellHierarchyOption) => {\n const newValue = option.id\n setValue(newValue)\n meta?.onDataUpdate?.({ rowIndex, columnId, value: newValue })\n meta?.onCellEditingStop?.()\n setOpen(false)\n },\n [meta, rowIndex, columnId],\n )\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 setValue(initialValue)\n setOpen(false)\n setSearchValue('')\n meta?.onCellEditingStop?.()\n } else if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n setSearchValue('')\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 // When value changes, ensure ancestors are expanded\n React.useEffect(() => {\n if (value) {\n const ancestors = getAncestorIds(options, value)\n if (ancestors && ancestors.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n for (const id of ancestors) {\n next.add(id)\n }\n return next\n })\n }\n }\n }, [value, options])\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 <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 <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 shouldFilter={false}>\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\n placeholder=\"Search...\"\n className=\"h-auto flex-1 p-0 rounded-none\"\n />\n <CommandList>\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <HierarchyItem\n key={option.id}\n option={option}\n selectedValue={value}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onSelect={onOptionSelect}\n searchTerm={searchValue}\n />\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n ) : (\n <span data-slot=\"grid-cell-content\">{displayLabel}</span>\n )}\n </DataGridCellWrapper>\n )\n}\n\n// Export utility functions for use in filters\nexport {\n getAllDescendantIds,\n getAllIds,\n findOptionById,\n getLabelPath,\n buildLabelMap,\n getAncestorIds,\n getInitialExpandedIds,\n HierarchyItem,\n}\nexport type { HierarchyItemProps }\n","import type { Table } from '@tanstack/react-table'\n\nimport { CheckSquareIcon, SquareIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Badge } from '../badge/badge'\nimport { Button } from '../button/button'\nimport { Calendar } from '../calendar/calendar'\nimport { Checkbox } from '../checkbox/checkbox'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../command/command'\nimport { Input } from '../input/input'\nimport { NumberInput } from '../input/number-input'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\nimport { Textarea } from '../textarea/textarea'\n\nimport { getInitialExpandedIds, HierarchyItem } from './cell-variants/hierarchy-cell'\nimport type { Cell, CellHierarchyOption, CellSelectOption, UpdateCell } from './data-grid-types'\n\n// ---------------------------------------------------------------------------\n// Shared types\n// ---------------------------------------------------------------------------\n\ntype EditorProps = Readonly<{\n cell: Cell\n columnId: string\n selectedRowIndices: number[]\n onApply: (updates: UpdateCell[]) => void\n onCancel: () => void\n}>\n\nconst EditableCellVariants = [\n 'short-text',\n 'long-text',\n 'number',\n 'select',\n 'multi-select',\n 'checkbox',\n 'date',\n 'hierarchy',\n] as const\nexport const EditableCellVariantsSet = new Set(EditableCellVariants)\nexport type EditableCellVariant = (typeof EditableCellVariants)[number]\n\n// ---------------------------------------------------------------------------\n// Utility: stop propagation wrapper for keyboard events inside the popover\n// ---------------------------------------------------------------------------\n\nfunction stopGridKeys(e: React.KeyboardEvent) {\n // Allow Escape to bubble so the popover can close, but stop everything else\n // from reaching the grid's keyboard handler\n if (e.key !== 'Escape') {\n e.stopPropagation()\n }\n}\n\n// ---------------------------------------------------------------------------\n// Footer with Apply / Cancel buttons\n// ---------------------------------------------------------------------------\n\nfunction EditorFooter({ count, onApply, onCancel }: { count: number; onApply?: () => void; onCancel: () => void }) {\n return (\n <div className=\"flex items-center justify-between border-t px-3 py-2\">\n <span className=\"text-muted-foreground text-xs\">{count} rows</span>\n <div className=\"flex gap-1.5\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n {onApply && (\n <Button size=\"sm\" onClick={onApply}>\n Apply\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Short text editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditShortText({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if (e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <Input ref={inputRef} value={value} onChange={(e) => setValue(e.target.value)} placeholder=\"Enter value...\" />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Long text editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditLongText({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState('')\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n textareaRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Enter value...\"\n className=\"min-h-[100px] resize-none\"\n />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Number editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditNumber({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const [value, setValue] = React.useState<number | undefined>(undefined)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const { min, max, step, prefix, suffix } = cell.variant === 'number' ? cell : ({} as Record<string, undefined>)\n\n // Only use string prefixes/suffixes — function variants need a row context we don't have\n const stringPrefix = typeof prefix === 'string' ? prefix : undefined\n const stringSuffix = typeof suffix === 'string' ? suffix : undefined\n\n const handleApply = React.useCallback(() => {\n const numValue = value ?? null\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: numValue })))\n }, [selectedRowIndices, columnId, value, onApply])\n\n const onKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n stopGridKeys(e)\n if (e.key === 'Enter') {\n e.preventDefault()\n handleApply()\n }\n },\n [handleApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={onKeyDown}>\n <div className=\"p-3\">\n <NumberInput\n ref={inputRef}\n value={value}\n onChange={setValue}\n placeholder=\"Enter number...\"\n min={min}\n max={max}\n step={step}\n prefix={stringPrefix}\n suffix={stringSuffix}\n variant=\"default\"\n />\n </div>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Select editor (single-select — applies immediately on selection)\n// ---------------------------------------------------------------------------\n\nfunction BulkEditSelect({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const {\n options: arrayOptions,\n optionsMap,\n optionsRenderer,\n } = cell.variant === 'select' ? cell : ({} as Record<string, undefined>)\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n // Stores { value, data } where data is the raw value from the map (string or object).\n // Mirrors the pattern used in select-cell.tsx for consistency.\n const options = React.useMemo(() => {\n if (arrayOptions) {\n return arrayOptions.map((opt) => ({ value: opt.value, data: opt.label as unknown }))\n }\n if (optionsMap) {\n return Array.from(optionsMap.entries()).map(([id, data]) => ({ value: id, data }))\n }\n return []\n }, [arrayOptions, optionsMap])\n\n const handleSelect = React.useCallback(\n (newValue: string) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: newValue })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Command>\n <CommandInput ref={inputRef} placeholder=\"Search...\" />\n <CommandList className=\"max-h-[300px]\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value || '__empty__'}\n // For optionsRenderer items, omit value so cmdk derives it from\n // textContent — this enables text-based search and avoids empty-string issues.\n // For plain string labels, pass value explicitly for accurate search matching.\n {...(optionsRenderer ? {} : { value: String(option.data) })}\n onSelect={() => handleSelect(option.value)}\n >\n {optionsRenderer ? optionsRenderer(option.data, 'option') : <span>{String(option.data)}</span>}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Multi-select editor\n// ---------------------------------------------------------------------------\n\nfunction BulkEditMultiSelect({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const { options: arrayOptions, optionsMap } =\n cell.variant === 'multi-select' ? cell : ({} as Record<string, undefined>)\n const [selectedValues, setSelectedValues] = React.useState<string[]>([])\n const [searchValue, setSearchValue] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const options: CellSelectOption[] = React.useMemo(() => {\n if (arrayOptions) {\n return arrayOptions\n }\n if (optionsMap) {\n return Array.from(optionsMap.entries()).map(([id, label]) => ({ value: id, label: String(label) }))\n }\n return []\n }, [arrayOptions, optionsMap])\n\n const toggleValue = React.useCallback((value: string) => {\n setSelectedValues((prev) => (prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value]))\n setSearchValue('')\n queueMicrotask(() => inputRef.current?.focus())\n }, [])\n\n const handleApply = React.useCallback(() => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: selectedValues })))\n }, [selectedRowIndices, columnId, selectedValues, onApply])\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\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-2 border-b px-3 py-1.5\">\n {selectedValues.map((val) => {\n const opt = options.find((o) => o.value === val)\n return (\n <Badge key={val} variant=\"secondary\" className=\"h-5 gap-1 px-1.5 text-xs\">\n {opt?.label ?? val}\n </Badge>\n )\n })}\n <CommandInput\n ref={inputRef}\n value={searchValue}\n onValueChange={setSearchValue}\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 return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={() => toggleValue(option.value)}\n className=\"cursor-pointer\"\n >\n <Checkbox\n readOnly\n className=\"pointer-events-none\"\n checked={isSelected}\n label={option.label}\n variant=\"default\"\n checkIcon=\"check\"\n checkboxSize=\"default\"\n />\n </CommandItem>\n )\n })}\n </CommandGroup>\n {selectedValues.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n setSelectedValues([])\n queueMicrotask(() => inputRef.current?.focus())\n }}\n className=\"justify-center text-muted-foreground\"\n >\n Clear all\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onApply={handleApply} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Checkbox editor — two action buttons\n// ---------------------------------------------------------------------------\n\nfunction BulkEditCheckbox({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const setAll = React.useCallback(\n (val: boolean) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: val })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <div className=\"flex flex-col gap-1 p-2\">\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start gap-2\" onClick={() => setAll(true)}>\n <CheckSquareIcon className=\"size-4\" />\n Check all\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"justify-start gap-2\" onClick={() => setAll(false)}>\n <SquareIcon className=\"size-4\" />\n Uncheck all\n </Button>\n </div>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Hierarchy editor — applies on selection\n// ---------------------------------------------------------------------------\n\nfunction BulkEditHierarchy({ cell, columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const options = cell.variant === 'hierarchy' ? cell.options : []\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [searchValue, setSearchValue] = React.useState('')\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => getInitialExpandedIds(options, null))\n\n const toggleExpand = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const handleSelect = React.useCallback(\n (option: CellHierarchyOption) => {\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: option.id })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Command shouldFilter={false}>\n <CommandInput ref={inputRef} value={searchValue} onValueChange={setSearchValue} placeholder=\"Search...\" />\n <CommandList className=\"max-h-[300px]\">\n <CommandEmpty>No options found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <HierarchyItem\n key={option.id}\n option={option}\n selectedValue={null}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onSelect={handleSelect}\n searchTerm={searchValue}\n />\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Date editor — applies on selection\n// ---------------------------------------------------------------------------\n\nfunction BulkEditDate({ columnId, selectedRowIndices, onApply, onCancel }: EditorProps) {\n const onDateSelect = React.useCallback(\n (date: Date | undefined) => {\n if (!date) {\n return\n }\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 const isoDate = `${year}-${month}-${day}`\n onApply(selectedRowIndices.map((rowIndex) => ({ rowIndex, columnId, value: isoDate })))\n },\n [selectedRowIndices, columnId, onApply],\n )\n\n return (\n <div className=\"flex flex-col\" onKeyDown={stopGridKeys}>\n <Calendar showYearNavigation={true} autoFocus captionLayout=\"dropdown\" mode=\"single\" onSelect={onDateSelect} />\n <EditorFooter count={selectedRowIndices.length} onCancel={onCancel} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main popover component\n// ---------------------------------------------------------------------------\n\nexport function BulkEditPopover<TData>({\n table,\n cell,\n columnId,\n open,\n onOpenChange,\n children,\n}: Readonly<{\n table: Table<TData>\n cell: Cell\n columnId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n selectedRowCount: number\n children: React.ReactNode\n}>) {\n // Compute visual row indices for selected rows.\n // onDataUpdate expects the visual index (position in getRowModel().rows),\n // not the original data index (row.index).\n const selectedRowIndices = React.useMemo(() => {\n if (!open) {\n return []\n }\n const allRows = table.getRowModel().rows\n const indices: number[] = []\n for (let i = 0; i < allRows.length; i++) {\n if (allRows[i]!.getIsSelected()) {\n indices.push(i)\n }\n }\n return indices\n }, [open, table])\n\n // Close if all rows get deselected while open\n React.useEffect(() => {\n if (open && selectedRowIndices.length === 0) {\n onOpenChange(false)\n }\n }, [open, selectedRowIndices.length, onOpenChange])\n\n const onApply = React.useCallback(\n (updates: UpdateCell[]) => {\n table.options.meta?.onDataUpdate?.(updates)\n onOpenChange(false)\n },\n [table, onOpenChange],\n )\n\n const onCancel = React.useCallback(() => {\n onOpenChange(false)\n }, [onOpenChange])\n\n const onOpenAutoFocus = React.useCallback((e: Event) => {\n e.preventDefault()\n }, [])\n\n const editorProps: EditorProps = { cell, columnId, selectedRowIndices, onApply, onCancel }\n\n const editor = React.useMemo(() => {\n switch (cell.variant) {\n case 'short-text':\n return <BulkEditShortText {...editorProps} />\n case 'long-text':\n return <BulkEditLongText {...editorProps} />\n case 'number':\n return <BulkEditNumber {...editorProps} />\n case 'select':\n return <BulkEditSelect {...editorProps} />\n case 'multi-select':\n return <BulkEditMultiSelect {...editorProps} />\n case 'checkbox':\n return <BulkEditCheckbox {...editorProps} />\n case 'date':\n return <BulkEditDate {...editorProps} />\n case 'hierarchy':\n return <BulkEditHierarchy {...editorProps} />\n default:\n return null\n }\n }, [cell.variant, columnId, selectedRowIndices, onApply, onCancel])\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n data-grid-popover=\"\"\n align=\"start\"\n sideOffset={4}\n className=\"w-[280px] p-0\"\n onOpenAutoFocus={onOpenAutoFocus}\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {editor}\n </PopoverContent>\n </Popover>\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 DownloadIcon,\n EyeOffIcon,\n HashIcon,\n ListChecksIcon,\n ListIcon,\n ListTreeIcon,\n PencilIcon,\n PinIcon,\n PinOffIcon,\n TextInitialIcon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\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 { BulkEditPopover, EditableCellVariant, EditableCellVariantsSet } from './bulk-edit-popover'\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 'hierarchy':\n return { icon: ListTreeIcon, label: 'Hierarchy' }\n case 'checkbox':\n return { icon: CheckSquareIcon, label: 'Checkbox' }\n case 'date':\n return { icon: CalendarIcon, label: 'Date' }\n case 'download-file':\n return { icon: DownloadIcon, label: 'File download' }\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 const [bulkEditOpen, setBulkEditOpen] = 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 enableBulkEdit = column.columnDef.meta?.enableBulkEdit ?? false\n const selectedRowCount = Object.keys(table.getState().rowSelection).length\n const showBulkEdit =\n enableBulkEdit &&\n selectedRowCount > 1 &&\n cellVariant != null &&\n EditableCellVariantsSet.has(cellVariant?.variant as EditableCellVariant)\n\n // close the popover properly if rows are no longer selected (e.g. user clicked somewhere else)\n React.useEffect(() => {\n if (!showBulkEdit) {\n setBulkEditOpen(false)\n }\n }, [showBulkEdit])\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={bulkEditOpen ? false : 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 {showBulkEdit ? (\n // Spacer that reserves space for the pencil button (rendered outside the trigger to avoid nesting interactive elements)\n <span className=\"inline-block size-4 shrink-0\" />\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 ) : null}\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 {/* Bulk edit button + popover — rendered outside the DropdownMenu to avoid event nesting */}\n {showBulkEdit && cellVariant && (\n <BulkEditPopover\n table={table}\n cell={cellVariant}\n columnId={column.id}\n open={bulkEditOpen}\n onOpenChange={setBulkEditOpen}\n selectedRowCount={selectedRowCount}\n >\n <Button\n title={`Bulk edit ${label}`}\n variant=\"ghost\"\n size=\"iconSm\"\n className=\"absolute left-2 top-1/2 -translate-y-1/2 size-5 hover:bg-primary hover:text-background\"\n >\n <PencilIcon className=\"size-3.5\" />\n </Button>\n </BulkEditPopover>\n )}\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): (() => void) | undefined => {\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\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 // biome-ignore lint/correctness/useExhaustiveDependencies: we want to memoize by all values\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 /** Key that changes when column pinning state changes */\n columnPinningKey: string\n /** Version number that changes when column definitions/metadata change (e.g., gantt date ranges) */\n columnDefsVersion: number\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 column pinning changed\n if (prev.columnPinningKey !== next.columnPinningKey) {\n return false\n }\n\n // Re-render if highlighted state changed\n if (prev.isHighlighted !== next.isHighlighted) {\n return false\n }\n\n // Re-render if column definitions version changed (e.g., gantt date range picker)\n if (prev.columnDefsVersion !== next.columnDefsVersion) {\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 columnPinningKey: _columnPinningKey,\n columnDefsVersion: _columnDefsVersion,\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('shrink-0 overflow-hidden', {\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 { ChevronDownIcon, ChevronUpIcon, XIcon } 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 <XIcon />\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 forceHeight?: boolean\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 forceHeight = false,\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 const columnDefsVersion = meta?.columnDefsVersion ?? 0\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 // Create a key that changes when column pinning changes\n const pinningState = table.getState().columnPinning\n const columnPinningKey = `${(pinningState.left ?? []).join(',')}|${(pinningState.right ?? []).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={cn(\n 'relative grid select-none overflow-auto rounded-md border border-border focus:outline-none',\n forceHeight && 'content-start',\n )}\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: `${\n forceHeight && height\n ? height\n : Math.min(\n rowVirtualizer.getTotalSize() + headerHeight + footerHeight + scrollbarHeight + 3,\n height ?? Infinity,\n )\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 shrink-0', {\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\n key={col.id}\n className=\"shrink-0 px-3\"\n style={{ width: `calc(var(--col-${col.id}-size) * 1px)` }}\n >\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 columnPinningKey={columnPinningKey}\n columnDefsVersion={columnDefsVersion}\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 * 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 cellValue = cell.getValue()\n const cellValueAsBoolean = Boolean(cellValue)\n const [value, setValue] = React.useState(cellValueAsBoolean)\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(cellValueAsBoolean)\n }, [cellValueAsBoolean])\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 { DownloadIcon } from 'lucide-react'\n\nimport { Button } from '../../button/button'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\n\nimport type { CellVariantProps } from './cell-variant-types'\n\nexport function DownloadFileCell<TData>({\n cell,\n table,\n rowIndex,\n columnId,\n isEditing,\n isFocused,\n isSelected,\n}: Readonly<CellVariantProps<TData, unknown>>) {\n const cellOpts = cell.column.columnDef.meta?.cell\n const downloadCellOpts = cellOpts?.variant === 'download-file' ? cellOpts : undefined\n const cellValue = cell.getValue()\n const row = cell.row.original\n\n const resolvedUrl =\n downloadCellOpts?.getUrl?.(cellValue, row) ?? (typeof cellValue === 'string' ? cellValue : undefined)\n\n const resolvedFileName =\n typeof downloadCellOpts?.fileName === 'function'\n ? downloadCellOpts.fileName(row, cellValue)\n : downloadCellOpts?.fileName\n\n const label = downloadCellOpts?.label ?? 'Download'\n\n return (\n <DataGridCellWrapper\n cell={cell}\n table={table}\n rowIndex={rowIndex}\n columnId={columnId}\n isEditing={isEditing}\n isFocused={isFocused}\n isSelected={isSelected}\n >\n <div data-slot=\"grid-cell-content\" className=\"size-full overflow-hidden outline-none\">\n {resolvedUrl ? (\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"h-7 gap-1 px-2\">\n <a href={resolvedUrl} download={resolvedFileName} target=\"_blank\" rel=\"noreferrer\">\n <DownloadIcon className=\"size-3.5\" />\n {label}\n </a>\n </Button>\n ) : (\n <span className=\"text-muted-foreground\">-</span>\n )}\n </div>\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 // Calculate the visible portion of the bar within the timeline bounds\n // barWidthMs will be negative if there's no overlap (bar completely outside timeline)\n const barWidthMs = hasValidDates\n ? Math.min(initialValue.end.getTime(), timelineEndMs) - Math.max(initialValue.start.getTime(), timelineStartMs)\n : 0\n\n // Only show bar if there's actual overlap with the timeline (positive width)\n const hasVisibleBar = hasValidDates && barWidthMs > 0\n\n // Calculate spacer width (distance from timeline start to bar start, clamped to timeline bounds)\n const msUntilStart = hasVisibleBar ? Math.max(0, initialValue.start.getTime() - timelineStartMs) : 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 {hasVisibleBar && (\n <>\n <div\n className=\"shrink-0\"\n style={{\n width: `${(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 * 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, XIcon } 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 // Sync internal state when the external data changes (e.g. from bulk edit).\n // SelectCell has an equivalent useEffect for its scalar value.\n React.useEffect(() => {\n setSelectedValues(cellValue)\n }, [cellValue])\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 <XIcon 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 rounded-none\"\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 { cn } from '../../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../popover/popover'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../select/select'\nimport { DataGridCellWrapper } from '../data-grid-cell-wrapper'\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 { options: arrayOptions, optionsMap, optionsRenderer } = cellOpts?.variant === 'select' ? cellOpts : {}\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 // Map-based options: direct O(1) lookup\n if (optionsMap) {\n const data = optionsMap.get(value ?? '')\n if (optionsRenderer) {\n return optionsRenderer(data, 'cell')\n }\n return data ?? 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, optionsRenderer])\n\n // Only build options array when editing (lazy) - avoids iterating large Maps when not needed\n // Stores { value, data } where data is the raw value from the map (string or object)\n const options = React.useMemo(() => {\n if (!isEditing) {\n return []\n } // Don't build array if not editing\n if (arrayOptions) {\n return arrayOptions.map((opt) => ({ value: opt.value, data: opt.label }))\n }\n if (optionsMap) {\n // Convert Map to array only when dropdown is open\n return Array.from(optionsMap.entries()).map(([id, data]) => ({ value: id, data }))\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 || optionsRenderer) {\n editingContent = (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <div\n className={cn(\n 'size-full',\n !optionsRenderer &&\n 'items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1',\n )}\n >\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 {hasSearch && (\n <CommandInput ref={inputRef} placeholder=\"Search...\" className=\"h-auto flex-1 p-0 rounded-none\" />\n )}\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n className={optionsRenderer ? 'py-1' : undefined}\n onSelect={() => {\n onValueChange(option.value)\n }}\n >\n {optionsRenderer ? optionsRenderer(option.data, 'option') : <span>{option.data}</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.data}\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 ? (\n editingContent\n ) : optionsRenderer ? (\n displayLabel\n ) : (\n <span data-slot=\"grid-cell-content\">{displayLabel}</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 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 { DownloadFileCell } from './cell-variants/download-file-cell'\nimport { GanttCell } from './cell-variants/gantt-cell'\nimport { HierarchyCell } from './cell-variants/hierarchy-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 'hierarchy':\n return (\n <HierarchyCell\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 'download-file':\n return (\n <DownloadFileCell\n cell={cell as Cell<TData, unknown>}\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 * 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 type { Table } from '@tanstack/react-table'\n\nimport {\n BookmarkIcon,\n CheckIcon,\n GlobeIcon,\n GripHorizontalIcon,\n PlusIcon,\n SaveIcon,\n Settings2Icon,\n TagIcon,\n Trash2Icon,\n XIcon,\n} from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../button/button'\nimport { Checkbox } from '../checkbox/checkbox'\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../command/command'\nimport { Input } from '../input/input'\nimport { cn } from '../lib/utils'\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover/popover'\nimport { Separator } from '../separator/separator'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip/tooltip'\n\nexport type SavedView = {\n id: string\n name: string\n isGlobal: boolean\n userId: string\n}\n\nexport type DataGridViewMenuProps<TData> = {\n table: Table<TData>\n /** List of saved views (both user's own and global views). */\n savedViews?: SavedView[]\n /** The currently active/applied saved view ID. */\n activeViewId?: string | null\n /** The current user's ID - used to determine which views the user can edit/delete. */\n currentUserId?: string\n /** Whether the current user has admin privileges. Controls visibility of the \"share with all users\" option and edit/delete on global views. */\n isAdmin?: boolean\n /** Called when the user selects a saved view to apply. */\n onApplyView?: (viewId: string) => void\n /** Called when the user wants to save the current table state as a new view. */\n onSaveView?: (args: { name: string; isGlobal: boolean }) => void\n /** Called when the user wants to update an existing view with the current table state. */\n onUpdateView?: (viewId: string) => void\n /** Called when the user renames a view. */\n onRenameView?: (viewId: string, name: string) => void\n /** Called when the user deletes a view. */\n onDeleteView?: (viewId: string) => void\n /** Called when the user clears the active view (back to default). */\n onClearView?: () => void\n} & React.ComponentProps<typeof PopoverContent>\n\nexport function DataGridViewMenu<TData>({\n table,\n savedViews,\n activeViewId,\n currentUserId,\n isAdmin,\n onApplyView,\n onSaveView,\n onUpdateView,\n onRenameView,\n onDeleteView,\n onClearView,\n ...props\n}: 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 // Saved views UI state\n const [isCreating, setIsCreating] = React.useState(false)\n const [newViewName, setNewViewName] = React.useState('')\n const [newViewGlobal, setNewViewGlobal] = React.useState(false)\n const [renamingViewId, setRenamingViewId] = React.useState<string | null>(null)\n const [renameValue, setRenameValue] = React.useState('')\n const [deletingViewId, setDeletingViewId] = React.useState<string | null>(null)\n const [updatingViewId, setUpdatingViewId] = React.useState<string | null>(null)\n\n function resetAllStates() {\n setIsCreating(false)\n setNewViewName('')\n setRenamingViewId(null)\n setRenameValue('')\n setDeletingViewId(null)\n setUpdatingViewId(null)\n setSearchQuery('')\n }\n\n // Keep order in sync with external changes to table state\n const tableColumnOrder = table.getState().columnOrder\n React.useEffect(() => {\n const stateOrder = tableColumnOrder ?? []\n if (stateOrder && stateOrder.length > 0) {\n setOrder(stateOrder)\n return\n }\n setOrder(table.getAllColumns().map((c) => c.id))\n }, [table, tableColumnOrder])\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 // Sort views: global first, then personal; alphabetical by name within each group\n const sortedViews = React.useMemo(() => {\n if (!savedViews || savedViews.length === 0) {\n return savedViews\n }\n return [...savedViews].sort((a, b) => {\n if (a.isGlobal !== b.isGlobal) {\n return a.isGlobal ? -1 : 1\n }\n return a.name.localeCompare(b.name)\n })\n }, [savedViews])\n\n const hasSavedViews = sortedViews && sortedViews.length > 0\n const hasViewsFeature = onSaveView !== undefined\n\n function handleSaveView() {\n if (!newViewName.trim() || !onSaveView) {\n return\n }\n onSaveView({ name: newViewName.trim(), isGlobal: newViewGlobal })\n resetAllStates()\n }\n\n function handleRenameView() {\n if (!renamingViewId || !renameValue.trim() || !onRenameView) {\n return\n }\n onRenameView(renamingViewId, renameValue.trim())\n resetAllStates()\n }\n\n return (\n <Popover\n onOpenChange={(open) => {\n if (open) {\n resetAllStates()\n }\n }}\n >\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-64 p-0 m-4 mt-0', isDragging ? 'cursor-grabbing' : '')} {...props}>\n {/* Saved Views Section */}\n {hasViewsFeature && (\n <>\n <div className=\"px-3 pt-3 pb-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Saved Views</span>\n </div>\n </div>\n {hasSavedViews ? (\n <div className=\"px-1 pb-1 max-h-40 overflow-y-auto\">\n {sortedViews.map((view) => {\n const isActive = activeViewId === view.id\n const isOwner = currentUserId === view.userId\n const canEdit = view.isGlobal ? !!isAdmin : isOwner\n\n if (renamingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <Input\n variant=\"simple\"\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleRenameView()\n }\n if (e.key === 'Escape') {\n setRenamingViewId(null)\n setRenameValue('')\n }\n }}\n className=\"min-h-6\"\n autoFocus\n />\n <Button variant=\"ghost\" size=\"iconXs\" onClick={handleRenameView}>\n <CheckIcon className=\"size-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n setRenamingViewId(null)\n setRenameValue('')\n }}\n >\n <XIcon className=\"size-3\" />\n </Button>\n </div>\n )\n }\n\n if (deletingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <span className=\"text-xs text-destructive truncate flex-1\">\n Delete "{view.name}"?\n </span>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n onDeleteView?.(view.id)\n setDeletingViewId(null)\n }}\n >\n Delete\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n setDeletingViewId(null)\n }}\n >\n Cancel\n </Button>\n </div>\n )\n }\n\n if (updatingViewId === view.id) {\n return (\n <div key={view.id} className=\"flex items-center gap-1 px-2 rounded-md h-8\">\n <span className=\"text-xs text-muted-foreground truncate flex-1\">\n Overwrite "{view.name}"?\n </span>\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n onUpdateView?.(view.id)\n setUpdatingViewId(null)\n }}\n >\n Overwrite\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation()\n setUpdatingViewId(null)\n }}\n >\n Cancel\n </Button>\n </div>\n )\n }\n\n return (\n <div\n key={view.id}\n className={cn(\n 'relative flex items-center text-start gap-1 px-2 h-6 rounded-sm cursor-pointer group hover:bg-accent',\n isActive && 'bg-accent/50',\n )}\n >\n <button\n type=\"button\"\n className=\"absolute inset-0 hover:cursor-pointer\"\n onClick={() => onApplyView?.(view.id)}\n aria-label={`Apply view \"${view.name}\"`}\n />\n {view.isGlobal ? (\n <GlobeIcon\n className={cn('size-3.5 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground')}\n />\n ) : (\n <BookmarkIcon\n className={cn('size-3.5 shrink-0', isActive ? 'text-primary' : 'text-muted-foreground')}\n />\n )}\n <span className=\"text-sm truncate flex-1\">{view.name}</span>\n\n {isActive ? <CheckIcon className=\"group-hover:hidden size-3.5 text-primary shrink-0\" /> : null}\n {canEdit && (\n <div className=\"relative z-10 hidden group-hover:flex items-center shrink-0\">\n {onUpdateView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n resetAllStates()\n setUpdatingViewId(view.id)\n }}\n >\n <SaveIcon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Overwrite with current state</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n {onRenameView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n onClick={() => {\n resetAllStates()\n setRenamingViewId(view.id)\n setRenameValue(view.name)\n }}\n >\n <TagIcon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Rename view</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n {onDeleteView && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"iconXs\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => {\n resetAllStates()\n setDeletingViewId(view.id)\n }}\n >\n <Trash2Icon className=\"size-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>Delete view</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n ) : (\n !isCreating && (\n <div className=\"px-3 pb-1\">\n <span className=\"text-xs text-muted-foreground\">No saved views</span>\n </div>\n )\n )}\n\n {/* Create new view form */}\n {isCreating ? (\n <div className=\"px-2 pb-2 space-y-1\">\n <Input\n variant=\"simple\"\n value={newViewName}\n onChange={(e) => setNewViewName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleSaveView()\n }\n if (e.key === 'Escape') {\n resetAllStates()\n }\n }}\n placeholder=\"View name...\"\n className=\"min-h-7 text-xs\"\n autoFocus\n />\n <div className=\"flex items-center justify-between gap-2\">\n {isAdmin && (\n <label className=\"flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer select-none\">\n <Checkbox checked={newViewGlobal} onChange={(e) => setNewViewGlobal(e.target.checked)} />\n <GlobeIcon className=\"size-4\" />\n Share with all users\n </label>\n )}\n <div className=\"ml-auto flex items-center gap-1 py-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={() => {\n resetAllStates()\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"h-6 text-xs px-2\"\n onClick={handleSaveView}\n disabled={!newViewName.trim()}\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"px-2 pb-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs w-full justify-start gap-1\"\n onClick={() => {\n resetAllStates()\n setIsCreating(true)\n }}\n >\n <PlusIcon className=\"size-3\" />\n Save current view\n </Button>\n </div>\n )}\n\n <Separator />\n </>\n )}\n\n {/* Column Settings Section */}\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 )}\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\">\n {column.columnDef.meta?.label ??\n (typeof column.columnDef.header === 'string' ? column.columnDef.header : column.id)}\n </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 )}\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 resetAllStates()\n resetTableView()\n onClearView?.()\n }}\n >\n Reset view\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ColumnDef, RowData } from '@tanstack/react-table'\n\nimport { TrashIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { Button } from '../../button/button'\nimport { Checkbox } from '../../checkbox/checkbox'\n\ntype RowWithId = { id: string }\n\ntype SelectColumnOptions<TData extends RowData & RowWithId> = {\n /**\n * Callback to handle removing selected rows.\n * Receives array of row IDs. If not provided, delete button won't show.\n */\n onRemoveRows?: (ids: TData['id'][]) => void\n /**\n * Column ID. Defaults to 'select'.\n */\n id?: string\n /**\n * Width of the column in pixels.\n * @default 70\n */\n size?: number\n}\n\n/**\n * Creates a selection column with checkboxes for row selection.\n * Includes a header checkbox for selecting all rows and an optional delete button.\n *\n * @example\n * ```tsx\n * const columns = [\n * createSelectColumn<MyDataType>({\n * onRemoveRows: (ids) => handleDelete(ids),\n * }),\n * // ... other columns\n * ]\n * ```\n */\nexport function createSelectColumn<TData extends RowData & RowWithId>(\n options: SelectColumnOptions<TData> = {},\n): ColumnDef<TData, unknown> {\n const { onRemoveRows, id = 'select', size = 70 } = options\n\n return {\n id,\n header: ({ table }) => (\n <div className=\"size-full p-0 m-0 flex items-center gap-2\">\n <Checkbox\n variant={table.getIsSomePageRowsSelected() ? 'default' : 'simple'}\n iconStyle={table.getIsSomePageRowsSelected() ? 'default' : 'simple'}\n checkIcon=\"check\"\n checked={table.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()}\n onChange={(e) => table.toggleAllPageRowsSelected(!!e.target.checked)}\n />\n {onRemoveRows && (\n <Button\n variant=\"ghost\"\n className=\"size-5 hover:[&_svg]:text-background hover:bg-destructive/90\"\n onClick={() => {\n const toRemove = table.getSelectedRowModel().rows.map((row) => row.original.id)\n if (toRemove.length === 0) {\n return\n }\n onRemoveRows(toRemove)\n table.toggleAllRowsSelected(false)\n }}\n >\n <TrashIcon />\n </Button>\n )}\n </div>\n ),\n cell: ({ row }) => (\n <div className=\"size-full flex items-center px-3\">\n <Checkbox\n variant=\"simple\"\n iconStyle=\"simple\"\n checkIcon=\"check\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onChange={(e) => row.toggleSelected(!!e.target.checked)}\n />\n </div>\n ),\n size,\n enableSorting: false,\n enableHiding: false,\n }\n}\n","import {\n type ColumnDef,\n getCoreRowModel,\n getSortedRowModel,\n type Row,\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 /** Optional className applied to each row. Can be a static string or a function receiving the TanStack Row object. */\n rowClassName?: string | ((row: Row<TData>) => string | undefined)\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 /**\n * Whether to persist column state (order, visibility, pinning) to localStorage.\n * Set by default to `false` for using a view system that manages its own persistence.\n * @default false\n */\n persistColumnState?: boolean\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 rowClassName,\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 persistColumnState = false,\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 // Track column definitions version - increments when columns array reference changes.\n // This is used to force row re-renders when column metadata (like gantt date ranges) changes.\n const columnDefsVersionRef = React.useRef(0)\n const prevColumnsRef = React.useRef(columns)\n if (prevColumnsRef.current !== columns) {\n prevColumnsRef.current = columns\n columnDefsVersionRef.current += 1\n }\n const columnDefsVersion = columnDefsVersionRef.current\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 // When persistColumnState is false (e.g. when a view system manages persistence), skip localStorage entirely.\n const storageKey = React.useMemo(() => {\n if (!persistColumnState || 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, persistColumnState])\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(...)`, column visibility, and column pinning.\n // Columns are returned in visual order: left-pinned, center (unpinned), right-pinned.\n const getNavigableColumnIds = React.useCallback(() => {\n const t = tableRef.current\n if (t) {\n return [...t.getLeftVisibleLeafColumns(), ...t.getCenterVisibleLeafColumns(), ...t.getRightVisibleLeafColumns()]\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 // Use rowUpdatesMap (which has original data indices) instead of the raw\n // updateArray (which may contain visual row indices).\n const currentMeta = tableRef.current?.options.meta\n if (currentMeta?.onCellChange) {\n for (const [originalRowIndex, cellUpdates] of rowUpdatesMap) {\n for (const { columnId, value } of cellUpdates) {\n try {\n currentMeta.onCellChange({ rowIndex: originalRowIndex, columnId, value })\n } catch (_) {\n // Ignore handler errors here to avoid breaking the grid behavior\n }\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 // Resolve the actual data property key: prefer accessorKey over columnId\n // so columns where id !== accessorKey (e.g. id:'assignee', accessorKey:'assigneeId') update correctly.\n const col = currentTable?.getColumn(columnId)\n const colDef = col?.columnDef as Record<string, unknown> | undefined\n const dataKey = typeof colDef?.accessorKey === 'string' ? colDef.accessorKey : columnId\n updatedRow[dataKey] = 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 // Check column-level editability before entering edit mode\n const col = tableRef.current?.getColumn(columnId)\n const editable = col?.columnDef?.meta?.editable\n if (editable === false) {\n return\n }\n if (typeof editable === 'function') {\n const row = tableRef.current?.getRowModel().rows[rowIndex]?.original\n if (row && !editable(row)) {\n return\n }\n }\n\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 rowClassName,\n columnDefsVersion,\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 rowClassName,\n columnDefsVersion,\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 { 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<'div'> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), 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 { Button } from '../button/button'\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../card/card'\nimport { Spinner } from '../spinner/spinner'\n\nexport type InfoCardVariant = 'loading' | 'error' | 'info' | 'not-found'\n\ntype InfoCardProps = {\n variant: InfoCardVariant\n title: string\n message: string\n showHomeButton?: boolean\n children?: React.ReactNode\n}\n\nconst variantStyles: Record<InfoCardVariant, { titleClass: string; messageContainerClass: string }> = {\n loading: {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n error: {\n titleClass: 'text-destructive',\n messageContainerClass: 'p-4 bg-destructive/10 border border-destructive/20 rounded-md',\n },\n info: {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n 'not-found': {\n titleClass: 'text-foreground',\n messageContainerClass: 'p-4 bg-muted border border-border rounded-md',\n },\n}\n\nexport const InfoCard = ({ variant, title, message, showHomeButton = false, children }: InfoCardProps) => {\n const styles = variantStyles[variant]\n\n return (\n <div className=\"flex w-full pt-4 px-4 h-(--content-without-header) items-center justify-center\">\n <Card className=\"max-w-xl w-full\">\n <CardHeader>\n <CardTitle className={styles.titleClass}>\n <span className=\"flex items-center gap-2\">\n {variant === 'loading' && (\n /* using style instead of className here since the spinner would flash full screen for the split second the class names aren't loaded yet after reload */\n <div style={{ width: 20, height: 20 }}>\n <Spinner />\n </div>\n )}\n {title}\n </span>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className={styles.messageContainerClass}>\n <p className=\"text-sm wrap-break-word\">{message}</p>\n </div>\n {children}\n </CardContent>\n {showHomeButton && (\n <CardFooter>\n <Button asChild>\n <a href=\"/\">Back to Home</a>\n </Button>\n </CardFooter>\n )}\n </Card>\n </div>\n )\n}\n","import {\n type Announcements,\n closestCenter,\n closestCorners,\n type CollisionDetection,\n defaultDropAnimationSideEffects,\n DndContext,\n type DndContextProps,\n type DragCancelEvent,\n type DragEndEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n type DragOverEvent,\n DragOverlay,\n type DragStartEvent,\n type DropAnimation,\n type DroppableContainer,\n getFirstCollision,\n KeyboardCode,\n type KeyboardCoordinateGetter,\n KeyboardSensor,\n MeasuringStrategy,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n type UniqueIdentifier,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n type AnimateLayoutChanges,\n arrayMove,\n defaultAnimateLayoutChanges,\n horizontalListSortingStrategy,\n SortableContext,\n type SortableContextProps,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nconst directions: string[] = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left]\n\nconst coordinateGetter: KeyboardCoordinateGetter = (event, { context }) => {\n const { active, droppableRects, droppableContainers, collisionRect } = context\n\n if (directions.includes(event.code)) {\n event.preventDefault()\n\n if (!active || !collisionRect) {\n return\n }\n\n const filteredContainers: DroppableContainer[] = []\n\n for (const entry of droppableContainers.getEnabled()) {\n if (!entry || entry?.disabled) {\n return\n }\n\n const rect = droppableRects.get(entry.id)\n\n if (!rect) {\n return\n }\n\n const data = entry.data.current\n\n if (data) {\n const { type, children } = data\n\n if (type === 'container' && children?.length > 0) {\n if (active.data.current?.type !== 'container') {\n return\n }\n }\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Left:\n if (collisionRect.left >= rect.left + rect.width) {\n filteredContainers.push(entry)\n }\n break\n case KeyboardCode.Right:\n if (collisionRect.left + collisionRect.width <= rect.left) {\n filteredContainers.push(entry)\n }\n break\n }\n }\n\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null,\n })\n const closestId = getFirstCollision(collisions, 'id')\n\n if (closestId != null) {\n const newDroppable = droppableContainers.get(closestId)\n const newNode = newDroppable?.node.current\n const newRect = newDroppable?.rect.current\n\n if (newNode && newRect) {\n if (newDroppable.id === 'placeholder') {\n return {\n x: newRect.left + (newRect.width - collisionRect.width) / 2,\n y: newRect.top + (newRect.height - collisionRect.height) / 2,\n }\n }\n\n if (newDroppable.data.current?.type === 'container') {\n return {\n x: newRect.left + 20,\n y: newRect.top + 74,\n }\n }\n\n return {\n x: newRect.left,\n y: newRect.top,\n }\n }\n }\n }\n\n return undefined\n}\n\nconst ROOT_NAME = 'Kanban'\nconst BOARD_NAME = 'KanbanBoard'\nconst COLUMN_NAME = 'KanbanColumn'\nconst COLUMN_HANDLE_NAME = 'KanbanColumnHandle'\nconst ITEM_NAME = 'KanbanItem'\nconst ITEM_HANDLE_NAME = 'KanbanItemHandle'\nconst OVERLAY_NAME = 'KanbanOverlay'\n\ntype KanbanContextValue<T> = {\n id: string\n items: Record<UniqueIdentifier, T[]>\n modifiers: DndContextProps['modifiers']\n strategy: SortableContextProps['strategy']\n orientation: 'horizontal' | 'vertical'\n activeId: UniqueIdentifier | null\n setActiveId: (id: UniqueIdentifier | null) => void\n getItemValue: (item: T) => UniqueIdentifier\n flatCursor: boolean\n}\n\nconst KanbanContext = React.createContext<KanbanContextValue<unknown> | null>(null)\n\nfunction useKanbanContext(consumerName: string) {\n const context = React.useContext(KanbanContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\ntype GetItemValue<T> = {\n /**\n * Callback that returns a unique identifier for each kanban item. Required for array of objects.\n * @example getItemValue={(item) => item.id}\n */\n getItemValue: (item: T) => UniqueIdentifier\n}\n\ntype KanbanRootProps<T> = Omit<DndContextProps, 'collisionDetection'> &\n (T extends object ? GetItemValue<T> : Partial<GetItemValue<T>>) & {\n value: Record<UniqueIdentifier, T[]>\n onValueChange?: (columns: Record<UniqueIdentifier, T[]>) => void\n onMove?: (event: DragEndEvent & { activeIndex: number; overIndex: number }) => void\n strategy?: SortableContextProps['strategy']\n orientation?: 'horizontal' | 'vertical'\n flatCursor?: boolean\n }\n\nfunction KanbanRoot<T>(props: KanbanRootProps<T>) {\n const {\n value,\n onValueChange,\n modifiers,\n strategy = verticalListSortingStrategy,\n orientation = 'horizontal',\n onMove,\n getItemValue: getItemValueProp,\n accessibility,\n flatCursor = false,\n ...kanbanProps\n } = props\n\n const id = React.useId()\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null)\n const lastOverIdRef = React.useRef<UniqueIdentifier | null>(null)\n const hasMovedRef = React.useRef(false)\n const sensors = useSensors(\n useSensor(MouseSensor),\n useSensor(TouchSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n )\n\n const getItemValue = React.useCallback(\n (item: T): UniqueIdentifier => {\n if (typeof item === 'object' && !getItemValueProp) {\n throw new Error('`getItemValue` is required when using array of objects')\n }\n return getItemValueProp ? getItemValueProp(item) : (item as UniqueIdentifier)\n },\n [getItemValueProp],\n )\n\n const getColumn = React.useCallback(\n (id: UniqueIdentifier) => {\n if (id in value) {\n return id\n }\n\n for (const [columnId, items] of Object.entries(value)) {\n if (items.some((item) => getItemValue(item) === id)) {\n return columnId\n }\n }\n\n return null\n },\n [value, getItemValue],\n )\n\n const collisionDetection: CollisionDetection = React.useCallback(\n (args) => {\n if (activeId && activeId in value) {\n return closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter((container) => container.id in value),\n })\n }\n\n const pointerIntersections = pointerWithin(args)\n const intersections = pointerIntersections.length > 0 ? pointerIntersections : rectIntersection(args)\n let overId = getFirstCollision(intersections, 'id')\n\n if (!overId) {\n if (hasMovedRef.current) {\n lastOverIdRef.current = activeId\n }\n return lastOverIdRef.current ? [{ id: lastOverIdRef.current }] : []\n }\n\n if (overId in value) {\n const containerItems = value[overId]\n if (containerItems && containerItems.length > 0) {\n const closestItem = closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (container) =>\n container.id !== overId && containerItems.some((item) => getItemValue(item) === container.id),\n ),\n })\n\n if (closestItem.length > 0) {\n overId = closestItem[0]?.id ?? overId\n }\n }\n }\n\n lastOverIdRef.current = overId\n return [{ id: overId }]\n },\n [activeId, value, getItemValue],\n )\n\n const onDragStart = React.useCallback(\n (event: DragStartEvent) => {\n kanbanProps.onDragStart?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n setActiveId(event.active.id)\n },\n [kanbanProps],\n )\n\n const onDragOver = React.useCallback(\n (event: DragOverEvent) => {\n kanbanProps.onDragOver?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n const { active, over } = event\n if (!over) {\n return\n }\n\n const activeColumn = getColumn(active.id)\n const overColumn = getColumn(over.id)\n\n if (!activeColumn || !overColumn) {\n return\n }\n\n if (activeColumn === overColumn) {\n const items = value[activeColumn]\n if (!items) {\n return\n }\n\n const activeIndex = items.findIndex((item) => getItemValue(item) === active.id)\n const overIndex = items.findIndex((item) => getItemValue(item) === over.id)\n\n if (activeIndex !== overIndex) {\n const newColumns = { ...value }\n newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex)\n onValueChange?.(newColumns)\n }\n } else {\n const activeItems = value[activeColumn]\n const overItems = value[overColumn]\n\n if (!activeItems || !overItems) {\n return\n }\n\n const activeIndex = activeItems.findIndex((item) => getItemValue(item) === active.id)\n\n if (activeIndex === -1) {\n return\n }\n\n const activeItem = activeItems[activeIndex]\n if (!activeItem) {\n return\n }\n\n const updatedItems = {\n ...value,\n [activeColumn]: activeItems.filter((item) => getItemValue(item) !== active.id),\n [overColumn]: [...overItems, activeItem],\n }\n\n onValueChange?.(updatedItems)\n hasMovedRef.current = true\n }\n },\n [kanbanProps, getColumn, value, getItemValue, onValueChange],\n )\n\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n kanbanProps.onDragEnd?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n const { active, over } = event\n\n if (!over) {\n setActiveId(null)\n return\n }\n\n if (active.id in value && over.id in value) {\n const activeIndex = Object.keys(value).indexOf(active.id as string)\n const overIndex = Object.keys(value).indexOf(over.id as string)\n\n if (activeIndex !== overIndex) {\n const orderedColumns = Object.keys(value)\n const newOrder = arrayMove(orderedColumns, activeIndex, overIndex)\n\n const newColumns: Record<UniqueIdentifier, T[]> = {}\n for (const key of newOrder) {\n const items = value[key]\n if (items) {\n newColumns[key] = items\n }\n }\n\n if (onMove) {\n onMove({ ...event, activeIndex, overIndex })\n } else {\n onValueChange?.(newColumns)\n }\n }\n } else {\n const activeColumn = getColumn(active.id)\n const overColumn = getColumn(over.id)\n\n if (!activeColumn || !overColumn) {\n setActiveId(null)\n return\n }\n\n if (activeColumn === overColumn) {\n const items = value[activeColumn]\n if (!items) {\n setActiveId(null)\n return\n }\n\n const activeIndex = items.findIndex((item) => getItemValue(item) === active.id)\n const overIndex = items.findIndex((item) => getItemValue(item) === over.id)\n\n if (activeIndex !== overIndex) {\n const newColumns = { ...value }\n newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex)\n if (onMove) {\n onMove({\n ...event,\n activeIndex,\n overIndex,\n })\n } else {\n onValueChange?.(newColumns)\n }\n }\n }\n }\n\n setActiveId(null)\n hasMovedRef.current = false\n },\n [kanbanProps, value, onMove, onValueChange, getColumn, getItemValue],\n )\n\n const onDragCancel = React.useCallback(\n (event: DragCancelEvent) => {\n kanbanProps.onDragCancel?.(event)\n\n if (event.activatorEvent.defaultPrevented) {\n return\n }\n\n setActiveId(null)\n hasMovedRef.current = false\n },\n [kanbanProps],\n )\n\n const announcements: Announcements = React.useMemo(\n () => ({\n onDragStart({ active }) {\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(active.id as string) + 1\n : (() => {\n const column = getColumn(active.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === active.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(active.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n return `Picked up ${itemType} at position ${position} of ${total}`\n },\n onDragOver({ active, over }) {\n if (!over) {\n return\n }\n\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(over.id as string) + 1\n : (() => {\n const column = getColumn(over.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === over.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(over.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n const overColumn = getColumn(over.id)\n const activeColumn = getColumn(active.id)\n\n if (isColumn) {\n return `${itemType} is now at position ${position} of ${total}`\n }\n\n if (activeColumn !== overColumn) {\n return `${itemType} is now at position ${position} of ${total} in ${overColumn}`\n }\n\n return `${itemType} is now at position ${position} of ${total}`\n },\n onDragEnd({ active, over }) {\n if (!over) {\n return\n }\n\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n const position = isColumn\n ? Object.keys(value).indexOf(over.id as string) + 1\n : (() => {\n const column = getColumn(over.id)\n if (!column || !value[column]) {\n return 1\n }\n return value[column].findIndex((item) => getItemValue(item) === over.id) + 1\n })()\n const total = isColumn\n ? Object.keys(value).length\n : (() => {\n const column = getColumn(over.id)\n return column ? (value[column]?.length ?? 0) : 0\n })()\n\n const overColumn = getColumn(over.id)\n const activeColumn = getColumn(active.id)\n\n if (isColumn) {\n return `${itemType} was dropped at position ${position} of ${total}`\n }\n\n if (activeColumn !== overColumn) {\n return `${itemType} was dropped at position ${position} of ${total} in ${overColumn}`\n }\n\n return `${itemType} was dropped at position ${position} of ${total}`\n },\n onDragCancel({ active }) {\n const isColumn = active.id in value\n const itemType = isColumn ? 'column' : 'item'\n return `Dragging was cancelled. ${itemType} was dropped.`\n },\n }),\n [value, getColumn, getItemValue],\n )\n\n const contextValue = React.useMemo<KanbanContextValue<T>>(\n () => ({\n id,\n items: value,\n modifiers,\n strategy,\n orientation,\n activeId,\n setActiveId,\n getItemValue,\n flatCursor,\n }),\n [id, value, activeId, modifiers, strategy, orientation, getItemValue, flatCursor],\n )\n\n return (\n <KanbanContext.Provider value={contextValue as KanbanContextValue<unknown>}>\n <DndContext\n collisionDetection={collisionDetection}\n modifiers={modifiers}\n sensors={sensors}\n {...kanbanProps}\n id={id}\n measuring={{\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n }}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n announcements,\n screenReaderInstructions: {\n draggable: `\n To pick up a kanban item or column, press space or enter.\n While dragging, use the arrow keys to move the item.\n Press space or enter again to drop the item in its new position, or press escape to cancel.\n `,\n },\n ...accessibility,\n }}\n />\n </KanbanContext.Provider>\n )\n}\n\nconst KanbanBoardContext = React.createContext<boolean>(false)\n\ntype KanbanBoardProps = {\n children: React.ReactNode\n asChild?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanBoard(props: KanbanBoardProps) {\n const { asChild, className, ref, ...boardProps } = props\n\n const context = useKanbanContext(BOARD_NAME)\n\n const columns = React.useMemo(() => {\n return Object.keys(context.items)\n }, [context.items])\n\n const BoardPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanBoardContext.Provider value={true}>\n <SortableContext\n items={columns}\n strategy={context.orientation === 'horizontal' ? horizontalListSortingStrategy : verticalListSortingStrategy}\n >\n <BoardPrimitive\n aria-orientation={context.orientation}\n data-orientation={context.orientation}\n data-slot=\"kanban-board\"\n {...boardProps}\n ref={ref}\n className={cn(\n 'flex size-full gap-4',\n context.orientation === 'horizontal' ? 'flex-row' : 'flex-col',\n className,\n )}\n />\n </SortableContext>\n </KanbanBoardContext.Provider>\n )\n}\n\ntype KanbanColumnContextValue = {\n id: string\n attributes: DraggableAttributes\n listeners: DraggableSyntheticListeners | undefined\n setActivatorNodeRef: (node: HTMLElement | null) => void\n isDragging?: boolean\n disabled?: boolean\n}\n\nconst KanbanColumnContext = React.createContext<KanbanColumnContextValue | null>(null)\n\nfunction useKanbanColumnContext(consumerName: string) {\n const context = React.useContext(KanbanColumnContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${COLUMN_NAME}\\``)\n }\n return context\n}\n\nconst animateLayoutChanges: AnimateLayoutChanges = (args) => defaultAnimateLayoutChanges({ ...args, wasDragging: true })\n\ntype KanbanColumnProps = {\n value: UniqueIdentifier\n children: React.ReactNode\n asChild?: boolean\n asHandle?: boolean\n disabled?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanColumn(props: KanbanColumnProps) {\n const { value, asChild, asHandle, disabled, className, style, ref, ...columnProps } = props\n\n const id = React.useId()\n const context = useKanbanContext(COLUMN_NAME)\n const inBoard = React.useContext(KanbanBoardContext)\n const inOverlay = React.useContext(KanbanOverlayContext)\n\n if (!inBoard && !inOverlay) {\n throw new Error(`\\`${COLUMN_NAME}\\` must be used within \\`${BOARD_NAME}\\` or \\`${OVERLAY_NAME}\\``)\n }\n\n if (value === '') {\n throw new Error(`\\`${COLUMN_NAME}\\` value cannot be an empty string`)\n }\n\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: value,\n disabled,\n animateLayoutChanges,\n })\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (disabled) {\n return\n }\n setNodeRef(node)\n })\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Transform.toString(transform),\n transition,\n ...style,\n }\n }, [transform, transition, style])\n\n const items = React.useMemo(() => {\n const items = context.items[value] ?? []\n return items.map((item) => context.getItemValue(item))\n }, [context, value])\n\n const columnContext = React.useMemo<KanbanColumnContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n )\n\n const ColumnPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanColumnContext.Provider value={columnContext}>\n <SortableContext\n items={items}\n strategy={context.orientation === 'horizontal' ? horizontalListSortingStrategy : verticalListSortingStrategy}\n >\n <ColumnPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? '' : undefined}\n data-slot=\"kanban-column\"\n {...columnProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n 'flex size-full flex-col gap-2 rounded-lg border bg-zinc-100 p-2.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:bg-zinc-900',\n {\n 'touch-none select-none': asHandle,\n 'cursor-default': context.flatCursor,\n 'data-dragging:cursor-grabbing': !context.flatCursor,\n 'cursor-grab': !isDragging && asHandle && !context.flatCursor,\n 'opacity-50': isDragging,\n 'pointer-events-none opacity-50': disabled,\n },\n className,\n )}\n />\n </SortableContext>\n </KanbanColumnContext.Provider>\n )\n}\n\ntype KanbanColumnHandleProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\nfunction KanbanColumnHandle(props: KanbanColumnHandleProps) {\n const { asChild, disabled, className, ref, ...columnHandleProps } = props\n\n const context = useKanbanContext(COLUMN_NAME)\n const columnContext = useKanbanColumnContext(COLUMN_HANDLE_NAME)\n\n const isDisabled = disabled ?? columnContext.disabled\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (isDisabled) {\n return\n }\n columnContext.setActivatorNodeRef(node)\n })\n\n const HandlePrimitive = asChild ? Slot : 'button'\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={columnContext.id}\n data-disabled={isDisabled}\n data-dragging={columnContext.isDragging ? '' : undefined}\n data-slot=\"kanban-column-handle\"\n {...columnHandleProps}\n {...(isDisabled ? {} : columnContext.attributes)}\n {...(isDisabled ? {} : columnContext.listeners)}\n ref={composedRef}\n className={cn(\n 'select-none disabled:pointer-events-none disabled:opacity-50',\n context.flatCursor ? 'cursor-default' : 'cursor-grab data-dragging:cursor-grabbing',\n className,\n )}\n disabled={isDisabled}\n />\n )\n}\n\ntype KanbanItemContextValue = {\n id: string\n attributes: DraggableAttributes\n listeners: DraggableSyntheticListeners | undefined\n setActivatorNodeRef: (node: HTMLElement | null) => void\n isDragging?: boolean\n disabled?: boolean\n}\n\nconst KanbanItemContext = React.createContext<KanbanItemContextValue | null>(null)\n\nfunction useKanbanItemContext(consumerName: string) {\n const context = React.useContext(KanbanItemContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``)\n }\n return context\n}\n\ntype KanbanItemProps = {\n value: UniqueIdentifier\n asHandle?: boolean\n asChild?: boolean\n disabled?: boolean\n} & React.ComponentProps<'div'>\n\nfunction KanbanItem(props: KanbanItemProps) {\n const { value, style, asHandle, asChild, disabled, className, ref, ...itemProps } = props\n\n const id = React.useId()\n const context = useKanbanContext(ITEM_NAME)\n const inBoard = React.useContext(KanbanBoardContext)\n const inOverlay = React.useContext(KanbanOverlayContext)\n\n if (!inBoard && !inOverlay) {\n throw new Error(`\\`${ITEM_NAME}\\` must be used within \\`${BOARD_NAME}\\``)\n }\n\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({\n id: value,\n disabled,\n })\n\n if (value === '') {\n throw new Error(`\\`${ITEM_NAME}\\` value cannot be an empty string`)\n }\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (disabled) {\n return\n }\n setNodeRef(node)\n })\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Transform.toString(transform),\n transition,\n ...style,\n }\n }, [transform, transition, style])\n\n const itemContext = React.useMemo<KanbanItemContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n )\n\n const ItemPrimitive = asChild ? Slot : 'div'\n\n return (\n <KanbanItemContext.Provider value={itemContext}>\n <ItemPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? '' : undefined}\n data-slot=\"kanban-item\"\n {...itemProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n 'focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1',\n {\n 'touch-none select-none': asHandle,\n 'cursor-default': context.flatCursor,\n 'data-dragging:cursor-grabbing': !context.flatCursor,\n 'cursor-grab': !isDragging && asHandle && !context.flatCursor,\n 'opacity-50': isDragging,\n 'pointer-events-none opacity-50': disabled,\n },\n className,\n )}\n />\n </KanbanItemContext.Provider>\n )\n}\n\ntype KanbanItemHandleProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\nfunction KanbanItemHandle(props: KanbanItemHandleProps) {\n const { asChild, disabled, className, ref, ...itemHandleProps } = props\n\n const context = useKanbanContext(ITEM_HANDLE_NAME)\n const itemContext = useKanbanItemContext(ITEM_HANDLE_NAME)\n\n const isDisabled = disabled ?? itemContext.disabled\n\n const composedRef = useComposedRefs(ref, (node: HTMLElement | null) => {\n if (isDisabled) {\n return\n }\n itemContext.setActivatorNodeRef(node)\n })\n\n const HandlePrimitive = asChild ? Slot : 'button'\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={itemContext.id}\n data-disabled={isDisabled}\n data-dragging={itemContext.isDragging ? '' : undefined}\n data-slot=\"kanban-item-handle\"\n {...itemHandleProps}\n {...(isDisabled ? {} : itemContext.attributes)}\n {...(isDisabled ? {} : itemContext.listeners)}\n ref={composedRef}\n className={cn(\n 'select-none disabled:pointer-events-none disabled:opacity-50',\n context.flatCursor ? 'cursor-default' : 'cursor-grab data-dragging:cursor-grabbing',\n className,\n )}\n disabled={isDisabled}\n />\n )\n}\n\nconst KanbanOverlayContext = React.createContext(false)\n\nconst dropAnimation: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0.4',\n },\n },\n }),\n}\n\ntype KanbanOverlayProps = {\n container?: Element | DocumentFragment | null\n children?: React.ReactNode | ((params: { value: UniqueIdentifier; variant: 'column' | 'item' }) => React.ReactNode)\n} & Omit<React.ComponentProps<typeof DragOverlay>, 'children'>\n\nfunction KanbanOverlay(props: KanbanOverlayProps) {\n const { container: containerProp, children, ...overlayProps } = props\n\n const context = useKanbanContext(OVERLAY_NAME)\n\n const [mounted, setMounted] = React.useState(false)\n\n React.useLayoutEffect(() => setMounted(true), [])\n\n const container = containerProp ?? (mounted ? globalThis.document?.body : null)\n\n if (!container) {\n return null\n }\n\n const variant = context.activeId && context.activeId in context.items ? 'column' : 'item'\n\n return ReactDOM.createPortal(\n <DragOverlay\n dropAnimation={dropAnimation}\n modifiers={context.modifiers}\n className={cn(!context.flatCursor && 'cursor-grabbing')}\n {...overlayProps}\n >\n <KanbanOverlayContext.Provider value={true}>\n {context.activeId && children\n ? typeof children === 'function'\n ? children({\n value: context.activeId,\n variant,\n })\n : children\n : null}\n </KanbanOverlayContext.Provider>\n </DragOverlay>,\n container,\n )\n}\n\nexport {\n KanbanRoot as Kanban,\n KanbanBoard,\n KanbanColumn,\n KanbanColumnHandle,\n KanbanItem,\n KanbanItemHandle,\n KanbanOverlay,\n //\n KanbanRoot as Root,\n KanbanBoard as Board,\n KanbanColumn as Column,\n KanbanColumnHandle as ColumnHandle,\n KanbanItem as Item,\n KanbanItemHandle as ItemHandle,\n KanbanOverlay as Overlay,\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nimport { Input, type InputProps } from '..'\n\nexport type DeferredInputProps = Omit<InputProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: string\n /**\n * Called when the user commits the value (on blur or Enter key)\n * Only fires if the value has actually changed\n */\n onCommit: (value: string) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: string) => void\n /**\n * If true, also commits on Enter key press (default: true)\n */\n commitOnEnter?: boolean\n}\n\n/**\n * An Input that buffers changes locally and only commits to the parent\n * on blur or Enter key press. Useful for forms where you don't want to\n * trigger expensive operations (like API calls) on every keystroke.\n */\nexport function DeferredInput({\n value,\n onCommit,\n onValueChange,\n commitOnEnter = true,\n onBlur,\n onKeyDown,\n ...props\n}: DeferredInputProps) {\n const [localValue, setLocalValue] = useState(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n onValueChange?.(newValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (commitOnEnter && e.key === 'Enter') {\n e.currentTarget.blur()\n }\n onKeyDown?.(e)\n },\n [commitOnEnter, onKeyDown],\n )\n\n return <Input {...props} value={localValue} onChange={handleChange} onBlur={handleBlur} onKeyDown={handleKeyDown} />\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nimport { NumberInput, type NumberInputProps } from '..'\n\nexport type DeferredNumberInputProps = Omit<NumberInputProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: number | null\n /**\n * Called when the user commits the value (on blur or Enter key)\n * Only fires if the value has actually changed\n */\n onCommit: (value: number | null) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: number | null) => void\n /**\n * If true, also commits on Enter key press (default: true)\n */\n commitOnEnter?: boolean\n}\n\n/**\n * A NumberInput that buffers changes locally and only commits to the parent\n * on blur or Enter key press. Useful for forms where you don't want to\n * trigger expensive operations (like API calls) on every keystroke.\n */\nexport function DeferredNumberInput({\n value,\n onCommit,\n onValueChange,\n commitOnEnter = true,\n onBlur,\n onEnter,\n ...props\n}: DeferredNumberInputProps) {\n const [localValue, setLocalValue] = useState<number | null>(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (newValue: number | undefined) => {\n const normalizedValue = newValue ?? null\n setLocalValue(normalizedValue)\n onValueChange?.(normalizedValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n const handleEnter = useCallback(() => {\n if (commitOnEnter) {\n commitValue()\n }\n onEnter?.()\n }, [commitOnEnter, commitValue, onEnter])\n\n return (\n <NumberInput\n {...props}\n value={localValue ?? undefined}\n onChange={handleChange}\n onBlur={handleBlur}\n onEnter={handleEnter}\n />\n )\n}\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: typeof MenubarPrimitive.Menu = 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, DialogDescription, 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 aria-describedby={subtitle ? undefined : 'modal-content'}\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 && <DialogDescription asChild>{subtitle}</DialogDescription>}\n {!subtitle && <DialogDescription className=\"sr-only\">Modal content</DialogDescription>}\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\" id=\"modal-content\">\n {children}\n </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, testId } 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 __e2e_test_id__?: string\n }\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(\n ({ side = 'right', className, children, __e2e_test_id__, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n data-test-id={__e2e_test_id__}\n {...props}\n >\n <SheetPrimitive.Close\n 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 data-test-id={testId(__e2e_test_id__, 'close')}\n >\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 * as React from 'react'\n\nimport { cn, TooltipProvider, useIsMobile } from '../index'\n\nexport const SIDEBAR_WIDTH = '16rem'\nexport const SIDEBAR_WIDTH_MOBILE = '18rem'\nexport const SIDEBAR_WIDTH_ICON = '3rem'\nexport const SIDEBAR_KEYBOARD_SHORTCUT = 'b'\nexport const SIDEBAR_KEYBOARD_SHORTCUT_RIGHT = '.'\nexport const SIDEBAR_MIN_WIDTH = 200\nexport const SIDEBAR_MAX_WIDTH = 600\n\n// -- Public types --\n\nexport type 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 width: number | undefined\n setWidth: (width: number) => void\n isResizing: boolean\n minWidth: number\n maxWidth: number\n}\n\n// -- Internal store type --\n\ntype SidebarRegistryEntry = { side: 'left' | 'right'; minWidth: number; maxWidth: number }\n\ntype SidebarProviderState = {\n openStates: Record<string, boolean>\n mobileStates: Record<string, boolean>\n widthStates: Record<string, number | undefined>\n sidebarRegistry: Record<string, SidebarRegistryEntry>\n setOpen: (id: string, open: boolean) => void\n setOpenMobile: (id: string, open: boolean) => void\n setWidth: (id: string, width: number) => void\n registerSidebar: (id: string, config: SidebarRegistryEntry) => void\n unregisterSidebar: (id: string) => void\n isMobile: boolean\n defaultOpen: boolean\n isResizing: boolean\n setIsResizing: React.Dispatch<React.SetStateAction<boolean>>\n providerMinWidth: number\n providerMaxWidth: number\n}\n\n// -- Contexts --\n\n/**\n * Internal store context. Exported for use by `Sidebar` component in the same\n * package to build per-sidebar resize contexts.\n */\nexport const SidebarContext = React.createContext<SidebarProviderState | null>(null)\n\n/**\n * Context that identifies which sidebar a component belongs to.\n * Set by `<Sidebar sidebarId=\"...\">`, consumed by `useSidebar()`.\n */\nexport const SidebarIdContext = React.createContext<string>('default')\n\n// -- Hook --\n\n/**\n * Returns the state and controls for a specific sidebar.\n *\n * @param sidebarId - Optional explicit sidebar ID. Falls back to the nearest\n * `SidebarIdContext` (set by the parent `<Sidebar>`), then to `\"default\"`.\n */\nexport function useSidebar(sidebarId?: string): SidebarContextProps {\n const store = React.useContext(SidebarContext)\n const ctxId = React.useContext(SidebarIdContext)\n const id = sidebarId ?? ctxId\n\n if (!store) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n const open = store.openStates[id] ?? store.defaultOpen\n const openMobile = store.mobileStates[id] ?? false\n const width = store.widthStates[id]\n const { isMobile, isResizing } = store\n\n const registry = store.sidebarRegistry[id]\n const minWidth = registry?.minWidth ?? store.providerMinWidth\n const maxWidth = registry?.maxWidth ?? store.providerMaxWidth\n\n const setOpen = React.useCallback((value: boolean) => store.setOpen(id, value), [store.setOpen, id])\n\n const setOpenMobile = React.useCallback((value: boolean) => store.setOpenMobile(id, value), [store.setOpenMobile, id])\n\n const setWidth = React.useCallback((value: number) => store.setWidth(id, value), [store.setWidth, id])\n\n const toggleSidebar = React.useCallback(() => {\n if (store.isMobile) {\n store.setOpenMobile(id, !(store.mobileStates[id] ?? false))\n } else {\n store.setOpen(id, !(store.openStates[id] ?? store.defaultOpen))\n }\n }, [store, id])\n\n const state = open ? 'expanded' : 'collapsed'\n\n return React.useMemo(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n width,\n setWidth,\n isResizing,\n minWidth,\n maxWidth,\n }),\n [\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n width,\n setWidth,\n isResizing,\n minWidth,\n maxWidth,\n ],\n )\n}\n\n/**\n * Returns a list of all registered sidebars with their IDs and sides.\n */\nexport function useRegisteredSidebars(): { sidebarId: string; side: 'left' | 'right' }[] {\n const store = React.useContext(SidebarContext)\n if (!store) {\n throw new Error('useRegisteredSidebars must be used within a SidebarProvider.')\n }\n return React.useMemo(\n () => Object.entries(store.sidebarRegistry).map(([sidebarId, entry]) => ({ sidebarId, side: entry.side })),\n [store.sidebarRegistry],\n )\n}\n\n// -- Provider --\n\n/** Shape persisted to localStorage under `storageKey`. */\ntype StoredSidebarStates = Record<string, { open: boolean; width?: number }>\n\nexport function SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n width: widthProp,\n onWidthChange,\n minWidth = SIDEBAR_MIN_WIDTH,\n maxWidth = SIDEBAR_MAX_WIDTH,\n storageKey,\n defaultOpenSidebars,\n defaultWidths,\n keyboardShortcuts,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n /** Controlled width for the \"default\" sidebar (backward compat). */\n width?: number\n /** Called when the \"default\" sidebar width changes via resize (backward compat). */\n onWidthChange?: (width: number) => void\n minWidth?: number\n maxWidth?: number\n storageKey?: string\n defaultOpenSidebars?: Record<string, boolean>\n /** Default widths per sidebar ID (in pixels). */\n defaultWidths?: Record<string, number>\n /** Keyboard shortcuts mapping: key character → sidebar ID. Uses Ctrl/Cmd modifier.\n * Defaults to `{ b: 'default' }`. Set to `false` to disable all shortcuts. */\n keyboardShortcuts?: Record<string, string> | false\n}) {\n const isMobile = useIsMobile()\n const [isResizing, setIsResizing] = React.useState(false)\n\n // Read localStorage once on mount for both open & width states\n const storedRef = React.useRef<StoredSidebarStates | null>(null)\n if (storedRef.current === null && storageKey) {\n try {\n storedRef.current = JSON.parse(localStorage.getItem(storageKey) ?? '{}') as StoredSidebarStates\n } catch {\n storedRef.current = {}\n }\n }\n\n // -- Open states --\n\n const [openStates, setOpenStates] = React.useState<Record<string, boolean>>(() => {\n const states: Record<string, boolean> = { default: defaultOpen }\n if (defaultOpenSidebars) {\n Object.assign(states, defaultOpenSidebars)\n }\n if (storedRef.current) {\n for (const [id, data] of Object.entries(storedRef.current)) {\n if (data && typeof data === 'object' && 'open' in data) {\n states[id] = data.open\n }\n }\n }\n return states\n })\n\n const [mobileStates, setMobileStates] = React.useState<Record<string, boolean>>({})\n\n // Sync controlled \"default\" sidebar from parent\n React.useEffect(() => {\n if (openProp !== undefined) {\n setOpenStates((prev) => (prev['default'] === openProp ? prev : { ...prev, default: openProp }))\n }\n }, [openProp])\n\n // Compute effective open states (controlled mode override for \"default\")\n const effectiveOpenStates = React.useMemo(() => {\n if (openProp !== undefined) {\n return { ...openStates, default: openProp }\n }\n return openStates\n }, [openStates, openProp])\n\n // -- Width states --\n\n const [widthStates, setWidthStates] = React.useState<Record<string, number | undefined>>(() => {\n const states: Record<string, number | undefined> = {}\n if (widthProp !== undefined) {\n states['default'] = widthProp\n }\n if (defaultWidths) {\n Object.assign(states, defaultWidths)\n }\n if (storedRef.current) {\n for (const [id, data] of Object.entries(storedRef.current)) {\n if (data && typeof data === 'object' && typeof data.width === 'number') {\n states[id] = data.width\n }\n }\n }\n return states\n })\n\n // Sync controlled \"default\" sidebar width from parent\n React.useEffect(() => {\n if (widthProp !== undefined) {\n setWidthStates((prev) => (prev['default'] === widthProp ? prev : { ...prev, default: widthProp }))\n }\n }, [widthProp])\n\n // Compute effective width states (controlled mode override for \"default\")\n const effectiveWidthStates = React.useMemo(() => {\n if (widthProp !== undefined) {\n return { ...widthStates, default: widthProp }\n }\n return widthStates\n }, [widthStates, widthProp])\n\n // -- Persistence --\n\n React.useEffect(() => {\n if (!storageKey) {\n return\n }\n const toStore: StoredSidebarStates = {}\n const allIds = new Set([...Object.keys(openStates), ...Object.keys(widthStates)])\n for (const id of allIds) {\n toStore[id] = {\n open: openStates[id] ?? defaultOpen,\n ...(widthStates[id] === undefined ? {} : { width: widthStates[id] }),\n }\n }\n localStorage.setItem(storageKey, JSON.stringify(toStore))\n }, [storageKey, openStates, widthStates, defaultOpen])\n\n // -- Callbacks --\n\n const setOpen = React.useCallback(\n (id: string, open: boolean) => {\n if (id === 'default' && setOpenProp) {\n setOpenProp(open)\n }\n setOpenStates((prev) => ({ ...prev, [id]: open }))\n },\n [setOpenProp],\n )\n\n const setOpenMobile = React.useCallback((id: string, open: boolean) => {\n setMobileStates((prev) => ({ ...prev, [id]: open }))\n }, [])\n\n const setWidth = React.useCallback(\n (id: string, width: number) => {\n if (id === 'default' && onWidthChange) {\n onWidthChange(width)\n }\n setWidthStates((prev) => ({ ...prev, [id]: width }))\n },\n [onWidthChange],\n )\n\n // -- Sidebar registry (sidebarId → side + resize bounds) --\n\n const [sidebarRegistry, setSidebarRegistry] = React.useState<Record<string, SidebarRegistryEntry>>({})\n\n const registerSidebar = React.useCallback((id: string, config: SidebarRegistryEntry) => {\n setSidebarRegistry((prev) => {\n const existing = prev[id]\n if (\n existing &&\n existing.side === config.side &&\n existing.minWidth === config.minWidth &&\n existing.maxWidth === config.maxWidth\n ) {\n return prev\n }\n return { ...prev, [id]: config }\n })\n }, [])\n\n const unregisterSidebar = React.useCallback((id: string) => {\n setSidebarRegistry((prev) => {\n const { [id]: _, ...rest } = prev\n return rest\n })\n }, [])\n\n // -- Keyboard shortcuts --\n\n const effectiveOpenStatesRef = React.useRef(effectiveOpenStates)\n effectiveOpenStatesRef.current = effectiveOpenStates\n\n const resolvedShortcuts = React.useMemo(() => {\n if (keyboardShortcuts === false) {\n return {}\n }\n return keyboardShortcuts ?? { [SIDEBAR_KEYBOARD_SHORTCUT]: 'default' }\n }, [keyboardShortcuts])\n\n React.useEffect(() => {\n const entries = Object.entries(resolvedShortcuts)\n if (entries.length === 0) {\n return\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey)) {\n return\n }\n\n for (const [key, sidebarId] of entries) {\n if (event.key === key) {\n event.preventDefault()\n if (isMobile) {\n setMobileStates((prev) => ({ ...prev, [sidebarId]: !(prev[sidebarId] ?? false) }))\n } else {\n const currentOpen = effectiveOpenStatesRef.current[sidebarId] ?? defaultOpen\n setOpen(sidebarId, !currentOpen)\n }\n return\n }\n }\n }\n\n globalThis.addEventListener('keydown', handleKeyDown)\n return () => globalThis.removeEventListener('keydown', handleKeyDown)\n }, [resolvedShortcuts, isMobile, defaultOpen, setOpen])\n\n // -- Store value --\n\n const storeValue = React.useMemo<SidebarProviderState>(\n () => ({\n openStates: effectiveOpenStates,\n mobileStates,\n widthStates: effectiveWidthStates,\n sidebarRegistry,\n setOpen,\n setOpenMobile,\n setWidth,\n registerSidebar,\n unregisterSidebar,\n isMobile,\n defaultOpen,\n isResizing,\n setIsResizing,\n providerMinWidth: minWidth,\n providerMaxWidth: maxWidth,\n }),\n [\n effectiveOpenStates,\n mobileStates,\n effectiveWidthStates,\n sidebarRegistry,\n setOpen,\n setOpenMobile,\n setWidth,\n registerSidebar,\n unregisterSidebar,\n isMobile,\n defaultOpen,\n isResizing,\n minWidth,\n maxWidth,\n ],\n )\n\n // Default sidebar width for the CSS variable on the wrapper\n const defaultWidth = effectiveWidthStates['default']\n const sidebarWidthValue = defaultWidth ? `${defaultWidth}px` : SIDEBAR_WIDTH\n\n return (\n <SidebarContext.Provider value={storeValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': sidebarWidthValue,\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","import { Slot } from '@radix-ui/react-slot'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { PanelLeftIcon, PanelRightIcon } 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 TooltipTrigger,\n} from '../index'\n\nimport {\n SIDEBAR_MAX_WIDTH,\n SIDEBAR_MIN_WIDTH,\n SIDEBAR_WIDTH,\n SIDEBAR_WIDTH_ICON,\n SIDEBAR_WIDTH_MOBILE,\n SidebarContext,\n SidebarIdContext,\n useSidebar,\n} from './sidebar-context-provider'\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n sidebarId = 'default',\n minWidth,\n maxWidth,\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 sidebarId?: string\n minWidth?: number\n maxWidth?: number\n}) {\n const { isMobile, state, openMobile, setOpenMobile, width, isResizing } = useSidebar(sidebarId)\n const store = React.useContext(SidebarContext)\n\n // Register this sidebar (side + resize bounds) on mount; unregister on unmount.\n // Use a ref for store to avoid re-triggering the effect when store reference\n // changes (registerSidebar itself causes a store update).\n const storeRef = React.useRef(store)\n storeRef.current = store\n\n const effectiveMinWidth = minWidth ?? store?.providerMinWidth ?? SIDEBAR_MIN_WIDTH\n const effectiveMaxWidth = maxWidth ?? store?.providerMaxWidth ?? SIDEBAR_MAX_WIDTH\n\n React.useEffect(() => {\n storeRef.current?.registerSidebar(sidebarId, { side, minWidth: effectiveMinWidth, maxWidth: effectiveMaxWidth })\n return () => storeRef.current?.unregisterSidebar(sidebarId)\n }, [sidebarId, side, effectiveMinWidth, effectiveMaxWidth])\n\n // Compute CSS variable for this sidebar's width\n const sidebarWidthValue = width ? `${width}px` : SIDEBAR_WIDTH\n const sidebarStyle = {\n '--sidebar-width': sidebarWidthValue,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n } as React.CSSProperties\n\n const wrappedChildren = <SidebarIdContext.Provider value={sidebarId}>{children}</SidebarIdContext.Provider>\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n style={sidebarStyle}\n className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)}\n {...props}\n >\n {wrappedChildren}\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\">{wrappedChildren}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n style={sidebarStyle}\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 isResizing && 'duration-0',\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 isResizing && 'duration-0',\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 {wrappedChildren}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n sidebarId,\n children,\n ...props\n}: React.ComponentProps<typeof Button> & { sidebarId?: string }) {\n const { toggleSidebar } = useSidebar(sidebarId)\n const store = React.useContext(SidebarContext)\n const ctxId = React.useContext(SidebarIdContext)\n const resolvedId = sidebarId ?? ctxId\n const side = store?.sidebarRegistry[resolvedId]?.side\n const Icon = side === 'right' ? PanelRightIcon : PanelLeftIcon\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 {children ?? (\n <>\n <Icon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </>\n )}\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar, setWidth, minWidth, maxWidth } = useSidebar()\n const store = React.useContext(SidebarContext)\n const startXRef = React.useRef(0)\n const hasDraggedRef = React.useRef(false)\n\n const sidebarId = React.useContext(SidebarIdContext)\n const isResizable = !!store?.sidebarRegistry[sidebarId]\n\n const handleMouseDown = React.useCallback(\n (e: React.MouseEvent) => {\n if (!isResizable) {\n return\n }\n e.preventDefault()\n startXRef.current = e.clientX\n hasDraggedRef.current = false\n store?.setIsResizing(true)\n\n const sidebarEl = (e.target as HTMLElement).closest('[data-slot=\"sidebar-container\"]')\n const sidebarLeft = sidebarEl?.getBoundingClientRect().left ?? 0\n const side = (e.target as HTMLElement).closest('[data-side]')?.getAttribute('data-side')\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (Math.abs(moveEvent.clientX - startXRef.current) > 3) {\n hasDraggedRef.current = true\n }\n let newWidth: number\n if (side === 'right') {\n const sidebarRight = sidebarEl?.getBoundingClientRect().right ?? globalThis.innerWidth\n newWidth = sidebarRight - moveEvent.clientX\n } else {\n newWidth = moveEvent.clientX - sidebarLeft\n }\n if (newWidth >= minWidth && newWidth <= maxWidth) {\n setWidth(newWidth)\n }\n }\n\n const handleMouseUp = () => {\n store?.setIsResizing(false)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n },\n [isResizable, store, setWidth, minWidth, maxWidth],\n )\n\n const handleClick = React.useCallback(() => {\n if (hasDraggedRef.current) {\n return\n }\n toggleSidebar()\n }, [toggleSidebar])\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={handleClick}\n onMouseDown={isResizable ? handleMouseDown : undefined}\n title={isResizable ? 'Resize / Toggle Sidebar' : '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 isResizable\n ? 'cursor-col-resize'\n : [\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 ],\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 SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n}\n","import type { badgeVariants } from '@/badge/badge'\n\nimport type { VariantProps } from 'class-variance-authority'\nimport type { LucideIcon } from 'lucide-react'\nimport * as React from 'react'\n\nexport type SidebarSide = 'left' | 'right'\n\nexport type SidebarTabBadge = {\n label: string\n variant?: VariantProps<typeof badgeVariants>['variant']\n className?: string\n}\n\nexport type SidebarTabDefinition = {\n id: string\n icon: LucideIcon\n label: string\n render: () => React.ReactNode\n order?: number\n badge?: SidebarTabBadge\n}\n\ntype SidebarTabsState = {\n tabs: Partial<Record<SidebarSide, SidebarTabDefinition[]>>\n activeTab: Partial<Record<SidebarSide, string | null>>\n register: (side: SidebarSide, tab: SidebarTabDefinition) => void\n unregister: (side: SidebarSide, tabId: string) => void\n setActiveTab: (side: SidebarSide, tabId: string | null) => void\n}\n\nexport const SidebarTabsContext = React.createContext<SidebarTabsState | null>(null)\n\nexport function SidebarTabsProvider({ children }: Readonly<{ children: React.ReactNode }>) {\n const [tabsMap, setTabsMap] = React.useState<Partial<Record<SidebarSide, Map<string, SidebarTabDefinition>>>>({})\n const [activeTab, setActiveTabState] = React.useState<Partial<Record<SidebarSide, string | null>>>({})\n\n const register = React.useCallback((side: SidebarSide, tab: SidebarTabDefinition) => {\n setTabsMap((prev) => {\n const next = new Map(prev[side])\n next.set(tab.id, tab)\n return { ...prev, [side]: next }\n })\n // Auto-select first tab if nothing active\n setActiveTabState((prev) => {\n if (prev[side] === undefined || prev[side] === null) {\n return { ...prev, [side]: tab.id }\n }\n return prev\n })\n }, [])\n\n const unregister = React.useCallback((side: SidebarSide, tabId: string) => {\n setTabsMap((prev) => {\n const next = new Map(prev[side])\n next.delete(tabId)\n return { ...prev, [side]: next }\n })\n setActiveTabState((prev) => {\n if (prev[side] === tabId) {\n return { ...prev, [side]: null }\n }\n return prev\n })\n }, [])\n\n const setActiveTab = React.useCallback((side: SidebarSide, tabId: string | null) => {\n setActiveTabState((prev) => {\n if (prev[side] === tabId) {\n return prev\n }\n return { ...prev, [side]: tabId }\n })\n }, [])\n\n const sortedTabs = React.useMemo(() => {\n const sort = (map: Map<string, SidebarTabDefinition>) =>\n [...map.values()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n const result = {} as Record<SidebarSide, SidebarTabDefinition[]>\n for (const [side, map] of Object.entries(tabsMap) as [SidebarSide, Map<string, SidebarTabDefinition>][]) {\n result[side] = sort(map)\n }\n return result\n }, [tabsMap])\n\n const value = React.useMemo<SidebarTabsState>(\n () => ({\n tabs: sortedTabs,\n activeTab,\n register,\n unregister,\n setActiveTab,\n }),\n [sortedTabs, activeTab, register, unregister, setActiveTab],\n )\n\n return <SidebarTabsContext.Provider value={value}>{children}</SidebarTabsContext.Provider>\n}\n\nexport function useSidebarTabs(side?: SidebarSide) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('useSidebarTabs must be used within a SidebarTabsProvider.')\n }\n\n const boundSetActiveTab = React.useCallback(\n (tabId: string | null) => {\n if (side) {\n ctx.setActiveTab(side, tabId)\n }\n },\n [ctx.setActiveTab, side],\n )\n\n const boundResult = React.useMemo(\n () =>\n side\n ? {\n tabs: ctx.tabs[side] ?? [],\n activeTab: ctx.activeTab[side] ?? null,\n setActiveTab: boundSetActiveTab,\n }\n : null,\n [side, ctx.tabs, ctx.activeTab, boundSetActiveTab],\n )\n\n if (side) {\n return boundResult!\n }\n return ctx\n}\n","import * as React from 'react'\n\nimport { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from '../index'\n\nimport { Sidebar, SidebarContent, SidebarHeader, SidebarRail, SidebarSeparator } from './sidebar'\nimport { useSidebar } from './sidebar-context-provider'\nimport { type SidebarSide, type SidebarTabDefinition, SidebarTabsContext } from './sidebar-tab-context-provider'\n\n// ---------------------------------------------------------------------------\n// SidebarTab — declarative registration component\n// ---------------------------------------------------------------------------\n\nexport function SidebarTab({\n side,\n id,\n icon,\n label,\n render,\n order,\n badge,\n}: {\n side: SidebarSide\n} & SidebarTabDefinition) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('SidebarTab must be used within a SidebarTabsProvider.')\n }\n\n const { register, unregister } = ctx\n\n // Keep refs to the latest render fn and icon so we don't re-register on every render\n const renderRef = React.useRef(render)\n renderRef.current = render\n const iconRef = React.useRef(icon)\n iconRef.current = icon\n\n const stableRender = React.useCallback(() => renderRef.current(), [])\n\n React.useEffect(() => {\n register(side, { id, icon: iconRef.current, label, render: stableRender, order, badge })\n return () => unregister(side, id)\n // icon is accessed via iconRef to avoid re-registration when the reference changes\n }, [side, id, label, order, badge, register, unregister, stableRender])\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// DynamicTabbedSidebar — composed sidebar with icon tabbar from context\n// ---------------------------------------------------------------------------\n\nexport function DynamicTabbedSidebar({\n side,\n orientation = 'horizontal',\n collapsible = 'offcanvas',\n className,\n ...sidebarProps\n}: {\n side: SidebarSide\n orientation?: 'horizontal' | 'vertical'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n} & Omit<React.ComponentProps<typeof Sidebar>, 'side' | 'collapsible' | 'sidebarId'>) {\n const ctx = React.useContext(SidebarTabsContext)\n if (!ctx) {\n throw new Error('DynamicTabbedSidebar must be used within a SidebarTabsProvider.')\n }\n\n const { setActiveTab } = ctx\n const tabs = ctx.tabs[side] ?? []\n const activeTabId = ctx.activeTab[side] ?? null\n const activeTab = tabs.find((t) => t.id === activeTabId)\n\n // Fallback: auto-select first tab when current active is missing\n React.useEffect(() => {\n if (tabs.length > 0 && tabs[0] && !activeTab) {\n setActiveTab(side, tabs[0].id)\n }\n }, [tabs, activeTab, side, setActiveTab])\n\n const isVertical = orientation === 'vertical'\n\n // For vertical orientation, default to 'icon' collapsible so the tab strip\n // remains visible when collapsed (VS Code Activity Bar behavior).\n const effectiveCollapsible = isVertical && collapsible === 'offcanvas' ? 'icon' : collapsible\n\n // for now, we only allow one sidebar per side, so we can use the side as the sidebarId\n return (\n <Sidebar side={side} sidebarId={side} collapsible={effectiveCollapsible} className={className} {...sidebarProps}>\n <TabbedSidebarContent\n side={side}\n tabs={tabs}\n activeTabId={activeTabId}\n activeTab={activeTab}\n isVertical={isVertical}\n collapsible={effectiveCollapsible}\n />\n <SidebarRail />\n </Sidebar>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal layout wrapper — handles collapsed vs expanded for tabbed sidebars\n// ---------------------------------------------------------------------------\n\nfunction TabbedSidebarContent({\n side,\n tabs,\n activeTabId,\n activeTab,\n isVertical,\n collapsible,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n activeTab: SidebarTabDefinition | undefined\n isVertical: boolean\n collapsible: 'offcanvas' | 'icon' | 'none'\n}>) {\n const { state } = useSidebar(side)\n const isCollapsed = state === 'collapsed'\n const isIconCollapsible = collapsible === 'icon'\n\n // When collapsed with icon mode, both orientations show vertical icon strip\n if (isCollapsed && isIconCollapsible) {\n return (\n <div className=\"flex h-full flex-col\">\n <VerticalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n </div>\n )\n }\n\n if (isVertical) {\n return (\n <div className=\"flex h-full flex-row\">\n <VerticalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <SidebarContent>{activeTab?.render()}</SidebarContent>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <HorizontalTabBar side={side} tabs={tabs} activeTabId={activeTabId} />\n {tabs.length > 0 && <SidebarSeparator />}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <SidebarContent>{activeTab?.render()}</SidebarContent>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Internal tab bar sub-components\n// ---------------------------------------------------------------------------\n\nfunction HorizontalTabBar({\n side,\n tabs,\n activeTabId,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n}>) {\n const ctx = React.useContext(SidebarTabsContext)!\n const { state, toggleSidebar } = useSidebar(side)\n\n if (tabs.length === 0) {\n return null\n }\n\n const handleTabClick = (tabId: string) => {\n if (state === 'collapsed') {\n ctx.setActiveTab(side, tabId)\n toggleSidebar()\n } else if (tabId === activeTabId) {\n toggleSidebar()\n } else {\n ctx.setActiveTab(side, tabId)\n }\n }\n\n return (\n <SidebarHeader>\n <div className=\"flex w-full items-center gap-0.5 rounded-md bg-muted p-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon\n const isActive = tab.id === activeTabId\n const badge = tab.badge\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={cn(\n 'flex flex-1 items-center justify-center rounded-sm p-1.5 transition-colors cursor-pointer group/button',\n isActive\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground',\n badge && 'pt-1',\n )}\n onClick={() => handleTabClick(tab.id)}\n >\n <Icon className=\"size-4\" />\n {badge && (\n <Badge\n size=\"xs\"\n variant={badge.variant}\n className={cn(\n 'ml-0.5 h-3.25 mb-1.25 px-1.5 group-hover/button:opacity-100 opacity-70 transition-opacity',\n isActive && 'opacity-100',\n badge.className,\n )}\n >\n {badge.label}\n </Badge>\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{tab.label}</TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n </SidebarHeader>\n )\n}\n\nfunction VerticalTabBar({\n side,\n tabs,\n activeTabId,\n}: Readonly<{\n side: SidebarSide\n tabs: SidebarTabDefinition[]\n activeTabId: string | null\n}>) {\n const ctx = React.useContext(SidebarTabsContext)!\n const { state, toggleSidebar } = useSidebar(side)\n const isCollapsed = state === 'collapsed'\n\n if (tabs.length === 0) {\n return null\n }\n\n const handleTabClick = (tabId: string) => {\n if (isCollapsed) {\n // Collapsed: expand and select the clicked tab\n ctx.setActiveTab(side, tabId)\n toggleSidebar()\n } else if (tabId === activeTabId) {\n // Expanded + clicking active tab: collapse\n toggleSidebar()\n } else {\n // Expanded + clicking different tab: just switch\n ctx.setActiveTab(side, tabId)\n }\n }\n\n return (\n <div className=\"flex flex-col gap-1 border-r border-sidebar-border p-1\" role=\"tablist\">\n {tabs.map((tab) => {\n const Icon = tab.icon\n const isActive = tab.id === activeTabId\n const badge = tab.badge\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={cn(\n 'size-9 flex items-center justify-center rounded-md transition-colors cursor-pointer group/button',\n isActive\n ? 'bg-sidebar-accent text-sidebar-accent-foreground'\n : 'text-muted-foreground hover:text-foreground hover:bg-sidebar-accent/50',\n )}\n onClick={() => handleTabClick(tab.id)}\n >\n <Icon className=\"size-4\" />\n {badge && (\n <Badge\n size=\"xs\"\n variant={badge.variant}\n className={cn(\n 'ml-0.5 h-3.25 mb-1.25 px-1.5 group-hover/button:opacity-100 opacity-70 transition-opacity',\n isActive && 'opacity-100',\n badge.className,\n )}\n >\n {badge.label}\n </Badge>\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side={side === 'left' ? 'right' : 'left'} hidden={state === 'expanded'}>\n {tab.label}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </div>\n )\n}\n","import { ChevronDownIcon, ChevronRightIcon, 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, testId } from '../lib/utils'\n\n/**\n * Unified filter option type for slicer - supports both flat and hierarchical structures.\n * For hierarchy mode, items can have nested children forming a tree structure.\n */\nexport type SlicerFilterOption<T extends Key = string> = {\n value: T\n label: string\n /** Whether this option has matches in current cross-filter state. Defaults to true. */\n hasMatches?: boolean\n /** Child options for hierarchy mode. Presence of children on any item indicates hierarchy. */\n children?: SlicerFilterOption<T>[]\n}\n\n/**\n * Collects all descendant values from a hierarchy option.\n */\nexport function getAllDescendantValues<T extends Key>(option: SlicerFilterOption<T>): T[] {\n const values: T[] = []\n if (option.children) {\n for (const child of option.children) {\n values.push(child.value, ...getAllDescendantValues(child))\n }\n }\n return values\n}\n\n/**\n * Checks if an option or any of its descendants contain the search term.\n */\nexport function matchesSearch<T extends Key>(option: SlicerFilterOption<T>, searchTerm: string): boolean {\n const term = searchTerm.toLowerCase()\n if (option.label.toLowerCase().includes(term)) {\n return true\n }\n if (option.children) {\n return option.children.some((child) => matchesSearch(child, term))\n }\n return false\n}\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 isHierarchy,\n __e2e_test_id__,\n}: Readonly<{\n /** Filter options - can be flat or hierarchical (with children). */\n filterValues: SlicerFilterOption<T>[]\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 /** Explicitly enable hierarchy mode. If not set, auto-detects based on presence of children in filterValues. */\n isHierarchy?: boolean\n __e2e_test_id__?: string\n}>) {\n // Auto-detect hierarchy mode if not explicitly set\n const isHierarchyMode = isHierarchy ?? filterValues.some((opt) => opt.children && opt.children.length > 0)\n\n // Expanded state for hierarchy mode\n const [expandedIds, setExpandedIds] = useState<Set<T>>(() => {\n // Auto-expand single top-level item\n const firstOption = filterValues[0]\n if (filterValues.length === 1 && firstOption?.children?.length) {\n return new Set([firstOption.value])\n }\n return new Set()\n })\n\n const toggleExpand = useCallback((value: T) => {\n setExpandedIds((prev) => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n next.add(value)\n }\n return next\n })\n }, [])\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 option toggle (used by both flat and hierarchy modes)\n const handleOptionToggle = useCallback(\n (optionValue: T) => {\n const newSelected = new Set(selectedValues)\n if (newSelected.has(optionValue)) {\n newSelected.delete(optionValue)\n } else {\n newSelected.add(optionValue)\n }\n onChange(Array.from(newSelected))\n },\n [selectedValues, onChange],\n )\n\n return (\n <Card\n className={cn('flex flex-col overflow-hidden w-56 rounded shadow-sm shrink-0', className)}\n data-test-id={__e2e_test_id__}\n >\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 data-test-id={testId(__e2e_test_id__, 'search')}\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 data-test-id={testId(__e2e_test_id__, 'collapse')}\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 data-test-id={testId(__e2e_test_id__, 'clear')}\n >\n <FilterX />\n </Button>\n </CardHeader>\n {!isCollapsed && (\n <CardContent className=\"p-1 flex flex-col\">\n {/* Select all button - hidden for hierarchy mode because \"select all\" is ambiguous:\n would it select all items at every level, only top-level items (implicitly selecting\n everything underneath), only visible/expanded items, or only leaf nodes? Each\n interpretation has different filtering effects, so we omit it to avoid confusion. */}\n {!isHierarchyMode && (\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 data-test-id={testId(__e2e_test_id__, 'select-all')}\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\n <div\n className={cn('px-2 py-1 h-(--optionsHeight) shrink-0 overflow-auto', isHierarchyMode && 'px-1')}\n style={{ '--optionsHeight': `${optionsHeight}px` } as React.CSSProperties}\n >\n <SlicerOptions\n isLoading={isLoading}\n isHierarchyMode={isHierarchyMode}\n filterValues={filterValues}\n filteredOptions={filteredOptions}\n selectedValues={selectedValues}\n expandedIds={expandedIds}\n onToggleExpand={toggleExpand}\n onOptionToggle={handleOptionToggle}\n searchQuery={searchQuery}\n />\n </div>\n </CardContent>\n )}\n </Card>\n )\n}\n\nconst SlicerOptions = <T extends Key>({\n isLoading,\n isHierarchyMode,\n filterValues,\n filteredOptions,\n selectedValues,\n expandedIds,\n onToggleExpand,\n onOptionToggle,\n searchQuery,\n}: {\n isLoading: boolean\n isHierarchyMode: boolean\n filterValues: SlicerFilterOption<T>[]\n filteredOptions: SlicerFilterOption<T>[]\n selectedValues: Set<T>\n expandedIds: Set<T>\n onToggleExpand: (value: T) => void\n onOptionToggle: (value: T) => void\n searchQuery: string\n}) => {\n if (isLoading) {\n return (\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\n if (filterValues.length === 0) {\n return <div className=\"flex size-full items-center justify-center text-sm\">No options available</div>\n }\n\n // Hierarchy mode handles its own filtering via matchesSearch in SlicerHierarchyItem\n if (isHierarchyMode) {\n return filterValues.map((option) => (\n <SlicerHierarchyItem\n key={option.value}\n option={option}\n selectedValues={selectedValues}\n inheritedSelected={false}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onOptionToggle}\n searchTerm={searchQuery}\n />\n ))\n }\n\n // Flat mode - check if search filtered out all options\n if (filteredOptions.length === 0) {\n return <div className=\"flex size-full items-center justify-center text-sm\">No results found</div>\n }\n\n return filteredOptions.map((option) => (\n <SlicerItem\n key={option.value}\n option={option}\n isSelected={selectedValues.has(option.value)}\n onToggle={onOptionToggle}\n />\n ))\n}\n\nconst SlicerItem = <T extends Key>({\n option,\n isSelected,\n onToggle,\n}: {\n option: SlicerFilterOption<T>\n isSelected: boolean\n onToggle: (value: T) => void\n}) => {\n const hasMatches = option.hasMatches ?? true\n return (\n <Checkbox\n key={option.value}\n checked={isSelected}\n onChange={() => onToggle(option.value)}\n checkIcon=\"check\"\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !hasMatches && 'opacity-50',\n (option.value === '' || option.value == null) && 'italic',\n )}\n label={option.label}\n />\n )\n}\n\n/**\n * Hierarchy item component for slicer - renders a single item in the hierarchy tree.\n * Can also be used directly for hierarchy filters in other components like TableFilter.\n */\nexport const SlicerHierarchyItem = <T extends Key>({\n option,\n selectedValues,\n inheritedSelected,\n expandedIds,\n onToggleExpand,\n onSelect,\n depth = 0,\n searchTerm = '',\n}: {\n option: SlicerFilterOption<T>\n selectedValues: Set<T>\n inheritedSelected: boolean\n expandedIds: Set<T>\n onToggleExpand: (value: T) => void\n onSelect: (value: T) => void\n depth?: number\n searchTerm?: string\n}) => {\n const hasChildren = option.children && option.children.length > 0\n const isExpanded = expandedIds.has(option.value)\n const isDirectlySelected = selectedValues.has(option.value)\n const isSelected = isDirectlySelected || inheritedSelected\n const hasMatches = option.hasMatches ?? true\n\n // Check if any descendants are selected (for partial state)\n const hasSelectedDescendants = useMemo(() => {\n if (!hasChildren) {\n return false\n }\n const descendantValues = getAllDescendantValues(option)\n return descendantValues.some((val) => selectedValues.has(val))\n }, [option, selectedValues, hasChildren])\n\n // Display states: check (directly selected), minus (inherited from parent), square (some descendants selected)\n const isPartiallySelected = !isDirectlySelected && hasSelectedDescendants && !inheritedSelected\n\n // When searching, auto-expand if descendants match\n const matchesSelf = searchTerm && option.label.toLowerCase().includes(searchTerm.toLowerCase())\n const childrenMatchSearch = searchTerm && hasChildren && option.children!.some((c) => matchesSearch(c, searchTerm))\n\n // Don't render if searching and neither self nor descendants match\n if (searchTerm && !matchesSelf && !childrenMatchSearch) {\n return null\n }\n\n const shouldShowExpanded = isExpanded || (searchTerm !== '' && childrenMatchSearch)\n\n return (\n <>\n <div className=\"flex items-center\" style={{ paddingLeft: `${depth * 12}px` }}>\n {/* Expand/Collapse button */}\n {hasChildren ? (\n <Button onClick={() => onToggleExpand(option.value)} variant=\"extraGhost\" size=\"iconXs\" className=\"size-4\">\n {shouldShowExpanded ? <ChevronDownIcon className=\"size-3.5\" /> : <ChevronRightIcon className=\"size-3.5\" />}\n </Button>\n ) : (\n <span className=\"size-4 shrink-0\" />\n )}\n\n {/* Checkbox with label */}\n <Checkbox\n checked={isSelected || isPartiallySelected}\n onChange={() => onSelect(option.value)}\n iconStyle={isPartiallySelected || !isDirectlySelected ? 'solo' : 'default'}\n checkIcon={isPartiallySelected ? 'square' : !isDirectlySelected ? 'minus' : 'check'}\n checkboxSize=\"sm\"\n className={cn(\n 'whitespace-nowrap py-px text-sm',\n !hasMatches && 'opacity-50',\n inheritedSelected && !isDirectlySelected && '[&_svg]:opacity-50',\n )}\n label={option.label}\n />\n </div>\n\n {/* Render children if expanded */}\n {hasChildren && shouldShowExpanded && (\n <>\n {option.children!.map((child) => (\n <SlicerHierarchyItem\n key={child.value}\n option={child}\n selectedValues={selectedValues}\n inheritedSelected={isSelected}\n expandedIds={expandedIds}\n onToggleExpand={onToggleExpand}\n onSelect={onSelect}\n depth={depth + 1}\n searchTerm={searchTerm}\n />\n ))}\n </>\n )}\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 React from 'react'\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nexport { useIsomorphicLayoutEffect }\n","import * as React from 'react'\n\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect'\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props)\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props\n })\n\n return ref\n}\n\nexport { useAsRef }\n","import * as React from 'react'\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null)\n\n if (ref.current === null) {\n ref.current = fn()\n }\n\n return ref as React.RefObject<T>\n}\n\nexport { useLazyRef }\n","import { useDirection } from '@radix-ui/react-direction'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { Check } from 'lucide-react'\nimport * as React from 'react'\n\nimport { useAsRef } from '../hooks/use-as-ref'\nimport { useIsomorphicLayoutEffect } from '../hooks/use-isomorphic-layout-effect'\nimport { useLazyRef } from '../hooks/use-lazy-ref'\nimport { useComposedRefs } from '../lib/compose-refs'\nimport { cn } from '../lib/utils'\n\nconst ROOT_NAME = 'Stepper'\nconst LIST_NAME = 'StepperList'\nconst ITEM_NAME = 'StepperItem'\nconst TRIGGER_NAME = 'StepperTrigger'\nconst INDICATOR_NAME = 'StepperIndicator'\nconst SEPARATOR_NAME = 'StepperSeparator'\nconst TITLE_NAME = 'StepperTitle'\nconst DESCRIPTION_NAME = 'StepperDescription'\nconst CONTENT_NAME = 'StepperContent'\nconst PREV_NAME = 'StepperPrev'\nconst NEXT_NAME = 'StepperNext'\n\nconst ENTRY_FOCUS = 'stepperFocusGroup.onEntryFocus'\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true }\nconst ARROW_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']\n\ntype Direction = 'ltr' | 'rtl'\ntype Orientation = 'horizontal' | 'vertical'\ntype NavigationDirection = 'next' | 'prev'\ntype ActivationMode = 'automatic' | 'manual'\ntype DataState = 'inactive' | 'active' | 'completed'\n\ntype DivProps = {\n asChild?: boolean\n} & React.ComponentProps<'div'>\ntype ButtonProps = {\n asChild?: boolean\n} & React.ComponentProps<'button'>\n\ntype ListElement = React.ComponentRef<typeof StepperList>\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>\n\nfunction getId(id: string, variant: 'trigger' | 'content' | 'title' | 'description', value: string) {\n return `${id}-${variant}-${value}`\n}\n\ntype FocusIntent = 'first' | 'last' | 'prev' | 'next'\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: 'prev',\n ArrowUp: 'prev',\n ArrowRight: 'next',\n ArrowDown: 'next',\n PageUp: 'first',\n Home: 'first',\n PageDown: 'last',\n End: 'last',\n}\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== 'rtl') {\n return key\n }\n return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key\n}\n\nfunction getFocusIntent(event: React.KeyboardEvent<TriggerElement>, dir?: Direction, orientation?: Orientation) {\n const key = getDirectionAwareKey(event.key, dir)\n if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key)) {\n return undefined\n }\n if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key)) {\n return undefined\n }\n return MAP_KEY_TO_FOCUS_INTENT[key]\n}\n\nfunction focusFirst(candidates: React.RefObject<TriggerElement | null>[], preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current\n if (!candidate) {\n continue\n }\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) {\n return\n }\n candidate.focus({ preventScroll })\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) {\n return\n }\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>((_, index) => array[(startIndex + index) % array.length] as T)\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: 'item' | 'separator' = 'item',\n): DataState {\n const stepKeys = Array.from(steps.keys())\n const currentIndex = stepKeys.indexOf(itemValue)\n\n if (stepState?.completed) {\n return 'completed'\n }\n\n if (value === itemValue) {\n return variant === 'separator' ? 'inactive' : 'active'\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value)\n\n if (activeIndex > currentIndex) {\n return 'completed'\n }\n }\n\n return 'inactive'\n}\n\ntype StepState = {\n value: string\n completed: boolean\n disabled: boolean\n}\n\ntype StoreState = {\n steps: Map<string, StepState>\n value: string\n}\n\ntype Store = {\n subscribe: (callback: () => void) => () => void\n getState: () => StoreState\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void\n setStateWithValidation: (value: string, direction: NavigationDirection) => Promise<boolean>\n hasValidation: () => boolean\n notify: () => void\n addStep: (value: string, completed: boolean, disabled: boolean) => void\n removeStep: (value: string) => void\n setStep: (value: string, completed: boolean, disabled: boolean) => void\n}\n\nconst StoreContext = React.createContext<Store | null>(null)\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext('useStore')\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector])\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot)\n}\n\ntype ItemData = {\n id: string\n ref: React.RefObject<TriggerElement | null>\n value: string\n active: boolean\n disabled: boolean\n}\n\ntype StepperContextValue = {\n rootId: string\n dir: Direction\n orientation: Orientation\n activationMode: ActivationMode\n disabled: boolean\n nonInteractive: boolean\n loop: boolean\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null)\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``)\n }\n return context\n}\n\ntype StepperProps = {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n onValueComplete?: (value: string, completed: boolean) => void\n onValueAdd?: (value: string) => void\n onValueRemove?: (value: string) => void\n onValidate?: (value: string, direction: NavigationDirection) => boolean | Promise<boolean>\n activationMode?: ActivationMode\n dir?: Direction\n orientation?: Orientation\n disabled?: boolean\n loop?: boolean\n nonInteractive?: boolean\n} & DivProps\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = 'horizontal',\n activationMode = 'automatic',\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props\n\n const listenersRef = useLazyRef(() => new Set<() => void>())\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? '',\n }))\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n })\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb)\n return () => listenersRef.current.delete(cb)\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) {\n return\n }\n\n if (key === 'value' && typeof value === 'string') {\n stateRef.current.value = value\n propsRef.current.onValueChange?.(value)\n } else {\n stateRef.current[key] = value\n }\n\n store.notify()\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState('value', value)\n return true\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction)\n if (isValid) {\n store.setState('value', value)\n }\n return isValid\n } catch {\n return false\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled }\n stateRef.current.steps.set(value, newStep)\n propsRef.current.onValueAdd?.(value)\n store.notify()\n },\n removeStep: (value) => {\n stateRef.current.steps.delete(value)\n propsRef.current.onValueRemove?.(value)\n store.notify()\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value)\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled }\n stateRef.current.steps.set(value, updatedStep)\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed)\n }\n\n store.notify()\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb()\n }\n },\n }\n }, [listenersRef, stateRef, propsRef])\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState('value', value)\n }\n }, [value])\n\n const dir = useDirection(dirProp)\n\n const instanceId = React.useId()\n const rootId = id ?? instanceId\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n )\n\n const RootPrimitive = asChild ? Slot : 'div'\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? '' : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn('flex gap-6', orientation === 'horizontal' ? 'w-full flex-col' : 'flex-row', className)}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n )\n}\n\ntype FocusContextValue = {\n tabStopId: string | null\n onItemFocus: (tabStopId: string) => void\n onItemShiftTab: () => void\n onFocusableItemAdd: () => void\n onFocusableItemRemove: () => void\n onItemRegister: (item: ItemData) => void\n onItemUnregister: (id: string) => void\n getItems: () => ItemData[]\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null)\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`FocusProvider\\``)\n }\n return context\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props\n\n const context = useStepperContext(LIST_NAME)\n const orientation = context.orientation\n const currentValue = useStore((state) => state.value)\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n })\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null)\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false)\n const [focusableItemCount, setFocusableItemCount] = React.useState(0)\n const isClickFocusRef = React.useRef(false)\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map())\n const listRef = React.useRef<ListElement>(null)\n const composedRef = useComposedRefs(ref, listRef)\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId)\n }, [])\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true)\n }, [])\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1)\n }, [])\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1)\n }, [])\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item)\n }, [])\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id)\n }, [])\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current\n const elementB = b.ref.current\n if (!elementA || !elementB) {\n return 0\n }\n const position = elementA.compareDocumentPosition(elementB)\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1\n }\n return 0\n })\n }, [])\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n setIsTabbingBackOut(false)\n },\n [propsRef],\n )\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n const isKeyboardFocus = !isClickFocusRef.current\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS)\n event.currentTarget.dispatchEvent(entryFocusEvent)\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter((item) => !item.disabled)\n const selectedItem = currentValue ? items.find((item) => item.value === currentValue) : undefined\n const activeItem = items.find((item) => item.active)\n const currentItem = items.find((item) => item.id === tabStopId)\n\n const candidateItems = [selectedItem, activeItem, currentItem, ...items].filter(Boolean) as ItemData[]\n const candidateRefs = candidateItems.map((item) => item.ref)\n focusFirst(candidateRefs, false)\n }\n }\n isClickFocusRef.current = false\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n isClickFocusRef.current = true\n },\n [propsRef],\n )\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n )\n\n const ListPrimitive = asChild ? Slot : 'div'\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n 'flex outline-none',\n orientation === 'horizontal' ? 'flex-row items-center' : 'flex-col items-start',\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n )\n}\n\ntype StepperItemContextValue = {\n value: string\n stepState: StepState | undefined\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(null)\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext)\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``)\n }\n return context\n}\n\ntype StepperItemProps = {\n value: string\n completed?: boolean\n disabled?: boolean\n} & DivProps\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props\n\n const context = useStepperContext(ITEM_NAME)\n const store = useStoreContext(ITEM_NAME)\n const orientation = context.orientation\n const value = useStore((state) => state.value)\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled)\n\n return () => {\n store.removeStep(itemValue)\n }\n }, [itemValue, completed, disabled])\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled)\n }, [itemValue, completed, disabled])\n\n const stepState = useStore((state) => state.steps.get(itemValue))\n const steps = useStore((state) => state.steps)\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n )\n\n const ItemPrimitive = asChild ? Slot : 'div'\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? '' : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n 'relative flex not-last:flex-1 items-center',\n orientation === 'horizontal' ? 'flex-row' : 'flex-col',\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n )\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props\n\n const context = useStepperContext(TRIGGER_NAME)\n const itemContext = useStepperItemContext(TRIGGER_NAME)\n const itemValue = itemContext.value\n\n const store = useStoreContext(TRIGGER_NAME)\n const focusContext = useFocusContext(TRIGGER_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n const stepState = useStore((state) => state.steps.get(itemValue))\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n })\n\n const activationMode = context.activationMode\n const orientation = context.orientation\n const loop = context.loop\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue)\n\n const stepPosition = stepIndex + 1\n const stepCount = steps.size\n\n const triggerId = getId(context.rootId, 'trigger', itemValue)\n const contentId = getId(context.rootId, 'content', itemValue)\n const titleId = getId(context.rootId, 'title', itemValue)\n const descriptionId = getId(context.rootId, 'description', itemValue)\n\n const isDisabled = disabled || stepState?.disabled || context.disabled\n const isActive = value === itemValue\n const isTabStop = focusContext.tabStopId === triggerId\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const triggerRef = React.useRef<TriggerElement>(null)\n const composedRef = useComposedRefs(ref, triggerRef)\n const isArrowKeyPressedRef = React.useRef(false)\n const isMouseClickRef = React.useRef(false)\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false\n }\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('keyup', onKeyUp)\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('keyup', onKeyUp)\n }\n }, [])\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n })\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd()\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId)\n if (!isDisabled) {\n focusContext.onFocusableItemRemove()\n }\n }\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled])\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue)\n const direction = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n await store.setStateWithValidation(itemValue, direction)\n }\n },\n [isDisabled, context.nonInteractive, store, itemValue, value, steps, propsRef],\n )\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n focusContext.onItemFocus(triggerId)\n\n const isKeyboardFocus = !isMouseClickRef.current\n\n if (!isActive && !isDisabled && activationMode !== 'manual' && !context.nonInteractive && isKeyboardFocus) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue)\n const direction = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n await store.setStateWithValidation(itemValue, direction)\n }\n\n isMouseClickRef.current = false\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n )\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n if (event.key === 'Enter' && context.nonInteractive) {\n event.preventDefault()\n return\n }\n\n if ((event.key === 'Enter' || event.key === ' ') && activationMode === 'manual' && !context.nonInteractive) {\n event.preventDefault()\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click()\n }\n return\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n focusContext.onItemShiftTab()\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n const focusIntent = getFocusIntent(event, context.dir, orientation)\n\n if (focusIntent !== undefined) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {\n return\n }\n event.preventDefault()\n\n const items = focusContext.getItems().filter((item) => !item.disabled)\n let candidateRefs = items.map((item) => item.ref)\n\n if (focusIntent === 'last') {\n candidateRefs.reverse()\n } else if (focusIntent === 'prev' || focusIntent === 'next') {\n if (focusIntent === 'prev') {\n candidateRefs.reverse()\n }\n const currentIndex = candidateRefs.findIndex((ref) => ref.current === event.currentTarget)\n candidateRefs = loop ? wrapArray(candidateRefs, currentIndex + 1) : candidateRefs.slice(currentIndex + 1)\n }\n\n if (store.hasValidation() && candidateRefs.length > 0) {\n const nextRef = candidateRefs[0]\n const nextElement = nextRef?.current\n const nextItem = items.find((item) => item.ref.current === nextElement)\n\n if (nextItem && nextItem.value !== itemValue) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || '')\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value)\n const direction: NavigationDirection = targetStepIndex > currentStepIndex ? 'next' : 'prev'\n\n if (direction === 'next') {\n const isValid = await store.setStateWithValidation(nextItem.value, direction)\n if (!isValid) {\n return\n }\n } else {\n store.setState('value', nextItem.value)\n }\n\n queueMicrotask(() => nextElement?.focus())\n return\n }\n }\n\n queueMicrotask(() => focusFirst(candidateRefs))\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n )\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event)\n if (event.defaultPrevented) {\n return\n }\n\n isMouseClickRef.current = true\n\n if (isDisabled) {\n event.preventDefault()\n } else {\n focusContext.onItemFocus(triggerId)\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n )\n\n const TriggerPrimitive = asChild ? Slot : 'button'\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? 'step' : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? '' : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n 'not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full',\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n )\n}\n\ntype StepperIndicatorProps = {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode)\n} & Omit<DivProps, 'children'>\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props\n\n const context = useStepperContext(INDICATOR_NAME)\n const itemContext = useStepperItemContext(INDICATOR_NAME)\n\n const value = useStore((state) => state.value)\n const itemValue = itemContext.value\n const stepState = useStore((state) => state.steps.get(itemValue))\n const steps = useStore((state) => state.steps)\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1\n\n const dataState = getDataState(value, itemValue, stepState, steps)\n\n const IndicatorPrimitive = asChild ? Slot : 'div'\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n 'flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground',\n className,\n )}\n >\n {typeof children === 'function' ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === 'completed' ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n )\n}\n\ntype StepperSeparatorProps = {\n forceMount?: boolean\n} & DivProps\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const { className, asChild, forceMount = false, ref, ...separatorProps } = props\n\n const context = useStepperContext(SEPARATOR_NAME)\n const itemContext = useStepperItemContext(SEPARATOR_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const orientation = context.orientation\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value)\n\n const isLastStep = stepIndex === steps.size - 1\n\n if (isLastStep && !forceMount) {\n return null\n }\n\n const dataState = getDataState(value, itemContext.value, itemContext.stepState, steps, 'separator')\n\n const SeparatorPrimitive = asChild ? Slot : 'div'\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n 'bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary',\n orientation === 'horizontal' ? 'h-px flex-1' : 'h-10 w-px',\n className,\n )}\n />\n )\n}\n\ntype StepperTitleProps = {\n asChild?: boolean\n} & React.ComponentProps<'span'>\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props\n\n const context = useStepperContext(TITLE_NAME)\n const itemContext = useStepperItemContext(TITLE_NAME)\n\n const titleId = getId(context.rootId, 'title', itemContext.value)\n\n const TitlePrimitive = asChild ? Slot : 'span'\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn('font-medium text-sm', className)}\n />\n )\n}\n\ntype StepperDescriptionProps = {\n asChild?: boolean\n} & React.ComponentProps<'span'>\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props\n\n const context = useStepperContext(DESCRIPTION_NAME)\n const itemContext = useStepperItemContext(DESCRIPTION_NAME)\n\n const descriptionId = getId(context.rootId, 'description', itemContext.value)\n\n const DescriptionPrimitive = asChild ? Slot : 'span'\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn('text-muted-foreground text-xs', className)}\n />\n )\n}\n\ntype StepperContentProps = {\n value: string\n forceMount?: boolean\n} & DivProps\n\nfunction StepperContent(props: StepperContentProps) {\n const { value: valueProp, asChild, forceMount = false, ref, className, ...contentProps } = props\n\n const context = useStepperContext(CONTENT_NAME)\n const value = useStore((state) => state.value)\n\n const contentId = getId(context.rootId, 'content', valueProp)\n const triggerId = getId(context.rootId, 'trigger', valueProp)\n\n if (valueProp !== value && !forceMount) {\n return null\n }\n\n const ContentPrimitive = asChild ? Slot : 'div'\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn('flex-1 outline-none', className)}\n />\n )\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props\n\n const store = useStoreContext(PREV_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n })\n\n const stepKeys = Array.from(steps.keys())\n const currentIndex = value ? stepKeys.indexOf(value) : -1\n const isDisabled = disabled || currentIndex <= 0\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented || isDisabled) {\n return\n }\n\n const prevIndex = Math.max(currentIndex - 1, 0)\n const prevStepValue = stepKeys[prevIndex]\n\n if (prevStepValue) {\n store.setState('value', prevStepValue)\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n )\n\n const PrevPrimitive = asChild ? Slot : 'button'\n\n return <PrevPrimitive type=\"button\" data-slot=\"stepper-prev\" disabled={isDisabled} {...prevProps} onClick={onClick} />\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props\n\n const store = useStoreContext(NEXT_NAME)\n const value = useStore((state) => state.value)\n const steps = useStore((state) => state.steps)\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n })\n\n const stepKeys = Array.from(steps.keys())\n const currentIndex = value ? stepKeys.indexOf(value) : -1\n const isDisabled = disabled || currentIndex >= stepKeys.length - 1\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event)\n if (event.defaultPrevented || isDisabled) {\n return\n }\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1)\n const nextStepValue = stepKeys[nextIndex]\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, 'next')\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n )\n\n const NextPrimitive = asChild ? Slot : 'button'\n\n return <NextPrimitive type=\"button\" data-slot=\"stepper-next\" disabled={isDisabled} {...nextProps} onClick={onClick} />\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n}\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 { useCallback, useEffect, useState } from 'react'\n\nimport { Textarea } from '..'\n\ntype TextareaProps = React.ComponentProps<typeof Textarea>\n\nexport type DeferredTextareaProps = Omit<TextareaProps, 'value' | 'onChange'> & {\n /**\n * The current value (controlled from parent)\n */\n value: string\n /**\n * Called when the user commits the value (on blur)\n * Only fires if the value has actually changed\n */\n onCommit: (value: string) => void\n /**\n * Optional: also expose onChange for cases where you need to track typing\n */\n onValueChange?: (value: string) => void\n}\n\n/**\n * A Textarea that buffers changes locally and only commits to the parent\n * on blur. Useful for forms where you don't want to trigger expensive\n * operations (like API calls) on every keystroke.\n */\nexport function DeferredTextarea({ value, onCommit, onValueChange, onBlur, ...props }: DeferredTextareaProps) {\n const [localValue, setLocalValue] = useState(value)\n\n // Sync with external value changes\n useEffect(() => {\n setLocalValue(value)\n }, [value])\n\n const commitValue = useCallback(() => {\n if (localValue !== value) {\n onCommit(localValue)\n }\n }, [localValue, value, onCommit])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n onValueChange?.(newValue)\n },\n [onValueChange],\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n commitValue()\n onBlur?.(e)\n },\n [commitValue, onBlur],\n )\n\n return <Textarea {...props} value={localValue} onChange={handleChange} onBlur={handleBlur} />\n}\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","import { MinusIcon, PlusIcon } from 'lucide-react'\nimport * as React from 'react'\nimport { CSSProperties } from 'react'\n\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../accordion/accordion'\nimport { cn } from '../lib/utils'\n\nexport type TreeNode = {\n id: string\n name: string\n type: 'node' | 'group'\n children?: TreeNode[]\n className?: string\n icon?: React.ReactNode\n trailing?: React.ReactNode\n}\n\ntype Callbacks = {\n onNodeSelect?: (node: TreeNode) => void\n onGroupSelect?: (node: TreeNode) => void\n onToggleGroup?: ({ isExpanded, node }: { isExpanded: boolean; node: TreeNode }) => void\n}\n\nexport type TreeViewProps = Callbacks & {\n data: TreeNode[]\n className?: string\n defaultExpandedIds?: string[]\n selectedId?: string | undefined\n}\n\ntype TreeBranchProps = Callbacks & {\n node: TreeNode\n level: number\n isLast?: boolean\n parentIsLast?: boolean[]\n defaultExpandedIds?: string[]\n selectedId?: string | undefined\n}\n\nconst TreeBranch = ({\n node,\n level,\n onNodeSelect,\n onGroupSelect,\n onToggleGroup,\n isLast = false,\n parentIsLast = [],\n defaultExpandedIds = [],\n selectedId,\n}: TreeBranchProps) => {\n const isGroup = node.type === 'group'\n const hasChildren = node.children && node.children.length > 0\n\n if (!isGroup) {\n // render node\n return (\n <div\n data-test-id={`tree-node-${node.id}`}\n className={cn(\n 'relative flex items-center gap-2 py-1.5 px-2 rounded-md cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors border border-transparent hover:border hover:border-(--discreet-border)',\n node.className,\n {\n 'bg-primary text-primary-foreground hover:border hover:border-(--discreet-border)': selectedId === node.id,\n },\n )}\n style={{ marginLeft: `${level * 24}px` }}\n onClick={() => onNodeSelect?.(node)}\n >\n {node.icon}\n <span className=\"text-sm select-none truncate\">{node.name}</span>\n {node.trailing}\n </div>\n )\n }\n\n return (\n <AccordionItem value={node.id} className=\"border-0\" data-test-id={`tree-group-${node.id}`}>\n <AccordionTrigger\n style={{ '--margin-left': `calc(${level * 24 + 16}px - 16px)` } as CSSProperties}\n className={cn(\n 'flex flex-1 overflow-hidden items-center gap-2 py-1.5 px-2 rounded-md ml-(--margin-left) hover:bg-accent hover:text-accent-foreground hover:no-underline transition-colors border border-transparent hover:border hover:border-(--discreet-border)',\n '[&>svg:last-child]:hidden', // Hide default accordion chevron\n node.className,\n {\n 'bg-primary text-primary-foreground': selectedId === node.id,\n },\n )}\n >\n <PlusIcon\n data-test-id={`tree-expand-${node.id}`}\n className=\"size-4 shrink-0 hidden [[data-state=closed]>&]:block hover:border rounded\"\n onClick={() => {\n onToggleGroup?.({ isExpanded: true, node })\n }}\n />\n <MinusIcon\n data-test-id={`tree-collapse-${node.id}`}\n className=\"size-4 shrink-0 hidden [[data-state=open]>&]:block hover:border rounded\"\n onClick={() => {\n onToggleGroup?.({ isExpanded: false, node })\n }}\n />\n\n <div\n data-test-id={`tree-group-label-${node.id}`}\n className=\"flex w-[calc(100%-16px)] gap-2\" // without the plus/minus icons\n onClick={(e) => {\n e.stopPropagation()\n onGroupSelect?.(node)\n }}\n >\n {node.icon}\n <span className=\"text-sm select-none truncate text-left\">{node.name}</span>\n {node.trailing}\n </div>\n </AccordionTrigger>\n\n {hasChildren && (\n <AccordionContent className=\"pb-0 pt-0 relative\">\n <div\n style={{ '--left-offset': `calc(${level * 24 + 32}px - 16px)` } as CSSProperties}\n className=\"before:absolute before:top-0 before:start-(--left-offset) before:w-0.5 before:-ms-px before:h-full before:bg-sidebar-ring dark:before:bg-sidebar-ring\"\n />\n <Accordion type=\"multiple\" value={defaultExpandedIds}>\n {node.children?.map((child, index) => (\n <TreeBranch\n key={child.id}\n node={child}\n level={level + 1}\n onNodeSelect={onNodeSelect}\n onGroupSelect={onGroupSelect}\n onToggleGroup={onToggleGroup}\n isLast={index === node.children!.length - 1}\n parentIsLast={[...parentIsLast, isLast]}\n defaultExpandedIds={defaultExpandedIds}\n selectedId={selectedId}\n />\n ))}\n </Accordion>\n </AccordionContent>\n )}\n </AccordionItem>\n )\n}\n\nexport const TreeView = React.forwardRef<HTMLDivElement, TreeViewProps>(\n ({ data, onNodeSelect, onGroupSelect, onToggleGroup, className, defaultExpandedIds = [], selectedId }, ref) => {\n return (\n <div ref={ref} className={cn('w-full select-none', className)}>\n <Accordion type=\"multiple\" value={defaultExpandedIds}>\n {data.map((node, index) => (\n <TreeBranch\n key={node.id}\n node={node}\n level={0}\n onNodeSelect={onNodeSelect}\n onGroupSelect={onGroupSelect}\n onToggleGroup={onToggleGroup}\n isLast={index === data.length - 1}\n parentIsLast={[]}\n defaultExpandedIds={defaultExpandedIds}\n selectedId={selectedId}\n />\n ))}\n </Accordion>\n </div>\n )\n },\n)\n\nTreeView.displayName = 'TreeView'\n\nexport { TreeBranch }\n"],"mappings":"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"}
|