@exxatdesignux/ui 0.5.6 → 0.5.7
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/CHANGELOG.md +7 -0
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/pagination.js +1 -1
- package/dist/components/data-table/pagination.js.map +1 -1
- package/dist/components/data-views/hub-table.js +1 -1
- package/dist/components/data-views/hub-table.js.map +1 -1
- package/dist/components/data-views/index.js +1 -1
- package/dist/components/data-views/index.js.map +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/banner.d.ts +3 -3
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/tabs.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/data-table/index.tsx +1 -1
- package/tokens/hooks-index.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/lib/raf-throttle.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/kbd.tsx","../../../src/hooks/use-mod-key-label.ts","../../../src/lib/editable-target.ts","../../../src/components/ui/checkbox.tsx","../../../src/components/ui/popover.tsx","../../../src/lib/table-properties-types.ts","../../../src/lib/conditional-rule-match.ts","../../../src/lib/date-filter.ts","../../../src/components/ui/calendar.tsx","../../../src/components/data-table/filter-date-calendar.tsx","../../../src/components/ui/input-group.tsx","../../../src/lib/compose-refs.ts","../../../src/components/ui/input-mask.tsx","../../../src/components/ui/date-picker-field.tsx","../../../src/components/data-table/filter-text-value-input.tsx","../../../src/components/data-table/use-table-state.ts","../../../src/components/data-table/index.tsx","../../../src/components/data-table/pagination.tsx"],"names":["DropdownMenuPrimitive","jsx","TooltipPrimitive","jsxs","React2","React3","Input","React4","cva","React5","Checkbox","CheckboxPrimitive","PopoverPrimitive","hit","className","props","React6","React7","React8","MaskedInput","hay","React10","SortChevron","Fragment","el","React11"],"mappings":"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","file":"pagination.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Default surface sizing for product dropdown menus (view settings, row ⋯, column menus, etc.).\n *\n * Uses **pure CSS** (`w-max` + `min-w-*` + `max-w-*`) so width follows labels and shortcuts\n * without **ResizeObserver** or layout thrash.\n *\n * Override when you need a fixed rail, for example:\n * - `className=\"w-20\"` — page-size picker in `DataTablePaginated`\n * - `className=\"w-(--radix-dropdown-menu-trigger-width) min-w-60\"` — account / identity menus\n * - `className=\"!w-max min-w-72 …\"` — very wide school/program switcher\n */\nexport const DROPDOWN_MENU_CONTENT_SURFACE_CLASS =\n \"min-w-52 w-max max-w-[min(24rem,calc(100vw-2rem))]\" as const\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n shortcut,\n children,\n asChild,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n /** Visual keyboard-shortcut hint shown on the right of the item (e.g. \"⌘E\", \"F2\").\n * Purely cosmetic — to actually bind the key, render a sibling `<Shortcut keys={…} onInvoke={…} />`\n * in a parent that stays mounted (menu items unmount when the menu closes). */\n shortcut?: string\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n asChild={asChild}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {shortcut ? <DropdownMenuShortcut>{shortcut}</DropdownMenuShortcut> : null}\n </>\n )}\n </DropdownMenuPrimitive.Item>\n )\n}\n\n/** Invisible component that binds a keyboard shortcut globally while mounted.\n * Pair with `DropdownMenuItem shortcut=\"⌘E\"` for the visual hint. */\nfunction Shortcut({\n keys,\n onInvoke,\n disabled,\n}: {\n keys: string\n onInvoke: (e: KeyboardEvent) => void\n disabled?: boolean\n}) {\n useShortcut(keys, onInvoke, disabled)\n return null\n}\n\nfunction useShortcut(\n keys: string,\n onInvoke: (e: KeyboardEvent) => void,\n disabled?: boolean,\n) {\n const ref = React.useRef(onInvoke)\n React.useEffect(() => { ref.current = onInvoke }, [onInvoke])\n React.useEffect(() => {\n if (disabled) return\n const parsed = parseShortcut(keys)\n if (!parsed) return\n function handler(e: KeyboardEvent) {\n if (!matchesShortcut(e, parsed!)) return\n const t = e.target as HTMLElement | null\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return\n // Skip when the user is activating an interactive control — Enter/Space on a\n // focused button, link, or role=button is already that control's native action.\n // Without this guard, a page-level `Shortcut keys=\"Enter\"` (e.g. the wizard's\n // \"submit on review\") races the button's own click: the Edit / Back / Cancel\n // button runs its handler AND the window listener submits the form on the same\n // keystroke — the classic \"review auto-closes when I click Edit\" bug.\n if (t && (parsed!.key === \"enter\" || parsed!.key === \" \")) {\n const role = t.getAttribute(\"role\")\n if (\n t.tagName === \"BUTTON\" ||\n t.tagName === \"A\" ||\n t.tagName === \"SELECT\" ||\n role === \"button\" ||\n role === \"link\" ||\n role === \"menuitem\" ||\n role === \"tab\" ||\n role === \"option\" ||\n role === \"checkbox\" ||\n role === \"radio\" ||\n role === \"switch\" ||\n t.closest('[role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]')\n )\n return\n }\n // If a Radix dialog/sheet/alert-dialog is open, only fire when the event\n // originates inside it — page-level shortcuts must NOT bleed through\n // an open dialog, but in-dialog `<Shortcut>` bindings (Export, Save)\n // still need to fire.\n const openDialog = document.querySelector('[role=\"dialog\"][data-state=\"open\"], [role=\"alertdialog\"][data-state=\"open\"]') as HTMLElement | null\n if (openDialog && (!t || !openDialog.contains(t))) return\n e.preventDefault()\n e.stopPropagation()\n ref.current(e)\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [keys, disabled])\n}\n\n/* --------------------------------------------------------------------------\n * Shortcut parsing + global binding\n * ------------------------------------------------------------------------ */\n\ntype ParsedShortcut = {\n meta: boolean\n ctrl: boolean\n shift: boolean\n alt: boolean\n key: string // normalized lowercase, or special like \"f2\", \"backspace\", \"delete\", \"enter\", \"escape\", \"arrowup\"…\n}\n\nfunction mapKey(raw: string): string {\n const p = raw.toLowerCase()\n if (raw === \"⌫\") return \"backspace\"\n if (raw === \"⌦\") return \"delete\"\n if (raw === \"⏎\" || p === \"enter\" || p === \"return\") return \"enter\"\n if (raw === \"␣\" || p === \"space\") return \" \"\n if (p === \"esc\" || p === \"escape\") return \"escape\"\n if (p === \"tab\") return \"tab\"\n if (p === \"up\" || raw === \"↑\") return \"arrowup\"\n if (p === \"down\" || raw === \"↓\") return \"arrowdown\"\n if (p === \"left\" || raw === \"←\") return \"arrowleft\"\n if (p === \"right\" || raw === \"→\") return \"arrowright\"\n return p\n}\n\nfunction parseShortcut(input: string): ParsedShortcut | null {\n let s = input.trim()\n if (!s) return null\n const out: ParsedShortcut = { meta: false, ctrl: false, shift: false, alt: false, key: \"\" }\n // Strip leading symbolic modifiers (⌘ ⌃ ⇧ ⌥) which may be glued to the key char.\n while (s.length) {\n const c = s[0]\n if (c === \"⌘\") { out.meta = true; s = s.slice(1) }\n else if (c === \"⌃\") { out.ctrl = true; s = s.slice(1) }\n else if (c === \"⇧\") { out.shift = true; s = s.slice(1) }\n else if (c === \"⌥\") { out.alt = true; s = s.slice(1) }\n else break\n }\n if (!s) return null\n // Word-style modifiers (Cmd+Shift+D, Alt P) joined by + or whitespace.\n if (/[+\\s]/.test(s)) {\n for (const raw of s.split(/[+\\s]+/).filter(Boolean)) {\n const p = raw.toLowerCase()\n if (raw === \"⌘\" || p === \"cmd\" || p === \"meta\" || p === \"command\") out.meta = true\n else if (raw === \"⌃\" || p === \"ctrl\" || p === \"control\") out.ctrl = true\n else if (raw === \"⇧\" || p === \"shift\") out.shift = true\n else if (raw === \"⌥\" || p === \"alt\" || p === \"opt\" || p === \"option\") out.alt = true\n else out.key = mapKey(raw)\n }\n } else {\n out.key = mapKey(s)\n }\n return out.key ? out : null\n}\n\nfunction matchesShortcut(e: KeyboardEvent, s: ParsedShortcut): boolean {\n if (e.metaKey !== s.meta) return false\n if (e.ctrlKey !== s.ctrl) return false\n if (e.altKey !== s.alt) return false\n if (e.shiftKey !== s.shift) return false\n return e.key.toLowerCase() === s.key\n}\n\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: 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}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n suppressHydrationWarning\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <i className=\"fa-light fa-chevron-right rtl:rotate-180 ms-auto\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\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 Shortcut,\n useShortcut,\n}\n\nexport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Coalesce many calls to `fn` into one per animation frame.\n *\n * Use for high-frequency layout-reading event handlers (scroll, resize,\n * visualViewport, ResizeObserver) where the work must happen in a frame but\n * doing it on every event call (60+/s for resize, hundreds/s for capture\n * scrolls) wastes layout/paint cycles. The returned function exposes\n * `.cancel()` so effect cleanup can drop a pending frame.\n *\n * Pattern:\n * const apply = () => { ...layout reads + setState... }\n * const scheduled = rafThrottle(apply)\n * window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n * return () => {\n * scheduled.cancel()\n * window.removeEventListener(\"scroll\", scheduled, { capture: true })\n * }\n */\nexport function rafThrottle<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n): ((...args: TArgs) => void) & { cancel: () => void } {\n let rafId = 0\n let lastArgs: TArgs | null = null\n\n const scheduled = ((...args: TArgs) => {\n lastArgs = args\n if (rafId !== 0) return\n rafId = requestAnimationFrame(() => {\n rafId = 0\n const a = lastArgs\n lastArgs = null\n if (a) fn(...a)\n })\n }) as ((...args: TArgs) => void) & { cancel: () => void }\n\n scheduled.cancel = () => {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId)\n rafId = 0\n }\n lastArgs = null\n }\n\n return scheduled\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n function Input({ className, type, ...props }, ref) {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n },\n)\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Kbd — display keyboard keys and shortcuts (shadcn/ui).\n * @see https://ui.shadcn.com/docs/components/radix/kbd\n *\n * Variants:\n * - \"tile\" (default) — filled tile with border; use in tooltips, menus, docs,\n * or any surface where the Kbd sits on neutral background.\n * - \"bare\" — no background, no border; inherits `currentColor` at 70% opacity.\n * Use **inside buttons** (primary/secondary workflow actions) so the hint\n * does not look like a pasted-on patch against the button fill.\n */\nfunction Kbd({\n className,\n variant = \"tile\",\n \"aria-hidden\": ariaHidden,\n ...props\n}: React.ComponentProps<\"kbd\"> & { variant?: \"tile\" | \"bare\" }) {\n // Bare variant lives inside buttons — the button already carries the\n // accessible name, so the inline kbd is redundant noise for screen readers.\n // Default to aria-hidden unless a consumer explicitly opts in.\n const hidden = ariaHidden ?? (variant === \"bare\" ? true : undefined)\n return (\n <kbd\n data-slot=\"kbd\"\n data-variant={variant}\n aria-hidden={hidden}\n className={cn(\n \"pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium\",\n variant === \"tile\" &&\n \"bg-muted text-muted-foreground rounded-sm border\",\n variant === \"bare\" && \"text-current/70 px-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","\"use client\"\n\nimport * as React from \"react\"\n\n/** \"⌘\" on Apple platforms, \"Ctrl\" elsewhere — for `Kbd` tooltips. */\nexport function useModKeyLabel() {\n const [mod, setMod] = React.useState(\"⌘\")\n React.useEffect(() => {\n setMod(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌘\"\n : \"Ctrl\",\n )\n }, [])\n return mod\n}\n\n/** \"⌥\" on Apple platforms, \"Alt\" elsewhere — pair with `useModKeyLabel` for ⌘⌥ / Ctrl+Alt chords. */\nexport function useAltKeyLabel() {\n const [alt, setAlt] = React.useState(\"⌥\")\n React.useEffect(() => {\n setAlt(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌥\"\n : \"Alt\",\n )\n }, [])\n return alt\n}\n","/**\n * True when focus is in a field where global shortcuts should not fire.\n *\n * Mirrors the same skip logic baked into Radix `useShortcut` so global\n * hotkey handlers (export ⌘⇧E, rename F2, etc.) don't steal keystrokes\n * that the user clearly intends for the input. Covers native form\n * fields and any element marked `contenteditable=\"true\"` (richtext\n * editors, comment composers).\n */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n return true\n return el.getAttribute?.(\"contenteditable\") === \"true\"\n}\n","\"use client\"\n\n/**\n * Checkbox — Radix control + Exxat styling.\n *\n * Aligned with Shadcn Studio checkbox guidance (see shadcnstudio.com/docs/components/checkbox):\n * • Tri-state: `checked={true | false | \"indeterminate\"}` (parent “select some” rows)\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg\n * • Motion: none | pop | glow | pop-glow — uses `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Forms: `aria-invalid` from Field, `disabled`, extended hit slop (`after:`)\n * • Pair with `CheckboxLabel` + `htmlFor` / `id` for 44px-friendly targets\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst checkboxVariants = cva(\n [\n \"peer relative box-border flex shrink-0 items-center justify-center self-center rounded-[4px] border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:data-[state=indeterminate]:bg-primary dark:data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-background data-[state=indeterminate]:text-primary data-[state=indeterminate]:ring-2 data-[state=indeterminate]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n \"data-[state=indeterminate]:border-secondary data-[state=indeterminate]:bg-secondary data-[state=indeterminate]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n \"data-[state=indeterminate]:border-chart-2 data-[state=indeterminate]:bg-chart-2 data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n \"data-[state=indeterminate]:border-destructive data-[state=indeterminate]:bg-destructive data-[state=indeterminate]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n \"data-[state=indeterminate]:border-amber-500 data-[state=indeterminate]:bg-amber-500 data-[state=indeterminate]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n \"data-[state=indeterminate]:border-muted-foreground/50 data-[state=indeterminate]:bg-muted data-[state=indeterminate]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 max-h-3.5 max-w-3.5 min-h-3.5 min-w-3.5 rounded-[3px] [&_[data-slot=checkbox-indicator]_i]:text-[10px]\",\n default: \"size-4 max-h-4 max-w-4 min-h-4 min-w-4 [&_[data-slot=checkbox-indicator]_i]:text-xs\",\n lg: \"size-5 max-h-5 max-w-5 min-h-5 min-w-5 rounded-[5px] [&_[data-slot=checkbox-indicator]_i]:text-sm\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: [\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst checkboxIndicatorVariants = cva(\"grid place-content-center text-current\", {\n variants: {\n motion: {\n none: \"transition-none\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\":\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: {\n motion: \"none\",\n },\n})\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, variant, size, motion, checked, ...props }, ref) {\n const m = motion ?? \"none\"\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-variant={variant ?? \"default\"}\n data-motion={m}\n checked={checked}\n className={cn(checkboxVariants({ variant, size, motion: m }), className)}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={checkboxIndicatorVariants({ motion: m })}\n >\n {checked === \"indeterminate\" ? (\n <i className=\"fa-solid fa-minus text-current\" aria-hidden=\"true\" />\n ) : (\n <i className=\"fa-solid fa-check text-current\" aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n }\n)\n\nexport type CheckboxLabelProps = React.ComponentPropsWithRef<typeof Label>\n\n/** Label tuned for `Checkbox` siblings: larger tap target, respects `peer-disabled`. */\nfunction CheckboxLabel({ className, ...props }: CheckboxLabelProps) {\n return (\n <Label\n data-slot=\"checkbox-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Checkbox, CheckboxLabel, checkboxVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger className={cn(\"cursor-pointer\", className)} {...props} />\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 rounded-lg border border-border bg-popover shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }\n","/**\n * Shared types + design-system constants for the Table Properties drawer\n * and related data-table primitives (filter chips, sort cards,\n * conditional formatting rules).\n *\n * Product-specific seed data (`FILTER_FIELDS` and `COLUMNS` arrays\n * tailored to the Placements hub) intentionally stays in\n * `apps/web/components/table-properties/types.ts` — those values are\n * **product data**, not design-system primitives, and the package must\n * not know about Placement specializations, supervisor labels, etc.\n *\n * Consumers compose their own `FilterFieldDef[]` / `ColDef[]` arrays\n * tailored to their entity (Team members, Compliance items, Question\n * bank rows, …) and pass them into the drawer through props.\n */\n\n/** Comparison operator vocabulary used by every filter row + conditional rule. */\nexport type FilterOperator = \"is\" | \"is_not\" | \"contains\" | \"not_contains\"\n\n/**\n * Input mask for `type: \"text\"` filters. Maps to a\n * [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask)\n * pattern key. Add new keys here (and in your concrete `exxatMaskPatterns`\n * map) when a new column needs a structured text format.\n */\nexport type FilterTextMask = \"phone\" | \"zip\" | \"dateMDY\"\n\nexport interface FilterFieldDef {\n key: string\n label: string\n icon: string\n type: \"select\" | \"text\" | \"date\"\n operators: FilterOperator[]\n /** Select options, or for `date` fields used by conditional rules (exact row strings). */\n options?: { value: string; label: string }[]\n /** When `type` is `text`, optional `use-mask-input` pattern for the value field. */\n textMask?: FilterTextMask\n}\n\nexport interface ActiveFilter {\n id: string\n fieldKey: string\n operator: FilterOperator\n values: string[]\n}\n\nexport interface SortRule {\n id: string\n fieldKey: string\n direction: \"asc\" | \"desc\"\n}\n\n/** Operator → human-readable label map (centralized so chips, drawer, and CSV exports stay aligned). */\nexport const OPERATOR_LABELS: Record<FilterOperator, string> = {\n is: \"is\",\n is_not: \"is not\",\n contains: \"contains\",\n not_contains: \"does not contain\",\n}\n\n/** Column descriptor for `TableProperties` views (Columns / Sort / Group panels). */\nexport interface ColDef {\n key: string\n label: string\n sortable: boolean\n sortKey?: string\n minWidth: number\n}\n\n/* ─── Conditional formatting ──────────────────────────────────────────── */\n\nexport interface ConditionalRule {\n id: string\n /** Column key to evaluate */\n fieldKey: string\n operator: FilterOperator\n /** Selected option values (select) or text (single entry) when operator needs values */\n values: string[]\n /** Resolved CSS background color string */\n bgColor: string\n}\n\n/**\n * Predefined palette for conditional rule backgrounds.\n *\n * Backgrounds are exposed as CSS custom properties so theming swaps the\n * palette per brand without code edits (`--conditional-rule-green`,\n * `--conditional-rule-yellow`, etc., declared in\n * `packages/ui/src/globals.css`).\n */\nexport const RULE_COLORS: { name: string; bg: string }[] = [\n { name: \"Green\", bg: \"var(--conditional-rule-green)\" },\n { name: \"Yellow\", bg: \"var(--conditional-rule-yellow)\" },\n { name: \"Blue\", bg: \"var(--conditional-rule-blue)\" },\n { name: \"Red\", bg: \"var(--conditional-rule-red)\" },\n { name: \"Purple\", bg: \"var(--conditional-rule-purple)\" },\n { name: \"Orange\", bg: \"var(--conditional-rule-orange)\" },\n]\n","import type {\n ConditionalRule,\n FilterTextMask,\n} from \"./table-properties-types\"\n\n/**\n * Conditional-formatting matchers shared by `DataTable` cells,\n * `data-row-list` rows, and board card backgrounds. Keeping the logic\n * here ensures the table grid and the list / board derivatives all\n * paint the same row with the same rule (no UI drift between views).\n *\n * `columns` is optional and only used when the consumer needs to:\n * - read from a different row key than the rule's `fieldKey`\n * (`sortKey`-aliased columns), or\n * - apply a `textMask` (phone / zip) so \"contains 555\" matches the\n * raw digits of \"(415) 555-0100\".\n */\n\nexport type ConditionalColumnHint = {\n key: string\n sortKey?: string\n filter?: { type?: string; textMask?: FilterTextMask }\n}\n\nfunction rowValueForRule<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): string {\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const dataKey = (col?.sortKey ?? rule.fieldKey) as keyof T\n return String(row[dataKey] ?? \"\")\n}\n\nfunction ruleHasActiveValues(\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (rule.values.length === 0) return false\n const col = columns?.find((c) => c.key === rule.fieldKey)\n if (col?.filter?.type === \"text\")\n return (rule.values[0] ?? \"\").trim().length > 0\n return true\n}\n\nfunction conditionalTextMatches(\n cellVal: string,\n needle: string,\n op: \"contains\" | \"not_contains\",\n textMask: FilterTextMask | undefined,\n) {\n const v = cellVal.trim()\n const n = needle.trim()\n if (!n) return op === \"not_contains\"\n if (textMask === \"phone\" || textMask === \"zip\") {\n const nd = n.replace(/\\D/g, \"\")\n const hay = v.replace(/\\D/g, \"\")\n if (!nd) return op === \"not_contains\"\n const hit = hay.includes(nd)\n return op === \"contains\" ? hit : !hit\n }\n const hit = v.toLowerCase().includes(n.toLowerCase())\n return op === \"contains\" ? hit : !hit\n}\n\n/** Whether a conditional rule matches a row (same logic as DataTable cells). */\nexport function conditionalRuleMatchesRow<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (!ruleHasActiveValues(rule, columns)) return false\n const v = rowValueForRule(row, rule, columns).trim()\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const textMask =\n col?.filter?.type === \"text\" ? col.filter.textMask : undefined\n switch (rule.operator) {\n case \"is\":\n return rule.values.includes(v)\n case \"is_not\":\n return !rule.values.includes(v)\n case \"contains\":\n return rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n case \"not_contains\":\n return !rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n default:\n return false\n }\n}\n\n/** First matching conditional rule background for a row (list/board row tint). */\nexport function getConditionalRowBackground<T extends Record<string, unknown>>(\n row: T,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n for (const rule of rules) {\n if (conditionalRuleMatchesRow(row, rule, columns)) return rule.bgColor\n }\n return undefined\n}\n\n/** Background for one table cell from conditional rules on that column. */\nexport function getConditionalCellBackground<T extends Record<string, unknown>>(\n row: T,\n colKey: string,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n const rule = rules.find((r) => r.fieldKey === colKey)\n if (!rule || !conditionalRuleMatchesRow(row, rule, columns)) return undefined\n return rule.bgColor\n}\n","/**\n * Format any date string (ISO, MM/DD/YYYY, \"Mar 15 2026\", etc.) into the\n * app-wide display format: MM/DD/YYYY.\n * Returns \"—\" for empty / unparseable values.\n */\nexport function formatDateUS(raw: string | null | undefined): string {\n if (!raw || raw.trim() === \"—\" || raw.trim() === \"-\") return \"—\"\n // Already MM/DD/YYYY — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(raw.trim())) return raw.trim()\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return raw\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/** Format a `Date` with local calendar fields as MM/DD/YYYY (avoids UTC drift from `toISOString()`). */\nexport function formatDateFromDate(raw: Date | null | undefined): string {\n if (!raw || Number.isNaN(raw.getTime())) return \"—\"\n const m = String(raw.getMonth() + 1).padStart(2, \"0\")\n const day = String(raw.getDate()).padStart(2, \"0\")\n const y = raw.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/**\n * Format a Date (or ISO string) into \"MM/DD/YYYY hh:mm AM/PM EST\".\n * Time zone label is always appended as the literal string \"EST\" (display only).\n */\nexport function formatDateTimeUS(raw: Date | string | null | undefined): string {\n if (!raw) return \"—\"\n const d = raw instanceof Date ? raw : new Date(raw)\n if (Number.isNaN(d.getTime())) return String(raw)\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n let h = d.getHours()\n const min = String(d.getMinutes()).padStart(2, \"0\")\n const ampm = h >= 12 ? \"PM\" : \"AM\"\n h = h % 12 || 12\n return `${m}/${day}/${y} ${String(h).padStart(2, \"0\")}:${min} ${ampm} EST`\n}\n\n/** Parse a human-readable date string into YYYY-MM-DD for comparison (local timezone). */\nexport function parseRowDateToYmd(raw: string): string | null {\n const t = raw.trim()\n if (!t || t === \"—\" || t === \"-\") return null\n const d = new Date(t)\n if (Number.isNaN(d.getTime())) return null\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n\n/** Format YYYY-MM-DD for filter chip labels (MM/DD/YYYY). */\nexport function formatYmdForDisplay(ymd: string): string {\n const d = ymdToLocalDate(ymd)\n if (!d) return ymd\n return formatDateFromDate(d)\n}\n\n/** Local noon to avoid timezone shifting the calendar day. */\nexport function ymdToLocalDate(ymd: string | undefined): Date | undefined {\n if (!ymd || !/^\\d{4}-\\d{2}-\\d{2}$/.test(ymd)) return undefined\n const [y, m, d] = ymd.split(\"-\").map(Number)\n return new Date(y, m - 1, d, 12, 0, 0, 0)\n}\n\nexport function localDateToYmd(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button, buttonVariants } from \"./button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background 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) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex h-8 items-center gap-1 rounded-md pe-1 ps-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-md text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\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 \"rounded-md bg-accent text-accent-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\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 &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !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 \"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:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Calendar } from \"../ui/calendar\"\nimport { localDateToYmd, ymdToLocalDate } from \"../../lib/date-filter\"\n\n/** Single-date calendar for table filters (YYYY-MM-DD). */\nexport function FilterDateCalendar({\n valueYmd,\n onChangeYmd,\n label,\n}: {\n valueYmd: string | undefined\n onChangeYmd: (ymd: string | undefined) => void\n label: string\n}) {\n const [timeZone, setTimeZone] = React.useState<string | undefined>()\n React.useEffect(() => {\n setTimeZone(Intl.DateTimeFormat().resolvedOptions().timeZone)\n }, [])\n\n return (\n <div\n className=\"rounded-lg border border-border overflow-hidden\"\n role=\"group\"\n aria-label={label}\n >\n <Calendar\n mode=\"single\"\n selected={ymdToLocalDate(valueYmd)}\n onSelect={(d) => onChangeYmd(d ? localDateToYmd(d) : undefined)}\n captionLayout=\"dropdown\"\n timeZone={timeZone}\n className=\"rounded-lg border-0\"\n />\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-md border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pe-1.5 has-[>[data-align=inline-start]]:[&>input]:ps-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first ps-2 has-[>button]:ms-[-0.3rem] has-[>kbd]:ms-[-0.15rem]\",\n \"inline-end\":\n \"order-last pe-2 has-[>button]:me-[-0.3rem] has-[>kbd]:me-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\n\n/** Merges multiple refs (callback or object) for the same DOM node — e.g. RHF `field.ref` + mask ref. */\nexport function composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return node => {\n for (const ref of refs) {\n if (ref == null) continue\n if (typeof ref === \"function\") {\n ref(node)\n } else {\n ;(ref as React.MutableRefObject<T | null>).current = node\n }\n }\n }\n}\n","\"use client\"\n\n/**\n * Input masking — aligned with [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask):\n * `use-mask-input` for phone / date / time / custom / zip; use `PaymentCardFields` for card flows.\n */\n\nimport * as React from \"react\"\nimport {\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n} from \"use-mask-input\"\nimport type { Mask, Options } from \"use-mask-input\"\n\nimport { composeRefs } from \"../../lib/compose-refs\"\n\nexport { composeRefs } from \"../../lib/compose-refs\"\nimport { cn } from \"../../lib/utils\"\nimport { Input } from \"./input\"\n\n/** Default mask UX per Shadcn Studio demos (underscore placeholder, no hover mask). */\nexport const exxatInputMaskDefaults: Options = {\n placeholder: \"_\",\n showMaskOnHover: false,\n}\n\n/** Common patterns (Inputmask `9` = digit, `a` = letter, `*` = alnum). */\nexport const exxatMaskPatterns = {\n /** US NANP 10-digit display */\n phoneUS: \"(999) 999-9999\",\n /** US ZIP or ZIP+4 */\n zipUS: \"99999[-9999]\",\n /** Calendar-style date (validate separately). */\n dateMDY: \"99/99/9999\",\n /** Studio input-mask-01 style — UK-style plate-ish token; adjust per product. */\n customReference: \"AA99 AAA\",\n} as const satisfies Record<string, Mask>\n\nexport function exxatTimeMaskOptions(): Options & {\n inputFormat: string\n outputFormat: string\n} {\n return {\n ...exxatInputMaskDefaults,\n inputFormat: \"HH:MM:ss\",\n outputFormat: \"HH:MM:ss\",\n }\n}\n\nexport function useExxatPhoneMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.phoneUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatZipMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.zipUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatDateMDYMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.dateMDY,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatTimeMask(options?: Options) {\n return useMaskInput({\n mask: \"datetime\",\n options: { ...exxatTimeMaskOptions(), ...options },\n })\n}\n\nexport function useExxatCustomMask(mask: Mask, options?: Options) {\n return useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\n/** Merge React Hook Form Controller `field.ref` with a mask ref. */\nexport function useExxatMaskedFieldRef(\n fieldRef: React.Ref<HTMLInputElement>,\n mask: Mask,\n options?: Options\n): React.RefCallback<HTMLInputElement> {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n return React.useMemo(() => composeRefs(fieldRef, maskRef), [fieldRef, maskRef])\n}\n\nexport type MaskedInputProps = React.ComponentProps<typeof Input> & {\n mask: Mask\n maskOptions?: Options\n}\n\n/** Standalone masked `Input` (forwardRef + merged mask ref). */\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(function MaskedInput(\n { mask, maskOptions, className, type = \"text\", ...props },\n ref\n) {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...maskOptions },\n })\n return (\n <Input\n ref={composeRefs(ref, maskRef)}\n type={type}\n className={cn(className)}\n {...props}\n />\n )\n})\n\nexport {\n MaskedInput,\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n}\nexport type { Mask, Options }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { formatDateFromDate } from \"../../lib/date-filter\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n} from \"./input-group\"\nimport { MaskedInput, exxatMaskPatterns } from \"./input-mask\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport const DATE_PICKER_ICON_CLASS = \"fa-light fa-calendar\"\n\nexport interface DatePickerFieldProps {\n value: Date | undefined\n onChange: (d: Date | undefined) => void\n id?: string\n disabled?: boolean\n /** Passed to the trigger `Button` (e.g. `h-8 text-sm` in compact drawers). */\n triggerClassName?: string\n fromYear?: number\n toYear?: number\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\n/**\n * Calendar + popover trigger — same pattern as New Placement schedule dates (WCAG: button exposes label, not raw text input).\n */\nexport function DatePickerField({\n value,\n onChange,\n id,\n disabled,\n triggerClassName,\n fromYear = 2020,\n toYear = 2032,\n popoverAlign = \"start\",\n popoverClassName,\n}: DatePickerFieldProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n id={id}\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-start font-normal\",\n triggerClassName,\n )}\n aria-label={value ? formatDateFromDate(value) : \"Pick a date\"}\n >\n <i className={cn(DATE_PICKER_ICON_CLASS, \"me-2 shrink-0 text-muted-foreground\")} aria-hidden=\"true\" />\n <span className={cn(!value && \"text-muted-foreground\")}>\n {value ? formatDateFromDate(value) : \"MM/DD/YYYY\"}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn(\"z-[80] w-auto p-0\", popoverClassName)} align={popoverAlign}>\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface DateTextInputFieldProps {\n value: string\n onValueChange: (value: string) => void\n \"aria-label\": string\n id?: string\n placeholder?: string\n className?: string\n inputClassName?: string\n autoFocus?: boolean\n disabled?: boolean\n fromYear?: number\n toYear?: number\n iconButtonVariant?: \"ghost\" | \"outline\"\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\nfunction parseMdyToLocalDate(raw: string): Date | undefined {\n const match = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!match) return undefined\n const month = Number(match[1])\n const day = Number(match[2])\n const year = Number(match[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const date = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return undefined\n return date\n}\n\nfunction formatLocalDateToMdy(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n const year = String(date.getFullYear())\n return `${month}/${day}/${year}`\n}\n\nexport function DateTextInputField({\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n id,\n placeholder = \"MM/DD/YYYY\",\n className,\n inputClassName,\n autoFocus,\n disabled,\n fromYear = 2020,\n toYear = 2032,\n iconButtonVariant = \"ghost\",\n popoverAlign = \"end\",\n popoverClassName,\n}: DateTextInputFieldProps) {\n return (\n <InputGroup className={className}>\n <MaskedInput\n data-slot=\"input-group-control\"\n id={id}\n mask={exxatMaskPatterns.dateMDY}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n inputClassName,\n )}\n autoFocus={autoFocus}\n disabled={disabled}\n />\n <InputGroupAddon align=\"inline-end\">\n <Popover>\n <PopoverTrigger asChild>\n <InputGroupButton\n type=\"button\"\n variant={iconButtonVariant}\n size=\"icon-xs\"\n disabled={disabled}\n aria-label={`${ariaLabel} pick date`}\n >\n <i className={DATE_PICKER_ICON_CLASS} aria-hidden=\"true\" />\n </InputGroupButton>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"z-[80] w-auto p-0\", popoverClassName)}\n align={popoverAlign}\n sideOffset={6}\n >\n <Calendar\n mode=\"single\"\n selected={parseMdyToLocalDate(value)}\n onSelect={(next) => onValueChange(next ? formatLocalDateToMdy(next) : \"\")}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n </InputGroupAddon>\n </InputGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DateTextInputField } from \"../ui/date-picker-field\"\nimport { Input } from \"../ui/input\"\nimport { MaskedInput, exxatMaskPatterns } from \"../ui/input-mask\"\nimport type { Mask } from \"../ui/input-mask\"\nimport type { FilterTextMask } from \"../../lib/table-properties-types\"\n\nconst MASK_BY_KIND: Record<FilterTextMask, Mask> = {\n phone: exxatMaskPatterns.phoneUS,\n zip: exxatMaskPatterns.zipUS,\n dateMDY: exxatMaskPatterns.dateMDY,\n}\n\nexport function FilterTextValueInput({\n id,\n mask,\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n placeholder,\n className,\n autoFocus,\n}: {\n id?: string\n mask?: FilterTextMask\n value: string\n onValueChange: (next: string) => void\n \"aria-label\": string\n placeholder?: string\n className?: string\n autoFocus?: boolean\n}) {\n if (mask === \"dateMDY\") {\n return (\n <DateTextInputField\n id={id}\n value={value}\n onValueChange={onValueChange}\n aria-label={ariaLabel}\n placeholder={placeholder}\n inputClassName={className}\n autoFocus={autoFocus}\n iconButtonVariant=\"ghost\"\n popoverAlign=\"end\"\n />\n )\n }\n\n if (mask) {\n return (\n <MaskedInput\n id={id}\n mask={MASK_BY_KIND[mask]}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n }\n return (\n <Input\n id={id}\n type=\"text\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n}\n","\"use client\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useTableState — all non-display state shared by DataTable and DataTablePaginated\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport * as React from \"react\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { ColumnDef, SortDir } from \"./types\"\nimport type { ActiveFilter, FilterOperator, SortRule } from \"../../lib/table-properties-types\"\nimport { parseRowDateToYmd } from \"../../lib/date-filter\"\n\nlet _filterId = 0\nfunction nextFilterId() { return `f-${++_filterId}` }\n\n/**\n * “Reflow” / high-zoom short viewport. At 200% zoom a 1080p monitor’s CSS\n * height is ≈ 540px — `500px` was too low and never disabled pins. 640px\n * catches typical 200% cases and small laptop tops without breaking `500px` flows.\n * Column stickies + edge shadows harm reflow (WCAG 1.4.10).\n */\nconst REFLOW_VIEWPORT_MQ = \"(max-height: 640px)\"\n\nfunction subscribeReflowViewport(callback: () => void) {\n if (typeof window === \"undefined\") return () => {}\n const mql = window.matchMedia(REFLOW_VIEWPORT_MQ)\n mql.addEventListener(\"change\", callback)\n return () => mql.removeEventListener(\"change\", callback)\n}\nfunction getReflowViewportSnapshot() {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(REFLOW_VIEWPORT_MQ).matches\n}\nfunction getServerReflowViewportSnapshot() {\n return false\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction digitsOnly(s: string): string {\n return s.replace(/\\D/g, \"\")\n}\n\n/** Build the default widths map from column defs */\nfunction buildDefaultWidths<TData>(columns: ColumnDef<TData>[]): Record<string, number> {\n const map: Record<string, number> = {}\n for (const col of columns) {\n if (col.width !== undefined) map[col.key] = col.width\n }\n return map\n}\n\n/** Build the initial pin state from column defs */\nfunction buildDefaultPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\nfunction compareUnknownSort(a: unknown, b: unknown): number {\n if (a === b) return 0\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (typeof a === \"number\" && typeof b === \"number\") return a < b ? -1 : a > b ? 1 : 0\n if (typeof a === \"string\" && typeof b === \"string\") return a < b ? -1 : a > b ? 1 : 0\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n}\n\n/** Build the locked-pin set (columns that can never be unpinned) */\nfunction buildLockedPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.lockPin && col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function useTableState<TData extends Record<string, unknown>>(\n data: TData[],\n columns: ColumnDef<TData>[],\n defaultSort?: { key: string; dir: SortDir },\n paginationOverride?: { page: number; pageSize: number },\n /**\n * When defined (including `\"\"`), toolbar search is synced from the URL (`?q=`).\n * Use `searchParams.get(\"q\") ?? \"\"` on library list routes; omit for other hubs.\n */\n syncedSearchFromUrl?: string,\n) {\n // ── Sort ──────────────────────────────────────────────────────────────────\n const [sortRules, setSortRules] = React.useState<SortRule[]>(() => {\n if (defaultSort) {\n return [{ id: \"sort-default\", fieldKey: defaultSort.key, direction: defaultSort.dir }]\n }\n return []\n })\n\n const primarySort = sortRules[0] ?? null\n const sortKey: string = primarySort?.fieldKey ?? \"\"\n const sortDir: SortDir = primarySort?.direction ?? \"asc\"\n\n const addSortRule = React.useCallback((fieldKey: string) => {\n setSortRules(prev => {\n if (prev.some(r => r.fieldKey === fieldKey)) return prev\n // New drawer sorts are primary (same as column-header sort), not trailing.\n return [{ id: `sort-${Date.now()}`, fieldKey, direction: \"asc\" }, ...prev]\n })\n }, [setSortRules])\n\n const removeSortRule = React.useCallback((id: string) => {\n setSortRules(prev => prev.filter(r => r.id !== id))\n }, [setSortRules])\n\n const toggleSortDir = React.useCallback((id: string) => {\n setSortRules(prev => prev.map(r =>\n r.id === id ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r\n ))\n }, [setSortRules])\n\n const handleSortByKey = React.useCallback((colKey: string) => {\n setSortRules(prev => {\n const idx = prev.findIndex(r => r.fieldKey === colKey)\n if (idx === 0) {\n return prev.map((r, i) => i === 0 ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r)\n }\n const filtered = prev.filter(r => r.fieldKey !== colKey)\n return [{ id: `sort-${Date.now()}`, fieldKey: colKey, direction: \"asc\" }, ...filtered]\n })\n }, [setSortRules])\n\n // ── Filters ───────────────────────────────────────────────────────────────\n const [search, setSearch] = React.useState(() =>\n syncedSearchFromUrl !== undefined ? syncedSearchFromUrl.trim() : \"\",\n )\n const [searchOpen, setSearchOpen] = React.useState(() =>\n syncedSearchFromUrl !== undefined && Boolean(syncedSearchFromUrl.trim()),\n )\n const searchRef = React.useRef<HTMLInputElement>(null)\n const [activeFilters, setActiveFilters] = React.useState<ActiveFilter[]>([])\n const [filterConnectors, setFilterConnectors] = React.useState<Record<string, \"and\" | \"or\">>({})\n const [openFilterId, setOpenFilterId] = React.useState<string | null>(null)\n const [filterBarVisible, setFilterBarVisible] = React.useState(true)\n const [drawerExpandedFilters, setDrawerExpandedFilters] = React.useState<Set<string>>(new Set())\n\n React.useEffect(() => {\n if (syncedSearchFromUrl === undefined) return\n const next = syncedSearchFromUrl.trim()\n setSearch(next)\n setSearchOpen(next.length > 0)\n }, [syncedSearchFromUrl])\n\n const toggleConnector = React.useCallback((leftId: string) => {\n setFilterConnectors(prev => ({ ...prev, [leftId]: prev[leftId] === \"or\" ? \"and\" : \"or\" }))\n }, [setFilterConnectors])\n\n function getConnector(leftId: string): \"and\" | \"or\" {\n return filterConnectors[leftId] ?? \"and\"\n }\n\n const addFilter = React.useCallback((fieldKey: string, fromDrawer = false) => {\n const col = columns.find(c => c.key === fieldKey)\n if (!col?.filter) return\n const id = nextFilterId()\n const f = col.filter\n const firstOperator: FilterOperator = (() => {\n if (f.type === \"select\" || f.type === \"date\") {\n const pick = f.operators?.find(o => o === \"is\" || o === \"is_not\")\n return pick ?? \"is\"\n }\n return f.operators?.[0] ?? \"contains\"\n })()\n const newFilter: ActiveFilter = { id, fieldKey, operator: firstOperator, values: [] }\n setActiveFilters(prev => [...prev, newFilter])\n if (fromDrawer) {\n setDrawerExpandedFilters(() => new Set([id]))\n // Keep toolbar pills hidden until a value is chosen — avoids mounting every\n // FilterPill (heavy) on each drawer \"Add filter\" click.\n } else {\n setOpenFilterId(id)\n setFilterBarVisible(true)\n }\n }, [columns, setActiveFilters, setDrawerExpandedFilters, setOpenFilterId, setFilterBarVisible])\n\n const updateFilter = React.useCallback((id: string, patch: Partial<ActiveFilter>) => {\n let shouldShowFilterBar = false\n setActiveFilters(prev => {\n const next = prev.map(f => {\n if (f.id !== id) return f\n const merged = { ...f, ...patch }\n const col = columns.find(c => c.key === merged.fieldKey)\n if (merged.values.length > 0) {\n shouldShowFilterBar =\n col?.filter?.type === \"text\"\n ? (merged.values[0] ?? \"\").trim().length > 0\n : true\n }\n return merged\n })\n return next\n })\n if (shouldShowFilterBar) setFilterBarVisible(true)\n }, [columns, setActiveFilters, setFilterBarVisible])\n\n const removeFilter = React.useCallback((id: string) => {\n // Use functional updates only — no stale-closure risk on activeFilters.\n setActiveFilters(prev => {\n const idx = prev.findIndex(f => f.id === id)\n const next = prev.filter(f => f.id !== id)\n setFilterConnectors(prevC => {\n const c = { ...prevC }\n if (idx > 0 && next.length > 0) {\n const leftId = prev[idx - 1].id\n c[leftId] = prevC[id] ?? prevC[leftId] ?? \"and\"\n }\n delete c[id]\n return c\n })\n return next\n })\n setOpenFilterId(prev => prev === id ? null : prev)\n }, [setActiveFilters, setFilterConnectors, setOpenFilterId])\n\n // ── Group by ──────────────────────────────────────────────────────────────\n const [groupBy, setGroupBy] = React.useState<string | null>(null)\n\n // ── Per-column quick-search ───────────────────────────────────────────────\n const [colMenuSearch, setColMenuSearch] = React.useState<Record<string, string>>({})\n\n // ── Selection ─────────────────────────────────────────────────────────────\n const [selected, setSelected] = React.useState<Set<string | number>>(new Set())\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [colWidths, setColWidths] = React.useState<Record<string, number>>(() => buildDefaultWidths(columns))\n const resizeRef = React.useRef<{ key: string; startX: number; startW: number } | null>(null)\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [colOrder, setColOrder] = React.useState<string[]>(() => columns.map(c => c.key))\n\n // ── Column pins ───────────────────────────────────────────────────────────\n const [colPins, setColPins] = React.useState<Record<string, \"left\" | \"right\">>(() => buildDefaultPins(columns))\n const lockedPins = React.useMemo(() => buildLockedPins(columns), [columns])\n\n // ── Column wrap ───────────────────────────────────────────────────────────\n const [colWrap, setColWrap] = React.useState<Record<string, boolean>>({})\n\n // ── Drawer / display settings ─────────────────────────────────────────────\n const [sheetOpen, setSheetOpen] = React.useState(false)\n /**\n * Deep-link target for the Properties drawer. When a callsite wants to open\n * the drawer focused on a specific panel (e.g. \"conditional-rules\" from the\n * column header menu), it sets this before calling `setSheetOpen(true)`. The\n * drawer's `initialPanel` prop reads it and syncs its internal `sheetPanel`\n * accordingly. The toolbar Properties button clears it so it opens to \"main\".\n */\n const [sheetInitialPanel, setSheetInitialPanel] = React.useState<string | null>(null)\n const [showGridlines, setShowGridlines] = React.useState(true)\n const [rowHeight, setRowHeight] = React.useState<RowHeight>(\"default\")\n const [hiddenCols, setHiddenCols] = React.useState<Set<string>>(new Set())\n\n const toggleColVisibility = React.useCallback((key: string) => {\n setHiddenCols(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [setHiddenCols])\n\n const moveCol = React.useCallback((key: string, dir: \"up\" | \"down\") => {\n setColOrder(prev => {\n const lockedLeft = columns.filter(c => c.lockPin && c.defaultPin === \"left\").map(c => c.key)\n const lockedRight = columns.filter(c => c.lockPin && c.defaultPin === \"right\").map(c => c.key)\n const orderable = prev.filter(k => !lockedLeft.includes(k) && !lockedRight.includes(k))\n const idx = orderable.indexOf(key)\n if (dir === \"up\" && idx <= 0) return prev\n if (dir === \"down\" && idx >= orderable.length - 1) return prev\n const next = [...orderable]\n const swap = dir === \"up\" ? idx - 1 : idx + 1\n ;[next[idx], next[swap]] = [next[swap], next[idx]]\n return [...lockedLeft, ...next, ...lockedRight]\n })\n }, [columns, setColOrder])\n\n // ── Drag-to-reorder ───────────────────────────────────────────────────────\n const draggedKey = React.useRef<string | null>(null)\n const [dragOverKey, setDragOverKey] = React.useState<string | null>(null)\n\n // ── Scroll / overflow ─────────────────────────────────────────────────────\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [scrolled, setScrolled] = React.useState(false)\n const [scrollEnd, setScrollEnd] = React.useState(false)\n const [isOverflowing, setIsOverflowing] = React.useState(false)\n\n const isReflowViewport = React.useSyncExternalStore(\n subscribeReflowViewport,\n getReflowViewportSnapshot,\n getServerReflowViewportSnapshot,\n )\n\n // ── Hovered row ───────────────────────────────────────────────────────────\n const [hoveredRow, setHoveredRow] = React.useState<string | number | null>(null)\n\n // ── Column lookup index (stable per `columns` reference) ─────────────────\n // The previous implementation called `columns.find(c => c.key === ...)` inside\n // every filter/sort comparator and every sticky-offset getter — for large\n // datasets that's O(rows × cols) per render. Map lookups make those O(1).\n const columnsByKey = React.useMemo(() => {\n const map = new Map<string, ColumnDef<TData>>()\n for (const col of columns) map.set(col.key, col)\n return map\n }, [columns])\n\n // Searchable text cache. Per row, concatenate every value into one\n // lower-cased blob ONCE and reuse it across keystrokes. Keyed by row\n // identity via WeakMap so it never holds onto rows the consumer dropped.\n const searchableTextCache = React.useRef<WeakMap<object, string>>(new WeakMap())\n const getSearchableText = React.useCallback((row: TData): string => {\n const cache = searchableTextCache.current\n const cached = cache.get(row)\n if (cached !== undefined) return cached\n let blob = \"\"\n for (const v of Object.values(row)) {\n if (v == null) continue\n blob += String(v).toLowerCase() + \"\\n\"\n }\n cache.set(row, blob)\n return blob\n }, [])\n\n // Per-row per-column lower-cased value cache (column quick-search +\n // text-mask filters). One `Map` per row, lazily filled on first lookup.\n const lowerValueCache = React.useRef<WeakMap<object, Map<string, string>>>(new WeakMap())\n const getLowerValue = React.useCallback((row: TData, key: string): string => {\n const wm = lowerValueCache.current\n let perRow = wm.get(row)\n if (!perRow) {\n perRow = new Map()\n wm.set(row, perRow)\n }\n const cached = perRow.get(key)\n if (cached !== undefined) return cached\n const computed = String(row[key] ?? \"\").toLowerCase()\n perRow.set(key, computed)\n return computed\n }, [])\n\n // Reset the row-keyed caches whenever the dataset reference changes so we\n // don't pin stale strings for rows the consumer just replaced.\n React.useEffect(() => {\n searchableTextCache.current = new WeakMap()\n lowerValueCache.current = new WeakMap()\n }, [data])\n\n // ── Derived: filtered + sorted rows ──────────────────────────────────────\n const rows = React.useMemo(() => {\n let result = data.slice()\n\n const q = search.trim().toLowerCase()\n if (q) {\n result = result.filter(r => getSearchableText(r).includes(q))\n }\n\n const activeWithValues = activeFilters.filter(f => {\n if (f.values.length === 0) return false\n const col = columnsByKey.get(f.fieldKey)\n if (col?.filter?.type === \"text\") {\n return (f.values[0] ?? \"\").trim().length > 0\n }\n return true\n })\n if (activeWithValues.length > 0) {\n // Pre-resolve column, operator, normalised needle, and select-value Set\n // for each active filter ONCE (instead of per row).\n type CompiledFilter = {\n col: ColumnDef<TData>\n id: string\n type: \"select\" | \"date\" | \"text\"\n operator: ActiveFilter[\"operator\"]\n selectValues?: Set<string>\n dateTarget?: string\n textNeedle?: string\n digitsNeedle?: string\n isDigitsMask?: boolean\n }\n const compiled: CompiledFilter[] = []\n for (const f of activeWithValues) {\n const col = columnsByKey.get(f.fieldKey)\n if (!col?.filter) continue\n if (col.filter.type === \"select\") {\n compiled.push({\n col,\n id: f.id,\n type: \"select\",\n operator: f.operator,\n selectValues: new Set(f.values),\n })\n } else if (col.filter.type === \"date\") {\n compiled.push({\n col,\n id: f.id,\n type: \"date\",\n operator: f.operator,\n dateTarget: f.values[0],\n })\n } else {\n const raw = f.values[0] ?? \"\"\n const isDigitsMask = col.filter.textMask === \"phone\" || col.filter.textMask === \"zip\"\n compiled.push({\n col,\n id: f.id,\n type: \"text\",\n operator: f.operator,\n isDigitsMask,\n digitsNeedle: isDigitsMask ? digitsOnly(raw) : undefined,\n textNeedle: !isDigitsMask ? raw.toLowerCase() : undefined,\n })\n }\n }\n\n const matchesCompiled = (r: TData, f: CompiledFilter): boolean => {\n const rowVal = String(r[f.col.key] ?? \"\")\n if (f.type === \"select\") {\n const hit = f.selectValues!.has(rowVal)\n return f.operator === \"is\" ? hit : !hit\n }\n if (f.type === \"date\") {\n if (!f.dateTarget) return true\n const rowYmd = parseRowDateToYmd(rowVal)\n const op = f.operator === \"is_not\" ? \"is_not\" : \"is\"\n if (rowYmd === null) return op === \"is_not\"\n return op === \"is\" ? rowYmd === f.dateTarget : rowYmd !== f.dateTarget\n }\n if (f.isDigitsMask) {\n if (!f.digitsNeedle) return true\n const hay = digitsOnly(rowVal)\n return f.operator === \"contains\" ? hay.includes(f.digitsNeedle) : !hay.includes(f.digitsNeedle)\n }\n if (!f.textNeedle) return true\n const hay = getLowerValue(r, f.col.key)\n return f.operator === \"contains\" ? hay.includes(f.textNeedle) : !hay.includes(f.textNeedle)\n }\n\n if (compiled.length > 0) {\n result = result.filter(r => {\n let res = matchesCompiled(r, compiled[0])\n for (let i = 1; i < compiled.length; i++) {\n const connector = filterConnectors[compiled[i - 1].id] ?? \"and\"\n const match = matchesCompiled(r, compiled[i])\n res = connector === \"and\" ? res && match : res || match\n }\n return res\n })\n }\n }\n\n // Column menu quick-search — pre-normalise needles outside the row loop.\n const colMenuEntries: { key: string; lower: string }[] = []\n for (const [key, raw] of Object.entries(colMenuSearch)) {\n const trimmed = raw.trim()\n if (trimmed) colMenuEntries.push({ key, lower: trimmed.toLowerCase() })\n }\n if (colMenuEntries.length > 0) {\n result = result.filter(r => {\n for (const { key, lower } of colMenuEntries) {\n if (!getLowerValue(r, key).includes(lower)) return false\n }\n return true\n })\n }\n\n // Sort — resolve each rule's sort key ONCE, then run the comparator over\n // an indexed list so the inner loop is a tight array walk, not a chain of\n // `columns.find` lookups per comparison.\n if (sortRules.length > 0) {\n const resolved: { sk: string; dir: SortDir }[] = []\n for (const rule of sortRules) {\n const col = columnsByKey.get(rule.fieldKey)\n const sk = col?.sortKey ?? col?.key\n if (sk) resolved.push({ sk: sk as string, dir: rule.direction })\n }\n if (resolved.length > 0) {\n result.sort((a, b) => {\n for (let i = 0; i < resolved.length; i++) {\n const { sk, dir } = resolved[i]\n const cmp = compareUnknownSort(a[sk], b[sk])\n if (cmp !== 0) return dir === \"asc\" ? cmp : -cmp\n }\n return 0\n })\n }\n }\n\n return result\n }, [\n data,\n search,\n activeFilters,\n filterConnectors,\n colMenuSearch,\n sortRules,\n columnsByKey,\n getSearchableText,\n getLowerValue,\n ])\n\n // ── Paged rows (slice of rows when pagination is active) ─────────────────\n const pagedRows = React.useMemo(() => {\n if (!paginationOverride || paginationOverride.pageSize <= 0) return rows\n const { page, pageSize } = paginationOverride\n const safePage = Math.max(1, page)\n return rows.slice((safePage - 1) * pageSize, safePage * pageSize)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, paginationOverride?.page, paginationOverride?.pageSize])\n\n // ── Grouped rows ──────────────────────────────────────────────────────────\n const groupedRows = React.useMemo(() => {\n if (!groupBy) return [{ groupKey: null as string | null, groupLabel: null as string | null, rows }]\n const groups = new Map<string, TData[]>()\n rows.forEach(row => {\n const val = String(row[groupBy] ?? \"—\")\n if (!groups.has(val)) groups.set(val, [])\n groups.get(val)!.push(row)\n })\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, groupRows]) => ({ groupKey: key, groupLabel: key, rows: groupRows }))\n }, [rows, groupBy])\n\n // ── Display columns ───────────────────────────────────────────────────────\n const displayCols = React.useMemo(() => {\n const leftPinned: string[] = []\n const free: string[] = []\n const rightPinned: string[] = []\n for (const k of colOrder) {\n const pin = colPins[k]\n if (pin === \"left\") leftPinned.push(k)\n else if (pin === \"right\") rightPinned.push(k)\n else free.push(k)\n }\n const ordered = [...leftPinned, ...free, ...rightPinned]\n const out: ColumnDef<TData>[] = []\n for (const k of ordered) {\n if (hiddenCols.has(k)) continue\n const col = columnsByKey.get(k)\n if (col) out.push(col)\n }\n return out\n }, [colOrder, colPins, hiddenCols, columnsByKey])\n\n const totalWidth = React.useMemo(\n () => displayCols.reduce((s, c) => s + (colWidths[c.key] ?? c.width ?? 100), 0),\n [displayCols, colWidths],\n )\n\n // ── Effective pins (respect overflow) ─────────────────────────────────────\n const LOCKED_KEYS = React.useMemo(() => new Set(Object.keys(lockedPins)), [lockedPins])\n\n // When the table fits within its container (not overflowing) there is no need\n // to sticky-pin any column — even locked ones. Pins only activate once the\n // user has to scroll horizontally so the selection / action edges stay visible.\n // In reflow viewports (high zoom), disable all column stickies — shadow + sticky\n // fight the short viewport and overlap content.\n const effectivePins = React.useMemo(() => {\n if (isReflowViewport || !isOverflowing) return {}\n const result: Record<string, \"left\" | \"right\"> = {}\n for (const [key, pin] of Object.entries(colPins)) {\n result[key] = pin\n }\n return result\n }, [colPins, isOverflowing, isReflowViewport])\n\n // ── Column actions ────────────────────────────────────────────────────────\n function startResize(key: string, e: React.MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n const minW = columns.find(c => c.key === key)?.minWidth ?? 60\n const startW = colWidths[key] ?? (columns.find(c => c.key === key)?.width ?? 100)\n resizeRef.current = { key, startX: e.clientX, startW }\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return\n const { key: k, startX, startW: sw } = resizeRef.current\n setColWidths(p => ({ ...p, [k]: Math.max(minW, sw + ev.clientX - startX) }))\n }\n const onUp = () => {\n resizeRef.current = null\n document.removeEventListener(\"mousemove\", onMove)\n document.removeEventListener(\"mouseup\", onUp)\n }\n document.addEventListener(\"mousemove\", onMove)\n document.addEventListener(\"mouseup\", onUp)\n }\n\n function handleDragStart(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n draggedKey.current = key\n e.dataTransfer.effectAllowed = \"move\"\n }\n function handleDragOver(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n e.preventDefault()\n e.dataTransfer.dropEffect = \"move\"\n if (draggedKey.current && draggedKey.current !== key) setDragOverKey(key)\n }\n function handleDrop(key: string) {\n if (!draggedKey.current || draggedKey.current === key) { setDragOverKey(null); return }\n const order = [...colOrder]\n const from = order.indexOf(draggedKey.current)\n const to = order.indexOf(key)\n order.splice(from, 1)\n order.splice(to, 0, draggedKey.current!)\n setColOrder(order)\n draggedKey.current = null\n setDragOverKey(null)\n }\n function handleDragEnd() { draggedKey.current = null; setDragOverKey(null) }\n\n function pinColumn(key: string, pin: \"left\" | \"right\") {\n setColPins(p => ({ ...p, [key]: pin }))\n }\n function unpinColumn(key: string) {\n if (lockedPins[key]) return\n setColPins(p => { const n = { ...p }; delete n[key]; return n })\n }\n function toggleWrap(key: string) {\n setColWrap(p => ({ ...p, [key]: !p[key] }))\n }\n\n // ── Scroll handlers ───────────────────────────────────────────────────────\n const checkOverflow = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n // Compare declared column width to scrollport — not scrollWidth, which matched\n // clientWidth when the table stretched with `w-full`.\n setIsOverflowing(totalWidth > el.clientWidth + 1)\n }, [totalWidth])\n\n function handleScroll() {\n const el = scrollRef.current\n if (!el) return\n setScrolled(el.scrollLeft > 1)\n setScrollEnd(el.scrollLeft >= el.scrollWidth - el.clientWidth - 1)\n setIsOverflowing(totalWidth > el.clientWidth + 1)\n }\n\n React.useLayoutEffect(() => {\n checkOverflow()\n }, [checkOverflow])\n\n // ── Selection helpers ─────────────────────────────────────────────────────\n function getRowId(row: TData, index: number, getIdFn?: (r: TData, i: number) => string | number): string | number {\n return getIdFn ? getIdFn(row, index) : (row.id as string | number ?? index)\n }\n\n const toggleRow = React.useCallback((id: string | number) => {\n setSelected(prev => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [setSelected])\n\n const toggleAll = React.useCallback((allRowIds: (string | number)[]) => {\n setSelected(prev => prev.size === allRowIds.length ? new Set() : new Set(allRowIds))\n }, [setSelected])\n\n // ── Sticky offset calculations ────────────────────────────────────────────\n // Precompute every pinned column's offset ONCE per render so the per-cell\n // `stickyStyle()` call is an O(1) map lookup instead of an O(cols) walk.\n // With `cells = rows × cols`, the previous O(rows × cols²) became the\n // dominant cost on wide tables.\n const stickyOffsets = React.useMemo(() => {\n const left = new Map<string, number>()\n const right = new Map<string, number>()\n let leftOffset = 0\n for (const col of displayCols) {\n if (effectivePins[col.key] !== \"left\") break\n left.set(col.key, leftOffset)\n leftOffset += colWidths[col.key] ?? col.width ?? 100\n }\n let rightOffset = 0\n for (let i = displayCols.length - 1; i >= 0; i--) {\n const col = displayCols[i]\n if (effectivePins[col.key] !== \"right\") break\n right.set(col.key, rightOffset)\n rightOffset += colWidths[col.key] ?? col.width ?? 100\n }\n return { left, right }\n }, [displayCols, effectivePins, colWidths])\n\n const getStickyLeft = React.useCallback((key: string): number => {\n return stickyOffsets.left.get(key) ?? 0\n }, [stickyOffsets])\n\n const getStickyRight = React.useCallback((key: string): number => {\n return stickyOffsets.right.get(key) ?? 0\n }, [stickyOffsets])\n\n const stickyStyle = React.useCallback(\n (key: string, isHeader = false): React.CSSProperties => {\n if (isReflowViewport) return {}\n const pin = effectivePins[key]\n if (pin === \"left\") {\n return isHeader\n ? { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0 }\n }\n if (pin === \"right\") {\n return isHeader\n ? { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0 }\n }\n return isHeader ? { position: \"sticky\", top: 0 } : {}\n },\n [effectivePins, isReflowViewport, stickyOffsets],\n )\n\n return {\n // Sort\n sortRules, setSortRules,\n sortKey, sortDir,\n addSortRule, removeSortRule, toggleSortDir, handleSortByKey,\n // Filters\n search, setSearch,\n searchOpen, setSearchOpen,\n searchRef,\n activeFilters, setActiveFilters,\n filterConnectors, setFilterConnectors, toggleConnector, getConnector,\n openFilterId, setOpenFilterId,\n filterBarVisible, setFilterBarVisible,\n drawerExpandedFilters, setDrawerExpandedFilters,\n addFilter, updateFilter, removeFilter,\n // Group\n groupBy, setGroupBy,\n // Column quick-search\n colMenuSearch, setColMenuSearch,\n // Selection\n selected, setSelected, toggleRow, toggleAll, getRowId,\n // Column widths / order / pins / wrap\n colWidths, setColWidths, resizeRef, startResize,\n colOrder, setColOrder, moveCol,\n colPins, setColPins, lockedPins, LOCKED_KEYS,\n pinColumn, unpinColumn,\n colWrap, setColWrap, toggleWrap,\n // Drag-to-reorder\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n // Scroll\n scrollRef, scrolled, scrollEnd, isOverflowing,\n checkOverflow, handleScroll,\n // Hover\n hoveredRow, setHoveredRow,\n // Derived\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n getStickyLeft, getStickyRight, stickyStyle,\n totalWidth,\n // Display settings\n sheetOpen, setSheetOpen,\n sheetInitialPanel, setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n hiddenCols, setHiddenCols, toggleColVisibility,\n }\n}\n","\"use client\"\n\n/**\n * DataTable<TData> — generic reusable table (no pagination)\n *\n * Column features:\n * • Resizable — drag trailing-edge handle on any non-locked column\n * • Drag-to-reorder — drag header cell for free (unpinned) columns\n * • Pin Left / Pin Right / Unpin — per-column context menu\n * • Sort Asc / Desc — per-column context menu (sortable columns)\n * • Wrap Text / Unwrap — per-column context menu\n * • Per-column quick search\n * • Row selection (checkboxes + floating bulk action bar)\n * • Group by (collapsible group rows)\n * • Hidden columns\n *\n * WCAG 2.1 AA:\n * ✓ aria-sort on sortable <th>\n * ✓ aria-label on every icon-only button\n * ✓ Select / Actions columns: sr-only header text + resolved labels for controls\n * ✓ Row checkboxes: visible on row focus-within, stop row click propagation (default control size; extended hit slop on Checkbox)\n * ✓ Bulk-action bar: role=\"status\" aria-live=\"polite\"\n * ✓ Resize handles: role=\"separator\" aria-label\n */\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../../lib/utils\"\nimport { rafThrottle } from \"../../lib/raf-throttle\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Kbd, KbdGroup } from \"../ui/kbd\"\nimport { Tip } from \"../ui/tip\"\nimport { useModKeyLabel } from \"../../hooks/use-mod-key-label\"\nimport { isEditableTarget } from \"../../lib/editable-target\"\nimport { Checkbox } from \"../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { OPERATOR_LABELS } from \"../../lib/table-properties-types\"\nimport type { ActiveFilter } from \"../../lib/table-properties-types\"\nimport { getConditionalCellBackground } from \"../../lib/conditional-rule-match\"\nimport { formatYmdForDisplay } from \"../../lib/date-filter\"\nimport { FilterDateCalendar } from \"./filter-date-calendar\"\nimport { FilterTextValueInput } from \"./filter-text-value-input\"\nimport type { DataTableProps, ColumnDef, SortDir } from \"./types\"\nimport { useTableState } from \"./use-table-state\"\n\n/** When `ColumnDef.label` is empty, use a standard name for select/actions columns. */\nfunction defaultColumnHeaderLabel(key: string): string | undefined {\n switch (key) {\n case \"select\":\n return \"Select\"\n case \"actions\":\n return \"Actions\"\n default:\n return undefined\n }\n}\n\nfunction resolvedColumnLabel<TData>(col: ColumnDef<TData>): string {\n const t = col.label?.trim()\n if (t) return t\n return defaultColumnHeaderLabel(col.key) ?? col.key\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SortChevron = React.memo(function SortChevron({ dir }: { dir: SortDir }) {\n return (\n <i className={`fa-solid fa-arrow-${dir === \"asc\" ? \"up\" : \"down\"} ms-1 text-xs`} aria-hidden=\"true\" />\n )\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FilterPill — active filter pill with inline editor popover\n// (driven by ColumnDef.filter config rather than FILTER_FIELDS)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface FilterPillProps<TData> {\n filter: ActiveFilter\n columns: ColumnDef<TData>[]\n defaultOpen?: boolean\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n onRemove: (id: string) => void\n /** Optional custom cell renderer for filter option values */\n renderOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\nfunction FilterPillBase<TData>({\n filter,\n columns,\n defaultOpen = false,\n onUpdate,\n onRemove,\n renderOptionValue,\n}: FilterPillProps<TData>) {\n const [open, setOpen] = React.useState(false)\n const [optSearch, setOptSearch] = React.useState(\"\")\n const justAutoOpenedRef = React.useRef(false)\n\n React.useEffect(() => {\n if (defaultOpen) {\n justAutoOpenedRef.current = true\n const t = setTimeout(() => {\n setOpen(true)\n setTimeout(() => { justAutoOpenedRef.current = false }, 400)\n }, 0)\n return () => clearTimeout(t)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const col = columns.find(c => c.key === filter.fieldKey)\n const filterDef = col?.filter\n\n React.useEffect(() => {\n if (!filterDef) return\n if (filterDef.type !== \"select\" && filterDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filter.id, { operator: \"is\" })\n }\n }, [filter.id, filterDef, filter.operator, onUpdate])\n\n if (!filterDef) return null\n\n const options = filterDef.options ?? []\n const showSearch = options.length > 8\n const filteredOpts = optSearch\n ? options.filter(o => o.label.toLowerCase().includes(optSearch.toLowerCase()))\n : options\n\n const operators = filterDef.operators ?? (\n filterDef.type === \"select\" || filterDef.type === \"date\"\n ? ([\"is\", \"is_not\"] as const)\n : ([\"contains\", \"not_contains\"] as const)\n )\n\n const valueLabel = (() => {\n if (filterDef.type === \"select\") {\n if (filter.values.length === 0) return \"…\"\n if (filter.values.length === 1) {\n return options.find(o => o.value === filter.values[0])?.label ?? filter.values[0]\n }\n return `${filter.values.length} selected`\n }\n if (filterDef.type === \"date\") {\n const ymd = filter.values[0]\n return ymd ? formatYmdForDisplay(ymd) : \"…\"\n }\n return filter.values[0] || \"…\"\n })()\n\n function toggleValue(val: string) {\n const next = filter.values.includes(val)\n ? filter.values.filter(v => v !== val)\n : [...filter.values, val]\n onUpdate(filter.id, { values: next })\n }\n\n function cycleOperator() {\n const idx = operators.indexOf(filter.operator as typeof operators[number])\n const i = idx === -1 ? 0 : idx\n onUpdate(filter.id, { operator: operators[(i + 1) % operators.length] })\n }\n\n const isActive =\n filterDef.type === \"date\"\n ? Boolean(filter.values[0])\n : filter.values.length > 0\n const hasSelection = filter.values.length > 0\n const iconClass = filterDef.icon ? `fa-light ${filterDef.icon}` : \"fa-light fa-filter\"\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n className={cn(\n \"inline-flex cursor-pointer items-center rounded border text-xs transition-colors\",\n isActive ? \"border-brand/45 bg-brand/10\" : \"border-input bg-background\"\n )}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex cursor-pointer items-center gap-1 h-6 ps-2 pe-1.5 rounded-s transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n )}\n >\n <i\n className={cn(iconClass, \"text-xs\", isActive ? \"text-brand\" : \"text-muted-foreground\")}\n aria-hidden=\"true\"\n />\n <span className=\"text-foreground\">{col.label}</span>\n {isActive && <span className=\"text-foreground font-medium\">{valueLabel}</span>}\n </button>\n </PopoverTrigger>\n <button\n type=\"button\"\n aria-label={`Remove ${col.label} filter`}\n onClick={() => onRemove(filter.id)}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center h-6 w-5 rounded-e transition-colors\",\n \"text-muted-foreground hover:text-destructive\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n </PopoverAnchor>\n\n <PopoverContent\n className={cn(\n \"p-0\",\n filterDef.type === \"date\"\n ? \"w-auto max-w-[min(calc(100vw-2rem),22rem)]\"\n : \"w-64\",\n )}\n align=\"start\"\n onFocusOutside={e => e.preventDefault()}\n onInteractOutside={e => {\n if (justAutoOpenedRef.current) {\n e.preventDefault()\n justAutoOpenedRef.current = false\n }\n }}\n >\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <div className=\"flex items-center gap-1 text-sm text-foreground\">\n <span className=\"font-medium\">{col.label}</span>\n <button\n type=\"button\"\n onClick={cycleOperator}\n className=\"inline-flex items-center gap-0.5 text-muted-foreground hover:text-interactive-hover-foreground transition-colors rounded px-1 py-0.5 hover:bg-interactive-hover\"\n >\n {OPERATOR_LABELS[filter.operator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <button\n type=\"button\"\n aria-label=\"Remove filter\"\n onClick={() => onRemove(filter.id)}\n className=\"text-muted-foreground hover:text-destructive transition-colors p-1 rounded hover:bg-interactive-hover\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {filterDef.type === \"date\" && (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${col.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filter.id, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n )}\n\n {filterDef.type === \"select\" && (\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n {showSearch && (\n <div className=\"px-2 pt-1 pb-1\">\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder=\"Search options…\"\n value={optSearch}\n onChange={e => setOptSearch(e.target.value)}\n className={cn(\"h-7 text-xs\", optSearch ? \"pe-8\" : \"pe-2\")}\n autoFocus\n />\n {optSearch ? (\n <button\n type=\"button\"\n aria-label=\"Clear option search\"\n onClick={() => setOptSearch(\"\")}\n className=\"absolute end-1 top-1/2 -translate-y-1/2 inline-flex size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n </div>\n )}\n {filteredOpts.map(opt => {\n const checked = filter.values.includes(opt.value)\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={checked}\n tabIndex={0}\n onClick={() => toggleValue(opt.value)}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); toggleValue(opt.value) } }}\n className=\"flex w-full items-center gap-2.5 px-3 py-1.5 text-sm hover:bg-interactive-hover transition-colors cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"checkbox\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[4px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}\n >\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"8px\" }} />}\n </span>\n {renderOptionValue\n ? renderOptionValue(filter.fieldKey, opt.value)\n : <span className=\"text-foreground\">{opt.label}</span>\n }\n </div>\n )\n })}\n {filteredOpts.length === 0 && (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">No options found</p>\n )}\n </div>\n )}\n\n {filterDef.type === \"text\" && (\n <div className=\"p-2\">\n <FilterTextValueInput\n mask={filterDef.textMask}\n placeholder={`Enter ${col.label.toLowerCase()}…`}\n value={filter.values[0] ?? \"\"}\n onValueChange={next => onUpdate(filter.id, { values: [next] })}\n aria-label={`${col.label} filter value`}\n className=\"h-8 text-xs focus-visible:border-ring focus-visible:ring-ring/50\"\n autoFocus\n />\n </div>\n )}\n {hasSelection ? (\n <div className=\"sticky bottom-0 border-t border-border bg-popover p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filter.id, { values: [] })}\n className=\"w-full justify-center gap-1.5 text-xs text-muted-foreground\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n Clear selection\n </Button>\n </div>\n ) : null}\n </PopoverContent>\n </Popover>\n )\n}\n\n// React.memo wrapper — preserves generic signature via cast.\n// FilterPillBase is a pure function of its props; memoizing it prevents\n// re-renders when unrelated table state (hover, scroll) changes.\nconst FilterPill = React.memo(FilterPillBase) as typeof FilterPillBase\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sticky shadow utility\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction stickyShadow(pin: \"left\" | \"right\" | undefined): string {\n if (!pin) return \"\"\n const base = \"after:content-[''] after:absolute after:top-0 after:bottom-0 after:w-3 after:pointer-events-none\"\n if (pin === \"left\") {\n return cn(\n base,\n \"after:start-full\",\n \"after:bg-[linear-gradient(to_right,var(--sticky-edge-fade),transparent)]\",\n )\n }\n return cn(\n base,\n \"after:end-full\",\n \"after:bg-[linear-gradient(to_left,var(--sticky-edge-fade),transparent)]\",\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTableToolbar — search, filter bar, properties slot (shared by table + board)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function DataTableToolbar<TData extends Record<string, unknown>>({\n state,\n columns,\n searchable = true,\n /** When false, hides filter pills, search, and filter controls (e.g. dashboard canvas edit mode). */\n showQueryControls = true,\n renderFilterOptionValue,\n toolbarSlot,\n searchAriaLabel = \"Search table\",\n}: {\n state: ReturnType<typeof useTableState<TData>>\n columns: ColumnDef<TData>[]\n searchable?: boolean\n showQueryControls?: boolean\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Passed to the search input `aria-label` (e.g. \"Search placements\") */\n searchAriaLabel?: string\n}) {\n const {\n search, setSearch, searchOpen, setSearchOpen, searchRef,\n activeFilters, setActiveFilters, openFilterId,\n filterBarVisible, setFilterBarVisible,\n addFilter, updateFilter, removeFilter,\n } = state\n\n const filterableCols = columns.filter(c => c.filter)\n const searchModLabel = useModKeyLabel()\n const effectiveSearchable = showQueryControls && searchable\n\n React.useEffect(() => {\n if (!effectiveSearchable) return\n function onGlobalKeyDown(e: KeyboardEvent) {\n if (!e.metaKey && !e.ctrlKey) return\n if (e.altKey) return\n if (e.key.toLowerCase() !== \"k\") return\n if (isEditableTarget(e.target)) return\n e.preventDefault()\n setSearchOpen(true)\n queueMicrotask(() => searchRef.current?.focus())\n }\n document.addEventListener(\"keydown\", onGlobalKeyDown)\n return () => document.removeEventListener(\"keydown\", onGlobalKeyDown)\n }, [effectiveSearchable, setSearchOpen, searchRef])\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 px-4 lg:px-6\",\n showQueryControls ? \"min-h-10 pt-2 pb-2\" : \"min-h-0 justify-end py-1.5\",\n )}\n >\n\n {showQueryControls && filterBarVisible && filterableCols.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 flex-1 min-w-0\">\n {activeFilters.map(filter => (\n <React.Fragment key={filter.id}>\n <FilterPill\n filter={filter}\n columns={columns}\n defaultOpen={filter.id === openFilterId}\n onUpdate={updateFilter}\n onRemove={removeFilter}\n renderOptionValue={renderFilterOptionValue}\n />\n </React.Fragment>\n ))}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\"\n className=\"inline-flex cursor-pointer items-center gap-1 h-6 px-2 rounded text-xs text-muted-foreground hover:text-interactive-hover-foreground border border-dashed border-input/70 hover:border-input hover:bg-interactive-hover-subtle transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {activeFilters.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setActiveFilters([])}\n className=\"cursor-pointer text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors px-1\"\n >\n Clear all\n </button>\n )}\n </div>\n )}\n\n <div\n className={cn(\n \"flex items-center gap-1 shrink-0\",\n showQueryControls && \"ms-auto\",\n )}\n >\n\n {effectiveSearchable && (\n searchOpen ? (\n <div className=\"relative flex items-center\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2.5 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n ref={searchRef}\n type=\"text\"\n role=\"searchbox\"\n inputMode=\"search\"\n autoComplete=\"off\"\n placeholder=\"Search…\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n onBlur={() => { if (!search) setSearchOpen(false) }}\n onKeyDown={e => { if (e.key === \"Escape\") { setSearch(\"\"); setSearchOpen(false) } }}\n className={cn(\"h-8 w-48 ps-7 text-xs\", search ? \"pe-8\" : \"pe-2\")}\n aria-label={searchAriaLabel}\n />\n {search ? (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setSearch(\"\")}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 inline-flex cursor-pointer size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n ) : (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label=\"Search\"\n onClick={() => { setSearchOpen(true); setTimeout(() => searchRef.current?.focus(), 10) }}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-magnifying-glass text-[13px]\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <span>{searchAriaLabel}</span>\n <KbdGroup>\n <Kbd>{searchModLabel}</Kbd>\n <Kbd>K</Kbd>\n </KbdGroup>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n )}\n\n {showQueryControls && filterableCols.length > 0 && (\n <>\n <div className=\"h-4 w-px bg-border/70\" aria-hidden=\"true\" />\n {activeFilters.length > 0 ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\"\n aria-label={filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n onClick={() => setFilterBarVisible(v => !v)}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center gap-1 size-8 justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterBarVisible\n ? \"bg-accent text-accent-foreground hover:bg-accent/90\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n <span className=\"text-xs font-semibold tabular-nums\">{activeFilters.length}</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n // NOTE: Tooltip MUST wrap DropdownMenuTrigger directly (not the\n // surrounding <DropdownMenu> wrapper). Radix `asChild` Slot needs\n // a real DOM child — `<DropdownMenu>` is a logical wrapper, so\n // putting it inside TooltipTrigger swallows the tooltip handlers\n // and the hover hint silently disappears.\n <DropdownMenu>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" aria-label=\"Add filter\"\n onClick={() => setFilterBarVisible(true)}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Add filter</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </>\n )}\n\n {toolbarSlot && toolbarSlot(state)}\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTable<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTableExtendedProps<TData extends Record<string, unknown>>\n extends DataTableProps<TData> {\n /** Slot for a toolbar drawer button + drawer itself (e.g. TablePropertiesDrawer) */\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Slot rendered inside the floating bulk-action bar (after the \"N selected\" label) */\n bulkActionsSlot?: (selected: Set<string | number>, rows: TData[]) => React.ReactNode\n /** Optional \"add new row\" row text — pass false to hide */\n addRowLabel?: string | false\n /** Custom option-value renderer for filter pills */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** When set by DataTablePaginated — drives row slicing inside useTableState */\n paginationOverride?: { page: number; pageSize: number }\n /** When true, removes rounded bottom corners so a pagination bar can attach flush */\n hasFooter?: boolean\n /** Conditional formatting rules — apply bg color to cells based on value */\n conditionalRules?: import(\"./types\").ConditionalRule[]\n /** When false, the column header row is hidden (Display options). */\n showColumnHeaders?: boolean\n /** When set, table uses this state (e.g. shared with board view) instead of internal useTableState. */\n state?: ReturnType<typeof useTableState<TData>>\n}\n\ntype DataTableInnerProps<TData extends Record<string, unknown>> = DataTableExtendedProps<TData> & {\n state: ReturnType<typeof useTableState<TData>>\n}\n\n/** Max width for bulk bar in normal (non-reflow) zoom — ~28rem, centered in table. */\nconst BULK_BAR_MAX_PX = 448\n\n/**\n * When the app theme is `dark`, the bulk strip is a **light** surface; shadcn\n * “dark:” button tokens are wrong — reapply light-look solid/outline/destructive/ghost.\n */\nconst BULK_BAR_ON_LIGHT_STRIP = cn(\n \"[&_button[data-variant=default]]:bg-zinc-900 [&_button[data-variant=default]]:text-zinc-50\",\n \"hover:[&_button[data-variant=default]]:bg-zinc-800\",\n \"[&_button[data-variant=outline]]:border-zinc-300/80 [&_button[data-variant=outline]]:bg-white [&_button[data-variant=outline]]:text-zinc-900\",\n \"hover:[&_button[data-variant=outline]]:bg-zinc-100\",\n \"[&_button[data-variant=destructive]]:border-rose-200/80 [&_button[data-variant=destructive]]:bg-rose-100 [&_button[data-variant=destructive]]:text-rose-800\",\n \"hover:[&_button[data-variant=destructive]]:bg-rose-200/40\",\n \"[&_button[data-variant=ghost]]:text-zinc-600 hover:[&_button[data-variant=ghost]]:bg-zinc-200/70 hover:[&_button[data-variant=ghost]]:text-zinc-900\",\n)\n\n/**\n * Pins the bulk bar to the viewport bottom, aligned to the table scroll\n * wrapper. When `fullWidth` is false (normal zoom), width is\n * `min(tableWidth, 28rem)` and centered; when true (reflow), matches table\n * width.\n */\nfunction useBulkBarFixedToTableScrollEl(\n scrollRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n fullWidth: boolean,\n): React.CSSProperties | undefined {\n const [style, setStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n React.useLayoutEffect(() => {\n if (!active) {\n setStyle(undefined)\n return\n }\n const el = scrollRef.current\n if (!el) {\n setStyle(undefined)\n return\n }\n const apply = () => {\n const r = el.getBoundingClientRect()\n let left = r.left\n let width = r.width\n if (!fullWidth) {\n const w = Math.min(r.width, BULK_BAR_MAX_PX)\n left = r.left + (r.width - w) / 2\n width = w\n }\n setStyle({\n position: \"fixed\",\n left,\n width,\n bottom: \"max(0.5rem, env(safe-area-inset-bottom, 0px))\",\n zIndex: 50,\n boxSizing: \"border-box\",\n margin: 0,\n right: \"auto\",\n })\n }\n apply()\n // rAF-coalesce so a single frame handles bursts of capture-phase scroll\n // events plus the ResizeObserver firing — instead of N getBoundingClientRect\n // + setState per second.\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(el)\n el.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n window.addEventListener(\"scroll\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n el.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"resize\", scheduled)\n window.removeEventListener(\"scroll\", scheduled)\n }\n }, [active, fullWidth, scrollRef])\n return style\n}\n\nfunction DataTableInner<TData extends Record<string, unknown>>({\n // `data` / `defaultSort` flow into `useTableState` upstream; the inner table\n // reads them via `state` and never directly here. Keep the prop slots so\n // the public `DataTable<TData>` API stays unchanged.\n data: _data,\n columns,\n getRowId: getRowIdProp,\n getRowSelectionLabel,\n selectable = true,\n searchable = true,\n emptyState,\n onRowClick,\n defaultSort: _defaultSort,\n toolbarSlot,\n bulkActionsSlot,\n addRowLabel = false,\n renderFilterOptionValue,\n hasFooter = false,\n conditionalRules,\n showColumnHeaders = true,\n state,\n}: DataTableInnerProps<TData>) {\n const {\n setSortRules,\n sortKey, sortDir,\n handleSortByKey,\n addFilter,\n groupBy, setGroupBy,\n colMenuSearch, setColMenuSearch,\n selected, setSelected, toggleRow, toggleAll, getRowId,\n colWidths, startResize,\n colPins, lockedPins,\n pinColumn, unpinColumn,\n colWrap, toggleWrap,\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n scrollRef, handleScroll, checkOverflow,\n isOverflowing,\n setHoveredRow,\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n stickyStyle,\n totalWidth,\n rowHeight,\n showGridlines,\n setSheetOpen,\n setSheetInitialPanel,\n } = state\n\n // Mount overflow check + scrollport width for sticky group headers on horizontal scroll.\n // Re-run when column widths / visibility change — scrollWidth alone is unreliable when\n // the table used to stretch with `w-full` (scrollWidth === clientWidth even with many cols).\n React.useLayoutEffect(() => {\n const syncScrollport = () => {\n const el = scrollRef.current\n if (el) {\n el.style.setProperty(\"--dt-scrollport-width\", `${el.clientWidth}px`)\n }\n checkOverflow()\n }\n syncScrollport()\n const el = scrollRef.current\n if (!el) return\n const ro = new ResizeObserver(syncScrollport)\n ro.observe(el)\n const table = el.querySelector(\"table\")\n if (table) ro.observe(table)\n return () => ro.disconnect()\n }, [totalWidth, displayCols.length, checkOverflow])\n\n /** Pending action queued from a column-menu item that should run *after* the menu\n * has fully closed. The Properties drawer is a non-modal Radix Sheet (`modal=false`)\n * and Radix's DropdownMenu close cycle races with the Sheet's `onInteractOutside`\n * / focus-return logic if we open the Sheet synchronously from `onSelect` / `onClick`.\n * `onCloseAutoFocus` on `DropdownMenuContent` is the Radix-native hook that fires\n * after the menu has unmounted and focus has returned — the safe moment to act. */\n const columnMenuPendingActionRef = React.useRef<(() => void) | null>(null)\n\n /** One-time horizontal nudge when the grid overflows and pins are active — hints that more columns scroll (overlay scrollbars, esp. Windows, are often invisible until interaction). */\n const pinnedScrollHintDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (!isOverflowing || isReflowViewport || Object.keys(colPins).length === 0) return\n if (pinnedScrollHintDoneRef.current) return\n const el = scrollRef.current\n if (!el) return\n if (el.scrollLeft > 2) return\n const maxScroll = el.scrollWidth - el.clientWidth\n if (maxScroll < 16) return\n if (typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n pinnedScrollHintDoneRef.current = true\n return\n }\n\n pinnedScrollHintDoneRef.current = true\n const delta = Math.min(96, Math.max(28, Math.round(maxScroll * 0.14)))\n const startDelayMs = 320\n const dwellMs = 520\n\n const t1 = window.setTimeout(() => {\n el.scrollTo({ left: delta, behavior: \"smooth\" })\n }, startDelayMs)\n const t2 = window.setTimeout(() => {\n el.scrollTo({ left: 0, behavior: \"smooth\" })\n }, startDelayMs + dwellMs)\n\n return () => {\n window.clearTimeout(t1)\n window.clearTimeout(t2)\n }\n }, [isOverflowing, isReflowViewport, colPins, scrollRef])\n\n const lastLeftPinKey = [...displayCols].reverse().find(c => effectivePins[c.key] === \"left\")?.key\n const firstRightPinKey = displayCols.find(c => effectivePins[c.key] === \"right\")?.key\n\n function floatingHeaderPinnedStyle(key: string): React.CSSProperties | undefined {\n const pin = effectivePins[key]\n if (!pin) return undefined\n\n const visibleWidth =\n typeof floatingHeaderStyle?.width === \"number\"\n ? floatingHeaderStyle.width\n : tableWrapRef.current?.clientWidth ?? floatingHeaderTableWidth\n const maxScroll = Math.max(0, floatingHeaderTableWidth - visibleWidth)\n const translateX = pin === \"left\"\n ? headerScrollLeft\n : headerScrollLeft - maxScroll\n\n // The floating sticky header is horizontally translated as one table.\n // Counter-translate pinned header cells so they remain locked to the viewport edge.\n return { position: \"relative\", transform: `translateX(${translateX}px)` }\n }\n\n // Row IDs for the current visible rows\n const allRowIds = rows.map((r, i) => getRowId(r, i, getRowIdProp))\n const allSelected = rows.length > 0 && selected.size === rows.length\n const someSelected = selected.size > 0 && !allSelected\n const anySelected = selected.size > 0\n\n const { resolvedTheme } = useTheme()\n const isAppDark = resolvedTheme === \"dark\"\n\n const bulkBarUseFixedLayout = anySelected\n /** Reflow: bar spans table width. Normal zoom: bar centered, max 28rem. */\n const bulkBarFixedStyle = useBulkBarFixedToTableScrollEl(\n scrollRef,\n bulkBarUseFixedLayout,\n isReflowViewport,\n )\n const tableWrapRef = React.useRef<HTMLDivElement | null>(null)\n const tableHeadRef = React.useRef<HTMLTableSectionElement | null>(null)\n const [headerIsStuck, setHeaderIsStuck] = React.useState(false)\n const [headerScrollLeft, setHeaderScrollLeft] = React.useState(0)\n const [floatingHeaderStyle, setFloatingHeaderStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n const [floatingHeaderTableWidth, setFloatingHeaderTableWidth] = React.useState(totalWidth)\n const [isClient, setIsClient] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n }, [])\n\n React.useEffect(() => {\n const wrapEl = tableWrapRef.current\n const headEl = tableHeadRef.current\n if (!wrapEl || !headEl || !showColumnHeaders) {\n setHeaderIsStuck(false)\n return\n }\n\n const update = () => {\n const wrapRect = wrapEl.getBoundingClientRect()\n const headHeight = headEl.getBoundingClientRect().height || 0\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const stuck = wrapRect.top <= headerOffset && wrapRect.bottom > (headHeight + headerOffset + 1)\n setHeaderIsStuck(prev => (prev === stuck ? prev : stuck))\n }\n\n update()\n const scheduled = rafThrottle(update)\n // Listen on the table scrollport + window resize only. Avoid capture-phase\n // `window` scroll — it fires for every nested scroll container (sidebar,\n // secondary panel, sheets) and kept the main thread busy while the app looked idle.\n wrapEl.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n wrapEl.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [showColumnHeaders, rows.length, displayCols.length])\n\n React.useLayoutEffect(() => {\n if (!headerIsStuck || !showColumnHeaders) {\n setFloatingHeaderStyle(undefined)\n return\n }\n const wrapEl = tableWrapRef.current\n if (!wrapEl) {\n setFloatingHeaderStyle(undefined)\n return\n }\n\n const apply = () => {\n const rect = wrapEl.getBoundingClientRect()\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const cs = getComputedStyle(wrapEl)\n const borderLeft = parseFloat(cs.borderLeftWidth) || 0\n const borderRight = parseFloat(cs.borderRightWidth) || 0\n const visibleWidth = Math.max(0, wrapEl.clientWidth - borderLeft - borderRight)\n const renderedTableWidth = Math.max(\n totalWidth,\n visibleWidth,\n wrapEl.querySelector(\"table\")?.getBoundingClientRect().width ?? 0,\n )\n setFloatingHeaderStyle({\n position: \"fixed\",\n top: headerOffset,\n left: rect.left + borderLeft,\n width: visibleWidth,\n zIndex: 50,\n })\n setFloatingHeaderTableWidth(renderedTableWidth)\n setHeaderScrollLeft(wrapEl.scrollLeft)\n }\n\n apply()\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(wrapEl)\n window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n window.removeEventListener(\"scroll\", scheduled, { capture: true })\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [headerIsStuck, showColumnHeaders, totalWidth, displayCols.length])\n\n function ariaSortAttr(colKey: string): React.AriaAttributes[\"aria-sort\"] {\n return sortKey !== colKey ? \"none\" : sortDir === \"asc\" ? \"ascending\" : \"descending\"\n }\n\n function cellStyle(key: string): React.CSSProperties {\n return stickyStyle(key)\n }\n\n // ─── Render ───────────────────────────────────────────────────────────────\n return (\n <div className=\"flex min-w-0 w-full flex-col gap-0\">\n\n <DataTableToolbar\n state={state}\n columns={columns}\n searchable={searchable}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={toolbarSlot}\n searchAriaLabel=\"Search table\"\n />\n\n {isClient && showColumnHeaders && headerIsStuck && floatingHeaderStyle\n ? createPortal(\n <div\n style={floatingHeaderStyle}\n className=\"pointer-events-auto\"\n >\n <div className=\"overflow-hidden border border-border bg-dt-header-bg shadow-[0_10px_18px_-14px_rgba(15,23,42,0.5)] dark:shadow-[0_12px_20px_-14px_rgba(0,0,0,0.75)]\">\n <div style={{ transform: `translateX(${-headerScrollLeft}px)` }}>\n <table\n className=\"w-full text-sm border-separate border-spacing-0\"\n style={{ tableLayout: \"fixed\", width: floatingHeaderTableWidth }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n <thead className=\"bg-dt-header-bg\">\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n return (\n <th\n key={col.key}\n scope=\"col\"\n style={floatingHeaderPinnedStyle(col.key)}\n className={cn(\n \"h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isPinned && \"relative\",\n isEdgePinCol && stickyShadow(effectivePins[col.key]),\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\",\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key ? <SortChevron dir={sortDir} /> : null}\n </button>\n ) : (\n <span className=\"truncate whitespace-nowrap\">\n {col.label?.trim()\n ? col.label\n : defaultColumnHeaderLabel(col.key) ?? col.key}\n </span>\n )}\n </div>\n </div>\n </th>\n )\n })}\n </tr>\n </thead>\n </table>\n </div>\n </div>\n </div>,\n document.body,\n )\n : null}\n\n {/* ── Table ────────────────────────────────────────────────────────── */}\n <div\n ref={el => {\n tableWrapRef.current = el\n scrollRef.current = el\n }}\n onScroll={e => {\n handleScroll()\n setHeaderScrollLeft((e.currentTarget as HTMLDivElement).scrollLeft)\n }}\n className={cn(\n \"mx-4 lg:mx-6 overflow-x-auto border-t border-x border-border\",\n hasFooter ? \"rounded-t-lg\" : \"border-b rounded-lg\",\n )}\n >\n <table\n className=\"text-sm border-separate border-spacing-0\"\n style={{\n tableLayout: \"fixed\",\n // Explicit column-sum width — `w-full` made the grid stretch to the scrollport\n // so scrollWidth === clientWidth and the overflow-gated pin rule never fired.\n width: totalWidth,\n }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n\n {/* ── Table head ──────────────────────────────────────────────── */}\n <thead\n ref={tableHeadRef}\n className={cn(\n \"bg-dt-header-bg\",\n headerIsStuck && \"invisible\",\n !showColumnHeaders && \"hidden\"\n )}\n >\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isLocked = !!lockedPins[col.key]\n const isFree = !colPins[col.key]\n const isResizable = !isLocked || (col.key !== \"select\")\n\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={col.sortable && col.sortKey ? ariaSortAttr(col.sortKey as string) : undefined}\n draggable={isFree}\n onDragStart={isFree ? e => handleDragStart(col.key, e) : undefined}\n onDragOver={isFree ? e => handleDragOver(col.key, e) : undefined}\n onDrop={isFree ? () => handleDrop(col.key) : undefined}\n onDragEnd={isFree ? handleDragEnd : undefined}\n style={stickyStyle(col.key, false)}\n className={cn(\n \"group/th relative h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isFree && \"cursor-grab active:cursor-grabbing\",\n dragOverKey === col.key && draggedKey.current !== col.key && \"bg-accent/40\",\n isEdgePinCol && stickyShadow(effectivePins[col.key])\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.header ? (\n col.header()\n ) : col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <Tip label={`Sort by ${resolvedColumnLabel(col)}`} side=\"top\">\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\"\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key && <SortChevron dir={sortDir} />}\n </button>\n </Tip>\n ) : (\n <Tip label={resolvedColumnLabel(col)} side=\"top\">\n <span className=\"whitespace-nowrap\">\n {col.label?.trim() ? (\n col.label\n ) : defaultColumnHeaderLabel(col.key) ? (\n <span className=\"sr-only\">{defaultColumnHeaderLabel(col.key)}</span>\n ) : (\n <span className=\"sr-only\">{col.key}</span>\n )}\n </span>\n </Tip>\n )}\n </div>\n\n {/* Column context menu — not on checkbox or locked-right columns */}\n {col.key !== \"select\" && !lockedPins[col.key]?.includes(\"right\") && col.key !== (columns.find(c => c.lockPin && c.defaultPin === \"right\")?.key) && (\n <DropdownMenu>\n <Tip label=\"Column options\" side=\"top\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`${resolvedColumnLabel(col)} column options`}\n onClick={e => e.stopPropagation()}\n className={cn(\n \"opacity-0 group-hover/th:opacity-100 group-focus-within/th:opacity-100\",\n \"inline-flex shrink-0 items-center justify-center size-7 rounded-md\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover-row\",\n \"transition-opacity focus-visible:opacity-100\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-ellipsis-vertical text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={() => {\n const action = columnMenuPendingActionRef.current\n if (!action) return\n columnMenuPendingActionRef.current = null\n action()\n }}\n >\n\n {/* Column quick-search */}\n <div className=\"px-2 pt-2 pb-1\">\n <div className=\"relative\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n placeholder={`Search ${resolvedColumnLabel(col)}…`}\n value={colMenuSearch[col.key] ?? \"\"}\n onChange={e => setColMenuSearch(prev => ({ ...prev, [col.key]: e.target.value }))}\n onKeyDown={e => e.stopPropagation()}\n className=\"h-7 ps-6 text-xs\"\n />\n {colMenuSearch[col.key] && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setColMenuSearch(prev => ({ ...prev, [col.key]: \"\" }))}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-interactive-hover-foreground transition-colors\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <DropdownMenuSeparator />\n\n {/* Pin options */}\n {!isLocked && (\n <>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"left\")}\n disabled={colPins[col.key] === \"left\"}\n >\n <i className=\"fa-light fa-arrow-left-to-line\" aria-hidden=\"true\" />\n Pin Left\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"right\")}\n disabled={colPins[col.key] === \"right\"}\n >\n <i className=\"fa-light fa-arrow-right-to-line\" aria-hidden=\"true\" />\n Pin Right\n </DropdownMenuItem>\n {colPins[col.key] && (\n <DropdownMenuItem onClick={() => unpinColumn(col.key)}>\n <i className=\"fa-light fa-thumbtack-slash\" aria-hidden=\"true\" />\n Unpin\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Sort options */}\n {col.sortable && col.sortKey && (\n <>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"asc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-up-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"desc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-down-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Descending\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Text wrap toggle */}\n <DropdownMenuItem onClick={() => toggleWrap(col.key)}>\n <i className=\"fa-light fa-text-width\" aria-hidden=\"true\" />\n {colWrap[col.key] ? \"Unwrap Text\" : \"Wrap Text\"}\n </DropdownMenuItem>\n\n {/* Filter / Group by */}\n <DropdownMenuSeparator />\n {col.filter && (\n <DropdownMenuItem onClick={() => addFilter(col.key)}>\n <i className=\"fa-light fa-filter\" aria-hidden=\"true\" />\n Filter by this column\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => setGroupBy(groupBy === col.key ? null : col.key)}\n >\n <i className=\"fa-light fa-layer-group\" aria-hidden=\"true\" />\n {groupBy === col.key ? \"Remove Grouping\" : \"Group by this Column\"}\n </DropdownMenuItem>\n\n {/* Conditional rule shortcut */}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => {\n // Queue the deep-link into `onCloseAutoFocus` (above).\n // Opening the non-modal Properties Sheet synchronously\n // here races with the DropdownMenu close cycle and the\n // Sheet's outside-interaction listener — neither RAF\n // nor setTimeout(0) is enough. `onCloseAutoFocus` is\n // Radix's official \"menu is fully closed and focus has\n // returned\" hook, so it's the only safe moment.\n // Set the panel + open in the same batched action —\n // both setState calls land in one render so the drawer\n // opens already focused on the Conditional rules panel.\n columnMenuPendingActionRef.current = () => {\n setSheetInitialPanel(\"conditional-rules\")\n setSheetOpen(true)\n }\n }}\n >\n <i className=\"fa-light fa-palette\" aria-hidden=\"true\" />\n Add Conditional Rule\n </DropdownMenuItem>\n\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n\n {/* Resize handle */}\n {isResizable && col.key !== \"select\" && (\n <div\n role=\"separator\"\n aria-label={`Resize ${resolvedColumnLabel(col)} column`}\n aria-orientation=\"vertical\"\n onMouseDown={e => startResize(col.key, e)}\n className=\"absolute end-0 top-1 bottom-1 w-1.5 cursor-col-resize rounded-full hover:bg-interactive-hover-foreground/50 active:bg-muted-foreground/70 transition-colors\"\n />\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n\n {/* ── Table body ───────────────────────────────────────────────── */}\n <tbody>\n {(pagedRows !== rows\n ? [{ groupKey: null as string | null, groupLabel: null as string | null, rows: pagedRows }]\n : groupedRows\n ).map(({ groupKey, groupLabel, rows: groupRows }) => (\n <React.Fragment key={groupKey ?? \"__all__\"}>\n {groupLabel && (\n <tr>\n <td colSpan={displayCols.length} className=\"p-0 border-b border-border bg-dt-group-bg\">\n <div\n className={cn(\n \"sticky start-0 z-[25] px-4 py-1.5 text-xs font-semibold text-muted-foreground tracking-wide bg-dt-group-bg select-none\",\n !isReflowViewport && \"shadow-[4px_0_8px_-4px_var(--sticky-edge-fade)]\",\n )}\n style={{ width: \"var(--dt-scrollport-width, 100%)\" }}\n >\n {groupLabel}\n <span className=\"ms-2 font-normal normal-case opacity-60 tracking-normal\">\n {groupRows.length} record{groupRows.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n </td>\n </tr>\n )}\n {groupRows.map((row, rowIndex) => {\n const rowId = getRowId(row, rowIndex, getRowIdProp)\n const isSelected = selected.has(rowId)\n const rowClickable = Boolean(onRowClick) || selectable\n function handleRowClick(e: React.MouseEvent<HTMLTableRowElement>) {\n if (!rowClickable) return\n const el = e.target as HTMLElement | null\n if (!el) return\n if (el.closest(\"button, a, input, textarea, select, label, [role='checkbox']\")) return\n if (onRowClick) {\n onRowClick(row)\n return\n }\n if (selectable) {\n toggleRow(rowId)\n }\n }\n return (\n <tr\n key={String(rowId)}\n data-state={isSelected ? \"selected\" : undefined}\n onMouseEnter={() => setHoveredRow(rowId)}\n onMouseLeave={() => setHoveredRow(null)}\n onClick={rowClickable ? handleRowClick : undefined}\n data-new={Boolean((row as Record<string, unknown>).isNew) || undefined}\n className={cn(\n \"group/row transition-colors\",\n \"hover:bg-dt-row-hover\",\n isSelected && \"bg-dt-row-selected text-dt-row-selected-fg\",\n rowClickable && \"cursor-pointer\",\n Boolean((row as Record<string, unknown>).isNew) && \"bg-dt-new-row-bg border-s-2 border-s-dt-new-row-border\"\n )}\n >\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const wrap = colWrap[col.key]\n const isEdgePin = col.key === lastLeftPinKey || col.key === firstRightPinKey\n const rowPy = rowHeight === \"compact\" ? \"py-1\" : rowHeight === \"comfortable\" ? \"py-4\" : \"py-2.5\"\n const cs = cellStyle(col.key)\n\n const tdBase = cn(\n `px-3 ${rowPy} align-middle max-w-0`,\n showGridlines && !isEdgePin && \"border-e border-border last:border-e-0\",\n \"border-b border-border group-last/row:border-b-0\",\n isPinned && [\n \"z-20 pinned-cell relative\",\n \"bg-dt-row-bg\",\n \"group-data-[state=selected]/row:bg-dt-row-selected\",\n \"group-hover/row:bg-dt-row-hover\",\n isEdgePin && stickyShadow(effectivePins[col.key]),\n ]\n )\n\n const conditionalBg = getConditionalCellBackground(\n row,\n col.key,\n conditionalRules,\n columns,\n )\n\n const tdStyle = conditionalBg\n ? { ...cs, background: conditionalBg }\n : cs\n\n // Special synthetic columns\n if (col.key === \"select\") {\n const selectionLabel = getRowSelectionLabel?.(row, rowIndex)\n const ariaLabel = selectionLabel\n ? `Select row, ${selectionLabel}`\n : `Select row ${rowIndex + 1}`\n return (\n <td key=\"select\" className={cn(tdBase, \"text-center\")} style={tdStyle}>\n {selectable && (\n // inline-flex: inline elements inside <td> are never\n // stretched by table-cell height in Chrome/Safari/Firefox.\n // Block-level flex/grid always inherits full cell height at zoom.\n <span\n className={cn(\n \"inline-flex items-center justify-center transition-opacity\",\n anySelected\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100\",\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => toggleRow(rowId)}\n aria-label={ariaLabel}\n onClick={e => e.stopPropagation()}\n />\n </span>\n )}\n </td>\n )\n }\n\n // Custom cell renderer\n if (col.cell) {\n return (\n <td\n key={col.key}\n className={cn(\n tdBase,\n // When wrap is on, override truncate/overflow on any descendant\n wrap && \"[&_.truncate]:!whitespace-normal [&_.truncate]:!overflow-visible [&_.truncate]:!text-clip\",\n )}\n style={tdStyle}\n >\n <div className=\"min-w-0 overflow-hidden\">\n {col.cell(row, {\n rowIndex,\n selected: isSelected,\n onSelect: checked => checked ? setSelected(prev => new Set([...prev, rowId])) : toggleRow(rowId),\n })}\n </div>\n </td>\n )\n }\n\n // Default: render string value with optional truncation\n const rawVal = String(row[col.key] ?? \"\")\n return (\n <td key={col.key} className={cn(tdBase, \"text-sm text-foreground/80\")} style={tdStyle}>\n <div className=\"min-w-0 overflow-hidden\">\n <span className={wrap ? \"whitespace-normal\" : \"block truncate\"} title={!wrap ? rawVal : undefined}>\n {rawVal}\n </span>\n </div>\n </td>\n )\n })}\n </tr>\n )\n })}\n </React.Fragment>\n ))}\n\n {/* Empty state */}\n {rows.length === 0 && (\n <tr>\n <td colSpan={displayCols.length} className=\"h-24 px-3 text-center text-sm text-muted-foreground\">\n {emptyState ?? \"No results match your filters.\"}\n </td>\n </tr>\n )}\n\n {/* Add new row stub */}\n {addRowLabel !== false && (\n <tr\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") e.preventDefault() }}\n className=\"cursor-pointer hover:bg-dt-row-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n aria-label={`Add new ${addRowLabel}`}\n >\n <td colSpan={displayCols.length} className=\"px-3 py-2.5 align-middle\">\n <span className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n {addRowLabel}\n </span>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Bulk selection bar — dark strip in light app; light strip in dark app.\n Normal zoom: max ~28rem, centered. Reflow: full table width. Inner\n `dark` in light app → shadcn `dark:` buttons; in dark app → explicit\n light-surface button overrides.\n */}\n {anySelected && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${selected.size} row${selected.size !== 1 ? \"s\" : \"\"} selected`}\n data-exxat-bulk-bar=\"\"\n style={bulkBarFixedStyle}\n className={cn(\n \"flex min-w-0 max-w-full items-stretch overflow-hidden\",\n isAppDark\n ? \"rounded-lg border border-zinc-300/80 bg-zinc-100 text-zinc-900 shadow-lg\"\n : \"rounded-lg border border-zinc-800 bg-zinc-900 text-zinc-100 shadow-lg\",\n \"animate-in fade-in-0 duration-150\",\n \"w-auto max-w-none\",\n )}\n >\n <div\n className={cn(\n \"flex shrink-0 items-center gap-2 border-e py-2.5 ps-3 pe-2\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-md\",\n isAppDark ? \"text-zinc-500\" : \"text-zinc-400\",\n )}\n aria-hidden=\"true\"\n >\n <i className=\"fa-light fa-clipboard-list text-[1.1rem] leading-none\" />\n </span>\n <span\n className={cn(\n \"min-w-6 rounded-md px-1.5 py-0.5 text-center text-xs font-semibold leading-none tabular-nums\",\n isAppDark ? \"bg-zinc-200/90 text-zinc-900\" : \"bg-zinc-800 text-zinc-100\",\n )}\n >\n {selected.size}\n </span>\n </div>\n\n <div\n className={cn(\n \"flex min-w-0 min-h-0 flex-1 items-stretch\",\n !isAppDark && \"dark\",\n isAppDark && BULK_BAR_ON_LIGHT_STRIP,\n )}\n >\n <div\n className={cn(\n \"min-w-0 flex-1 self-center\",\n \"overflow-x-auto overscroll-x-contain [scrollbar-width:thin] [touch-action:pan-x]\",\n )}\n >\n <div className=\"flex w-max min-w-0 max-w-full flex-nowrap items-center gap-2 py-2.5 ps-2 pe-2\">\n {bulkActionsSlot ? (\n bulkActionsSlot(selected, rows)\n ) : (\n <>\n <Button size=\"sm\" variant=\"outline\" className=\"shrink-0\">\n <i className=\"fa-light fa-arrow-down-to-line\" aria-hidden=\"true\" /> Export\n </Button>\n <Button size=\"sm\" variant=\"destructive\" className=\"shrink-0\">\n <i className=\"fa-light fa-trash\" aria-hidden=\"true\" /> Delete\n </Button>\n </>\n )}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex shrink-0 items-center border-e py-2.5 ps-2 pe-2.5\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n >\n <Tip label=\"Clear selection\" side=\"top\">\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear selection\"\n onClick={() => setSelected(new Set())}\n className=\"shrink-0\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction DataTableWithInternalState<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n const state = useTableState(props.data, props.columns, props.defaultSort, props.paginationOverride)\n return <DataTableInner {...props} state={state} />\n}\n\nexport function DataTable<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n if (props.state) {\n return <DataTableInner {...props} state={props.state} />\n }\n return <DataTableWithInternalState {...props} />\n}\n","\"use client\"\n\n/**\n * DataTablePaginated<TData> — DataTable with a bottom pagination bar\n *\n * Adds:\n * • \"Rows per page\" selector\n * • First / Previous / Next / Last page buttons\n * • \"{from}–{to} of {total}\" status span (role=\"status\" aria-live=\"polite\")\n * • Keyboard: Left/Right arrow keys on the pagination bar change page\n *\n * Everything else (columns, pinning, resize, DnD, sort, filters, group,\n * selection) is identical to DataTable — they share useTableState.\n *\n * Props: DataTableProps<TData> & { pagination?: PaginationConfig }\n */\n\nimport * as React from \"react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Tip } from \"../ui/tip\"\nimport { TooltipProvider } from \"../ui/tooltip\"\nimport { DataTable, type DataTableExtendedProps } from \"./index\"\nimport type { PaginationConfig } from \"./types\"\nimport type { useTableState } from \"./use-table-state\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PaginationBar\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PaginationBarProps {\n page: number\n pageSize: number\n total: number\n pageSizeOptions: number[]\n onPageChange: (p: number) => void\n onPageSizeChange: (n: number) => void\n}\n\nexport function PaginationBar({\n page,\n pageSize,\n total,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n}: PaginationBarProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const from = Math.min((page - 1) * pageSize + 1, total)\n const to = Math.min(page * pageSize, total)\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key === \"ArrowLeft\" && page > 1) {\n e.preventDefault()\n onPageChange(page - 1)\n } else if (e.key === \"ArrowRight\" && page < totalPages) {\n e.preventDefault()\n onPageChange(page + 1)\n }\n }\n\n return (\n <div\n className=\"flex items-center justify-between px-4 py-2.5 border-t border-border bg-background text-sm select-none\"\n onKeyDown={handleKeyDown}\n >\n {/* Rows per page */}\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <span>Rows per page</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Rows per page\"\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-input bg-background hover:bg-interactive-hover text-foreground text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {pageSize}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-20\">\n {pageSizeOptions.map(n => (\n <DropdownMenuItem key={n} onClick={() => onPageSizeChange(n)}>\n {n}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Nav */}\n <div className=\"flex items-center gap-3\">\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground tabular-nums\"\n >\n {total === 0 ? \"0 results\" : `${from}–${to} of ${total}`}\n </span>\n <TooltipProvider>\n <div className=\"flex items-center gap-1\">\n <Tip label=\"First page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"First page\"\n disabled={page === 1}\n onClick={() => onPageChange(1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Previous page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={page === 1}\n onClick={() => onPageChange(page - 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <span className=\"px-2 text-muted-foreground tabular-nums\">\n {page} / {totalPages}\n </span>\n <Tip label=\"Next page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Last page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Last page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(totalPages)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </TooltipProvider>\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTablePaginated<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTablePaginatedProps<TData extends Record<string, unknown>>\n extends DataTableExtendedProps<TData> {\n pagination?: PaginationConfig\n}\n\nexport function DataTablePaginated<TData extends Record<string, unknown>>({\n data,\n columns,\n pagination,\n defaultSort,\n ...rest\n}: DataTablePaginatedProps<TData>) {\n const config = {\n pageSize: pagination?.pageSize ?? 10,\n pageSizeOptions: pagination?.pageSizeOptions ?? [10, 25, 50, 100],\n }\n\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(config.pageSize)\n\n // filteredCount: total rows after filters (driven by inner table state via CountSyncer)\n const [filteredCount, setFilteredCount] = React.useState(data.length)\n\n const totalPages = Math.max(1, Math.ceil(filteredCount / pageSize))\n const safePage = Math.min(page, totalPages)\n\n function handlePageSizeChange(n: number) {\n setPageSize(n)\n setPage(1)\n }\n\n // Wrap toolbarSlot to intercept state.rows.length (a number — no circular ref)\n const originalToolbarSlot = rest.toolbarSlot\n const toolbarSlot = React.useCallback(\n (state: ReturnType<typeof useTableState<TData>>) => (\n <>\n <CountSyncer count={state.rows.length} onSync={setFilteredCount} onReset={() => setPage(1)} />\n {originalToolbarSlot ? originalToolbarSlot(state) : null}\n </>\n ),\n [originalToolbarSlot],\n )\n\n return (\n <div className=\"flex flex-col gap-0\">\n <DataTable\n {...rest}\n data={data}\n columns={columns}\n defaultSort={defaultSort}\n toolbarSlot={toolbarSlot}\n paginationOverride={{ page: safePage, pageSize }}\n hasFooter\n />\n {/* z-40 sits above pinned cells (z-20), group headers (z-25), and pinned headers\n (z-40) so the pagination chrome stays opaque over any table content that\n scrolls behind it. Pinned-left cells ship with their own `bg-dt-row-bg`,\n which would otherwise paint over a lower-z footer. */}\n <div className=\"sticky bottom-0 z-40 mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\">\n <PaginationBar\n page={safePage}\n pageSize={pageSize}\n total={filteredCount}\n pageSizeOptions={config.pageSizeOptions}\n onPageChange={setPage}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CountSyncer — syncs filtered row count (a number) to parent without loops.\n// Syncing a primitive avoids the circular-reference issue of syncing an array.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function CountSyncer({\n count,\n onSync,\n onReset,\n}: {\n count: number\n onSync: (n: number) => void\n onReset: () => void\n}) {\n const prevCount = React.useRef(count)\n React.useLayoutEffect(() => {\n if (prevCount.current !== count) {\n prevCount.current = count\n onSync(count)\n onReset()\n }\n }, [count, onSync, onReset])\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/lib/raf-throttle.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/kbd.tsx","../../../src/hooks/use-mod-key-label.ts","../../../src/lib/editable-target.ts","../../../src/components/ui/checkbox.tsx","../../../src/components/ui/popover.tsx","../../../src/lib/table-properties-types.ts","../../../src/lib/conditional-rule-match.ts","../../../src/lib/date-filter.ts","../../../src/components/ui/calendar.tsx","../../../src/components/data-table/filter-date-calendar.tsx","../../../src/components/ui/input-group.tsx","../../../src/lib/compose-refs.ts","../../../src/components/ui/input-mask.tsx","../../../src/components/ui/date-picker-field.tsx","../../../src/components/data-table/filter-text-value-input.tsx","../../../src/components/data-table/use-table-state.ts","../../../src/components/data-table/index.tsx","../../../src/components/data-table/pagination.tsx"],"names":["DropdownMenuPrimitive","jsx","TooltipPrimitive","jsxs","React2","React3","Input","React4","cva","React5","Checkbox","CheckboxPrimitive","PopoverPrimitive","hit","className","props","React6","React7","React8","MaskedInput","hay","React10","SortChevron","Fragment","el","React11"],"mappings":"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","file":"pagination.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Default surface sizing for product dropdown menus (view settings, row ⋯, column menus, etc.).\n *\n * Uses **pure CSS** (`w-max` + `min-w-*` + `max-w-*`) so width follows labels and shortcuts\n * without **ResizeObserver** or layout thrash.\n *\n * Override when you need a fixed rail, for example:\n * - `className=\"w-20\"` — page-size picker in `DataTablePaginated`\n * - `className=\"w-(--radix-dropdown-menu-trigger-width) min-w-60\"` — account / identity menus\n * - `className=\"!w-max min-w-72 …\"` — very wide school/program switcher\n */\nexport const DROPDOWN_MENU_CONTENT_SURFACE_CLASS =\n \"min-w-52 w-max max-w-[min(24rem,calc(100vw-2rem))]\" as const\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n shortcut,\n children,\n asChild,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n /** Visual keyboard-shortcut hint shown on the right of the item (e.g. \"⌘E\", \"F2\").\n * Purely cosmetic — to actually bind the key, render a sibling `<Shortcut keys={…} onInvoke={…} />`\n * in a parent that stays mounted (menu items unmount when the menu closes). */\n shortcut?: string\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n asChild={asChild}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {shortcut ? <DropdownMenuShortcut>{shortcut}</DropdownMenuShortcut> : null}\n </>\n )}\n </DropdownMenuPrimitive.Item>\n )\n}\n\n/** Invisible component that binds a keyboard shortcut globally while mounted.\n * Pair with `DropdownMenuItem shortcut=\"⌘E\"` for the visual hint. */\nfunction Shortcut({\n keys,\n onInvoke,\n disabled,\n}: {\n keys: string\n onInvoke: (e: KeyboardEvent) => void\n disabled?: boolean\n}) {\n useShortcut(keys, onInvoke, disabled)\n return null\n}\n\nfunction useShortcut(\n keys: string,\n onInvoke: (e: KeyboardEvent) => void,\n disabled?: boolean,\n) {\n const ref = React.useRef(onInvoke)\n React.useEffect(() => { ref.current = onInvoke }, [onInvoke])\n React.useEffect(() => {\n if (disabled) return\n const parsed = parseShortcut(keys)\n if (!parsed) return\n function handler(e: KeyboardEvent) {\n if (!matchesShortcut(e, parsed!)) return\n const t = e.target as HTMLElement | null\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return\n // Skip when the user is activating an interactive control — Enter/Space on a\n // focused button, link, or role=button is already that control's native action.\n // Without this guard, a page-level `Shortcut keys=\"Enter\"` (e.g. the wizard's\n // \"submit on review\") races the button's own click: the Edit / Back / Cancel\n // button runs its handler AND the window listener submits the form on the same\n // keystroke — the classic \"review auto-closes when I click Edit\" bug.\n if (t && (parsed!.key === \"enter\" || parsed!.key === \" \")) {\n const role = t.getAttribute(\"role\")\n if (\n t.tagName === \"BUTTON\" ||\n t.tagName === \"A\" ||\n t.tagName === \"SELECT\" ||\n role === \"button\" ||\n role === \"link\" ||\n role === \"menuitem\" ||\n role === \"tab\" ||\n role === \"option\" ||\n role === \"checkbox\" ||\n role === \"radio\" ||\n role === \"switch\" ||\n t.closest('[role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]')\n )\n return\n }\n // If a Radix dialog/sheet/alert-dialog is open, only fire when the event\n // originates inside it — page-level shortcuts must NOT bleed through\n // an open dialog, but in-dialog `<Shortcut>` bindings (Export, Save)\n // still need to fire.\n const openDialog = document.querySelector('[role=\"dialog\"][data-state=\"open\"], [role=\"alertdialog\"][data-state=\"open\"]') as HTMLElement | null\n if (openDialog && (!t || !openDialog.contains(t))) return\n e.preventDefault()\n e.stopPropagation()\n ref.current(e)\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [keys, disabled])\n}\n\n/* --------------------------------------------------------------------------\n * Shortcut parsing + global binding\n * ------------------------------------------------------------------------ */\n\ntype ParsedShortcut = {\n meta: boolean\n ctrl: boolean\n shift: boolean\n alt: boolean\n key: string // normalized lowercase, or special like \"f2\", \"backspace\", \"delete\", \"enter\", \"escape\", \"arrowup\"…\n}\n\nfunction mapKey(raw: string): string {\n const p = raw.toLowerCase()\n if (raw === \"⌫\") return \"backspace\"\n if (raw === \"⌦\") return \"delete\"\n if (raw === \"⏎\" || p === \"enter\" || p === \"return\") return \"enter\"\n if (raw === \"␣\" || p === \"space\") return \" \"\n if (p === \"esc\" || p === \"escape\") return \"escape\"\n if (p === \"tab\") return \"tab\"\n if (p === \"up\" || raw === \"↑\") return \"arrowup\"\n if (p === \"down\" || raw === \"↓\") return \"arrowdown\"\n if (p === \"left\" || raw === \"←\") return \"arrowleft\"\n if (p === \"right\" || raw === \"→\") return \"arrowright\"\n return p\n}\n\nfunction parseShortcut(input: string): ParsedShortcut | null {\n let s = input.trim()\n if (!s) return null\n const out: ParsedShortcut = { meta: false, ctrl: false, shift: false, alt: false, key: \"\" }\n // Strip leading symbolic modifiers (⌘ ⌃ ⇧ ⌥) which may be glued to the key char.\n while (s.length) {\n const c = s[0]\n if (c === \"⌘\") { out.meta = true; s = s.slice(1) }\n else if (c === \"⌃\") { out.ctrl = true; s = s.slice(1) }\n else if (c === \"⇧\") { out.shift = true; s = s.slice(1) }\n else if (c === \"⌥\") { out.alt = true; s = s.slice(1) }\n else break\n }\n if (!s) return null\n // Word-style modifiers (Cmd+Shift+D, Alt P) joined by + or whitespace.\n if (/[+\\s]/.test(s)) {\n for (const raw of s.split(/[+\\s]+/).filter(Boolean)) {\n const p = raw.toLowerCase()\n if (raw === \"⌘\" || p === \"cmd\" || p === \"meta\" || p === \"command\") out.meta = true\n else if (raw === \"⌃\" || p === \"ctrl\" || p === \"control\") out.ctrl = true\n else if (raw === \"⇧\" || p === \"shift\") out.shift = true\n else if (raw === \"⌥\" || p === \"alt\" || p === \"opt\" || p === \"option\") out.alt = true\n else out.key = mapKey(raw)\n }\n } else {\n out.key = mapKey(s)\n }\n return out.key ? out : null\n}\n\nfunction matchesShortcut(e: KeyboardEvent, s: ParsedShortcut): boolean {\n if (e.metaKey !== s.meta) return false\n if (e.ctrlKey !== s.ctrl) return false\n if (e.altKey !== s.alt) return false\n if (e.shiftKey !== s.shift) return false\n return e.key.toLowerCase() === s.key\n}\n\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: 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}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n suppressHydrationWarning\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <i className=\"fa-light fa-chevron-right rtl:rotate-180 ms-auto\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\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 Shortcut,\n useShortcut,\n}\n\nexport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Coalesce many calls to `fn` into one per animation frame.\n *\n * Use for high-frequency layout-reading event handlers (scroll, resize,\n * visualViewport, ResizeObserver) where the work must happen in a frame but\n * doing it on every event call (60+/s for resize, hundreds/s for capture\n * scrolls) wastes layout/paint cycles. The returned function exposes\n * `.cancel()` so effect cleanup can drop a pending frame.\n *\n * Pattern:\n * const apply = () => { ...layout reads + setState... }\n * const scheduled = rafThrottle(apply)\n * window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n * return () => {\n * scheduled.cancel()\n * window.removeEventListener(\"scroll\", scheduled, { capture: true })\n * }\n */\nexport function rafThrottle<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n): ((...args: TArgs) => void) & { cancel: () => void } {\n let rafId = 0\n let lastArgs: TArgs | null = null\n\n const scheduled = ((...args: TArgs) => {\n lastArgs = args\n if (rafId !== 0) return\n rafId = requestAnimationFrame(() => {\n rafId = 0\n const a = lastArgs\n lastArgs = null\n if (a) fn(...a)\n })\n }) as ((...args: TArgs) => void) & { cancel: () => void }\n\n scheduled.cancel = () => {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId)\n rafId = 0\n }\n lastArgs = null\n }\n\n return scheduled\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n function Input({ className, type, ...props }, ref) {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n },\n)\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Kbd — display keyboard keys and shortcuts (shadcn/ui).\n * @see https://ui.shadcn.com/docs/components/radix/kbd\n *\n * Variants:\n * - \"tile\" (default) — filled tile with border; use in tooltips, menus, docs,\n * or any surface where the Kbd sits on neutral background.\n * - \"bare\" — no background, no border; inherits `currentColor` at 70% opacity.\n * Use **inside buttons** (primary/secondary workflow actions) so the hint\n * does not look like a pasted-on patch against the button fill.\n */\nfunction Kbd({\n className,\n variant = \"tile\",\n \"aria-hidden\": ariaHidden,\n ...props\n}: React.ComponentProps<\"kbd\"> & { variant?: \"tile\" | \"bare\" }) {\n // Bare variant lives inside buttons — the button already carries the\n // accessible name, so the inline kbd is redundant noise for screen readers.\n // Default to aria-hidden unless a consumer explicitly opts in.\n const hidden = ariaHidden ?? (variant === \"bare\" ? true : undefined)\n return (\n <kbd\n data-slot=\"kbd\"\n data-variant={variant}\n aria-hidden={hidden}\n className={cn(\n \"pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium\",\n variant === \"tile\" &&\n \"bg-muted text-muted-foreground rounded-sm border\",\n variant === \"bare\" && \"text-current/70 px-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","\"use client\"\n\nimport * as React from \"react\"\n\n/** \"⌘\" on Apple platforms, \"Ctrl\" elsewhere — for `Kbd` tooltips. */\nexport function useModKeyLabel() {\n const [mod, setMod] = React.useState(\"⌘\")\n React.useEffect(() => {\n setMod(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌘\"\n : \"Ctrl\",\n )\n }, [])\n return mod\n}\n\n/** \"⌥\" on Apple platforms, \"Alt\" elsewhere — pair with `useModKeyLabel` for ⌘⌥ / Ctrl+Alt chords. */\nexport function useAltKeyLabel() {\n const [alt, setAlt] = React.useState(\"⌥\")\n React.useEffect(() => {\n setAlt(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌥\"\n : \"Alt\",\n )\n }, [])\n return alt\n}\n","/**\n * True when focus is in a field where global shortcuts should not fire.\n *\n * Mirrors the same skip logic baked into Radix `useShortcut` so global\n * hotkey handlers (export ⌘⇧E, rename F2, etc.) don't steal keystrokes\n * that the user clearly intends for the input. Covers native form\n * fields and any element marked `contenteditable=\"true\"` (richtext\n * editors, comment composers).\n */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n return true\n return el.getAttribute?.(\"contenteditable\") === \"true\"\n}\n","\"use client\"\n\n/**\n * Checkbox — Radix control + Exxat styling.\n *\n * Aligned with Shadcn Studio checkbox guidance (see shadcnstudio.com/docs/components/checkbox):\n * • Tri-state: `checked={true | false | \"indeterminate\"}` (parent “select some” rows)\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg\n * • Motion: none | pop | glow | pop-glow — uses `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Forms: `aria-invalid` from Field, `disabled`, extended hit slop (`after:`)\n * • Pair with `CheckboxLabel` + `htmlFor` / `id` for 44px-friendly targets\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst checkboxVariants = cva(\n [\n \"peer relative box-border flex shrink-0 items-center justify-center self-center rounded-[4px] border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:data-[state=indeterminate]:bg-primary dark:data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-background data-[state=indeterminate]:text-primary data-[state=indeterminate]:ring-2 data-[state=indeterminate]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n \"data-[state=indeterminate]:border-secondary data-[state=indeterminate]:bg-secondary data-[state=indeterminate]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n \"data-[state=indeterminate]:border-chart-2 data-[state=indeterminate]:bg-chart-2 data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n \"data-[state=indeterminate]:border-destructive data-[state=indeterminate]:bg-destructive data-[state=indeterminate]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n \"data-[state=indeterminate]:border-amber-500 data-[state=indeterminate]:bg-amber-500 data-[state=indeterminate]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n \"data-[state=indeterminate]:border-muted-foreground/50 data-[state=indeterminate]:bg-muted data-[state=indeterminate]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 max-h-3.5 max-w-3.5 min-h-3.5 min-w-3.5 rounded-[3px] [&_[data-slot=checkbox-indicator]_i]:text-[10px]\",\n default: \"size-4 max-h-4 max-w-4 min-h-4 min-w-4 [&_[data-slot=checkbox-indicator]_i]:text-xs\",\n lg: \"size-5 max-h-5 max-w-5 min-h-5 min-w-5 rounded-[5px] [&_[data-slot=checkbox-indicator]_i]:text-sm\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: [\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst checkboxIndicatorVariants = cva(\"grid place-content-center text-current\", {\n variants: {\n motion: {\n none: \"transition-none\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\":\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: {\n motion: \"none\",\n },\n})\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, variant, size, motion, checked, ...props }, ref) {\n const m = motion ?? \"none\"\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-variant={variant ?? \"default\"}\n data-motion={m}\n checked={checked}\n className={cn(checkboxVariants({ variant, size, motion: m }), className)}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={checkboxIndicatorVariants({ motion: m })}\n >\n {checked === \"indeterminate\" ? (\n <i className=\"fa-solid fa-minus text-current\" aria-hidden=\"true\" />\n ) : (\n <i className=\"fa-solid fa-check text-current\" aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n }\n)\n\nexport type CheckboxLabelProps = React.ComponentPropsWithRef<typeof Label>\n\n/** Label tuned for `Checkbox` siblings: larger tap target, respects `peer-disabled`. */\nfunction CheckboxLabel({ className, ...props }: CheckboxLabelProps) {\n return (\n <Label\n data-slot=\"checkbox-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Checkbox, CheckboxLabel, checkboxVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger className={cn(\"cursor-pointer\", className)} {...props} />\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 rounded-lg border border-border bg-popover shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }\n","/**\n * Shared types + design-system constants for the Table Properties drawer\n * and related data-table primitives (filter chips, sort cards,\n * conditional formatting rules).\n *\n * Product-specific seed data (`FILTER_FIELDS` and `COLUMNS` arrays\n * tailored to the Placements hub) intentionally stays in\n * `apps/web/components/table-properties/types.ts` — those values are\n * **product data**, not design-system primitives, and the package must\n * not know about Placement specializations, supervisor labels, etc.\n *\n * Consumers compose their own `FilterFieldDef[]` / `ColDef[]` arrays\n * tailored to their entity (Team members, Compliance items, Question\n * bank rows, …) and pass them into the drawer through props.\n */\n\n/** Comparison operator vocabulary used by every filter row + conditional rule. */\nexport type FilterOperator = \"is\" | \"is_not\" | \"contains\" | \"not_contains\"\n\n/**\n * Input mask for `type: \"text\"` filters. Maps to a\n * [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask)\n * pattern key. Add new keys here (and in your concrete `exxatMaskPatterns`\n * map) when a new column needs a structured text format.\n */\nexport type FilterTextMask = \"phone\" | \"zip\" | \"dateMDY\"\n\nexport interface FilterFieldDef {\n key: string\n label: string\n icon: string\n type: \"select\" | \"text\" | \"date\"\n operators: FilterOperator[]\n /** Select options, or for `date` fields used by conditional rules (exact row strings). */\n options?: { value: string; label: string }[]\n /** When `type` is `text`, optional `use-mask-input` pattern for the value field. */\n textMask?: FilterTextMask\n}\n\nexport interface ActiveFilter {\n id: string\n fieldKey: string\n operator: FilterOperator\n values: string[]\n}\n\nexport interface SortRule {\n id: string\n fieldKey: string\n direction: \"asc\" | \"desc\"\n}\n\n/** Operator → human-readable label map (centralized so chips, drawer, and CSV exports stay aligned). */\nexport const OPERATOR_LABELS: Record<FilterOperator, string> = {\n is: \"is\",\n is_not: \"is not\",\n contains: \"contains\",\n not_contains: \"does not contain\",\n}\n\n/** Column descriptor for `TableProperties` views (Columns / Sort / Group panels). */\nexport interface ColDef {\n key: string\n label: string\n sortable: boolean\n sortKey?: string\n minWidth: number\n}\n\n/* ─── Conditional formatting ──────────────────────────────────────────── */\n\nexport interface ConditionalRule {\n id: string\n /** Column key to evaluate */\n fieldKey: string\n operator: FilterOperator\n /** Selected option values (select) or text (single entry) when operator needs values */\n values: string[]\n /** Resolved CSS background color string */\n bgColor: string\n}\n\n/**\n * Predefined palette for conditional rule backgrounds.\n *\n * Backgrounds are exposed as CSS custom properties so theming swaps the\n * palette per brand without code edits (`--conditional-rule-green`,\n * `--conditional-rule-yellow`, etc., declared in\n * `packages/ui/src/globals.css`).\n */\nexport const RULE_COLORS: { name: string; bg: string }[] = [\n { name: \"Green\", bg: \"var(--conditional-rule-green)\" },\n { name: \"Yellow\", bg: \"var(--conditional-rule-yellow)\" },\n { name: \"Blue\", bg: \"var(--conditional-rule-blue)\" },\n { name: \"Red\", bg: \"var(--conditional-rule-red)\" },\n { name: \"Purple\", bg: \"var(--conditional-rule-purple)\" },\n { name: \"Orange\", bg: \"var(--conditional-rule-orange)\" },\n]\n","import type {\n ConditionalRule,\n FilterTextMask,\n} from \"./table-properties-types\"\n\n/**\n * Conditional-formatting matchers shared by `DataTable` cells,\n * `data-row-list` rows, and board card backgrounds. Keeping the logic\n * here ensures the table grid and the list / board derivatives all\n * paint the same row with the same rule (no UI drift between views).\n *\n * `columns` is optional and only used when the consumer needs to:\n * - read from a different row key than the rule's `fieldKey`\n * (`sortKey`-aliased columns), or\n * - apply a `textMask` (phone / zip) so \"contains 555\" matches the\n * raw digits of \"(415) 555-0100\".\n */\n\nexport type ConditionalColumnHint = {\n key: string\n sortKey?: string\n filter?: { type?: string; textMask?: FilterTextMask }\n}\n\nfunction rowValueForRule<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): string {\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const dataKey = (col?.sortKey ?? rule.fieldKey) as keyof T\n return String(row[dataKey] ?? \"\")\n}\n\nfunction ruleHasActiveValues(\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (rule.values.length === 0) return false\n const col = columns?.find((c) => c.key === rule.fieldKey)\n if (col?.filter?.type === \"text\")\n return (rule.values[0] ?? \"\").trim().length > 0\n return true\n}\n\nfunction conditionalTextMatches(\n cellVal: string,\n needle: string,\n op: \"contains\" | \"not_contains\",\n textMask: FilterTextMask | undefined,\n) {\n const v = cellVal.trim()\n const n = needle.trim()\n if (!n) return op === \"not_contains\"\n if (textMask === \"phone\" || textMask === \"zip\") {\n const nd = n.replace(/\\D/g, \"\")\n const hay = v.replace(/\\D/g, \"\")\n if (!nd) return op === \"not_contains\"\n const hit = hay.includes(nd)\n return op === \"contains\" ? hit : !hit\n }\n const hit = v.toLowerCase().includes(n.toLowerCase())\n return op === \"contains\" ? hit : !hit\n}\n\n/** Whether a conditional rule matches a row (same logic as DataTable cells). */\nexport function conditionalRuleMatchesRow<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (!ruleHasActiveValues(rule, columns)) return false\n const v = rowValueForRule(row, rule, columns).trim()\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const textMask =\n col?.filter?.type === \"text\" ? col.filter.textMask : undefined\n switch (rule.operator) {\n case \"is\":\n return rule.values.includes(v)\n case \"is_not\":\n return !rule.values.includes(v)\n case \"contains\":\n return rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n case \"not_contains\":\n return !rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n default:\n return false\n }\n}\n\n/** First matching conditional rule background for a row (list/board row tint). */\nexport function getConditionalRowBackground<T extends Record<string, unknown>>(\n row: T,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n for (const rule of rules) {\n if (conditionalRuleMatchesRow(row, rule, columns)) return rule.bgColor\n }\n return undefined\n}\n\n/** Background for one table cell from conditional rules on that column. */\nexport function getConditionalCellBackground<T extends Record<string, unknown>>(\n row: T,\n colKey: string,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n const rule = rules.find((r) => r.fieldKey === colKey)\n if (!rule || !conditionalRuleMatchesRow(row, rule, columns)) return undefined\n return rule.bgColor\n}\n","/**\n * Format any date string (ISO, MM/DD/YYYY, \"Mar 15 2026\", etc.) into the\n * app-wide display format: MM/DD/YYYY.\n * Returns \"—\" for empty / unparseable values.\n */\nexport function formatDateUS(raw: string | null | undefined): string {\n if (!raw || raw.trim() === \"—\" || raw.trim() === \"-\") return \"—\"\n // Already MM/DD/YYYY — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(raw.trim())) return raw.trim()\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return raw\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/** Format a `Date` with local calendar fields as MM/DD/YYYY (avoids UTC drift from `toISOString()`). */\nexport function formatDateFromDate(raw: Date | null | undefined): string {\n if (!raw || Number.isNaN(raw.getTime())) return \"—\"\n const m = String(raw.getMonth() + 1).padStart(2, \"0\")\n const day = String(raw.getDate()).padStart(2, \"0\")\n const y = raw.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/**\n * Format a Date (or ISO string) into \"MM/DD/YYYY hh:mm AM/PM EST\".\n * Time zone label is always appended as the literal string \"EST\" (display only).\n */\nexport function formatDateTimeUS(raw: Date | string | null | undefined): string {\n if (!raw) return \"—\"\n const d = raw instanceof Date ? raw : new Date(raw)\n if (Number.isNaN(d.getTime())) return String(raw)\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n let h = d.getHours()\n const min = String(d.getMinutes()).padStart(2, \"0\")\n const ampm = h >= 12 ? \"PM\" : \"AM\"\n h = h % 12 || 12\n return `${m}/${day}/${y} ${String(h).padStart(2, \"0\")}:${min} ${ampm} EST`\n}\n\n/** Parse a human-readable date string into YYYY-MM-DD for comparison (local timezone). */\nexport function parseRowDateToYmd(raw: string): string | null {\n const t = raw.trim()\n if (!t || t === \"—\" || t === \"-\") return null\n const d = new Date(t)\n if (Number.isNaN(d.getTime())) return null\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n\n/** Format YYYY-MM-DD for filter chip labels (MM/DD/YYYY). */\nexport function formatYmdForDisplay(ymd: string): string {\n const d = ymdToLocalDate(ymd)\n if (!d) return ymd\n return formatDateFromDate(d)\n}\n\n/** Local noon to avoid timezone shifting the calendar day. */\nexport function ymdToLocalDate(ymd: string | undefined): Date | undefined {\n if (!ymd || !/^\\d{4}-\\d{2}-\\d{2}$/.test(ymd)) return undefined\n const [y, m, d] = ymd.split(\"-\").map(Number)\n return new Date(y, m - 1, d, 12, 0, 0, 0)\n}\n\nexport function localDateToYmd(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button, buttonVariants } from \"./button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background 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) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex h-8 items-center gap-1 rounded-md pe-1 ps-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-md text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\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 \"rounded-md bg-accent text-accent-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\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 &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !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 \"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:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Calendar } from \"../ui/calendar\"\nimport { localDateToYmd, ymdToLocalDate } from \"../../lib/date-filter\"\n\n/** Single-date calendar for table filters (YYYY-MM-DD). */\nexport function FilterDateCalendar({\n valueYmd,\n onChangeYmd,\n label,\n}: {\n valueYmd: string | undefined\n onChangeYmd: (ymd: string | undefined) => void\n label: string\n}) {\n const [timeZone, setTimeZone] = React.useState<string | undefined>()\n React.useEffect(() => {\n setTimeZone(Intl.DateTimeFormat().resolvedOptions().timeZone)\n }, [])\n\n return (\n <div\n className=\"rounded-lg border border-border overflow-hidden\"\n role=\"group\"\n aria-label={label}\n >\n <Calendar\n mode=\"single\"\n selected={ymdToLocalDate(valueYmd)}\n onSelect={(d) => onChangeYmd(d ? localDateToYmd(d) : undefined)}\n captionLayout=\"dropdown\"\n timeZone={timeZone}\n className=\"rounded-lg border-0\"\n />\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-md border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pe-1.5 has-[>[data-align=inline-start]]:[&>input]:ps-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first ps-2 has-[>button]:ms-[-0.3rem] has-[>kbd]:ms-[-0.15rem]\",\n \"inline-end\":\n \"order-last pe-2 has-[>button]:me-[-0.3rem] has-[>kbd]:me-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\n\n/** Merges multiple refs (callback or object) for the same DOM node — e.g. RHF `field.ref` + mask ref. */\nexport function composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return node => {\n for (const ref of refs) {\n if (ref == null) continue\n if (typeof ref === \"function\") {\n ref(node)\n } else {\n ;(ref as React.MutableRefObject<T | null>).current = node\n }\n }\n }\n}\n","\"use client\"\n\n/**\n * Input masking — aligned with [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask):\n * `use-mask-input` for phone / date / time / custom / zip; use `PaymentCardFields` for card flows.\n */\n\nimport * as React from \"react\"\nimport {\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n} from \"use-mask-input\"\nimport type { Mask, Options } from \"use-mask-input\"\n\nimport { composeRefs } from \"../../lib/compose-refs\"\n\nexport { composeRefs } from \"../../lib/compose-refs\"\nimport { cn } from \"../../lib/utils\"\nimport { Input } from \"./input\"\n\n/** Default mask UX per Shadcn Studio demos (underscore placeholder, no hover mask). */\nexport const exxatInputMaskDefaults: Options = {\n placeholder: \"_\",\n showMaskOnHover: false,\n}\n\n/** Common patterns (Inputmask `9` = digit, `a` = letter, `*` = alnum). */\nexport const exxatMaskPatterns = {\n /** US NANP 10-digit display */\n phoneUS: \"(999) 999-9999\",\n /** US ZIP or ZIP+4 */\n zipUS: \"99999[-9999]\",\n /** Calendar-style date (validate separately). */\n dateMDY: \"99/99/9999\",\n /** Studio input-mask-01 style — UK-style plate-ish token; adjust per product. */\n customReference: \"AA99 AAA\",\n} as const satisfies Record<string, Mask>\n\nexport function exxatTimeMaskOptions(): Options & {\n inputFormat: string\n outputFormat: string\n} {\n return {\n ...exxatInputMaskDefaults,\n inputFormat: \"HH:MM:ss\",\n outputFormat: \"HH:MM:ss\",\n }\n}\n\nexport function useExxatPhoneMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.phoneUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatZipMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.zipUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatDateMDYMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.dateMDY,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatTimeMask(options?: Options) {\n return useMaskInput({\n mask: \"datetime\",\n options: { ...exxatTimeMaskOptions(), ...options },\n })\n}\n\nexport function useExxatCustomMask(mask: Mask, options?: Options) {\n return useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\n/** Merge React Hook Form Controller `field.ref` with a mask ref. */\nexport function useExxatMaskedFieldRef(\n fieldRef: React.Ref<HTMLInputElement>,\n mask: Mask,\n options?: Options\n): React.RefCallback<HTMLInputElement> {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n return React.useMemo(() => composeRefs(fieldRef, maskRef), [fieldRef, maskRef])\n}\n\nexport type MaskedInputProps = React.ComponentProps<typeof Input> & {\n mask: Mask\n maskOptions?: Options\n}\n\n/** Standalone masked `Input` (forwardRef + merged mask ref). */\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(function MaskedInput(\n { mask, maskOptions, className, type = \"text\", ...props },\n ref\n) {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...maskOptions },\n })\n return (\n <Input\n ref={composeRefs(ref, maskRef)}\n type={type}\n className={cn(className)}\n {...props}\n />\n )\n})\n\nexport {\n MaskedInput,\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n}\nexport type { Mask, Options }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { formatDateFromDate } from \"../../lib/date-filter\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n} from \"./input-group\"\nimport { MaskedInput, exxatMaskPatterns } from \"./input-mask\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport const DATE_PICKER_ICON_CLASS = \"fa-light fa-calendar\"\n\nexport interface DatePickerFieldProps {\n value: Date | undefined\n onChange: (d: Date | undefined) => void\n id?: string\n disabled?: boolean\n /** Passed to the trigger `Button` (e.g. `h-8 text-sm` in compact drawers). */\n triggerClassName?: string\n fromYear?: number\n toYear?: number\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\n/**\n * Calendar + popover trigger — same pattern as New Placement schedule dates (WCAG: button exposes label, not raw text input).\n */\nexport function DatePickerField({\n value,\n onChange,\n id,\n disabled,\n triggerClassName,\n fromYear = 2020,\n toYear = 2032,\n popoverAlign = \"start\",\n popoverClassName,\n}: DatePickerFieldProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n id={id}\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-start font-normal\",\n triggerClassName,\n )}\n aria-label={value ? formatDateFromDate(value) : \"Pick a date\"}\n >\n <i className={cn(DATE_PICKER_ICON_CLASS, \"me-2 shrink-0 text-muted-foreground\")} aria-hidden=\"true\" />\n <span className={cn(!value && \"text-muted-foreground\")}>\n {value ? formatDateFromDate(value) : \"MM/DD/YYYY\"}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn(\"z-[80] w-auto p-0\", popoverClassName)} align={popoverAlign}>\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface DateTextInputFieldProps {\n value: string\n onValueChange: (value: string) => void\n \"aria-label\": string\n id?: string\n placeholder?: string\n className?: string\n inputClassName?: string\n autoFocus?: boolean\n disabled?: boolean\n fromYear?: number\n toYear?: number\n iconButtonVariant?: \"ghost\" | \"outline\"\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\nfunction parseMdyToLocalDate(raw: string): Date | undefined {\n const match = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!match) return undefined\n const month = Number(match[1])\n const day = Number(match[2])\n const year = Number(match[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const date = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return undefined\n return date\n}\n\nfunction formatLocalDateToMdy(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n const year = String(date.getFullYear())\n return `${month}/${day}/${year}`\n}\n\nexport function DateTextInputField({\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n id,\n placeholder = \"MM/DD/YYYY\",\n className,\n inputClassName,\n autoFocus,\n disabled,\n fromYear = 2020,\n toYear = 2032,\n iconButtonVariant = \"ghost\",\n popoverAlign = \"end\",\n popoverClassName,\n}: DateTextInputFieldProps) {\n return (\n <InputGroup className={className}>\n <MaskedInput\n data-slot=\"input-group-control\"\n id={id}\n mask={exxatMaskPatterns.dateMDY}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n inputClassName,\n )}\n autoFocus={autoFocus}\n disabled={disabled}\n />\n <InputGroupAddon align=\"inline-end\">\n <Popover>\n <PopoverTrigger asChild>\n <InputGroupButton\n type=\"button\"\n variant={iconButtonVariant}\n size=\"icon-xs\"\n disabled={disabled}\n aria-label={`${ariaLabel} pick date`}\n >\n <i className={DATE_PICKER_ICON_CLASS} aria-hidden=\"true\" />\n </InputGroupButton>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"z-[80] w-auto p-0\", popoverClassName)}\n align={popoverAlign}\n sideOffset={6}\n >\n <Calendar\n mode=\"single\"\n selected={parseMdyToLocalDate(value)}\n onSelect={(next) => onValueChange(next ? formatLocalDateToMdy(next) : \"\")}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n </InputGroupAddon>\n </InputGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DateTextInputField } from \"../ui/date-picker-field\"\nimport { Input } from \"../ui/input\"\nimport { MaskedInput, exxatMaskPatterns } from \"../ui/input-mask\"\nimport type { Mask } from \"../ui/input-mask\"\nimport type { FilterTextMask } from \"../../lib/table-properties-types\"\n\nconst MASK_BY_KIND: Record<FilterTextMask, Mask> = {\n phone: exxatMaskPatterns.phoneUS,\n zip: exxatMaskPatterns.zipUS,\n dateMDY: exxatMaskPatterns.dateMDY,\n}\n\nexport function FilterTextValueInput({\n id,\n mask,\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n placeholder,\n className,\n autoFocus,\n}: {\n id?: string\n mask?: FilterTextMask\n value: string\n onValueChange: (next: string) => void\n \"aria-label\": string\n placeholder?: string\n className?: string\n autoFocus?: boolean\n}) {\n if (mask === \"dateMDY\") {\n return (\n <DateTextInputField\n id={id}\n value={value}\n onValueChange={onValueChange}\n aria-label={ariaLabel}\n placeholder={placeholder}\n inputClassName={className}\n autoFocus={autoFocus}\n iconButtonVariant=\"ghost\"\n popoverAlign=\"end\"\n />\n )\n }\n\n if (mask) {\n return (\n <MaskedInput\n id={id}\n mask={MASK_BY_KIND[mask]}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n }\n return (\n <Input\n id={id}\n type=\"text\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n}\n","\"use client\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useTableState — all non-display state shared by DataTable and DataTablePaginated\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport * as React from \"react\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { ColumnDef, SortDir } from \"./types\"\nimport type { ActiveFilter, FilterOperator, SortRule } from \"../../lib/table-properties-types\"\nimport { parseRowDateToYmd } from \"../../lib/date-filter\"\n\nlet _filterId = 0\nfunction nextFilterId() { return `f-${++_filterId}` }\n\n/**\n * “Reflow” / high-zoom short viewport. At 200% zoom a 1080p monitor’s CSS\n * height is ≈ 540px — `500px` was too low and never disabled pins. 640px\n * catches typical 200% cases and small laptop tops without breaking `500px` flows.\n * Column stickies + edge shadows harm reflow (WCAG 1.4.10).\n */\nconst REFLOW_VIEWPORT_MQ = \"(max-height: 640px)\"\n\nfunction subscribeReflowViewport(callback: () => void) {\n if (typeof window === \"undefined\") return () => {}\n const mql = window.matchMedia(REFLOW_VIEWPORT_MQ)\n mql.addEventListener(\"change\", callback)\n return () => mql.removeEventListener(\"change\", callback)\n}\nfunction getReflowViewportSnapshot() {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(REFLOW_VIEWPORT_MQ).matches\n}\nfunction getServerReflowViewportSnapshot() {\n return false\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction digitsOnly(s: string): string {\n return s.replace(/\\D/g, \"\")\n}\n\n/** Build the default widths map from column defs */\nfunction buildDefaultWidths<TData>(columns: ColumnDef<TData>[]): Record<string, number> {\n const map: Record<string, number> = {}\n for (const col of columns) {\n if (col.width !== undefined) map[col.key] = col.width\n }\n return map\n}\n\n/** Build the initial pin state from column defs */\nfunction buildDefaultPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\nfunction compareUnknownSort(a: unknown, b: unknown): number {\n if (a === b) return 0\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (typeof a === \"number\" && typeof b === \"number\") return a < b ? -1 : a > b ? 1 : 0\n if (typeof a === \"string\" && typeof b === \"string\") return a < b ? -1 : a > b ? 1 : 0\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n}\n\n/** Build the locked-pin set (columns that can never be unpinned) */\nfunction buildLockedPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.lockPin && col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function useTableState<TData extends Record<string, unknown>>(\n data: TData[],\n columns: ColumnDef<TData>[],\n defaultSort?: { key: string; dir: SortDir },\n paginationOverride?: { page: number; pageSize: number },\n /**\n * When defined (including `\"\"`), toolbar search is synced from the URL (`?q=`).\n * Use `searchParams.get(\"q\") ?? \"\"` on library list routes; omit for other hubs.\n */\n syncedSearchFromUrl?: string,\n) {\n // ── Sort ──────────────────────────────────────────────────────────────────\n const [sortRules, setSortRules] = React.useState<SortRule[]>(() => {\n if (defaultSort) {\n return [{ id: \"sort-default\", fieldKey: defaultSort.key, direction: defaultSort.dir }]\n }\n return []\n })\n\n const primarySort = sortRules[0] ?? null\n const sortKey: string = primarySort?.fieldKey ?? \"\"\n const sortDir: SortDir = primarySort?.direction ?? \"asc\"\n\n const addSortRule = React.useCallback((fieldKey: string) => {\n setSortRules(prev => {\n if (prev.some(r => r.fieldKey === fieldKey)) return prev\n // New drawer sorts are primary (same as column-header sort), not trailing.\n return [{ id: `sort-${Date.now()}`, fieldKey, direction: \"asc\" }, ...prev]\n })\n }, [setSortRules])\n\n const removeSortRule = React.useCallback((id: string) => {\n setSortRules(prev => prev.filter(r => r.id !== id))\n }, [setSortRules])\n\n const toggleSortDir = React.useCallback((id: string) => {\n setSortRules(prev => prev.map(r =>\n r.id === id ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r\n ))\n }, [setSortRules])\n\n const handleSortByKey = React.useCallback((colKey: string) => {\n setSortRules(prev => {\n const idx = prev.findIndex(r => r.fieldKey === colKey)\n if (idx === 0) {\n return prev.map((r, i) => i === 0 ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r)\n }\n const filtered = prev.filter(r => r.fieldKey !== colKey)\n return [{ id: `sort-${Date.now()}`, fieldKey: colKey, direction: \"asc\" }, ...filtered]\n })\n }, [setSortRules])\n\n // ── Filters ───────────────────────────────────────────────────────────────\n const [search, setSearch] = React.useState(() =>\n syncedSearchFromUrl !== undefined ? syncedSearchFromUrl.trim() : \"\",\n )\n const [searchOpen, setSearchOpen] = React.useState(() =>\n syncedSearchFromUrl !== undefined && Boolean(syncedSearchFromUrl.trim()),\n )\n const searchRef = React.useRef<HTMLInputElement>(null)\n const [activeFilters, setActiveFilters] = React.useState<ActiveFilter[]>([])\n const [filterConnectors, setFilterConnectors] = React.useState<Record<string, \"and\" | \"or\">>({})\n const [openFilterId, setOpenFilterId] = React.useState<string | null>(null)\n const [filterBarVisible, setFilterBarVisible] = React.useState(true)\n const [drawerExpandedFilters, setDrawerExpandedFilters] = React.useState<Set<string>>(new Set())\n\n React.useEffect(() => {\n if (syncedSearchFromUrl === undefined) return\n const next = syncedSearchFromUrl.trim()\n setSearch(next)\n setSearchOpen(next.length > 0)\n }, [syncedSearchFromUrl])\n\n const toggleConnector = React.useCallback((leftId: string) => {\n setFilterConnectors(prev => ({ ...prev, [leftId]: prev[leftId] === \"or\" ? \"and\" : \"or\" }))\n }, [setFilterConnectors])\n\n function getConnector(leftId: string): \"and\" | \"or\" {\n return filterConnectors[leftId] ?? \"and\"\n }\n\n const addFilter = React.useCallback((fieldKey: string, fromDrawer = false) => {\n const col = columns.find(c => c.key === fieldKey)\n if (!col?.filter) return\n const id = nextFilterId()\n const f = col.filter\n const firstOperator: FilterOperator = (() => {\n if (f.type === \"select\" || f.type === \"date\") {\n const pick = f.operators?.find(o => o === \"is\" || o === \"is_not\")\n return pick ?? \"is\"\n }\n return f.operators?.[0] ?? \"contains\"\n })()\n const newFilter: ActiveFilter = { id, fieldKey, operator: firstOperator, values: [] }\n setActiveFilters(prev => [...prev, newFilter])\n if (fromDrawer) {\n setDrawerExpandedFilters(() => new Set([id]))\n // Keep toolbar pills hidden until a value is chosen — avoids mounting every\n // FilterPill (heavy) on each drawer \"Add filter\" click.\n } else {\n setOpenFilterId(id)\n setFilterBarVisible(true)\n }\n }, [columns, setActiveFilters, setDrawerExpandedFilters, setOpenFilterId, setFilterBarVisible])\n\n const updateFilter = React.useCallback((id: string, patch: Partial<ActiveFilter>) => {\n let shouldShowFilterBar = false\n setActiveFilters(prev => {\n const next = prev.map(f => {\n if (f.id !== id) return f\n const merged = { ...f, ...patch }\n const col = columns.find(c => c.key === merged.fieldKey)\n if (merged.values.length > 0) {\n shouldShowFilterBar =\n col?.filter?.type === \"text\"\n ? (merged.values[0] ?? \"\").trim().length > 0\n : true\n }\n return merged\n })\n return next\n })\n if (shouldShowFilterBar) setFilterBarVisible(true)\n }, [columns, setActiveFilters, setFilterBarVisible])\n\n const removeFilter = React.useCallback((id: string) => {\n // Use functional updates only — no stale-closure risk on activeFilters.\n setActiveFilters(prev => {\n const idx = prev.findIndex(f => f.id === id)\n const next = prev.filter(f => f.id !== id)\n setFilterConnectors(prevC => {\n const c = { ...prevC }\n if (idx > 0 && next.length > 0) {\n const leftId = prev[idx - 1].id\n c[leftId] = prevC[id] ?? prevC[leftId] ?? \"and\"\n }\n delete c[id]\n return c\n })\n return next\n })\n setOpenFilterId(prev => prev === id ? null : prev)\n }, [setActiveFilters, setFilterConnectors, setOpenFilterId])\n\n // ── Group by ──────────────────────────────────────────────────────────────\n const [groupBy, setGroupBy] = React.useState<string | null>(null)\n\n // ── Per-column quick-search ───────────────────────────────────────────────\n const [colMenuSearch, setColMenuSearch] = React.useState<Record<string, string>>({})\n\n // ── Selection ─────────────────────────────────────────────────────────────\n const [selected, setSelected] = React.useState<Set<string | number>>(new Set())\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [colWidths, setColWidths] = React.useState<Record<string, number>>(() => buildDefaultWidths(columns))\n const resizeRef = React.useRef<{ key: string; startX: number; startW: number } | null>(null)\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [colOrder, setColOrder] = React.useState<string[]>(() => columns.map(c => c.key))\n\n // ── Column pins ───────────────────────────────────────────────────────────\n const [colPins, setColPins] = React.useState<Record<string, \"left\" | \"right\">>(() => buildDefaultPins(columns))\n const lockedPins = React.useMemo(() => buildLockedPins(columns), [columns])\n\n // ── Column wrap ───────────────────────────────────────────────────────────\n const [colWrap, setColWrap] = React.useState<Record<string, boolean>>({})\n\n // ── Drawer / display settings ─────────────────────────────────────────────\n const [sheetOpen, setSheetOpen] = React.useState(false)\n /**\n * Deep-link target for the Properties drawer. When a callsite wants to open\n * the drawer focused on a specific panel (e.g. \"conditional-rules\" from the\n * column header menu), it sets this before calling `setSheetOpen(true)`. The\n * drawer's `initialPanel` prop reads it and syncs its internal `sheetPanel`\n * accordingly. The toolbar Properties button clears it so it opens to \"main\".\n */\n const [sheetInitialPanel, setSheetInitialPanel] = React.useState<string | null>(null)\n const [showGridlines, setShowGridlines] = React.useState(true)\n const [rowHeight, setRowHeight] = React.useState<RowHeight>(\"default\")\n const [hiddenCols, setHiddenCols] = React.useState<Set<string>>(new Set())\n\n const toggleColVisibility = React.useCallback((key: string) => {\n setHiddenCols(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [setHiddenCols])\n\n const moveCol = React.useCallback((key: string, dir: \"up\" | \"down\") => {\n setColOrder(prev => {\n const lockedLeft = columns.filter(c => c.lockPin && c.defaultPin === \"left\").map(c => c.key)\n const lockedRight = columns.filter(c => c.lockPin && c.defaultPin === \"right\").map(c => c.key)\n const orderable = prev.filter(k => !lockedLeft.includes(k) && !lockedRight.includes(k))\n const idx = orderable.indexOf(key)\n if (dir === \"up\" && idx <= 0) return prev\n if (dir === \"down\" && idx >= orderable.length - 1) return prev\n const next = [...orderable]\n const swap = dir === \"up\" ? idx - 1 : idx + 1\n ;[next[idx], next[swap]] = [next[swap], next[idx]]\n return [...lockedLeft, ...next, ...lockedRight]\n })\n }, [columns, setColOrder])\n\n // ── Drag-to-reorder ───────────────────────────────────────────────────────\n const draggedKey = React.useRef<string | null>(null)\n const [dragOverKey, setDragOverKey] = React.useState<string | null>(null)\n\n // ── Scroll / overflow ─────────────────────────────────────────────────────\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [scrolled, setScrolled] = React.useState(false)\n const [scrollEnd, setScrollEnd] = React.useState(false)\n const [isOverflowing, setIsOverflowing] = React.useState(false)\n\n const isReflowViewport = React.useSyncExternalStore(\n subscribeReflowViewport,\n getReflowViewportSnapshot,\n getServerReflowViewportSnapshot,\n )\n\n // ── Hovered row ───────────────────────────────────────────────────────────\n const [hoveredRow, setHoveredRow] = React.useState<string | number | null>(null)\n\n // ── Column lookup index (stable per `columns` reference) ─────────────────\n // The previous implementation called `columns.find(c => c.key === ...)` inside\n // every filter/sort comparator and every sticky-offset getter — for large\n // datasets that's O(rows × cols) per render. Map lookups make those O(1).\n const columnsByKey = React.useMemo(() => {\n const map = new Map<string, ColumnDef<TData>>()\n for (const col of columns) map.set(col.key, col)\n return map\n }, [columns])\n\n // Searchable text cache. Per row, concatenate every value into one\n // lower-cased blob ONCE and reuse it across keystrokes. Keyed by row\n // identity via WeakMap so it never holds onto rows the consumer dropped.\n const searchableTextCache = React.useRef<WeakMap<object, string>>(new WeakMap())\n const getSearchableText = React.useCallback((row: TData): string => {\n const cache = searchableTextCache.current\n const cached = cache.get(row)\n if (cached !== undefined) return cached\n let blob = \"\"\n for (const v of Object.values(row)) {\n if (v == null) continue\n blob += String(v).toLowerCase() + \"\\n\"\n }\n cache.set(row, blob)\n return blob\n }, [])\n\n // Per-row per-column lower-cased value cache (column quick-search +\n // text-mask filters). One `Map` per row, lazily filled on first lookup.\n const lowerValueCache = React.useRef<WeakMap<object, Map<string, string>>>(new WeakMap())\n const getLowerValue = React.useCallback((row: TData, key: string): string => {\n const wm = lowerValueCache.current\n let perRow = wm.get(row)\n if (!perRow) {\n perRow = new Map()\n wm.set(row, perRow)\n }\n const cached = perRow.get(key)\n if (cached !== undefined) return cached\n const computed = String(row[key] ?? \"\").toLowerCase()\n perRow.set(key, computed)\n return computed\n }, [])\n\n // Reset the row-keyed caches whenever the dataset reference changes so we\n // don't pin stale strings for rows the consumer just replaced.\n React.useEffect(() => {\n searchableTextCache.current = new WeakMap()\n lowerValueCache.current = new WeakMap()\n }, [data])\n\n // ── Derived: filtered + sorted rows ──────────────────────────────────────\n const rows = React.useMemo(() => {\n let result = data.slice()\n\n const q = search.trim().toLowerCase()\n if (q) {\n result = result.filter(r => getSearchableText(r).includes(q))\n }\n\n const activeWithValues = activeFilters.filter(f => {\n if (f.values.length === 0) return false\n const col = columnsByKey.get(f.fieldKey)\n if (col?.filter?.type === \"text\") {\n return (f.values[0] ?? \"\").trim().length > 0\n }\n return true\n })\n if (activeWithValues.length > 0) {\n // Pre-resolve column, operator, normalised needle, and select-value Set\n // for each active filter ONCE (instead of per row).\n type CompiledFilter = {\n col: ColumnDef<TData>\n id: string\n type: \"select\" | \"date\" | \"text\"\n operator: ActiveFilter[\"operator\"]\n selectValues?: Set<string>\n dateTarget?: string\n textNeedle?: string\n digitsNeedle?: string\n isDigitsMask?: boolean\n }\n const compiled: CompiledFilter[] = []\n for (const f of activeWithValues) {\n const col = columnsByKey.get(f.fieldKey)\n if (!col?.filter) continue\n if (col.filter.type === \"select\") {\n compiled.push({\n col,\n id: f.id,\n type: \"select\",\n operator: f.operator,\n selectValues: new Set(f.values),\n })\n } else if (col.filter.type === \"date\") {\n compiled.push({\n col,\n id: f.id,\n type: \"date\",\n operator: f.operator,\n dateTarget: f.values[0],\n })\n } else {\n const raw = f.values[0] ?? \"\"\n const isDigitsMask = col.filter.textMask === \"phone\" || col.filter.textMask === \"zip\"\n compiled.push({\n col,\n id: f.id,\n type: \"text\",\n operator: f.operator,\n isDigitsMask,\n digitsNeedle: isDigitsMask ? digitsOnly(raw) : undefined,\n textNeedle: !isDigitsMask ? raw.toLowerCase() : undefined,\n })\n }\n }\n\n const matchesCompiled = (r: TData, f: CompiledFilter): boolean => {\n const rowVal = String(r[f.col.key] ?? \"\")\n if (f.type === \"select\") {\n const hit = f.selectValues!.has(rowVal)\n return f.operator === \"is\" ? hit : !hit\n }\n if (f.type === \"date\") {\n if (!f.dateTarget) return true\n const rowYmd = parseRowDateToYmd(rowVal)\n const op = f.operator === \"is_not\" ? \"is_not\" : \"is\"\n if (rowYmd === null) return op === \"is_not\"\n return op === \"is\" ? rowYmd === f.dateTarget : rowYmd !== f.dateTarget\n }\n if (f.isDigitsMask) {\n if (!f.digitsNeedle) return true\n const hay = digitsOnly(rowVal)\n return f.operator === \"contains\" ? hay.includes(f.digitsNeedle) : !hay.includes(f.digitsNeedle)\n }\n if (!f.textNeedle) return true\n const hay = getLowerValue(r, f.col.key)\n return f.operator === \"contains\" ? hay.includes(f.textNeedle) : !hay.includes(f.textNeedle)\n }\n\n if (compiled.length > 0) {\n result = result.filter(r => {\n let res = matchesCompiled(r, compiled[0])\n for (let i = 1; i < compiled.length; i++) {\n const connector = filterConnectors[compiled[i - 1].id] ?? \"and\"\n const match = matchesCompiled(r, compiled[i])\n res = connector === \"and\" ? res && match : res || match\n }\n return res\n })\n }\n }\n\n // Column menu quick-search — pre-normalise needles outside the row loop.\n const colMenuEntries: { key: string; lower: string }[] = []\n for (const [key, raw] of Object.entries(colMenuSearch)) {\n const trimmed = raw.trim()\n if (trimmed) colMenuEntries.push({ key, lower: trimmed.toLowerCase() })\n }\n if (colMenuEntries.length > 0) {\n result = result.filter(r => {\n for (const { key, lower } of colMenuEntries) {\n if (!getLowerValue(r, key).includes(lower)) return false\n }\n return true\n })\n }\n\n // Sort — resolve each rule's sort key ONCE, then run the comparator over\n // an indexed list so the inner loop is a tight array walk, not a chain of\n // `columns.find` lookups per comparison.\n if (sortRules.length > 0) {\n const resolved: { sk: string; dir: SortDir }[] = []\n for (const rule of sortRules) {\n const col = columnsByKey.get(rule.fieldKey)\n const sk = col?.sortKey ?? col?.key\n if (sk) resolved.push({ sk: sk as string, dir: rule.direction })\n }\n if (resolved.length > 0) {\n result.sort((a, b) => {\n for (let i = 0; i < resolved.length; i++) {\n const { sk, dir } = resolved[i]\n const cmp = compareUnknownSort(a[sk], b[sk])\n if (cmp !== 0) return dir === \"asc\" ? cmp : -cmp\n }\n return 0\n })\n }\n }\n\n return result\n }, [\n data,\n search,\n activeFilters,\n filterConnectors,\n colMenuSearch,\n sortRules,\n columnsByKey,\n getSearchableText,\n getLowerValue,\n ])\n\n // ── Paged rows (slice of rows when pagination is active) ─────────────────\n const pagedRows = React.useMemo(() => {\n if (!paginationOverride || paginationOverride.pageSize <= 0) return rows\n const { page, pageSize } = paginationOverride\n const safePage = Math.max(1, page)\n return rows.slice((safePage - 1) * pageSize, safePage * pageSize)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, paginationOverride?.page, paginationOverride?.pageSize])\n\n // ── Grouped rows ──────────────────────────────────────────────────────────\n const groupedRows = React.useMemo(() => {\n if (!groupBy) return [{ groupKey: null as string | null, groupLabel: null as string | null, rows }]\n const groups = new Map<string, TData[]>()\n rows.forEach(row => {\n const val = String(row[groupBy] ?? \"—\")\n if (!groups.has(val)) groups.set(val, [])\n groups.get(val)!.push(row)\n })\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, groupRows]) => ({ groupKey: key, groupLabel: key, rows: groupRows }))\n }, [rows, groupBy])\n\n // ── Display columns ───────────────────────────────────────────────────────\n const displayCols = React.useMemo(() => {\n const leftPinned: string[] = []\n const free: string[] = []\n const rightPinned: string[] = []\n for (const k of colOrder) {\n const pin = colPins[k]\n if (pin === \"left\") leftPinned.push(k)\n else if (pin === \"right\") rightPinned.push(k)\n else free.push(k)\n }\n const ordered = [...leftPinned, ...free, ...rightPinned]\n const out: ColumnDef<TData>[] = []\n for (const k of ordered) {\n if (hiddenCols.has(k)) continue\n const col = columnsByKey.get(k)\n if (col) out.push(col)\n }\n return out\n }, [colOrder, colPins, hiddenCols, columnsByKey])\n\n const totalWidth = React.useMemo(\n () => displayCols.reduce((s, c) => s + (colWidths[c.key] ?? c.width ?? 100), 0),\n [displayCols, colWidths],\n )\n\n // ── Effective pins (respect overflow) ─────────────────────────────────────\n const LOCKED_KEYS = React.useMemo(() => new Set(Object.keys(lockedPins)), [lockedPins])\n\n // When the table fits within its container (not overflowing) there is no need\n // to sticky-pin any column — even locked ones. Pins only activate once the\n // user has to scroll horizontally so the selection / action edges stay visible.\n // In reflow viewports (high zoom), disable all column stickies — shadow + sticky\n // fight the short viewport and overlap content.\n const effectivePins = React.useMemo(() => {\n if (isReflowViewport || !isOverflowing) return {}\n const result: Record<string, \"left\" | \"right\"> = {}\n for (const [key, pin] of Object.entries(colPins)) {\n result[key] = pin\n }\n return result\n }, [colPins, isOverflowing, isReflowViewport])\n\n // ── Column actions ────────────────────────────────────────────────────────\n function startResize(key: string, e: React.MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n const minW = columns.find(c => c.key === key)?.minWidth ?? 60\n const startW = colWidths[key] ?? (columns.find(c => c.key === key)?.width ?? 100)\n resizeRef.current = { key, startX: e.clientX, startW }\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return\n const { key: k, startX, startW: sw } = resizeRef.current\n setColWidths(p => ({ ...p, [k]: Math.max(minW, sw + ev.clientX - startX) }))\n }\n const onUp = () => {\n resizeRef.current = null\n document.removeEventListener(\"mousemove\", onMove)\n document.removeEventListener(\"mouseup\", onUp)\n }\n document.addEventListener(\"mousemove\", onMove)\n document.addEventListener(\"mouseup\", onUp)\n }\n\n function handleDragStart(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n draggedKey.current = key\n e.dataTransfer.effectAllowed = \"move\"\n }\n function handleDragOver(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n e.preventDefault()\n e.dataTransfer.dropEffect = \"move\"\n if (draggedKey.current && draggedKey.current !== key) setDragOverKey(key)\n }\n function handleDrop(key: string) {\n if (!draggedKey.current || draggedKey.current === key) { setDragOverKey(null); return }\n const order = [...colOrder]\n const from = order.indexOf(draggedKey.current)\n const to = order.indexOf(key)\n order.splice(from, 1)\n order.splice(to, 0, draggedKey.current!)\n setColOrder(order)\n draggedKey.current = null\n setDragOverKey(null)\n }\n function handleDragEnd() { draggedKey.current = null; setDragOverKey(null) }\n\n function pinColumn(key: string, pin: \"left\" | \"right\") {\n setColPins(p => ({ ...p, [key]: pin }))\n }\n function unpinColumn(key: string) {\n if (lockedPins[key]) return\n setColPins(p => { const n = { ...p }; delete n[key]; return n })\n }\n function toggleWrap(key: string) {\n setColWrap(p => ({ ...p, [key]: !p[key] }))\n }\n\n // ── Scroll handlers ───────────────────────────────────────────────────────\n const checkOverflow = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n // Compare declared column width to scrollport — not scrollWidth, which matched\n // clientWidth when the table stretched with `w-full`.\n setIsOverflowing(totalWidth > el.clientWidth + 1)\n }, [totalWidth])\n\n function handleScroll() {\n const el = scrollRef.current\n if (!el) return\n setScrolled(el.scrollLeft > 1)\n setScrollEnd(el.scrollLeft >= el.scrollWidth - el.clientWidth - 1)\n setIsOverflowing(totalWidth > el.clientWidth + 1)\n }\n\n React.useLayoutEffect(() => {\n checkOverflow()\n }, [checkOverflow])\n\n // ── Selection helpers ─────────────────────────────────────────────────────\n function getRowId(row: TData, index: number, getIdFn?: (r: TData, i: number) => string | number): string | number {\n return getIdFn ? getIdFn(row, index) : (row.id as string | number ?? index)\n }\n\n const toggleRow = React.useCallback((id: string | number) => {\n setSelected(prev => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [setSelected])\n\n const toggleAll = React.useCallback((allRowIds: (string | number)[]) => {\n setSelected(prev => prev.size === allRowIds.length ? new Set() : new Set(allRowIds))\n }, [setSelected])\n\n // ── Sticky offset calculations ────────────────────────────────────────────\n // Precompute every pinned column's offset ONCE per render so the per-cell\n // `stickyStyle()` call is an O(1) map lookup instead of an O(cols) walk.\n // With `cells = rows × cols`, the previous O(rows × cols²) became the\n // dominant cost on wide tables.\n const stickyOffsets = React.useMemo(() => {\n const left = new Map<string, number>()\n const right = new Map<string, number>()\n let leftOffset = 0\n for (const col of displayCols) {\n if (effectivePins[col.key] !== \"left\") break\n left.set(col.key, leftOffset)\n leftOffset += colWidths[col.key] ?? col.width ?? 100\n }\n let rightOffset = 0\n for (let i = displayCols.length - 1; i >= 0; i--) {\n const col = displayCols[i]\n if (effectivePins[col.key] !== \"right\") break\n right.set(col.key, rightOffset)\n rightOffset += colWidths[col.key] ?? col.width ?? 100\n }\n return { left, right }\n }, [displayCols, effectivePins, colWidths])\n\n const getStickyLeft = React.useCallback((key: string): number => {\n return stickyOffsets.left.get(key) ?? 0\n }, [stickyOffsets])\n\n const getStickyRight = React.useCallback((key: string): number => {\n return stickyOffsets.right.get(key) ?? 0\n }, [stickyOffsets])\n\n const stickyStyle = React.useCallback(\n (key: string, isHeader = false): React.CSSProperties => {\n if (isReflowViewport) return {}\n const pin = effectivePins[key]\n if (pin === \"left\") {\n return isHeader\n ? { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0 }\n }\n if (pin === \"right\") {\n return isHeader\n ? { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0 }\n }\n return isHeader ? { position: \"sticky\", top: 0 } : {}\n },\n [effectivePins, isReflowViewport, stickyOffsets],\n )\n\n return {\n // Sort\n sortRules, setSortRules,\n sortKey, sortDir,\n addSortRule, removeSortRule, toggleSortDir, handleSortByKey,\n // Filters\n search, setSearch,\n searchOpen, setSearchOpen,\n searchRef,\n activeFilters, setActiveFilters,\n filterConnectors, setFilterConnectors, toggleConnector, getConnector,\n openFilterId, setOpenFilterId,\n filterBarVisible, setFilterBarVisible,\n drawerExpandedFilters, setDrawerExpandedFilters,\n addFilter, updateFilter, removeFilter,\n // Group\n groupBy, setGroupBy,\n // Column quick-search\n colMenuSearch, setColMenuSearch,\n // Selection\n selected, setSelected, toggleRow, toggleAll, getRowId,\n // Column widths / order / pins / wrap\n colWidths, setColWidths, resizeRef, startResize,\n colOrder, setColOrder, moveCol,\n colPins, setColPins, lockedPins, LOCKED_KEYS,\n pinColumn, unpinColumn,\n colWrap, setColWrap, toggleWrap,\n // Drag-to-reorder\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n // Scroll\n scrollRef, scrolled, scrollEnd, isOverflowing,\n checkOverflow, handleScroll,\n // Hover\n hoveredRow, setHoveredRow,\n // Derived\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n getStickyLeft, getStickyRight, stickyStyle,\n totalWidth,\n // Display settings\n sheetOpen, setSheetOpen,\n sheetInitialPanel, setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n hiddenCols, setHiddenCols, toggleColVisibility,\n }\n}\n","\"use client\"\n\n/**\n * DataTable<TData> — generic reusable table (no pagination)\n *\n * Column features:\n * • Resizable — drag trailing-edge handle on any non-locked column\n * • Drag-to-reorder — drag header cell for free (unpinned) columns\n * • Pin Left / Pin Right / Unpin — per-column context menu\n * • Sort Asc / Desc — per-column context menu (sortable columns)\n * • Wrap Text / Unwrap — per-column context menu\n * • Per-column quick search\n * • Row selection (checkboxes + floating bulk action bar)\n * • Group by (collapsible group rows)\n * • Hidden columns\n *\n * WCAG 2.1 AA:\n * ✓ aria-sort on sortable <th>\n * ✓ aria-label on every icon-only button\n * ✓ Select / Actions columns: sr-only header text + resolved labels for controls\n * ✓ Row checkboxes: visible on row focus-within, stop row click propagation (default control size; extended hit slop on Checkbox)\n * ✓ Bulk-action bar: role=\"status\" aria-live=\"polite\"\n * ✓ Resize handles: role=\"separator\" aria-label\n */\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../../lib/utils\"\nimport { rafThrottle } from \"../../lib/raf-throttle\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Kbd, KbdGroup } from \"../ui/kbd\"\nimport { Tip } from \"../ui/tip\"\nimport { useModKeyLabel } from \"../../hooks/use-mod-key-label\"\nimport { isEditableTarget } from \"../../lib/editable-target\"\nimport { Checkbox } from \"../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { OPERATOR_LABELS } from \"../../lib/table-properties-types\"\nimport type { ActiveFilter } from \"../../lib/table-properties-types\"\nimport { getConditionalCellBackground } from \"../../lib/conditional-rule-match\"\nimport { formatYmdForDisplay } from \"../../lib/date-filter\"\nimport { FilterDateCalendar } from \"./filter-date-calendar\"\nimport { FilterTextValueInput } from \"./filter-text-value-input\"\nimport type { DataTableProps, ColumnDef, SortDir } from \"./types\"\nimport { useTableState } from \"./use-table-state\"\n\n/** When `ColumnDef.label` is empty, use a standard name for select/actions columns. */\nfunction defaultColumnHeaderLabel(key: string): string | undefined {\n switch (key) {\n case \"select\":\n return \"Select\"\n case \"actions\":\n return \"Actions\"\n default:\n return undefined\n }\n}\n\nfunction resolvedColumnLabel<TData>(col: ColumnDef<TData>): string {\n const t = col.label?.trim()\n if (t) return t\n return defaultColumnHeaderLabel(col.key) ?? col.key\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SortChevron = React.memo(function SortChevron({ dir }: { dir: SortDir }) {\n return (\n <i className={`fa-solid fa-arrow-${dir === \"asc\" ? \"up\" : \"down\"} ms-1 text-xs`} aria-hidden=\"true\" />\n )\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FilterPill — active filter pill with inline editor popover\n// (driven by ColumnDef.filter config rather than FILTER_FIELDS)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface FilterPillProps<TData> {\n filter: ActiveFilter\n columns: ColumnDef<TData>[]\n defaultOpen?: boolean\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n onRemove: (id: string) => void\n /** Optional custom cell renderer for filter option values */\n renderOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\nfunction FilterPillBase<TData>({\n filter,\n columns,\n defaultOpen = false,\n onUpdate,\n onRemove,\n renderOptionValue,\n}: FilterPillProps<TData>) {\n const [open, setOpen] = React.useState(false)\n const [optSearch, setOptSearch] = React.useState(\"\")\n const justAutoOpenedRef = React.useRef(false)\n\n React.useEffect(() => {\n if (defaultOpen) {\n justAutoOpenedRef.current = true\n const t = setTimeout(() => {\n setOpen(true)\n setTimeout(() => { justAutoOpenedRef.current = false }, 400)\n }, 0)\n return () => clearTimeout(t)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const col = columns.find(c => c.key === filter.fieldKey)\n const filterDef = col?.filter\n\n React.useEffect(() => {\n if (!filterDef) return\n if (filterDef.type !== \"select\" && filterDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filter.id, { operator: \"is\" })\n }\n }, [filter.id, filterDef, filter.operator, onUpdate])\n\n if (!filterDef) return null\n\n const options = filterDef.options ?? []\n const showSearch = options.length > 8\n const filteredOpts = optSearch\n ? options.filter(o => o.label.toLowerCase().includes(optSearch.toLowerCase()))\n : options\n\n const operators = filterDef.operators ?? (\n filterDef.type === \"select\" || filterDef.type === \"date\"\n ? ([\"is\", \"is_not\"] as const)\n : ([\"contains\", \"not_contains\"] as const)\n )\n\n const valueLabel = (() => {\n if (filterDef.type === \"select\") {\n if (filter.values.length === 0) return \"…\"\n if (filter.values.length === 1) {\n return options.find(o => o.value === filter.values[0])?.label ?? filter.values[0]\n }\n return `${filter.values.length} selected`\n }\n if (filterDef.type === \"date\") {\n const ymd = filter.values[0]\n return ymd ? formatYmdForDisplay(ymd) : \"…\"\n }\n return filter.values[0] || \"…\"\n })()\n\n function toggleValue(val: string) {\n const next = filter.values.includes(val)\n ? filter.values.filter(v => v !== val)\n : [...filter.values, val]\n onUpdate(filter.id, { values: next })\n }\n\n function cycleOperator() {\n const idx = operators.indexOf(filter.operator as typeof operators[number])\n const i = idx === -1 ? 0 : idx\n onUpdate(filter.id, { operator: operators[(i + 1) % operators.length] })\n }\n\n const isActive =\n filterDef.type === \"date\"\n ? Boolean(filter.values[0])\n : filter.values.length > 0\n const hasSelection = filter.values.length > 0\n const iconClass = filterDef.icon ? `fa-light ${filterDef.icon}` : \"fa-light fa-filter\"\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n className={cn(\n \"inline-flex cursor-pointer items-center rounded border text-xs transition-colors\",\n isActive ? \"border-brand/45 bg-brand/10\" : \"border-input bg-background\"\n )}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex cursor-pointer items-center gap-1 h-6 ps-2 pe-1.5 rounded-s transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n )}\n >\n <i\n className={cn(iconClass, \"text-xs\", isActive ? \"text-brand\" : \"text-muted-foreground\")}\n aria-hidden=\"true\"\n />\n <span className=\"text-foreground\">{col.label}</span>\n {isActive && <span className=\"text-foreground font-medium\">{valueLabel}</span>}\n </button>\n </PopoverTrigger>\n <button\n type=\"button\"\n aria-label={`Remove ${col.label} filter`}\n onClick={() => onRemove(filter.id)}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center h-6 w-5 rounded-e transition-colors\",\n \"text-muted-foreground hover:text-destructive\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n </PopoverAnchor>\n\n <PopoverContent\n className={cn(\n \"p-0\",\n filterDef.type === \"date\"\n ? \"w-auto max-w-[min(calc(100vw-2rem),22rem)]\"\n : \"w-64\",\n )}\n align=\"start\"\n onFocusOutside={e => e.preventDefault()}\n onInteractOutside={e => {\n if (justAutoOpenedRef.current) {\n e.preventDefault()\n justAutoOpenedRef.current = false\n }\n }}\n >\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <div className=\"flex items-center gap-1 text-sm text-foreground\">\n <span className=\"font-medium\">{col.label}</span>\n <button\n type=\"button\"\n onClick={cycleOperator}\n className=\"inline-flex items-center gap-0.5 text-muted-foreground hover:text-interactive-hover-foreground transition-colors rounded px-1 py-0.5 hover:bg-interactive-hover\"\n >\n {OPERATOR_LABELS[filter.operator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <button\n type=\"button\"\n aria-label=\"Remove filter\"\n onClick={() => onRemove(filter.id)}\n className=\"text-muted-foreground hover:text-destructive transition-colors p-1 rounded hover:bg-interactive-hover\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {filterDef.type === \"date\" && (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${col.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filter.id, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n )}\n\n {filterDef.type === \"select\" && (\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n {showSearch && (\n <div className=\"px-2 pt-1 pb-1\">\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder=\"Search options…\"\n value={optSearch}\n onChange={e => setOptSearch(e.target.value)}\n className={cn(\"h-7 text-xs\", optSearch ? \"pe-8\" : \"pe-2\")}\n autoFocus\n />\n {optSearch ? (\n <button\n type=\"button\"\n aria-label=\"Clear option search\"\n onClick={() => setOptSearch(\"\")}\n className=\"absolute end-1 top-1/2 -translate-y-1/2 inline-flex size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n </div>\n )}\n {filteredOpts.map(opt => {\n const checked = filter.values.includes(opt.value)\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={checked}\n tabIndex={0}\n onClick={() => toggleValue(opt.value)}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); toggleValue(opt.value) } }}\n className=\"flex w-full items-center gap-2.5 px-3 py-1.5 text-sm hover:bg-interactive-hover transition-colors cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"checkbox\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[4px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}\n >\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"8px\" }} />}\n </span>\n {renderOptionValue\n ? renderOptionValue(filter.fieldKey, opt.value)\n : <span className=\"text-foreground\">{opt.label}</span>\n }\n </div>\n )\n })}\n {filteredOpts.length === 0 && (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">No options found</p>\n )}\n </div>\n )}\n\n {filterDef.type === \"text\" && (\n <div className=\"p-2\">\n <FilterTextValueInput\n mask={filterDef.textMask}\n placeholder={`Enter ${col.label.toLowerCase()}…`}\n value={filter.values[0] ?? \"\"}\n onValueChange={next => onUpdate(filter.id, { values: [next] })}\n aria-label={`${col.label} filter value`}\n className=\"h-8 text-xs focus-visible:border-ring focus-visible:ring-ring/50\"\n autoFocus\n />\n </div>\n )}\n {hasSelection ? (\n <div className=\"sticky bottom-0 border-t border-border bg-popover p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filter.id, { values: [] })}\n className=\"w-full justify-center gap-1.5 text-xs text-muted-foreground\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n Clear selection\n </Button>\n </div>\n ) : null}\n </PopoverContent>\n </Popover>\n )\n}\n\n// React.memo wrapper — preserves generic signature via cast.\n// FilterPillBase is a pure function of its props; memoizing it prevents\n// re-renders when unrelated table state (hover, scroll) changes.\nconst FilterPill = React.memo(FilterPillBase) as typeof FilterPillBase\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sticky shadow utility\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction stickyShadow(pin: \"left\" | \"right\" | undefined): string {\n if (!pin) return \"\"\n const base = \"after:content-[''] after:absolute after:top-0 after:bottom-0 after:w-3 after:pointer-events-none\"\n if (pin === \"left\") {\n return cn(\n base,\n \"after:start-full\",\n \"after:bg-[linear-gradient(to_right,var(--sticky-edge-fade),transparent)]\",\n )\n }\n return cn(\n base,\n \"after:end-full\",\n \"after:bg-[linear-gradient(to_left,var(--sticky-edge-fade),transparent)]\",\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTableToolbar — search, filter bar, properties slot (shared by table + board)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function DataTableToolbar<TData extends Record<string, unknown>>({\n state,\n columns,\n searchable = true,\n /** When false, hides filter pills, search, and filter controls (e.g. dashboard canvas edit mode). */\n showQueryControls = true,\n renderFilterOptionValue,\n toolbarSlot,\n searchAriaLabel = \"Search table\",\n}: {\n state: ReturnType<typeof useTableState<TData>>\n columns: ColumnDef<TData>[]\n searchable?: boolean\n showQueryControls?: boolean\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Passed to the search input `aria-label` (e.g. \"Search placements\") */\n searchAriaLabel?: string\n}) {\n const {\n search, setSearch, searchOpen, setSearchOpen, searchRef,\n activeFilters, setActiveFilters, openFilterId,\n filterBarVisible, setFilterBarVisible,\n addFilter, updateFilter, removeFilter,\n } = state\n\n const filterableCols = columns.filter(c => c.filter)\n const searchModLabel = useModKeyLabel()\n const effectiveSearchable = showQueryControls && searchable\n\n React.useEffect(() => {\n if (!effectiveSearchable) return\n function onGlobalKeyDown(e: KeyboardEvent) {\n if (!e.metaKey && !e.ctrlKey) return\n if (e.altKey) return\n if (e.key.toLowerCase() !== \"k\") return\n if (isEditableTarget(e.target)) return\n e.preventDefault()\n setSearchOpen(true)\n queueMicrotask(() => searchRef.current?.focus())\n }\n document.addEventListener(\"keydown\", onGlobalKeyDown)\n return () => document.removeEventListener(\"keydown\", onGlobalKeyDown)\n }, [effectiveSearchable, setSearchOpen, searchRef])\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 px-4 lg:px-6\",\n showQueryControls ? \"min-h-10 pt-2 pb-2\" : \"min-h-0 justify-end py-1.5\",\n )}\n >\n\n {showQueryControls && filterBarVisible && filterableCols.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 flex-1 min-w-0\">\n {activeFilters.map(filter => (\n <React.Fragment key={filter.id}>\n <FilterPill\n filter={filter}\n columns={columns}\n defaultOpen={filter.id === openFilterId}\n onUpdate={updateFilter}\n onRemove={removeFilter}\n renderOptionValue={renderFilterOptionValue}\n />\n </React.Fragment>\n ))}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\"\n className=\"inline-flex cursor-pointer items-center gap-1 h-6 px-2 rounded text-xs text-muted-foreground hover:text-interactive-hover-foreground border border-dashed border-input/70 hover:border-input hover:bg-interactive-hover-subtle transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {activeFilters.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setActiveFilters([])}\n className=\"cursor-pointer text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors px-1\"\n >\n Clear all\n </button>\n )}\n </div>\n )}\n\n <div\n className={cn(\n \"flex items-center gap-1 shrink-0\",\n showQueryControls && \"ms-auto\",\n )}\n >\n\n {effectiveSearchable && (\n searchOpen ? (\n <div className=\"relative flex items-center\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2.5 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n ref={searchRef}\n type=\"text\"\n role=\"searchbox\"\n inputMode=\"search\"\n autoComplete=\"off\"\n placeholder=\"Search…\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n onBlur={() => { if (!search) setSearchOpen(false) }}\n onKeyDown={e => { if (e.key === \"Escape\") { setSearch(\"\"); setSearchOpen(false) } }}\n className={cn(\"h-8 w-48 ps-7 text-xs\", search ? \"pe-8\" : \"pe-2\")}\n aria-label={searchAriaLabel}\n />\n {search ? (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setSearch(\"\")}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 inline-flex cursor-pointer size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n ) : (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label=\"Search\"\n onClick={() => { setSearchOpen(true); setTimeout(() => searchRef.current?.focus(), 10) }}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-magnifying-glass text-[13px]\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <span>{searchAriaLabel}</span>\n <KbdGroup>\n <Kbd>{searchModLabel}</Kbd>\n <Kbd>K</Kbd>\n </KbdGroup>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n )}\n\n {showQueryControls && filterableCols.length > 0 && (\n <>\n <div className=\"h-4 w-px bg-border/70\" aria-hidden=\"true\" />\n {activeFilters.length > 0 ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\"\n aria-label={filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n onClick={() => setFilterBarVisible(v => !v)}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center gap-1 size-8 justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterBarVisible\n ? \"bg-accent text-accent-foreground hover:bg-accent/90\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n <span className=\"text-xs font-semibold tabular-nums\">{activeFilters.length}</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n // NOTE: Tooltip MUST wrap DropdownMenuTrigger directly (not the\n // surrounding <DropdownMenu> wrapper). Radix `asChild` Slot needs\n // a real DOM child — `<DropdownMenu>` is a logical wrapper, so\n // putting it inside TooltipTrigger swallows the tooltip handlers\n // and the hover hint silently disappears.\n <DropdownMenu>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" aria-label=\"Add filter\"\n onClick={() => setFilterBarVisible(true)}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Add filter</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </>\n )}\n\n {toolbarSlot && toolbarSlot(state)}\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTable<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTableExtendedProps<TData extends Record<string, unknown>>\n extends DataTableProps<TData> {\n /** Slot for a toolbar drawer button + drawer itself (e.g. TablePropertiesDrawer) */\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Slot rendered inside the floating bulk-action bar (after the \"N selected\" label) */\n bulkActionsSlot?: (selected: Set<string | number>, rows: TData[]) => React.ReactNode\n /** Optional \"add new row\" row text — pass false to hide */\n addRowLabel?: string | false\n /** Custom option-value renderer for filter pills */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** When set by DataTablePaginated — drives row slicing inside useTableState */\n paginationOverride?: { page: number; pageSize: number }\n /** When true, removes rounded bottom corners so a pagination bar can attach flush */\n hasFooter?: boolean\n /** Conditional formatting rules — apply bg color to cells based on value */\n conditionalRules?: import(\"./types\").ConditionalRule[]\n /** When false, the column header row is hidden (Display options). */\n showColumnHeaders?: boolean\n /** When set, table uses this state (e.g. shared with board view) instead of internal useTableState. */\n state?: ReturnType<typeof useTableState<TData>>\n}\n\ntype DataTableInnerProps<TData extends Record<string, unknown>> = DataTableExtendedProps<TData> & {\n state: ReturnType<typeof useTableState<TData>>\n}\n\n/** Max width for bulk bar in normal (non-reflow) zoom — ~28rem, centered in table. */\nconst BULK_BAR_MAX_PX = 448\n\n/**\n * When the app theme is `dark`, the bulk strip is a **light** surface; shadcn\n * “dark:” button tokens are wrong — reapply light-look solid/outline/destructive/ghost.\n */\nconst BULK_BAR_ON_LIGHT_STRIP = cn(\n \"[&_button[data-variant=default]]:bg-zinc-900 [&_button[data-variant=default]]:text-zinc-50\",\n \"hover:[&_button[data-variant=default]]:bg-zinc-800\",\n \"[&_button[data-variant=outline]]:border-zinc-300/80 [&_button[data-variant=outline]]:bg-white [&_button[data-variant=outline]]:text-zinc-900\",\n \"hover:[&_button[data-variant=outline]]:bg-zinc-100\",\n \"[&_button[data-variant=destructive]]:border-rose-200/80 [&_button[data-variant=destructive]]:bg-rose-100 [&_button[data-variant=destructive]]:text-rose-800\",\n \"hover:[&_button[data-variant=destructive]]:bg-rose-200/40\",\n \"[&_button[data-variant=ghost]]:text-zinc-600 hover:[&_button[data-variant=ghost]]:bg-zinc-200/70 hover:[&_button[data-variant=ghost]]:text-zinc-900\",\n)\n\n/**\n * Pins the bulk bar to the viewport bottom, aligned to the table scroll\n * wrapper. When `fullWidth` is false (normal zoom), width is\n * `min(tableWidth, 28rem)` and centered; when true (reflow), matches table\n * width.\n */\nfunction useBulkBarFixedToTableScrollEl(\n scrollRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n fullWidth: boolean,\n): React.CSSProperties | undefined {\n const [style, setStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n React.useLayoutEffect(() => {\n if (!active) {\n setStyle(undefined)\n return\n }\n const el = scrollRef.current\n if (!el) {\n setStyle(undefined)\n return\n }\n const apply = () => {\n const r = el.getBoundingClientRect()\n let left = r.left\n let width = r.width\n if (!fullWidth) {\n const w = Math.min(r.width, BULK_BAR_MAX_PX)\n left = r.left + (r.width - w) / 2\n width = w\n }\n setStyle({\n position: \"fixed\",\n left,\n width,\n bottom: \"max(0.5rem, env(safe-area-inset-bottom, 0px))\",\n zIndex: 50,\n boxSizing: \"border-box\",\n margin: 0,\n right: \"auto\",\n })\n }\n apply()\n // rAF-coalesce so a single frame handles bursts of capture-phase scroll\n // events plus the ResizeObserver firing — instead of N getBoundingClientRect\n // + setState per second.\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(el)\n el.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n window.addEventListener(\"scroll\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n el.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"resize\", scheduled)\n window.removeEventListener(\"scroll\", scheduled)\n }\n }, [active, fullWidth, scrollRef])\n return style\n}\n\nfunction DataTableInner<TData extends Record<string, unknown>>({\n // `data` / `defaultSort` flow into `useTableState` upstream; the inner table\n // reads them via `state` and never directly here. Keep the prop slots so\n // the public `DataTable<TData>` API stays unchanged.\n data: _data,\n columns,\n getRowId: getRowIdProp,\n getRowSelectionLabel,\n selectable = true,\n searchable = true,\n emptyState,\n onRowClick,\n defaultSort: _defaultSort,\n toolbarSlot,\n bulkActionsSlot,\n addRowLabel = false,\n renderFilterOptionValue,\n hasFooter = false,\n conditionalRules,\n showColumnHeaders = true,\n state,\n}: DataTableInnerProps<TData>) {\n const {\n setSortRules,\n sortKey, sortDir,\n handleSortByKey,\n addFilter,\n groupBy, setGroupBy,\n colMenuSearch, setColMenuSearch,\n selected, setSelected, toggleRow, toggleAll, getRowId,\n colWidths, startResize,\n colPins, lockedPins,\n pinColumn, unpinColumn,\n colWrap, toggleWrap,\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n scrollRef, handleScroll, checkOverflow,\n isOverflowing,\n setHoveredRow,\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n stickyStyle,\n totalWidth,\n rowHeight,\n showGridlines,\n setSheetOpen,\n setSheetInitialPanel,\n } = state\n\n // Mount overflow check + scrollport width for sticky group headers on horizontal scroll.\n // Re-run when column widths / visibility change — scrollWidth alone is unreliable when\n // the table used to stretch with `w-full` (scrollWidth === clientWidth even with many cols).\n React.useLayoutEffect(() => {\n const syncScrollport = () => {\n const el = scrollRef.current\n if (el) {\n el.style.setProperty(\"--dt-scrollport-width\", `${el.clientWidth}px`)\n }\n checkOverflow()\n }\n syncScrollport()\n const el = scrollRef.current\n if (!el) return\n const ro = new ResizeObserver(syncScrollport)\n ro.observe(el)\n const table = el.querySelector(\"table\")\n if (table) ro.observe(table)\n return () => ro.disconnect()\n }, [totalWidth, displayCols.length, checkOverflow, scrollRef])\n\n /** Pending action queued from a column-menu item that should run *after* the menu\n * has fully closed. The Properties drawer is a non-modal Radix Sheet (`modal=false`)\n * and Radix's DropdownMenu close cycle races with the Sheet's `onInteractOutside`\n * / focus-return logic if we open the Sheet synchronously from `onSelect` / `onClick`.\n * `onCloseAutoFocus` on `DropdownMenuContent` is the Radix-native hook that fires\n * after the menu has unmounted and focus has returned — the safe moment to act. */\n const columnMenuPendingActionRef = React.useRef<(() => void) | null>(null)\n\n /** One-time horizontal nudge when the grid overflows and pins are active — hints that more columns scroll (overlay scrollbars, esp. Windows, are often invisible until interaction). */\n const pinnedScrollHintDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (!isOverflowing || isReflowViewport || Object.keys(colPins).length === 0) return\n if (pinnedScrollHintDoneRef.current) return\n const el = scrollRef.current\n if (!el) return\n if (el.scrollLeft > 2) return\n const maxScroll = el.scrollWidth - el.clientWidth\n if (maxScroll < 16) return\n if (typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n pinnedScrollHintDoneRef.current = true\n return\n }\n\n pinnedScrollHintDoneRef.current = true\n const delta = Math.min(96, Math.max(28, Math.round(maxScroll * 0.14)))\n const startDelayMs = 320\n const dwellMs = 520\n\n const t1 = window.setTimeout(() => {\n el.scrollTo({ left: delta, behavior: \"smooth\" })\n }, startDelayMs)\n const t2 = window.setTimeout(() => {\n el.scrollTo({ left: 0, behavior: \"smooth\" })\n }, startDelayMs + dwellMs)\n\n return () => {\n window.clearTimeout(t1)\n window.clearTimeout(t2)\n }\n }, [isOverflowing, isReflowViewport, colPins, scrollRef])\n\n const lastLeftPinKey = [...displayCols].reverse().find(c => effectivePins[c.key] === \"left\")?.key\n const firstRightPinKey = displayCols.find(c => effectivePins[c.key] === \"right\")?.key\n\n function floatingHeaderPinnedStyle(key: string): React.CSSProperties | undefined {\n const pin = effectivePins[key]\n if (!pin) return undefined\n\n const visibleWidth =\n typeof floatingHeaderStyle?.width === \"number\"\n ? floatingHeaderStyle.width\n : tableWrapRef.current?.clientWidth ?? floatingHeaderTableWidth\n const maxScroll = Math.max(0, floatingHeaderTableWidth - visibleWidth)\n const translateX = pin === \"left\"\n ? headerScrollLeft\n : headerScrollLeft - maxScroll\n\n // The floating sticky header is horizontally translated as one table.\n // Counter-translate pinned header cells so they remain locked to the viewport edge.\n return { position: \"relative\", transform: `translateX(${translateX}px)` }\n }\n\n // Row IDs for the current visible rows\n const allRowIds = rows.map((r, i) => getRowId(r, i, getRowIdProp))\n const allSelected = rows.length > 0 && selected.size === rows.length\n const someSelected = selected.size > 0 && !allSelected\n const anySelected = selected.size > 0\n\n const { resolvedTheme } = useTheme()\n const isAppDark = resolvedTheme === \"dark\"\n\n const bulkBarUseFixedLayout = anySelected\n /** Reflow: bar spans table width. Normal zoom: bar centered, max 28rem. */\n const bulkBarFixedStyle = useBulkBarFixedToTableScrollEl(\n scrollRef,\n bulkBarUseFixedLayout,\n isReflowViewport,\n )\n const tableWrapRef = React.useRef<HTMLDivElement | null>(null)\n const tableHeadRef = React.useRef<HTMLTableSectionElement | null>(null)\n const [headerIsStuck, setHeaderIsStuck] = React.useState(false)\n const [headerScrollLeft, setHeaderScrollLeft] = React.useState(0)\n const [floatingHeaderStyle, setFloatingHeaderStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n const [floatingHeaderTableWidth, setFloatingHeaderTableWidth] = React.useState(totalWidth)\n const [isClient, setIsClient] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n }, [])\n\n React.useEffect(() => {\n const wrapEl = tableWrapRef.current\n const headEl = tableHeadRef.current\n if (!wrapEl || !headEl || !showColumnHeaders) {\n setHeaderIsStuck(false)\n return\n }\n\n const update = () => {\n const wrapRect = wrapEl.getBoundingClientRect()\n const headHeight = headEl.getBoundingClientRect().height || 0\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const stuck = wrapRect.top <= headerOffset && wrapRect.bottom > (headHeight + headerOffset + 1)\n setHeaderIsStuck(prev => (prev === stuck ? prev : stuck))\n }\n\n update()\n const scheduled = rafThrottle(update)\n // Listen on the table scrollport + window resize only. Avoid capture-phase\n // `window` scroll — it fires for every nested scroll container (sidebar,\n // secondary panel, sheets) and kept the main thread busy while the app looked idle.\n wrapEl.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"scroll\", scheduled, { passive: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n wrapEl.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"scroll\", scheduled)\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [showColumnHeaders, rows.length, displayCols.length])\n\n React.useLayoutEffect(() => {\n if (!headerIsStuck || !showColumnHeaders) {\n setFloatingHeaderStyle(undefined)\n return\n }\n const wrapEl = tableWrapRef.current\n if (!wrapEl) {\n setFloatingHeaderStyle(undefined)\n return\n }\n\n const apply = () => {\n const rect = wrapEl.getBoundingClientRect()\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const cs = getComputedStyle(wrapEl)\n const borderLeft = parseFloat(cs.borderLeftWidth) || 0\n const borderRight = parseFloat(cs.borderRightWidth) || 0\n const visibleWidth = Math.max(0, wrapEl.clientWidth - borderLeft - borderRight)\n const renderedTableWidth = Math.max(\n totalWidth,\n visibleWidth,\n wrapEl.querySelector(\"table\")?.getBoundingClientRect().width ?? 0,\n )\n setFloatingHeaderStyle({\n position: \"fixed\",\n top: headerOffset,\n left: rect.left + borderLeft,\n width: visibleWidth,\n zIndex: 50,\n })\n setFloatingHeaderTableWidth(renderedTableWidth)\n setHeaderScrollLeft(wrapEl.scrollLeft)\n }\n\n apply()\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(wrapEl)\n window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n window.removeEventListener(\"scroll\", scheduled, { capture: true })\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [headerIsStuck, showColumnHeaders, totalWidth, displayCols.length])\n\n function ariaSortAttr(colKey: string): React.AriaAttributes[\"aria-sort\"] {\n return sortKey !== colKey ? \"none\" : sortDir === \"asc\" ? \"ascending\" : \"descending\"\n }\n\n function cellStyle(key: string): React.CSSProperties {\n return stickyStyle(key)\n }\n\n // ─── Render ───────────────────────────────────────────────────────────────\n return (\n <div className=\"flex min-w-0 w-full flex-col gap-0\">\n\n <DataTableToolbar\n state={state}\n columns={columns}\n searchable={searchable}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={toolbarSlot}\n searchAriaLabel=\"Search table\"\n />\n\n {isClient && showColumnHeaders && headerIsStuck && floatingHeaderStyle\n ? createPortal(\n <div\n style={floatingHeaderStyle}\n className=\"pointer-events-auto\"\n >\n <div className=\"overflow-hidden border border-border bg-dt-header-bg shadow-[0_10px_18px_-14px_rgba(15,23,42,0.5)] dark:shadow-[0_12px_20px_-14px_rgba(0,0,0,0.75)]\">\n <div style={{ transform: `translateX(${-headerScrollLeft}px)` }}>\n <table\n className=\"w-full text-sm border-separate border-spacing-0\"\n style={{ tableLayout: \"fixed\", width: floatingHeaderTableWidth }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n <thead className=\"bg-dt-header-bg\">\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n return (\n <th\n key={col.key}\n scope=\"col\"\n style={floatingHeaderPinnedStyle(col.key)}\n className={cn(\n \"h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isPinned && \"relative\",\n isEdgePinCol && stickyShadow(effectivePins[col.key]),\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\",\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key ? <SortChevron dir={sortDir} /> : null}\n </button>\n ) : (\n <span className=\"truncate whitespace-nowrap\">\n {col.label?.trim()\n ? col.label\n : defaultColumnHeaderLabel(col.key) ?? col.key}\n </span>\n )}\n </div>\n </div>\n </th>\n )\n })}\n </tr>\n </thead>\n </table>\n </div>\n </div>\n </div>,\n document.body,\n )\n : null}\n\n {/* ── Table ────────────────────────────────────────────────────────── */}\n <div\n ref={el => {\n tableWrapRef.current = el\n scrollRef.current = el\n }}\n onScroll={e => {\n handleScroll()\n setHeaderScrollLeft((e.currentTarget as HTMLDivElement).scrollLeft)\n }}\n className={cn(\n \"mx-4 lg:mx-6 overflow-x-auto border-t border-x border-border\",\n hasFooter ? \"rounded-t-lg\" : \"border-b rounded-lg\",\n )}\n >\n <table\n className=\"text-sm border-separate border-spacing-0\"\n style={{\n tableLayout: \"fixed\",\n // Explicit column-sum width — `w-full` made the grid stretch to the scrollport\n // so scrollWidth === clientWidth and the overflow-gated pin rule never fired.\n width: totalWidth,\n }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n\n {/* ── Table head ──────────────────────────────────────────────── */}\n <thead\n ref={tableHeadRef}\n className={cn(\n \"bg-dt-header-bg\",\n headerIsStuck && \"invisible\",\n !showColumnHeaders && \"hidden\"\n )}\n >\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isLocked = !!lockedPins[col.key]\n const isFree = !colPins[col.key]\n const isResizable = !isLocked || (col.key !== \"select\")\n\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={col.sortable && col.sortKey ? ariaSortAttr(col.sortKey as string) : undefined}\n draggable={isFree}\n onDragStart={isFree ? e => handleDragStart(col.key, e) : undefined}\n onDragOver={isFree ? e => handleDragOver(col.key, e) : undefined}\n onDrop={isFree ? () => handleDrop(col.key) : undefined}\n onDragEnd={isFree ? handleDragEnd : undefined}\n style={stickyStyle(col.key, false)}\n className={cn(\n \"group/th relative h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isFree && \"cursor-grab active:cursor-grabbing\",\n dragOverKey === col.key && draggedKey.current !== col.key && \"bg-accent/40\",\n isEdgePinCol && stickyShadow(effectivePins[col.key])\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.header ? (\n col.header()\n ) : col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <Tip label={`Sort by ${resolvedColumnLabel(col)}`} side=\"top\">\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\"\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key && <SortChevron dir={sortDir} />}\n </button>\n </Tip>\n ) : (\n <Tip label={resolvedColumnLabel(col)} side=\"top\">\n <span className=\"whitespace-nowrap\">\n {col.label?.trim() ? (\n col.label\n ) : defaultColumnHeaderLabel(col.key) ? (\n <span className=\"sr-only\">{defaultColumnHeaderLabel(col.key)}</span>\n ) : (\n <span className=\"sr-only\">{col.key}</span>\n )}\n </span>\n </Tip>\n )}\n </div>\n\n {/* Column context menu — not on checkbox or locked-right columns */}\n {col.key !== \"select\" && !lockedPins[col.key]?.includes(\"right\") && col.key !== (columns.find(c => c.lockPin && c.defaultPin === \"right\")?.key) && (\n <DropdownMenu>\n <Tip label=\"Column options\" side=\"top\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`${resolvedColumnLabel(col)} column options`}\n onClick={e => e.stopPropagation()}\n className={cn(\n \"opacity-0 group-hover/th:opacity-100 group-focus-within/th:opacity-100\",\n \"inline-flex shrink-0 items-center justify-center size-7 rounded-md\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover-row\",\n \"transition-opacity focus-visible:opacity-100\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-ellipsis-vertical text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={() => {\n const action = columnMenuPendingActionRef.current\n if (!action) return\n columnMenuPendingActionRef.current = null\n action()\n }}\n >\n\n {/* Column quick-search */}\n <div className=\"px-2 pt-2 pb-1\">\n <div className=\"relative\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n placeholder={`Search ${resolvedColumnLabel(col)}…`}\n value={colMenuSearch[col.key] ?? \"\"}\n onChange={e => setColMenuSearch(prev => ({ ...prev, [col.key]: e.target.value }))}\n onKeyDown={e => e.stopPropagation()}\n className=\"h-7 ps-6 text-xs\"\n />\n {colMenuSearch[col.key] && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setColMenuSearch(prev => ({ ...prev, [col.key]: \"\" }))}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-interactive-hover-foreground transition-colors\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <DropdownMenuSeparator />\n\n {/* Pin options */}\n {!isLocked && (\n <>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"left\")}\n disabled={colPins[col.key] === \"left\"}\n >\n <i className=\"fa-light fa-arrow-left-to-line\" aria-hidden=\"true\" />\n Pin Left\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"right\")}\n disabled={colPins[col.key] === \"right\"}\n >\n <i className=\"fa-light fa-arrow-right-to-line\" aria-hidden=\"true\" />\n Pin Right\n </DropdownMenuItem>\n {colPins[col.key] && (\n <DropdownMenuItem onClick={() => unpinColumn(col.key)}>\n <i className=\"fa-light fa-thumbtack-slash\" aria-hidden=\"true\" />\n Unpin\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Sort options */}\n {col.sortable && col.sortKey && (\n <>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"asc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-up-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"desc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-down-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Descending\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Text wrap toggle */}\n <DropdownMenuItem onClick={() => toggleWrap(col.key)}>\n <i className=\"fa-light fa-text-width\" aria-hidden=\"true\" />\n {colWrap[col.key] ? \"Unwrap Text\" : \"Wrap Text\"}\n </DropdownMenuItem>\n\n {/* Filter / Group by */}\n <DropdownMenuSeparator />\n {col.filter && (\n <DropdownMenuItem onClick={() => addFilter(col.key)}>\n <i className=\"fa-light fa-filter\" aria-hidden=\"true\" />\n Filter by this column\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => setGroupBy(groupBy === col.key ? null : col.key)}\n >\n <i className=\"fa-light fa-layer-group\" aria-hidden=\"true\" />\n {groupBy === col.key ? \"Remove Grouping\" : \"Group by this Column\"}\n </DropdownMenuItem>\n\n {/* Conditional rule shortcut */}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => {\n // Queue the deep-link into `onCloseAutoFocus` (above).\n // Opening the non-modal Properties Sheet synchronously\n // here races with the DropdownMenu close cycle and the\n // Sheet's outside-interaction listener — neither RAF\n // nor setTimeout(0) is enough. `onCloseAutoFocus` is\n // Radix's official \"menu is fully closed and focus has\n // returned\" hook, so it's the only safe moment.\n // Set the panel + open in the same batched action —\n // both setState calls land in one render so the drawer\n // opens already focused on the Conditional rules panel.\n columnMenuPendingActionRef.current = () => {\n setSheetInitialPanel(\"conditional-rules\")\n setSheetOpen(true)\n }\n }}\n >\n <i className=\"fa-light fa-palette\" aria-hidden=\"true\" />\n Add Conditional Rule\n </DropdownMenuItem>\n\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n\n {/* Resize handle */}\n {isResizable && col.key !== \"select\" && (\n <div\n role=\"separator\"\n aria-label={`Resize ${resolvedColumnLabel(col)} column`}\n aria-orientation=\"vertical\"\n onMouseDown={e => startResize(col.key, e)}\n className=\"absolute end-0 top-1 bottom-1 w-1.5 cursor-col-resize rounded-full hover:bg-interactive-hover-foreground/50 active:bg-muted-foreground/70 transition-colors\"\n />\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n\n {/* ── Table body ───────────────────────────────────────────────── */}\n <tbody>\n {(pagedRows !== rows\n ? [{ groupKey: null as string | null, groupLabel: null as string | null, rows: pagedRows }]\n : groupedRows\n ).map(({ groupKey, groupLabel, rows: groupRows }) => (\n <React.Fragment key={groupKey ?? \"__all__\"}>\n {groupLabel && (\n <tr>\n <td colSpan={displayCols.length} className=\"p-0 border-b border-border bg-dt-group-bg\">\n <div\n className={cn(\n \"sticky start-0 z-[25] px-4 py-1.5 text-xs font-semibold text-muted-foreground tracking-wide bg-dt-group-bg select-none\",\n !isReflowViewport && \"shadow-[4px_0_8px_-4px_var(--sticky-edge-fade)]\",\n )}\n style={{ width: \"var(--dt-scrollport-width, 100%)\" }}\n >\n {groupLabel}\n <span className=\"ms-2 font-normal normal-case opacity-60 tracking-normal\">\n {groupRows.length} record{groupRows.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n </td>\n </tr>\n )}\n {groupRows.map((row, rowIndex) => {\n const rowId = getRowId(row, rowIndex, getRowIdProp)\n const isSelected = selected.has(rowId)\n const rowClickable = Boolean(onRowClick) || selectable\n function handleRowClick(e: React.MouseEvent<HTMLTableRowElement>) {\n if (!rowClickable) return\n const el = e.target as HTMLElement | null\n if (!el) return\n if (el.closest(\"button, a, input, textarea, select, label, [role='checkbox']\")) return\n if (onRowClick) {\n onRowClick(row)\n return\n }\n if (selectable) {\n toggleRow(rowId)\n }\n }\n return (\n <tr\n key={String(rowId)}\n data-state={isSelected ? \"selected\" : undefined}\n onMouseEnter={() => setHoveredRow(rowId)}\n onMouseLeave={() => setHoveredRow(null)}\n onClick={rowClickable ? handleRowClick : undefined}\n data-new={Boolean((row as Record<string, unknown>).isNew) || undefined}\n className={cn(\n \"group/row transition-colors\",\n \"hover:bg-dt-row-hover\",\n isSelected && \"bg-dt-row-selected text-dt-row-selected-fg\",\n rowClickable && \"cursor-pointer\",\n Boolean((row as Record<string, unknown>).isNew) && \"bg-dt-new-row-bg border-s-2 border-s-dt-new-row-border\"\n )}\n >\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const wrap = colWrap[col.key]\n const isEdgePin = col.key === lastLeftPinKey || col.key === firstRightPinKey\n const rowPy = rowHeight === \"compact\" ? \"py-1\" : rowHeight === \"comfortable\" ? \"py-4\" : \"py-2.5\"\n const cs = cellStyle(col.key)\n\n const tdBase = cn(\n `px-3 ${rowPy} align-middle max-w-0`,\n showGridlines && !isEdgePin && \"border-e border-border last:border-e-0\",\n \"border-b border-border group-last/row:border-b-0\",\n isPinned && [\n \"z-20 pinned-cell relative\",\n \"bg-dt-row-bg\",\n \"group-data-[state=selected]/row:bg-dt-row-selected\",\n \"group-hover/row:bg-dt-row-hover\",\n isEdgePin && stickyShadow(effectivePins[col.key]),\n ]\n )\n\n const conditionalBg = getConditionalCellBackground(\n row,\n col.key,\n conditionalRules,\n columns,\n )\n\n const tdStyle = conditionalBg\n ? { ...cs, background: conditionalBg }\n : cs\n\n // Special synthetic columns\n if (col.key === \"select\") {\n const selectionLabel = getRowSelectionLabel?.(row, rowIndex)\n const ariaLabel = selectionLabel\n ? `Select row, ${selectionLabel}`\n : `Select row ${rowIndex + 1}`\n return (\n <td key=\"select\" className={cn(tdBase, \"text-center\")} style={tdStyle}>\n {selectable && (\n // inline-flex: inline elements inside <td> are never\n // stretched by table-cell height in Chrome/Safari/Firefox.\n // Block-level flex/grid always inherits full cell height at zoom.\n <span\n className={cn(\n \"inline-flex items-center justify-center transition-opacity\",\n anySelected\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100\",\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => toggleRow(rowId)}\n aria-label={ariaLabel}\n onClick={e => e.stopPropagation()}\n />\n </span>\n )}\n </td>\n )\n }\n\n // Custom cell renderer\n if (col.cell) {\n return (\n <td\n key={col.key}\n className={cn(\n tdBase,\n // When wrap is on, override truncate/overflow on any descendant\n wrap && \"[&_.truncate]:!whitespace-normal [&_.truncate]:!overflow-visible [&_.truncate]:!text-clip\",\n )}\n style={tdStyle}\n >\n <div className=\"min-w-0 overflow-hidden\">\n {col.cell(row, {\n rowIndex,\n selected: isSelected,\n onSelect: checked => checked ? setSelected(prev => new Set([...prev, rowId])) : toggleRow(rowId),\n })}\n </div>\n </td>\n )\n }\n\n // Default: render string value with optional truncation\n const rawVal = String(row[col.key] ?? \"\")\n return (\n <td key={col.key} className={cn(tdBase, \"text-sm text-foreground/80\")} style={tdStyle}>\n <div className=\"min-w-0 overflow-hidden\">\n <span className={wrap ? \"whitespace-normal\" : \"block truncate\"} title={!wrap ? rawVal : undefined}>\n {rawVal}\n </span>\n </div>\n </td>\n )\n })}\n </tr>\n )\n })}\n </React.Fragment>\n ))}\n\n {/* Empty state */}\n {rows.length === 0 && (\n <tr>\n <td colSpan={displayCols.length} className=\"h-24 px-3 text-center text-sm text-muted-foreground\">\n {emptyState ?? \"No results match your filters.\"}\n </td>\n </tr>\n )}\n\n {/* Add new row stub */}\n {addRowLabel !== false && (\n <tr\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") e.preventDefault() }}\n className=\"cursor-pointer hover:bg-dt-row-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n aria-label={`Add new ${addRowLabel}`}\n >\n <td colSpan={displayCols.length} className=\"px-3 py-2.5 align-middle\">\n <span className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n {addRowLabel}\n </span>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Bulk selection bar — dark strip in light app; light strip in dark app.\n Normal zoom: max ~28rem, centered. Reflow: full table width. Inner\n `dark` in light app → shadcn `dark:` buttons; in dark app → explicit\n light-surface button overrides.\n */}\n {anySelected && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${selected.size} row${selected.size !== 1 ? \"s\" : \"\"} selected`}\n data-exxat-bulk-bar=\"\"\n style={bulkBarFixedStyle}\n className={cn(\n \"flex min-w-0 max-w-full items-stretch overflow-hidden\",\n isAppDark\n ? \"rounded-lg border border-zinc-300/80 bg-zinc-100 text-zinc-900 shadow-lg\"\n : \"rounded-lg border border-zinc-800 bg-zinc-900 text-zinc-100 shadow-lg\",\n \"animate-in fade-in-0 duration-150\",\n \"w-auto max-w-none\",\n )}\n >\n <div\n className={cn(\n \"flex shrink-0 items-center gap-2 border-e py-2.5 ps-3 pe-2\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-md\",\n isAppDark ? \"text-zinc-500\" : \"text-zinc-400\",\n )}\n aria-hidden=\"true\"\n >\n <i className=\"fa-light fa-clipboard-list text-[1.1rem] leading-none\" />\n </span>\n <span\n className={cn(\n \"min-w-6 rounded-md px-1.5 py-0.5 text-center text-xs font-semibold leading-none tabular-nums\",\n isAppDark ? \"bg-zinc-200/90 text-zinc-900\" : \"bg-zinc-800 text-zinc-100\",\n )}\n >\n {selected.size}\n </span>\n </div>\n\n <div\n className={cn(\n \"flex min-w-0 min-h-0 flex-1 items-stretch\",\n !isAppDark && \"dark\",\n isAppDark && BULK_BAR_ON_LIGHT_STRIP,\n )}\n >\n <div\n className={cn(\n \"min-w-0 flex-1 self-center\",\n \"overflow-x-auto overscroll-x-contain [scrollbar-width:thin] [touch-action:pan-x]\",\n )}\n >\n <div className=\"flex w-max min-w-0 max-w-full flex-nowrap items-center gap-2 py-2.5 ps-2 pe-2\">\n {bulkActionsSlot ? (\n bulkActionsSlot(selected, rows)\n ) : (\n <>\n <Button size=\"sm\" variant=\"outline\" className=\"shrink-0\">\n <i className=\"fa-light fa-arrow-down-to-line\" aria-hidden=\"true\" /> Export\n </Button>\n <Button size=\"sm\" variant=\"destructive\" className=\"shrink-0\">\n <i className=\"fa-light fa-trash\" aria-hidden=\"true\" /> Delete\n </Button>\n </>\n )}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex shrink-0 items-center border-e py-2.5 ps-2 pe-2.5\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n >\n <Tip label=\"Clear selection\" side=\"top\">\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear selection\"\n onClick={() => setSelected(new Set())}\n className=\"shrink-0\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction DataTableWithInternalState<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n const state = useTableState(props.data, props.columns, props.defaultSort, props.paginationOverride)\n return <DataTableInner {...props} state={state} />\n}\n\nexport function DataTable<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n if (props.state) {\n return <DataTableInner {...props} state={props.state} />\n }\n return <DataTableWithInternalState {...props} />\n}\n","\"use client\"\n\n/**\n * DataTablePaginated<TData> — DataTable with a bottom pagination bar\n *\n * Adds:\n * • \"Rows per page\" selector\n * • First / Previous / Next / Last page buttons\n * • \"{from}–{to} of {total}\" status span (role=\"status\" aria-live=\"polite\")\n * • Keyboard: Left/Right arrow keys on the pagination bar change page\n *\n * Everything else (columns, pinning, resize, DnD, sort, filters, group,\n * selection) is identical to DataTable — they share useTableState.\n *\n * Props: DataTableProps<TData> & { pagination?: PaginationConfig }\n */\n\nimport * as React from \"react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Tip } from \"../ui/tip\"\nimport { TooltipProvider } from \"../ui/tooltip\"\nimport { DataTable, type DataTableExtendedProps } from \"./index\"\nimport type { PaginationConfig } from \"./types\"\nimport type { useTableState } from \"./use-table-state\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PaginationBar\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PaginationBarProps {\n page: number\n pageSize: number\n total: number\n pageSizeOptions: number[]\n onPageChange: (p: number) => void\n onPageSizeChange: (n: number) => void\n}\n\nexport function PaginationBar({\n page,\n pageSize,\n total,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n}: PaginationBarProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const from = Math.min((page - 1) * pageSize + 1, total)\n const to = Math.min(page * pageSize, total)\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key === \"ArrowLeft\" && page > 1) {\n e.preventDefault()\n onPageChange(page - 1)\n } else if (e.key === \"ArrowRight\" && page < totalPages) {\n e.preventDefault()\n onPageChange(page + 1)\n }\n }\n\n return (\n <div\n className=\"flex items-center justify-between px-4 py-2.5 border-t border-border bg-background text-sm select-none\"\n onKeyDown={handleKeyDown}\n >\n {/* Rows per page */}\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <span>Rows per page</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Rows per page\"\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-input bg-background hover:bg-interactive-hover text-foreground text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {pageSize}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-20\">\n {pageSizeOptions.map(n => (\n <DropdownMenuItem key={n} onClick={() => onPageSizeChange(n)}>\n {n}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Nav */}\n <div className=\"flex items-center gap-3\">\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground tabular-nums\"\n >\n {total === 0 ? \"0 results\" : `${from}–${to} of ${total}`}\n </span>\n <TooltipProvider>\n <div className=\"flex items-center gap-1\">\n <Tip label=\"First page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"First page\"\n disabled={page === 1}\n onClick={() => onPageChange(1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Previous page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={page === 1}\n onClick={() => onPageChange(page - 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <span className=\"px-2 text-muted-foreground tabular-nums\">\n {page} / {totalPages}\n </span>\n <Tip label=\"Next page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Last page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Last page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(totalPages)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </TooltipProvider>\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTablePaginated<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTablePaginatedProps<TData extends Record<string, unknown>>\n extends DataTableExtendedProps<TData> {\n pagination?: PaginationConfig\n}\n\nexport function DataTablePaginated<TData extends Record<string, unknown>>({\n data,\n columns,\n pagination,\n defaultSort,\n ...rest\n}: DataTablePaginatedProps<TData>) {\n const config = {\n pageSize: pagination?.pageSize ?? 10,\n pageSizeOptions: pagination?.pageSizeOptions ?? [10, 25, 50, 100],\n }\n\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(config.pageSize)\n\n // filteredCount: total rows after filters (driven by inner table state via CountSyncer)\n const [filteredCount, setFilteredCount] = React.useState(data.length)\n\n const totalPages = Math.max(1, Math.ceil(filteredCount / pageSize))\n const safePage = Math.min(page, totalPages)\n\n function handlePageSizeChange(n: number) {\n setPageSize(n)\n setPage(1)\n }\n\n // Wrap toolbarSlot to intercept state.rows.length (a number — no circular ref)\n const originalToolbarSlot = rest.toolbarSlot\n const toolbarSlot = React.useCallback(\n (state: ReturnType<typeof useTableState<TData>>) => (\n <>\n <CountSyncer count={state.rows.length} onSync={setFilteredCount} onReset={() => setPage(1)} />\n {originalToolbarSlot ? originalToolbarSlot(state) : null}\n </>\n ),\n [originalToolbarSlot],\n )\n\n return (\n <div className=\"flex flex-col gap-0\">\n <DataTable\n {...rest}\n data={data}\n columns={columns}\n defaultSort={defaultSort}\n toolbarSlot={toolbarSlot}\n paginationOverride={{ page: safePage, pageSize }}\n hasFooter\n />\n {/* z-40 sits above pinned cells (z-20), group headers (z-25), and pinned headers\n (z-40) so the pagination chrome stays opaque over any table content that\n scrolls behind it. Pinned-left cells ship with their own `bg-dt-row-bg`,\n which would otherwise paint over a lower-z footer. */}\n <div className=\"sticky bottom-0 z-40 mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\">\n <PaginationBar\n page={safePage}\n pageSize={pageSize}\n total={filteredCount}\n pageSizeOptions={config.pageSizeOptions}\n onPageChange={setPage}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CountSyncer — syncs filtered row count (a number) to parent without loops.\n// Syncing a primitive avoids the circular-reference issue of syncing an array.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function CountSyncer({\n count,\n onSync,\n onReset,\n}: {\n count: number\n onSync: (n: number) => void\n onReset: () => void\n}) {\n const prevCount = React.useRef(count)\n React.useLayoutEffect(() => {\n if (prevCount.current !== count) {\n prevCount.current = count\n onSync(count)\n onReset()\n }\n }, [count, onSync, onReset])\n return null\n}\n"]}
|