@exxatdesignux/ui 0.5.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +1 -1
- package/consumer-extras/cursor-rules/exxat-accessibility.mdc +1 -1
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +8 -6
- package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +4 -4
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +6 -1
- package/consumer-extras/cursor-rules/exxat-hub-supported-views.mdc +54 -0
- package/consumer-extras/cursor-rules/exxat-nav-single-active.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-no-vaul.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-page-header-actions.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-table-row-preview.mdc +24 -0
- package/consumer-extras/cursor-rules/exxat-tabs-chrome.mdc +31 -0
- package/consumer-extras/cursor-skills/exxat-drawer-vs-dialog/SKILL.md +5 -5
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +10 -5
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/accessibility.md +1 -1
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +15 -5
- package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +14 -5
- package/consumer-extras/handbook/HANDBOOK.md +1 -1
- package/consumer-extras/handbook/reference-implementations.md +2 -2
- package/consumer-extras/patterns/consumer-upgrade-checklist.md +14 -1
- package/consumer-extras/patterns/data-views-pattern.md +6 -0
- package/consumer-extras/patterns/drawer-vs-dialog-pattern.md +50 -0
- package/consumer-extras/patterns/hub-supported-views-pattern.md +53 -0
- package/dist/components/data-table/index.js +13 -9
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/pagination.js +13 -9
- package/dist/components/data-table/pagination.js.map +1 -1
- package/dist/components/data-views/hub-table.d.ts +8 -4
- package/dist/components/data-views/hub-table.js +25 -10
- package/dist/components/data-views/hub-table.js.map +1 -1
- package/dist/components/data-views/index.d.ts +1 -1
- package/dist/components/data-views/index.js +25 -10
- package/dist/components/data-views/index.js.map +1 -1
- package/dist/components/data-views/list-page-connected-view-body.d.ts +1 -1
- package/dist/components/data-views/list-page-connected-view-body.js +1 -0
- package/dist/components/data-views/list-page-connected-view-body.js.map +1 -1
- package/dist/components/table-properties/drawer-button.js +1 -0
- package/dist/components/table-properties/drawer-button.js.map +1 -1
- package/dist/components/table-properties/drawer.js +1 -0
- package/dist/components/table-properties/drawer.js.map +1 -1
- package/dist/components/table-properties/index.d.ts +1 -1
- package/dist/components/table-properties/index.js +1 -0
- package/dist/components/table-properties/index.js.map +1 -1
- package/dist/components/templates/index.d.ts +1 -1
- package/dist/components/templates/index.js +12 -2
- package/dist/components/templates/index.js.map +1 -1
- package/dist/components/templates/list-page.d.ts +4 -2
- package/dist/components/templates/list-page.js +12 -2
- package/dist/components/templates/list-page.js.map +1 -1
- package/dist/{data-list-view-registry-CyBoBML4.d.ts → data-list-view-registry-BstmlfQ3.d.ts} +16 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +135 -126
- package/dist/index.js.map +1 -1
- package/dist/lib/data-list-view-registry.d.ts +1 -1
- package/dist/lib/data-list-view-registry.js +17 -1
- package/dist/lib/data-list-view-registry.js.map +1 -1
- package/dist/lib/data-list-view-surface.d.ts +1 -1
- package/dist/lib/data-list-view-surface.js +1 -0
- package/dist/lib/data-list-view-surface.js.map +1 -1
- package/dist/lib/list-page-table-properties.d.ts +1 -1
- package/dist/lib/list-page-table-properties.js +1 -0
- package/dist/lib/list-page-table-properties.js.map +1 -1
- package/dist/lib/nav-active.d.ts +38 -0
- package/dist/lib/nav-active.js +104 -0
- package/dist/lib/nav-active.js.map +1 -0
- package/package.json +1 -2
- package/src/components/data-table/index.tsx +25 -17
- package/src/components/data-views/hub-table.tsx +9 -3
- package/src/components/templates/list-page.tsx +9 -3
- package/src/index.ts +1 -1
- package/src/lib/data-list-view-registry.ts +31 -0
- package/src/lib/nav-active.ts +162 -0
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +2 -1
- package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
- package/template/AGENTS.md +18 -3
- package/template/components/columns-client.tsx +3 -2
- package/template/components/columns-showcase.tsx +22 -18
- package/template/components/exxat-product-logo.tsx +1 -1
- package/template/components/library-table.tsx +62 -23
- package/template/components/new-library-item-form.tsx +0 -7
- package/template/components/product-wordmark.tsx +1 -1
- package/template/components/sidebar/app-sidebar.tsx +14 -106
- package/template/components/sidebar/secondary-nav.tsx +22 -4
- package/template/components/site-header.tsx +1 -1
- package/template/components/tokens-hub-auxiliary-views.tsx +301 -0
- package/template/components/tokens-themes-client.tsx +44 -16
- package/template/docs/HANDBOOK.md +2 -2
- package/template/docs/component-selection-guide.md +1 -1
- package/template/docs/consumer-upgrade-checklist.md +51 -0
- package/template/docs/data-views-pattern.md +6 -0
- package/template/docs/drawer-vs-dialog-pattern.md +8 -8
- package/template/docs/glossary.md +2 -1
- package/template/docs/hub-supported-views-pattern.md +53 -0
- package/template/docs/reference-implementations.md +2 -2
- package/template/lib/full-hub-supported-views.ts +8 -0
- package/template/lib/library-supported-views.ts +5 -12
- package/template/lib/motion-ui.ts +2 -2
- package/template/package.json +1 -1
- package/tokens/hooks-index.json +2 -2
- package/dist/components/ui/drawer.d.ts +0 -16
- package/dist/components/ui/drawer.js +0 -125
- package/dist/components/ui/drawer.js.map +0 -1
- package/src/components/ui/drawer.tsx +0 -134
- package/template/components/ui/drawer.tsx +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/lib/dev-log.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/label.tsx","../../../src/components/ui/checkbox.tsx","../../../src/components/ui/kbd.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/components/ui/calendar.tsx","../../../src/components/ui/input.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/components/ui/sheet.tsx","../../../src/components/ui/form.tsx","../../../src/components/ui/export-drawer.tsx","../../../src/components/ui/dialog.tsx","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/list-page-table-properties.ts","../../../src/components/ui/view-segmented-control.tsx","../../../src/components/templates/list-page.tsx","../../../src/components/templates/nested-secondary-panel-shell.tsx","../../../src/components/ui/list-page-view-frame.tsx","../../../src/components/ui/dot-pattern.tsx","../../../src/components/templates/dedicated-search-landing-template.tsx","../../../src/components/templates/dedicated-search-results-template.tsx"],"names":["TooltipPrimitive","jsxs","jsx","React","React2","Label","LabelPrimitive","cva","React3","Checkbox","motion","CheckboxPrimitive","DropdownMenuPrimitive","React4","React5","RadioGroupPrimitive","RadioGroupItem","className","props","React6","React7","Input","React8","MaskedInput","PopoverPrimitive","SheetPrimitive","React9","Slot","React10","Fragment","DialogPrimitive","React13"],"mappings":"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","file":"index.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","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Logs only in development. Use for mock flows (export, submit) instead of\n * raw `console.log`. Bundlers replace `process.env.NODE_ENV` at build time,\n * so the call site disappears entirely in production bundles.\n */\nexport function devLog(...args: unknown[]): void {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args)\n }\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst 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","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n","\"use client\"\n\n/**\n * Checkbox — Radix control + Exxat styling.\n *\n * Aligned with Shadcn Studio checkbox guidance (see shadcnstudio.com/docs/components/checkbox):\n * • Tri-state: `checked={true | false | \"indeterminate\"}` (parent “select some” rows)\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg\n * • Motion: none | pop | glow | pop-glow — uses `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Forms: `aria-invalid` from Field, `disabled`, extended hit slop (`after:`)\n * • Pair with `CheckboxLabel` + `htmlFor` / `id` for 44px-friendly targets\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst checkboxVariants = cva(\n [\n \"peer relative box-border flex shrink-0 items-center justify-center self-center rounded-[4px] border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:data-[state=indeterminate]:bg-primary dark:data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-background data-[state=indeterminate]:text-primary data-[state=indeterminate]:ring-2 data-[state=indeterminate]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n \"data-[state=indeterminate]:border-secondary data-[state=indeterminate]:bg-secondary data-[state=indeterminate]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n \"data-[state=indeterminate]:border-chart-2 data-[state=indeterminate]:bg-chart-2 data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n \"data-[state=indeterminate]:border-destructive data-[state=indeterminate]:bg-destructive data-[state=indeterminate]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n \"data-[state=indeterminate]:border-amber-500 data-[state=indeterminate]:bg-amber-500 data-[state=indeterminate]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n \"data-[state=indeterminate]:border-muted-foreground/50 data-[state=indeterminate]:bg-muted data-[state=indeterminate]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 max-h-3.5 max-w-3.5 min-h-3.5 min-w-3.5 rounded-[3px] [&_[data-slot=checkbox-indicator]_i]:text-[10px]\",\n default: \"size-4 max-h-4 max-w-4 min-h-4 min-w-4 [&_[data-slot=checkbox-indicator]_i]:text-xs\",\n lg: \"size-5 max-h-5 max-w-5 min-h-5 min-w-5 rounded-[5px] [&_[data-slot=checkbox-indicator]_i]:text-sm\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: [\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst checkboxIndicatorVariants = cva(\"grid place-content-center text-current\", {\n variants: {\n motion: {\n none: \"transition-none\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\":\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: {\n motion: \"none\",\n },\n})\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, variant, size, motion, checked, ...props }, ref) {\n const m = motion ?? \"none\"\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-variant={variant ?? \"default\"}\n data-motion={m}\n checked={checked}\n className={cn(checkboxVariants({ variant, size, motion: m }), className)}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={checkboxIndicatorVariants({ motion: m })}\n >\n {checked === \"indeterminate\" ? (\n <i className=\"fa-solid fa-minus text-current\" aria-hidden=\"true\" />\n ) : (\n <i className=\"fa-solid fa-check text-current\" aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n }\n)\n\nexport type CheckboxLabelProps = React.ComponentPropsWithRef<typeof Label>\n\n/** Label tuned for `Checkbox` siblings: larger tap target, respects `peer-disabled`. */\nfunction CheckboxLabel({ className, ...props }: CheckboxLabelProps) {\n return (\n <Label\n data-slot=\"checkbox-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Checkbox, CheckboxLabel, checkboxVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Kbd — display keyboard keys and shortcuts (shadcn/ui).\n * @see https://ui.shadcn.com/docs/components/radix/kbd\n *\n * Variants:\n * - \"tile\" (default) — filled tile with border; use in tooltips, menus, docs,\n * or any surface where the Kbd sits on neutral background.\n * - \"bare\" — no background, no border; inherits `currentColor` at 70% opacity.\n * Use **inside buttons** (primary/secondary workflow actions) so the hint\n * does not look like a pasted-on patch against the button fill.\n */\nfunction Kbd({\n className,\n variant = \"tile\",\n \"aria-hidden\": ariaHidden,\n ...props\n}: React.ComponentProps<\"kbd\"> & { variant?: \"tile\" | \"bare\" }) {\n // Bare variant lives inside buttons — the button already carries the\n // accessible name, so the inline kbd is redundant noise for screen readers.\n // Default to aria-hidden unless a consumer explicitly opts in.\n const hidden = ariaHidden ?? (variant === \"bare\" ? true : undefined)\n return (\n <kbd\n data-slot=\"kbd\"\n data-variant={variant}\n aria-hidden={hidden}\n className={cn(\n \"pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium\",\n variant === \"tile\" &&\n \"bg-muted text-muted-foreground rounded-sm border\",\n variant === \"bare\" && \"text-current/70 px-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","/**\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\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:data-[state=checked]:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n none: \"\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\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","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 { 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","\"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 { Slot } from \"radix-ui\"\nimport {\n Controller,\n FormProvider,\n useFormContext,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ ...props }: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nfunction useFormField() {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) throw new Error(\"useFormField must be used inside <FormField>\")\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue { id: string }\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"flex flex-col gap-1.5\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n const { error, formItemId } = useFormField()\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction FormMessage({ className, children, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : children\n if (!body) return null\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n )\n}\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n","\"use client\"\n\n/**\n * ExportDrawer — floating right-side drawer with export form.\n *\n * Uses the same Sheet pattern as TablePropertiesDrawer:\n * - showCloseButton={false}, showOverlay={false}\n * - Rounded, floating, inset from viewport edges\n * - Button + Tip from our own component library\n *\n * Form fields (shadcn Form + react-hook-form + zod):\n * • File format CSV · Excel · PDF (SelectionTileGrid radio)\n * • Date range From / To (FilterTextValueInput dateMDY — same as Settings / table filters)\n * • Columns All · Visible only (radio)\n * • Apply active filters (checkbox)\n *\n * WCAG 2.1 AA:\n * ✓ All inputs labelled via FormLabel linked to control id (1.3.1)\n * ✓ Error messages linked via aria-describedby (3.3.1)\n * ✓ Focus returns to trigger on close (2.4.3)\n */\n\nimport * as React from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport { z } from \"zod\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\n\nimport { devLog } from \"../../lib/dev-log\"\nimport { Button } from \"./button\"\nimport { Checkbox } from \"./checkbox\"\nimport { Label } from \"./label\"\nimport { Tip } from \"./tip\"\nimport { Kbd, KbdGroup } from \"./kbd\"\nimport { Shortcut } from \"./dropdown-menu\"\nimport { RadioGroup, RadioGroupItem, RadioGroupLabel } from \"./radio-group\"\nimport { SelectionTileGrid } from \"./selection-tile-grid\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport type { SelectionTileOption } from \"./selection-tile-grid\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"./sheet\"\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"./form\"\n\n/** Parse full MM/DD/YYYY from masked input; partial/invalid → undefined. */\nfunction parseMdyToDate(raw: string | undefined): Date | undefined {\n if (!raw?.trim()) return undefined\n const m = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!m) return undefined\n const month = Number(m[1])\n const day = Number(m[2])\n const year = Number(m[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const d = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) return undefined\n return d\n}\n\n// ── Validation schema ─────────────────────────────────────────────────────────\n\nconst EXPORT_FORMAT_OPTIONS: SelectionTileOption<\"csv\" | \"excel\" | \"pdf\">[] = [\n { value: \"csv\", label: \"CSV\", icon: \"fa-file-csv\" },\n { value: \"excel\", label: \"Excel\", icon: \"fa-file-excel\" },\n { value: \"pdf\", label: \"PDF\", icon: \"fa-file-pdf\" },\n]\n\nconst exportSchema = z\n .object({\n format: z.enum([\"csv\", \"excel\", \"pdf\"]),\n columns: z.enum([\"all\", \"visible\"]),\n dateFrom: z.string().optional(),\n dateTo: z.string().optional(),\n includeFilters: z.boolean(),\n })\n .superRefine((data, ctx) => {\n const from = parseMdyToDate(data.dateFrom)\n const to = parseMdyToDate(data.dateTo)\n if (data.dateFrom?.trim() && !from) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid from date\", path: [\"dateFrom\"] })\n }\n if (data.dateTo?.trim() && !to) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid to date\", path: [\"dateTo\"] })\n }\n if (from && to && to < from) {\n ctx.addIssue({ code: \"custom\", message: \"End date must be after start date\", path: [\"dateTo\"] })\n }\n })\n\ntype ExportForm = z.infer<typeof exportSchema>\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport interface ExportDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n totalRows?: number\n visibleColumns?: number\n}\n\nexport function ExportDrawer({\n open,\n onOpenChange,\n totalRows = 0,\n visibleColumns,\n}: ExportDrawerProps) {\n const form = useForm<ExportForm>({\n resolver: zodResolver(exportSchema),\n defaultValues: {\n format: \"csv\",\n columns: \"visible\",\n dateFrom: \"\",\n dateTo: \"\",\n includeFilters: true,\n },\n })\n\n const [isExporting, setIsExporting] = React.useState(false)\n\n async function onSubmit(values: ExportForm) {\n setIsExporting(true)\n await new Promise(r => setTimeout(r, 1200))\n devLog(\"Export:\", {\n ...values,\n dateFrom: parseMdyToDate(values.dateFrom)?.toISOString(),\n dateTo: parseMdyToDate(values.dateTo)?.toISOString(),\n })\n setIsExporting(false)\n onOpenChange(false)\n form.reset()\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n data-slot=\"export-drawer\"\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n className=\"z-[80] w-80 sm:max-w-80 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(100vh - 1rem)\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Export data</SheetTitle>\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 {/* Record count */}\n <p className=\"px-4 pb-3 text-sm text-muted-foreground -mt-1\">\n {totalRows} record{totalRows !== 1 ? \"s\" : \"\"} available for export.\n </p>\n\n {/* Form body */}\n <Form {...form}>\n <form\n id=\"export-form\"\n onSubmit={form.handleSubmit(onSubmit)}\n className=\"flex-1 overflow-y-auto\"\n >\n <div className=\"px-4 pb-4 space-y-5\">\n\n {/* File format */}\n <FormField\n control={form.control}\n name=\"format\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <SelectionTileGrid\n sectionLabel=\"File format\"\n options={EXPORT_FORMAT_OPTIONS}\n columns={3}\n value={field.value}\n onValueChange={field.onChange}\n interaction=\"radio\"\n idPrefix=\"export-fmt\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Date range */}\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium leading-none mb-2\">\n Date range{\" \"}\n <span className=\"text-muted-foreground font-normal\">(optional)</span>\n </legend>\n <div className=\"grid grid-cols-2 gap-3\">\n <FormField\n control={form.control}\n name=\"dateFrom\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-from\" className=\"text-xs text-muted-foreground\">\n From\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-from\"\n mask=\"dateMDY\"\n aria-label=\"Export from date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"dateTo\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-to\" className=\"text-xs text-muted-foreground\">\n To\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-to\"\n mask=\"dateMDY\"\n aria-label=\"Export to date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </fieldset>\n\n {/* Columns */}\n <FormField\n control={form.control}\n name=\"columns\"\n render={({ field }) => (\n <FormItem>\n <FormLabel className=\"text-sm font-medium\">Columns</FormLabel>\n <FormControl>\n <RadioGroup\n value={field.value}\n onValueChange={field.onChange}\n className=\"space-y-1.5 mt-1\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n >\n {([\n { value: \"all\", label: \"All columns\", sub: null },\n { value: \"visible\", label: \"Visible columns only\", sub: visibleColumns !== undefined ? `${visibleColumns} columns` : null },\n ] as const).map(opt => (\n <div\n key={opt.value}\n className=\"flex items-center gap-2.5 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-brand has-[[data-state=checked]]:bg-brand/10 cursor-pointer\"\n >\n <RadioGroupItem value={opt.value} id={`col-${opt.value}`} />\n <RadioGroupLabel\n htmlFor={`col-${opt.value}`}\n className=\"min-h-0 flex-1 cursor-pointer py-0 text-sm font-normal leading-none\"\n >\n {opt.label}\n {opt.sub && (\n <span className=\"text-muted-foreground ms-1.5 font-normal\">({opt.sub})</span>\n )}\n </RadioGroupLabel>\n </div>\n ))}\n </RadioGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Include filters */}\n <FormField\n control={form.control}\n name=\"includeFilters\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex items-start gap-3 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-primary\">\n <FormControl>\n <Checkbox\n id=\"include-filters\"\n checked={field.value}\n onCheckedChange={field.onChange}\n className=\"mt-0.5 shrink-0\"\n />\n </FormControl>\n <div className=\"min-w-0\">\n <Label htmlFor=\"include-filters\" className=\"text-sm cursor-pointer font-medium leading-none\">\n Apply active filters\n </Label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Export only rows matching current filters\n </p>\n </div>\n </div>\n <FormMessage />\n </FormItem>\n )}\n />\n\n </div>\n </form>\n </Form>\n\n {/* Global bindings — only active while the drawer is open (Sheet unmounts content on close) */}\n <Shortcut keys=\"Enter\" disabled={isExporting} onInvoke={() => form.handleSubmit(onSubmit)()} />\n\n {/* Footer */}\n <div className=\"flex items-center gap-2 px-4 py-3 border-t border-border\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => onOpenChange(false)}\n >\n Cancel\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">Esc</Kbd></KbdGroup>\n </Button>\n <Button\n type=\"submit\"\n form=\"export-form\"\n className=\"flex-1\"\n disabled={isExporting}\n >\n {isExporting ? (\n <>\n <i className=\"fa-light fa-spinner-third fa-spin text-[13px]\" aria-hidden=\"true\" />\n Exporting…\n </>\n ) : (\n <>\n <i className=\"fa-light fa-arrow-down-to-line text-[13px]\" aria-hidden=\"true\" />\n Export\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">⏎</Kbd></KbdGroup>\n </>\n )}\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 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 DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n /** Merged onto `DialogOverlay` (e.g. `bg-transparent` for a palette with no dimmed backdrop). */\n overlayClassName?: string\n}) {\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName ?? undefined} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm 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 {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 end-2\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","/**\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 * Connects ListPageTemplate “View → Edit” to a surface that hosts TablePropertiesDrawer\n * (PlacementsTable, TeamTable, ComplianceTable, …). Import from `@/components/table-properties`\n * or use here — see `createListPageEditViewHandler`.\n *\n * View **labels** for tabs and Properties are centralized in `@/lib/data-list-view`\n * (`DATA_LIST_VIEW_TILES`, `dataListViewLabel`, `dataListViewIcon`).\n */\n\nimport * as React from \"react\"\n\nimport { dataListViewIcon, type DataListViewType } from \"./data-list-view\"\nimport { isDataListSurfaceViewType } from \"./data-list-view-registry\"\n\nexport { isDataListSurfaceViewType }\n\n/** Minimal ref API any list/table surface exposes for the shared Properties drawer. */\nexport interface OpenTablePropertiesHandle {\n openPropertiesDrawer: () => void\n}\n\nexport interface CreateListPageEditViewHandlerOptions {\n /** Delay before opening Properties after switching to table (ms). Default 160. */\n switchDelayMs?: number\n}\n\n/**\n * Returns `ListPageTemplate`’s `onEditView` handler: optionally coerces the tab to `table`\n * when the view type is unknown, then calls `ref.current.openPropertiesDrawer()`.\n */\nexport function createListPageEditViewHandler(\n tableRef: React.RefObject<OpenTablePropertiesHandle | null>,\n options?: CreateListPageEditViewHandlerOptions\n) {\n const delay = options?.switchDelayMs ?? 160\n return (\n tab: { viewType: string },\n { updateTab }: { updateTab: (patch: { viewType?: DataListViewType; icon?: string }) => void }\n ) => {\n const mustSwitchToTableSurface = !isDataListSurfaceViewType(tab.viewType)\n if (mustSwitchToTableSurface) {\n updateTab({ viewType: \"table\", icon: dataListViewIcon(\"table\") })\n }\n window.setTimeout(() => {\n tableRef.current?.openPropertiesDrawer()\n }, mustSwitchToTableSurface ? delay : 0)\n }\n}\n","\"use client\"\n\n/**\n * Segmented “view tabs” control — same visual language as `ListPageTemplate` views toolbar\n * (`bg-muted/60` pill). Uses `role=\"radiogroup\"` + `role=\"radio\"` for exclusive choice (1.3.1).\n *\n * Keyboard: Arrow Left/Right (or Up/Down), Home, End — see onRadioKeyDown.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"./tip\"\n\nexport function viewSegmentedToolbarClass(className?: string) {\n return cn(\n \"inline-flex items-center gap-0.5 rounded-lg bg-muted/60 p-[3px]\",\n className,\n )\n}\n\nexport function viewSegmentedButtonClass(\n isActive: boolean,\n opts?: { iconOnly?: boolean },\n) {\n return cn(\n \"inline-flex items-center rounded-md transition-all whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n opts?.iconOnly\n ? \"size-8 min-h-8 min-w-8 shrink-0 justify-center p-0 text-xs\"\n : \"gap-1.5 px-2.5 py-1 text-xs min-h-8\",\n isActive\n ? \"bg-background text-foreground font-medium shadow-sm\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground\",\n )\n}\n\nexport interface ViewSegmentOption<T extends string = string> {\n value: T\n label: string\n /** Full `className` for Font Awesome icon (e.g. `fa-light fa-chart-bar`) */\n icon?: string\n}\n\nexport interface ViewSegmentedControlProps<T extends string = string> {\n value: T\n onValueChange: (value: T) => void\n options: readonly ViewSegmentOption<T>[]\n /** Accessible name for the group (required — names the radiogroup) */\n \"aria-label\": string\n /** Optional description id for `aria-describedby` (e.g. helper text) */\n \"aria-describedby\"?: string\n /** Icon-only triggers (labels in `sr-only` or visible text) */\n iconOnly?: boolean\n className?: string\n /** Tooltip on each segment (defaults to `iconOnly` — recommended for icon-only) */\n showTooltips?: boolean\n /** Tooltip position */\n tooltipSide?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function ViewSegmentedControl<T extends string>({\n value,\n onValueChange,\n options,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n iconOnly = false,\n className,\n showTooltips,\n tooltipSide = \"top\",\n}: ViewSegmentedControlProps<T>) {\n const tips = showTooltips ?? iconOnly\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n React.useLayoutEffect(() => {\n itemRefs.current = itemRefs.current.slice(0, options.length)\n }, [options.length])\n\n const focusIndex = React.useCallback(\n (index: number) => {\n const len = options.length\n if (len === 0) return\n const i = ((index % len) + len) % len\n onValueChange(options[i].value)\n requestAnimationFrame(() => {\n itemRefs.current[i]?.focus()\n })\n },\n [onValueChange, options],\n )\n\n const onRadioKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const len = options.length\n if (len === 0) return\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault()\n focusIndex(index + 1)\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault()\n focusIndex(index - 1)\n } else if (e.key === \"Home\") {\n e.preventDefault()\n focusIndex(0)\n } else if (e.key === \"End\") {\n e.preventDefault()\n focusIndex(len - 1)\n }\n },\n [focusIndex, options.length],\n )\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-slot=\"view-segmented-toolbar\"\n className={cn(viewSegmentedToolbarClass(), \"w-fit min-w-0 shrink-0\", className)}\n >\n {options.map((opt, index) => {\n const isActive = opt.value === value\n const tabIndex = isActive ? 0 : -1\n\n const button = (\n <button\n ref={el => {\n itemRefs.current[index] = el\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n aria-label={iconOnly ? opt.label : undefined}\n tabIndex={tabIndex}\n onKeyDown={e => onRadioKeyDown(e, index)}\n onClick={() => onValueChange(opt.value)}\n data-slot=\"view-segmented-item\"\n className={viewSegmentedButtonClass(isActive, { iconOnly })}\n >\n {opt.icon ? (\n <i\n className={cn(opt.icon, iconOnly ? \"text-[13px]\" : \"text-xs\")}\n aria-hidden=\"true\"\n />\n ) : null}\n {!iconOnly ? opt.label : null}\n </button>\n )\n\n return tips ? (\n <Tip key={opt.value} label={opt.label} side={tooltipSide}>\n {button}\n </Tip>\n ) : (\n <React.Fragment key={opt.value}>{button}</React.Fragment>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * ListPageTemplate — reusable template for any list-based page.\n *\n * Provides: page header slot, optional key metrics, tabbed views\n * (table/list/board/dashboard) with add/remove/configure per-tab,\n * and an export drawer.\n *\n * Usage:\n * <ListPageTemplate\n * header={<MyPageHeader />}\n * metrics={<KeyMetrics ... />}\n * defaultTabs={DEFAULT_TABS}\n * renderContent={(tab) => <MyTable members={MOCK_ROWS} view={tab.viewType} />}\n * />\n *\n * Connected views (table | list | board | dashboard) must share one `useTableState`\n * and pass `tableState.rows` into non-table surfaces — see `docs/data-views-pattern.md`\n * and `AGENTS.md` §4.\n *\n * View chrome is shared with `ViewSegmentedControl` / `viewSegmentedToolbarClass` in\n * `@/components/ui/view-segmented-control` and re-exported from `@/components/data-views`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { ExportDrawer } from \"../ui/export-drawer\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Shortcut,\n} from \"../ui/dropdown-menu\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewAddShortcut } from \"../../lib/data-list-view\"\nimport {\n createListPageEditViewHandler,\n type OpenTablePropertiesHandle,\n} from \"../../lib/list-page-table-properties\"\nimport {\n viewSegmentedToolbarClass,\n viewSegmentedButtonClass,\n} from \"../ui/view-segmented-control\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ViewType = DataListViewType\n\n/** Same labels/icons as Properties drawer `SelectionTileGrid` — single source in `DATA_LIST_VIEW_TILES`. */\nexport const VIEW_TYPES: { type: ViewType; label: string; icon: string }[] = DATA_LIST_VIEW_TILES.map(t => ({\n type: t.value,\n label: t.label,\n icon: t.icon,\n}))\n\nexport interface FilterOption {\n id: string\n label: string\n}\n\nexport interface ViewTab {\n id: string\n label: string\n viewType: ViewType\n icon: string\n /** Optional filter key for lifecycle or category-based filtering */\n filterId: string\n}\n\nexport interface ListPageTemplateProps {\n /** Page header — rendered above metrics */\n header: React.ReactNode\n /** Optional metrics strip — rendered below header */\n metrics?: React.ReactNode\n /** Whether to show metrics (controlled externally) */\n showMetrics?: boolean\n /** Initial tabs (uncontrolled mode) */\n defaultTabs: ViewTab[]\n /**\n * Controlled tabs — when all four are provided, tab state is owned by the parent\n * (e.g. for localStorage). Otherwise `defaultTabs` + internal state are used.\n */\n tabs?: ViewTab[]\n onTabsChange?: (tabs: ViewTab[]) => void\n activeTabId?: string\n onActiveTabChange?: (id: string) => void\n /** Filter options per tab (e.g. All, Upcoming, Ongoing, Completed) */\n filterOptions?: FilterOption[]\n /** Label for the filter sub-menu (default: \"Filter\") */\n filterLabel?: string\n /** Get count for a tab's filter (for badge) */\n getTabCount?: (filterId: string) => number\n /** Render the content for the active tab */\n renderContent: (tab: ViewTab, updateTab: (patch: Partial<ViewTab>) => void) => React.ReactNode\n /** Export drawer props */\n exportOpen?: boolean\n onExportOpenChange?: (open: boolean) => void\n /** Row count for export; if omitted, uses `getTabCount(activeTab.filterId)` when provided */\n exportTotalRows?: number\n /**\n * Tab menu — “Edit” (e.g. open table properties). Parent can switch to table view first, then call ref.\n * Overrides `tablePropertiesRef` when both are set.\n */\n onEditView?: (tab: ViewTab, helpers: { updateTab: (patch: Partial<ViewTab>) => void }) => void\n /**\n * Ref to the active tab’s table surface (`openPropertiesDrawer`). Wires “View → Edit” to\n * `TablePropertiesDrawer` when `onEditView` is omitted.\n */\n tablePropertiesRef?: React.RefObject<OpenTablePropertiesHandle | null>\n /** When true, hide the views tab strip (tabs + add view) — e.g. search landing with a single table surface. */\n hideViewsToolbar?: boolean\n /**\n * Subset of view types the hub actually implements (e.g. List hub omits Dashboard/Folder).\n * When set, the Add view menu and ⌘1–9 shortcuts are filtered so users cannot add a view the\n * hub cannot render. Defaults to all registered view types (`DATA_LIST_VIEW_TILES`).\n *\n * Pair with `TablePropertiesDrawerButton.supportedViewTypes` to keep Properties consistent.\n */\n supportedViewTypes?: readonly DataListViewType[]\n}\n\n/** Collision-proof id for a dynamically-added tab. Module-level counters reset\n * on HMR while React state survives, so we derive from a timestamp + random. */\nfunction makeTabId(type: string): string {\n const rand = Math.random().toString(36).slice(2, 8)\n return `${type}-${Date.now().toString(36)}-${rand}`\n}\n\n/** Count pill on the views toolbar — color by lifecycle/status filter (WCAG: dark text on light inactive; light text on solid active). */\nexport function viewToolbarCountBadgeClass(filterId: string, isActive: boolean): string {\n const palettes: Record<string, { active: string; inactive: string }> = {\n all: {\n active: \"bg-slate-600 text-white dark:bg-slate-500\",\n inactive: \"bg-slate-100 text-slate-800 dark:bg-slate-800/70 dark:text-slate-100\",\n },\n upcoming: {\n active: \"bg-amber-600 text-white\",\n inactive: \"bg-amber-100 text-amber-950 dark:bg-amber-950/45 dark:text-amber-100\",\n },\n ongoing: {\n active: \"bg-blue-600 text-white\",\n inactive: \"bg-blue-100 text-blue-950 dark:bg-blue-950/45 dark:text-blue-100\",\n },\n completed: {\n active: \"bg-emerald-600 text-white\",\n inactive: \"bg-emerald-100 text-emerald-950 dark:bg-emerald-950/45 dark:text-emerald-100\",\n },\n }\n const p = palettes[filterId] ?? palettes.all\n return isActive ? p.active : p.inactive\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function ListPageTemplate({\n header,\n metrics,\n showMetrics = true,\n defaultTabs,\n tabs: tabsProp,\n onTabsChange,\n activeTabId: activeTabIdProp,\n onActiveTabChange,\n getTabCount,\n renderContent,\n exportOpen = false,\n onExportOpenChange,\n exportTotalRows = 0,\n onEditView,\n tablePropertiesRef,\n hideViewsToolbar = false,\n supportedViewTypes,\n}: ListPageTemplateProps) {\n // When a hub declares the views it implements, both the Add view menu and ⌘1–9 shortcut\n // bindings are filtered to that subset so unsupported views are never offered. Without\n // this, a user could ⌘1 → Dashboard into a hub that cannot render it (would show the\n // not-configured empty state). Memoized because it filters on every render path.\n const addableViewTypes = React.useMemo(() => {\n if (!supportedViewTypes || supportedViewTypes.length === 0) return VIEW_TYPES\n const allowed = new Set(supportedViewTypes)\n return VIEW_TYPES.filter(v => allowed.has(v.type))\n }, [supportedViewTypes])\n const controlled =\n tabsProp !== undefined &&\n onTabsChange !== undefined &&\n activeTabIdProp !== undefined &&\n onActiveTabChange !== undefined\n\n const [internalTabs, setInternalTabs] = React.useState<ViewTab[]>(defaultTabs)\n const [internalActiveId, setInternalActiveId] = React.useState(defaultTabs[0]?.id ?? \"\")\n\n const tabs = controlled ? tabsProp : internalTabs\n const setTabsState = React.useCallback(\n (action: React.SetStateAction<ViewTab[]>) => {\n if (controlled) {\n const next = typeof action === \"function\" ? action(tabsProp!) : action\n onTabsChange!(next)\n } else {\n setInternalTabs(action)\n }\n },\n [controlled, onTabsChange, tabsProp, setInternalTabs],\n )\n const activeTabId = controlled ? activeTabIdProp : internalActiveId\n const setActiveTabId = controlled ? onActiveTabChange : setInternalActiveId\n const [renameOpen, setRenameOpen] = React.useState(false)\n const [renameValue, setRenameValue] = React.useState(\"\")\n const [renameTabId, setRenameTabId] = React.useState<string | null>(null)\n const [reviewOpen, setReviewOpen] = React.useState(false)\n const [reviewTab, setReviewTab] = React.useState<ViewTab | null>(null)\n\n const activeTab = tabs.find(t => t.id === activeTabId) ?? tabs[0]\n\n const editViewFromRef = React.useMemo(\n () => (tablePropertiesRef ? createListPageEditViewHandler(tablePropertiesRef) : undefined),\n [tablePropertiesRef]\n )\n const resolvedOnEditView = onEditView ?? editViewFromRef\n\n function addView(type: ViewType) {\n const def = VIEW_TYPES.find(d => d.type === type)!\n const count = tabs.filter(t => t.viewType === type).length\n const id = makeTabId(type)\n const label = count === 0 ? def.label : `${def.label} ${count + 1}`\n const newTab: ViewTab = { id, label, viewType: type, icon: def.icon, filterId: \"all\" }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function removeTab(id: string, e: React.MouseEvent | React.KeyboardEvent) {\n e.stopPropagation()\n setTabsState(prev => {\n const next = prev.filter(t => t.id !== id)\n if (activeTabId === id && next.length > 0) {\n const idx = Math.max(0, prev.findIndex(t => t.id === id) - 1)\n setActiveTabId(next[Math.min(idx, next.length - 1)].id)\n }\n return next\n })\n }\n\n function updateTab(id: string, patch: Partial<ViewTab>) {\n setTabsState(prev => prev.map(t => t.id === id ? { ...t, ...patch } : t))\n }\n\n function duplicateTab(tab: ViewTab) {\n const id = makeTabId(tab.viewType)\n const newTab: ViewTab = {\n id,\n label: `Copy of ${tab.label}`,\n viewType: tab.viewType,\n icon: tab.icon,\n filterId: tab.filterId,\n }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function openRename(tab: ViewTab) {\n setRenameTabId(tab.id)\n setRenameValue(tab.label)\n setRenameOpen(true)\n }\n\n function commitRename() {\n if (!renameTabId) return\n const v = renameValue.trim()\n if (v) updateTab(renameTabId, { label: v })\n setRenameOpen(false)\n setRenameTabId(null)\n }\n\n return (\n <>\n {!hideViewsToolbar && addableViewTypes.slice(0, 9).map((v, i) => {\n const keys = dataListViewAddShortcut(i)\n return keys ? (\n <Shortcut\n key={v.type}\n keys={keys}\n onInvoke={() => addView(v.type)}\n />\n ) : null\n })}\n {activeTab && !hideViewsToolbar && (\n <>\n <Shortcut keys=\"F2\" onInvoke={() => openRename(activeTab)} />\n <Shortcut\n keys=\"⌘E\"\n disabled={!resolvedOnEditView}\n onInvoke={() => resolvedOnEditView?.(activeTab, { updateTab: p => updateTab(activeTab.id, p) })}\n />\n <Shortcut keys=\"⌘D\" onInvoke={() => duplicateTab(activeTab)} />\n <Shortcut keys=\"⌘I\" onInvoke={() => { setReviewTab(activeTab); setReviewOpen(true) }} />\n <Shortcut\n keys=\"⌘⌫\"\n disabled={tabs.length <= 1}\n onInvoke={(e) => removeTab(activeTab.id, e as unknown as React.KeyboardEvent)}\n />\n </>\n )}\n {header}\n\n {showMetrics && metrics}\n\n {/* ── Views toolbar (not tablist: settings/close are not tabs — WCAG 1.3.1 / ARIA) ── */}\n {!hideViewsToolbar && (\n <>\n {/* Outer: horizontal scroll only. Inner: vertical padding so ring-offset focus rings are not clipped\n (`overflow-x-auto` forces overflow-y to clip in a single box). */}\n <div className=\"mt-3 shrink-0 overflow-x-auto px-4 lg:px-6\">\n <div className=\"flex w-max items-center gap-1 py-1.5\">\n <div\n role=\"toolbar\"\n aria-label=\"Views\"\n data-slot=\"view-segmented-toolbar\"\n className={viewSegmentedToolbarClass()}\n >\n {tabs.map(tab => {\n const isActive = tab.id === activeTabId\n const isOnly = tabs.length === 1\n const count = getTabCount?.(tab.filterId)\n const tabInner = (\n <>\n <i className={cn(\"fa-light shrink-0 text-xs\", tab.icon)} aria-hidden=\"true\" />\n {tab.label}\n {count !== undefined && (\n <span\n data-slot=\"view-toolbar-count\"\n className={cn(\n \"text-xs tabular-nums rounded-full px-1 py-px min-w-[1.125rem] text-center font-semibold\",\n viewToolbarCountBadgeClass(tab.filterId, isActive),\n )}\n >\n {count}\n </span>\n )}\n </>\n )\n const viewSettingsMenu = (\n <DropdownMenu>\n <Tip label=\"View settings\" side=\"bottom\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex items-center justify-center min-h-8 min-w-6 shrink-0 rounded-e-md rounded-s-none px-0.5\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-foreground/[0.04]\",\n \"transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n aria-label=\"View settings\"\n >\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground\">\n View: {VIEW_TYPES.find(v => v.type === tab.viewType)?.label}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n\n <DropdownMenuItem\n shortcut=\"F2\"\n onSelect={() => openRename(tab)}\n >\n <i className=\"fa-light fa-pen text-xs\" aria-hidden=\"true\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!resolvedOnEditView}\n shortcut=\"⌘E\"\n onSelect={() =>\n resolvedOnEditView?.(tab, { updateTab: patch => updateTab(tab.id, patch) })\n }\n >\n <i className=\"fa-light fa-sliders text-xs\" aria-hidden=\"true\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem shortcut=\"⌘D\" onSelect={() => duplicateTab(tab)}>\n <i className=\"fa-light fa-copy text-xs\" aria-hidden=\"true\" />\n Duplicate\n </DropdownMenuItem>\n <DropdownMenuItem\n shortcut=\"⌘I\"\n onSelect={() => { setReviewTab(tab); setReviewOpen(true) }}\n >\n <i className=\"fa-light fa-clipboard-list text-xs\" aria-hidden=\"true\" />\n Review view\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n {!isOnly && (\n <DropdownMenuItem\n shortcut=\"⌘⌫\"\n onSelect={(e) => removeTab(tab.id, e as unknown as React.KeyboardEvent)}\n className=\"text-destructive focus:text-destructive\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n Remove view\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n return (\n <div key={tab.id} className=\"group relative inline-flex items-center\">\n {isActive ? (\n <div\n className={cn(\n viewSegmentedButtonClass(true),\n \"gap-0 p-0 inline-flex items-stretch\",\n )}\n >\n <button\n type=\"button\"\n aria-pressed={true}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n \"inline-flex items-center gap-1.5 ps-2.5 pe-0.5 py-1 text-xs min-h-8\",\n \"rounded-s-md rounded-e-none\",\n \"bg-transparent text-foreground font-medium\",\n \"hover:bg-foreground/[0.04]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n >\n {tabInner}\n </button>\n {viewSettingsMenu}\n </div>\n ) : (\n <button\n type=\"button\"\n aria-pressed={false}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n viewSegmentedButtonClass(false),\n /* Tighter trailing edge when remove control follows */\n !isOnly && \"pe-1.5\",\n )}\n >\n {tabInner}\n </button>\n )}\n\n {/* Close on inactive tabs — native button + 24px min target (WCAG 2.5.8) */}\n {!isActive && !isOnly && (\n <Tip side=\"bottom\" label={`Remove ${tab.label} view`}>\n <button\n type=\"button\"\n aria-label={`Remove ${tab.label} view`}\n onClick={e => removeTab(tab.id, e)}\n className=\"inline-flex items-center justify-center size-6 min-h-6 min-w-6 rounded transition-opacity opacity-0 group-hover:opacity-60 hover:!opacity-100 hover:text-destructive focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Add view */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"shrink-0 text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-sm\" aria-hidden=\"true\" />\n Add view\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Add a view</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {addableViewTypes.map((v, i) => (\n <DropdownMenuItem\n key={v.type}\n shortcut={dataListViewAddShortcut(i)}\n onSelect={() => addView(v.type)}\n >\n <i className={`fa-light ${v.icon}`} aria-hidden=\"true\" />\n {v.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </>\n )}\n\n {/* ── Content — keyed by tab so each view tab owns its height (no stale min-height). ── */}\n {activeTab ? (\n <div key={activeTab.id} className=\"flex min-h-0 flex-1 flex-col\">\n {renderContent(activeTab, patch => updateTab(activeTab.id, patch))}\n </div>\n ) : null}\n\n {/* ── Export ──────────────────────────────────────────────── */}\n {onExportOpenChange && (\n <ExportDrawer\n open={exportOpen}\n onOpenChange={onExportOpenChange}\n totalRows={exportTotalRows ?? getTabCount?.(activeTab.filterId) ?? 0}\n />\n )}\n\n <Dialog open={renameOpen} onOpenChange={setRenameOpen}>\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>Enter a new name for this view.</DialogDescription>\n </DialogHeader>\n <Input\n className=\"mt-3 h-9 text-sm\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => { if (e.key === \"Enter\") commitRename() }}\n autoFocus\n aria-label=\"View name\"\n />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setRenameOpen(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={commitRename}>\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={reviewOpen && !!reviewTab}\n onOpenChange={(open) => {\n setReviewOpen(open)\n if (!open) setReviewTab(null)\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Review view</DialogTitle>\n <DialogDescription>Summary of this view’s configuration.</DialogDescription>\n </DialogHeader>\n {reviewTab && (\n <dl className=\"mt-2 space-y-3 text-sm\">\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Name</dt>\n <dd className=\"font-medium text-foreground text-end\">{reviewTab.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">View type</dt>\n <dd className=\"text-foreground text-end\">{VIEW_TYPES.find(v => v.type === reviewTab.viewType)?.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Lifecycle filter</dt>\n <dd className=\"text-foreground text-end capitalize\">{reviewTab.filterId}</dd>\n </div>\n {getTabCount && (\n <div className=\"flex justify-between gap-4\">\n <dt className=\"text-muted-foreground\">Row count</dt>\n <dd className=\"tabular-nums text-foreground text-end\">{getTabCount(reviewTab.filterId)}</dd>\n </div>\n )}\n </dl>\n )}\n <DialogFooter>\n <Button type=\"button\" size=\"sm\" onClick={() => setReviewOpen(false)}>\n Close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport interface NestedSecondaryPanelShellProps {\n /** When false, the shell is visually hidden (no width). */\n open: boolean\n /** Icon-only rail (same width token as primary `Sidebar` collapsible icon mode). */\n compact: boolean\n children: React.ReactNode\n /** Forwarded to the outer `<nav>`. */\n \"aria-label\"?: string\n className?: string\n}\n\n/**\n * Shared chrome for a nested hub rail — full width vs icon rail.\n * Fill uses `--secondary-panel-bg` — one step lighter than `--sidebar` (elevation 1).\n */\nexport function NestedSecondaryPanelShell({\n open,\n compact,\n children,\n \"aria-label\": ariaLabel = \"Secondary navigation\",\n className,\n}: NestedSecondaryPanelShellProps) {\n return (\n <nav\n aria-label={ariaLabel}\n data-state={open ? \"open\" : \"closed\"}\n data-layout={open ? (compact ? \"icon\" : \"expanded\") : \"closed\"}\n // The Cursor IDE browser preview injects a `data-cursor-ref` attribute\n // on top-level layout roots BEFORE React hydrates (so it can target\n // them for click automation). React then sees an attribute it didn't\n // SSR and emits a hydration warning. Suppressing here only quiets the\n // warning for THIS element's own attributes — children still hydrate\n // normally and any real mismatch inside the panel will still surface.\n // Has zero effect outside the Cursor IDE preview.\n suppressHydrationWarning\n className={cn(\n \"flex flex-col overflow-hidden\",\n \"transition-[width,margin,opacity] duration-200 ease-linear\",\n open\n ? cn(\n // Match the primary sidebar: fill the full viewport height\n // (minus our 0.5rem top + 0.5rem bottom margin from `m-2` →\n // 1rem on desktop where the panel is `md:sticky md:top-2`;\n // 2rem on mobile where the panel scrolls inline and we leave\n // a little more breathing room). No upper cap so tall screens\n // get a fully-extended rail.\n \"shrink-0 m-2 mx-2 rounded-xl ring-1 ring-sidebar-border shadow-sm relative md:sticky md:top-2 bg-[var(--secondary-panel-bg)]\",\n compact\n ? \"w-12 min-w-12 max-w-12 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\"\n : \"w-64 min-w-64 max-w-64 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\",\n )\n : \"h-0 min-h-0 shrink overflow-hidden border-0 p-0 m-0 min-w-0 w-0 max-w-0 opacity-0 pointer-events-none\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\",\n open ? \"min-w-0\" : \"hidden min-w-0 w-0 p-0\",\n )}\n >\n {children}\n </div>\n </nav>\n )\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * DotPattern — dot grid revealed by a soft drifting \"cloud\" mask.\n *\n * Inspiration: Google/Apple AI loading states — a diffuse dot field that\n * softly fades in, drifts diagonally across the surface, then fades out.\n * No bright glow cores, no particles — just one or two large soft halos\n * sliding across the grid so the dots appear as an ambient cloud.\n */\n\nimport * as React from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\n width?: number\n height?: number\n x?: number\n y?: number\n cx?: number\n cy?: number\n cr?: number\n className?: string\n glow?: boolean\n /** Number of drifting soft clouds (keep small: 1–2). */\n glowCount?: number\n /** Cloud radius — large values produce a wide, diffuse reveal. */\n glowRadius?: number\n}\n\ntype Cloud = {\n key: number\n xs: string[]\n ys: string[]\n duration: number\n delay: number\n}\n\n/**\n * Tiny deterministic PRNG (mulberry32). We use a seeded RNG instead of\n * `Math.random()` so the SVG attributes emitted on the server match the\n * client's first paint — otherwise React reports a hydration mismatch and\n * has to re-paint every drifting `<motion.circle>` on mount, which is both\n * a perf cost and a visible jump.\n */\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0\n return () => {\n s = (s + 0x6d2b79f5) >>> 0\n let t = s\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nfunction hashString(str: string): number {\n // Cheap FNV-1a-style hash. Stable across SSR + CSR for the same input.\n let h = 2166136261\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\nexport function DotPattern({\n width = 14,\n height = 14,\n x = 0,\n y = 0,\n cx = 1,\n cy = 1,\n cr = 0.8,\n className,\n glow = false,\n glowCount = 2,\n glowRadius = 240,\n ...props\n}: DotPatternProps) {\n const id = React.useId()\n const maskId = `${id}-mask`\n const gradId = `${id}-grad`\n\n const clouds = React.useMemo<Cloud[]>(() => {\n const rng = mulberry32(hashString(`${id}|${glowCount}`))\n const rand = (min: number, max: number) => min + rng() * (max - min)\n return Array.from({ length: glowCount }).map((_, i) => {\n // Drift diagonally: bottom-right → top-left. Start/end partly off-canvas\n // so the cloud enters and exits softly without a visible edge.\n const startX = rand(85, 120)\n const endX = rand(-20, 15)\n const midX = (startX + endX) / 2 + rand(-6, 6)\n\n const startY = rand(85, 115)\n const endY = rand(-15, 10)\n const midY = (startY + endY) / 2 + rand(-4, 4)\n\n const duration = rand(8, 12)\n // Offset clouds by half a cycle so one is arriving as the other leaves.\n const delay = -(i / glowCount) * duration\n\n return {\n key: i,\n xs: [`${startX}%`, `${midX}%`, `${endX}%`],\n ys: [`${startY}%`, `${midY}%`, `${endY}%`],\n duration,\n delay,\n }\n })\n }, [glowCount, id])\n\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 h-full w-full fill-neutral-400/80\",\n className,\n )}\n {...props}\n >\n <defs>\n <pattern\n id={id}\n width={width}\n height={height}\n patternUnits=\"userSpaceOnUse\"\n patternContentUnits=\"userSpaceOnUse\"\n x={x}\n y={y}\n >\n <circle cx={cx} cy={cy} r={cr} />\n </pattern>\n\n {glow ? (\n <>\n {/* Very soft falloff — no visible ring edge, dots dissolve gradually. */}\n <radialGradient id={gradId}>\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"0.9\" />\n <stop offset=\"40%\" stopColor=\"white\" stopOpacity=\"0.55\" />\n <stop offset=\"75%\" stopColor=\"white\" stopOpacity=\"0.18\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n\n <mask id={maskId}>\n {clouds.map((c) => (\n <motion.circle\n key={`cloud-${c.key}`}\n r={glowRadius}\n fill={`url(#${gradId})`}\n initial={{ cx: c.xs[0], cy: c.ys[0], opacity: 0 }}\n animate={{\n cx: c.xs,\n cy: c.ys,\n // Long hold with soft fade at both ends.\n opacity: [0, 1, 1, 0],\n }}\n transition={{\n duration: c.duration,\n delay: c.delay,\n repeat: Infinity,\n ease: \"linear\",\n times: [0, 0.3, 0.7, 1],\n }}\n />\n ))}\n </mask>\n </>\n ) : null}\n </defs>\n\n {/* Dot grid — only visible inside the drifting soft clouds when glow is on. */}\n <rect\n width=\"100%\"\n height=\"100%\"\n strokeWidth={0}\n fill={`url(#${id})`}\n mask={glow ? `url(#${maskId})` : undefined}\n />\n </svg>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { ListPageViewFrame } from \"../ui/list-page-view-frame\"\nimport { DotPattern } from \"../ui/dot-pattern\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface DedicatedSearchLandingTemplateProps {\n /** Page title — string or rich node (e.g. styled heading). */\n title: React.ReactNode\n /** Primary search control (typically {@link DedicatedSearchUrlComposer}). */\n composer: React.ReactNode\n /** Optional block below composer (e.g. {@link DedicatedSearchRecents}). */\n trailing?: React.ReactNode\n /** Forwarded to {@link ListPageViewFrame}. */\n maxWidthClassName?: string\n frameClassName?: string\n gutterClassName?: string\n}\n\nconst DEFAULT_GUTTER =\n \"mx-auto flex min-h-[min(72vh,36rem)] w-full min-w-0 flex-col justify-center gap-0 px-6 py-8 sm:px-8 sm:py-10 md:px-12 md:py-12 lg:px-16\"\n\n/** Feather into page white / header so the hero never reads as a hard horizontal slab. */\nconst HERO_BACKDROP_MASK =\n \"[mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)] [-webkit-mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)]\"\n\n/**\n * Soft blurred blobs using only Ask Leo surface tints (`--leo-surface-tint-a|b` in `globals.css`).\n */\nfunction DedicatedSearchLandingBackdrop() {\n return (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 -z-10 select-none overflow-hidden\",\n HERO_BACKDROP_MASK,\n )}\n >\n <div\n className=\"absolute -left-[20%] -top-[30%] h-[min(54vmin,27rem)] w-[min(54vmin,27rem)] rounded-full blur-[76px]\"\n style={{\n background: \"radial-gradient(circle at 42% 36%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n <div\n className=\"absolute -right-[12%] top-[2%] h-[min(46vmin,23rem)] w-[min(46vmin,23rem)] rounded-full blur-[68px]\"\n style={{\n background: \"radial-gradient(circle at 48% 48%, var(--leo-surface-tint-a) 0%, transparent 66%)\",\n }}\n />\n <div\n className=\"absolute bottom-[-16%] left-[14%] h-[min(50vmin,25rem)] w-[min(50vmin,25rem)] rounded-full blur-[84px]\"\n style={{\n background: \"radial-gradient(circle at 44% 40%, var(--leo-surface-tint-b) 0%, transparent 70%)\",\n }}\n />\n <div\n className=\"absolute bottom-[4%] right-[6%] h-[min(40vmin,20rem)] w-[min(40vmin,20rem)] rounded-full blur-[60px]\"\n style={{\n background: \"radial-gradient(circle at 52% 44%, var(--leo-surface-tint-a) 0%, transparent 72%)\",\n }}\n />\n <div\n className=\"absolute left-[36%] top-[32%] h-[min(38vmin,19rem)] w-[min(38vmin,19rem)] -translate-x-1/2 rounded-full blur-[74px]\"\n style={{\n background: \"radial-gradient(circle at 50% 50%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n\n {/* Static dot field — same primitive as `AiThinkingOverlay` (no motion here). */}\n <DotPattern\n width={15}\n height={15}\n cr={0.65}\n className={cn(\n \"absolute inset-0 opacity-[0.34] mix-blend-multiply dark:opacity-[0.22] dark:mix-blend-soft-light\",\n \"fill-[color-mix(in_oklch,var(--brand-color)_14%,var(--background))]\",\n )}\n />\n </div>\n )\n}\n\n/**\n * Centered dedicated-search landing — empty `?q=` shell (hero title + composer + optional trailing).\n */\nexport function DedicatedSearchLandingTemplate({\n title,\n composer,\n trailing,\n maxWidthClassName = \"max-w-5xl\",\n frameClassName = \"min-w-0\",\n gutterClassName = DEFAULT_GUTTER,\n}: DedicatedSearchLandingTemplateProps) {\n return (\n <div className=\"relative isolate min-w-0 w-full overflow-hidden\">\n <DedicatedSearchLandingBackdrop />\n <ListPageViewFrame\n maxWidthClassName={maxWidthClassName}\n className={cn(\"relative z-10\", frameClassName)}\n gutterClassName={gutterClassName}\n >\n <header className=\"min-w-0\">\n {typeof title === \"string\" ? (\n <h1\n className=\"text-balance text-3xl font-semibold tracking-tight text-foreground sm:text-4xl\"\n style={{ fontFamily: \"var(--font-heading)\" }}\n >\n {title}\n </h1>\n ) : (\n title\n )}\n </header>\n\n <div className=\"min-w-0 mt-6 sm:mt-8\">{composer}</div>\n\n {trailing ? <div className=\"min-w-0 mt-10 sm:mt-12 md:mt-14 lg:mt-16\">{trailing}</div> : null}\n </ListPageViewFrame>\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Apply to the hub content wrapper when showing results (list surface under composer). */\nexport const DEDICATED_SEARCH_RESULTS_OUTER_CONTENT_CLASSNAME =\n \"border-t border-border/40 bg-gradient-to-b from-muted/25 via-background to-background\"\n\nexport interface DedicatedSearchResultsHeaderChromeProps {\n children: ReactNode\n className?: string\n}\n\n/**\n * Muted strip wrapping page chrome + composer on the results branch (below site header).\n */\nexport function DedicatedSearchResultsHeaderChrome({ children, className }: DedicatedSearchResultsHeaderChromeProps) {\n return <div className={cn(\"border-b border-border/50 bg-muted/15\", className)}>{children}</div>\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/lib/dev-log.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/label.tsx","../../../src/components/ui/checkbox.tsx","../../../src/components/ui/kbd.tsx","../../../src/lib/dropdown-menu-surface.ts","../../../src/components/ui/dropdown-menu.tsx","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx","../../../src/components/ui/calendar.tsx","../../../src/components/ui/input.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/components/ui/sheet.tsx","../../../src/components/ui/form.tsx","../../../src/components/ui/export-drawer.tsx","../../../src/components/ui/dialog.tsx","../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/lib/list-page-table-properties.ts","../../../src/components/ui/view-segmented-control.tsx","../../../src/components/templates/list-page.tsx","../../../src/components/templates/nested-secondary-panel-shell.tsx","../../../src/components/ui/list-page-view-frame.tsx","../../../src/components/ui/dot-pattern.tsx","../../../src/components/templates/dedicated-search-landing-template.tsx","../../../src/components/templates/dedicated-search-results-template.tsx"],"names":["TooltipPrimitive","jsxs","jsx","React","React2","Label","LabelPrimitive","cva","React3","Checkbox","motion","CheckboxPrimitive","DropdownMenuPrimitive","React4","React5","RadioGroupPrimitive","RadioGroupItem","className","props","React6","React7","Input","React8","MaskedInput","PopoverPrimitive","SheetPrimitive","React9","Slot","React10","Fragment","DialogPrimitive","React13"],"mappings":"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","file":"index.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","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Logs only in development. Use for mock flows (export, submit) instead of\n * raw `console.log`. Bundlers replace `process.env.NODE_ENV` at build time,\n * so the call site disappears entirely in production bundles.\n */\nexport function devLog(...args: unknown[]): void {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args)\n }\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst 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","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n","\"use client\"\n\n/**\n * Checkbox — Radix control + Exxat styling.\n *\n * Aligned with Shadcn Studio checkbox guidance (see shadcnstudio.com/docs/components/checkbox):\n * • Tri-state: `checked={true | false | \"indeterminate\"}` (parent “select some” rows)\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg\n * • Motion: none | pop | glow | pop-glow — uses `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Forms: `aria-invalid` from Field, `disabled`, extended hit slop (`after:`)\n * • Pair with `CheckboxLabel` + `htmlFor` / `id` for 44px-friendly targets\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst checkboxVariants = cva(\n [\n \"peer relative box-border flex shrink-0 items-center justify-center self-center rounded-[4px] border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:data-[state=indeterminate]:bg-primary dark:data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-background data-[state=indeterminate]:text-primary data-[state=indeterminate]:ring-2 data-[state=indeterminate]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n \"data-[state=indeterminate]:border-secondary data-[state=indeterminate]:bg-secondary data-[state=indeterminate]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n \"data-[state=indeterminate]:border-chart-2 data-[state=indeterminate]:bg-chart-2 data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n \"data-[state=indeterminate]:border-destructive data-[state=indeterminate]:bg-destructive data-[state=indeterminate]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n \"data-[state=indeterminate]:border-amber-500 data-[state=indeterminate]:bg-amber-500 data-[state=indeterminate]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n \"data-[state=indeterminate]:border-muted-foreground/50 data-[state=indeterminate]:bg-muted data-[state=indeterminate]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 max-h-3.5 max-w-3.5 min-h-3.5 min-w-3.5 rounded-[3px] [&_[data-slot=checkbox-indicator]_i]:text-[10px]\",\n default: \"size-4 max-h-4 max-w-4 min-h-4 min-w-4 [&_[data-slot=checkbox-indicator]_i]:text-xs\",\n lg: \"size-5 max-h-5 max-w-5 min-h-5 min-w-5 rounded-[5px] [&_[data-slot=checkbox-indicator]_i]:text-sm\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: [\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst checkboxIndicatorVariants = cva(\"grid place-content-center text-current\", {\n variants: {\n motion: {\n none: \"transition-none\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\":\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: {\n motion: \"none\",\n },\n})\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, variant, size, motion, checked, ...props }, ref) {\n const m = motion ?? \"none\"\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-variant={variant ?? \"default\"}\n data-motion={m}\n checked={checked}\n className={cn(checkboxVariants({ variant, size, motion: m }), className)}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={checkboxIndicatorVariants({ motion: m })}\n >\n {checked === \"indeterminate\" ? (\n <i className=\"fa-solid fa-minus text-current\" aria-hidden=\"true\" />\n ) : (\n <i className=\"fa-solid fa-check text-current\" aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n }\n)\n\nexport type CheckboxLabelProps = React.ComponentPropsWithRef<typeof Label>\n\n/** Label tuned for `Checkbox` siblings: larger tap target, respects `peer-disabled`. */\nfunction CheckboxLabel({ className, ...props }: CheckboxLabelProps) {\n return (\n <Label\n data-slot=\"checkbox-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Checkbox, CheckboxLabel, checkboxVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Kbd — display keyboard keys and shortcuts (shadcn/ui).\n * @see https://ui.shadcn.com/docs/components/radix/kbd\n *\n * Variants:\n * - \"tile\" (default) — filled tile with border; use in tooltips, menus, docs,\n * or any surface where the Kbd sits on neutral background.\n * - \"bare\" — no background, no border; inherits `currentColor` at 70% opacity.\n * Use **inside buttons** (primary/secondary workflow actions) so the hint\n * does not look like a pasted-on patch against the button fill.\n */\nfunction Kbd({\n className,\n variant = \"tile\",\n \"aria-hidden\": ariaHidden,\n ...props\n}: React.ComponentProps<\"kbd\"> & { variant?: \"tile\" | \"bare\" }) {\n // Bare variant lives inside buttons — the button already carries the\n // accessible name, so the inline kbd is redundant noise for screen readers.\n // Default to aria-hidden unless a consumer explicitly opts in.\n const hidden = ariaHidden ?? (variant === \"bare\" ? true : undefined)\n return (\n <kbd\n data-slot=\"kbd\"\n data-variant={variant}\n aria-hidden={hidden}\n className={cn(\n \"pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium\",\n variant === \"tile\" &&\n \"bg-muted text-muted-foreground rounded-sm border\",\n variant === \"bare\" && \"text-current/70 px-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","/**\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\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:data-[state=checked]:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n none: \"\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\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","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 { 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","\"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 { Slot } from \"radix-ui\"\nimport {\n Controller,\n FormProvider,\n useFormContext,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ ...props }: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nfunction useFormField() {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) throw new Error(\"useFormField must be used inside <FormField>\")\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue { id: string }\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"flex flex-col gap-1.5\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n const { error, formItemId } = useFormField()\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction FormMessage({ className, children, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : children\n if (!body) return null\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n )\n}\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n","\"use client\"\n\n/**\n * ExportDrawer — floating right-side drawer with export form.\n *\n * Uses the same Sheet pattern as TablePropertiesDrawer:\n * - showCloseButton={false}, showOverlay={false}\n * - Rounded, floating, inset from viewport edges\n * - Button + Tip from our own component library\n *\n * Form fields (shadcn Form + react-hook-form + zod):\n * • File format CSV · Excel · PDF (SelectionTileGrid radio)\n * • Date range From / To (FilterTextValueInput dateMDY — same as Settings / table filters)\n * • Columns All · Visible only (radio)\n * • Apply active filters (checkbox)\n *\n * WCAG 2.1 AA:\n * ✓ All inputs labelled via FormLabel linked to control id (1.3.1)\n * ✓ Error messages linked via aria-describedby (3.3.1)\n * ✓ Focus returns to trigger on close (2.4.3)\n */\n\nimport * as React from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport { z } from \"zod\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\n\nimport { devLog } from \"../../lib/dev-log\"\nimport { Button } from \"./button\"\nimport { Checkbox } from \"./checkbox\"\nimport { Label } from \"./label\"\nimport { Tip } from \"./tip\"\nimport { Kbd, KbdGroup } from \"./kbd\"\nimport { Shortcut } from \"./dropdown-menu\"\nimport { RadioGroup, RadioGroupItem, RadioGroupLabel } from \"./radio-group\"\nimport { SelectionTileGrid } from \"./selection-tile-grid\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport type { SelectionTileOption } from \"./selection-tile-grid\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"./sheet\"\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"./form\"\n\n/** Parse full MM/DD/YYYY from masked input; partial/invalid → undefined. */\nfunction parseMdyToDate(raw: string | undefined): Date | undefined {\n if (!raw?.trim()) return undefined\n const m = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!m) return undefined\n const month = Number(m[1])\n const day = Number(m[2])\n const year = Number(m[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const d = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) return undefined\n return d\n}\n\n// ── Validation schema ─────────────────────────────────────────────────────────\n\nconst EXPORT_FORMAT_OPTIONS: SelectionTileOption<\"csv\" | \"excel\" | \"pdf\">[] = [\n { value: \"csv\", label: \"CSV\", icon: \"fa-file-csv\" },\n { value: \"excel\", label: \"Excel\", icon: \"fa-file-excel\" },\n { value: \"pdf\", label: \"PDF\", icon: \"fa-file-pdf\" },\n]\n\nconst exportSchema = z\n .object({\n format: z.enum([\"csv\", \"excel\", \"pdf\"]),\n columns: z.enum([\"all\", \"visible\"]),\n dateFrom: z.string().optional(),\n dateTo: z.string().optional(),\n includeFilters: z.boolean(),\n })\n .superRefine((data, ctx) => {\n const from = parseMdyToDate(data.dateFrom)\n const to = parseMdyToDate(data.dateTo)\n if (data.dateFrom?.trim() && !from) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid from date\", path: [\"dateFrom\"] })\n }\n if (data.dateTo?.trim() && !to) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid to date\", path: [\"dateTo\"] })\n }\n if (from && to && to < from) {\n ctx.addIssue({ code: \"custom\", message: \"End date must be after start date\", path: [\"dateTo\"] })\n }\n })\n\ntype ExportForm = z.infer<typeof exportSchema>\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport interface ExportDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n totalRows?: number\n visibleColumns?: number\n}\n\nexport function ExportDrawer({\n open,\n onOpenChange,\n totalRows = 0,\n visibleColumns,\n}: ExportDrawerProps) {\n const form = useForm<ExportForm>({\n resolver: zodResolver(exportSchema),\n defaultValues: {\n format: \"csv\",\n columns: \"visible\",\n dateFrom: \"\",\n dateTo: \"\",\n includeFilters: true,\n },\n })\n\n const [isExporting, setIsExporting] = React.useState(false)\n\n async function onSubmit(values: ExportForm) {\n setIsExporting(true)\n await new Promise(r => setTimeout(r, 1200))\n devLog(\"Export:\", {\n ...values,\n dateFrom: parseMdyToDate(values.dateFrom)?.toISOString(),\n dateTo: parseMdyToDate(values.dateTo)?.toISOString(),\n })\n setIsExporting(false)\n onOpenChange(false)\n form.reset()\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n data-slot=\"export-drawer\"\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n className=\"z-[80] w-80 sm:max-w-80 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(100vh - 1rem)\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Export data</SheetTitle>\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 {/* Record count */}\n <p className=\"px-4 pb-3 text-sm text-muted-foreground -mt-1\">\n {totalRows} record{totalRows !== 1 ? \"s\" : \"\"} available for export.\n </p>\n\n {/* Form body */}\n <Form {...form}>\n <form\n id=\"export-form\"\n onSubmit={form.handleSubmit(onSubmit)}\n className=\"flex-1 overflow-y-auto\"\n >\n <div className=\"px-4 pb-4 space-y-5\">\n\n {/* File format */}\n <FormField\n control={form.control}\n name=\"format\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <SelectionTileGrid\n sectionLabel=\"File format\"\n options={EXPORT_FORMAT_OPTIONS}\n columns={3}\n value={field.value}\n onValueChange={field.onChange}\n interaction=\"radio\"\n idPrefix=\"export-fmt\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Date range */}\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium leading-none mb-2\">\n Date range{\" \"}\n <span className=\"text-muted-foreground font-normal\">(optional)</span>\n </legend>\n <div className=\"grid grid-cols-2 gap-3\">\n <FormField\n control={form.control}\n name=\"dateFrom\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-from\" className=\"text-xs text-muted-foreground\">\n From\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-from\"\n mask=\"dateMDY\"\n aria-label=\"Export from date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"dateTo\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-to\" className=\"text-xs text-muted-foreground\">\n To\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-to\"\n mask=\"dateMDY\"\n aria-label=\"Export to date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </fieldset>\n\n {/* Columns */}\n <FormField\n control={form.control}\n name=\"columns\"\n render={({ field }) => (\n <FormItem>\n <FormLabel className=\"text-sm font-medium\">Columns</FormLabel>\n <FormControl>\n <RadioGroup\n value={field.value}\n onValueChange={field.onChange}\n className=\"space-y-1.5 mt-1\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n >\n {([\n { value: \"all\", label: \"All columns\", sub: null },\n { value: \"visible\", label: \"Visible columns only\", sub: visibleColumns !== undefined ? `${visibleColumns} columns` : null },\n ] as const).map(opt => (\n <div\n key={opt.value}\n className=\"flex items-center gap-2.5 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-brand has-[[data-state=checked]]:bg-brand/10 cursor-pointer\"\n >\n <RadioGroupItem value={opt.value} id={`col-${opt.value}`} />\n <RadioGroupLabel\n htmlFor={`col-${opt.value}`}\n className=\"min-h-0 flex-1 cursor-pointer py-0 text-sm font-normal leading-none\"\n >\n {opt.label}\n {opt.sub && (\n <span className=\"text-muted-foreground ms-1.5 font-normal\">({opt.sub})</span>\n )}\n </RadioGroupLabel>\n </div>\n ))}\n </RadioGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Include filters */}\n <FormField\n control={form.control}\n name=\"includeFilters\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex items-start gap-3 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-primary\">\n <FormControl>\n <Checkbox\n id=\"include-filters\"\n checked={field.value}\n onCheckedChange={field.onChange}\n className=\"mt-0.5 shrink-0\"\n />\n </FormControl>\n <div className=\"min-w-0\">\n <Label htmlFor=\"include-filters\" className=\"text-sm cursor-pointer font-medium leading-none\">\n Apply active filters\n </Label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Export only rows matching current filters\n </p>\n </div>\n </div>\n <FormMessage />\n </FormItem>\n )}\n />\n\n </div>\n </form>\n </Form>\n\n {/* Global bindings — only active while the drawer is open (Sheet unmounts content on close) */}\n <Shortcut keys=\"Enter\" disabled={isExporting} onInvoke={() => form.handleSubmit(onSubmit)()} />\n\n {/* Footer */}\n <div className=\"flex items-center gap-2 px-4 py-3 border-t border-border\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => onOpenChange(false)}\n >\n Cancel\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">Esc</Kbd></KbdGroup>\n </Button>\n <Button\n type=\"submit\"\n form=\"export-form\"\n className=\"flex-1\"\n disabled={isExporting}\n >\n {isExporting ? (\n <>\n <i className=\"fa-light fa-spinner-third fa-spin text-[13px]\" aria-hidden=\"true\" />\n Exporting…\n </>\n ) : (\n <>\n <i className=\"fa-light fa-arrow-down-to-line text-[13px]\" aria-hidden=\"true\" />\n Export\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">⏎</Kbd></KbdGroup>\n </>\n )}\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 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 DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n /** Merged onto `DialogOverlay` (e.g. `bg-transparent` for a palette with no dimmed backdrop). */\n overlayClassName?: string\n}) {\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName ?? undefined} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm 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 {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 end-2\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","/**\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 * Connects ListPageTemplate “View → Edit” to a surface that hosts TablePropertiesDrawer\n * (PlacementsTable, TeamTable, ComplianceTable, …). Import from `@/components/table-properties`\n * or use here — see `createListPageEditViewHandler`.\n *\n * View **labels** for tabs and Properties are centralized in `@/lib/data-list-view`\n * (`DATA_LIST_VIEW_TILES`, `dataListViewLabel`, `dataListViewIcon`).\n */\n\nimport * as React from \"react\"\n\nimport { dataListViewIcon, type DataListViewType } from \"./data-list-view\"\nimport { isDataListSurfaceViewType } from \"./data-list-view-registry\"\n\nexport { isDataListSurfaceViewType }\n\n/** Minimal ref API any list/table surface exposes for the shared Properties drawer. */\nexport interface OpenTablePropertiesHandle {\n openPropertiesDrawer: () => void\n}\n\nexport interface CreateListPageEditViewHandlerOptions {\n /** Delay before opening Properties after switching to table (ms). Default 160. */\n switchDelayMs?: number\n}\n\n/**\n * Returns `ListPageTemplate`’s `onEditView` handler: optionally coerces the tab to `table`\n * when the view type is unknown, then calls `ref.current.openPropertiesDrawer()`.\n */\nexport function createListPageEditViewHandler(\n tableRef: React.RefObject<OpenTablePropertiesHandle | null>,\n options?: CreateListPageEditViewHandlerOptions\n) {\n const delay = options?.switchDelayMs ?? 160\n return (\n tab: { viewType: string },\n { updateTab }: { updateTab: (patch: { viewType?: DataListViewType; icon?: string }) => void }\n ) => {\n const mustSwitchToTableSurface = !isDataListSurfaceViewType(tab.viewType)\n if (mustSwitchToTableSurface) {\n updateTab({ viewType: \"table\", icon: dataListViewIcon(\"table\") })\n }\n window.setTimeout(() => {\n tableRef.current?.openPropertiesDrawer()\n }, mustSwitchToTableSurface ? delay : 0)\n }\n}\n","\"use client\"\n\n/**\n * Segmented “view tabs” control — same visual language as `ListPageTemplate` views toolbar\n * (`bg-muted/60` pill). Uses `role=\"radiogroup\"` + `role=\"radio\"` for exclusive choice (1.3.1).\n *\n * Keyboard: Arrow Left/Right (or Up/Down), Home, End — see onRadioKeyDown.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"./tip\"\n\nexport function viewSegmentedToolbarClass(className?: string) {\n return cn(\n \"inline-flex items-center gap-0.5 rounded-lg bg-muted/60 p-[3px]\",\n className,\n )\n}\n\nexport function viewSegmentedButtonClass(\n isActive: boolean,\n opts?: { iconOnly?: boolean },\n) {\n return cn(\n \"inline-flex items-center rounded-md transition-all whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n opts?.iconOnly\n ? \"size-8 min-h-8 min-w-8 shrink-0 justify-center p-0 text-xs\"\n : \"gap-1.5 px-2.5 py-1 text-xs min-h-8\",\n isActive\n ? \"bg-background text-foreground font-medium shadow-sm\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground\",\n )\n}\n\nexport interface ViewSegmentOption<T extends string = string> {\n value: T\n label: string\n /** Full `className` for Font Awesome icon (e.g. `fa-light fa-chart-bar`) */\n icon?: string\n}\n\nexport interface ViewSegmentedControlProps<T extends string = string> {\n value: T\n onValueChange: (value: T) => void\n options: readonly ViewSegmentOption<T>[]\n /** Accessible name for the group (required — names the radiogroup) */\n \"aria-label\": string\n /** Optional description id for `aria-describedby` (e.g. helper text) */\n \"aria-describedby\"?: string\n /** Icon-only triggers (labels in `sr-only` or visible text) */\n iconOnly?: boolean\n className?: string\n /** Tooltip on each segment (defaults to `iconOnly` — recommended for icon-only) */\n showTooltips?: boolean\n /** Tooltip position */\n tooltipSide?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function ViewSegmentedControl<T extends string>({\n value,\n onValueChange,\n options,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n iconOnly = false,\n className,\n showTooltips,\n tooltipSide = \"top\",\n}: ViewSegmentedControlProps<T>) {\n const tips = showTooltips ?? iconOnly\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n React.useLayoutEffect(() => {\n itemRefs.current = itemRefs.current.slice(0, options.length)\n }, [options.length])\n\n const focusIndex = React.useCallback(\n (index: number) => {\n const len = options.length\n if (len === 0) return\n const i = ((index % len) + len) % len\n onValueChange(options[i].value)\n requestAnimationFrame(() => {\n itemRefs.current[i]?.focus()\n })\n },\n [onValueChange, options],\n )\n\n const onRadioKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const len = options.length\n if (len === 0) return\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault()\n focusIndex(index + 1)\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault()\n focusIndex(index - 1)\n } else if (e.key === \"Home\") {\n e.preventDefault()\n focusIndex(0)\n } else if (e.key === \"End\") {\n e.preventDefault()\n focusIndex(len - 1)\n }\n },\n [focusIndex, options.length],\n )\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-slot=\"view-segmented-toolbar\"\n className={cn(viewSegmentedToolbarClass(), \"w-fit min-w-0 shrink-0\", className)}\n >\n {options.map((opt, index) => {\n const isActive = opt.value === value\n const tabIndex = isActive ? 0 : -1\n\n const button = (\n <button\n ref={el => {\n itemRefs.current[index] = el\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n aria-label={iconOnly ? opt.label : undefined}\n tabIndex={tabIndex}\n onKeyDown={e => onRadioKeyDown(e, index)}\n onClick={() => onValueChange(opt.value)}\n data-slot=\"view-segmented-item\"\n className={viewSegmentedButtonClass(isActive, { iconOnly })}\n >\n {opt.icon ? (\n <i\n className={cn(opt.icon, iconOnly ? \"text-[13px]\" : \"text-xs\")}\n aria-hidden=\"true\"\n />\n ) : null}\n {!iconOnly ? opt.label : null}\n </button>\n )\n\n return tips ? (\n <Tip key={opt.value} label={opt.label} side={tooltipSide}>\n {button}\n </Tip>\n ) : (\n <React.Fragment key={opt.value}>{button}</React.Fragment>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * ListPageTemplate — reusable template for any list-based page.\n *\n * Provides: page header slot, optional key metrics, tabbed views\n * (table/list/board/dashboard) with add/remove/configure per-tab,\n * and an export drawer.\n *\n * Usage:\n * <ListPageTemplate\n * header={<MyPageHeader />}\n * metrics={<KeyMetrics ... />}\n * defaultTabs={DEFAULT_TABS}\n * renderContent={(tab) => <MyTable members={MOCK_ROWS} view={tab.viewType} />}\n * />\n *\n * Connected views (table | list | board | dashboard) must share one `useTableState`\n * and pass `tableState.rows` into non-table surfaces — see `docs/data-views-pattern.md`\n * and `AGENTS.md` §4.\n *\n * View chrome is shared with `ViewSegmentedControl` / `viewSegmentedToolbarClass` in\n * `@/components/ui/view-segmented-control` and re-exported from `@/components/data-views`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { ExportDrawer } from \"../ui/export-drawer\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Shortcut,\n} from \"../ui/dropdown-menu\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewAddShortcut } from \"../../lib/data-list-view\"\nimport {\n createListPageEditViewHandler,\n type OpenTablePropertiesHandle,\n} from \"../../lib/list-page-table-properties\"\nimport { FULL_HUB_SUPPORTED_VIEWS } from \"../../lib/data-list-view-registry\"\nimport {\n viewSegmentedToolbarClass,\n viewSegmentedButtonClass,\n} from \"../ui/view-segmented-control\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ViewType = DataListViewType\n\n/** Same labels/icons as Properties drawer `SelectionTileGrid` — single source in `DATA_LIST_VIEW_TILES`. */\nexport const VIEW_TYPES: { type: ViewType; label: string; icon: string }[] = DATA_LIST_VIEW_TILES.map(t => ({\n type: t.value,\n label: t.label,\n icon: t.icon,\n}))\n\nexport interface FilterOption {\n id: string\n label: string\n}\n\nexport interface ViewTab {\n id: string\n label: string\n viewType: ViewType\n icon: string\n /** Optional filter key for lifecycle or category-based filtering */\n filterId: string\n}\n\nexport interface ListPageTemplateProps {\n /** Page header — rendered above metrics */\n header: React.ReactNode\n /** Optional metrics strip — rendered below header */\n metrics?: React.ReactNode\n /** Whether to show metrics (controlled externally) */\n showMetrics?: boolean\n /** Initial tabs (uncontrolled mode) */\n defaultTabs: ViewTab[]\n /**\n * Controlled tabs — when all four are provided, tab state is owned by the parent\n * (e.g. for localStorage). Otherwise `defaultTabs` + internal state are used.\n */\n tabs?: ViewTab[]\n onTabsChange?: (tabs: ViewTab[]) => void\n activeTabId?: string\n onActiveTabChange?: (id: string) => void\n /** Filter options per tab (e.g. All, Upcoming, Ongoing, Completed) */\n filterOptions?: FilterOption[]\n /** Label for the filter sub-menu (default: \"Filter\") */\n filterLabel?: string\n /** Get count for a tab's filter (for badge) */\n getTabCount?: (filterId: string) => number\n /** Render the content for the active tab */\n renderContent: (tab: ViewTab, updateTab: (patch: Partial<ViewTab>) => void) => React.ReactNode\n /** Export drawer props */\n exportOpen?: boolean\n onExportOpenChange?: (open: boolean) => void\n /** Row count for export; if omitted, uses `getTabCount(activeTab.filterId)` when provided */\n exportTotalRows?: number\n /**\n * Tab menu — “Edit” (e.g. open table properties). Parent can switch to table view first, then call ref.\n * Overrides `tablePropertiesRef` when both are set.\n */\n onEditView?: (tab: ViewTab, helpers: { updateTab: (patch: Partial<ViewTab>) => void }) => void\n /**\n * Ref to the active tab’s table surface (`openPropertiesDrawer`). Wires “View → Edit” to\n * `TablePropertiesDrawer` when `onEditView` is omitted.\n */\n tablePropertiesRef?: React.RefObject<OpenTablePropertiesHandle | null>\n /** When true, hide the views tab strip (tabs + add view) — e.g. search landing with a single table surface. */\n hideViewsToolbar?: boolean\n /**\n * Subset of view types the hub actually implements (e.g. List hub omits Dashboard/Folder).\n * When set, the Add view menu and ⌘1–9 shortcuts are filtered so users cannot add a view the\n * hub cannot render. When omitted, defaults to {@link FULL_HUB_SUPPORTED_VIEWS}\n * (table, list, board, dashboard). Pass an explicit allowlist for specialized hubs\n * (e.g. tokens table-only, library with folder/calendar).\n *\n * Pair with `TablePropertiesDrawerButton.supportedViewTypes` to keep Properties consistent.\n */\n supportedViewTypes?: readonly DataListViewType[]\n}\n\n/** Collision-proof id for a dynamically-added tab. Module-level counters reset\n * on HMR while React state survives, so we derive from a timestamp + random. */\nfunction makeTabId(type: string): string {\n const rand = Math.random().toString(36).slice(2, 8)\n return `${type}-${Date.now().toString(36)}-${rand}`\n}\n\n/** Count pill on the views toolbar — color by lifecycle/status filter (WCAG: dark text on light inactive; light text on solid active). */\nexport function viewToolbarCountBadgeClass(filterId: string, isActive: boolean): string {\n const palettes: Record<string, { active: string; inactive: string }> = {\n all: {\n active: \"bg-slate-600 text-white dark:bg-slate-500\",\n inactive: \"bg-slate-100 text-slate-800 dark:bg-slate-800/70 dark:text-slate-100\",\n },\n upcoming: {\n active: \"bg-amber-600 text-white\",\n inactive: \"bg-amber-100 text-amber-950 dark:bg-amber-950/45 dark:text-amber-100\",\n },\n ongoing: {\n active: \"bg-blue-600 text-white\",\n inactive: \"bg-blue-100 text-blue-950 dark:bg-blue-950/45 dark:text-blue-100\",\n },\n completed: {\n active: \"bg-emerald-600 text-white\",\n inactive: \"bg-emerald-100 text-emerald-950 dark:bg-emerald-950/45 dark:text-emerald-100\",\n },\n }\n const p = palettes[filterId] ?? palettes.all\n return isActive ? p.active : p.inactive\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function ListPageTemplate({\n header,\n metrics,\n showMetrics = true,\n defaultTabs,\n tabs: tabsProp,\n onTabsChange,\n activeTabId: activeTabIdProp,\n onActiveTabChange,\n getTabCount,\n renderContent,\n exportOpen = false,\n onExportOpenChange,\n exportTotalRows = 0,\n onEditView,\n tablePropertiesRef,\n hideViewsToolbar = false,\n supportedViewTypes,\n}: ListPageTemplateProps) {\n // When a hub declares the views it implements, both the Add view menu and ⌘1–9 shortcut\n // bindings are filtered to that subset so unsupported views are never offered. Without\n // this, a user could ⌘1 → Dashboard into a hub that cannot render it (would show the\n // not-configured empty state). Memoized because it filters on every render path.\n const addableViewTypes = React.useMemo(() => {\n const allowlist =\n supportedViewTypes && supportedViewTypes.length > 0\n ? supportedViewTypes\n : FULL_HUB_SUPPORTED_VIEWS\n const allowed = new Set(allowlist)\n return VIEW_TYPES.filter(v => allowed.has(v.type))\n }, [supportedViewTypes])\n const controlled =\n tabsProp !== undefined &&\n onTabsChange !== undefined &&\n activeTabIdProp !== undefined &&\n onActiveTabChange !== undefined\n\n const [internalTabs, setInternalTabs] = React.useState<ViewTab[]>(defaultTabs)\n const [internalActiveId, setInternalActiveId] = React.useState(defaultTabs[0]?.id ?? \"\")\n\n const tabs = controlled ? tabsProp : internalTabs\n const setTabsState = React.useCallback(\n (action: React.SetStateAction<ViewTab[]>) => {\n if (controlled) {\n const next = typeof action === \"function\" ? action(tabsProp!) : action\n onTabsChange!(next)\n } else {\n setInternalTabs(action)\n }\n },\n [controlled, onTabsChange, tabsProp, setInternalTabs],\n )\n const activeTabId = controlled ? activeTabIdProp : internalActiveId\n const setActiveTabId = controlled ? onActiveTabChange : setInternalActiveId\n const [renameOpen, setRenameOpen] = React.useState(false)\n const [renameValue, setRenameValue] = React.useState(\"\")\n const [renameTabId, setRenameTabId] = React.useState<string | null>(null)\n const [reviewOpen, setReviewOpen] = React.useState(false)\n const [reviewTab, setReviewTab] = React.useState<ViewTab | null>(null)\n\n const activeTab = tabs.find(t => t.id === activeTabId) ?? tabs[0]\n\n const editViewFromRef = React.useMemo(\n () => (tablePropertiesRef ? createListPageEditViewHandler(tablePropertiesRef) : undefined),\n [tablePropertiesRef]\n )\n const resolvedOnEditView = onEditView ?? editViewFromRef\n\n function addView(type: ViewType) {\n const def = VIEW_TYPES.find(d => d.type === type)!\n const count = tabs.filter(t => t.viewType === type).length\n const id = makeTabId(type)\n const label = count === 0 ? def.label : `${def.label} ${count + 1}`\n const newTab: ViewTab = { id, label, viewType: type, icon: def.icon, filterId: \"all\" }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function removeTab(id: string, e: React.MouseEvent | React.KeyboardEvent) {\n e.stopPropagation()\n setTabsState(prev => {\n const next = prev.filter(t => t.id !== id)\n if (activeTabId === id && next.length > 0) {\n const idx = Math.max(0, prev.findIndex(t => t.id === id) - 1)\n setActiveTabId(next[Math.min(idx, next.length - 1)].id)\n }\n return next\n })\n }\n\n function updateTab(id: string, patch: Partial<ViewTab>) {\n setTabsState(prev => prev.map(t => t.id === id ? { ...t, ...patch } : t))\n }\n\n function duplicateTab(tab: ViewTab) {\n const id = makeTabId(tab.viewType)\n const newTab: ViewTab = {\n id,\n label: `Copy of ${tab.label}`,\n viewType: tab.viewType,\n icon: tab.icon,\n filterId: tab.filterId,\n }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function openRename(tab: ViewTab) {\n setRenameTabId(tab.id)\n setRenameValue(tab.label)\n setRenameOpen(true)\n }\n\n function commitRename() {\n if (!renameTabId) return\n const v = renameValue.trim()\n if (v) updateTab(renameTabId, { label: v })\n setRenameOpen(false)\n setRenameTabId(null)\n }\n\n return (\n <>\n {!hideViewsToolbar && addableViewTypes.slice(0, 9).map((v, i) => {\n const keys = dataListViewAddShortcut(i)\n return keys ? (\n <Shortcut\n key={v.type}\n keys={keys}\n onInvoke={() => addView(v.type)}\n />\n ) : null\n })}\n {activeTab && !hideViewsToolbar && (\n <>\n <Shortcut keys=\"F2\" onInvoke={() => openRename(activeTab)} />\n <Shortcut\n keys=\"⌘E\"\n disabled={!resolvedOnEditView}\n onInvoke={() => resolvedOnEditView?.(activeTab, { updateTab: p => updateTab(activeTab.id, p) })}\n />\n <Shortcut keys=\"⌘D\" onInvoke={() => duplicateTab(activeTab)} />\n <Shortcut keys=\"⌘I\" onInvoke={() => { setReviewTab(activeTab); setReviewOpen(true) }} />\n <Shortcut\n keys=\"⌘⌫\"\n disabled={tabs.length <= 1}\n onInvoke={(e) => removeTab(activeTab.id, e as unknown as React.KeyboardEvent)}\n />\n </>\n )}\n {header}\n\n {showMetrics && metrics}\n\n {/* ── Views toolbar (not tablist: settings/close are not tabs — WCAG 1.3.1 / ARIA) ── */}\n {!hideViewsToolbar && (\n <>\n {/* Outer: horizontal scroll only. Inner: vertical padding so ring-offset focus rings are not clipped\n (`overflow-x-auto` forces overflow-y to clip in a single box). */}\n <div className=\"mt-3 shrink-0 overflow-x-auto px-4 lg:px-6\">\n <div className=\"flex w-max items-center gap-1 py-1.5\">\n <div\n role=\"toolbar\"\n aria-label=\"Views\"\n data-slot=\"view-segmented-toolbar\"\n className={viewSegmentedToolbarClass()}\n >\n {tabs.map(tab => {\n const isActive = tab.id === activeTabId\n const isOnly = tabs.length === 1\n const count = getTabCount?.(tab.filterId)\n const tabInner = (\n <>\n <i className={cn(\"fa-light shrink-0 text-xs\", tab.icon)} aria-hidden=\"true\" />\n {tab.label}\n {count !== undefined && (\n <span\n data-slot=\"view-toolbar-count\"\n className={cn(\n \"text-xs tabular-nums rounded-full px-1 py-px min-w-[1.125rem] text-center font-semibold\",\n viewToolbarCountBadgeClass(tab.filterId, isActive),\n )}\n >\n {count}\n </span>\n )}\n </>\n )\n const viewSettingsMenu = (\n <DropdownMenu>\n <Tip label=\"View settings\" side=\"bottom\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex items-center justify-center min-h-8 min-w-6 shrink-0 rounded-e-md rounded-s-none px-0.5\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-foreground/[0.04]\",\n \"transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n aria-label=\"View settings\"\n >\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground\">\n View: {VIEW_TYPES.find(v => v.type === tab.viewType)?.label}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n\n <DropdownMenuItem\n shortcut=\"F2\"\n onSelect={() => openRename(tab)}\n >\n <i className=\"fa-light fa-pen text-xs\" aria-hidden=\"true\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!resolvedOnEditView}\n shortcut=\"⌘E\"\n onSelect={() =>\n resolvedOnEditView?.(tab, { updateTab: patch => updateTab(tab.id, patch) })\n }\n >\n <i className=\"fa-light fa-sliders text-xs\" aria-hidden=\"true\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem shortcut=\"⌘D\" onSelect={() => duplicateTab(tab)}>\n <i className=\"fa-light fa-copy text-xs\" aria-hidden=\"true\" />\n Duplicate\n </DropdownMenuItem>\n <DropdownMenuItem\n shortcut=\"⌘I\"\n onSelect={() => { setReviewTab(tab); setReviewOpen(true) }}\n >\n <i className=\"fa-light fa-clipboard-list text-xs\" aria-hidden=\"true\" />\n Review view\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n {!isOnly && (\n <DropdownMenuItem\n shortcut=\"⌘⌫\"\n onSelect={(e) => removeTab(tab.id, e as unknown as React.KeyboardEvent)}\n className=\"text-destructive focus:text-destructive\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n Remove view\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n return (\n <div key={tab.id} className=\"group relative inline-flex items-center\">\n {isActive ? (\n <div\n className={cn(\n viewSegmentedButtonClass(true),\n \"gap-0 p-0 inline-flex items-stretch\",\n )}\n >\n <button\n type=\"button\"\n aria-pressed={true}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n \"inline-flex items-center gap-1.5 ps-2.5 pe-0.5 py-1 text-xs min-h-8\",\n \"rounded-s-md rounded-e-none\",\n \"bg-transparent text-foreground font-medium\",\n \"hover:bg-foreground/[0.04]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n >\n {tabInner}\n </button>\n {viewSettingsMenu}\n </div>\n ) : (\n <button\n type=\"button\"\n aria-pressed={false}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n viewSegmentedButtonClass(false),\n /* Tighter trailing edge when remove control follows */\n !isOnly && \"pe-1.5\",\n )}\n >\n {tabInner}\n </button>\n )}\n\n {/* Close on inactive tabs — native button + 24px min target (WCAG 2.5.8) */}\n {!isActive && !isOnly && (\n <Tip side=\"bottom\" label={`Remove ${tab.label} view`}>\n <button\n type=\"button\"\n aria-label={`Remove ${tab.label} view`}\n onClick={e => removeTab(tab.id, e)}\n className=\"inline-flex items-center justify-center size-6 min-h-6 min-w-6 rounded transition-opacity opacity-0 group-hover:opacity-60 hover:!opacity-100 hover:text-destructive focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Add view */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"shrink-0 text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-sm\" aria-hidden=\"true\" />\n Add view\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Add a view</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {addableViewTypes.map((v, i) => (\n <DropdownMenuItem\n key={v.type}\n shortcut={dataListViewAddShortcut(i)}\n onSelect={() => addView(v.type)}\n >\n <i className={`fa-light ${v.icon}`} aria-hidden=\"true\" />\n {v.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </>\n )}\n\n {/* ── Content — keyed by tab so each view tab owns its height (no stale min-height). ── */}\n {activeTab ? (\n <div key={activeTab.id} className=\"flex min-h-0 flex-1 flex-col\">\n {renderContent(activeTab, patch => updateTab(activeTab.id, patch))}\n </div>\n ) : null}\n\n {/* ── Export ──────────────────────────────────────────────── */}\n {onExportOpenChange && (\n <ExportDrawer\n open={exportOpen}\n onOpenChange={onExportOpenChange}\n totalRows={exportTotalRows ?? getTabCount?.(activeTab.filterId) ?? 0}\n />\n )}\n\n <Dialog open={renameOpen} onOpenChange={setRenameOpen}>\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>Enter a new name for this view.</DialogDescription>\n </DialogHeader>\n <Input\n className=\"mt-3 h-9 text-sm\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => { if (e.key === \"Enter\") commitRename() }}\n autoFocus\n aria-label=\"View name\"\n />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setRenameOpen(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={commitRename}>\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={reviewOpen && !!reviewTab}\n onOpenChange={(open) => {\n setReviewOpen(open)\n if (!open) setReviewTab(null)\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Review view</DialogTitle>\n <DialogDescription>Summary of this view’s configuration.</DialogDescription>\n </DialogHeader>\n {reviewTab && (\n <dl className=\"mt-2 space-y-3 text-sm\">\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Name</dt>\n <dd className=\"font-medium text-foreground text-end\">{reviewTab.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">View type</dt>\n <dd className=\"text-foreground text-end\">{VIEW_TYPES.find(v => v.type === reviewTab.viewType)?.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Lifecycle filter</dt>\n <dd className=\"text-foreground text-end capitalize\">{reviewTab.filterId}</dd>\n </div>\n {getTabCount && (\n <div className=\"flex justify-between gap-4\">\n <dt className=\"text-muted-foreground\">Row count</dt>\n <dd className=\"tabular-nums text-foreground text-end\">{getTabCount(reviewTab.filterId)}</dd>\n </div>\n )}\n </dl>\n )}\n <DialogFooter>\n <Button type=\"button\" size=\"sm\" onClick={() => setReviewOpen(false)}>\n Close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport interface NestedSecondaryPanelShellProps {\n /** When false, the shell is visually hidden (no width). */\n open: boolean\n /** Icon-only rail (same width token as primary `Sidebar` collapsible icon mode). */\n compact: boolean\n children: React.ReactNode\n /** Forwarded to the outer `<nav>`. */\n \"aria-label\"?: string\n className?: string\n}\n\n/**\n * Shared chrome for a nested hub rail — full width vs icon rail.\n * Fill uses `--secondary-panel-bg` — one step lighter than `--sidebar` (elevation 1).\n */\nexport function NestedSecondaryPanelShell({\n open,\n compact,\n children,\n \"aria-label\": ariaLabel = \"Secondary navigation\",\n className,\n}: NestedSecondaryPanelShellProps) {\n return (\n <nav\n aria-label={ariaLabel}\n data-state={open ? \"open\" : \"closed\"}\n data-layout={open ? (compact ? \"icon\" : \"expanded\") : \"closed\"}\n // The Cursor IDE browser preview injects a `data-cursor-ref` attribute\n // on top-level layout roots BEFORE React hydrates (so it can target\n // them for click automation). React then sees an attribute it didn't\n // SSR and emits a hydration warning. Suppressing here only quiets the\n // warning for THIS element's own attributes — children still hydrate\n // normally and any real mismatch inside the panel will still surface.\n // Has zero effect outside the Cursor IDE preview.\n suppressHydrationWarning\n className={cn(\n \"flex flex-col overflow-hidden\",\n \"transition-[width,margin,opacity] duration-200 ease-linear\",\n open\n ? cn(\n // Match the primary sidebar: fill the full viewport height\n // (minus our 0.5rem top + 0.5rem bottom margin from `m-2` →\n // 1rem on desktop where the panel is `md:sticky md:top-2`;\n // 2rem on mobile where the panel scrolls inline and we leave\n // a little more breathing room). No upper cap so tall screens\n // get a fully-extended rail.\n \"shrink-0 m-2 mx-2 rounded-xl ring-1 ring-sidebar-border shadow-sm relative md:sticky md:top-2 bg-[var(--secondary-panel-bg)]\",\n compact\n ? \"w-12 min-w-12 max-w-12 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\"\n : \"w-64 min-w-64 max-w-64 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\",\n )\n : \"h-0 min-h-0 shrink overflow-hidden border-0 p-0 m-0 min-w-0 w-0 max-w-0 opacity-0 pointer-events-none\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\",\n open ? \"min-w-0\" : \"hidden min-w-0 w-0 p-0\",\n )}\n >\n {children}\n </div>\n </nav>\n )\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * DotPattern — dot grid revealed by a soft drifting \"cloud\" mask.\n *\n * Inspiration: Google/Apple AI loading states — a diffuse dot field that\n * softly fades in, drifts diagonally across the surface, then fades out.\n * No bright glow cores, no particles — just one or two large soft halos\n * sliding across the grid so the dots appear as an ambient cloud.\n */\n\nimport * as React from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\n width?: number\n height?: number\n x?: number\n y?: number\n cx?: number\n cy?: number\n cr?: number\n className?: string\n glow?: boolean\n /** Number of drifting soft clouds (keep small: 1–2). */\n glowCount?: number\n /** Cloud radius — large values produce a wide, diffuse reveal. */\n glowRadius?: number\n}\n\ntype Cloud = {\n key: number\n xs: string[]\n ys: string[]\n duration: number\n delay: number\n}\n\n/**\n * Tiny deterministic PRNG (mulberry32). We use a seeded RNG instead of\n * `Math.random()` so the SVG attributes emitted on the server match the\n * client's first paint — otherwise React reports a hydration mismatch and\n * has to re-paint every drifting `<motion.circle>` on mount, which is both\n * a perf cost and a visible jump.\n */\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0\n return () => {\n s = (s + 0x6d2b79f5) >>> 0\n let t = s\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nfunction hashString(str: string): number {\n // Cheap FNV-1a-style hash. Stable across SSR + CSR for the same input.\n let h = 2166136261\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\nexport function DotPattern({\n width = 14,\n height = 14,\n x = 0,\n y = 0,\n cx = 1,\n cy = 1,\n cr = 0.8,\n className,\n glow = false,\n glowCount = 2,\n glowRadius = 240,\n ...props\n}: DotPatternProps) {\n const id = React.useId()\n const maskId = `${id}-mask`\n const gradId = `${id}-grad`\n\n const clouds = React.useMemo<Cloud[]>(() => {\n const rng = mulberry32(hashString(`${id}|${glowCount}`))\n const rand = (min: number, max: number) => min + rng() * (max - min)\n return Array.from({ length: glowCount }).map((_, i) => {\n // Drift diagonally: bottom-right → top-left. Start/end partly off-canvas\n // so the cloud enters and exits softly without a visible edge.\n const startX = rand(85, 120)\n const endX = rand(-20, 15)\n const midX = (startX + endX) / 2 + rand(-6, 6)\n\n const startY = rand(85, 115)\n const endY = rand(-15, 10)\n const midY = (startY + endY) / 2 + rand(-4, 4)\n\n const duration = rand(8, 12)\n // Offset clouds by half a cycle so one is arriving as the other leaves.\n const delay = -(i / glowCount) * duration\n\n return {\n key: i,\n xs: [`${startX}%`, `${midX}%`, `${endX}%`],\n ys: [`${startY}%`, `${midY}%`, `${endY}%`],\n duration,\n delay,\n }\n })\n }, [glowCount, id])\n\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 h-full w-full fill-neutral-400/80\",\n className,\n )}\n {...props}\n >\n <defs>\n <pattern\n id={id}\n width={width}\n height={height}\n patternUnits=\"userSpaceOnUse\"\n patternContentUnits=\"userSpaceOnUse\"\n x={x}\n y={y}\n >\n <circle cx={cx} cy={cy} r={cr} />\n </pattern>\n\n {glow ? (\n <>\n {/* Very soft falloff — no visible ring edge, dots dissolve gradually. */}\n <radialGradient id={gradId}>\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"0.9\" />\n <stop offset=\"40%\" stopColor=\"white\" stopOpacity=\"0.55\" />\n <stop offset=\"75%\" stopColor=\"white\" stopOpacity=\"0.18\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n\n <mask id={maskId}>\n {clouds.map((c) => (\n <motion.circle\n key={`cloud-${c.key}`}\n r={glowRadius}\n fill={`url(#${gradId})`}\n initial={{ cx: c.xs[0], cy: c.ys[0], opacity: 0 }}\n animate={{\n cx: c.xs,\n cy: c.ys,\n // Long hold with soft fade at both ends.\n opacity: [0, 1, 1, 0],\n }}\n transition={{\n duration: c.duration,\n delay: c.delay,\n repeat: Infinity,\n ease: \"linear\",\n times: [0, 0.3, 0.7, 1],\n }}\n />\n ))}\n </mask>\n </>\n ) : null}\n </defs>\n\n {/* Dot grid — only visible inside the drifting soft clouds when glow is on. */}\n <rect\n width=\"100%\"\n height=\"100%\"\n strokeWidth={0}\n fill={`url(#${id})`}\n mask={glow ? `url(#${maskId})` : undefined}\n />\n </svg>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { ListPageViewFrame } from \"../ui/list-page-view-frame\"\nimport { DotPattern } from \"../ui/dot-pattern\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface DedicatedSearchLandingTemplateProps {\n /** Page title — string or rich node (e.g. styled heading). */\n title: React.ReactNode\n /** Primary search control (typically {@link DedicatedSearchUrlComposer}). */\n composer: React.ReactNode\n /** Optional block below composer (e.g. {@link DedicatedSearchRecents}). */\n trailing?: React.ReactNode\n /** Forwarded to {@link ListPageViewFrame}. */\n maxWidthClassName?: string\n frameClassName?: string\n gutterClassName?: string\n}\n\nconst DEFAULT_GUTTER =\n \"mx-auto flex min-h-[min(72vh,36rem)] w-full min-w-0 flex-col justify-center gap-0 px-6 py-8 sm:px-8 sm:py-10 md:px-12 md:py-12 lg:px-16\"\n\n/** Feather into page white / header so the hero never reads as a hard horizontal slab. */\nconst HERO_BACKDROP_MASK =\n \"[mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)] [-webkit-mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)]\"\n\n/**\n * Soft blurred blobs using only Ask Leo surface tints (`--leo-surface-tint-a|b` in `globals.css`).\n */\nfunction DedicatedSearchLandingBackdrop() {\n return (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 -z-10 select-none overflow-hidden\",\n HERO_BACKDROP_MASK,\n )}\n >\n <div\n className=\"absolute -left-[20%] -top-[30%] h-[min(54vmin,27rem)] w-[min(54vmin,27rem)] rounded-full blur-[76px]\"\n style={{\n background: \"radial-gradient(circle at 42% 36%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n <div\n className=\"absolute -right-[12%] top-[2%] h-[min(46vmin,23rem)] w-[min(46vmin,23rem)] rounded-full blur-[68px]\"\n style={{\n background: \"radial-gradient(circle at 48% 48%, var(--leo-surface-tint-a) 0%, transparent 66%)\",\n }}\n />\n <div\n className=\"absolute bottom-[-16%] left-[14%] h-[min(50vmin,25rem)] w-[min(50vmin,25rem)] rounded-full blur-[84px]\"\n style={{\n background: \"radial-gradient(circle at 44% 40%, var(--leo-surface-tint-b) 0%, transparent 70%)\",\n }}\n />\n <div\n className=\"absolute bottom-[4%] right-[6%] h-[min(40vmin,20rem)] w-[min(40vmin,20rem)] rounded-full blur-[60px]\"\n style={{\n background: \"radial-gradient(circle at 52% 44%, var(--leo-surface-tint-a) 0%, transparent 72%)\",\n }}\n />\n <div\n className=\"absolute left-[36%] top-[32%] h-[min(38vmin,19rem)] w-[min(38vmin,19rem)] -translate-x-1/2 rounded-full blur-[74px]\"\n style={{\n background: \"radial-gradient(circle at 50% 50%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n\n {/* Static dot field — same primitive as `AiThinkingOverlay` (no motion here). */}\n <DotPattern\n width={15}\n height={15}\n cr={0.65}\n className={cn(\n \"absolute inset-0 opacity-[0.34] mix-blend-multiply dark:opacity-[0.22] dark:mix-blend-soft-light\",\n \"fill-[color-mix(in_oklch,var(--brand-color)_14%,var(--background))]\",\n )}\n />\n </div>\n )\n}\n\n/**\n * Centered dedicated-search landing — empty `?q=` shell (hero title + composer + optional trailing).\n */\nexport function DedicatedSearchLandingTemplate({\n title,\n composer,\n trailing,\n maxWidthClassName = \"max-w-5xl\",\n frameClassName = \"min-w-0\",\n gutterClassName = DEFAULT_GUTTER,\n}: DedicatedSearchLandingTemplateProps) {\n return (\n <div className=\"relative isolate min-w-0 w-full overflow-hidden\">\n <DedicatedSearchLandingBackdrop />\n <ListPageViewFrame\n maxWidthClassName={maxWidthClassName}\n className={cn(\"relative z-10\", frameClassName)}\n gutterClassName={gutterClassName}\n >\n <header className=\"min-w-0\">\n {typeof title === \"string\" ? (\n <h1\n className=\"text-balance text-3xl font-semibold tracking-tight text-foreground sm:text-4xl\"\n style={{ fontFamily: \"var(--font-heading)\" }}\n >\n {title}\n </h1>\n ) : (\n title\n )}\n </header>\n\n <div className=\"min-w-0 mt-6 sm:mt-8\">{composer}</div>\n\n {trailing ? <div className=\"min-w-0 mt-10 sm:mt-12 md:mt-14 lg:mt-16\">{trailing}</div> : null}\n </ListPageViewFrame>\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Apply to the hub content wrapper when showing results (list surface under composer). */\nexport const DEDICATED_SEARCH_RESULTS_OUTER_CONTENT_CLASSNAME =\n \"border-t border-border/40 bg-gradient-to-b from-muted/25 via-background to-background\"\n\nexport interface DedicatedSearchResultsHeaderChromeProps {\n children: ReactNode\n className?: string\n}\n\n/**\n * Muted strip wrapping page chrome + composer on the results branch (below site header).\n */\nexport function DedicatedSearchResultsHeaderChrome({ children, className }: DedicatedSearchResultsHeaderChromeProps) {\n return <div className={cn(\"border-b border-border/50 bg-muted/15\", className)}>{children}</div>\n}\n"]}
|