@exxatdesignux/ui 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +8 -6
  3. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +2 -1
  4. package/consumer-extras/cursor-rules/exxat-hub-supported-views.mdc +54 -0
  5. package/consumer-extras/cursor-rules/exxat-nav-single-active.mdc +31 -0
  6. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +8 -3
  7. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +15 -5
  8. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +11 -4
  9. package/consumer-extras/handbook/HANDBOOK.md +1 -1
  10. package/consumer-extras/handbook/reference-implementations.md +2 -2
  11. package/consumer-extras/patterns/data-views-pattern.md +6 -0
  12. package/consumer-extras/patterns/hub-supported-views-pattern.md +53 -0
  13. package/dist/components/data-table/filter-text-value-input.js +1 -1
  14. package/dist/components/data-table/filter-text-value-input.js.map +1 -1
  15. package/dist/components/data-table/index.js +16 -12
  16. package/dist/components/data-table/index.js.map +1 -1
  17. package/dist/components/data-table/pagination.js +16 -12
  18. package/dist/components/data-table/pagination.js.map +1 -1
  19. package/dist/components/data-views/data-row-list.js +1 -1
  20. package/dist/components/data-views/data-row-list.js.map +1 -1
  21. package/dist/components/data-views/hub-table.d.ts +8 -4
  22. package/dist/components/data-views/hub-table.js +31 -16
  23. package/dist/components/data-views/hub-table.js.map +1 -1
  24. package/dist/components/data-views/index.d.ts +1 -1
  25. package/dist/components/data-views/index.js +31 -16
  26. package/dist/components/data-views/index.js.map +1 -1
  27. package/dist/components/data-views/list-page-connected-view-body.d.ts +1 -1
  28. package/dist/components/data-views/list-page-connected-view-body.js +1 -0
  29. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -1
  30. package/dist/components/table-properties/column-row.js +1 -1
  31. package/dist/components/table-properties/column-row.js.map +1 -1
  32. package/dist/components/table-properties/drawer-button.js +6 -5
  33. package/dist/components/table-properties/drawer-button.js.map +1 -1
  34. package/dist/components/table-properties/drawer.js +6 -5
  35. package/dist/components/table-properties/drawer.js.map +1 -1
  36. package/dist/components/table-properties/filter-card.js +2 -2
  37. package/dist/components/table-properties/filter-card.js.map +1 -1
  38. package/dist/components/table-properties/index.d.ts +1 -1
  39. package/dist/components/table-properties/index.js +6 -5
  40. package/dist/components/table-properties/index.js.map +1 -1
  41. package/dist/components/table-properties/sort-card.js +1 -1
  42. package/dist/components/table-properties/sort-card.js.map +1 -1
  43. package/dist/components/templates/index.d.ts +1 -1
  44. package/dist/components/templates/index.js +16 -6
  45. package/dist/components/templates/index.js.map +1 -1
  46. package/dist/components/templates/list-page.d.ts +4 -2
  47. package/dist/components/templates/list-page.js +16 -6
  48. package/dist/components/templates/list-page.js.map +1 -1
  49. package/dist/components/ui/banner.d.ts +2 -2
  50. package/dist/components/ui/banner.js +1 -1
  51. package/dist/components/ui/banner.js.map +1 -1
  52. package/dist/components/ui/coach-mark.js +1 -1
  53. package/dist/components/ui/coach-mark.js.map +1 -1
  54. package/dist/components/ui/context-menu.js +1 -1
  55. package/dist/components/ui/context-menu.js.map +1 -1
  56. package/dist/components/ui/date-picker-field.js +1 -1
  57. package/dist/components/ui/date-picker-field.js.map +1 -1
  58. package/dist/components/ui/dropdown-menu.js +2 -2
  59. package/dist/components/ui/dropdown-menu.js.map +1 -1
  60. package/dist/components/ui/export-drawer.js +3 -3
  61. package/dist/components/ui/export-drawer.js.map +1 -1
  62. package/dist/components/ui/hover-card.js +1 -1
  63. package/dist/components/ui/hover-card.js.map +1 -1
  64. package/dist/components/ui/key-metrics.js +6 -6
  65. package/dist/components/ui/key-metrics.js.map +1 -1
  66. package/dist/components/ui/page-header.js +1 -1
  67. package/dist/components/ui/page-header.js.map +1 -1
  68. package/dist/components/ui/popover.js +1 -1
  69. package/dist/components/ui/popover.js.map +1 -1
  70. package/dist/components/ui/select.js +1 -1
  71. package/dist/components/ui/select.js.map +1 -1
  72. package/dist/components/ui/sheet.js +1 -1
  73. package/dist/components/ui/sheet.js.map +1 -1
  74. package/dist/components/ui/sidebar.d.ts +1 -1
  75. package/dist/components/ui/sidebar.js +3 -3
  76. package/dist/components/ui/sidebar.js.map +1 -1
  77. package/dist/components/ui/tip.js +1 -1
  78. package/dist/components/ui/tip.js.map +1 -1
  79. package/dist/components/ui/tooltip.js +1 -1
  80. package/dist/components/ui/tooltip.js.map +1 -1
  81. package/dist/components/ui/view-segmented-control.js +1 -1
  82. package/dist/components/ui/view-segmented-control.js.map +1 -1
  83. package/dist/{data-list-view-registry-CyBoBML4.d.ts → data-list-view-registry-BstmlfQ3.d.ts} +16 -1
  84. package/dist/index.d.ts +2 -1
  85. package/dist/index.js +151 -29
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/data-list-view-registry.d.ts +1 -1
  88. package/dist/lib/data-list-view-registry.js +17 -1
  89. package/dist/lib/data-list-view-registry.js.map +1 -1
  90. package/dist/lib/data-list-view-surface.d.ts +1 -1
  91. package/dist/lib/data-list-view-surface.js +1 -0
  92. package/dist/lib/data-list-view-surface.js.map +1 -1
  93. package/dist/lib/list-page-table-properties.d.ts +1 -1
  94. package/dist/lib/list-page-table-properties.js +1 -0
  95. package/dist/lib/list-page-table-properties.js.map +1 -1
  96. package/dist/lib/nav-active.d.ts +38 -0
  97. package/dist/lib/nav-active.js +104 -0
  98. package/dist/lib/nav-active.js.map +1 -0
  99. package/package.json +1 -1
  100. package/src/components/data-table/index.tsx +25 -17
  101. package/src/components/data-views/data-row-list.tsx +1 -1
  102. package/src/components/data-views/hub-table.tsx +9 -3
  103. package/src/components/templates/list-page.tsx +9 -3
  104. package/src/components/ui/banner.tsx +0 -2
  105. package/src/components/ui/coach-mark.tsx +1 -2
  106. package/src/components/ui/context-menu.tsx +1 -1
  107. package/src/components/ui/dropdown-menu.tsx +2 -2
  108. package/src/components/ui/hover-card.tsx +1 -1
  109. package/src/components/ui/key-metrics.tsx +4 -4
  110. package/src/components/ui/popover.tsx +1 -1
  111. package/src/components/ui/select.tsx +1 -1
  112. package/src/components/ui/sheet.tsx +1 -1
  113. package/src/components/ui/sidebar.tsx +3 -3
  114. package/src/components/ui/tooltip.tsx +1 -1
  115. package/src/index.ts +1 -0
  116. package/src/lib/data-list-view-registry.ts +31 -0
  117. package/src/lib/nav-active.ts +162 -0
  118. package/template/.claude/skills/exxat-ds-skill/SKILL.md +2 -1
  119. package/template/AGENTS.md +16 -1
  120. package/template/components/columns-client.tsx +3 -2
  121. package/template/components/columns-showcase.tsx +22 -18
  122. package/template/components/exxat-product-logo.tsx +1 -1
  123. package/template/components/library-table.tsx +62 -23
  124. package/template/components/new-library-item-form.tsx +0 -7
  125. package/template/components/product-wordmark.tsx +1 -1
  126. package/template/components/sidebar/app-sidebar.tsx +14 -106
  127. package/template/components/sidebar/secondary-nav.tsx +22 -4
  128. package/template/components/tokens-hub-auxiliary-views.tsx +301 -0
  129. package/template/components/tokens-themes-client.tsx +44 -16
  130. package/template/docs/HANDBOOK.md +1 -1
  131. package/template/docs/data-views-pattern.md +6 -0
  132. package/template/docs/glossary.md +2 -1
  133. package/template/docs/hub-supported-views-pattern.md +53 -0
  134. package/template/docs/reference-implementations.md +2 -2
  135. package/template/lib/full-hub-supported-views.ts +8 -0
  136. package/template/lib/library-supported-views.ts +5 -12
  137. package/template/package.json +11 -0
  138. package/tokens/hooks-index.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/button.tsx","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/row-height.ts","../../../src/components/ui/label.tsx","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/ui/select.tsx","../../../src/components/ui/tip.tsx","../../../src/components/ui/toggle-switch.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/calendar.tsx","../../../src/lib/date-filter.ts","../../../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/popover.tsx","../../../src/components/ui/date-picker-field.tsx","../../../src/components/data-table/filter-text-value-input.tsx","../../../src/lib/table-properties-types.ts","../../../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"],"names":["TooltipPrimitive","React","jsx","React2","Label","LabelPrimitive","cva","React3","RadioGroupPrimitive","RadioGroupItem","jsxs","DropdownMenuPrimitive","SheetPrimitive","SelectPrimitive","React5","Input","className","props","React6","React7","React8","MaskedInput","PopoverPrimitive","React9","Fragment","React10","React12"],"mappings":"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","file":"drawer-button.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","\"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-right-2 data-[side=right]:slide-in-from-left-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","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","/**\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 */\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\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 * 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\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 * 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","/**\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-right-2 data-[side=right]:slide-in-from-left-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-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n 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 { 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]:left-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]:right-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-left-6 data-[side=right]:data-open:slide-in-from-right-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-left-6 data-[side=right]:data-closed:slide-out-to-right-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-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", 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 { 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\"\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","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\"\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","/**\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 { 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\"\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-right-2 data-[side=right]:slide-in-from-left-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }\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","/**\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","\"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"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/button.tsx","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/row-height.ts","../../../src/components/ui/label.tsx","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/ui/select.tsx","../../../src/components/ui/tip.tsx","../../../src/components/ui/toggle-switch.tsx","../../../src/components/ui/input.tsx","../../../src/components/ui/calendar.tsx","../../../src/lib/date-filter.ts","../../../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/popover.tsx","../../../src/components/ui/date-picker-field.tsx","../../../src/components/data-table/filter-text-value-input.tsx","../../../src/lib/table-properties-types.ts","../../../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"],"names":["TooltipPrimitive","React","jsx","React2","Label","LabelPrimitive","cva","React3","RadioGroupPrimitive","RadioGroupItem","jsxs","DropdownMenuPrimitive","SheetPrimitive","SelectPrimitive","React5","Input","className","props","React6","React7","React8","MaskedInput","PopoverPrimitive","React9","Fragment","React10","React12"],"mappings":"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","file":"drawer-button.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","\"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","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","/**\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 * 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\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 * 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","/**\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 { 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 { 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\"\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","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\"\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","/**\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 { 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\"\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","\"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","/**\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","\"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"]}