@exxatdesignux/ui 0.5.5 → 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.
Files changed (32) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +16 -5
  3. package/consumer-extras/cursor-rules/exxat-ux-discovery-protocol.mdc +122 -0
  4. package/consumer-extras/cursor-rules/exxat-ux-principles.mdc +186 -0
  5. package/consumer-extras/cursor-skills/exxat-senior-ux/SKILL.md +145 -0
  6. package/consumer-extras/patterns/jobs/README.md +59 -0
  7. package/consumer-extras/patterns/jobs/record-detail.md +177 -0
  8. package/consumer-extras/patterns/modern-saas-patterns.md +165 -0
  9. package/dist/components/data-table/index.js +28 -22
  10. package/dist/components/data-table/index.js.map +1 -1
  11. package/dist/components/data-table/pagination.js +28 -22
  12. package/dist/components/data-table/pagination.js.map +1 -1
  13. package/dist/components/data-table/use-table-state.js +20 -17
  14. package/dist/components/data-table/use-table-state.js.map +1 -1
  15. package/dist/components/data-views/hub-table.js +28 -22
  16. package/dist/components/data-views/hub-table.js.map +1 -1
  17. package/dist/components/data-views/index.js +28 -22
  18. package/dist/components/data-views/index.js.map +1 -1
  19. package/dist/components/ui/badge.d.ts +1 -1
  20. package/dist/components/ui/banner.d.ts +3 -3
  21. package/dist/components/ui/button.d.ts +2 -2
  22. package/dist/components/ui/tabs.d.ts +1 -1
  23. package/dist/hooks/use-app-theme.d.ts +1 -1
  24. package/dist/index.js +28 -22
  25. package/dist/index.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/components/data-table/index.tsx +10 -6
  28. package/src/components/data-table/use-table-state.ts +33 -26
  29. package/template/docs/jobs/README.md +59 -0
  30. package/template/docs/jobs/record-detail.md +177 -0
  31. package/template/docs/modern-saas-patterns.md +165 -0
  32. package/tokens/hooks-index.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/raf-throttle.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/kbd.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/hooks/use-mod-key-label.ts","../../../src/lib/editable-target.ts","../../../src/components/ui/label.tsx","../../../src/components/ui/checkbox.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.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","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/data-list-display-options.ts","../../../src/lib/row-height.ts","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/ui/select.tsx","../../../src/components/ui/toggle-switch.tsx","../../../src/components/table-properties/filter-card.tsx","../../../src/components/ui/drag-handle-grip.tsx","../../../src/components/table-properties/sort-card.tsx","../../../src/components/table-properties/column-row.tsx","../../../src/components/table-properties/draggable-list.ts","../../../src/components/table-properties/drawer.tsx","../../../src/components/table-properties/drawer-button.tsx","../../../src/components/data-views/list-page-connected-view-body.tsx","../../../src/components/data-views/data-row-list.tsx","../../../src/components/ui/badge.tsx","../../../src/components/data-views/board-card-primitives.tsx","../../../src/components/data-views/list-page-board-template.tsx","../../../src/components/data-views/hub-table.tsx"],"names":["React","React2","Input","jsx","TooltipPrimitive","jsxs","React3","React4","Label","LabelPrimitive","cva","React5","Checkbox","CheckboxPrimitive","DropdownMenuPrimitive","PopoverPrimitive","hit","className","props","React7","React8","React9","MaskedInput","hay","React11","SortChevron","Fragment","el","React12","React13","RadioGroupPrimitive","RadioGroupItem","SheetPrimitive","SelectPrimitive","React14","React15","React16","React17","React18","Slot","React19","React20","args"],"mappings":"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","file":"hub-table.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 * 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\"\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","\"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\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n","\"use client\"\n\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","/**\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 { 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 // ── 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 // ── 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 // ── 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 function checkOverflow() {\n const el = scrollRef.current\n if (!el) return\n setIsOverflowing(el.scrollWidth > el.clientWidth + 1)\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(el.scrollWidth > el.clientWidth + 1)\n }\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 const totalWidth = React.useMemo(\n () => displayCols.reduce((s, c) => s + (colWidths[c.key] ?? c.width ?? 100), 0),\n [displayCols, colWidths],\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 React.useEffect(() => {\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 return () => ro.disconnect()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\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=\"w-full text-sm border-separate border-spacing-0\"\n style={{\n tableLayout: \"fixed\",\n minWidth: totalWidth,\n width: headerIsStuck ? floatingHeaderTableWidth : undefined,\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","/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n * @see `.cursor/rules/exxat-hub-supported-views.mdc` — default hubs use **`FULL_HUB_SUPPORTED_VIEWS`** (seven views)\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\n/**\n * Default view allowlist for **primary list hubs** (Placements / Team / Students-style pages).\n * Pair with `ListPageTemplate` + `HubTable` when the hub implements table, list, board,\n * and dashboard renderers. Omit `supportedViewTypes` on both components to use this default.\n */\nexport const PRIMARY_HUB_SUPPORTED_VIEWS = [\n \"table\",\n \"list\",\n \"board\",\n \"dashboard\",\n] as const satisfies readonly DataListViewType[]\n\n/**\n * Default allowlist for **list-page hubs** in this design system (Library / Column types /\n * Tokens, etc.). Matches the All questions hub: table, list, board, dashboard, folder,\n * panel, and tree-panel. Pair with renderers for each kind on `HubTable` + `ListPageTemplate`.\n */\nexport const FULL_HUB_SUPPORTED_VIEWS = [\n \"table\",\n \"list\",\n \"board\",\n \"dashboard\",\n \"folder\",\n \"panel\",\n \"tree-panel\",\n] as const satisfies readonly DataListViewType[]\n\n/** Every registered view type (includes folder, panel, calendar, tree-panel). */\nexport const ALL_DATA_LIST_VIEW_TYPES = DATA_LIST_VIEW_REGISTRY.map(d => d.value)\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n","/**\n * Display options for Data list (table / board / etc.) — shared across view types\n * so hide/show preferences persist when switching views.\n */\n\nexport type BoardLineCount = 1 | 2 | 3\n\nexport interface DataListDisplayOptions {\n /**\n * Board swimlanes: dataset field (table column key) used to split cards into columns.\n * Each hub passes allowed keys via `TablePropertiesDrawer` `boardGroupByColumnOptions`.\n */\n boardGroupByColumnKey: string\n /** Max lines for primary text blocks on board cards */\n boardLineCount: BoardLineCount\n /** Page title block (Placements + subtitle) */\n showViewTitle: boolean\n /** Board: phase column titles + descriptions. Table: column header row. */\n showColumnLabels: boolean\n /** Board: “N cards” under each phase column */\n showBoardColumnCounts: boolean\n boardNewCardAbove: boolean\n /** Toolbar search control (table view) */\n showToolbarSearch: boolean\n}\n\nexport const DEFAULT_DATA_LIST_DISPLAY_OPTIONS: DataListDisplayOptions = {\n boardGroupByColumnKey: \"topic\",\n boardLineCount: 2,\n showViewTitle: true,\n showColumnLabels: true,\n showBoardColumnCounts: true,\n boardNewCardAbove: true,\n showToolbarSearch: true,\n}\n","/**\n * Table row density — shared by Properties drawer tiles and useTableState.\n *\n * Three steps modelled after Linear / Notion / Airtable density toggles.\n * `default` is the design-system baseline (`h-9` rows, `text-sm`); the\n * other two scale the row height + vertical padding without changing the\n * font size, so dense tables stay legible.\n */\nexport type RowHeight = \"compact\" | \"default\" | \"comfortable\"\n\nexport const ROW_HEIGHT_TILES: readonly {\n value: RowHeight\n label: string\n icon: string\n}[] = [\n { value: \"compact\", label: \"Compact\", icon: \"fa-down-to-line\" },\n { value: \"default\", label: \"Default\", icon: \"fa-arrows-up-down\" },\n { value: \"comfortable\", label: \"Comfortable\", icon: \"fa-up-to-line\" },\n]\n","\"use client\"\n\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full 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:data-[state=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 ].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 ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]: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 ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]: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 ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n 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\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-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 { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-overlay duration-300 ease-out supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n showOverlay = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n showOverlay?: boolean\n}) {\n return (\n <SheetPortal>\n {showOverlay && <SheetOverlay />}\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg outline-none duration-300 ease-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:start-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-e data-[side=right]:inset-y-0 data-[side=right]:end-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-s data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-6 data-[side=left]:data-open:slide-in-from-start-6 data-[side=right]:data-open:slide-in-from-end-6 data-[side=top]:data-open:slide-in-from-top-6 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-6 data-[side=left]:data-closed:slide-out-to-start-6 data-[side=right]:data-closed:slide-out-to-end-6 data-[side=top]:data-closed:slide-out-to-top-6\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 end-3\"\n size=\"icon-sm\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pe-2 ps-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/15 dark:hover:bg-input/50 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 className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <i className=\"fa-light fa-chevron-down pointer-events-none size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none 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\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full 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 not-data-[variant=destructive]:focus:**:text-accent-foreground 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([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute end-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check pointer-events-none\" aria-hidden=\"true\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-up\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-down\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface ToggleSwitchProps {\n checked: boolean\n onChange: (value: boolean) => void\n id?: string\n}\n\nexport function ToggleSwitch({ checked, onChange, id }: ToggleSwitchProps) {\n return (\n <button\n id={id}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onChange(!checked)}\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-input transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n checked ? \"bg-primary\" : \"bg-input\"\n )}\n >\n <span className={cn(\n \"pointer-events-none inline-block size-4 rounded-full bg-primary-foreground shadow-sm transition-transform\",\n checked ? \"translate-x-4\" : \"translate-x-0\"\n )} />\n </button>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Tip } from \"../ui/tip\"\nimport { FilterDateCalendar } from \"../data-table/filter-date-calendar\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport {\n type ActiveFilter,\n type ConditionalRule,\n type FilterFieldDef,\n type FilterOperator,\n OPERATOR_LABELS,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\ntype DrawerFilterCardBaseProps = {\n fieldDef: FilterFieldDef\n expanded: boolean\n onToggleExpand: () => void\n onRemove: (id: string) => void\n renderOptionLabel?: (value: string) => React.ReactNode\n}\n\nexport type DrawerFilterCardProps =\n | (DrawerFilterCardBaseProps & {\n variant?: \"filter\"\n filter: ActiveFilter\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n })\n | (DrawerFilterCardBaseProps & {\n variant: \"conditional\"\n filter: ConditionalRule\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n })\n\n/** Inline filter card used inside the Table Properties drawer (filter or conditional rule). */\nexport function DrawerFilterCard(props: DrawerFilterCardProps) {\n const {\n fieldDef,\n expanded,\n onToggleExpand,\n onRemove,\n renderOptionLabel,\n } = props\n\n const isCond = props.variant === \"conditional\"\n const filter = props.filter\n const filterId = filter.id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const onUpdate = props.onUpdate as (id: string, patch: any) => void\n\n const [optSearch, setOptSearch] = React.useState(\"\")\n const options = fieldDef.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 values = filter.values\n\n React.useEffect(() => {\n if (fieldDef.type !== \"select\" && fieldDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filterId, { operator: \"is\" })\n }\n }, [filter.operator, filter.id, fieldDef.type, filterId, onUpdate])\n\n function toggleValue(val: string) {\n const next = values.includes(val) ? values.filter(v => v !== val) : [...values, val]\n onUpdate(filterId, { values: next })\n }\n\n function cycleOperator() {\n const ops = fieldDef.operators\n const idx = ops.indexOf(filter.operator as FilterOperator)\n const i = idx === -1 ? 0 : idx\n onUpdate(filterId, { operator: ops[(i + 1) % ops.length] })\n }\n\n const removeLabel = isCond ? \"rule\" : \"filter\"\n const rule = isCond ? (props.filter as ConditionalRule) : null\n\n return (\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <div>\n {/* Card header */}\n <div\n className=\"flex items-start justify-between px-3 pt-2.5 pb-2 gap-2 cursor-pointer\"\n role=\"button\"\n tabIndex={0}\n aria-label={expanded ? `Collapse ${fieldDef.label}` : `Expand ${fieldDef.label}`}\n onClick={onToggleExpand}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n onToggleExpand()\n }\n }}\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{fieldDef.label}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n aria-label={`Operator: ${OPERATOR_LABELS[filter.operator as FilterOperator]} — click to cycle`}\n onClick={e => {\n e.stopPropagation()\n cycleOperator()\n }}\n className=\"h-auto py-0 px-1 -ms-1 text-xs text-muted-foreground font-normal\"\n >\n {OPERATOR_LABELS[filter.operator as FilterOperator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 self-start\">\n <Tip label={`Remove ${fieldDef.label} ${removeLabel}`} side=\"top\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Remove ${fieldDef.label} ${removeLabel}`}\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={e => {\n e.stopPropagation()\n onRemove(filterId)\n }}\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <i\n className={`fa-light ${expanded ? \"fa-chevron-up\" : \"fa-chevron-down\"} text-xs text-muted-foreground mt-2`}\n aria-hidden=\"true\"\n />\n </div>\n </div>\n\n {/* Expanded body */}\n {expanded && (\n <div className=\"border-t border-border\">\n {fieldDef.type === \"select\" ? (\n <>\n {showSearch && (\n <div className=\"px-3 pt-2 pb-1\">\n <Input placeholder=\"Search…\" value={optSearch} onChange={e => setOptSearch(e.target.value)} className=\"h-7 text-xs\" />\n </div>\n )}\n <div role=\"listbox\" aria-multiselectable=\"true\" aria-label={`${fieldDef.label} options`} className=\"py-1 max-h-52 overflow-y-auto\">\n {filteredOpts.map(opt => {\n const checked = 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 items-center gap-2.5 px-3 py-2 text-sm hover:bg-interactive-hover cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span aria-hidden=\"true\" data-slot=\"checkbox\" data-state={checked ? \"checked\" : \"unchecked\"} className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[3px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}>\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"7px\" }} />}\n </span>\n {renderOptionLabel\n ? renderOptionLabel(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 ) : fieldDef.type === \"date\" ? (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${fieldDef.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filterId, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n ) : fieldDef.type === \"text\" ? (\n <div className=\"p-3\">\n <FilterTextValueInput\n mask={fieldDef.textMask}\n aria-label={`${fieldDef.label} value`}\n placeholder={`Enter ${fieldDef.label.toLowerCase()}…`}\n value={values[0] ?? \"\"}\n onValueChange={next => onUpdate(filterId, { values: [next] })}\n className=\"text-sm\"\n autoFocus\n />\n </div>\n ) : null}\n {values.length > 0 ? (\n <div className=\"sticky bottom-0 border-t border-border bg-card p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filterId, { 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 </div>\n )}\n\n {/* Highlight color — conditional rules only */}\n {isCond && rule && (\n <div className=\"border-t border-border px-3 py-2.5\">\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">\n Highlight color\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {RULE_COLORS.map(c => (\n <Button\n key={c.name}\n type=\"button\"\n size=\"icon-xs\"\n variant=\"outline\"\n aria-label={c.name}\n className={cn(\n \"rounded-md border-2 p-0 transition-all\",\n rule.bgColor === c.bg ? \"border-foreground scale-110\" : \"border-transparent hover:scale-105\",\n )}\n style={{ background: c.bg }}\n onClick={() => onUpdate(filterId, { bgColor: c.bg })}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { cn } from \"../../lib/utils\"\n\n/**\n * Solid grip icon for drag handles — use anywhere rows/cards reorder (dashboard, Properties, etc.).\n */\nexport function DragHandleGripIcon({ className }: { className?: string }) {\n return (\n <i className={cn(\"fa-solid fa-grip-dots-vertical shrink-0\", className)} aria-hidden=\"true\" />\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { type SortRule } from \"../../lib/table-properties-types\"\n\n/** Sort rule card inside the Sort drawer panel */\nexport type DrawerSortCardProps = {\n rule: SortRule\n /**\n * Resolved column label for the sort rule's `fieldKey`. Required — every\n * consumer derives labels from its column defs (the drawer passes\n * `resolveColumnLabel(rule.fieldKey)`), so the card never falls back to a\n * product-specific column list.\n */\n fieldLabel: string\n isPrimary: boolean\n onRemove: () => void\n onToggleDir: () => void\n}\n\nexport function DrawerSortCard(props: DrawerSortCardProps) {\n const { rule, fieldLabel, isPrimary, onRemove, onToggleDir } = props\n const label = fieldLabel || rule.fieldKey\n if (!label) return null\n return (\n <div className=\"rounded-lg border border-border bg-background overflow-hidden\">\n <div className=\"flex items-center gap-2 px-3 py-2.5\">\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {isPrimary && (\n <span className=\"text-xs font-bold text-accent-foreground bg-accent rounded px-1 py-0.5 leading-none uppercase tracking-wide shrink-0\">\n Primary\n </span>\n )}\n <p className=\"text-sm font-medium text-foreground truncate\">{label}</p>\n </div>\n <button\n type=\"button\"\n aria-label={`Direction: ${rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"} — click to toggle`}\n onClick={onToggleDir}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors mt-0.5\"\n >\n <i className={`fa-light ${rule.direction === \"asc\" ? \"fa-arrow-up-a-z\" : \"fa-arrow-down-a-z\"} text-xs`} aria-hidden=\"true\" />\n {rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <Tip label={`Remove ${label} sort`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Remove ${label} sort`}\n onClick={onRemove}\n className=\"inline-flex items-center justify-center size-7 rounded text-muted-foreground hover:text-destructive hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </div>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\n\nexport interface ColumnRowProps {\n label: string\n isFirst: boolean\n isLast: boolean\n visible: boolean\n onToggleVisible: () => void\n onMoveUp: () => void\n onMoveDown: () => void\n // drag-and-drop props spread from useDraggableList\n draggable: true\n onDragStart: React.DragEventHandler\n onDragOver: React.DragEventHandler\n onDrop: React.DragEventHandler\n onDragEnd: React.DragEventHandler\n isDragging: boolean\n isOver: boolean\n}\n\nexport function ColumnRow({\n label,\n isFirst,\n isLast,\n visible,\n onToggleVisible,\n onMoveUp,\n onMoveDown,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n isDragging,\n isOver,\n}: ColumnRowProps) {\n return (\n <div\n role=\"listitem\"\n draggable={draggable}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n className={cn(\n \"flex items-center gap-2 px-2 py-2 rounded-lg group hover:bg-interactive-hover-subtle transition-colors cursor-grab active:cursor-grabbing\",\n isDragging && \"opacity-40\",\n isOver && \"ring-2 ring-ring bg-accent/30\",\n )}\n >\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40 transition-colors group-hover:text-muted-foreground\" />\n <span className=\"flex-1 text-sm text-foreground\">{label}</span>\n {/* Up / Down priority buttons */}\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Tip label={`Move ${label} up`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={isFirst}\n onClick={onMoveUp}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 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-up text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label={`Move ${label} down`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={isLast}\n onClick={onMoveDown}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 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-down text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n {/* Visibility toggle */}\n <ToggleSwitch\n checked={visible}\n onChange={onToggleVisible}\n />\n </div>\n )\n}\n","/**\n * useDraggableList — pointer-driven reorder hook used by drawer sort cards,\n * column rows, and conditional-rule lists. Generic over item shape via\n * `getId(item) => string | number`.\n */\nimport * as React from \"react\"\n\nexport interface DraggableListHandle {\n dragId: string | null\n overId: string | null\n getItemProps: (id: string) => {\n draggable: true\n onDragStart: (e: React.DragEvent) => void\n onDragOver: (e: React.DragEvent) => void\n onDrop: (e: React.DragEvent) => void\n onDragEnd: () => void\n \"data-dragging\": boolean\n \"data-over\": boolean\n }\n}\n\nexport function useDraggableList<T>(\n items: T[],\n getId: (item: T) => string,\n onReorder: (newItems: T[]) => void,\n): DraggableListHandle {\n const [dragId, setDragId] = React.useState<string | null>(null)\n const [overId, setOverId] = React.useState<string | null>(null)\n\n function getItemProps(id: string) {\n return {\n draggable: true as const,\n onDragStart: (e: React.DragEvent) => { e.dataTransfer.effectAllowed = \"move\"; setDragId(id) },\n onDragOver: (e: React.DragEvent) => { e.preventDefault(); e.dataTransfer.dropEffect = \"move\"; setOverId(id) },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault()\n if (!dragId || dragId === id) { setDragId(null); setOverId(null); return }\n const from = items.findIndex(i => getId(i) === dragId)\n const to = items.findIndex(i => getId(i) === id)\n if (from === -1 || to === -1) { setDragId(null); setOverId(null); return }\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n onReorder(next)\n setDragId(null); setOverId(null)\n },\n onDragEnd: () => { setDragId(null); setOverId(null) },\n \"data-dragging\": dragId === id,\n \"data-over\": overId === id && dragId !== id,\n }\n }\n\n return { dragId, overId, getItemProps }\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewLabel } from \"../../lib/data-list-view\"\nimport { dataListViewTilesForHub } from \"../../lib/data-list-view-registry\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport { ROW_HEIGHT_TILES } from \"../../lib/row-height\"\nimport { SelectionTileGrid } from \"../ui/selection-tile-grid\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"../ui/sheet\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\nimport { Tip } from \"../ui/tip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\nimport { Button } from \"../ui/button\"\nimport { DrawerFilterCard } from \"./filter-card\"\nimport { DrawerSortCard } from \"./sort-card\"\nimport { ColumnRow } from \"./column-row\"\nimport { useDraggableList } from \"./draggable-list\"\nimport {\n type ActiveFilter,\n type SortRule,\n type ConditionalRule,\n type FilterFieldDef,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\nexport interface TablePropertiesDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /**\n * Optional deep-link target. When set (and `open` is true), the drawer\n * focuses this panel instead of \"main\" — e.g. the column header's\n * **Add Conditional Rule** menu item passes `\"conditional-rules\"` to jump\n * straight to the conditional-formatting panel. Drawer resets to \"main\"\n * automatically when it closes.\n */\n initialPanel?: string | null\n // Display\n showGridlines: boolean\n onShowGridlinesChange: (v: boolean) => void\n rowHeight: RowHeight\n onRowHeightChange: (v: RowHeight) => void\n pagination: boolean\n onPaginationChange: (v: boolean) => void\n // Filters\n activeFilters: ActiveFilter[]\n onAddFilter: (fieldKey: string) => void\n onUpdateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n onRemoveFilter: (id: string) => void\n /** How the filter after `leftFilterId` combines with the one above (default \"and\"). */\n getFilterConnector: (leftFilterId: string) => \"and\" | \"or\"\n onToggleFilterConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n onFilterBarVisibleChange: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n onDrawerExpandedFiltersChange: React.Dispatch<React.SetStateAction<Set<string>>>\n totalRows: number\n filteredRows: number\n // Sort\n sortRules: SortRule[]\n onSortRulesChange: (rules: SortRule[]) => void\n onAddSortRule: (fieldKey: string) => void\n onRemoveSortRule: (id: string) => void\n onToggleSortDir: (id: string) => void\n // Columns\n colOrder: string[]\n onColOrderChange: (order: string[]) => void\n hiddenCols: Set<string>\n onToggleColVisibility: (key: string) => void\n onMoveCol: (key: string, dir: \"up\" | \"down\") => void\n // Group\n groupBy: string | null\n onGroupByChange: (key: string | null) => void\n // Sort key for display in main panel\n primarySortKey?: string\n // Conditional formatting\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Filter field defs for drawer + conditional rules. Required — every list-hub\n * consumer derives this from its column definitions (`columnsToFilterFields`)\n * and passes it through `drawerToolbarProps` from `HubTable`. There is no\n * product-specific default in the package.\n */\n filterFields: FilterFieldDef[]\n // View type\n currentView?: DataListViewType\n onViewChange?: (view: DataListViewType) => void\n /**\n * Subset of view types this hub actually implements; when set, the view-type tile grid is\n * filtered so users cannot switch to an unsupported view from Properties. Defaults to all\n * registered view types (`DATA_LIST_VIEW_TILES`).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Lifecycle context (e.g. tab filter) — shown in the drawer header */\n lifecycleTabLabel?: string\n /**\n * Column metadata for the Sort / Group / Columns panels. Required — every\n * list-hub consumer derives this from its column definitions\n * (`columnsToFieldDefinitions`) and passes it through `drawerToolbarProps`\n * from `HubTable`. The drawer never falls back to a default column list.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n /** Shared display options (table + board); persisted at page level. */\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * When the active view is Board and more than one entry is provided, shows a control to pick\n * which field defines swimlane columns (`displayOptions.boardGroupByColumnKey`).\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\ntype SheetPanel = \"main\" | \"table-display\" | \"filter\" | \"sort\" | \"group\" | \"columns\" | \"conditional-rules\"\n\n/** Properties sheet uses `z-[80]`; default portaled menus are `z-50` and sit underneath. */\nconst PROPERTIES_SHEET_PORTAL_Z = \"z-[90]\"\n\nexport function TablePropertiesDrawer({\n open,\n onOpenChange,\n initialPanel,\n showGridlines,\n onShowGridlinesChange,\n rowHeight,\n onRowHeightChange,\n pagination,\n onPaginationChange,\n activeFilters,\n onAddFilter,\n onUpdateFilter,\n onRemoveFilter,\n getFilterConnector,\n onToggleFilterConnector,\n filterBarVisible,\n onFilterBarVisibleChange,\n drawerExpandedFilters,\n onDrawerExpandedFiltersChange,\n totalRows,\n filteredRows,\n sortRules,\n onSortRulesChange,\n onAddSortRule,\n onRemoveSortRule,\n onToggleSortDir,\n colOrder,\n onColOrderChange,\n hiddenCols,\n onToggleColVisibility,\n onMoveCol,\n groupBy,\n onGroupByChange,\n primarySortKey,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n filterFields,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n fieldDefinitions,\n resolveColumnLabel: resolveColumnLabelProp,\n displayOptions,\n onDisplayOptionsChange,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerProps) {\n const [sheetPanel, setSheetPanel] = React.useState<SheetPanel>(\"main\")\n\n // Sync internal sheetPanel with the deep-link request from outside.\n // - Open with an initialPanel → jump to that panel.\n // - Open with no initialPanel → keep whatever the user navigated to last (or \"main\"\n // after a close → re-open cycle, since the next effect resets on close).\n // - initialPanel changes while open (e.g. user triggers a second deep-link\n // from the column menu while the drawer is already open) → switch panels.\n // - Close → reset to \"main\" so the next \"plain\" open lands on the index.\n React.useEffect(() => {\n if (open && initialPanel) {\n setSheetPanel(initialPanel as SheetPanel)\n } else if (!open) {\n setSheetPanel(\"main\")\n }\n }, [open, initialPanel])\n\n const resolveColumnLabel = React.useCallback(\n (key: string) =>\n resolveColumnLabelProp?.(key)\n ?? fieldDefinitions.find(f => f.key === key)?.label\n ?? key,\n [resolveColumnLabelProp, fieldDefinitions],\n )\n\n const sortFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(\n f => f.sortable !== false && f.key !== \"select\" && f.key !== \"actions\",\n ),\n [fieldDefinitions],\n )\n\n const groupFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(f => f.key !== \"select\" && f.key !== \"actions\"),\n [fieldDefinitions],\n )\n\n const viewSurface = currentView ?? \"table\"\n const isBoardView = viewSurface === \"board\"\n const boardGroupByLabel =\n boardGroupByColumnOptions?.find(o => o.key === displayOptions.boardGroupByColumnKey)?.label\n const viewDisplayLabel = dataListViewLabel(viewSurface)\n const viewDisplayDesc = (() => {\n if (viewSurface === \"board\") {\n return [\n boardGroupByLabel ? `By ${boardGroupByLabel}` : null,\n `${displayOptions.boardLineCount}-line`,\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n ]\n .filter(Boolean)\n .join(\" · \")\n }\n if (viewSurface === \"list\") {\n return [\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n displayOptions.showToolbarSearch ? \"Toolbar search\" : \"No search\",\n ].join(\" · \")\n }\n if (viewSurface === \"dashboard\") {\n return \"Charts · KPI metrics\"\n }\n return [showGridlines ? \"Gridlines\" : null, pagination ? \"Paginated\" : null].filter(Boolean).join(\" · \") || \"Default\"\n })()\n const viewDisplayIcon =\n DATA_LIST_VIEW_TILES.find(t => t.value === viewSurface)?.icon ?? \"fa-table\"\n\n // ── Sort drag-and-drop ────────────────────────────────────────────────────\n const sortDrag = useDraggableList(sortRules, r => r.id, onSortRulesChange)\n\n // ── Columns drag-and-drop ─────────────────────────────────────────────────\n const orderable = colOrder.filter(k => k !== \"select\" && k !== \"actions\")\n const colDrag = useDraggableList(\n orderable,\n k => k,\n newOrder => onColOrderChange([\"select\", ...newOrder, \"actions\"]),\n )\n\n // Current primary sort label for display in main panel\n const primarySortLabel = primarySortKey\n ? resolveColumnLabel(primarySortKey)\n : sortRules[0]?.fieldKey\n ? resolveColumnLabel(sortRules[0].fieldKey)\n : \"—\"\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange} modal={false}>\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n // w-[min(20rem,calc(100vw-1rem))]: cap to viewport width - 1rem at narrow/zoomed viewports\n // so the drawer never overflows horizontally. Use 100svh so height is correct on mobile.\n className=\"z-[80] w-[min(20rem,calc(100vw-1rem))] p-0 gap-0 flex flex-col border border-border shadow-xl rounded-xl overflow-hidden\"\n style={{ top: \"0.5rem\", bottom: \"0.5rem\", right: \"0.5rem\", height: \"calc(100svh - 1rem)\" }}\n >\n\n {sheetPanel === \"main\" ? (\n <>\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Properties</SheetTitle>\n {lifecycleTabLabel ? (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\" title={lifecycleTabLabel}>\n {lifecycleTabLabel}\n </p>\n ) : null}\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n {/* View type switcher — card tiles like export file format. When the hub passes\n `supportedViewTypes`, only its implemented views are offered so users cannot\n switch to a view the hub does not render (which would show the not-configured\n empty state). Default is all registered view types. */}\n {onViewChange && currentView && (\n <div className=\"px-4 pb-3\">\n <SelectionTileGrid<DataListViewType>\n sectionLabel=\"View type\"\n options={\n supportedViewTypes && supportedViewTypes.length > 0\n ? dataListViewTilesForHub(supportedViewTypes).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n : DATA_LIST_VIEW_TILES\n }\n columns={4}\n value={currentView}\n onValueChange={onViewChange}\n interaction=\"button\"\n idPrefix=\"props-view\"\n />\n </div>\n )}\n\n {/* Option list — inset rows + rounded hover (not edge-to-edge) */}\n <div className=\"flex-1 overflow-y-auto py-2 px-3 space-y-1\">\n {([\n {\n id: \"table-display\" as SheetPanel,\n icon: viewDisplayIcon,\n label: viewDisplayLabel,\n desc: viewDisplayDesc,\n },\n {\n id: \"filter\" as SheetPanel,\n icon: \"fa-filter\",\n label: \"Filter\",\n desc: activeFilters.length === 0\n ? `Showing all ${filteredRows} rows.`\n : `${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active · ${filteredRows} rows.`,\n },\n {\n id: \"sort\" as SheetPanel,\n icon: \"fa-arrow-up-arrow-down\",\n label: \"Sort\",\n desc: `Sorted by ${primarySortLabel}.`,\n },\n {\n id: \"group\" as SheetPanel,\n icon: \"fa-layer-group\",\n label: \"Group\",\n desc: groupBy\n ? `Grouped by ${resolveColumnLabel(groupBy)}.`\n : \"No grouping.\",\n },\n {\n id: \"columns\" as SheetPanel,\n icon: \"fa-table-columns\",\n label: \"Columns\",\n desc: hiddenCols.size === 0\n ? \"All columns visible.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden.`,\n },\n {\n id: \"conditional-rules\" as SheetPanel,\n icon: \"fa-palette\",\n label: \"Conditional rules\",\n desc: conditionalRules.length === 0\n ? \"No rules applied.\"\n : `${conditionalRules.length} rule${conditionalRules.length !== 1 ? \"s\" : \"\"} active.`,\n },\n ] as { id: SheetPanel; icon: string; label: string; desc: string }[]).map(item => (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setSheetPanel(item.id)}\n className={cn(\n \"w-full h-auto justify-start gap-3 px-3 py-3 rounded-2xl font-normal border border-transparent\",\n \"hover:bg-muted/60 hover:text-foreground\",\n \"focus-visible:bg-muted/60 focus-visible:text-foreground\",\n )}\n >\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className={`fa-light ${item.icon} text-[15px] text-secondary-foreground`} aria-hidden=\"true\" />\n </span>\n <span className=\"flex-1 min-w-0 text-start\">\n <span className=\"block text-sm font-medium text-foreground\">{item.label}</span>\n <span className=\"block text-xs text-muted-foreground mt-0.5\">{item.desc}</span>\n </span>\n <i className=\"fa-light fa-chevron-right text-xs text-muted-foreground shrink-0\" aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n </>\n ) : (\n <>\n {/* Sub-panel header — back + title stack as one cluster; close aligns to row center */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-4 pb-3\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Tip label=\"Back to Properties\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Back to Properties\"\n onClick={() => setSheetPanel(\"main\")}\n >\n <i className=\"fa-light fa-chevron-left text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold text-foreground leading-tight flex items-center gap-1.5\">\n {{\n \"table-display\": viewDisplayLabel,\n filter: \"Filter\",\n sort: \"Sort\",\n group: \"Group\",\n columns: \"Columns\",\n \"conditional-rules\": \"Conditional rules\",\n main: \"\",\n }[sheetPanel]}\n {sheetPanel === \"filter\" && (\n <i className=\"fa-light fa-circle-question text-xs text-muted-foreground\" aria-hidden=\"true\" />\n )}\n </SheetTitle>\n {sheetPanel === \"filter\" && (\n <p\n className=\"text-xs text-muted-foreground mt-0.5\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {activeFilters.length === 0\n ? `Showing all ${filteredRows} rows`\n : `${filteredRows} of ${totalRows} rows match · ${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active`}\n </p>\n )}\n </div>\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Close panel\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n\n {/* ── Table / Board display ── */}\n {sheetPanel === \"table-display\" && (\n <div className=\"p-4 space-y-5\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {dataListViewLabel(\"board\")} groups rows into columns. Sort, filter, and column settings apply to the same dataset as other views (e.g. Table view).\n </p>\n ) : null}\n\n {isBoardView && boardGroupByColumnOptions && boardGroupByColumnOptions.length > 1 ? (\n <div className=\"flex items-center justify-between gap-3 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Board columns</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Choose which field splits the board into swimlanes.</p>\n </div>\n </div>\n <Select\n value={\n boardGroupByColumnOptions.some(o => o.key === displayOptions.boardGroupByColumnKey)\n ? displayOptions.boardGroupByColumnKey\n : boardGroupByColumnOptions[0]!.key\n }\n onValueChange={v => onDisplayOptionsChange({ boardGroupByColumnKey: v })}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"w-[9.5rem] shrink-0\"\n id=\"board-group-by-field\"\n aria-label=\"Field for board columns\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n {boardGroupByColumnOptions.map(o => (\n <SelectItem key={o.key} value={o.key}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n\n {viewSurface === \"table\" ? (\n <>\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3\">Appearance</p>\n <div className=\"space-y-1\">\n {([\n { id: \"gridlines\", icon: \"fa-border-all\", label: \"Gridlines\", checked: showGridlines, onChange: onShowGridlinesChange },\n { id: \"pagination\", icon: \"fa-table-list\", label: \"Pagination\", checked: pagination, onChange: onPaginationChange },\n ] as { id: string; icon: string; label: string; checked: boolean; onChange: (v: boolean) => void }[]).map(row => (\n <div key={row.id} className=\"flex items-center justify-between py-2\">\n <div className=\"flex items-center gap-2.5 text-sm\">\n <i className={`fa-light ${row.icon} text-muted-foreground w-4 text-center`} aria-hidden=\"true\" />\n <label htmlFor={`toggle-${row.id}`} className=\"cursor-pointer select-none\">{row.label}</label>\n </div>\n <ToggleSwitch id={`toggle-${row.id}`} checked={row.checked} onChange={row.onChange} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"border-t border-border pt-4\">\n <SelectionTileGrid<RowHeight>\n sectionLabel=\"Row height\"\n options={ROW_HEIGHT_TILES}\n columns={3}\n value={rowHeight}\n onValueChange={onRowHeightChange}\n interaction=\"button\"\n idPrefix=\"row-height\"\n />\n </div>\n </>\n ) : null}\n\n <div\n className={cn(\n \"space-y-3\",\n (viewSurface === \"board\" || viewSurface === \"table\") && \"border-t border-border pt-4\",\n )}\n >\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">Display options</p>\n <div className=\"space-y-1\">\n {isBoardView && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-file-lines text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Line count</p>\n </div>\n </div>\n <Select\n value={String(displayOptions.boardLineCount)}\n onValueChange={v =>\n onDisplayOptionsChange({ boardLineCount: Number(v) as 1 | 2 | 3 })}\n >\n <SelectTrigger size=\"sm\" className=\"w-[6.5rem] shrink-0\" id=\"board-line-count\" aria-label=\"Line count\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <SelectItem value=\"1\">1 line</SelectItem>\n <SelectItem value=\"2\">2 lines</SelectItem>\n <SelectItem value=\"3\">3 lines</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n\n {viewSurface === \"table\" && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-font text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Table title</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show the page heading and subtitle.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-view-title\"\n checked={displayOptions.showViewTitle}\n onChange={v => onDisplayOptionsChange({ showViewTitle: v })}\n />\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column labels</p>\n {viewSurface === \"table\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the table.</p>\n ) : viewSurface === \"list\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the list.</p>\n ) : null}\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-column-labels\"\n checked={displayOptions.showColumnLabels}\n onChange={v => onDisplayOptionsChange({ showColumnLabels: v })}\n />\n </div>\n\n {isBoardView && (\n <>\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-hashtag text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column counts</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-board-counts\"\n checked={displayOptions.showBoardColumnCounts}\n onChange={v => onDisplayOptionsChange({ showBoardColumnCounts: v })}\n />\n </div>\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-square-plus text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Above new card button</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-new-card-above\"\n checked={displayOptions.boardNewCardAbove}\n onChange={v => onDisplayOptionsChange({ boardNewCardAbove: v })}\n />\n </div>\n </>\n )}\n\n {(viewSurface === \"table\" || viewSurface === \"list\") && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-magnifying-glass text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Search</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Toolbar search for this view.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-toolbar-search\"\n checked={displayOptions.showToolbarSearch}\n onChange={v => onDisplayOptionsChange({ showToolbarSearch: v })}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Filter ── */}\n {sheetPanel === \"filter\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {activeFilters.length === 0 ? (\n <div className=\"rounded-xl border border-border bg-muted/40 p-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center justify-center size-7 rounded-lg bg-background border border-border shrink-0\">\n <i className=\"fa-light fa-filter text-muted-foreground text-xs\" aria-hidden=\"true\" />\n </span>\n <p className=\"text-sm font-medium text-foreground\">No filters yet</p>\n </div>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Use filters to show only the rows you need. With multiple filters, use <span className=\"font-medium text-foreground/80\">and</span> or <span className=\"font-medium text-foreground/80\">or</span> between them to control how they combine.\n </p>\n <div className=\"space-y-1.5\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add filter\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to filter by\" },\n { icon: \"fa-circle-3\", text: \"Pick at least one value — the grid updates immediately\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <>\n {activeFilters.map((f, idx) => {\n const fieldDef = filterFields.find(fd => fd.key === f.fieldKey)\n if (!fieldDef) return null\n const leftId = idx > 0 ? activeFilters[idx - 1]!.id : null\n const connector = leftId ? getFilterConnector(leftId) : \"and\"\n return (\n <React.Fragment key={f.id}>\n {idx > 0 && leftId && (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n <Tip label=\"Click to switch: AND — every filter must match; OR — any matching filter is enough.\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onToggleFilterConnector(leftId)}\n className={cn(\n \"shrink-0 rounded-md border px-2.5 py-0.5 text-xs font-semibold uppercase tracking-wide transition-colors\",\n \"border-border bg-muted/40 text-muted-foreground hover:bg-interactive-hover hover:text-interactive-hover-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n aria-label={\n connector === \"and\"\n ? \"Filters are combined with AND. Click to use OR instead.\"\n : \"Filters are combined with OR. Click to use AND instead.\"\n }\n >\n {connector}\n </button>\n </Tip>\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n </div>\n )}\n <DrawerFilterCard\n filter={f}\n fieldDef={fieldDef}\n expanded={drawerExpandedFilters.has(f.id)}\n onToggleExpand={() => onDrawerExpandedFiltersChange(prev => {\n const next = new Set(prev)\n if (next.has(f.id)) next.delete(f.id)\n else next.add(f.id)\n return next\n })}\n onUpdate={onUpdateFilter}\n onRemove={id => {\n onRemoveFilter(id)\n onDrawerExpandedFiltersChange(prev => { const next = new Set(prev); next.delete(id); return next })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(f.fieldKey, value)}\n />\n </React.Fragment>\n )\n })}\n </>\n )}\n\n {/* Add filter + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem key={f.key} onSelect={() => onAddFilter(f.key)}>\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {activeFilters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => { activeFilters.forEach(f => onRemoveFilter(f.id)); onDrawerExpandedFiltersChange(new Set()) }}\n >\n Remove all\n </Button>\n )}\n </div>\n\n {/* Enable filter bar toggle */}\n <div className=\"flex items-start justify-between gap-3 pt-3 mt-1 border-t border-border\">\n <div>\n <label htmlFor=\"toggle-filter-bar\" className=\"text-sm font-medium text-foreground cursor-pointer\">Enable filter bar</label>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show filters above the table.</p>\n </div>\n <ToggleSwitch id=\"toggle-filter-bar\" checked={filterBarVisible} onChange={onFilterBarVisibleChange} />\n </div>\n </div>\n )}\n\n {/* ── Sort ── */}\n {sheetPanel === \"sort\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {sortRules.length === 0 ? (\n /* Empty state */\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-arrow-up-arrow-down text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No sorts applied</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Add a sort rule to order rows by any field. Multiple rules are applied in priority order.\n </p>\n <div className=\"space-y-1.5 text-start pt-1\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add sort\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to sort by\" },\n { icon: \"fa-circle-3\", text: \"Toggle ascending or descending\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n sortRules.map((rule, idx) => {\n const dragProps = sortDrag.getItemProps(rule.id)\n return (\n <React.Fragment key={rule.id}>\n {idx > 0 && (\n <div className=\"flex items-center gap-2 py-0.5\">\n <div className=\"flex-1 h-px bg-border\" />\n <span className=\"text-xs font-medium text-muted-foreground px-1\">then by</span>\n <div className=\"flex-1 h-px bg-border\" />\n </div>\n )}\n <div\n {...dragProps}\n className={cn(\n \"transition-all\",\n dragProps[\"data-dragging\"] && \"opacity-40\",\n dragProps[\"data-over\"] && \"ring-2 ring-ring bg-accent/30 rounded-lg\",\n )}\n >\n <DrawerSortCard\n rule={rule}\n fieldLabel={resolveColumnLabel(rule.fieldKey)}\n isPrimary={idx === 0}\n onRemove={() => onRemoveSortRule(rule.id)}\n onToggleDir={() => onToggleSortDir(rule.id)}\n />\n </div>\n </React.Fragment>\n )\n })\n )}\n\n {/* Add sort + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add sort\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Sort by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).map(col => (\n <DropdownMenuItem key={col.key} onSelect={() => onAddSortRule(col.key)}>\n <i className=\"fa-light fa-arrow-up-arrow-down text-xs\" aria-hidden=\"true\" />\n {col.label}\n </DropdownMenuItem>\n ))}\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).length === 0 && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">All fields added</p>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {sortRules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => onSortRulesChange([])}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* ── Group ── */}\n {sheetPanel === \"group\" && (\n <div className=\"p-4 space-y-2\">\n <p className=\"text-xs text-muted-foreground mb-3\">\n {groupBy ? `Grouped by ${resolveColumnLabel(groupBy)}.` : \"No grouping applied.\"}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(null)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n !groupBy ? \"bg-accent text-accent-foreground font-medium\" : \"text-muted-foreground\",\n )}\n >\n <i className=\"fa-light fa-ban text-xs\" aria-hidden=\"true\" />\n None\n </Button>\n {groupFieldList.map(col => (\n <Button\n key={col.key}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(groupBy === col.key ? null : col.key)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n groupBy === col.key ? \"bg-accent text-accent-foreground font-medium\" : \"\",\n )}\n >\n <i className=\"fa-light fa-layer-group text-xs text-muted-foreground\" aria-hidden=\"true\" />\n {col.label}\n {groupBy === col.key && <i className=\"fa-solid fa-check text-accent-foreground text-xs ms-auto\" aria-hidden=\"true\" />}\n </Button>\n ))}\n </div>\n )}\n\n {/* ── Columns ── */}\n {sheetPanel === \"columns\" && (\n <div className=\"px-4 py-4\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground mb-3\">\n Column visibility and order apply when you use Table view. They are saved with this tab.\n </p>\n ) : null}\n <p className=\"text-xs text-muted-foreground mb-3\">\n {hiddenCols.size === 0\n ? \"All columns visible. Drag to reorder.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden. Drag handle to reorder.`}\n </p>\n <div className=\"space-y-0.5\" role=\"list\" aria-label=\"Column order and visibility\">\n {orderable.map((key, idx, arr) => {\n const dragProps = colDrag.getItemProps(key)\n return (\n <ColumnRow\n key={key}\n label={resolveColumnLabel(key)}\n isFirst={idx === 0}\n isLast={idx === arr.length - 1}\n visible={!hiddenCols.has(key)}\n onToggleVisible={() => onToggleColVisibility(key)}\n onMoveUp={() => onMoveCol(key, \"up\")}\n onMoveDown={() => onMoveCol(key, \"down\")}\n draggable={dragProps.draggable}\n onDragStart={dragProps.onDragStart}\n onDragOver={dragProps.onDragOver}\n onDrop={dragProps.onDrop}\n onDragEnd={dragProps.onDragEnd}\n isDragging={dragProps[\"data-dragging\"]}\n isOver={dragProps[\"data-over\"]}\n />\n )\n })}\n </div>\n </div>\n )}\n\n {/* ── Conditional rules ── */}\n {sheetPanel === \"conditional-rules\" && (\n <ConditionalRulesPanel\n filterFields={filterFields}\n rules={conditionalRules}\n onAdd={onAddConditionalRule}\n onRemove={onRemoveConditionalRule}\n onUpdate={onUpdateConditionalRule}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n )}\n\n </div>\n </>\n )}\n\n </SheetContent>\n </Sheet>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ConditionalRulesPanel — same DrawerFilterCard as filters (incl. operator cycle);\n// highlight color lives inside the card. Adding a rule expands only that card (like\n// add filter from drawer). No And/Or connectors.\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction ConditionalRulesPanel({\n filterFields,\n rules,\n onAdd,\n onRemove,\n onUpdate,\n renderFilterOptionValue,\n}: {\n filterFields: FilterFieldDef[]\n rules: ConditionalRule[]\n onAdd: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemove: (id: string) => void\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}) {\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => new Set())\n\n const prevLenRef = React.useRef(rules.length)\n React.useEffect(() => {\n if (rules.length > prevLenRef.current && rules.length > 0) {\n const last = rules[rules.length - 1]\n setExpandedIds(new Set([last.id]))\n }\n prevLenRef.current = rules.length\n }, [rules])\n\n function toggleExpanded(id: string) {\n setExpandedIds(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 }\n\n return (\n <div className=\"px-4 py-4 space-y-2\">\n {rules.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-palette text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No rules yet</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Highlight cells with a background color based on their value.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {rules.map(rule => {\n const fd = filterFields.find(f => f.key === rule.fieldKey)\n if (!fd) return null\n return (\n <DrawerFilterCard\n key={rule.id}\n variant=\"conditional\"\n filter={rule}\n fieldDef={fd}\n expanded={expandedIds.has(rule.id)}\n onToggleExpand={() => toggleExpanded(rule.id)}\n onUpdate={onUpdate}\n onRemove={id => {\n onRemove(id)\n setExpandedIds(prev => {\n const next = new Set(prev)\n next.delete(id)\n return next\n })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(rule.fieldKey, value)}\n />\n )\n })}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add rule\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Rule for column</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem\n key={f.key}\n onSelect={() => onAdd({\n fieldKey: f.key,\n operator: f.operators[0],\n values: [],\n bgColor: RULE_COLORS[0].bg,\n })}\n >\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {rules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => {\n rules.forEach(r => onRemove(r.id))\n setExpandedIds(new Set())\n }}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * TablePropertiesDrawerButton — reusable Properties button + drawer combo.\n *\n * Centralises the \"sliders\" icon button and the full `TablePropertiesDrawer` that was\n * previously duplicated per hub (TeamDrawerToolbar, ComplianceDrawerToolbar, …).\n *\n * Pass any `useTableState<T>` return object as `state` — the component only reads\n * display-agnostic fields so it is compatible with any row shape.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { Button } from \"../ui/button\"\nimport { TablePropertiesDrawer } from \"./drawer\"\nimport type {\n ActiveFilter,\n ConditionalRule,\n FilterFieldDef,\n SortRule,\n} from \"../../lib/table-properties-types\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// State interface\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Structural interface over the fields consumed from `useTableState`.\n * Any `ReturnType<typeof useTableState<T>>` is assignable to this type because:\n * - All non-row fields have the same shape regardless of `T`.\n * - `rows: T[]` is assignable to `rows: { length: number }` (arrays expose `.length`).\n */\nexport interface TablePropertiesDrawerButtonState {\n sheetOpen: boolean\n setSheetOpen: (v: boolean) => void\n /**\n * Optional deep-link target consumed by `TablePropertiesDrawer`'s `initialPanel`.\n * Required only if the hub deep-links into a specific drawer panel (e.g. the\n * column header's **Add Conditional Rule** sets it to `\"conditional-rules\"`).\n * Default state is `null`, which makes the drawer open on its index panel.\n */\n sheetInitialPanel?: string | null\n setSheetInitialPanel?: (v: string | null) => void\n showGridlines: boolean\n setShowGridlines: (v: boolean) => void\n rowHeight: RowHeight\n setRowHeight: (v: RowHeight) => void\n activeFilters: ActiveFilter[]\n addFilter: (fieldKey: string, fromDrawer?: boolean) => void\n updateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n removeFilter: (id: string) => void\n getConnector: (leftFilterId: string) => \"and\" | \"or\"\n toggleConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n setFilterBarVisible: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n setDrawerExpandedFilters: React.Dispatch<React.SetStateAction<Set<string>>>\n /** Only `.length` is read — compatible with any `T[]`. */\n rows: { length: number }\n sortRules: SortRule[]\n setSortRules: (rules: SortRule[]) => void\n addSortRule: (fieldKey: string) => void\n removeSortRule: (id: string) => void\n toggleSortDir: (id: string) => void\n colOrder: string[]\n setColOrder: (order: string[]) => void\n hiddenCols: Set<string>\n toggleColVisibility: (key: string) => void\n moveCol: (key: string, dir: \"up\" | \"down\") => void\n groupBy: string | null\n setGroupBy: (key: string | null) => void\n sortKey?: string\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TablePropertiesDrawerButtonProps {\n /** Pass any `useTableState<T>` return value. */\n state: TablePropertiesDrawerButtonState\n totalRows: number\n filterFields: FilterFieldDef[]\n /**\n * Column definitions for the drawer's Sort / Group / Columns panels.\n * Required — derive from your column defs (`columnsToFieldDefinitions`) so\n * the drawer never falls back to product-specific defaults.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Whether pagination is enabled. Defaults to `false`.\n * Placements passes `true` because it supports server-side pagination.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** View type shown in the drawer header tile grid. */\n currentView?: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /**\n * Subset of view types this hub implements. When provided, the drawer's view-type tile grid is\n * filtered so users cannot select an unsupported view (e.g. List hub never offers Dashboard).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Shown below the \"Properties\" title in the drawer header (e.g. \"Team\", \"Compliance\"). */\n lifecycleTabLabel?: string\n /**\n * When the active view is Board and more than one entry is provided, the drawer renders\n * a selector for which field splits the board into swimlane columns.\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Extra controls rendered before the Properties button (e.g. a dashboard-edit button). */\n extraActions?: React.ReactNode\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function TablePropertiesDrawerButton({\n state,\n totalRows,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n pagination = false,\n onPaginationChange,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n extraActions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerButtonProps) {\n // Only destructure the read-only state slices we render directly.\n // Mutators (addFilter, setSortRules, toggleColVisibility, …) are\n // intentionally accessed via `stateRef.current.X` so the portaled Sheet\n // always sees the latest reducers without re-binding event handlers on\n // every render.\n const {\n sheetOpen, setSheetOpen,\n sheetInitialPanel,\n setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n activeFilters,\n filterBarVisible,\n drawerExpandedFilters,\n rows,\n sortRules,\n colOrder,\n hiddenCols,\n groupBy,\n sortKey,\n } = state\n\n // Sheet is portaled; keep latest handlers so sort/filter/conditional edits are not lost.\n // Writes to ref.current MUST happen after commit (not during render) — React 19 +\n // react-hooks v6 lints `Cannot access refs during render`. Use `useLayoutEffect` so\n // the ref points at the just-rendered values before any effects fire.\n const stateRef = React.useRef(state)\n const ruleHandlersRef = React.useRef({\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n })\n React.useLayoutEffect(() => {\n stateRef.current = state\n })\n React.useLayoutEffect(() => {\n ruleHandlersRef.current = {\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n }\n })\n\n // Stable callback that defers the ref read to invocation time. Used for\n // `onDrawerExpandedFiltersChange` which is read-by-reference (not invoked\n // through an inline arrow), so we wrap it explicitly to avoid reading\n // `stateRef.current` during render.\n const onDrawerExpandedFiltersChange = React.useCallback<\n React.Dispatch<React.SetStateAction<Set<string>>>\n >((next) => stateRef.current.setDrawerExpandedFilters(next), [])\n\n return (\n <>\n {extraActions}\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Properties\"\n onClick={() => {\n // The toolbar button always opens to the drawer's \"main\" index\n // panel — clear any pending deep-link target from a previous\n // column-menu interaction so this open lands on main.\n setSheetInitialPanel?.(null)\n setSheetOpen(true)\n }}\n className={cn(\n sheetOpen\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-sliders text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Properties</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TablePropertiesDrawer\n open={sheetOpen}\n onOpenChange={setSheetOpen}\n initialPanel={sheetInitialPanel}\n showGridlines={showGridlines}\n onShowGridlinesChange={setShowGridlines}\n rowHeight={rowHeight}\n onRowHeightChange={setRowHeight}\n pagination={pagination}\n onPaginationChange={v => ruleHandlersRef.current.onPaginationChange?.(v)}\n activeFilters={activeFilters}\n onAddFilter={fieldKey => stateRef.current.addFilter(fieldKey, true)}\n onUpdateFilter={(id, patch) => stateRef.current.updateFilter(id, patch)}\n onRemoveFilter={id => stateRef.current.removeFilter(id)}\n getFilterConnector={leftId => stateRef.current.getConnector(leftId)}\n onToggleFilterConnector={leftId => stateRef.current.toggleConnector(leftId)}\n filterBarVisible={filterBarVisible}\n onFilterBarVisibleChange={v => stateRef.current.setFilterBarVisible(v)}\n drawerExpandedFilters={drawerExpandedFilters}\n onDrawerExpandedFiltersChange={onDrawerExpandedFiltersChange}\n totalRows={totalRows}\n filteredRows={rows.length}\n sortRules={sortRules}\n onSortRulesChange={rules => stateRef.current.setSortRules(rules)}\n onAddSortRule={fieldKey => stateRef.current.addSortRule(fieldKey)}\n onRemoveSortRule={id => stateRef.current.removeSortRule(id)}\n onToggleSortDir={id => stateRef.current.toggleSortDir(id)}\n colOrder={colOrder}\n onColOrderChange={order => stateRef.current.setColOrder(order)}\n hiddenCols={hiddenCols}\n onToggleColVisibility={key => stateRef.current.toggleColVisibility(key)}\n onMoveCol={(key, dir) => stateRef.current.moveCol(key, dir)}\n groupBy={groupBy}\n onGroupByChange={key => stateRef.current.setGroupBy(key)}\n primarySortKey={sortKey}\n conditionalRules={conditionalRules}\n onAddConditionalRule={rule => ruleHandlersRef.current.onAddConditionalRule(rule)}\n onRemoveConditionalRule={id => ruleHandlersRef.current.onRemoveConditionalRule(id)}\n onUpdateConditionalRule={(id, patch) => ruleHandlersRef.current.onUpdateConditionalRule(id, patch)}\n filterFields={filterFields}\n lifecycleTabLabel={lifecycleTabLabel}\n fieldDefinitions={fieldDefinitions}\n resolveColumnLabel={resolveColumnLabel}\n displayOptions={displayOptions}\n onDisplayOptionsChange={patch => ruleHandlersRef.current.onDisplayOptionsChange(patch)}\n currentView={currentView}\n onViewChange={onViewChange}\n supportedViewTypes={supportedViewTypes}\n boardGroupByColumnOptions={boardGroupByColumnOptions}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n </>\n )\n}\n","\"use client\"\n\n/**\n * Switches list-hub view bodies by `DataListViewRenderKind`.\n * Hubs pass one renderer per kind they support; missing kinds show a clear empty state\n * (never silently fall through to dashboard).\n */\n\nimport * as React from \"react\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n dataListViewDefinition,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\n\nexport type ListPageConnectedViewRenderers = Partial<\n Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>\n>\n\nexport interface ListPageConnectedViewBodyProps {\n view: DataListViewType\n /** Human-readable hub name for the not-configured state. */\n hubLabel?: string\n renderers: ListPageConnectedViewRenderers\n}\n\nfunction resolveRenderer(node: React.ReactNode | (() => React.ReactNode) | undefined) {\n if (node == null) return null\n return typeof node === \"function\" ? node() : node\n}\n\nexport function ListPageViewNotConfigured({\n view,\n hubLabel = \"This hub\",\n}: {\n view: DataListViewType\n hubLabel?: string\n}) {\n const label = dataListViewLabel(view)\n return (\n <div\n className=\"flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground\"\n role=\"status\"\n >\n {hubLabel} does not implement {label}. Add a renderer for{\" \"}\n <span className=\"font-medium text-foreground\">{dataListViewDefinition(view).renderKind}</span>{\" \"}\n in this hub&apos;s table component, or remove the view from{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 text-xs\">supportedViewTypes</code>.\n </div>\n )\n}\n\nexport function ListPageConnectedViewBody({\n view,\n hubLabel,\n renderers,\n}: ListPageConnectedViewBodyProps) {\n const kind = getDataListViewRenderKind(view)\n const body = resolveRenderer(renderers[kind])\n if (body == null) {\n return <ListPageViewNotConfigured view={view} hubLabel={hubLabel} />\n }\n return <>{body}</>\n}\n","\"use client\"\n\n/**\n * DataRowList — generic vertical-stack list view used by every hub's \"list\"\n * tab (placements, team, compliance, sites, library, …). Replaces the\n * hand-rolled `<ul …flex-col gap-2 px-4 pb-8 pt-2 lg:px-6> {rows.map(<li>…)}`\n * shell that was duplicated across `*-list-view.tsx` files.\n *\n * Composition over inheritance: callers provide a `renderRow(row)` that\n * returns whatever ListPageBoardCard / link / chip-stack they need — this\n * component owns the chrome (spacing, empty state, virtualization), not the\n * row body.\n *\n * Auto-virtualises with `@tanstack/react-virtual` when the row count meets\n * `virtualizeThreshold` (default 100). Disable by passing `0`.\n */\n\nimport * as React from \"react\"\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\"\nimport { cn } from \"../../lib/utils\"\n\nconst DEFAULT_VIRTUALIZE_THRESHOLD = 100\nconst DEFAULT_ESTIMATED_ROW_HEIGHT = 96\nconst DEFAULT_OVERSCAN = 8\n\nexport interface DataRowListProps<TRow> {\n /** The filtered/sorted rows from `tableState.rows` (or wherever). */\n rows: readonly TRow[]\n /** Stable id used as the React `key` and (for virtualizer) the v-key. */\n getRowId: (row: TRow, index: number) => string | number\n /** Render the body of one row. Wrap with `<ListPageBoardCard layout=\"row\">` etc. */\n renderRow: (row: TRow, index: number) => React.ReactNode\n /**\n * Shown when `rows.length === 0`. Strings render as muted body copy; pass\n * a `ReactNode` for richer empty states (illustration, CTA, etc.).\n */\n emptyState?: React.ReactNode\n /**\n * Auto-virtualise when `rows.length >= virtualizeThreshold`. Default 100.\n * Pass `0` to never virtualise (preserves predictable layout for short\n * lists like dashboards / pinned tabs).\n */\n virtualizeThreshold?: number\n /** Hint for the virtualizer; clamps to measured size after first paint. */\n estimatedRowHeight?: number\n /** Override the default container padding / gap if needed. */\n className?: string\n /** Override the per-row `<li>` className (e.g. tighter spacing). */\n rowClassName?: string\n /** `aria-label` for the `<ul>` (screen-reader name for the list). */\n ariaLabel?: string\n}\n\nconst DEFAULT_OUTER_CLASS = \"flex list-none flex-col gap-2 px-4 pb-8 pt-2 lg:px-6\"\n\nexport function DataRowList<TRow>(props: DataRowListProps<TRow>) {\n const {\n rows,\n getRowId,\n renderRow,\n emptyState,\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\n estimatedRowHeight = DEFAULT_ESTIMATED_ROW_HEIGHT,\n className,\n rowClassName,\n ariaLabel,\n } = props\n\n if (rows.length === 0) {\n if (emptyState == null) return null\n if (typeof emptyState === \"string\") {\n return (\n <div className=\"px-4 py-16 text-center lg:px-6\">\n <p className=\"text-sm text-muted-foreground\">{emptyState}</p>\n </div>\n )\n }\n return <div className=\"px-4 py-16 text-center lg:px-6\">{emptyState}</div>\n }\n\n if (virtualizeThreshold > 0 && rows.length >= virtualizeThreshold) {\n return (\n <DataRowListVirtualized\n rows={rows}\n getRowId={getRowId}\n renderRow={renderRow}\n estimatedRowHeight={estimatedRowHeight}\n className={className}\n rowClassName={rowClassName}\n ariaLabel={ariaLabel}\n />\n )\n }\n\n return (\n <ul aria-label={ariaLabel} className={cn(DEFAULT_OUTER_CLASS, className)}>\n {rows.map((row, i) => (\n <li key={getRowId(row, i)} className={rowClassName}>\n {renderRow(row, i)}\n </li>\n ))}\n </ul>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Virtualised variant — keeps the DOM short on long lists (e.g. 1000+ rows).\n// Uses `useWindowVirtualizer` so the page scroll drives row recycling; this\n// is the right tool for hub-level lists (not nested-scroll containers).\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction DataRowListVirtualized<TRow>({\n rows,\n getRowId,\n renderRow,\n estimatedRowHeight,\n className,\n rowClassName,\n ariaLabel,\n}: {\n rows: readonly TRow[]\n getRowId: (row: TRow, index: number) => string | number\n renderRow: (row: TRow, index: number) => React.ReactNode\n estimatedRowHeight: number\n className?: string\n rowClassName?: string\n ariaLabel?: string\n}) {\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n // `scrollMargin` is read by the virtualizer during render, so it has to\n // be state (not a ref). We measure with `useLayoutEffect` after the first\n // paint and on resize so window-scroll math stays accurate when the page\n // layout shifts (sidebar collapse, banner, etc.).\n const [scrollMargin, setScrollMargin] = React.useState(0)\n\n const updateScrollMargin = React.useCallback(() => {\n const el = anchorRef.current\n if (!el) return\n setScrollMargin(el.getBoundingClientRect().top + window.scrollY)\n }, [])\n\n React.useLayoutEffect(() => {\n updateScrollMargin()\n window.addEventListener(\"resize\", updateScrollMargin)\n return () => window.removeEventListener(\"resize\", updateScrollMargin)\n }, [updateScrollMargin, rows.length])\n\n const virtualizer = useWindowVirtualizer({\n count: rows.length,\n estimateSize: () => estimatedRowHeight,\n overscan: DEFAULT_OVERSCAN,\n scrollMargin,\n getItemKey: i => String(getRowId(rows[i], i)),\n })\n\n const totalSize = virtualizer.getTotalSize()\n\n return (\n <div ref={anchorRef} className={cn(\"px-4 pb-8 pt-2 lg:px-6\", className)}>\n <ul\n aria-label={ariaLabel}\n className=\"relative m-0 w-full list-none p-0\"\n style={{ height: `${totalSize}px` }}\n >\n {virtualizer.getVirtualItems().map(vr => {\n const row = rows[vr.index]\n if (!row) return null\n return (\n <li\n key={vr.key}\n data-index={vr.index}\n ref={virtualizer.measureElement}\n className={cn(\"absolute start-0 top-0 w-full pb-2\", rowClassName)}\n style={{ transform: `translateY(${vr.start}px)` }}\n >\n {renderRow(row, vr.index)}\n </li>\n )\n })}\n </ul>\n </div>\n )\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 badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-1 text-xs font-medium leading-none whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-[var(--chip-destructive)] focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:text-red-100 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-interactive-hover [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-muted-foreground dark:hover:bg-interactive-hover-subtle\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\n/**\n * Reusable building blocks for kanban / board cards (icon rows, two-line blocks, placeholders).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { BoardLineCount } from \"../../lib/data-list-display-options\"\n\nexport function BoardCardIconRow({\n iconClass,\n children,\n}: {\n iconClass: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1 text-xs leading-snug [&_.text-sm]:text-xs [&_span]:text-xs [&_div]:text-xs\">\n {children}\n </div>\n </div>\n )\n}\n\nexport function BoardCardTwoLineBlock({\n iconClass,\n line1,\n line2,\n line2ClassName,\n}: {\n iconClass: string\n line1: React.ReactNode\n /** Omitted for a single-line row (same icon + primary alignment as Placements). */\n line2?: React.ReactNode\n /** Override default muted line-2 (e.g. badges / rich cells). */\n line2ClassName?: string\n}) {\n const showLine2 = line2 !== undefined && line2 !== null\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium text-foreground leading-tight\">{line1}</div>\n {showLine2 ? (\n <div\n className={cn(\n \"mt-0.5 min-w-0 leading-tight\",\n line2ClassName ?? \"truncate text-xs text-muted-foreground\",\n )}\n >\n {line2}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport function lineClampClass(n: BoardLineCount): string {\n const base = \"min-w-0 overflow-hidden break-words\"\n if (n === 1) return cn(base, \"line-clamp-1\")\n if (n === 2) return cn(base, \"line-clamp-2\")\n return cn(base, \"line-clamp-3\")\n}\n\nexport function BoardNewCardPlaceholder({ position }: { position: \"above\" | \"below\" }) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border bg-background/50 py-2 text-xs font-medium text-muted-foreground transition-colors\",\n \"hover:border-input hover:bg-muted/40 hover:text-foreground\",\n position === \"above\" ? \"mb-2\" : \"mt-2\",\n )}\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n New card\n </button>\n )\n}\n","\"use client\"\n\n/**\n * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).\n *\n * - Columns are defined with predicates; each row is placed in the **first** matching column.\n * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).\n * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.\n *\n * @see `docs/data-views-pattern.md` — board primitives\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { BoardNewCardPlaceholder } from \"./board-card-primitives\"\n\nexport type ListPageBoardColumnDef<T> = {\n id: string\n label: string\n /** Shown beside the title on larger breakpoints */\n description?: string\n /** First matching column wins; columns should be mutually exclusive for most domains. */\n filter: (row: T) => boolean\n}\n\nexport type ListPageBoardTemplateProps<T> = {\n columns: ListPageBoardColumnDef<T>[]\n rows: T[]\n getRowKey: (row: T) => string | number\n renderCard: (row: T) => React.ReactNode\n /** Tailwind classes for the count pill, keyed by column `id` */\n columnCountBadgeClassName?: Record<string, string>\n /** Copy when a column has no rows */\n emptyColumnLabel?: string\n}\n\nfunction ListPageBoardColumnHeader({\n label,\n description,\n count,\n badgeClassName,\n}: {\n label: string\n description?: string\n count: number\n badgeClassName?: string\n}) {\n return (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{label}</span>\n {description ? (\n <span className=\"hidden text-xs text-muted-foreground sm:inline\">{description}</span>\n ) : null}\n </div>\n <Badge\n variant=\"outline\"\n className={cn(\n \"inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground\",\n badgeClassName,\n )}\n aria-label={`${count} ${count === 1 ? \"item\" : \"items\"}`}\n >\n {count}\n </Badge>\n </div>\n )\n}\n\nexport function ListPageBoardTemplate<T>({\n columns,\n rows,\n getRowKey,\n renderCard,\n columnCountBadgeClassName = {},\n emptyColumnLabel = \"No items\",\n}: ListPageBoardTemplateProps<T>) {\n const grouped = React.useMemo(() => {\n const map: Record<string, T[]> = {}\n for (const col of columns) map[col.id] = []\n for (const row of rows) {\n for (const col of columns) {\n if (col.filter(row)) {\n map[col.id].push(row)\n break\n }\n }\n }\n return map\n }, [columns, rows])\n\n return (\n <div className=\"flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6\">\n {columns.map(col => (\n <div\n key={col.id}\n className=\"flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30\"\n >\n <ListPageBoardColumnHeader\n label={col.label}\n description={col.description}\n count={grouped[col.id]?.length ?? 0}\n badgeClassName={columnCountBadgeClassName[col.id]}\n />\n\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto p-2\">\n <BoardNewCardPlaceholder position=\"above\" />\n\n {(grouped[col.id]?.length ?? 0) === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">{emptyColumnLabel}</p>\n ) : (\n grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)\n )}\n\n <BoardNewCardPlaceholder position=\"below\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * `<HubTable<TRow>>` — single centralized table surface used by every list-page hub.\n *\n * Owns all the per-hub scaffolding that was previously duplicated in `placements-table.tsx`,\n * `team-table.tsx`, `compliance-table.tsx`, `library-table.tsx`, and `sites-table.tsx`:\n *\n * • `useTableState` setup tied to the centralized row dataset\n * • `displayOptions` state + `patchDisplay`\n * • `conditionalRules` state + add/remove/update handlers\n * • `filterFields` derived from column `filter` defs\n * • `fieldDefinitions` + `resolveColumnLabel` for the Properties drawer\n * • `TablePropertiesDrawerButton` wiring with `currentView` + `supportedViewTypes`\n * • `DataTable` for `view === \"table\"`; `ListPageConnectedViewBody` for every other view\n * • Imperative `openPropertiesDrawer()` exposed via `handleRef`\n *\n * Each hub now only declares **what's actually different**: its column defs and a typed\n * `renderers` map for the views it implements. The renderers receive `state`, `toolbar`,\n * `toolbarShell`, `drawerToolbarProps`, `displayOptions`, and `patchDisplay` so they can\n * either reuse the pre-composed toolbar (`toolbarShell(<MyView rows={state.rows} />)`) or\n * build their own (e.g. dashboard view with extra layout-edit actions).\n *\n * **Single dataset rule:** rows flow through `useTableState`; `tableState.rows` is the\n * filtered/sorted row bag every non-table renderer reads. There is **no** parallel mock\n * array per view. See `.cursor/rules/exxat-centralized-list-dataset.mdc`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { DataTable, DataTableToolbar } from \"../data-table\"\nimport { CountSyncer, PaginationBar } from \"../data-table/pagination\"\nimport type { ColumnDef } from \"../data-table/types\"\nimport { useTableState } from \"../data-table/use-table-state\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n getDataListViewRenderKind,\n FULL_HUB_SUPPORTED_VIEWS,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\nimport {\n DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n type DataListDisplayOptions,\n} from \"../../lib/data-list-display-options\"\nimport { TablePropertiesDrawerButton } from \"../table-properties\"\nimport type {\n ConditionalRule,\n FilterFieldDef,\n FilterOperator,\n} from \"../../lib/table-properties-types\"\nimport {\n ListPageConnectedViewBody,\n type ListPageConnectedViewRenderers,\n} from \"./list-page-connected-view-body\"\nimport { DataRowList } from \"./data-row-list\"\nimport {\n ListPageBoardTemplate,\n type ListPageBoardColumnDef,\n} from \"./list-page-board-template\"\nimport type { OpenTablePropertiesHandle } from \"../../lib/list-page-table-properties\"\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction columnToFilterFieldDef<TRow>(c: ColumnDef<TRow>): FilterFieldDef | null {\n if (!c.filter) return null\n const f = c.filter\n const defaultOps: FilterOperator[] =\n f.type === \"select\" || f.type === \"date\" ? [\"is\", \"is_not\"] : [\"contains\", \"not_contains\"]\n return {\n key: c.key,\n label: c.label,\n icon: f.icon ?? \"fa-filter\",\n type: f.type,\n operators: (f.operators ?? defaultOps) as FilterOperator[],\n options: f.options,\n ...(f.textMask ? { textMask: f.textMask } : {}),\n }\n}\n\n/** Derive `FilterFieldDef[]` from a hub's column defs — preferred to hand-writing both. */\nexport function columnsToFilterFields<TRow>(cols: ColumnDef<TRow>[]): FilterFieldDef[] {\n return cols\n .map(c => columnToFilterFieldDef<TRow>(c))\n .filter((x): x is FilterFieldDef => x !== null)\n}\n\n/** Field definitions for the drawer's Sort / Group / Columns panels — excludes utility columns. */\nexport function columnsToFieldDefinitions<TRow>(\n cols: ColumnDef<TRow>[],\n): { key: string; label: string; sortable: boolean }[] {\n return cols\n .filter(c => c.key !== \"select\" && c.key !== \"actions\")\n .map(c => ({\n key: c.key,\n label: c.label,\n sortable: !!(c.sortable && (c.sortKey ?? c.key)),\n }))\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Public types\n// ──────────────────────────────────────────────────────────────────────────────\n\n/** Subset of `TablePropertiesDrawerButton` props that `HubTable` owns. Exposed so renderers\n * that build a custom toolbar (e.g. dashboard with an extra Edit-layout button) can splat\n * this back into their own `<TablePropertiesDrawerButton {...drawerToolbarProps} state={s} extraActions={…} />`. */\nexport interface HubDrawerToolbarProps {\n totalRows: number\n filterFields: FilterFieldDef[]\n fieldDefinitions: { key: string; label: string; sortable: boolean }[]\n resolveColumnLabel: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n currentView: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n supportedViewTypes: readonly DataListViewType[]\n lifecycleTabLabel: string\n boardGroupByColumnOptions?: { key: string; label: string }[]\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n}\n\n/** Everything a non-table renderer needs. The pre-composed `toolbar` includes search +\n * filter chips + the Properties button; the renderer just wraps it around its body with\n * `toolbarShell`. For dashboards or other layouts that own their own toolbar, use\n * `drawerToolbarProps` to assemble a custom `<TablePropertiesDrawerButton>`. */\nexport interface HubTableRendererArgs<TRow extends Record<string, unknown>> {\n state: ReturnType<typeof useTableState<TRow>>\n toolbar: React.ReactNode\n toolbarShell: (body: React.ReactNode) => React.ReactNode\n drawerToolbarProps: HubDrawerToolbarProps\n displayOptions: DataListDisplayOptions\n patchDisplay: (patch: Partial<DataListDisplayOptions>) => void\n}\n\n/** Hubs provide one renderer per `DataListViewRenderKind` they implement. The `data-table`\n * kind is handled internally by `HubTable` (do not override unless you genuinely need a\n * different table surface). Missing kinds render `<ListPageViewNotConfigured>` — clear empty\n * state, never a silent dashboard fallback. */\nexport type HubTableRenderers<TRow extends Record<string, unknown>> = Partial<\n Record<DataListViewRenderKind, (args: HubTableRendererArgs<TRow>) => React.ReactNode>\n>\n\nexport type HubTableHandle = OpenTablePropertiesHandle\n\nexport interface HubTableProps<TRow extends Record<string, unknown>> {\n /** Full row dataset (already scoped/filtered by the hub client, e.g. by URL nav). */\n rows: TRow[]\n /** Column defs — `filter` blocks here become Properties drawer filter fields automatically. */\n columns: ColumnDef<TRow>[]\n /** Active view from the `ListPageTemplate` tab. */\n view: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /**\n * Allowlist passed to `TablePropertiesDrawerButton` so Properties cannot offer unsupported views.\n * Defaults to {@link FULL_HUB_SUPPORTED_VIEWS} when omitted — keep in sync with\n * `ListPageTemplate.supportedViewTypes` on the same hub.\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Used by `ListPageViewNotConfigured` when a supported view has no renderer. */\n hubLabel: string\n /** Shown below \"Properties\" in the drawer header. */\n lifecycleTabLabel: string\n /** Toolbar search input aria-label. */\n searchAriaLabel: string\n getRowId: (row: TRow) => string | number\n getRowSelectionLabel: (row: TRow) => string\n defaultSort: { key: string; dir: \"asc\" | \"desc\" }\n /** DataTable empty state. Defaults to a muted \"No records match your filters.\" */\n emptyState?: React.ReactNode\n /** Per-view renderers (everything other than `view === \"table\"`). */\n renderers: HubTableRenderers<TRow>\n /** Bulk-actions slot rendered when one or more rows are selected. */\n bulkActionsSlot?: (selected: Set<string | number>) => React.ReactNode\n /** Board-view group-by column options for the Properties drawer. */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Initial display options (toolbar search visibility, calendar panel, etc.). */\n displayOptionsInit?: DataListDisplayOptions\n /** Custom renderer for filter option values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** DataTable: enable \"Group by\" feature. Default `true`. */\n groupable?: boolean\n /** DataTable: enable row selection checkboxes. Default `true`. */\n selectable?: boolean\n /** DataTable: row click handler (e.g. navigate to detail route). */\n onRowClick?: (row: TRow) => void\n /**\n * Controlled `displayOptions` — when provided (with `onDisplayOptionsChange`), the hub client\n * owns persistence (e.g. Placements page persists across tab switches). Otherwise `HubTable`\n * owns internal state from `displayOptionsInit`.\n */\n displayOptions?: DataListDisplayOptions\n onDisplayOptionsChange?: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * Pagination toggle forwarded to `TablePropertiesDrawerButton` so the drawer can offer\n * \"Show pagination\" on the Display panel. The hub still implements its own pagination chrome\n * around the table body via `tableRenderer`. Defaults to `false` / no toggle.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** Imperative handle (`openPropertiesDrawer`) for hub clients that pass `tablePropertiesRef`. */\n handleRef?: React.Ref<HubTableHandle>\n /** Optional override for the `data-table` view. Default mounts `<DataTable {…}>`. */\n tableRenderer?: (args: HubTableRendererArgs<TRow>) => React.ReactNode\n /**\n * Forwarded to `useTableState` so the hub can switch on server-style pagination\n * with externally-controlled page/pageSize (advanced; most hubs should leave\n * this undefined and let `HubTable` own the internal page state — see\n * `pagination` + `paginationPageSizeOptions`).\n */\n paginationOverride?: { page: number; pageSize: number }\n /** Page size options shown in the toolbar `<PaginationBar>`. Default `[10, 25, 50, 100]`. */\n paginationPageSizeOptions?: number[]\n /** Initial page size when `HubTable` owns pagination internally. Default `10`. */\n paginationInitialPageSize?: number\n /**\n * Forwarded to `useTableState` to sync toolbar search from `?q=` (Library search routes).\n * Defining as `\"\"` enables sync without an initial query.\n */\n syncedSearchFromUrl?: string\n\n // ─── Centralized \"list\" and \"board\" defaults ───────────────────────────────\n // When a hub does NOT provide a renderer for `list-with-toolbar`, but DOES provide\n // `renderListRow`, `HubTable` synthesises a default that wires `DataRowList` through\n // the shared toolbar. Same for `board-with-toolbar` + `renderBoardCard`. This is the\n // happy path for most hubs; the explicit renderer escape hatch is only needed for\n // exotic surfaces (e.g. Placements board with per-phase column search).\n\n /** Default `list-with-toolbar` renderer body — `HubTable` wraps with toolbar + `DataRowList`. */\n renderListRow?: (row: TRow) => React.ReactNode\n /** Override the `aria-label` on the `<ul>` from `renderListRow`. Defaults to `hubLabel`. */\n listAriaLabel?: string\n /** Empty-state for the default list renderer. Defaults to \"No records match your filters.\" */\n listEmptyState?: React.ReactNode\n /** Virtualise after N rows in the default list renderer. Default 100; pass `0` to disable. */\n listVirtualizeThreshold?: number\n /** Estimated row height (px) for the default list virtualiser. Default 96. */\n listEstimatedRowHeight?: number\n\n /** Default `board-with-toolbar` renderer body — `HubTable` wraps with toolbar + `ListPageBoardTemplate`. */\n renderBoardCard?: (row: TRow) => React.ReactNode\n /** Required if `renderBoardCard` is set: how rows group into columns. */\n boardGroups?: ListPageBoardColumnDef<TRow>[]\n /** Per-column count badge tint classes for the default board renderer. */\n boardColumnCountBadgeClassName?: Record<string, string>\n /** Empty column copy for the default board renderer. Defaults to \"No items\". */\n boardEmptyColumnLabel?: string\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Component\n// ──────────────────────────────────────────────────────────────────────────────\n\nexport function HubTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n view,\n onViewChange,\n supportedViewTypes: supportedViewTypesProp,\n hubLabel,\n lifecycleTabLabel,\n searchAriaLabel,\n getRowId,\n getRowSelectionLabel,\n defaultSort,\n emptyState,\n renderers,\n bulkActionsSlot,\n boardGroupByColumnOptions,\n displayOptionsInit,\n renderFilterOptionValue,\n groupable = true,\n selectable = true,\n onRowClick,\n displayOptions: displayOptionsControlled,\n onDisplayOptionsChange: onDisplayOptionsChangeControlled,\n pagination,\n onPaginationChange,\n handleRef,\n tableRenderer,\n paginationOverride,\n paginationPageSizeOptions = [10, 25, 50, 100],\n paginationInitialPageSize = 10,\n syncedSearchFromUrl,\n renderListRow,\n listAriaLabel,\n listEmptyState,\n listVirtualizeThreshold,\n listEstimatedRowHeight,\n renderBoardCard,\n boardGroups,\n boardColumnCountBadgeClassName,\n boardEmptyColumnLabel,\n}: HubTableProps<TRow>) {\n const supportedViewTypes = supportedViewTypesProp ?? FULL_HUB_SUPPORTED_VIEWS\n const filterFields = React.useMemo(() => columnsToFilterFields(columns), [columns])\n const fieldDefinitions = React.useMemo(() => columnsToFieldDefinitions(columns), [columns])\n const resolveColumnLabel = React.useCallback(\n (key: string) => columns.find(c => c.key === key)?.label ?? key,\n [columns],\n )\n\n // displayOptions: controlled (parent owns state via prop pair) OR uncontrolled (HubTable owns it).\n // Most hubs keep display options ephemeral; Placements persists them across tabs at the page level.\n const [internalDisplayOptions, setInternalDisplayOptions] = React.useState<DataListDisplayOptions>(\n displayOptionsInit ?? DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n )\n const isControlled =\n displayOptionsControlled !== undefined && onDisplayOptionsChangeControlled !== undefined\n const displayOptions = isControlled ? displayOptionsControlled : internalDisplayOptions\n const patchDisplay = React.useCallback(\n (patch: Partial<DataListDisplayOptions>) => {\n if (isControlled) {\n onDisplayOptionsChangeControlled!(patch)\n } else {\n setInternalDisplayOptions(prev => ({ ...prev, ...patch }))\n }\n },\n [isControlled, onDisplayOptionsChangeControlled],\n )\n\n const [conditionalRules, setConditionalRules] = React.useState<ConditionalRule[]>([])\n const addConditionalRule = React.useCallback((rule: Omit<ConditionalRule, \"id\">) => {\n setConditionalRules(prev => [...prev, { ...rule, id: `cr-${Date.now()}` }])\n }, [])\n const removeConditionalRule = React.useCallback((id: string) => {\n setConditionalRules(prev => prev.filter(r => r.id !== id))\n }, [])\n const updateConditionalRule = React.useCallback(\n (id: string, patch: Partial<ConditionalRule>) => {\n setConditionalRules(prev => prev.map(r => (r.id === id ? { ...r, ...patch } : r)))\n },\n [],\n )\n\n // ─── Pagination chrome (centralized) ─────────────────────────────────────\n // When `pagination === true` and the parent did NOT supply `paginationOverride`,\n // `HubTable` owns the page/pageSize internally and wraps the default table +\n // list renderers with `<CountSyncer>` + `<PaginationBar>`. Hubs that need full\n // control (e.g. server-side pagination) keep using `paginationOverride`.\n const [internalPage, setInternalPage] = React.useState(1)\n const [internalPageSize, setInternalPageSize] = React.useState(paginationInitialPageSize)\n const chromeOwnedPagination = pagination === true && paginationOverride === undefined\n const effectivePaginationOverride =\n paginationOverride ??\n (chromeOwnedPagination ? { page: internalPage, pageSize: internalPageSize } : undefined)\n\n const tableState = useTableState<TRow>(\n rows,\n columns,\n defaultSort,\n effectivePaginationOverride,\n syncedSearchFromUrl,\n )\n\n const handlePageChange = React.useCallback((p: number) => setInternalPage(p), [])\n const handlePageSizeChange = React.useCallback((n: number) => {\n setInternalPageSize(n)\n setInternalPage(1)\n }, [])\n const resetPage = React.useCallback(() => setInternalPage(1), [])\n\n // Extract the stable setter from `useTableState` first so the\n // `useImperativeHandle` deps array sees the exact value the hook reads.\n // `setSheetOpen` is referentially stable, so the handle is created once.\n const { setSheetOpen: openPropertiesSheet } = tableState\n React.useImperativeHandle(\n handleRef ?? null,\n () => ({ openPropertiesDrawer: () => openPropertiesSheet(true) }),\n [openPropertiesSheet],\n )\n\n const drawerToolbarProps: HubDrawerToolbarProps = {\n totalRows: rows.length,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange: patchDisplay,\n conditionalRules,\n onAddConditionalRule: addConditionalRule,\n onRemoveConditionalRule: removeConditionalRule,\n onUpdateConditionalRule: updateConditionalRule,\n currentView: view,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n ...(pagination !== undefined ? { pagination } : {}),\n ...(onPaginationChange !== undefined ? { onPaginationChange } : {}),\n }\n\n const toolbar = (\n <DataTableToolbar\n state={tableState}\n columns={columns}\n searchable={displayOptions.showToolbarSearch}\n searchAriaLabel={searchAriaLabel}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n />\n )\n\n const toolbarShell = React.useCallback(\n (body: React.ReactNode) => (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {toolbar}\n {body}\n </div>\n ),\n // `toolbar` is recreated each render; including it would defeat memoization but\n // also gives renderers a fresh closure — acceptable because renderers are called\n // on render anyway. Keep deps stable so the function identity is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n tableState,\n columns,\n displayOptions.showToolbarSearch,\n searchAriaLabel,\n renderFilterOptionValue,\n drawerToolbarProps,\n ],\n )\n\n // Default `data-table` renderer — full DataTable with toolbar + bulk actions. When\n // `pagination === true` and the parent did not provide `paginationOverride`, the chrome\n // (CountSyncer + PaginationBar) is wrapped automatically so the drawer toggle \"Show\n // pagination\" works out of the box. Hubs that need finer control (custom chrome,\n // server-side paging) can still override via `tableRenderer`.\n const defaultTableRenderer = (args: HubTableRendererArgs<TRow>) => {\n const filteredCount = (args.state.rows as TRow[]).length\n const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)))\n const safePage = Math.min(internalPage, totalPages)\n return (\n <div className=\"pb-6\">\n {chromeOwnedPagination ? (\n <CountSyncer\n count={filteredCount}\n onSync={(n) => {\n const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)))\n if (safePage > next) setInternalPage(next)\n }}\n onReset={resetPage}\n />\n ) : null}\n <DataTable<TRow>\n data={rows}\n columns={columns}\n getRowId={getRowId}\n getRowSelectionLabel={getRowSelectionLabel}\n selectable={selectable}\n searchable={displayOptions.showToolbarSearch}\n showColumnHeaders={displayOptions.showColumnLabels}\n groupable={groupable}\n defaultSort={defaultSort}\n emptyState={emptyState ?? <p className=\"text-sm text-muted-foreground\">No records match your filters.</p>}\n conditionalRules={conditionalRules}\n state={args.state}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n bulkActionsSlot={bulkActionsSlot}\n onRowClick={onRowClick}\n hasFooter={chromeOwnedPagination}\n />\n {chromeOwnedPagination ? (\n <div\n className={cn(\n \"mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\",\n // z-40 sits above pinned cells (z-20), group headers (z-25), and column headers\n // (z-30 / z-40) so the sticky footer paints over any table content that scrolls\n // behind it. Pinned-left cells ship with their own `bg-dt-row-bg`, which\n // otherwise wins because of z-20 > z-10.\n \"sticky bottom-0 z-40\",\n )}\n >\n <PaginationBar\n page={safePage}\n pageSize={internalPageSize}\n total={filteredCount}\n pageSizeOptions={paginationPageSizeOptions}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n ) : null}\n </div>\n )\n }\n\n const args: HubTableRendererArgs<TRow> = {\n state: tableState,\n toolbar,\n toolbarShell,\n drawerToolbarProps,\n displayOptions,\n patchDisplay,\n }\n\n // Dev-time warning when a `supportedViewType` has no renderer AND no centralized\n // default is available. `data-table` always falls back to the built-in\n // `defaultTableRenderer`; `list-with-toolbar` and `board-with-toolbar` fall back\n // to the synthesised defaults below when the hub passes `renderListRow` /\n // `renderBoardCard` (the happy path for most hubs). The warning only fires for\n // exotic surfaces that genuinely need an explicit renderer entry.\n if (process.env.NODE_ENV !== \"production\") {\n for (const v of supportedViewTypes) {\n const kind = getDataListViewRenderKind(v)\n if (kind === \"data-table\") continue\n if (renderers[kind] != null) continue\n if (kind === \"list-with-toolbar\" && renderListRow != null) continue\n if (kind === \"board-with-toolbar\" && renderBoardCard != null && boardGroups != null) continue\n console.warn(\n `[Exxat DS][HubTable: ${hubLabel}] Missing renderer for supported view \"${v}\" (${kind}). ` +\n \"Add a renderer entry, or remove the view from supportedViewTypes.\",\n )\n }\n }\n\n // Compose `ListPageConnectedViewBody` renderers: the built-in `data-table` (or hub override)\n // plus each hub-provided non-table renderer. Wrapping in `() => …` defers execution until\n // the active view actually selects that kind — so heavy bodies (dashboard charts) don't\n // pay render cost on a table tab.\n const composed: ListPageConnectedViewRenderers = {\n \"data-table\": () => (tableRenderer ?? defaultTableRenderer)(args),\n }\n\n // Default centralized list renderer: same DataRowList shell every hub used to roll\n // by hand. Hub provides only the per-row body via `renderListRow`. When `pagination`\n // is on (and `paginationOverride` is not externally supplied), the list view reads\n // `state.pagedRows` and adds the same `CountSyncer` + `PaginationBar` chrome as the\n // table view.\n if (renderers[\"list-with-toolbar\"] == null && renderListRow != null) {\n composed[\"list-with-toolbar\"] = () => {\n const fullRows = args.state.rows as TRow[]\n const pagedRows = chromeOwnedPagination ? (args.state.pagedRows as TRow[]) : fullRows\n const filteredCount = fullRows.length\n const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)))\n const safePage = Math.min(internalPage, totalPages)\n return args.toolbarShell(\n <>\n {chromeOwnedPagination ? (\n <CountSyncer\n count={filteredCount}\n onSync={(n) => {\n const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)))\n if (safePage > next) setInternalPage(next)\n }}\n onReset={resetPage}\n />\n ) : null}\n <DataRowList<TRow>\n rows={pagedRows}\n getRowId={row => getRowId(row)}\n ariaLabel={listAriaLabel ?? hubLabel}\n emptyState={listEmptyState ?? \"No records match your filters.\"}\n {...(listVirtualizeThreshold !== undefined ? { virtualizeThreshold: listVirtualizeThreshold } : {})}\n {...(listEstimatedRowHeight !== undefined ? { estimatedRowHeight: listEstimatedRowHeight } : {})}\n renderRow={renderListRow}\n />\n {chromeOwnedPagination ? (\n <div\n className={cn(\n \"mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\",\n // Match the table-view footer — above pinned cells (z-20) and column\n // headers (z-30 / z-40) so the sticky chrome paints over scrolling rows.\n \"sticky bottom-0 z-40\",\n )}\n >\n <PaginationBar\n page={safePage}\n pageSize={internalPageSize}\n total={filteredCount}\n pageSizeOptions={paginationPageSizeOptions}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n ) : null}\n </>,\n )\n }\n }\n\n // Default centralized board renderer: same ListPageBoardTemplate every hub used to wrap.\n // Hub provides only the per-card body via `renderBoardCard` and the column predicate set.\n if (renderers[\"board-with-toolbar\"] == null && renderBoardCard != null && boardGroups != null) {\n composed[\"board-with-toolbar\"] = () =>\n args.toolbarShell(\n <ListPageBoardTemplate<TRow>\n columns={boardGroups}\n rows={args.state.rows as TRow[]}\n getRowKey={getRowId}\n renderCard={renderBoardCard}\n columnCountBadgeClassName={boardColumnCountBadgeClassName ?? {}}\n emptyColumnLabel={boardEmptyColumnLabel ?? \"No items\"}\n />,\n )\n }\n\n for (const kind of Object.keys(renderers) as DataListViewRenderKind[]) {\n const r = renderers[kind]\n if (r) composed[kind] = () => r(args)\n }\n\n return <ListPageConnectedViewBody view={view} hubLabel={hubLabel} renderers={composed} />\n}\n\nHubTable.displayName = \"HubTable\"\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/raf-throttle.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/kbd.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/hooks/use-mod-key-label.ts","../../../src/lib/editable-target.ts","../../../src/components/ui/label.tsx","../../../src/components/ui/checkbox.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.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","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/data-list-display-options.ts","../../../src/lib/row-height.ts","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/ui/select.tsx","../../../src/components/ui/toggle-switch.tsx","../../../src/components/table-properties/filter-card.tsx","../../../src/components/ui/drag-handle-grip.tsx","../../../src/components/table-properties/sort-card.tsx","../../../src/components/table-properties/column-row.tsx","../../../src/components/table-properties/draggable-list.ts","../../../src/components/table-properties/drawer.tsx","../../../src/components/table-properties/drawer-button.tsx","../../../src/components/data-views/list-page-connected-view-body.tsx","../../../src/components/data-views/data-row-list.tsx","../../../src/components/ui/badge.tsx","../../../src/components/data-views/board-card-primitives.tsx","../../../src/components/data-views/list-page-board-template.tsx","../../../src/components/data-views/hub-table.tsx"],"names":["React","React2","Input","jsx","TooltipPrimitive","jsxs","React3","React4","Label","LabelPrimitive","cva","React5","Checkbox","CheckboxPrimitive","DropdownMenuPrimitive","PopoverPrimitive","hit","className","props","React7","React8","React9","MaskedInput","hay","React11","SortChevron","Fragment","el","React12","React13","RadioGroupPrimitive","RadioGroupItem","SheetPrimitive","SelectPrimitive","React14","React15","React16","React17","React18","Slot","React19","React20","args"],"mappings":"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","file":"hub-table.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 * 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\"\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","\"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\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n","\"use client\"\n\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","/**\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 { 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","/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n * @see `.cursor/rules/exxat-hub-supported-views.mdc` — default hubs use **`FULL_HUB_SUPPORTED_VIEWS`** (seven views)\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\n/**\n * Default view allowlist for **primary list hubs** (Placements / Team / Students-style pages).\n * Pair with `ListPageTemplate` + `HubTable` when the hub implements table, list, board,\n * and dashboard renderers. Omit `supportedViewTypes` on both components to use this default.\n */\nexport const PRIMARY_HUB_SUPPORTED_VIEWS = [\n \"table\",\n \"list\",\n \"board\",\n \"dashboard\",\n] as const satisfies readonly DataListViewType[]\n\n/**\n * Default allowlist for **list-page hubs** in this design system (Library / Column types /\n * Tokens, etc.). Matches the All questions hub: table, list, board, dashboard, folder,\n * panel, and tree-panel. Pair with renderers for each kind on `HubTable` + `ListPageTemplate`.\n */\nexport const FULL_HUB_SUPPORTED_VIEWS = [\n \"table\",\n \"list\",\n \"board\",\n \"dashboard\",\n \"folder\",\n \"panel\",\n \"tree-panel\",\n] as const satisfies readonly DataListViewType[]\n\n/** Every registered view type (includes folder, panel, calendar, tree-panel). */\nexport const ALL_DATA_LIST_VIEW_TYPES = DATA_LIST_VIEW_REGISTRY.map(d => d.value)\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n","/**\n * Display options for Data list (table / board / etc.) — shared across view types\n * so hide/show preferences persist when switching views.\n */\n\nexport type BoardLineCount = 1 | 2 | 3\n\nexport interface DataListDisplayOptions {\n /**\n * Board swimlanes: dataset field (table column key) used to split cards into columns.\n * Each hub passes allowed keys via `TablePropertiesDrawer` `boardGroupByColumnOptions`.\n */\n boardGroupByColumnKey: string\n /** Max lines for primary text blocks on board cards */\n boardLineCount: BoardLineCount\n /** Page title block (Placements + subtitle) */\n showViewTitle: boolean\n /** Board: phase column titles + descriptions. Table: column header row. */\n showColumnLabels: boolean\n /** Board: “N cards” under each phase column */\n showBoardColumnCounts: boolean\n boardNewCardAbove: boolean\n /** Toolbar search control (table view) */\n showToolbarSearch: boolean\n}\n\nexport const DEFAULT_DATA_LIST_DISPLAY_OPTIONS: DataListDisplayOptions = {\n boardGroupByColumnKey: \"topic\",\n boardLineCount: 2,\n showViewTitle: true,\n showColumnLabels: true,\n showBoardColumnCounts: true,\n boardNewCardAbove: true,\n showToolbarSearch: true,\n}\n","/**\n * Table row density — shared by Properties drawer tiles and useTableState.\n *\n * Three steps modelled after Linear / Notion / Airtable density toggles.\n * `default` is the design-system baseline (`h-9` rows, `text-sm`); the\n * other two scale the row height + vertical padding without changing the\n * font size, so dense tables stay legible.\n */\nexport type RowHeight = \"compact\" | \"default\" | \"comfortable\"\n\nexport const ROW_HEIGHT_TILES: readonly {\n value: RowHeight\n label: string\n icon: string\n}[] = [\n { value: \"compact\", label: \"Compact\", icon: \"fa-down-to-line\" },\n { value: \"default\", label: \"Default\", icon: \"fa-arrows-up-down\" },\n { value: \"comfortable\", label: \"Comfortable\", icon: \"fa-up-to-line\" },\n]\n","\"use client\"\n\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full 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:data-[state=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 ].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 ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]: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 ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]: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 ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n 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\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-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 { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-overlay duration-300 ease-out supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n showOverlay = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n showOverlay?: boolean\n}) {\n return (\n <SheetPortal>\n {showOverlay && <SheetOverlay />}\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg outline-none duration-300 ease-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:start-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-e data-[side=right]:inset-y-0 data-[side=right]:end-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-s data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-6 data-[side=left]:data-open:slide-in-from-start-6 data-[side=right]:data-open:slide-in-from-end-6 data-[side=top]:data-open:slide-in-from-top-6 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-6 data-[side=left]:data-closed:slide-out-to-start-6 data-[side=right]:data-closed:slide-out-to-end-6 data-[side=top]:data-closed:slide-out-to-top-6\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 end-3\"\n size=\"icon-sm\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pe-2 ps-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/15 dark:hover:bg-input/50 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 className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <i className=\"fa-light fa-chevron-down pointer-events-none size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none 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\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full 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 not-data-[variant=destructive]:focus:**:text-accent-foreground 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([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute end-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check pointer-events-none\" aria-hidden=\"true\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-up\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-down\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface ToggleSwitchProps {\n checked: boolean\n onChange: (value: boolean) => void\n id?: string\n}\n\nexport function ToggleSwitch({ checked, onChange, id }: ToggleSwitchProps) {\n return (\n <button\n id={id}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onChange(!checked)}\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-input transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n checked ? \"bg-primary\" : \"bg-input\"\n )}\n >\n <span className={cn(\n \"pointer-events-none inline-block size-4 rounded-full bg-primary-foreground shadow-sm transition-transform\",\n checked ? \"translate-x-4\" : \"translate-x-0\"\n )} />\n </button>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Tip } from \"../ui/tip\"\nimport { FilterDateCalendar } from \"../data-table/filter-date-calendar\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport {\n type ActiveFilter,\n type ConditionalRule,\n type FilterFieldDef,\n type FilterOperator,\n OPERATOR_LABELS,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\ntype DrawerFilterCardBaseProps = {\n fieldDef: FilterFieldDef\n expanded: boolean\n onToggleExpand: () => void\n onRemove: (id: string) => void\n renderOptionLabel?: (value: string) => React.ReactNode\n}\n\nexport type DrawerFilterCardProps =\n | (DrawerFilterCardBaseProps & {\n variant?: \"filter\"\n filter: ActiveFilter\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n })\n | (DrawerFilterCardBaseProps & {\n variant: \"conditional\"\n filter: ConditionalRule\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n })\n\n/** Inline filter card used inside the Table Properties drawer (filter or conditional rule). */\nexport function DrawerFilterCard(props: DrawerFilterCardProps) {\n const {\n fieldDef,\n expanded,\n onToggleExpand,\n onRemove,\n renderOptionLabel,\n } = props\n\n const isCond = props.variant === \"conditional\"\n const filter = props.filter\n const filterId = filter.id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const onUpdate = props.onUpdate as (id: string, patch: any) => void\n\n const [optSearch, setOptSearch] = React.useState(\"\")\n const options = fieldDef.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 values = filter.values\n\n React.useEffect(() => {\n if (fieldDef.type !== \"select\" && fieldDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filterId, { operator: \"is\" })\n }\n }, [filter.operator, filter.id, fieldDef.type, filterId, onUpdate])\n\n function toggleValue(val: string) {\n const next = values.includes(val) ? values.filter(v => v !== val) : [...values, val]\n onUpdate(filterId, { values: next })\n }\n\n function cycleOperator() {\n const ops = fieldDef.operators\n const idx = ops.indexOf(filter.operator as FilterOperator)\n const i = idx === -1 ? 0 : idx\n onUpdate(filterId, { operator: ops[(i + 1) % ops.length] })\n }\n\n const removeLabel = isCond ? \"rule\" : \"filter\"\n const rule = isCond ? (props.filter as ConditionalRule) : null\n\n return (\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <div>\n {/* Card header */}\n <div\n className=\"flex items-start justify-between px-3 pt-2.5 pb-2 gap-2 cursor-pointer\"\n role=\"button\"\n tabIndex={0}\n aria-label={expanded ? `Collapse ${fieldDef.label}` : `Expand ${fieldDef.label}`}\n onClick={onToggleExpand}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n onToggleExpand()\n }\n }}\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{fieldDef.label}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n aria-label={`Operator: ${OPERATOR_LABELS[filter.operator as FilterOperator]} — click to cycle`}\n onClick={e => {\n e.stopPropagation()\n cycleOperator()\n }}\n className=\"h-auto py-0 px-1 -ms-1 text-xs text-muted-foreground font-normal\"\n >\n {OPERATOR_LABELS[filter.operator as FilterOperator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 self-start\">\n <Tip label={`Remove ${fieldDef.label} ${removeLabel}`} side=\"top\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Remove ${fieldDef.label} ${removeLabel}`}\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={e => {\n e.stopPropagation()\n onRemove(filterId)\n }}\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <i\n className={`fa-light ${expanded ? \"fa-chevron-up\" : \"fa-chevron-down\"} text-xs text-muted-foreground mt-2`}\n aria-hidden=\"true\"\n />\n </div>\n </div>\n\n {/* Expanded body */}\n {expanded && (\n <div className=\"border-t border-border\">\n {fieldDef.type === \"select\" ? (\n <>\n {showSearch && (\n <div className=\"px-3 pt-2 pb-1\">\n <Input placeholder=\"Search…\" value={optSearch} onChange={e => setOptSearch(e.target.value)} className=\"h-7 text-xs\" />\n </div>\n )}\n <div role=\"listbox\" aria-multiselectable=\"true\" aria-label={`${fieldDef.label} options`} className=\"py-1 max-h-52 overflow-y-auto\">\n {filteredOpts.map(opt => {\n const checked = 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 items-center gap-2.5 px-3 py-2 text-sm hover:bg-interactive-hover cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span aria-hidden=\"true\" data-slot=\"checkbox\" data-state={checked ? \"checked\" : \"unchecked\"} className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[3px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}>\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"7px\" }} />}\n </span>\n {renderOptionLabel\n ? renderOptionLabel(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 ) : fieldDef.type === \"date\" ? (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${fieldDef.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filterId, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n ) : fieldDef.type === \"text\" ? (\n <div className=\"p-3\">\n <FilterTextValueInput\n mask={fieldDef.textMask}\n aria-label={`${fieldDef.label} value`}\n placeholder={`Enter ${fieldDef.label.toLowerCase()}…`}\n value={values[0] ?? \"\"}\n onValueChange={next => onUpdate(filterId, { values: [next] })}\n className=\"text-sm\"\n autoFocus\n />\n </div>\n ) : null}\n {values.length > 0 ? (\n <div className=\"sticky bottom-0 border-t border-border bg-card p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filterId, { 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 </div>\n )}\n\n {/* Highlight color — conditional rules only */}\n {isCond && rule && (\n <div className=\"border-t border-border px-3 py-2.5\">\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">\n Highlight color\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {RULE_COLORS.map(c => (\n <Button\n key={c.name}\n type=\"button\"\n size=\"icon-xs\"\n variant=\"outline\"\n aria-label={c.name}\n className={cn(\n \"rounded-md border-2 p-0 transition-all\",\n rule.bgColor === c.bg ? \"border-foreground scale-110\" : \"border-transparent hover:scale-105\",\n )}\n style={{ background: c.bg }}\n onClick={() => onUpdate(filterId, { bgColor: c.bg })}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { cn } from \"../../lib/utils\"\n\n/**\n * Solid grip icon for drag handles — use anywhere rows/cards reorder (dashboard, Properties, etc.).\n */\nexport function DragHandleGripIcon({ className }: { className?: string }) {\n return (\n <i className={cn(\"fa-solid fa-grip-dots-vertical shrink-0\", className)} aria-hidden=\"true\" />\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { type SortRule } from \"../../lib/table-properties-types\"\n\n/** Sort rule card inside the Sort drawer panel */\nexport type DrawerSortCardProps = {\n rule: SortRule\n /**\n * Resolved column label for the sort rule's `fieldKey`. Required — every\n * consumer derives labels from its column defs (the drawer passes\n * `resolveColumnLabel(rule.fieldKey)`), so the card never falls back to a\n * product-specific column list.\n */\n fieldLabel: string\n isPrimary: boolean\n onRemove: () => void\n onToggleDir: () => void\n}\n\nexport function DrawerSortCard(props: DrawerSortCardProps) {\n const { rule, fieldLabel, isPrimary, onRemove, onToggleDir } = props\n const label = fieldLabel || rule.fieldKey\n if (!label) return null\n return (\n <div className=\"rounded-lg border border-border bg-background overflow-hidden\">\n <div className=\"flex items-center gap-2 px-3 py-2.5\">\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {isPrimary && (\n <span className=\"text-xs font-bold text-accent-foreground bg-accent rounded px-1 py-0.5 leading-none uppercase tracking-wide shrink-0\">\n Primary\n </span>\n )}\n <p className=\"text-sm font-medium text-foreground truncate\">{label}</p>\n </div>\n <button\n type=\"button\"\n aria-label={`Direction: ${rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"} — click to toggle`}\n onClick={onToggleDir}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors mt-0.5\"\n >\n <i className={`fa-light ${rule.direction === \"asc\" ? \"fa-arrow-up-a-z\" : \"fa-arrow-down-a-z\"} text-xs`} aria-hidden=\"true\" />\n {rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <Tip label={`Remove ${label} sort`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Remove ${label} sort`}\n onClick={onRemove}\n className=\"inline-flex items-center justify-center size-7 rounded text-muted-foreground hover:text-destructive hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </div>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\n\nexport interface ColumnRowProps {\n label: string\n isFirst: boolean\n isLast: boolean\n visible: boolean\n onToggleVisible: () => void\n onMoveUp: () => void\n onMoveDown: () => void\n // drag-and-drop props spread from useDraggableList\n draggable: true\n onDragStart: React.DragEventHandler\n onDragOver: React.DragEventHandler\n onDrop: React.DragEventHandler\n onDragEnd: React.DragEventHandler\n isDragging: boolean\n isOver: boolean\n}\n\nexport function ColumnRow({\n label,\n isFirst,\n isLast,\n visible,\n onToggleVisible,\n onMoveUp,\n onMoveDown,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n isDragging,\n isOver,\n}: ColumnRowProps) {\n return (\n <div\n role=\"listitem\"\n draggable={draggable}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n className={cn(\n \"flex items-center gap-2 px-2 py-2 rounded-lg group hover:bg-interactive-hover-subtle transition-colors cursor-grab active:cursor-grabbing\",\n isDragging && \"opacity-40\",\n isOver && \"ring-2 ring-ring bg-accent/30\",\n )}\n >\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40 transition-colors group-hover:text-muted-foreground\" />\n <span className=\"flex-1 text-sm text-foreground\">{label}</span>\n {/* Up / Down priority buttons */}\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Tip label={`Move ${label} up`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={isFirst}\n onClick={onMoveUp}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 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-up text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label={`Move ${label} down`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={isLast}\n onClick={onMoveDown}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 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-down text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n {/* Visibility toggle */}\n <ToggleSwitch\n checked={visible}\n onChange={onToggleVisible}\n />\n </div>\n )\n}\n","/**\n * useDraggableList — pointer-driven reorder hook used by drawer sort cards,\n * column rows, and conditional-rule lists. Generic over item shape via\n * `getId(item) => string | number`.\n */\nimport * as React from \"react\"\n\nexport interface DraggableListHandle {\n dragId: string | null\n overId: string | null\n getItemProps: (id: string) => {\n draggable: true\n onDragStart: (e: React.DragEvent) => void\n onDragOver: (e: React.DragEvent) => void\n onDrop: (e: React.DragEvent) => void\n onDragEnd: () => void\n \"data-dragging\": boolean\n \"data-over\": boolean\n }\n}\n\nexport function useDraggableList<T>(\n items: T[],\n getId: (item: T) => string,\n onReorder: (newItems: T[]) => void,\n): DraggableListHandle {\n const [dragId, setDragId] = React.useState<string | null>(null)\n const [overId, setOverId] = React.useState<string | null>(null)\n\n function getItemProps(id: string) {\n return {\n draggable: true as const,\n onDragStart: (e: React.DragEvent) => { e.dataTransfer.effectAllowed = \"move\"; setDragId(id) },\n onDragOver: (e: React.DragEvent) => { e.preventDefault(); e.dataTransfer.dropEffect = \"move\"; setOverId(id) },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault()\n if (!dragId || dragId === id) { setDragId(null); setOverId(null); return }\n const from = items.findIndex(i => getId(i) === dragId)\n const to = items.findIndex(i => getId(i) === id)\n if (from === -1 || to === -1) { setDragId(null); setOverId(null); return }\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n onReorder(next)\n setDragId(null); setOverId(null)\n },\n onDragEnd: () => { setDragId(null); setOverId(null) },\n \"data-dragging\": dragId === id,\n \"data-over\": overId === id && dragId !== id,\n }\n }\n\n return { dragId, overId, getItemProps }\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewLabel } from \"../../lib/data-list-view\"\nimport { dataListViewTilesForHub } from \"../../lib/data-list-view-registry\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport { ROW_HEIGHT_TILES } from \"../../lib/row-height\"\nimport { SelectionTileGrid } from \"../ui/selection-tile-grid\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"../ui/sheet\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\nimport { Tip } from \"../ui/tip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\nimport { Button } from \"../ui/button\"\nimport { DrawerFilterCard } from \"./filter-card\"\nimport { DrawerSortCard } from \"./sort-card\"\nimport { ColumnRow } from \"./column-row\"\nimport { useDraggableList } from \"./draggable-list\"\nimport {\n type ActiveFilter,\n type SortRule,\n type ConditionalRule,\n type FilterFieldDef,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\nexport interface TablePropertiesDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /**\n * Optional deep-link target. When set (and `open` is true), the drawer\n * focuses this panel instead of \"main\" — e.g. the column header's\n * **Add Conditional Rule** menu item passes `\"conditional-rules\"` to jump\n * straight to the conditional-formatting panel. Drawer resets to \"main\"\n * automatically when it closes.\n */\n initialPanel?: string | null\n // Display\n showGridlines: boolean\n onShowGridlinesChange: (v: boolean) => void\n rowHeight: RowHeight\n onRowHeightChange: (v: RowHeight) => void\n pagination: boolean\n onPaginationChange: (v: boolean) => void\n // Filters\n activeFilters: ActiveFilter[]\n onAddFilter: (fieldKey: string) => void\n onUpdateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n onRemoveFilter: (id: string) => void\n /** How the filter after `leftFilterId` combines with the one above (default \"and\"). */\n getFilterConnector: (leftFilterId: string) => \"and\" | \"or\"\n onToggleFilterConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n onFilterBarVisibleChange: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n onDrawerExpandedFiltersChange: React.Dispatch<React.SetStateAction<Set<string>>>\n totalRows: number\n filteredRows: number\n // Sort\n sortRules: SortRule[]\n onSortRulesChange: (rules: SortRule[]) => void\n onAddSortRule: (fieldKey: string) => void\n onRemoveSortRule: (id: string) => void\n onToggleSortDir: (id: string) => void\n // Columns\n colOrder: string[]\n onColOrderChange: (order: string[]) => void\n hiddenCols: Set<string>\n onToggleColVisibility: (key: string) => void\n onMoveCol: (key: string, dir: \"up\" | \"down\") => void\n // Group\n groupBy: string | null\n onGroupByChange: (key: string | null) => void\n // Sort key for display in main panel\n primarySortKey?: string\n // Conditional formatting\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Filter field defs for drawer + conditional rules. Required — every list-hub\n * consumer derives this from its column definitions (`columnsToFilterFields`)\n * and passes it through `drawerToolbarProps` from `HubTable`. There is no\n * product-specific default in the package.\n */\n filterFields: FilterFieldDef[]\n // View type\n currentView?: DataListViewType\n onViewChange?: (view: DataListViewType) => void\n /**\n * Subset of view types this hub actually implements; when set, the view-type tile grid is\n * filtered so users cannot switch to an unsupported view from Properties. Defaults to all\n * registered view types (`DATA_LIST_VIEW_TILES`).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Lifecycle context (e.g. tab filter) — shown in the drawer header */\n lifecycleTabLabel?: string\n /**\n * Column metadata for the Sort / Group / Columns panels. Required — every\n * list-hub consumer derives this from its column definitions\n * (`columnsToFieldDefinitions`) and passes it through `drawerToolbarProps`\n * from `HubTable`. The drawer never falls back to a default column list.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n /** Shared display options (table + board); persisted at page level. */\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * When the active view is Board and more than one entry is provided, shows a control to pick\n * which field defines swimlane columns (`displayOptions.boardGroupByColumnKey`).\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\ntype SheetPanel = \"main\" | \"table-display\" | \"filter\" | \"sort\" | \"group\" | \"columns\" | \"conditional-rules\"\n\n/** Properties sheet uses `z-[80]`; default portaled menus are `z-50` and sit underneath. */\nconst PROPERTIES_SHEET_PORTAL_Z = \"z-[90]\"\n\nexport function TablePropertiesDrawer({\n open,\n onOpenChange,\n initialPanel,\n showGridlines,\n onShowGridlinesChange,\n rowHeight,\n onRowHeightChange,\n pagination,\n onPaginationChange,\n activeFilters,\n onAddFilter,\n onUpdateFilter,\n onRemoveFilter,\n getFilterConnector,\n onToggleFilterConnector,\n filterBarVisible,\n onFilterBarVisibleChange,\n drawerExpandedFilters,\n onDrawerExpandedFiltersChange,\n totalRows,\n filteredRows,\n sortRules,\n onSortRulesChange,\n onAddSortRule,\n onRemoveSortRule,\n onToggleSortDir,\n colOrder,\n onColOrderChange,\n hiddenCols,\n onToggleColVisibility,\n onMoveCol,\n groupBy,\n onGroupByChange,\n primarySortKey,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n filterFields,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n fieldDefinitions,\n resolveColumnLabel: resolveColumnLabelProp,\n displayOptions,\n onDisplayOptionsChange,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerProps) {\n const [sheetPanel, setSheetPanel] = React.useState<SheetPanel>(\"main\")\n\n // Sync internal sheetPanel with the deep-link request from outside.\n // - Open with an initialPanel → jump to that panel.\n // - Open with no initialPanel → keep whatever the user navigated to last (or \"main\"\n // after a close → re-open cycle, since the next effect resets on close).\n // - initialPanel changes while open (e.g. user triggers a second deep-link\n // from the column menu while the drawer is already open) → switch panels.\n // - Close → reset to \"main\" so the next \"plain\" open lands on the index.\n React.useEffect(() => {\n if (open && initialPanel) {\n setSheetPanel(initialPanel as SheetPanel)\n } else if (!open) {\n setSheetPanel(\"main\")\n }\n }, [open, initialPanel])\n\n const resolveColumnLabel = React.useCallback(\n (key: string) =>\n resolveColumnLabelProp?.(key)\n ?? fieldDefinitions.find(f => f.key === key)?.label\n ?? key,\n [resolveColumnLabelProp, fieldDefinitions],\n )\n\n const sortFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(\n f => f.sortable !== false && f.key !== \"select\" && f.key !== \"actions\",\n ),\n [fieldDefinitions],\n )\n\n const groupFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(f => f.key !== \"select\" && f.key !== \"actions\"),\n [fieldDefinitions],\n )\n\n const viewSurface = currentView ?? \"table\"\n const isBoardView = viewSurface === \"board\"\n const boardGroupByLabel =\n boardGroupByColumnOptions?.find(o => o.key === displayOptions.boardGroupByColumnKey)?.label\n const viewDisplayLabel = dataListViewLabel(viewSurface)\n const viewDisplayDesc = (() => {\n if (viewSurface === \"board\") {\n return [\n boardGroupByLabel ? `By ${boardGroupByLabel}` : null,\n `${displayOptions.boardLineCount}-line`,\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n ]\n .filter(Boolean)\n .join(\" · \")\n }\n if (viewSurface === \"list\") {\n return [\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n displayOptions.showToolbarSearch ? \"Toolbar search\" : \"No search\",\n ].join(\" · \")\n }\n if (viewSurface === \"dashboard\") {\n return \"Charts · KPI metrics\"\n }\n return [showGridlines ? \"Gridlines\" : null, pagination ? \"Paginated\" : null].filter(Boolean).join(\" · \") || \"Default\"\n })()\n const viewDisplayIcon =\n DATA_LIST_VIEW_TILES.find(t => t.value === viewSurface)?.icon ?? \"fa-table\"\n\n // ── Sort drag-and-drop ────────────────────────────────────────────────────\n const sortDrag = useDraggableList(sortRules, r => r.id, onSortRulesChange)\n\n // ── Columns drag-and-drop ─────────────────────────────────────────────────\n const orderable = colOrder.filter(k => k !== \"select\" && k !== \"actions\")\n const colDrag = useDraggableList(\n orderable,\n k => k,\n newOrder => onColOrderChange([\"select\", ...newOrder, \"actions\"]),\n )\n\n // Current primary sort label for display in main panel\n const primarySortLabel = primarySortKey\n ? resolveColumnLabel(primarySortKey)\n : sortRules[0]?.fieldKey\n ? resolveColumnLabel(sortRules[0].fieldKey)\n : \"—\"\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange} modal={false}>\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n // w-[min(20rem,calc(100vw-1rem))]: cap to viewport width - 1rem at narrow/zoomed viewports\n // so the drawer never overflows horizontally. Use 100svh so height is correct on mobile.\n className=\"z-[80] w-[min(20rem,calc(100vw-1rem))] p-0 gap-0 flex flex-col border border-border shadow-xl rounded-xl overflow-hidden\"\n style={{ top: \"0.5rem\", bottom: \"0.5rem\", right: \"0.5rem\", height: \"calc(100svh - 1rem)\" }}\n >\n\n {sheetPanel === \"main\" ? (\n <>\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Properties</SheetTitle>\n {lifecycleTabLabel ? (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\" title={lifecycleTabLabel}>\n {lifecycleTabLabel}\n </p>\n ) : null}\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n {/* View type switcher — card tiles like export file format. When the hub passes\n `supportedViewTypes`, only its implemented views are offered so users cannot\n switch to a view the hub does not render (which would show the not-configured\n empty state). Default is all registered view types. */}\n {onViewChange && currentView && (\n <div className=\"px-4 pb-3\">\n <SelectionTileGrid<DataListViewType>\n sectionLabel=\"View type\"\n options={\n supportedViewTypes && supportedViewTypes.length > 0\n ? dataListViewTilesForHub(supportedViewTypes).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n : DATA_LIST_VIEW_TILES\n }\n columns={4}\n value={currentView}\n onValueChange={onViewChange}\n interaction=\"button\"\n idPrefix=\"props-view\"\n />\n </div>\n )}\n\n {/* Option list — inset rows + rounded hover (not edge-to-edge) */}\n <div className=\"flex-1 overflow-y-auto py-2 px-3 space-y-1\">\n {([\n {\n id: \"table-display\" as SheetPanel,\n icon: viewDisplayIcon,\n label: viewDisplayLabel,\n desc: viewDisplayDesc,\n },\n {\n id: \"filter\" as SheetPanel,\n icon: \"fa-filter\",\n label: \"Filter\",\n desc: activeFilters.length === 0\n ? `Showing all ${filteredRows} rows.`\n : `${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active · ${filteredRows} rows.`,\n },\n {\n id: \"sort\" as SheetPanel,\n icon: \"fa-arrow-up-arrow-down\",\n label: \"Sort\",\n desc: `Sorted by ${primarySortLabel}.`,\n },\n {\n id: \"group\" as SheetPanel,\n icon: \"fa-layer-group\",\n label: \"Group\",\n desc: groupBy\n ? `Grouped by ${resolveColumnLabel(groupBy)}.`\n : \"No grouping.\",\n },\n {\n id: \"columns\" as SheetPanel,\n icon: \"fa-table-columns\",\n label: \"Columns\",\n desc: hiddenCols.size === 0\n ? \"All columns visible.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden.`,\n },\n {\n id: \"conditional-rules\" as SheetPanel,\n icon: \"fa-palette\",\n label: \"Conditional rules\",\n desc: conditionalRules.length === 0\n ? \"No rules applied.\"\n : `${conditionalRules.length} rule${conditionalRules.length !== 1 ? \"s\" : \"\"} active.`,\n },\n ] as { id: SheetPanel; icon: string; label: string; desc: string }[]).map(item => (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setSheetPanel(item.id)}\n className={cn(\n \"w-full h-auto justify-start gap-3 px-3 py-3 rounded-2xl font-normal border border-transparent\",\n \"hover:bg-muted/60 hover:text-foreground\",\n \"focus-visible:bg-muted/60 focus-visible:text-foreground\",\n )}\n >\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className={`fa-light ${item.icon} text-[15px] text-secondary-foreground`} aria-hidden=\"true\" />\n </span>\n <span className=\"flex-1 min-w-0 text-start\">\n <span className=\"block text-sm font-medium text-foreground\">{item.label}</span>\n <span className=\"block text-xs text-muted-foreground mt-0.5\">{item.desc}</span>\n </span>\n <i className=\"fa-light fa-chevron-right text-xs text-muted-foreground shrink-0\" aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n </>\n ) : (\n <>\n {/* Sub-panel header — back + title stack as one cluster; close aligns to row center */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-4 pb-3\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Tip label=\"Back to Properties\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Back to Properties\"\n onClick={() => setSheetPanel(\"main\")}\n >\n <i className=\"fa-light fa-chevron-left text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold text-foreground leading-tight flex items-center gap-1.5\">\n {{\n \"table-display\": viewDisplayLabel,\n filter: \"Filter\",\n sort: \"Sort\",\n group: \"Group\",\n columns: \"Columns\",\n \"conditional-rules\": \"Conditional rules\",\n main: \"\",\n }[sheetPanel]}\n {sheetPanel === \"filter\" && (\n <i className=\"fa-light fa-circle-question text-xs text-muted-foreground\" aria-hidden=\"true\" />\n )}\n </SheetTitle>\n {sheetPanel === \"filter\" && (\n <p\n className=\"text-xs text-muted-foreground mt-0.5\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {activeFilters.length === 0\n ? `Showing all ${filteredRows} rows`\n : `${filteredRows} of ${totalRows} rows match · ${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active`}\n </p>\n )}\n </div>\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Close panel\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n\n {/* ── Table / Board display ── */}\n {sheetPanel === \"table-display\" && (\n <div className=\"p-4 space-y-5\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {dataListViewLabel(\"board\")} groups rows into columns. Sort, filter, and column settings apply to the same dataset as other views (e.g. Table view).\n </p>\n ) : null}\n\n {isBoardView && boardGroupByColumnOptions && boardGroupByColumnOptions.length > 1 ? (\n <div className=\"flex items-center justify-between gap-3 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Board columns</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Choose which field splits the board into swimlanes.</p>\n </div>\n </div>\n <Select\n value={\n boardGroupByColumnOptions.some(o => o.key === displayOptions.boardGroupByColumnKey)\n ? displayOptions.boardGroupByColumnKey\n : boardGroupByColumnOptions[0]!.key\n }\n onValueChange={v => onDisplayOptionsChange({ boardGroupByColumnKey: v })}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"w-[9.5rem] shrink-0\"\n id=\"board-group-by-field\"\n aria-label=\"Field for board columns\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n {boardGroupByColumnOptions.map(o => (\n <SelectItem key={o.key} value={o.key}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n\n {viewSurface === \"table\" ? (\n <>\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3\">Appearance</p>\n <div className=\"space-y-1\">\n {([\n { id: \"gridlines\", icon: \"fa-border-all\", label: \"Gridlines\", checked: showGridlines, onChange: onShowGridlinesChange },\n { id: \"pagination\", icon: \"fa-table-list\", label: \"Pagination\", checked: pagination, onChange: onPaginationChange },\n ] as { id: string; icon: string; label: string; checked: boolean; onChange: (v: boolean) => void }[]).map(row => (\n <div key={row.id} className=\"flex items-center justify-between py-2\">\n <div className=\"flex items-center gap-2.5 text-sm\">\n <i className={`fa-light ${row.icon} text-muted-foreground w-4 text-center`} aria-hidden=\"true\" />\n <label htmlFor={`toggle-${row.id}`} className=\"cursor-pointer select-none\">{row.label}</label>\n </div>\n <ToggleSwitch id={`toggle-${row.id}`} checked={row.checked} onChange={row.onChange} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"border-t border-border pt-4\">\n <SelectionTileGrid<RowHeight>\n sectionLabel=\"Row height\"\n options={ROW_HEIGHT_TILES}\n columns={3}\n value={rowHeight}\n onValueChange={onRowHeightChange}\n interaction=\"button\"\n idPrefix=\"row-height\"\n />\n </div>\n </>\n ) : null}\n\n <div\n className={cn(\n \"space-y-3\",\n (viewSurface === \"board\" || viewSurface === \"table\") && \"border-t border-border pt-4\",\n )}\n >\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">Display options</p>\n <div className=\"space-y-1\">\n {isBoardView && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-file-lines text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Line count</p>\n </div>\n </div>\n <Select\n value={String(displayOptions.boardLineCount)}\n onValueChange={v =>\n onDisplayOptionsChange({ boardLineCount: Number(v) as 1 | 2 | 3 })}\n >\n <SelectTrigger size=\"sm\" className=\"w-[6.5rem] shrink-0\" id=\"board-line-count\" aria-label=\"Line count\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <SelectItem value=\"1\">1 line</SelectItem>\n <SelectItem value=\"2\">2 lines</SelectItem>\n <SelectItem value=\"3\">3 lines</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n\n {viewSurface === \"table\" && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-font text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Table title</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show the page heading and subtitle.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-view-title\"\n checked={displayOptions.showViewTitle}\n onChange={v => onDisplayOptionsChange({ showViewTitle: v })}\n />\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column labels</p>\n {viewSurface === \"table\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the table.</p>\n ) : viewSurface === \"list\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the list.</p>\n ) : null}\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-column-labels\"\n checked={displayOptions.showColumnLabels}\n onChange={v => onDisplayOptionsChange({ showColumnLabels: v })}\n />\n </div>\n\n {isBoardView && (\n <>\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-hashtag text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column counts</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-board-counts\"\n checked={displayOptions.showBoardColumnCounts}\n onChange={v => onDisplayOptionsChange({ showBoardColumnCounts: v })}\n />\n </div>\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-square-plus text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Above new card button</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-new-card-above\"\n checked={displayOptions.boardNewCardAbove}\n onChange={v => onDisplayOptionsChange({ boardNewCardAbove: v })}\n />\n </div>\n </>\n )}\n\n {(viewSurface === \"table\" || viewSurface === \"list\") && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-magnifying-glass text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Search</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Toolbar search for this view.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-toolbar-search\"\n checked={displayOptions.showToolbarSearch}\n onChange={v => onDisplayOptionsChange({ showToolbarSearch: v })}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Filter ── */}\n {sheetPanel === \"filter\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {activeFilters.length === 0 ? (\n <div className=\"rounded-xl border border-border bg-muted/40 p-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center justify-center size-7 rounded-lg bg-background border border-border shrink-0\">\n <i className=\"fa-light fa-filter text-muted-foreground text-xs\" aria-hidden=\"true\" />\n </span>\n <p className=\"text-sm font-medium text-foreground\">No filters yet</p>\n </div>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Use filters to show only the rows you need. With multiple filters, use <span className=\"font-medium text-foreground/80\">and</span> or <span className=\"font-medium text-foreground/80\">or</span> between them to control how they combine.\n </p>\n <div className=\"space-y-1.5\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add filter\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to filter by\" },\n { icon: \"fa-circle-3\", text: \"Pick at least one value — the grid updates immediately\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <>\n {activeFilters.map((f, idx) => {\n const fieldDef = filterFields.find(fd => fd.key === f.fieldKey)\n if (!fieldDef) return null\n const leftId = idx > 0 ? activeFilters[idx - 1]!.id : null\n const connector = leftId ? getFilterConnector(leftId) : \"and\"\n return (\n <React.Fragment key={f.id}>\n {idx > 0 && leftId && (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n <Tip label=\"Click to switch: AND — every filter must match; OR — any matching filter is enough.\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onToggleFilterConnector(leftId)}\n className={cn(\n \"shrink-0 rounded-md border px-2.5 py-0.5 text-xs font-semibold uppercase tracking-wide transition-colors\",\n \"border-border bg-muted/40 text-muted-foreground hover:bg-interactive-hover hover:text-interactive-hover-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n aria-label={\n connector === \"and\"\n ? \"Filters are combined with AND. Click to use OR instead.\"\n : \"Filters are combined with OR. Click to use AND instead.\"\n }\n >\n {connector}\n </button>\n </Tip>\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n </div>\n )}\n <DrawerFilterCard\n filter={f}\n fieldDef={fieldDef}\n expanded={drawerExpandedFilters.has(f.id)}\n onToggleExpand={() => onDrawerExpandedFiltersChange(prev => {\n const next = new Set(prev)\n if (next.has(f.id)) next.delete(f.id)\n else next.add(f.id)\n return next\n })}\n onUpdate={onUpdateFilter}\n onRemove={id => {\n onRemoveFilter(id)\n onDrawerExpandedFiltersChange(prev => { const next = new Set(prev); next.delete(id); return next })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(f.fieldKey, value)}\n />\n </React.Fragment>\n )\n })}\n </>\n )}\n\n {/* Add filter + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem key={f.key} onSelect={() => onAddFilter(f.key)}>\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {activeFilters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => { activeFilters.forEach(f => onRemoveFilter(f.id)); onDrawerExpandedFiltersChange(new Set()) }}\n >\n Remove all\n </Button>\n )}\n </div>\n\n {/* Enable filter bar toggle */}\n <div className=\"flex items-start justify-between gap-3 pt-3 mt-1 border-t border-border\">\n <div>\n <label htmlFor=\"toggle-filter-bar\" className=\"text-sm font-medium text-foreground cursor-pointer\">Enable filter bar</label>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show filters above the table.</p>\n </div>\n <ToggleSwitch id=\"toggle-filter-bar\" checked={filterBarVisible} onChange={onFilterBarVisibleChange} />\n </div>\n </div>\n )}\n\n {/* ── Sort ── */}\n {sheetPanel === \"sort\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {sortRules.length === 0 ? (\n /* Empty state */\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-arrow-up-arrow-down text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No sorts applied</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Add a sort rule to order rows by any field. Multiple rules are applied in priority order.\n </p>\n <div className=\"space-y-1.5 text-start pt-1\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add sort\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to sort by\" },\n { icon: \"fa-circle-3\", text: \"Toggle ascending or descending\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n sortRules.map((rule, idx) => {\n const dragProps = sortDrag.getItemProps(rule.id)\n return (\n <React.Fragment key={rule.id}>\n {idx > 0 && (\n <div className=\"flex items-center gap-2 py-0.5\">\n <div className=\"flex-1 h-px bg-border\" />\n <span className=\"text-xs font-medium text-muted-foreground px-1\">then by</span>\n <div className=\"flex-1 h-px bg-border\" />\n </div>\n )}\n <div\n {...dragProps}\n className={cn(\n \"transition-all\",\n dragProps[\"data-dragging\"] && \"opacity-40\",\n dragProps[\"data-over\"] && \"ring-2 ring-ring bg-accent/30 rounded-lg\",\n )}\n >\n <DrawerSortCard\n rule={rule}\n fieldLabel={resolveColumnLabel(rule.fieldKey)}\n isPrimary={idx === 0}\n onRemove={() => onRemoveSortRule(rule.id)}\n onToggleDir={() => onToggleSortDir(rule.id)}\n />\n </div>\n </React.Fragment>\n )\n })\n )}\n\n {/* Add sort + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add sort\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Sort by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).map(col => (\n <DropdownMenuItem key={col.key} onSelect={() => onAddSortRule(col.key)}>\n <i className=\"fa-light fa-arrow-up-arrow-down text-xs\" aria-hidden=\"true\" />\n {col.label}\n </DropdownMenuItem>\n ))}\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).length === 0 && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">All fields added</p>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {sortRules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => onSortRulesChange([])}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* ── Group ── */}\n {sheetPanel === \"group\" && (\n <div className=\"p-4 space-y-2\">\n <p className=\"text-xs text-muted-foreground mb-3\">\n {groupBy ? `Grouped by ${resolveColumnLabel(groupBy)}.` : \"No grouping applied.\"}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(null)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n !groupBy ? \"bg-accent text-accent-foreground font-medium\" : \"text-muted-foreground\",\n )}\n >\n <i className=\"fa-light fa-ban text-xs\" aria-hidden=\"true\" />\n None\n </Button>\n {groupFieldList.map(col => (\n <Button\n key={col.key}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(groupBy === col.key ? null : col.key)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n groupBy === col.key ? \"bg-accent text-accent-foreground font-medium\" : \"\",\n )}\n >\n <i className=\"fa-light fa-layer-group text-xs text-muted-foreground\" aria-hidden=\"true\" />\n {col.label}\n {groupBy === col.key && <i className=\"fa-solid fa-check text-accent-foreground text-xs ms-auto\" aria-hidden=\"true\" />}\n </Button>\n ))}\n </div>\n )}\n\n {/* ── Columns ── */}\n {sheetPanel === \"columns\" && (\n <div className=\"px-4 py-4\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground mb-3\">\n Column visibility and order apply when you use Table view. They are saved with this tab.\n </p>\n ) : null}\n <p className=\"text-xs text-muted-foreground mb-3\">\n {hiddenCols.size === 0\n ? \"All columns visible. Drag to reorder.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden. Drag handle to reorder.`}\n </p>\n <div className=\"space-y-0.5\" role=\"list\" aria-label=\"Column order and visibility\">\n {orderable.map((key, idx, arr) => {\n const dragProps = colDrag.getItemProps(key)\n return (\n <ColumnRow\n key={key}\n label={resolveColumnLabel(key)}\n isFirst={idx === 0}\n isLast={idx === arr.length - 1}\n visible={!hiddenCols.has(key)}\n onToggleVisible={() => onToggleColVisibility(key)}\n onMoveUp={() => onMoveCol(key, \"up\")}\n onMoveDown={() => onMoveCol(key, \"down\")}\n draggable={dragProps.draggable}\n onDragStart={dragProps.onDragStart}\n onDragOver={dragProps.onDragOver}\n onDrop={dragProps.onDrop}\n onDragEnd={dragProps.onDragEnd}\n isDragging={dragProps[\"data-dragging\"]}\n isOver={dragProps[\"data-over\"]}\n />\n )\n })}\n </div>\n </div>\n )}\n\n {/* ── Conditional rules ── */}\n {sheetPanel === \"conditional-rules\" && (\n <ConditionalRulesPanel\n filterFields={filterFields}\n rules={conditionalRules}\n onAdd={onAddConditionalRule}\n onRemove={onRemoveConditionalRule}\n onUpdate={onUpdateConditionalRule}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n )}\n\n </div>\n </>\n )}\n\n </SheetContent>\n </Sheet>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ConditionalRulesPanel — same DrawerFilterCard as filters (incl. operator cycle);\n// highlight color lives inside the card. Adding a rule expands only that card (like\n// add filter from drawer). No And/Or connectors.\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction ConditionalRulesPanel({\n filterFields,\n rules,\n onAdd,\n onRemove,\n onUpdate,\n renderFilterOptionValue,\n}: {\n filterFields: FilterFieldDef[]\n rules: ConditionalRule[]\n onAdd: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemove: (id: string) => void\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}) {\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => new Set())\n\n const prevLenRef = React.useRef(rules.length)\n React.useEffect(() => {\n if (rules.length > prevLenRef.current && rules.length > 0) {\n const last = rules[rules.length - 1]\n setExpandedIds(new Set([last.id]))\n }\n prevLenRef.current = rules.length\n }, [rules])\n\n function toggleExpanded(id: string) {\n setExpandedIds(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 }\n\n return (\n <div className=\"px-4 py-4 space-y-2\">\n {rules.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-palette text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No rules yet</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Highlight cells with a background color based on their value.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {rules.map(rule => {\n const fd = filterFields.find(f => f.key === rule.fieldKey)\n if (!fd) return null\n return (\n <DrawerFilterCard\n key={rule.id}\n variant=\"conditional\"\n filter={rule}\n fieldDef={fd}\n expanded={expandedIds.has(rule.id)}\n onToggleExpand={() => toggleExpanded(rule.id)}\n onUpdate={onUpdate}\n onRemove={id => {\n onRemove(id)\n setExpandedIds(prev => {\n const next = new Set(prev)\n next.delete(id)\n return next\n })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(rule.fieldKey, value)}\n />\n )\n })}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add rule\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Rule for column</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem\n key={f.key}\n onSelect={() => onAdd({\n fieldKey: f.key,\n operator: f.operators[0],\n values: [],\n bgColor: RULE_COLORS[0].bg,\n })}\n >\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {rules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => {\n rules.forEach(r => onRemove(r.id))\n setExpandedIds(new Set())\n }}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * TablePropertiesDrawerButton — reusable Properties button + drawer combo.\n *\n * Centralises the \"sliders\" icon button and the full `TablePropertiesDrawer` that was\n * previously duplicated per hub (TeamDrawerToolbar, ComplianceDrawerToolbar, …).\n *\n * Pass any `useTableState<T>` return object as `state` — the component only reads\n * display-agnostic fields so it is compatible with any row shape.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { Button } from \"../ui/button\"\nimport { TablePropertiesDrawer } from \"./drawer\"\nimport type {\n ActiveFilter,\n ConditionalRule,\n FilterFieldDef,\n SortRule,\n} from \"../../lib/table-properties-types\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// State interface\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Structural interface over the fields consumed from `useTableState`.\n * Any `ReturnType<typeof useTableState<T>>` is assignable to this type because:\n * - All non-row fields have the same shape regardless of `T`.\n * - `rows: T[]` is assignable to `rows: { length: number }` (arrays expose `.length`).\n */\nexport interface TablePropertiesDrawerButtonState {\n sheetOpen: boolean\n setSheetOpen: (v: boolean) => void\n /**\n * Optional deep-link target consumed by `TablePropertiesDrawer`'s `initialPanel`.\n * Required only if the hub deep-links into a specific drawer panel (e.g. the\n * column header's **Add Conditional Rule** sets it to `\"conditional-rules\"`).\n * Default state is `null`, which makes the drawer open on its index panel.\n */\n sheetInitialPanel?: string | null\n setSheetInitialPanel?: (v: string | null) => void\n showGridlines: boolean\n setShowGridlines: (v: boolean) => void\n rowHeight: RowHeight\n setRowHeight: (v: RowHeight) => void\n activeFilters: ActiveFilter[]\n addFilter: (fieldKey: string, fromDrawer?: boolean) => void\n updateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n removeFilter: (id: string) => void\n getConnector: (leftFilterId: string) => \"and\" | \"or\"\n toggleConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n setFilterBarVisible: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n setDrawerExpandedFilters: React.Dispatch<React.SetStateAction<Set<string>>>\n /** Only `.length` is read — compatible with any `T[]`. */\n rows: { length: number }\n sortRules: SortRule[]\n setSortRules: (rules: SortRule[]) => void\n addSortRule: (fieldKey: string) => void\n removeSortRule: (id: string) => void\n toggleSortDir: (id: string) => void\n colOrder: string[]\n setColOrder: (order: string[]) => void\n hiddenCols: Set<string>\n toggleColVisibility: (key: string) => void\n moveCol: (key: string, dir: \"up\" | \"down\") => void\n groupBy: string | null\n setGroupBy: (key: string | null) => void\n sortKey?: string\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TablePropertiesDrawerButtonProps {\n /** Pass any `useTableState<T>` return value. */\n state: TablePropertiesDrawerButtonState\n totalRows: number\n filterFields: FilterFieldDef[]\n /**\n * Column definitions for the drawer's Sort / Group / Columns panels.\n * Required — derive from your column defs (`columnsToFieldDefinitions`) so\n * the drawer never falls back to product-specific defaults.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Whether pagination is enabled. Defaults to `false`.\n * Placements passes `true` because it supports server-side pagination.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** View type shown in the drawer header tile grid. */\n currentView?: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /**\n * Subset of view types this hub implements. When provided, the drawer's view-type tile grid is\n * filtered so users cannot select an unsupported view (e.g. List hub never offers Dashboard).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Shown below the \"Properties\" title in the drawer header (e.g. \"Team\", \"Compliance\"). */\n lifecycleTabLabel?: string\n /**\n * When the active view is Board and more than one entry is provided, the drawer renders\n * a selector for which field splits the board into swimlane columns.\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Extra controls rendered before the Properties button (e.g. a dashboard-edit button). */\n extraActions?: React.ReactNode\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function TablePropertiesDrawerButton({\n state,\n totalRows,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n pagination = false,\n onPaginationChange,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n extraActions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerButtonProps) {\n // Only destructure the read-only state slices we render directly.\n // Mutators (addFilter, setSortRules, toggleColVisibility, …) are\n // intentionally accessed via `stateRef.current.X` so the portaled Sheet\n // always sees the latest reducers without re-binding event handlers on\n // every render.\n const {\n sheetOpen, setSheetOpen,\n sheetInitialPanel,\n setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n activeFilters,\n filterBarVisible,\n drawerExpandedFilters,\n rows,\n sortRules,\n colOrder,\n hiddenCols,\n groupBy,\n sortKey,\n } = state\n\n // Sheet is portaled; keep latest handlers so sort/filter/conditional edits are not lost.\n // Writes to ref.current MUST happen after commit (not during render) — React 19 +\n // react-hooks v6 lints `Cannot access refs during render`. Use `useLayoutEffect` so\n // the ref points at the just-rendered values before any effects fire.\n const stateRef = React.useRef(state)\n const ruleHandlersRef = React.useRef({\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n })\n React.useLayoutEffect(() => {\n stateRef.current = state\n })\n React.useLayoutEffect(() => {\n ruleHandlersRef.current = {\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n }\n })\n\n // Stable callback that defers the ref read to invocation time. Used for\n // `onDrawerExpandedFiltersChange` which is read-by-reference (not invoked\n // through an inline arrow), so we wrap it explicitly to avoid reading\n // `stateRef.current` during render.\n const onDrawerExpandedFiltersChange = React.useCallback<\n React.Dispatch<React.SetStateAction<Set<string>>>\n >((next) => stateRef.current.setDrawerExpandedFilters(next), [])\n\n return (\n <>\n {extraActions}\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Properties\"\n onClick={() => {\n // The toolbar button always opens to the drawer's \"main\" index\n // panel — clear any pending deep-link target from a previous\n // column-menu interaction so this open lands on main.\n setSheetInitialPanel?.(null)\n setSheetOpen(true)\n }}\n className={cn(\n sheetOpen\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-sliders text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Properties</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TablePropertiesDrawer\n open={sheetOpen}\n onOpenChange={setSheetOpen}\n initialPanel={sheetInitialPanel}\n showGridlines={showGridlines}\n onShowGridlinesChange={setShowGridlines}\n rowHeight={rowHeight}\n onRowHeightChange={setRowHeight}\n pagination={pagination}\n onPaginationChange={v => ruleHandlersRef.current.onPaginationChange?.(v)}\n activeFilters={activeFilters}\n onAddFilter={fieldKey => stateRef.current.addFilter(fieldKey, true)}\n onUpdateFilter={(id, patch) => stateRef.current.updateFilter(id, patch)}\n onRemoveFilter={id => stateRef.current.removeFilter(id)}\n getFilterConnector={leftId => stateRef.current.getConnector(leftId)}\n onToggleFilterConnector={leftId => stateRef.current.toggleConnector(leftId)}\n filterBarVisible={filterBarVisible}\n onFilterBarVisibleChange={v => stateRef.current.setFilterBarVisible(v)}\n drawerExpandedFilters={drawerExpandedFilters}\n onDrawerExpandedFiltersChange={onDrawerExpandedFiltersChange}\n totalRows={totalRows}\n filteredRows={rows.length}\n sortRules={sortRules}\n onSortRulesChange={rules => stateRef.current.setSortRules(rules)}\n onAddSortRule={fieldKey => stateRef.current.addSortRule(fieldKey)}\n onRemoveSortRule={id => stateRef.current.removeSortRule(id)}\n onToggleSortDir={id => stateRef.current.toggleSortDir(id)}\n colOrder={colOrder}\n onColOrderChange={order => stateRef.current.setColOrder(order)}\n hiddenCols={hiddenCols}\n onToggleColVisibility={key => stateRef.current.toggleColVisibility(key)}\n onMoveCol={(key, dir) => stateRef.current.moveCol(key, dir)}\n groupBy={groupBy}\n onGroupByChange={key => stateRef.current.setGroupBy(key)}\n primarySortKey={sortKey}\n conditionalRules={conditionalRules}\n onAddConditionalRule={rule => ruleHandlersRef.current.onAddConditionalRule(rule)}\n onRemoveConditionalRule={id => ruleHandlersRef.current.onRemoveConditionalRule(id)}\n onUpdateConditionalRule={(id, patch) => ruleHandlersRef.current.onUpdateConditionalRule(id, patch)}\n filterFields={filterFields}\n lifecycleTabLabel={lifecycleTabLabel}\n fieldDefinitions={fieldDefinitions}\n resolveColumnLabel={resolveColumnLabel}\n displayOptions={displayOptions}\n onDisplayOptionsChange={patch => ruleHandlersRef.current.onDisplayOptionsChange(patch)}\n currentView={currentView}\n onViewChange={onViewChange}\n supportedViewTypes={supportedViewTypes}\n boardGroupByColumnOptions={boardGroupByColumnOptions}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n </>\n )\n}\n","\"use client\"\n\n/**\n * Switches list-hub view bodies by `DataListViewRenderKind`.\n * Hubs pass one renderer per kind they support; missing kinds show a clear empty state\n * (never silently fall through to dashboard).\n */\n\nimport * as React from \"react\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n dataListViewDefinition,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\n\nexport type ListPageConnectedViewRenderers = Partial<\n Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>\n>\n\nexport interface ListPageConnectedViewBodyProps {\n view: DataListViewType\n /** Human-readable hub name for the not-configured state. */\n hubLabel?: string\n renderers: ListPageConnectedViewRenderers\n}\n\nfunction resolveRenderer(node: React.ReactNode | (() => React.ReactNode) | undefined) {\n if (node == null) return null\n return typeof node === \"function\" ? node() : node\n}\n\nexport function ListPageViewNotConfigured({\n view,\n hubLabel = \"This hub\",\n}: {\n view: DataListViewType\n hubLabel?: string\n}) {\n const label = dataListViewLabel(view)\n return (\n <div\n className=\"flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground\"\n role=\"status\"\n >\n {hubLabel} does not implement {label}. Add a renderer for{\" \"}\n <span className=\"font-medium text-foreground\">{dataListViewDefinition(view).renderKind}</span>{\" \"}\n in this hub&apos;s table component, or remove the view from{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 text-xs\">supportedViewTypes</code>.\n </div>\n )\n}\n\nexport function ListPageConnectedViewBody({\n view,\n hubLabel,\n renderers,\n}: ListPageConnectedViewBodyProps) {\n const kind = getDataListViewRenderKind(view)\n const body = resolveRenderer(renderers[kind])\n if (body == null) {\n return <ListPageViewNotConfigured view={view} hubLabel={hubLabel} />\n }\n return <>{body}</>\n}\n","\"use client\"\n\n/**\n * DataRowList — generic vertical-stack list view used by every hub's \"list\"\n * tab (placements, team, compliance, sites, library, …). Replaces the\n * hand-rolled `<ul …flex-col gap-2 px-4 pb-8 pt-2 lg:px-6> {rows.map(<li>…)}`\n * shell that was duplicated across `*-list-view.tsx` files.\n *\n * Composition over inheritance: callers provide a `renderRow(row)` that\n * returns whatever ListPageBoardCard / link / chip-stack they need — this\n * component owns the chrome (spacing, empty state, virtualization), not the\n * row body.\n *\n * Auto-virtualises with `@tanstack/react-virtual` when the row count meets\n * `virtualizeThreshold` (default 100). Disable by passing `0`.\n */\n\nimport * as React from \"react\"\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\"\nimport { cn } from \"../../lib/utils\"\n\nconst DEFAULT_VIRTUALIZE_THRESHOLD = 100\nconst DEFAULT_ESTIMATED_ROW_HEIGHT = 96\nconst DEFAULT_OVERSCAN = 8\n\nexport interface DataRowListProps<TRow> {\n /** The filtered/sorted rows from `tableState.rows` (or wherever). */\n rows: readonly TRow[]\n /** Stable id used as the React `key` and (for virtualizer) the v-key. */\n getRowId: (row: TRow, index: number) => string | number\n /** Render the body of one row. Wrap with `<ListPageBoardCard layout=\"row\">` etc. */\n renderRow: (row: TRow, index: number) => React.ReactNode\n /**\n * Shown when `rows.length === 0`. Strings render as muted body copy; pass\n * a `ReactNode` for richer empty states (illustration, CTA, etc.).\n */\n emptyState?: React.ReactNode\n /**\n * Auto-virtualise when `rows.length >= virtualizeThreshold`. Default 100.\n * Pass `0` to never virtualise (preserves predictable layout for short\n * lists like dashboards / pinned tabs).\n */\n virtualizeThreshold?: number\n /** Hint for the virtualizer; clamps to measured size after first paint. */\n estimatedRowHeight?: number\n /** Override the default container padding / gap if needed. */\n className?: string\n /** Override the per-row `<li>` className (e.g. tighter spacing). */\n rowClassName?: string\n /** `aria-label` for the `<ul>` (screen-reader name for the list). */\n ariaLabel?: string\n}\n\nconst DEFAULT_OUTER_CLASS = \"flex list-none flex-col gap-2 px-4 pb-8 pt-2 lg:px-6\"\n\nexport function DataRowList<TRow>(props: DataRowListProps<TRow>) {\n const {\n rows,\n getRowId,\n renderRow,\n emptyState,\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\n estimatedRowHeight = DEFAULT_ESTIMATED_ROW_HEIGHT,\n className,\n rowClassName,\n ariaLabel,\n } = props\n\n if (rows.length === 0) {\n if (emptyState == null) return null\n if (typeof emptyState === \"string\") {\n return (\n <div className=\"px-4 py-16 text-center lg:px-6\">\n <p className=\"text-sm text-muted-foreground\">{emptyState}</p>\n </div>\n )\n }\n return <div className=\"px-4 py-16 text-center lg:px-6\">{emptyState}</div>\n }\n\n if (virtualizeThreshold > 0 && rows.length >= virtualizeThreshold) {\n return (\n <DataRowListVirtualized\n rows={rows}\n getRowId={getRowId}\n renderRow={renderRow}\n estimatedRowHeight={estimatedRowHeight}\n className={className}\n rowClassName={rowClassName}\n ariaLabel={ariaLabel}\n />\n )\n }\n\n return (\n <ul aria-label={ariaLabel} className={cn(DEFAULT_OUTER_CLASS, className)}>\n {rows.map((row, i) => (\n <li key={getRowId(row, i)} className={rowClassName}>\n {renderRow(row, i)}\n </li>\n ))}\n </ul>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Virtualised variant — keeps the DOM short on long lists (e.g. 1000+ rows).\n// Uses `useWindowVirtualizer` so the page scroll drives row recycling; this\n// is the right tool for hub-level lists (not nested-scroll containers).\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction DataRowListVirtualized<TRow>({\n rows,\n getRowId,\n renderRow,\n estimatedRowHeight,\n className,\n rowClassName,\n ariaLabel,\n}: {\n rows: readonly TRow[]\n getRowId: (row: TRow, index: number) => string | number\n renderRow: (row: TRow, index: number) => React.ReactNode\n estimatedRowHeight: number\n className?: string\n rowClassName?: string\n ariaLabel?: string\n}) {\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n // `scrollMargin` is read by the virtualizer during render, so it has to\n // be state (not a ref). We measure with `useLayoutEffect` after the first\n // paint and on resize so window-scroll math stays accurate when the page\n // layout shifts (sidebar collapse, banner, etc.).\n const [scrollMargin, setScrollMargin] = React.useState(0)\n\n const updateScrollMargin = React.useCallback(() => {\n const el = anchorRef.current\n if (!el) return\n setScrollMargin(el.getBoundingClientRect().top + window.scrollY)\n }, [])\n\n React.useLayoutEffect(() => {\n updateScrollMargin()\n window.addEventListener(\"resize\", updateScrollMargin)\n return () => window.removeEventListener(\"resize\", updateScrollMargin)\n }, [updateScrollMargin, rows.length])\n\n const virtualizer = useWindowVirtualizer({\n count: rows.length,\n estimateSize: () => estimatedRowHeight,\n overscan: DEFAULT_OVERSCAN,\n scrollMargin,\n getItemKey: i => String(getRowId(rows[i], i)),\n })\n\n const totalSize = virtualizer.getTotalSize()\n\n return (\n <div ref={anchorRef} className={cn(\"px-4 pb-8 pt-2 lg:px-6\", className)}>\n <ul\n aria-label={ariaLabel}\n className=\"relative m-0 w-full list-none p-0\"\n style={{ height: `${totalSize}px` }}\n >\n {virtualizer.getVirtualItems().map(vr => {\n const row = rows[vr.index]\n if (!row) return null\n return (\n <li\n key={vr.key}\n data-index={vr.index}\n ref={virtualizer.measureElement}\n className={cn(\"absolute start-0 top-0 w-full pb-2\", rowClassName)}\n style={{ transform: `translateY(${vr.start}px)` }}\n >\n {renderRow(row, vr.index)}\n </li>\n )\n })}\n </ul>\n </div>\n )\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 badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-1 text-xs font-medium leading-none whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-[var(--chip-destructive)] focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:text-red-100 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-interactive-hover [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-muted-foreground dark:hover:bg-interactive-hover-subtle\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\n/**\n * Reusable building blocks for kanban / board cards (icon rows, two-line blocks, placeholders).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { BoardLineCount } from \"../../lib/data-list-display-options\"\n\nexport function BoardCardIconRow({\n iconClass,\n children,\n}: {\n iconClass: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1 text-xs leading-snug [&_.text-sm]:text-xs [&_span]:text-xs [&_div]:text-xs\">\n {children}\n </div>\n </div>\n )\n}\n\nexport function BoardCardTwoLineBlock({\n iconClass,\n line1,\n line2,\n line2ClassName,\n}: {\n iconClass: string\n line1: React.ReactNode\n /** Omitted for a single-line row (same icon + primary alignment as Placements). */\n line2?: React.ReactNode\n /** Override default muted line-2 (e.g. badges / rich cells). */\n line2ClassName?: string\n}) {\n const showLine2 = line2 !== undefined && line2 !== null\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium text-foreground leading-tight\">{line1}</div>\n {showLine2 ? (\n <div\n className={cn(\n \"mt-0.5 min-w-0 leading-tight\",\n line2ClassName ?? \"truncate text-xs text-muted-foreground\",\n )}\n >\n {line2}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport function lineClampClass(n: BoardLineCount): string {\n const base = \"min-w-0 overflow-hidden break-words\"\n if (n === 1) return cn(base, \"line-clamp-1\")\n if (n === 2) return cn(base, \"line-clamp-2\")\n return cn(base, \"line-clamp-3\")\n}\n\nexport function BoardNewCardPlaceholder({ position }: { position: \"above\" | \"below\" }) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border bg-background/50 py-2 text-xs font-medium text-muted-foreground transition-colors\",\n \"hover:border-input hover:bg-muted/40 hover:text-foreground\",\n position === \"above\" ? \"mb-2\" : \"mt-2\",\n )}\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n New card\n </button>\n )\n}\n","\"use client\"\n\n/**\n * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).\n *\n * - Columns are defined with predicates; each row is placed in the **first** matching column.\n * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).\n * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.\n *\n * @see `docs/data-views-pattern.md` — board primitives\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { BoardNewCardPlaceholder } from \"./board-card-primitives\"\n\nexport type ListPageBoardColumnDef<T> = {\n id: string\n label: string\n /** Shown beside the title on larger breakpoints */\n description?: string\n /** First matching column wins; columns should be mutually exclusive for most domains. */\n filter: (row: T) => boolean\n}\n\nexport type ListPageBoardTemplateProps<T> = {\n columns: ListPageBoardColumnDef<T>[]\n rows: T[]\n getRowKey: (row: T) => string | number\n renderCard: (row: T) => React.ReactNode\n /** Tailwind classes for the count pill, keyed by column `id` */\n columnCountBadgeClassName?: Record<string, string>\n /** Copy when a column has no rows */\n emptyColumnLabel?: string\n}\n\nfunction ListPageBoardColumnHeader({\n label,\n description,\n count,\n badgeClassName,\n}: {\n label: string\n description?: string\n count: number\n badgeClassName?: string\n}) {\n return (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{label}</span>\n {description ? (\n <span className=\"hidden text-xs text-muted-foreground sm:inline\">{description}</span>\n ) : null}\n </div>\n <Badge\n variant=\"outline\"\n className={cn(\n \"inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground\",\n badgeClassName,\n )}\n aria-label={`${count} ${count === 1 ? \"item\" : \"items\"}`}\n >\n {count}\n </Badge>\n </div>\n )\n}\n\nexport function ListPageBoardTemplate<T>({\n columns,\n rows,\n getRowKey,\n renderCard,\n columnCountBadgeClassName = {},\n emptyColumnLabel = \"No items\",\n}: ListPageBoardTemplateProps<T>) {\n const grouped = React.useMemo(() => {\n const map: Record<string, T[]> = {}\n for (const col of columns) map[col.id] = []\n for (const row of rows) {\n for (const col of columns) {\n if (col.filter(row)) {\n map[col.id].push(row)\n break\n }\n }\n }\n return map\n }, [columns, rows])\n\n return (\n <div className=\"flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6\">\n {columns.map(col => (\n <div\n key={col.id}\n className=\"flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30\"\n >\n <ListPageBoardColumnHeader\n label={col.label}\n description={col.description}\n count={grouped[col.id]?.length ?? 0}\n badgeClassName={columnCountBadgeClassName[col.id]}\n />\n\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto p-2\">\n <BoardNewCardPlaceholder position=\"above\" />\n\n {(grouped[col.id]?.length ?? 0) === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">{emptyColumnLabel}</p>\n ) : (\n grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)\n )}\n\n <BoardNewCardPlaceholder position=\"below\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * `<HubTable<TRow>>` — single centralized table surface used by every list-page hub.\n *\n * Owns all the per-hub scaffolding that was previously duplicated in `placements-table.tsx`,\n * `team-table.tsx`, `compliance-table.tsx`, `library-table.tsx`, and `sites-table.tsx`:\n *\n * • `useTableState` setup tied to the centralized row dataset\n * • `displayOptions` state + `patchDisplay`\n * • `conditionalRules` state + add/remove/update handlers\n * • `filterFields` derived from column `filter` defs\n * • `fieldDefinitions` + `resolveColumnLabel` for the Properties drawer\n * • `TablePropertiesDrawerButton` wiring with `currentView` + `supportedViewTypes`\n * • `DataTable` for `view === \"table\"`; `ListPageConnectedViewBody` for every other view\n * • Imperative `openPropertiesDrawer()` exposed via `handleRef`\n *\n * Each hub now only declares **what's actually different**: its column defs and a typed\n * `renderers` map for the views it implements. The renderers receive `state`, `toolbar`,\n * `toolbarShell`, `drawerToolbarProps`, `displayOptions`, and `patchDisplay` so they can\n * either reuse the pre-composed toolbar (`toolbarShell(<MyView rows={state.rows} />)`) or\n * build their own (e.g. dashboard view with extra layout-edit actions).\n *\n * **Single dataset rule:** rows flow through `useTableState`; `tableState.rows` is the\n * filtered/sorted row bag every non-table renderer reads. There is **no** parallel mock\n * array per view. See `.cursor/rules/exxat-centralized-list-dataset.mdc`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { DataTable, DataTableToolbar } from \"../data-table\"\nimport { CountSyncer, PaginationBar } from \"../data-table/pagination\"\nimport type { ColumnDef } from \"../data-table/types\"\nimport { useTableState } from \"../data-table/use-table-state\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n getDataListViewRenderKind,\n FULL_HUB_SUPPORTED_VIEWS,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\nimport {\n DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n type DataListDisplayOptions,\n} from \"../../lib/data-list-display-options\"\nimport { TablePropertiesDrawerButton } from \"../table-properties\"\nimport type {\n ConditionalRule,\n FilterFieldDef,\n FilterOperator,\n} from \"../../lib/table-properties-types\"\nimport {\n ListPageConnectedViewBody,\n type ListPageConnectedViewRenderers,\n} from \"./list-page-connected-view-body\"\nimport { DataRowList } from \"./data-row-list\"\nimport {\n ListPageBoardTemplate,\n type ListPageBoardColumnDef,\n} from \"./list-page-board-template\"\nimport type { OpenTablePropertiesHandle } from \"../../lib/list-page-table-properties\"\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction columnToFilterFieldDef<TRow>(c: ColumnDef<TRow>): FilterFieldDef | null {\n if (!c.filter) return null\n const f = c.filter\n const defaultOps: FilterOperator[] =\n f.type === \"select\" || f.type === \"date\" ? [\"is\", \"is_not\"] : [\"contains\", \"not_contains\"]\n return {\n key: c.key,\n label: c.label,\n icon: f.icon ?? \"fa-filter\",\n type: f.type,\n operators: (f.operators ?? defaultOps) as FilterOperator[],\n options: f.options,\n ...(f.textMask ? { textMask: f.textMask } : {}),\n }\n}\n\n/** Derive `FilterFieldDef[]` from a hub's column defs — preferred to hand-writing both. */\nexport function columnsToFilterFields<TRow>(cols: ColumnDef<TRow>[]): FilterFieldDef[] {\n return cols\n .map(c => columnToFilterFieldDef<TRow>(c))\n .filter((x): x is FilterFieldDef => x !== null)\n}\n\n/** Field definitions for the drawer's Sort / Group / Columns panels — excludes utility columns. */\nexport function columnsToFieldDefinitions<TRow>(\n cols: ColumnDef<TRow>[],\n): { key: string; label: string; sortable: boolean }[] {\n return cols\n .filter(c => c.key !== \"select\" && c.key !== \"actions\")\n .map(c => ({\n key: c.key,\n label: c.label,\n sortable: !!(c.sortable && (c.sortKey ?? c.key)),\n }))\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Public types\n// ──────────────────────────────────────────────────────────────────────────────\n\n/** Subset of `TablePropertiesDrawerButton` props that `HubTable` owns. Exposed so renderers\n * that build a custom toolbar (e.g. dashboard with an extra Edit-layout button) can splat\n * this back into their own `<TablePropertiesDrawerButton {...drawerToolbarProps} state={s} extraActions={…} />`. */\nexport interface HubDrawerToolbarProps {\n totalRows: number\n filterFields: FilterFieldDef[]\n fieldDefinitions: { key: string; label: string; sortable: boolean }[]\n resolveColumnLabel: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n currentView: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n supportedViewTypes: readonly DataListViewType[]\n lifecycleTabLabel: string\n boardGroupByColumnOptions?: { key: string; label: string }[]\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n}\n\n/** Everything a non-table renderer needs. The pre-composed `toolbar` includes search +\n * filter chips + the Properties button; the renderer just wraps it around its body with\n * `toolbarShell`. For dashboards or other layouts that own their own toolbar, use\n * `drawerToolbarProps` to assemble a custom `<TablePropertiesDrawerButton>`. */\nexport interface HubTableRendererArgs<TRow extends Record<string, unknown>> {\n state: ReturnType<typeof useTableState<TRow>>\n toolbar: React.ReactNode\n toolbarShell: (body: React.ReactNode) => React.ReactNode\n drawerToolbarProps: HubDrawerToolbarProps\n displayOptions: DataListDisplayOptions\n patchDisplay: (patch: Partial<DataListDisplayOptions>) => void\n}\n\n/** Hubs provide one renderer per `DataListViewRenderKind` they implement. The `data-table`\n * kind is handled internally by `HubTable` (do not override unless you genuinely need a\n * different table surface). Missing kinds render `<ListPageViewNotConfigured>` — clear empty\n * state, never a silent dashboard fallback. */\nexport type HubTableRenderers<TRow extends Record<string, unknown>> = Partial<\n Record<DataListViewRenderKind, (args: HubTableRendererArgs<TRow>) => React.ReactNode>\n>\n\nexport type HubTableHandle = OpenTablePropertiesHandle\n\nexport interface HubTableProps<TRow extends Record<string, unknown>> {\n /** Full row dataset (already scoped/filtered by the hub client, e.g. by URL nav). */\n rows: TRow[]\n /** Column defs — `filter` blocks here become Properties drawer filter fields automatically. */\n columns: ColumnDef<TRow>[]\n /** Active view from the `ListPageTemplate` tab. */\n view: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /**\n * Allowlist passed to `TablePropertiesDrawerButton` so Properties cannot offer unsupported views.\n * Defaults to {@link FULL_HUB_SUPPORTED_VIEWS} when omitted — keep in sync with\n * `ListPageTemplate.supportedViewTypes` on the same hub.\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Used by `ListPageViewNotConfigured` when a supported view has no renderer. */\n hubLabel: string\n /** Shown below \"Properties\" in the drawer header. */\n lifecycleTabLabel: string\n /** Toolbar search input aria-label. */\n searchAriaLabel: string\n getRowId: (row: TRow) => string | number\n getRowSelectionLabel: (row: TRow) => string\n defaultSort: { key: string; dir: \"asc\" | \"desc\" }\n /** DataTable empty state. Defaults to a muted \"No records match your filters.\" */\n emptyState?: React.ReactNode\n /** Per-view renderers (everything other than `view === \"table\"`). */\n renderers: HubTableRenderers<TRow>\n /** Bulk-actions slot rendered when one or more rows are selected. */\n bulkActionsSlot?: (selected: Set<string | number>) => React.ReactNode\n /** Board-view group-by column options for the Properties drawer. */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Initial display options (toolbar search visibility, calendar panel, etc.). */\n displayOptionsInit?: DataListDisplayOptions\n /** Custom renderer for filter option values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** DataTable: enable \"Group by\" feature. Default `true`. */\n groupable?: boolean\n /** DataTable: enable row selection checkboxes. Default `true`. */\n selectable?: boolean\n /** DataTable: row click handler (e.g. navigate to detail route). */\n onRowClick?: (row: TRow) => void\n /**\n * Controlled `displayOptions` — when provided (with `onDisplayOptionsChange`), the hub client\n * owns persistence (e.g. Placements page persists across tab switches). Otherwise `HubTable`\n * owns internal state from `displayOptionsInit`.\n */\n displayOptions?: DataListDisplayOptions\n onDisplayOptionsChange?: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * Pagination toggle forwarded to `TablePropertiesDrawerButton` so the drawer can offer\n * \"Show pagination\" on the Display panel. The hub still implements its own pagination chrome\n * around the table body via `tableRenderer`. Defaults to `false` / no toggle.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** Imperative handle (`openPropertiesDrawer`) for hub clients that pass `tablePropertiesRef`. */\n handleRef?: React.Ref<HubTableHandle>\n /** Optional override for the `data-table` view. Default mounts `<DataTable {…}>`. */\n tableRenderer?: (args: HubTableRendererArgs<TRow>) => React.ReactNode\n /**\n * Forwarded to `useTableState` so the hub can switch on server-style pagination\n * with externally-controlled page/pageSize (advanced; most hubs should leave\n * this undefined and let `HubTable` own the internal page state — see\n * `pagination` + `paginationPageSizeOptions`).\n */\n paginationOverride?: { page: number; pageSize: number }\n /** Page size options shown in the toolbar `<PaginationBar>`. Default `[10, 25, 50, 100]`. */\n paginationPageSizeOptions?: number[]\n /** Initial page size when `HubTable` owns pagination internally. Default `10`. */\n paginationInitialPageSize?: number\n /**\n * Forwarded to `useTableState` to sync toolbar search from `?q=` (Library search routes).\n * Defining as `\"\"` enables sync without an initial query.\n */\n syncedSearchFromUrl?: string\n\n // ─── Centralized \"list\" and \"board\" defaults ───────────────────────────────\n // When a hub does NOT provide a renderer for `list-with-toolbar`, but DOES provide\n // `renderListRow`, `HubTable` synthesises a default that wires `DataRowList` through\n // the shared toolbar. Same for `board-with-toolbar` + `renderBoardCard`. This is the\n // happy path for most hubs; the explicit renderer escape hatch is only needed for\n // exotic surfaces (e.g. Placements board with per-phase column search).\n\n /** Default `list-with-toolbar` renderer body — `HubTable` wraps with toolbar + `DataRowList`. */\n renderListRow?: (row: TRow) => React.ReactNode\n /** Override the `aria-label` on the `<ul>` from `renderListRow`. Defaults to `hubLabel`. */\n listAriaLabel?: string\n /** Empty-state for the default list renderer. Defaults to \"No records match your filters.\" */\n listEmptyState?: React.ReactNode\n /** Virtualise after N rows in the default list renderer. Default 100; pass `0` to disable. */\n listVirtualizeThreshold?: number\n /** Estimated row height (px) for the default list virtualiser. Default 96. */\n listEstimatedRowHeight?: number\n\n /** Default `board-with-toolbar` renderer body — `HubTable` wraps with toolbar + `ListPageBoardTemplate`. */\n renderBoardCard?: (row: TRow) => React.ReactNode\n /** Required if `renderBoardCard` is set: how rows group into columns. */\n boardGroups?: ListPageBoardColumnDef<TRow>[]\n /** Per-column count badge tint classes for the default board renderer. */\n boardColumnCountBadgeClassName?: Record<string, string>\n /** Empty column copy for the default board renderer. Defaults to \"No items\". */\n boardEmptyColumnLabel?: string\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Component\n// ──────────────────────────────────────────────────────────────────────────────\n\nexport function HubTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n view,\n onViewChange,\n supportedViewTypes: supportedViewTypesProp,\n hubLabel,\n lifecycleTabLabel,\n searchAriaLabel,\n getRowId,\n getRowSelectionLabel,\n defaultSort,\n emptyState,\n renderers,\n bulkActionsSlot,\n boardGroupByColumnOptions,\n displayOptionsInit,\n renderFilterOptionValue,\n groupable = true,\n selectable = true,\n onRowClick,\n displayOptions: displayOptionsControlled,\n onDisplayOptionsChange: onDisplayOptionsChangeControlled,\n pagination,\n onPaginationChange,\n handleRef,\n tableRenderer,\n paginationOverride,\n paginationPageSizeOptions = [10, 25, 50, 100],\n paginationInitialPageSize = 10,\n syncedSearchFromUrl,\n renderListRow,\n listAriaLabel,\n listEmptyState,\n listVirtualizeThreshold,\n listEstimatedRowHeight,\n renderBoardCard,\n boardGroups,\n boardColumnCountBadgeClassName,\n boardEmptyColumnLabel,\n}: HubTableProps<TRow>) {\n const supportedViewTypes = supportedViewTypesProp ?? FULL_HUB_SUPPORTED_VIEWS\n const filterFields = React.useMemo(() => columnsToFilterFields(columns), [columns])\n const fieldDefinitions = React.useMemo(() => columnsToFieldDefinitions(columns), [columns])\n const resolveColumnLabel = React.useCallback(\n (key: string) => columns.find(c => c.key === key)?.label ?? key,\n [columns],\n )\n\n // displayOptions: controlled (parent owns state via prop pair) OR uncontrolled (HubTable owns it).\n // Most hubs keep display options ephemeral; Placements persists them across tabs at the page level.\n const [internalDisplayOptions, setInternalDisplayOptions] = React.useState<DataListDisplayOptions>(\n displayOptionsInit ?? DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n )\n const isControlled =\n displayOptionsControlled !== undefined && onDisplayOptionsChangeControlled !== undefined\n const displayOptions = isControlled ? displayOptionsControlled : internalDisplayOptions\n const patchDisplay = React.useCallback(\n (patch: Partial<DataListDisplayOptions>) => {\n if (isControlled) {\n onDisplayOptionsChangeControlled!(patch)\n } else {\n setInternalDisplayOptions(prev => ({ ...prev, ...patch }))\n }\n },\n [isControlled, onDisplayOptionsChangeControlled],\n )\n\n const [conditionalRules, setConditionalRules] = React.useState<ConditionalRule[]>([])\n const addConditionalRule = React.useCallback((rule: Omit<ConditionalRule, \"id\">) => {\n setConditionalRules(prev => [...prev, { ...rule, id: `cr-${Date.now()}` }])\n }, [])\n const removeConditionalRule = React.useCallback((id: string) => {\n setConditionalRules(prev => prev.filter(r => r.id !== id))\n }, [])\n const updateConditionalRule = React.useCallback(\n (id: string, patch: Partial<ConditionalRule>) => {\n setConditionalRules(prev => prev.map(r => (r.id === id ? { ...r, ...patch } : r)))\n },\n [],\n )\n\n // ─── Pagination chrome (centralized) ─────────────────────────────────────\n // When `pagination === true` and the parent did NOT supply `paginationOverride`,\n // `HubTable` owns the page/pageSize internally and wraps the default table +\n // list renderers with `<CountSyncer>` + `<PaginationBar>`. Hubs that need full\n // control (e.g. server-side pagination) keep using `paginationOverride`.\n const [internalPage, setInternalPage] = React.useState(1)\n const [internalPageSize, setInternalPageSize] = React.useState(paginationInitialPageSize)\n const chromeOwnedPagination = pagination === true && paginationOverride === undefined\n const effectivePaginationOverride =\n paginationOverride ??\n (chromeOwnedPagination ? { page: internalPage, pageSize: internalPageSize } : undefined)\n\n const tableState = useTableState<TRow>(\n rows,\n columns,\n defaultSort,\n effectivePaginationOverride,\n syncedSearchFromUrl,\n )\n\n const handlePageChange = React.useCallback((p: number) => setInternalPage(p), [])\n const handlePageSizeChange = React.useCallback((n: number) => {\n setInternalPageSize(n)\n setInternalPage(1)\n }, [])\n const resetPage = React.useCallback(() => setInternalPage(1), [])\n\n // Extract the stable setter from `useTableState` first so the\n // `useImperativeHandle` deps array sees the exact value the hook reads.\n // `setSheetOpen` is referentially stable, so the handle is created once.\n const { setSheetOpen: openPropertiesSheet } = tableState\n React.useImperativeHandle(\n handleRef ?? null,\n () => ({ openPropertiesDrawer: () => openPropertiesSheet(true) }),\n [openPropertiesSheet],\n )\n\n const drawerToolbarProps: HubDrawerToolbarProps = {\n totalRows: rows.length,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange: patchDisplay,\n conditionalRules,\n onAddConditionalRule: addConditionalRule,\n onRemoveConditionalRule: removeConditionalRule,\n onUpdateConditionalRule: updateConditionalRule,\n currentView: view,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n ...(pagination !== undefined ? { pagination } : {}),\n ...(onPaginationChange !== undefined ? { onPaginationChange } : {}),\n }\n\n const toolbar = (\n <DataTableToolbar\n state={tableState}\n columns={columns}\n searchable={displayOptions.showToolbarSearch}\n searchAriaLabel={searchAriaLabel}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n />\n )\n\n const toolbarShell = React.useCallback(\n (body: React.ReactNode) => (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {toolbar}\n {body}\n </div>\n ),\n // `toolbar` is recreated each render; including it would defeat memoization but\n // also gives renderers a fresh closure — acceptable because renderers are called\n // on render anyway. Keep deps stable so the function identity is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n tableState,\n columns,\n displayOptions.showToolbarSearch,\n searchAriaLabel,\n renderFilterOptionValue,\n drawerToolbarProps,\n ],\n )\n\n // Default `data-table` renderer — full DataTable with toolbar + bulk actions. When\n // `pagination === true` and the parent did not provide `paginationOverride`, the chrome\n // (CountSyncer + PaginationBar) is wrapped automatically so the drawer toggle \"Show\n // pagination\" works out of the box. Hubs that need finer control (custom chrome,\n // server-side paging) can still override via `tableRenderer`.\n const defaultTableRenderer = (args: HubTableRendererArgs<TRow>) => {\n const filteredCount = (args.state.rows as TRow[]).length\n const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)))\n const safePage = Math.min(internalPage, totalPages)\n return (\n <div className=\"pb-6\">\n {chromeOwnedPagination ? (\n <CountSyncer\n count={filteredCount}\n onSync={(n) => {\n const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)))\n if (safePage > next) setInternalPage(next)\n }}\n onReset={resetPage}\n />\n ) : null}\n <DataTable<TRow>\n data={rows}\n columns={columns}\n getRowId={getRowId}\n getRowSelectionLabel={getRowSelectionLabel}\n selectable={selectable}\n searchable={displayOptions.showToolbarSearch}\n showColumnHeaders={displayOptions.showColumnLabels}\n groupable={groupable}\n defaultSort={defaultSort}\n emptyState={emptyState ?? <p className=\"text-sm text-muted-foreground\">No records match your filters.</p>}\n conditionalRules={conditionalRules}\n state={args.state}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n bulkActionsSlot={bulkActionsSlot}\n onRowClick={onRowClick}\n hasFooter={chromeOwnedPagination}\n />\n {chromeOwnedPagination ? (\n <div\n className={cn(\n \"mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\",\n // z-40 sits above pinned cells (z-20), group headers (z-25), and column headers\n // (z-30 / z-40) so the sticky footer paints over any table content that scrolls\n // behind it. Pinned-left cells ship with their own `bg-dt-row-bg`, which\n // otherwise wins because of z-20 > z-10.\n \"sticky bottom-0 z-40\",\n )}\n >\n <PaginationBar\n page={safePage}\n pageSize={internalPageSize}\n total={filteredCount}\n pageSizeOptions={paginationPageSizeOptions}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n ) : null}\n </div>\n )\n }\n\n const args: HubTableRendererArgs<TRow> = {\n state: tableState,\n toolbar,\n toolbarShell,\n drawerToolbarProps,\n displayOptions,\n patchDisplay,\n }\n\n // Dev-time warning when a `supportedViewType` has no renderer AND no centralized\n // default is available. `data-table` always falls back to the built-in\n // `defaultTableRenderer`; `list-with-toolbar` and `board-with-toolbar` fall back\n // to the synthesised defaults below when the hub passes `renderListRow` /\n // `renderBoardCard` (the happy path for most hubs). The warning only fires for\n // exotic surfaces that genuinely need an explicit renderer entry.\n if (process.env.NODE_ENV !== \"production\") {\n for (const v of supportedViewTypes) {\n const kind = getDataListViewRenderKind(v)\n if (kind === \"data-table\") continue\n if (renderers[kind] != null) continue\n if (kind === \"list-with-toolbar\" && renderListRow != null) continue\n if (kind === \"board-with-toolbar\" && renderBoardCard != null && boardGroups != null) continue\n console.warn(\n `[Exxat DS][HubTable: ${hubLabel}] Missing renderer for supported view \"${v}\" (${kind}). ` +\n \"Add a renderer entry, or remove the view from supportedViewTypes.\",\n )\n }\n }\n\n // Compose `ListPageConnectedViewBody` renderers: the built-in `data-table` (or hub override)\n // plus each hub-provided non-table renderer. Wrapping in `() => …` defers execution until\n // the active view actually selects that kind — so heavy bodies (dashboard charts) don't\n // pay render cost on a table tab.\n const composed: ListPageConnectedViewRenderers = {\n \"data-table\": () => (tableRenderer ?? defaultTableRenderer)(args),\n }\n\n // Default centralized list renderer: same DataRowList shell every hub used to roll\n // by hand. Hub provides only the per-row body via `renderListRow`. When `pagination`\n // is on (and `paginationOverride` is not externally supplied), the list view reads\n // `state.pagedRows` and adds the same `CountSyncer` + `PaginationBar` chrome as the\n // table view.\n if (renderers[\"list-with-toolbar\"] == null && renderListRow != null) {\n composed[\"list-with-toolbar\"] = () => {\n const fullRows = args.state.rows as TRow[]\n const pagedRows = chromeOwnedPagination ? (args.state.pagedRows as TRow[]) : fullRows\n const filteredCount = fullRows.length\n const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)))\n const safePage = Math.min(internalPage, totalPages)\n return args.toolbarShell(\n <>\n {chromeOwnedPagination ? (\n <CountSyncer\n count={filteredCount}\n onSync={(n) => {\n const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)))\n if (safePage > next) setInternalPage(next)\n }}\n onReset={resetPage}\n />\n ) : null}\n <DataRowList<TRow>\n rows={pagedRows}\n getRowId={row => getRowId(row)}\n ariaLabel={listAriaLabel ?? hubLabel}\n emptyState={listEmptyState ?? \"No records match your filters.\"}\n {...(listVirtualizeThreshold !== undefined ? { virtualizeThreshold: listVirtualizeThreshold } : {})}\n {...(listEstimatedRowHeight !== undefined ? { estimatedRowHeight: listEstimatedRowHeight } : {})}\n renderRow={renderListRow}\n />\n {chromeOwnedPagination ? (\n <div\n className={cn(\n \"mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background\",\n // Match the table-view footer — above pinned cells (z-20) and column\n // headers (z-30 / z-40) so the sticky chrome paints over scrolling rows.\n \"sticky bottom-0 z-40\",\n )}\n >\n <PaginationBar\n page={safePage}\n pageSize={internalPageSize}\n total={filteredCount}\n pageSizeOptions={paginationPageSizeOptions}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n ) : null}\n </>,\n )\n }\n }\n\n // Default centralized board renderer: same ListPageBoardTemplate every hub used to wrap.\n // Hub provides only the per-card body via `renderBoardCard` and the column predicate set.\n if (renderers[\"board-with-toolbar\"] == null && renderBoardCard != null && boardGroups != null) {\n composed[\"board-with-toolbar\"] = () =>\n args.toolbarShell(\n <ListPageBoardTemplate<TRow>\n columns={boardGroups}\n rows={args.state.rows as TRow[]}\n getRowKey={getRowId}\n renderCard={renderBoardCard}\n columnCountBadgeClassName={boardColumnCountBadgeClassName ?? {}}\n emptyColumnLabel={boardEmptyColumnLabel ?? \"No items\"}\n />,\n )\n }\n\n for (const kind of Object.keys(renderers) as DataListViewRenderKind[]) {\n const r = renderers[kind]\n if (r) composed[kind] = () => r(args)\n }\n\n return <ListPageConnectedViewBody view={view} hubLabel={hubLabel} renderers={composed} />\n}\n\nHubTable.displayName = \"HubTable\"\n"]}