@petrarca/sonnet-ui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/alert.tsx","../src/avatar.tsx","../src/badge.tsx","../src/button.tsx","../src/icon-button.tsx","../src/tooltip.tsx","../src/simple-tooltip.tsx","../src/card.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/command.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/input.tsx","../src/DateInput/DateInput.tsx","../src/popover.tsx","../src/DateInput/Calendar.tsx","../src/TimeInput/TimeInput.tsx","../src/DateTimeInput/DateTimeInput.tsx","../src/select.tsx","../src/input-group.tsx","../src/textarea.tsx","../src/label.tsx","../src/scroll-area.tsx","../src/separator.tsx","../src/resize-handle.tsx","../src/sheet.tsx","../src/simple-group.tsx","../src/simple-stack.tsx","../src/skeleton.tsx","../src/spinner.tsx","../src/tabs.tsx","../src/stepper.tsx","../src/radix/hooks/use-as-ref.ts","../src/radix/hooks/use-isomorphic-layout-effect.ts","../src/radix/hooks/use-lazy-ref.ts","../src/EntityTable/EntityTable.tsx","../src/EntityTable/tableSchema/mergeUiSchema.ts","../src/EntityTable/tableSchema/cellRegistry.ts","../src/EntityTable/tableSchema/cellRenderers.tsx","../src/EntityTable/tableSchema/columnResolver.ts","../src/PropertyList/PropertyList.tsx","../src/PropertyList/PropertyValue.tsx","../src/EntitySelect/EntitySelect.tsx","../src/EntityTree/EntityTree.tsx","../src/TreeView/TreeView.tsx","../src/SearchInput/SearchInput.tsx","../src/SearchInput/useSearchInput.ts","../src/SearchInput/schemaAdapter.ts","../src/SearchInput/widgets/TextSearchWidget.tsx","../src/SearchInput/widgets/EnumSearchWidget.tsx","../src/SearchInput/widgets/resolveSearchWidget.ts","../src/SearchInput/widgets/index.ts","../src/Clipboard/ClipboardButton.tsx","../src/Clipboard/ClipboardItem.tsx","../src/Clipboard/ClipboardMenu.tsx","../src/Clipboard/clipboardStore.ts"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n badgeColor: {\n grape:\n \"border-transparent bg-purple-100 text-purple-800 hover:bg-purple-200 dark:bg-purple-900 dark:text-purple-200 dark:hover:bg-purple-800\",\n blue: \"border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-200 dark:hover:bg-blue-800\",\n green:\n \"border-transparent bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-200 dark:hover:bg-green-800\",\n red: \"border-transparent bg-red-100 text-red-800 hover:bg-red-200 dark:bg-red-900 dark:text-red-200 dark:hover:bg-red-800\",\n orange:\n \"border-transparent bg-orange-100 text-orange-800 hover:bg-orange-200 dark:bg-orange-900 dark:text-orange-200 dark:hover:bg-orange-800\",\n yellow:\n \"border-transparent bg-yellow-100 text-yellow-800 hover:bg-yellow-200 dark:bg-yellow-900 dark:text-yellow-200 dark:hover:bg-yellow-800\",\n teal: \"border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 dark:bg-teal-900 dark:text-teal-200 dark:hover:bg-teal-800\",\n cyan: \"border-transparent bg-cyan-100 text-cyan-800 hover:bg-cyan-200 dark:bg-cyan-900 dark:text-cyan-200 dark:hover:bg-cyan-800\",\n pink: \"border-transparent bg-pink-100 text-pink-800 hover:bg-pink-200 dark:bg-pink-900 dark:text-pink-200 dark:hover:bg-pink-800\",\n indigo:\n \"border-transparent bg-indigo-100 text-indigo-800 hover:bg-indigo-200 dark:bg-indigo-900 dark:text-indigo-200 dark:hover:bg-indigo-800\",\n violet:\n \"border-transparent bg-violet-100 text-violet-800 hover:bg-violet-200 dark:bg-violet-900 dark:text-violet-200 dark:hover:bg-violet-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, badgeColor, ...props }: BadgeProps) {\n return (\n <div\n className={cn(badgeVariants({ variant, badgeColor }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n compact: \"h-7 w-7 p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { SimpleTooltip } from \"./simple-tooltip\";\n\n/**\n * IconButton -- a compact, square icon-only button with an accessible label\n * and a tooltip. The house standard for inline affordances (rename, delete,\n * edit) and small toolbar actions across the Sonnet apps.\n *\n * - `variant` defaults to \"ghost\" (borderless, for inline/hover-reveal rows).\n * Use \"outline\" for standalone toolbar buttons.\n * - `tone=\"destructive\"` tints the hover state red (e.g. delete).\n * - The `label` is both the tooltip text and the aria-label, so the button is\n * always accessible without visible text.\n * - Do not size the icon yourself: the underlying Button forces child SVGs to\n * `size-4` (16px), so pass a bare `<Icon />` (no h-/w- class).\n * - `revealOnHover` applies the house row-action convention: the button is\n * hidden at rest and revealed when the row is hovered or the button is\n * keyboard-focused; a disabled action stays faintly visible (opacity-30)\n * rather than hidden. The row must set the `group/row` class for this.\n *\n * Usage:\n * <IconButton label=\"Delete\" tone=\"destructive\" onClick={...}>\n * <Trash2 />\n * </IconButton>\n *\n * // row-action (parent row has className=\"... group/row\"):\n * <IconButton label=\"Edit\" revealOnHover onClick={...}><Pencil /></IconButton>\n */\nexport interface IconButtonProps\n extends Omit<ButtonProps, \"size\" | \"children\" | \"aria-label\"> {\n /** Tooltip text and accessible label. */\n label: string;\n /** The icon to render. */\n children: React.ReactNode;\n /** Hover tone. \"destructive\" tints hover red. Default \"default\". */\n tone?: \"default\" | \"destructive\";\n /** Tooltip side. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /**\n * Row-action reveal: hidden at rest, shown on row hover (`group/row`) or\n * keyboard focus. Disabled buttons stay at opacity-30 instead of hidden, so\n * the affordance reads as \"present but unavailable\". Default false.\n */\n revealOnHover?: boolean;\n}\n\n// The house row-action reveal convention (matches EntityTable's RowActionCell):\n// hidden until the row is hovered or the button focused; a disabled action\n// stays faintly visible rather than hidden. The `disabled:` variant is used so\n// it overrides Button's base `disabled:opacity-50` (tailwind-merge resolves the\n// conflicting disabled-opacity utilities to this one).\nfunction revealClass(disabled: boolean | undefined): string {\n return disabled\n ? \"disabled:opacity-30 group-hover/row:disabled:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\";\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButton(\n {\n label,\n children,\n tone = \"default\",\n variant = \"ghost\",\n tooltipSide,\n revealOnHover = false,\n className,\n disabled,\n ...props\n },\n ref,\n ) {\n const toneClass =\n variant === \"ghost\"\n ? tone === \"destructive\"\n ? \"text-muted-foreground hover:text-destructive\"\n : \"text-muted-foreground hover:text-foreground\"\n : tone === \"destructive\"\n ? \"hover:text-destructive\"\n : undefined;\n return (\n <SimpleTooltip label={label} side={tooltipSide}>\n <Button\n ref={ref}\n type=\"button\"\n size=\"compact\"\n variant={variant}\n aria-label={label}\n disabled={disabled}\n className={cn(\n toneClass,\n revealOnHover && revealClass(disabled),\n className,\n )}\n {...props}\n >\n {children}\n </Button>\n </SimpleTooltip>\n );\n },\n);\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\ninterface SimpleTooltipProps {\n label: React.ReactNode;\n children: React.ReactElement;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n delayDuration?: number;\n sideOffset?: number;\n}\n\n/**\n * Simplified Tooltip wrapper that matches Mantine's simple API.\n * Usage: <SimpleTooltip label=\"Click me\"><Button>Click</Button></SimpleTooltip>\n */\nexport function SimpleTooltip({\n label,\n children,\n side,\n align,\n delayDuration = 700,\n sideOffset,\n}: SimpleTooltipProps) {\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} align={align} sideOffset={sideOffset}>\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"grid place-content-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","import * as React from \"react\";\nimport { type DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Dialog, DialogContent } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n // Focus: a quiet 1px halo plus a tinted border. Chrome matches\n // :focus-visible on text fields even for mouse clicks, so a heavy\n // ring would fire on every click into a field.\n \"flex h-10 w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n\n/** Renders a field-level error message below an input. */\nexport function InputError({\n error,\n}: {\n error: string | undefined;\n}): React.ReactElement | null {\n if (!error) return null;\n return <p className=\"mt-1 text-sm text-destructive\">{error}</p>;\n}\n","/**\n * DateInput -- text input with a calendar popover for a single date.\n *\n * The value is a partial ISO 8601 date string -- `\"YYYY\"`, `\"YYYY-MM\"`, or\n * `\"YYYY-MM-DD\"` depending on `precision`. Typed entry is parsed leniently\n * (see {@link parseDate}); `\"t\"`, `\"today\"`, or `\".\"` enter the current date;\n * calendar selection drills down to the terminal precision. Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport {\n cn,\n compileDateFormat,\n parseDate,\n formatDateInput,\n formatIsoDate,\n parseIsoDate,\n getLocaleDateFormat,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\nimport { Input, InputError } from \"../input\";\nimport { Popover, PopoverTrigger, PopoverContent } from \"../popover\";\nimport { Calendar } from \"./Calendar\";\n\nexport interface DateInputProps {\n /** Partial ISO date string (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`), or \"\". */\n value?: string;\n /** Called with the new partial ISO date string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Selection precision. Default `\"day\"`. */\n precision?: DatePrecision;\n /** BCP-47 locale override for display/parsing. Defaults to the app locale. */\n locale?: string;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function DateInput({\n value,\n onChange,\n precision = \"day\",\n locale,\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: DateInputProps): React.ReactElement {\n const resolvedLocale = useLocale(locale);\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const fmt = React.useMemo(\n () =>\n compileDateFormat({\n format: getLocaleDateFormat(resolvedLocale, precision),\n }),\n [resolvedLocale, precision],\n );\n\n const selectedDate = React.useMemo(() => parseIsoDate(value), [value]);\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(selectedDate ? formatDateInput(selectedDate, fmt) : \"\");\n setParseError(\"\");\n }, [selectedDate, fmt]);\n\n const commit = (date: Date | null): void => {\n onChange(date ? formatIsoDate(date, precision) : \"\");\n };\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n commit(null);\n onBlur?.();\n return;\n }\n const result = parseDate(inputValue, fmt);\n if (result.date) {\n setInputValue(result.value);\n setParseError(\"\");\n commit(result.date);\n } else {\n setParseError(result.error || \"Invalid date\");\n }\n onBlur?.();\n };\n\n const handleCalendarSelect = (date: Date): void => {\n setInputValue(formatDateInput(date, fmt));\n setParseError(\"\");\n commit(date);\n setOpen(false);\n };\n\n const shownError = error || parseError;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n handleBlur();\n setOpen(false);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n }\n }}\n placeholder={placeholder ?? fmt.format}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Open calendar\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <CalendarIcon size={16} />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-auto p-2\">\n <Calendar\n value={selectedDate}\n onSelect={handleCalendarSelect}\n precision={precision}\n locale={resolvedLocale}\n />\n </PopoverContent>\n </Popover>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","/**\n * Calendar -- month/year/decade grid for selecting a single day.\n *\n * A controlled, dependency-light calendar operating on native `Date`. Renders\n * three drill-down views (days, months, years) with header navigation. Styling\n * uses semantic design tokens only.\n */\n\nimport * as React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport {\n cn,\n getWeekdayLabels,\n getFirstDayOfWeek,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\n\ntype CalendarView = \"days\" | \"months\" | \"years\";\n\n// Map a target precision to the calendar view at which selection is terminal.\nconst TERMINAL_VIEW: Record<DatePrecision, CalendarView> = {\n year: \"years\",\n month: \"months\",\n day: \"days\",\n};\n\nexport interface CalendarProps {\n /** Currently selected day, or null. */\n value: Date | null;\n /** Called when the user picks a date at the terminal precision. */\n onSelect: (date: Date) => void;\n /** Month shown when no value is selected. Defaults to today. */\n defaultViewDate?: Date;\n /**\n * Precision at which selection completes: `\"year\"` stops on the years view,\n * `\"month\"` on the months view, `\"day\"` on the days view (default).\n */\n precision?: DatePrecision;\n /** BCP-47 locale for month/weekday labels and week-start. */\n locale?: string;\n}\n\nfunction sameDay(a: Date, b: Date): boolean {\n return (\n a.getDate() === b.getDate() &&\n a.getMonth() === b.getMonth() &&\n a.getFullYear() === b.getFullYear()\n );\n}\n\nfunction monthName(month: number, locale: string): string {\n // Use a fixed safe day (1) to avoid month overflow on day 29-31.\n return new Date(2000, month, 1).toLocaleDateString(locale, { month: \"long\" });\n}\n\nfunction decadeStart(year: number): number {\n return Math.floor(year / 10) * 10;\n}\n\n// Cells for the visible month, padded with blanks before the first weekday,\n// respecting the locale's first day of week.\nfunction buildDayCells(viewDate: Date, firstDay: number): Array<Date | null> {\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n const weekday = new Date(year, month, 1).getDay();\n const leadingBlanks = (weekday - firstDay + 7) % 7;\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n\n const cells: Array<Date | null> = [];\n for (let i = 0; i < leadingBlanks; i++) cells.push(null);\n for (let day = 1; day <= daysInMonth; day++)\n cells.push(new Date(year, month, day));\n return cells;\n}\n\nfunction DaysView({\n viewDate,\n value,\n onSelect,\n locale,\n}: {\n viewDate: Date;\n value: Date | null;\n onSelect: (date: Date) => void;\n locale: string;\n}): React.ReactElement {\n const firstDay = getFirstDayOfWeek(locale);\n const cells = buildDayCells(viewDate, firstDay);\n const weekdayLabels = getWeekdayLabels(locale);\n const today = new Date();\n\n return (\n <>\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {weekdayLabels.map((label) => (\n <div\n key={label}\n className=\"text-center text-xs font-medium text-muted-foreground\"\n >\n {label}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {cells.map((date, index) => {\n if (!date) return <div key={`blank-${index}`} className=\"h-8 w-8\" />;\n const isSelected = value ? sameDay(date, value) : false;\n const isToday = sameDay(date, today);\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n onClick={() => onSelect(date)}\n className={cn(\n \"h-8 w-8 rounded-full text-center text-sm\",\n isToday && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </>\n );\n}\n\nfunction MonthsView({\n viewDate,\n value,\n onPick,\n locale,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (month: number) => void;\n locale: string;\n}): React.ReactElement {\n const now = new Date();\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 12 }, (_, month) => {\n const isCurrent =\n month === now.getMonth() &&\n viewDate.getFullYear() === now.getFullYear();\n const isSelected =\n !!value &&\n month === value.getMonth() &&\n viewDate.getFullYear() === value.getFullYear();\n return (\n <button\n key={month}\n type=\"button\"\n onClick={() => onPick(month)}\n className={cn(\n \"rounded py-2 text-center text-sm\",\n isCurrent && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {monthName(month, locale)}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction YearsView({\n viewDate,\n value,\n onPick,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (year: number) => void;\n}): React.ReactElement {\n const now = new Date().getFullYear();\n const start = decadeStart(viewDate.getFullYear());\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 10 }, (_, i) => {\n const year = start + i;\n const isSelected = !!value && year === value.getFullYear();\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => onPick(year)}\n className={cn(\n \"rounded py-2 text-center text-sm\",\n year === now && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction headerText(\n view: CalendarView,\n viewDate: Date,\n locale: string,\n): string {\n if (view === \"months\") return viewDate.getFullYear().toString();\n if (view === \"years\") {\n const start = decadeStart(viewDate.getFullYear());\n return `${start} - ${start + 9}`;\n }\n return `${monthName(viewDate.getMonth(), locale)} ${viewDate.getFullYear()}`;\n}\n\n// Step the visible range by the unit appropriate to the active view.\nfunction shiftViewDate(\n view: CalendarView,\n viewDate: Date,\n direction: 1 | -1,\n): Date {\n if (view === \"months\") {\n return new Date(viewDate.getFullYear() + direction, viewDate.getMonth(), 1);\n }\n if (view === \"years\") {\n return new Date(decadeStart(viewDate.getFullYear()) + direction * 10, 0, 1);\n }\n return new Date(viewDate.getFullYear(), viewDate.getMonth() + direction, 1);\n}\n\nexport function Calendar({\n value,\n onSelect,\n defaultViewDate,\n precision = \"day\",\n locale,\n}: CalendarProps): React.ReactElement {\n const resolvedLocale = useLocale(locale);\n const terminalView = TERMINAL_VIEW[precision];\n const [view, setView] = React.useState<CalendarView>(terminalView);\n const [viewDate, setViewDate] = React.useState<Date>(\n value ?? defaultViewDate ?? new Date(),\n );\n\n React.useEffect(() => {\n if (value) setViewDate(value);\n }, [value]);\n\n const handleMonthPick = (month: number): void => {\n const next = new Date(viewDate.getFullYear(), month, 1);\n if (precision === \"month\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"days\");\n };\n\n const handleYearPick = (year: number): void => {\n const next = new Date(year, viewDate.getMonth(), 1);\n if (precision === \"year\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"months\");\n };\n\n // The header drills up one level (days -> months -> years) so the user can\n // quickly jump to a distant year. Drilling down is bounded by precision in\n // handleMonthPick / handleYearPick.\n const canDrillUp = view !== \"years\";\n const drillUp = (): void => setView(view === \"days\" ? \"months\" : \"years\");\n\n return (\n <div className=\"w-64\">\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, -1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Previous\"\n >\n <ChevronLeft size={16} />\n </button>\n <button\n type=\"button\"\n onClick={canDrillUp ? drillUp : undefined}\n disabled={!canDrillUp}\n className={cn(\n \"rounded px-2 py-1 font-medium\",\n canDrillUp && \"hover:bg-state-hover\",\n )}\n >\n {headerText(view, viewDate, resolvedLocale)}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, 1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Next\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n\n {view === \"days\" && (\n <DaysView\n viewDate={viewDate}\n value={value}\n onSelect={onSelect}\n locale={resolvedLocale}\n />\n )}\n {view === \"months\" && (\n <MonthsView\n viewDate={viewDate}\n value={value}\n onPick={handleMonthPick}\n locale={resolvedLocale}\n />\n )}\n {view === \"years\" && (\n <YearsView viewDate={viewDate} value={value} onPick={handleYearPick} />\n )}\n </div>\n );\n}\n","/**\n * TimeInput -- text input for a zone-free time of day.\n *\n * The value is a normalized ISO time string -- `\"HH:mm\"` (minute granularity,\n * default) or `\"HH:mm:ss\"` (second granularity). A time of day carries no date\n * and no timezone (Temporal.PlainTime); consumers that need an instant combine\n * it with a date and zone at persistence time. Typed entry is parsed leniently\n * (see {@link parseTime}); `\"n\"`, `\"now\"`, or `\".\"` enter the current time.\n * Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport {\n cn,\n parseTime,\n normalizeTime,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { Input, InputError } from \"../input\";\n\nexport interface TimeInputProps {\n /** Normalized ISO time string (`\"HH:mm\"` or `\"HH:mm:ss\"`), or \"\". */\n value?: string;\n /** Called with the new normalized ISO time string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function TimeInput({\n value,\n onChange,\n granularity = \"minute\",\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: TimeInputProps): React.ReactElement {\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const normalized = React.useMemo(\n () => normalizeTime(value, granularity),\n [value, granularity],\n );\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(normalized);\n setParseError(\"\");\n }, [normalized]);\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n onChange(\"\");\n onBlur?.();\n return;\n }\n const result = parseTime(inputValue, granularity);\n if (result.value) {\n setInputValue(result.value);\n setParseError(\"\");\n onChange(result.value);\n } else {\n setParseError(result.error || \"Invalid time\");\n }\n onBlur?.();\n };\n\n const shownError = error || parseError;\n const placeholderText =\n placeholder ?? (granularity === \"second\" ? \"HH:MM:SS\" : \"HH:MM\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n inputMode=\"numeric\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") handleBlur();\n }}\n placeholder={placeholderText}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground\">\n <Clock size={16} />\n </span>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","/**\n * DateTimeInput -- combined date + time entry for a plain wall-clock datetime.\n *\n * The value is a plain wall-clock ISO string `\"YYYY-MM-DDTHH:mm[:ss]\"` with no\n * timezone (Temporal.PlainDateTime). Timezone is intentionally not part of the\n * input: a wall-clock datetime means \"this local time\", and resolving it to an\n * absolute instant (UTC) is the consumer's responsibility at persistence time.\n *\n * The optional `timeZone` prop is a pass-through context value (e.g. a clinic's\n * zone supplied programmatically) shown as a hint -- it is never applied to the\n * value and is never entered by the user. Cross-zone apps that need an explicit\n * zone picker should compose one separately.\n *\n * Composes {@link DateInput} (day precision) and {@link TimeInput}.\n */\n\nimport * as React from \"react\";\nimport {\n cn,\n splitDateTime,\n joinDateTime,\n formatIsoDate,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { DateInput } from \"../DateInput\";\nimport { TimeInput } from \"../TimeInput\";\n\nexport interface DateTimeInputProps {\n /** Plain wall-clock ISO datetime `\"YYYY-MM-DDTHH:mm[:ss]\"`, or \"\". */\n value?: string;\n /** Called with the new plain wall-clock ISO datetime, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n /**\n * Optional timezone context (IANA id, e.g. `\"Europe/Berlin\"`). Shown as a\n * hint only; never applied to the value and never user-entered.\n */\n timeZone?: string;\n /** BCP-47 locale override for the date part. Defaults to the app locale. */\n locale?: string;\n idPrefix?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function DateTimeInput({\n value,\n onChange,\n granularity = \"minute\",\n timeZone,\n locale,\n idPrefix,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: DateTimeInputProps): React.ReactElement {\n const { date, time } = React.useMemo(() => splitDateTime(value), [value]);\n\n const handleDateChange = (nextDate: string): void => {\n onChange(joinDateTime(nextDate, time));\n };\n\n const handleTimeChange = (nextTime: string): void => {\n if (!nextTime) {\n onChange(date ? joinDateTime(date, \"\") : \"\");\n return;\n }\n // Entering a time before a date (e.g. via the \"now\" shorthand) defaults\n // the date to today so the result is a complete datetime.\n onChange(joinDateTime(date || formatIsoDate(new Date()), nextTime));\n };\n\n return (\n <div className={cn(\"space-y-1\", className)}>\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <DateInput\n id={idPrefix ? `${idPrefix}-date` : undefined}\n value={date}\n onChange={handleDateChange}\n locale={locale}\n error={error}\n required={required}\n disabled={disabled}\n onBlur={onBlur}\n />\n </div>\n <div className=\"w-32\">\n <TimeInput\n id={idPrefix ? `${idPrefix}-time` : undefined}\n value={time}\n onChange={handleTimeChange}\n granularity={granularity}\n disabled={disabled}\n onBlur={onBlur}\n />\n </div>\n </div>\n {timeZone && (\n <p className=\"text-xs text-tertiary-foreground\">Times in {timeZone}</p>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-60\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\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 border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]\",\n \"h-9 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:ring-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium 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 pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5\",\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)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] 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 \"text-muted-foreground flex items-center gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\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 focus-visible:ring-0 dark: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-3 shadow-none focus-visible:ring-0 dark: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\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n // Focus treatment matches Input -- see the note there.\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","import * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref,\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nexport interface ResizeHandleProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Orientation of the handle bar:\n * - \"vertical\" (default): a vertical bar separating LEFT/RIGHT panes\n * (drag horizontally). Uses `cursor-col-resize`.\n * - \"horizontal\": a horizontal bar separating TOP/BOTTOM panes\n * (drag vertically). Uses `cursor-row-resize`.\n */\n orientation?: \"vertical\" | \"horizontal\";\n /** Length of the centered grip in pixels. Defaults to 48. */\n gripLength?: number;\n}\n\n/**\n * ResizeHandle — a quiet, flat draggable divider between two resizable panes.\n *\n * Renders a wide invisible hit-area with a short centered grip (quiet\n * `bg-border` at rest, `bg-border-strong` on hover), a focus ring, and the\n * correct `role=\"separator\"` / `aria-orientation` / resize cursor. No\n * full-height seam line — the adjacent panes own their own edges.\n *\n * The consumer owns the resize math: wire `onPointerDown` (and optionally\n * `onDoubleClick`, `tabIndex`, `aria-valuenow`/min/max) via props.\n *\n * @example\n * <ResizeHandle\n * orientation=\"vertical\"\n * aria-valuenow={width}\n * aria-valuemin={MIN}\n * aria-valuemax={MAX}\n * onPointerDown={startResize}\n * onDoubleClick={resetWidth}\n * />\n */\nexport const ResizeHandle = React.forwardRef<HTMLDivElement, ResizeHandleProps>(\n (\n { orientation = \"vertical\", gripLength = 48, className, style, ...props },\n ref,\n ) => {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 select-none touch-none items-center justify-center rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n isVertical\n ? \"mx-1 w-2 cursor-col-resize\"\n : \"my-1 h-2 cursor-row-resize\",\n className,\n )}\n style={style}\n {...props}\n >\n {/* Centered short grip — no full-height seam line. */}\n <div\n className=\"pointer-events-none absolute rounded-full bg-border transition-colors group-hover:bg-border-strong\"\n style={\n isVertical\n ? { width: 4, height: gripLength }\n : { height: 4, width: gripLength }\n }\n />\n </div>\n );\n },\n);\nResizeHandle.displayName = \"ResizeHandle\";\n","/**\n * Sheet — a slide-over panel (drawer) built on Radix Dialog.\n * Slides in from the right edge. Used for create/edit/detail operations.\n *\n * SheetContent accepts an optional `offsetTop` (CSS length, e.g. \"3rem\")\n * to push the panel below a fixed header. The overlay is unaffected so the\n * backdrop still covers the full screen.\n */\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Sheet = DialogPrimitive.Root;\nconst SheetTrigger = DialogPrimitive.Trigger;\nconst SheetClose = DialogPrimitive.Close;\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n side?: \"right\" | \"left\";\n /** CSS length (e.g. \"3rem\" or \"0px\") controlling where the panel starts vertically. Internal use — prefer PanelOptions.coverage at the shell API level. */\n offsetTop?: string;\n }\n>(\n (\n { className, children, side = \"right\", offsetTop = \"0px\", style, ...props },\n ref,\n ) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 flex flex-col bg-background shadow-xl transition-transform duration-300 ease-in-out\",\n \"bottom-0 w-[480px] max-w-[90vw] border-l\",\n side === \"right\" &&\n \"right-0 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n side === \"left\" &&\n \"left-0 border-l-0 border-r data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\n className,\n )}\n style={{ top: offsetTop, ...style }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = \"SheetContent\";\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"shrink-0 border-b px-6 py-4\", className)} {...props} />\n);\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = \"SheetTitle\";\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground mt-1\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = \"SheetDescription\";\n\nconst SheetBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex-1 overflow-y-auto px-6 py-4\", className)}\n {...props}\n />\n);\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"shrink-0 border-t px-6 py-4 flex justify-end gap-2\",\n className,\n )}\n {...props}\n />\n);\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetOverlay,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n};\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n \"flex-start\": \"items-start\",\n \"flex-end\": \"items-end\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n \"space-between\": \"justify-between\",\n \"flex-start\": \"justify-start\",\n \"flex-end\": \"justify-end\",\n} as const;\n\nconst wrapMap = {\n wrap: \"flex-wrap\",\n nowrap: \"flex-nowrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n} as const;\n\nconst mtMap: Record<string, string> = {\n xs: \"mt-1\",\n sm: \"mt-2\",\n md: \"mt-4\",\n lg: \"mt-6\",\n xl: \"mt-8\",\n};\n\ninterface SimpleGroupProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n wrap?: keyof typeof wrapMap;\n grow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n mt?: keyof typeof mtMap;\n onClick?: () => void;\n}\n\n/**\n * SimpleGroup - A horizontal flex container component\n *\n * Replaces Mantine's Group with a simpler Tailwind-based implementation.\n * Defaults to flex-row (horizontal layout).\n *\n * @example\n * <SimpleGroup gap=\"sm\" justify=\"between\">\n * <div>Left item</div>\n * <div>Right item</div>\n * </SimpleGroup>\n */\nexport function SimpleGroup({\n children,\n gap = \"md\",\n align,\n justify,\n wrap,\n grow = false,\n className,\n style,\n mt,\n onClick,\n}: SimpleGroupProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n const wrapClass = wrap ? wrapMap[wrap] : undefined;\n const growClass = grow ? \"[&>*]:flex-1\" : undefined;\n const mtClass = mt ? mtMap[mt] : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-row\",\n gapClass,\n alignClass,\n justifyClass,\n wrapClass,\n growClass,\n mtClass,\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n} as const;\n\ninterface SimpleStackProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n className?: string;\n style?: React.CSSProperties;\n h?: number | string;\n}\n\n/**\n * SimpleStack - A vertical flex container component\n *\n * Replaces Mantine's Stack with a simpler Tailwind-based implementation.\n * Defaults to flex-col (vertical stacking).\n *\n * @example\n * <SimpleStack gap=\"md\" align=\"center\">\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </SimpleStack>\n */\nexport function SimpleStack({\n children,\n gap = \"md\",\n align,\n justify,\n className,\n style,\n h,\n}: SimpleStackProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n\n const heightStyle =\n h !== undefined\n ? { height: typeof h === \"number\" ? `${h}px` : h }\n : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n gapClass,\n alignClass,\n justifyClass,\n className,\n )}\n style={{ ...heightStyle, ...style }}\n >\n {children}\n </div>\n );\n}\n","import { cn } from \"@petrarca/sonnet-core\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import { cn } from \"@petrarca/sonnet-core\";\n\ninterface SpinnerProps {\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-2\",\n lg: \"h-12 w-12 border-3\",\n};\n\n/**\n * Simple loading spinner component\n *\n * Replaces Mantine's Loader component\n *\n * @example\n * ```tsx\n * <Spinner />\n * <Spinner size=\"lg\" />\n * <Spinner className=\"text-blue-500\" />\n * ```\n */\nexport function Spinner({ className, size = \"md\" }: SpinnerProps) {\n return (\n <div\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\",\n sizeClasses[size],\n className,\n )}\n role=\"status\"\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Tabs = TabsPrimitive.Root;\n\ninterface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n /** Alignment of tabs: 'start' (left), 'center', or 'end' (right). Default: 'start' */\n align?: \"start\" | \"center\" | \"end\";\n}\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, align = \"start\", ...props }, ref) => {\n const alignClass =\n align === \"center\"\n ? \"justify-center\"\n : align === \"end\"\n ? \"justify-end\"\n : \"justify-start\";\n\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center rounded-md bg-muted p-1 text-muted-foreground\",\n alignClass,\n className,\n )}\n {...props}\n />\n );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"data-[state=inactive]:hidden\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\n/**\n * TabsSeparator -- a thin, non-interactive vertical divider placed inside a\n * TabsList to visually group related triggers (e.g. preview tabs vs. source\n * tabs). Presentational only; not part of the roving-tabindex order.\n */\nconst TabsSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n \"mx-2 h-6 w-0.5 shrink-0 rounded-full bg-muted-foreground/40\",\n className,\n )}\n {...props}\n />\n));\nTabsSeparator.displayName = \"TabsSeparator\";\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsSeparator };\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport {\n Direction as DirectionPrimitive,\n Slot as SlotPrimitive,\n} from \"radix-ui\";\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@petrarca/sonnet-core\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useAsRef } from \"./radix/hooks/use-as-ref\";\nimport { useIsomorphicLayoutEffect } from \"./radix/hooks/use-isomorphic-layout-effect\";\nimport { useLazyRef } from \"./radix/hooks/use-lazy-ref\";\n\nconst ROOT_NAME = \"Stepper\";\nconst LIST_NAME = \"StepperList\";\nconst ITEM_NAME = \"StepperItem\";\nconst TRIGGER_NAME = \"StepperTrigger\";\nconst INDICATOR_NAME = \"StepperIndicator\";\nconst SEPARATOR_NAME = \"StepperSeparator\";\nconst TITLE_NAME = \"StepperTitle\";\nconst DESCRIPTION_NAME = \"StepperDescription\";\nconst CONTENT_NAME = \"StepperContent\";\nconst PREV_NAME = \"StepperPrev\";\nconst NEXT_NAME = \"StepperNext\";\n\nconst ENTRY_FOCUS = \"stepperFocusGroup.onEntryFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\nconst ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\ntype Direction = \"ltr\" | \"rtl\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype NavigationDirection = \"next\" | \"prev\";\ntype ActivationMode = \"automatic\" | \"manual\";\ntype DataState = \"inactive\" | \"active\" | \"completed\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype ListElement = React.ComponentRef<typeof StepperList>;\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>;\n\nfunction getId(\n id: string,\n variant: \"trigger\" | \"content\" | \"title\" | \"description\",\n value: string,\n) {\n return `${id}-${variant}-${value}`;\n}\n\ntype FocusIntent = \"first\" | \"last\" | \"prev\" | \"next\";\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\",\n};\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\"\n ? \"ArrowRight\"\n : key === \"ArrowRight\"\n ? \"ArrowLeft\"\n : key;\n}\n\nfunction getFocusIntent(\n event: React.KeyboardEvent<TriggerElement>,\n dir?: Direction,\n orientation?: Orientation,\n) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key))\n return undefined;\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key))\n return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nfunction focusFirst(\n candidates: React.RefObject<TriggerElement | null>[],\n preventScroll = false,\n) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>(\n (_, index) => array[(startIndex + index) % array.length] as T,\n );\n}\n\n/**\n * Handles Enter/Space key activation for manual and non-interactive modes.\n * Returns true if the event was handled (caller should return early).\n */\nfunction handleActivationKeys(\n event: React.KeyboardEvent<TriggerElement>,\n nonInteractive: boolean,\n activationMode: ActivationMode,\n isDisabled: boolean | undefined,\n triggerRef: React.RefObject<TriggerElement | null>,\n): boolean {\n if (event.key === \"Enter\" && nonInteractive) {\n event.preventDefault();\n return true;\n }\n\n if (\n (event.key === \"Enter\" || event.key === \" \") &&\n activationMode === \"manual\" &&\n !nonInteractive\n ) {\n event.preventDefault();\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click();\n }\n return true;\n }\n\n return false;\n}\n\nfunction hasModifierKey(event: React.KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;\n}\n\n/**\n * Resolves the ordered list of focus candidates based on intent direction.\n */\nfunction resolveFocusCandidates(\n items: ItemData[],\n focusIntent: FocusIntent,\n currentTarget: TriggerElement,\n loop: boolean,\n): React.RefObject<TriggerElement | null>[] {\n let candidateRefs = items.map((item) => item.ref);\n\n if (focusIntent === \"last\") {\n candidateRefs.reverse();\n } else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateRefs.reverse();\n const currentIndex = candidateRefs.findIndex(\n (ref) => ref.current === currentTarget,\n );\n candidateRefs = loop\n ? wrapArray(candidateRefs, currentIndex + 1)\n : candidateRefs.slice(currentIndex + 1);\n }\n\n return candidateRefs;\n}\n\n/**\n * Handles step validation and navigation when the store has validation.\n * Returns true if navigation was handled (caller should return early).\n */\nasync function handleValidatedNavigation(\n store: Store,\n candidateRefs: React.RefObject<TriggerElement | null>[],\n items: ItemData[],\n itemValue: string,\n value: string | undefined,\n steps: Map<string, StepState>,\n): Promise<boolean> {\n if (!store.hasValidation() || candidateRefs.length === 0) return false;\n\n const nextRef = candidateRefs[0];\n const nextElement = nextRef?.current;\n const nextItem = items.find((item) => item.ref.current === nextElement);\n\n if (!nextItem || nextItem.value === itemValue) return false;\n\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value);\n const direction: NavigationDirection =\n targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n if (direction === \"next\") {\n const isValid = await store.setStateWithValidation(\n nextItem.value,\n direction,\n );\n if (!isValid) return true;\n } else {\n store.setState(\"value\", nextItem.value);\n }\n\n queueMicrotask(() => nextElement?.focus());\n return true;\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: \"item\" | \"separator\" = \"item\",\n): DataState {\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.indexOf(itemValue);\n\n if (stepState?.completed) return \"completed\";\n\n if (value === itemValue) {\n return variant === \"separator\" ? \"inactive\" : \"active\";\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value);\n\n if (activeIndex > currentIndex) return \"completed\";\n }\n\n return \"inactive\";\n}\n\ninterface StepState {\n value: string;\n completed: boolean;\n disabled: boolean;\n}\n\ninterface StoreState {\n steps: Map<string, StepState>;\n value: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStateWithValidation: (\n value: string,\n direction: NavigationDirection,\n ) => Promise<boolean>;\n hasValidation: () => boolean;\n notify: () => void;\n addStep: (value: string, completed: boolean, disabled: boolean) => void;\n removeStep: (value: string) => void;\n setStep: (value: string, completed: boolean, disabled: boolean) => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector],\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface ItemData {\n id: string;\n ref: React.RefObject<TriggerElement | null>;\n value: string;\n active: boolean;\n disabled: boolean;\n}\n\ninterface StepperContextValue {\n rootId: string;\n dir: Direction;\n orientation: Orientation;\n activationMode: ActivationMode;\n disabled: boolean;\n nonInteractive: boolean;\n loop: boolean;\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null);\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperProps extends DivProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onValueComplete?: (value: string, completed: boolean) => void;\n onValueAdd?: (value: string) => void;\n onValueRemove?: (value: string) => void;\n onValidate?: (\n value: string,\n direction: NavigationDirection,\n ) => boolean | Promise<boolean>;\n activationMode?: ActivationMode;\n dir?: Direction;\n orientation?: Orientation;\n disabled?: boolean;\n loop?: boolean;\n nonInteractive?: boolean;\n}\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = \"horizontal\",\n activationMode = \"automatic\",\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? \"\",\n }));\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState(\"value\", value);\n return true;\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction);\n if (isValid) {\n store.setState(\"value\", value);\n }\n return isValid;\n } catch {\n return false;\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, newStep);\n stateRef.current.steps = next;\n propsRef.current.onValueAdd?.(value);\n store.notify();\n },\n removeStep: (value) => {\n const next = new Map(stateRef.current.steps);\n next.delete(value);\n stateRef.current.steps = next;\n propsRef.current.onValueRemove?.(value);\n store.notify();\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value);\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, updatedStep);\n stateRef.current.steps = next;\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed);\n }\n\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef, propsRef]);\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState(\"value\", value);\n }\n }, [value]);\n\n const dir = DirectionPrimitive.useDirection(dirProp);\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n );\n\n const RootPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn(\n \"flex gap-3\",\n orientation === \"horizontal\" ? \"w-full flex-col\" : \"flex-row\",\n className,\n )}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface FocusContextValue {\n tabStopId: string | null;\n onItemFocus: (tabStopId: string) => void;\n onItemShiftTab: () => void;\n onFocusableItemAdd: () => void;\n onFocusableItemRemove: () => void;\n onItemRegister: (item: ItemData) => void;\n onItemUnregister: (id: string) => void;\n getItems: () => ItemData[];\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null);\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext);\n if (!context) {\n throw new Error(\n `\\`${consumerName}\\` must be used within \\`FocusProvider\\``,\n );\n }\n return context;\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props;\n\n const context = useStepperContext(LIST_NAME);\n const orientation = context.orientation;\n const currentValue = useStore((state) => state.value);\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n });\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null);\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const [focusableItemCount, setFocusableItemCount] = React.useState(0);\n const isClickFocusRef = React.useRef(false);\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map());\n const listRef = React.useRef<ListElement>(null);\n const composedRef = useComposedRefs(ref, listRef);\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId);\n }, []);\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true);\n }, []);\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1);\n }, []);\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1);\n }, []);\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item);\n }, []);\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id);\n }, []);\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n }, []);\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event);\n if (event.defaultPrevented) return;\n\n setIsTabbingBackOut(false);\n },\n [propsRef],\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n const isKeyboardFocus = !isClickFocusRef.current;\n if (\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !isTabbingBackOut\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter(\n (item) => !item.disabled,\n );\n const selectedItem = currentValue\n ? items.find((item) => item.value === currentValue)\n : undefined;\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === tabStopId);\n\n const candidateItems = [\n selectedItem,\n activeItem,\n currentItem,\n ...items,\n ].filter(Boolean) as ItemData[];\n const candidateRefs = candidateItems.map((item) => item.ref);\n focusFirst(candidateRefs, false);\n }\n }\n isClickFocusRef.current = false;\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event);\n\n if (event.defaultPrevented) return;\n\n isClickFocusRef.current = true;\n },\n [propsRef],\n );\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n );\n\n const ListPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n \"flex outline-none\",\n orientation === \"horizontal\"\n ? \"flex-row items-center\"\n : \"flex-col items-start\",\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n );\n}\n\ninterface StepperItemContextValue {\n value: string;\n stepState: StepState | undefined;\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(\n null,\n);\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperItemProps extends DivProps {\n value: string;\n completed?: boolean;\n disabled?: boolean;\n}\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props;\n\n const context = useStepperContext(ITEM_NAME);\n const store = useStoreContext(ITEM_NAME);\n const orientation = context.orientation;\n const value = useStore((state) => state.value);\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled);\n\n return () => {\n store.removeStep(itemValue);\n };\n }, [itemValue, completed, disabled]);\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled);\n }, [itemValue, completed, disabled]);\n\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n \"relative flex not-last:flex-1 items-center\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n );\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props;\n\n const context = useStepperContext(TRIGGER_NAME);\n const itemContext = useStepperItemContext(TRIGGER_NAME);\n const itemValue = itemContext.value;\n\n const store = useStoreContext(TRIGGER_NAME);\n const focusContext = useFocusContext(TRIGGER_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const stepState = useStore((state) => state.steps.get(itemValue));\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n });\n\n const activationMode = context.activationMode;\n const orientation = context.orientation;\n const loop = context.loop;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue);\n\n const stepPosition = stepIndex + 1;\n const stepCount = steps.size;\n\n const triggerId = getId(context.rootId, \"trigger\", itemValue);\n const contentId = getId(context.rootId, \"content\", itemValue);\n const titleId = getId(context.rootId, \"title\", itemValue);\n const descriptionId = getId(context.rootId, \"description\", itemValue);\n\n const isDisabled = disabled || stepState?.disabled || context.disabled;\n const isActive = value === itemValue;\n const isTabStop = focusContext.tabStopId === triggerId;\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const triggerRef = React.useRef<TriggerElement>(null);\n const composedRef = useComposedRefs(ref, triggerRef);\n const isArrowKeyPressedRef = React.useRef(false);\n const isMouseClickRef = React.useRef(false);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true;\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false;\n }\n document.addEventListener(\"keydown\", onKeyDown);\n document.addEventListener(\"keyup\", onKeyUp);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keyup\", onKeyUp);\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n });\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd();\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId);\n if (!isDisabled) {\n focusContext.onFocusableItemRemove();\n }\n };\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled]);\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented) return;\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n },\n [\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n focusContext.onItemFocus(triggerId);\n\n const isKeyboardFocus = !isMouseClickRef.current;\n\n if (\n !isActive &&\n !isDisabled &&\n activationMode !== \"manual\" &&\n !context.nonInteractive &&\n isKeyboardFocus\n ) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n\n isMouseClickRef.current = false;\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (\n handleActivationKeys(\n event,\n context.nonInteractive,\n activationMode,\n isDisabled,\n triggerRef,\n )\n )\n return;\n\n if (event.key === \"Tab\" && event.shiftKey) {\n focusContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== event.currentTarget) return;\n\n const focusIntent = getFocusIntent(event, context.dir, orientation);\n\n if (focusIntent !== undefined) {\n if (hasModifierKey(event)) return;\n event.preventDefault();\n\n const items = focusContext.getItems().filter((item) => !item.disabled);\n const candidateRefs = resolveFocusCandidates(\n items,\n focusIntent,\n event.currentTarget,\n loop,\n );\n\n const didNavigate = await handleValidatedNavigation(\n store,\n candidateRefs,\n items,\n itemValue,\n value,\n steps,\n );\n if (didNavigate) return;\n\n queueMicrotask(() => focusFirst(candidateRefs));\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n isMouseClickRef.current = true;\n\n if (isDisabled) {\n event.preventDefault();\n } else {\n focusContext.onItemFocus(triggerId);\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n );\n\n const TriggerPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? \"step\" : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? \"\" : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full\",\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n );\n}\n\ninterface StepperIndicatorProps extends Omit<DivProps, \"children\"> {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode);\n}\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props;\n\n const context = useStepperContext(INDICATOR_NAME);\n const itemContext = useStepperItemContext(INDICATOR_NAME);\n\n const value = useStore((state) => state.value);\n const itemValue = itemContext.value;\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1;\n\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const IndicatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground\",\n className,\n )}\n >\n {typeof children === \"function\" ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === \"completed\" ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n );\n}\n\ninterface StepperSeparatorProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const {\n className,\n asChild,\n forceMount = false,\n ref,\n ...separatorProps\n } = props;\n\n const context = useStepperContext(SEPARATOR_NAME);\n const itemContext = useStepperItemContext(SEPARATOR_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const orientation = context.orientation;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value);\n\n const isLastStep = stepIndex === steps.size - 1;\n\n if (isLastStep && !forceMount) return null;\n\n const dataState = getDataState(\n value,\n itemContext.value,\n itemContext.stepState,\n steps,\n \"separator\",\n );\n\n const SeparatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n \"bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary\",\n orientation === \"horizontal\" ? \"h-px flex-1\" : \"h-10 w-px\",\n className,\n )}\n />\n );\n}\n\ninterface StepperTitleProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props;\n\n const context = useStepperContext(TITLE_NAME);\n const itemContext = useStepperItemContext(TITLE_NAME);\n\n const titleId = getId(context.rootId, \"title\", itemContext.value);\n\n const TitlePrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn(\"font-medium text-sm\", className)}\n />\n );\n}\n\ninterface StepperDescriptionProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props;\n\n const context = useStepperContext(DESCRIPTION_NAME);\n const itemContext = useStepperItemContext(DESCRIPTION_NAME);\n\n const descriptionId = getId(context.rootId, \"description\", itemContext.value);\n\n const DescriptionPrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn(\"text-muted-foreground text-xs\", className)}\n />\n );\n}\n\ninterface StepperContentProps extends DivProps {\n value: string;\n forceMount?: boolean;\n}\n\nfunction StepperContent(props: StepperContentProps) {\n const {\n value: valueProp,\n asChild,\n forceMount = false,\n ref,\n className,\n ...contentProps\n } = props;\n\n const context = useStepperContext(CONTENT_NAME);\n const value = useStore((state) => state.value);\n\n const contentId = getId(context.rootId, \"content\", valueProp);\n const triggerId = getId(context.rootId, \"trigger\", valueProp);\n\n if (valueProp !== value && !forceMount) return null;\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn(\"flex-1 outline-none\", className)}\n />\n );\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled = disabled || currentIndex <= 0;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const prevIndex = Math.max(currentIndex - 1, 0);\n const prevStepValue = stepKeys[prevIndex];\n\n if (prevStepValue) {\n store.setState(\"value\", prevStepValue);\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const PrevPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <PrevPrimitive\n type=\"button\"\n data-slot=\"stepper-prev\"\n disabled={isDisabled}\n {...prevProps}\n onClick={onClick}\n />\n );\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props;\n\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled =\n disabled || stepKeys.length === 0 || currentIndex >= stepKeys.length - 1;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1);\n const nextStepValue = stepKeys[nextIndex];\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, \"next\");\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const NextPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <NextPrimitive\n type=\"button\"\n data-slot=\"stepper-next\"\n disabled={isDisabled}\n {...nextProps}\n onClick={onClick}\n />\n );\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n};\n","import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n","import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n","/**\n * EntityTable -- generic paginated table driven by JSON Schema + UI Schema.\n *\n * Column definitions are derived from schema.properties via resolveColumns().\n * Domain-specific cell rendering is handled by passing a local renderer\n * registry via the renderers prop; x-ui-cell names in the schema are\n * resolved against the local registry first, then the global registry.\n *\n * Pagination is opt-in. When pagination + onPaginationChange are provided the\n * table runs in manualPagination mode and renders prev/next controls.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click on a row calls onRowClick\n * directly (navigation / edit). No keyboard focus management.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, arrow keys navigate rows, Space toggles selection on the\n * focused row, Enter is suppressed. The parent receives selected rows\n * via onSelectionChange.\n *\n * Extractable to @petrarca/sonnet-ui.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type Row,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useComponentDefaults } from \"@petrarca/sonnet-core/config\";\nimport { Checkbox } from \"../checkbox\";\nimport type { PageResult } from \"@petrarca/sonnet-core\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"./tableSchema\";\n\nexport type { PageMeta } from \"@petrarca/sonnet-core\";\nexport type { CellRenderer, PageResult, PaginationState };\n\n/** How a row's detail (onRowClick) is opened. */\nexport type RowActivation = \"click\" | \"double-click\";\n\n/**\n * Props of EntityTable that can be defaulted app-wide via SonnetConfigProvider.\n * Behavioral, non-data props only.\n */\nexport interface EntityTableConfigurable {\n rowActivation: RowActivation;\n showChevron: boolean;\n}\n\ndeclare module \"@petrarca/sonnet-core\" {\n interface SonnetComponentDefaults {\n EntityTable?: { defaultProps?: Partial<EntityTableConfigurable> };\n }\n}\n\n/** Declarative row action rendered as a button in a trailing \"Actions\" column. */\nexport interface RowAction<TRow> {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n variant?: \"default\" | \"destructive\" | \"ghost\";\n onClick: (row: TRow) => void;\n hidden?: (row: TRow) => boolean;\n disabled?: (row: TRow) => boolean;\n}\n\nconst coreRowModel = getCoreRowModel();\n\nexport interface EntityTableProps<TRow extends RowData> {\n // Column definition via JSON Schema + optional UI Schema overlay.\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n\n // Local cell renderer registry. Checked before the global registry\n // for domain-specific renderers that only apply to this table.\n renderers?: Record<string, CellRenderer>;\n\n // Data\n data: PageResult<TRow> | undefined;\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n\n // Empty state\n entityLabel: string;\n isFiltered?: boolean;\n emptyMessage?: string;\n\n // Row interaction -- opens detail/edit panel.\n onRowClick?: (row: TRow) => void;\n\n /**\n * How onRowClick (open detail) is triggered. Resolved against app-wide\n * config (SonnetConfigProvider) then the built-in default \"click\".\n *\n * \"click\" -- single-click on a row opens detail (default,\n * preserves existing behavior). The chevron is a\n * non-interactive affordance.\n * \"double-click\" -- single-click sets the active row (and fires\n * onActiveRowChange); double-click, or clicking the\n * trailing chevron button, opens detail.\n */\n rowActivation?: RowActivation;\n\n /**\n * Fired when the active (single-selected) row changes. Only meaningful when\n * rowActivation is \"double-click\" and selectionMode is off. null when the\n * active row is cleared.\n */\n onActiveRowChange?: (row: TRow | null) => void;\n\n /**\n * Whether to show the trailing chevron column. Resolved against app-wide\n * config then a built-in default of \"show when onRowClick is set\". In\n * \"double-click\" mode the chevron is an interactive button that opens detail.\n */\n showChevron?: boolean;\n\n // Selection mode (opt-in). When true: checkboxes appear, click toggles\n // selection, pencil/edit gestures are suppressed. When false (default):\n // normal browse/edit behavior with active row and pencil icon.\n selectionMode?: boolean;\n onSelectionChange?: (selectedRows: TRow[]) => void;\n /**\n * Stable identity for a row, used to key the selection.\n *\n * Without it the selection is keyed by row position, so it means \"the rows\n * currently in these slots\" and cannot survive paging or refiltering -- the\n * table clears it whenever `data` changes to keep that safe. Supply this and\n * the selection is keyed by identity instead: it survives a page change, and\n * a bulk action can span pages.\n */\n getRowId?: (row: TRow) => string;\n\n // Server-side pagination (opt-in)\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n\n // Declarative row actions rendered in a trailing \"Actions\" column.\n // Only shown when at least one action is provided.\n rowActions?: RowAction<TRow>[];\n}\n\n// ---------------------------------------------------------------------------\n// Defaults resolver -- moves default-param branches out of EntityTable.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedDefaults {\n isFiltered: boolean;\n selectionMode: boolean;\n}\n\nfunction resolveTableDefaults(props: {\n isFiltered?: boolean;\n selectionMode?: boolean;\n}): ResolvedDefaults {\n return {\n isFiltered: props.isFiltered ?? false,\n selectionMode: props.selectionMode ?? false,\n };\n}\n\n// App-wide-configurable behavioral props (rowActivation, showChevron) are\n// resolved here: instance prop > SonnetConfigProvider default > built-in.\nconst ENTITY_TABLE_BUILTIN: EntityTableConfigurable = {\n rowActivation: \"click\",\n showChevron: true,\n};\n\ninterface ResolvedActivation {\n rowActivation: RowActivation;\n // showChevron is only meaningful when onRowClick exists; when explicitly set\n // to false the chevron column is suppressed.\n showChevron: boolean;\n}\n\nfunction useResolvedActivation(props: {\n rowActivation?: RowActivation;\n showChevron?: boolean;\n}): ResolvedActivation {\n const resolved = useComponentDefaults<Record<string, unknown>>(\n \"EntityTable\",\n ENTITY_TABLE_BUILTIN as unknown as Record<string, unknown>,\n {\n rowActivation: props.rowActivation,\n showChevron: props.showChevron,\n } as Record<string, unknown>,\n );\n return {\n rowActivation: resolved.rowActivation as RowActivation,\n showChevron: resolved.showChevron as boolean,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Column builders (unchanged)\n// ---------------------------------------------------------------------------\n\n/** Build TanStack ColumnDef[] from resolved column descriptors. */\nfunction buildColumnDefs<TRow extends RowData>(\n resolved: ResolvedColumn[],\n localRenderers?: Record<string, CellRenderer>,\n): ColumnDef<TRow>[] {\n return resolved.map((col) => {\n const Renderer = resolveCellRenderer(col.cellRenderer, localRenderers);\n const options = col.cellOptions;\n const colDef: ColumnDef<TRow> = {\n id: col.key,\n accessorKey: col.key,\n header: col.label,\n cell: ({\n getValue,\n row,\n }: {\n getValue: () => unknown;\n row: Row<TRow>;\n }) => (\n <Renderer\n value={getValue()}\n row={row.original as Record<string, unknown>}\n options={options}\n />\n ),\n };\n if (col.width !== undefined) colDef.size = col.width;\n if (col.minWidth !== undefined) {\n colDef.minSize = col.minWidth;\n // TanStack gives every column a default minSize, so the resolved\n // columnDef cannot tell an authored floor from the framework's. Carry\n // the schema's intent separately for the header to read.\n colDef.meta = { ...colDef.meta, minWidth: col.minWidth };\n }\n return colDef;\n });\n}\n\n/** Checkbox column prepended when row selection is enabled. */\nfunction buildSelectColumn<TRow extends RowData>(): ColumnDef<TRow> {\n return {\n id: \"_select\",\n size: 40,\n header: ({ table: t }) => (\n <Checkbox\n checked={\n t.getIsAllPageRowsSelected() ||\n (t.getIsSomePageRowsSelected() ? \"indeterminate\" : false)\n }\n onCheckedChange={(value) => t.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Select row\"\n />\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Build TanStack table options -- isolates the conditional spreads.\n// ---------------------------------------------------------------------------\n\nfunction buildTableOptions<TRow extends RowData>(opts: {\n dataRows: TRow[];\n columns: ColumnDef<TRow>[];\n tableState: Record<string, unknown>;\n selectionMode: boolean;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n onPaginationChange: OnChangeFn<PaginationState> | undefined;\n getRowId: ((row: TRow) => string) | undefined;\n}) {\n const base = {\n data: opts.dataRows,\n columns: opts.columns,\n getCoreRowModel: coreRowModel,\n state: opts.tableState,\n };\n\n const selectionOpts = opts.selectionMode\n ? { enableRowSelection: true, onRowSelectionChange: opts.setRowSelection }\n : {};\n\n // TanStack keys row selection by whatever getRowId returns, defaulting to the\n // row index. Supplying one makes the selection identity-based.\n const rowIdOpts = opts.getRowId\n ? { getRowId: (row: TRow) => opts.getRowId!(row) }\n : {};\n\n const paginationOpts = opts.isPaginated\n ? {\n manualPagination: true,\n rowCount: opts.data?.meta.total ?? 0,\n onPaginationChange: opts.onPaginationChange,\n }\n : {};\n\n return { ...base, ...selectionOpts, ...paginationOpts, ...rowIdOpts };\n}\n\n// ---------------------------------------------------------------------------\n// useEntityTableState -- all hooks, effects, and table instance.\n// ---------------------------------------------------------------------------\n\ninterface EntityTableState<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n dataRows: TRow[];\n isPaginated: boolean;\n rowSelection: RowSelectionState;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n activeRowIndex: number;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n columns: ColumnDef<TRow>[];\n}\n\nfunction useEntityTableState<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n selectionMode: boolean,\n): EntityTableState<TRow> {\n const {\n schema,\n uiSchema,\n renderers,\n data,\n pagination,\n onPaginationChange,\n onSelectionChange,\n getRowId,\n } = props;\n\n const isPaginated = !!(pagination && onPaginationChange);\n\n const dataRows = useMemo(() => data?.data ?? [], [data]);\n\n // Clamp pageIndex when total drops below current page after a deletion.\n const total = data?.meta.total;\n const pageIndex = pagination?.pageIndex ?? 0;\n const pageSize = pagination?.pageSize ?? 1;\n useEffect(() => {\n if (!isPaginated || total == null || !onPaginationChange) return;\n const maxPage = Math.max(0, Math.ceil(total / pageSize) - 1);\n if (pageIndex > maxPage) {\n onPaginationChange((prev) => ({ ...prev, pageIndex: maxPage }));\n }\n }, [total, isPaginated, pageIndex, pageSize, onPaginationChange]);\n\n // Row selection state. Without getRowId the selection is keyed by row\n // position, so it silently refers to different records once the rows change;\n // clearing it on every data change is what keeps that safe. With a stable id\n // the keys mean something across pages, so the selection is kept.\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const keyedById = !!getRowId;\n useEffect(() => {\n if (keyedById) return;\n setRowSelection({});\n }, [data, keyedById]);\n\n // Active row index for keyboard navigation.\n const [activeRowIndex, setActiveRowIndex] = useState<number>(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const dataColumns = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return buildColumnDefs<TRow>(resolveColumns(schema, uiSchema), renderers);\n }, [schema, uiSchema, renderers]);\n\n const selectColumn = useMemo(\n () => (selectionMode ? buildSelectColumn<TRow>() : null),\n [selectionMode],\n );\n\n const columns = useMemo<ColumnDef<TRow>[]>(\n () => (selectColumn ? [selectColumn, ...dataColumns] : dataColumns),\n [selectColumn, dataColumns],\n );\n\n // Notify parent when selection changes.\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n useEffect(() => {\n if (!selectionMode || !onSelectionChangeRef.current) return;\n const keys = Object.keys(rowSelection).filter((k) => rowSelection[k]);\n // Keys are ids when getRowId is supplied, row indices otherwise. Either\n // way only rows on the current page can be resolved to objects; a\n // selection spanning pages reports the ones currently loaded.\n const selected = getRowId\n ? dataRows.filter((row) => keys.includes(getRowId(row)))\n : keys\n .map(Number)\n .map((i) => dataRows[i])\n .filter((r): r is TRow => r !== undefined);\n onSelectionChangeRef.current(selected);\n }, [rowSelection, selectionMode, dataRows, getRowId]);\n\n // Build a single unified state object to avoid conditional spread merging.\n const tableState = useMemo(\n () => ({\n ...(isPaginated ? { pagination } : {}),\n ...(selectionMode ? { rowSelection } : {}),\n }),\n [isPaginated, pagination, selectionMode, rowSelection],\n );\n\n const tableOptions = buildTableOptions({\n dataRows,\n columns,\n tableState,\n selectionMode,\n setRowSelection,\n isPaginated,\n data,\n onPaginationChange,\n getRowId,\n });\n\n const table = useReactTable<TRow>(tableOptions);\n\n // Scroll active row into view.\n useEffect(() => {\n if (activeRowIndex < 0 || !containerRef.current) return;\n const rows = containerRef.current.querySelectorAll(\"tbody tr\");\n rows[activeRowIndex]?.scrollIntoView({ block: \"nearest\" });\n }, [activeRowIndex]);\n\n return {\n table,\n dataRows,\n isPaginated,\n rowSelection,\n setRowSelection,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n };\n}\n\n// ---------------------------------------------------------------------------\n// useActiveRowEvent -- single-active-row activation + neutral change event.\n// ---------------------------------------------------------------------------\n\n/**\n * In single-active-row mode (rowActivation \"double-click\", not selectionMode),\n * returns a handler that sets the active row, and fires the neutral\n * onActiveRowChange whenever the active row changes -- independent of whether\n * the change came from a click, keyboard, or data update. In all other modes\n * the returned handler only moves the active index and no event fires.\n */\nfunction useActiveRowEvent<TRow extends RowData>(args: {\n selectionMode: boolean;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n onActiveRowChange: ((row: TRow | null) => void) | undefined;\n activeRowIndex: number;\n dataRows: TRow[];\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n}): (index: number) => void {\n const {\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n } = args;\n\n const singleActiveMode =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n\n const onChangeRef = useRef(onActiveRowChange);\n onChangeRef.current = onActiveRowChange;\n\n useEffect(() => {\n if (!singleActiveMode) return;\n const row = activeRowIndex >= 0 ? (dataRows[activeRowIndex] ?? null) : null;\n onChangeRef.current?.(row);\n }, [singleActiveMode, activeRowIndex, dataRows]);\n\n return useCallback(\n (index: number) => setActiveRowIndex(index),\n [setActiveRowIndex],\n );\n}\n\n// ---------------------------------------------------------------------------\n// useTableKeyboard -- keyboard navigation handler.\n// ---------------------------------------------------------------------------\n\nfunction useTableKeyboard<TRow extends RowData>(\n table: ReturnType<typeof useReactTable<TRow>>,\n activeRowIndex: number,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n return useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const tableRows = table.getRowModel().rows;\n if (tableRows.length === 0) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.min(prev + 1, tableRows.length - 1));\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.max(prev - 1, 0));\n break;\n }\n case \"Enter\": {\n handleEnterKey(\n e,\n tableRows,\n selectionMode,\n activeRowIndex,\n onRowClick,\n );\n break;\n }\n case \" \": {\n handleSpaceKey(e, tableRows, selectionMode, activeRowIndex);\n break;\n }\n }\n },\n [activeRowIndex, onRowClick, selectionMode, table, setActiveRowIndex],\n );\n}\n\n/**\n * Width style for a header cell. `x-ui-column.width` becomes an exact width and\n * `minWidth` a floor; a column may set either, both, or neither. The floor is\n * read from `meta`, not `minSize`, because TanStack defaults `minSize` on every\n * column and the two are indistinguishable there.\n */\nfunction headerWidthStyle(columnDef: {\n size?: number;\n meta?: { minWidth?: number };\n}): React.CSSProperties | undefined {\n const size = columnDef.size;\n const minWidth = columnDef.meta?.minWidth;\n if (size === undefined && minWidth === undefined) return undefined;\n return {\n ...(size !== undefined && { width: size }),\n ...(minWidth !== undefined && { minWidth }),\n };\n}\n\nfunction handleEnterKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n e.preventDefault();\n if (selectionMode || activeRowIndex < 0 || !onRowClick) return;\n const activeRow = tableRows[activeRowIndex];\n if (activeRow) onRowClick(activeRow.original);\n}\n\nfunction handleSpaceKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n) {\n if (!selectionMode || activeRowIndex < 0) return;\n e.preventDefault();\n tableRows[activeRowIndex]?.toggleSelected();\n}\n\n// ---------------------------------------------------------------------------\n// Trailing-column flags\n// ---------------------------------------------------------------------------\n\ninterface TrailingColFlags {\n hasRowActions: boolean;\n hasChevron: boolean;\n hasTrailingCol: boolean;\n}\n\n/**\n * Whether the table is keyboard-operable, and so needs a tab stop and a key\n * handler. Selection mode uses Space to select; a row-click table uses Enter to\n * open. Gating on selection mode alone left every browse-mode table unreachable\n * by keyboard -- not even focusable -- although the Enter handler exists for it.\n * A table with neither is a static grid and stays out of the tab order.\n */\nfunction isKeyboardOperable<TRow>(\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): boolean {\n return selectionMode || !!onRowClick;\n}\n\nfunction resolveTrailingCols<TRow>(\n rowActions: RowAction<TRow>[] | undefined,\n onRowClick: ((row: TRow) => void) | undefined,\n selectionMode: boolean,\n showChevron: boolean,\n): TrailingColFlags {\n const hasRowActions = !!(rowActions && rowActions.length > 0);\n const hasChevron = !!(\n onRowClick &&\n showChevron &&\n !selectionMode &&\n !hasRowActions\n );\n return {\n hasRowActions,\n hasChevron,\n hasTrailingCol: hasRowActions || hasChevron,\n };\n}\n\n// ---------------------------------------------------------------------------\n// StatusRows sub-component\n// ---------------------------------------------------------------------------\n\ninterface StatusRowsProps {\n isLoading: boolean;\n isError: boolean;\n errorMessage: string | undefined;\n entityLabel: string;\n isFiltered: boolean;\n emptyMessage: string | undefined;\n isEmpty: boolean;\n colCount: number;\n}\n\nfunction StatusRows({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n isFiltered,\n emptyMessage,\n isEmpty,\n colCount,\n}: StatusRowsProps): React.ReactElement | null {\n if (isLoading) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n Loading...\n </td>\n </tr>\n );\n }\n if (isError) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-destructive\"\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </td>\n </tr>\n );\n }\n if (isEmpty) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {resolveEmptyMessage(emptyMessage, isFiltered, entityLabel)}\n </td>\n </tr>\n );\n }\n return null;\n}\n\nfunction resolveEmptyMessage(\n emptyMessage: string | undefined,\n isFiltered: boolean,\n entityLabel: string,\n): string {\n if (emptyMessage) return emptyMessage;\n if (isFiltered) return `No ${entityLabel} match your search.`;\n return `No ${entityLabel} yet.`;\n}\n\n// ---------------------------------------------------------------------------\n// RowActionCell sub-component\n// ---------------------------------------------------------------------------\n\ninterface RowActionCellProps<TRow> {\n actions: RowAction<TRow>[];\n rowOriginal: TRow;\n}\n\nfunction RowActionCell<TRow>({\n actions,\n rowOriginal,\n}: RowActionCellProps<TRow>): React.ReactElement {\n return (\n <td className=\"px-4 py-3 w-24 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {actions.map((action) => (\n <ActionButton\n key={action.label}\n action={action}\n rowOriginal={rowOriginal}\n />\n ))}\n </div>\n </td>\n );\n}\n\ninterface ActionButtonProps<TRow> {\n action: RowAction<TRow>;\n rowOriginal: TRow;\n}\n\nfunction ActionButton<TRow>({\n action,\n rowOriginal,\n}: ActionButtonProps<TRow>): React.ReactElement | null {\n const isHidden = action.hidden?.(rowOriginal);\n if (isHidden) return null;\n const isDisabled = action.disabled?.(rowOriginal);\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n title={action.label}\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick(rowOriginal);\n }}\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n action.variant === \"destructive\"\n ? \"text-destructive hover:bg-destructive/10\"\n : \"text-muted-foreground hover:bg-accent\",\n isDisabled\n ? \"opacity-30 cursor-not-allowed group-hover/row:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\",\n )}\n >\n {Icon ? (\n <Icon className=\"h-3.5 w-3.5\" />\n ) : (\n <span className=\"text-xs\">{action.label}</span>\n )}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DataRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface DataRowProps<TRow extends RowData> {\n row: Row<TRow>;\n index: number;\n selectionMode: boolean;\n rowActivation: RowActivation;\n activeRowIndex: number;\n onRowClick: ((row: TRow) => void) | undefined;\n onActivateRow: (index: number) => void;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n hasRowActions: boolean;\n hasChevron: boolean;\n rowActions: RowAction<TRow>[] | undefined;\n}\n\n// Trailing chevron cell. Decorative in \"click\" mode; an interactive\n// \"open detail\" button in \"double-click\" mode (single-click selects instead).\nfunction ChevronCell<TRow>({\n rowOriginal,\n rowActivation,\n onRowClick,\n}: {\n rowOriginal: TRow;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n}): React.ReactElement {\n const asButton = rowActivation === \"double-click\" && !!onRowClick;\n return (\n <td className=\"px-4 py-3 w-10\">\n {asButton ? (\n <button\n type=\"button\"\n title=\"Open\"\n onClick={(e) => {\n e.stopPropagation();\n onRowClick!(rowOriginal);\n }}\n className=\"inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </td>\n );\n}\n\nfunction rowClassName<TRow extends RowData>(\n row: Row<TRow>,\n isActive: boolean,\n selectionMode: boolean,\n singleClickSelects: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): string {\n return cn(\n \"border-b last:border-b-0 transition-colors group/row\",\n onRowClick && !selectionMode && \"hover:bg-accent/50 cursor-pointer\",\n selectionMode && \"cursor-default\",\n row.getIsSelected() && \"bg-primary/10\",\n isActive && selectionMode && \"bg-accent\",\n isActive && singleClickSelects && \"bg-primary/10\",\n );\n}\n\nfunction DataRow<TRow extends RowData>({\n row,\n index,\n selectionMode,\n rowActivation,\n activeRowIndex,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n}: DataRowProps<TRow>): React.ReactElement {\n // In double-click mode a single click selects (sets active row); detail is\n // opened by double-click or the chevron button. In click mode a single click\n // opens detail directly (existing behavior).\n const singleClickSelects =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n const isActive = index === activeRowIndex;\n return (\n <tr\n key={row.id}\n onClick={() => {\n handleRowClick(\n row,\n index,\n selectionMode,\n rowActivation,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n );\n }}\n onDoubleClick={() => {\n if (singleClickSelects && onRowClick) onRowClick(row.original);\n }}\n className={rowClassName(\n row,\n isActive,\n selectionMode,\n singleClickSelects,\n onRowClick,\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n {hasRowActions && (\n <RowActionCell actions={rowActions!} rowOriginal={row.original} />\n )}\n {hasChevron && (\n <ChevronCell\n rowOriginal={row.original}\n rowActivation={rowActivation}\n onRowClick={onRowClick}\n />\n )}\n </tr>\n );\n}\n\nfunction handleRowClick<TRow extends RowData>(\n row: Row<TRow>,\n index: number,\n selectionMode: boolean,\n rowActivation: RowActivation,\n onRowClick: ((row: TRow) => void) | undefined,\n onActivateRow: (index: number) => void,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n containerRef: React.RefObject<HTMLDivElement | null>,\n): void {\n if (selectionMode) {\n row.toggleSelected();\n setActiveRowIndex(index);\n containerRef.current?.focus();\n return;\n }\n if (rowActivation === \"double-click\" && onRowClick) {\n // Single click selects the active row; detail opens on double-click.\n onActivateRow(index);\n return;\n }\n if (onRowClick) onRowClick(row.original);\n}\n\n// ---------------------------------------------------------------------------\n// TableFooter sub-component\n// ---------------------------------------------------------------------------\n\ninterface TableFooterProps<TRow extends RowData> {\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n dataRows: TRow[];\n entityLabel: string;\n table: ReturnType<typeof useReactTable<TRow>>;\n}\n\nfunction TableFooter<TRow extends RowData>({\n isPaginated,\n data,\n dataRows,\n entityLabel,\n table,\n}: TableFooterProps<TRow>): React.ReactElement | null {\n if (!data?.meta) return null;\n if (isPaginated) {\n return <PaginationFooter table={table} entityLabel={entityLabel} />;\n }\n return (\n <p className=\"text-xs text-muted-foreground mt-3\">\n Showing {dataRows.length} of {data.meta.total} {entityLabel}\n </p>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EntityTable -- main component\n// ---------------------------------------------------------------------------\n\nexport function EntityTable<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n): React.ReactElement {\n const {\n data,\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n onRowClick,\n onActiveRowChange,\n rowActions,\n } = props;\n\n const { isFiltered, selectionMode } = resolveTableDefaults(props);\n const { rowActivation, showChevron } = useResolvedActivation(props);\n\n const {\n table,\n dataRows,\n isPaginated,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n } = useEntityTableState(props, selectionMode);\n\n const handleKeyDown = useTableKeyboard(\n table,\n activeRowIndex,\n setActiveRowIndex,\n selectionMode,\n onRowClick,\n );\n\n const handleActivateRow = useActiveRowEvent({\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n });\n\n const { hasRowActions, hasChevron, hasTrailingCol } = resolveTrailingCols(\n rowActions,\n onRowClick,\n selectionMode,\n showChevron,\n );\n\n const colCount = columns.length + (hasTrailingCol ? 1 : 0);\n\n const isInteractive = isKeyboardOperable(selectionMode, onRowClick);\n\n return (\n <div>\n <div\n ref={isInteractive ? containerRef : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onKeyDown={isInteractive ? handleKeyDown : undefined}\n className={cn(\"rounded-lg border\", isInteractive && \"outline-none\")}\n >\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/40\">\n {table.getFlatHeaders().map((header) => (\n <th\n key={header.id}\n className=\"text-left text-xs font-medium text-foreground px-4 py-2.5\"\n style={headerWidthStyle(header.column.columnDef)}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </th>\n ))}\n {hasRowActions && (\n <th\n aria-label=\"Actions\"\n scope=\"col\"\n className=\"w-24 text-right text-xs font-medium text-foreground px-4 py-2.5\"\n />\n )}\n {hasChevron && (\n <th aria-label=\"Open\" scope=\"col\" className=\"w-10\" />\n )}\n </tr>\n </thead>\n <tbody>\n <StatusRows\n isLoading={isLoading}\n isError={isError}\n errorMessage={errorMessage}\n entityLabel={entityLabel}\n isFiltered={isFiltered}\n emptyMessage={props.emptyMessage}\n isEmpty={!isLoading && !isError && dataRows.length === 0}\n colCount={colCount}\n />\n {table.getRowModel().rows.map((row, index) => (\n <DataRow\n key={row.id}\n row={row}\n index={index}\n selectionMode={selectionMode}\n rowActivation={rowActivation}\n activeRowIndex={activeRowIndex}\n onRowClick={onRowClick}\n onActivateRow={handleActivateRow}\n setActiveRowIndex={setActiveRowIndex}\n containerRef={containerRef}\n hasRowActions={hasRowActions}\n hasChevron={hasChevron}\n rowActions={rowActions}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n <TableFooter\n isPaginated={isPaginated}\n data={data}\n dataRows={dataRows}\n entityLabel={entityLabel}\n table={table}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PaginationFooter (unchanged)\n// ---------------------------------------------------------------------------\n\ninterface PaginationFooterProps<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n entityLabel: string;\n}\n\nfunction PaginationFooter<TRow extends RowData>({\n table,\n entityLabel,\n}: PaginationFooterProps<TRow>): React.ReactElement {\n const { pageIndex, pageSize } = table.getState().pagination;\n const rowCount = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = rowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min((pageIndex + 1) * pageSize, rowCount);\n\n return (\n <div className=\"flex items-center justify-between mt-3\">\n <p className=\"text-xs text-muted-foreground\">\n {rowCount === 0\n ? `No ${entityLabel}`\n : `Showing ${from}\\u2013${to} of ${rowCount} ${entityLabel}`}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Previous\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {pageCount > 0 ? `${pageIndex + 1} / ${pageCount}` : \"--\"}\n </span>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Merge base schema x-ui-column/x-ui-cell annotations with UI schema overrides.\n *\n * UI schema wins on all conflicts. x-ui-column and x-ui-cell-options are\n * shallow-merged so the UI schema can override individual keys (e.g. just width)\n * without repeating the full config.\n *\n * The merge is add-and-replace only: an overlay may set a key or change its\n * value, but cannot REMOVE a key the base schema set. Writing `null`\n * (e.g. `x-ui-cell-options: { colors: null }`) does not clear an inherited\n * option -- it stores `null`. Clearing an inherited option is deliberately not a\n * capability; if a renderer needs an explicit \"off\", model it as a real value\n * that renderer understands, not as a delete sentinel.\n *\n * Extractable to @petrarca/sonnet-core -- no React, no DOM.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { TableUiSchema } from \"./types\";\n\nexport interface MergedColumnConfig {\n order?: number;\n hidden: boolean;\n width?: number;\n minWidth?: number;\n label?: string;\n cellRenderer?: string;\n cellOptions: Record<string, unknown>;\n}\n\n/**\n * Merge x-ui-column, x-ui-cell, and x-ui-cell-options from the base property\n * and the UI schema entry for a single field. UI schema wins on all conflicts.\n */\n// Resolve the cell renderer name from schema and UI schema (UI wins).\nfunction resolveCellRenderer(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): string | undefined {\n return uiEntry?.[\"x-ui-cell\"] ?? property[\"x-ui-cell\"];\n}\n\n// Merge cell options from schema and UI schema (UI wins on conflicts). Add and\n// replace only -- see the module docblock; `null` does not clear a base key.\nfunction resolveCellOptions(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): Record<string, unknown> {\n return {\n ...(property[\"x-ui-cell-options\"] ?? {}),\n ...(uiEntry?.[\"x-ui-cell-options\"] ?? {}),\n };\n}\n\nexport function mergeColumnConfig(\n key: string,\n property: JsonSchemaProperty,\n uiSchema?: TableUiSchema,\n): MergedColumnConfig {\n const uiEntry = uiSchema?.[key];\n const merged = {\n ...(property[\"x-ui-column\"] ?? {}),\n ...(uiEntry?.[\"x-ui-column\"] ?? {}),\n };\n\n return {\n order: merged.order,\n hidden: merged.hidden ?? false,\n width: merged.width,\n minWidth: merged.minWidth,\n label: merged.label,\n cellRenderer: resolveCellRenderer(property, uiEntry),\n cellOptions: resolveCellOptions(property, uiEntry),\n };\n}\n","/**\n * Cell renderer registry, resolution helpers, and the createRenderer factory.\n *\n * Separate from cellRenderers.tsx so that non-component exports\n * (registry object, pure functions, factory) do not violate react-refresh\n * rules.\n *\n * Extractable to @petrarca/sonnet-core (pure logic) /\n * @petrarca/sonnet-ui (registry with React components).\n */\n\nimport React from \"react\";\nimport { warnLog } from \"@petrarca/sonnet-core\";\nimport {\n TextCell,\n MutedCell,\n BoldCell,\n CodeCell,\n BadgeCell,\n ConditionalBadgeCell,\n DateCell,\n DateTimeCell,\n BooleanCell,\n NumberCell,\n TruncateCell,\n OverflowListCell,\n JoinCell,\n type CellRenderer,\n type CellRendererProps,\n} from \"./cellRenderers\";\n\nexport type { CellRenderer };\n\n/** Registry mapping renderer names to components. */\nexport const CELL_RENDERERS: Record<string, CellRenderer> = {\n text: TextCell,\n muted: MutedCell,\n bold: BoldCell,\n code: CodeCell,\n badge: BadgeCell,\n \"badge-when\": ConditionalBadgeCell,\n date: DateCell,\n datetime: DateTimeCell,\n boolean: BooleanCell,\n number: NumberCell,\n truncate: TruncateCell,\n \"overflow-list\": OverflowListCell,\n join: JoinCell,\n};\n\n/**\n * Infer a default renderer name from a property's type and format.\n * Used when no explicit x-ui-cell is set.\n */\nexport function inferCellRenderer(\n type: string | undefined,\n format: string | undefined,\n): string {\n if (type === \"boolean\") return \"boolean\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"string\") {\n if (format === \"date-time\") return \"datetime\";\n if (format === \"date\") return \"date\";\n }\n return \"text\";\n}\n\n/**\n * Resolve a cell renderer by name.\n * Checks the optional local registry first, then the global registry,\n * then falls back to TextCell.\n */\nexport function resolveCellRenderer(\n name: string,\n localRenderers?: Record<string, CellRenderer>,\n): CellRenderer {\n return localRenderers?.[name] ?? CELL_RENDERERS[name] ?? TextCell;\n}\n\n/**\n * Factory for creating typed local cell renderers.\n *\n * Local renderer names must start with `x-` to distinguish them from\n * built-in renderers (e.g. `x-audit-actors`, `x-trade-risk`). This\n * follows the same convention as the `x-ui-*` schema extensions.\n * Built-in names like `badge`, `datetime`, `muted` stay clean and\n * unprefixed. A dev-mode warning is logged if the convention is violated.\n *\n * The render function receives the full typed row and the x-ui-cell-options\n * from the schema. This keeps the schema purely declarative (no functions)\n * while giving domain-specific renderers full type safety.\n *\n * For generic table viewers where the row type is not known, omit the\n * type parameter -- TRow defaults to Record<string, unknown> and you\n * inspect the row dynamically using options as hints.\n *\n * @example\n * ```ts\n * import { createRenderer } from \"@petrarca/sonnet-ui\";\n * import type { AuditLogEntry } from \"../schemas\";\n *\n * const RENDERERS = {\n * \"x-audit-actors\": createRenderer<AuditLogEntry>((row, options) => {\n * // row is fully typed, options from x-ui-cell-options in the schema.\n * return <span>{row.actors[0]?.name ?? \"--\"}</span>;\n * }),\n * };\n *\n * // Schema stays pure data:\n * // actors: { \"x-ui-cell\": \"x-audit-actors\" }\n *\n * <EntityTable schema={SCHEMA} renderers={RENDERERS} ... />\n * ```\n */\nexport function createRenderer<TRow = Record<string, unknown>>(\n render: (row: TRow, options: Record<string, unknown>) => React.ReactNode,\n): CellRenderer {\n return ({ row, options }: CellRendererProps) =>\n React.createElement(React.Fragment, null, render(row as TRow, options));\n}\n\n/**\n * Validate that all keys in a local renderer registry follow the x- prefix\n * convention. Logs a warning in dev mode for each violation.\n */\nexport function validateRendererNames(\n renderers: Record<string, CellRenderer>,\n): void {\n for (const name of Object.keys(renderers)) {\n if (!name.startsWith(\"x-\")) {\n warnLog(\n `[EntityTable] Local renderer \"${name}\" should use the x- prefix ` +\n `(e.g. \"x-${name}\"). Built-in renderer names are unprefixed.`,\n );\n }\n }\n}\n","/**\n * Built-in cell renderer components for schema-driven EntityTable.\n *\n * Each renderer is a React component that receives the raw cell value and\n * the merged cell options from x-ui-cell-options. All renderers are\n * display-only -- stateless, no side effects.\n *\n * Cross-cutting options supported by all built-in renderers:\n * valueKey -- extract a sub-field from an object value before rendering\n * nowrap -- apply whitespace-nowrap to the output element\n *\n * Registry, resolution helpers, and the createRenderer factory live in\n * cellRegistry.ts so this file exports only components (react-refresh\n * requirement).\n */\n\nimport React from \"react\";\nimport { Badge, type BadgeProps } from \"../../badge\";\nimport { formatDate, formatDateTime } from \"@petrarca/sonnet-core\";\n\n/** Extract a sub-field when options.valueKey is set, otherwise return value as-is. */\nfunction resolveValue(\n value: unknown,\n options: Record<string, unknown>,\n): unknown {\n const key = options.valueKey as string | undefined;\n if (key && value != null && typeof value === \"object\") {\n return (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Build a className string, appending whitespace-nowrap when options.nowrap is true. */\nfunction cx(base: string, options: Record<string, unknown>): string {\n return options.nowrap\n ? [base, \"whitespace-nowrap\"].filter(Boolean).join(\" \")\n : base;\n}\n\ntype BadgeColor = NonNullable<BadgeProps[\"badgeColor\"]>;\n\nexport interface CellRendererProps {\n value: unknown;\n /** Full row record -- available for renderers that need sibling fields. */\n row: Record<string, unknown>;\n options: Record<string, unknown>;\n}\n\nexport type CellRenderer = (props: CellRendererProps) => React.ReactElement;\n\nexport function TextCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function MutedCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BoldCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-medium\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function CodeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-mono text-xs\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n if (value == null)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n const key = String(value);\n const colors = options.colors as Record<string, BadgeColor> | undefined;\n const labels = options.labels as Record<string, string> | undefined;\n const color = colors?.[key];\n const label = labels?.[key] ?? key;\n return <Badge badgeColor={color}>{label}</Badge>;\n}\n\ntype BadgeVariant = NonNullable<BadgeProps[\"variant\"]>;\ntype ConditionalBadgeWhen = \"empty\" | \"present\" | \"truthy\" | \"falsy\";\ntype ConditionalBadgeFallback = \"dash\" | \"value\" | \"muted-value\";\n\nfunction conditionHolds(value: unknown, when: ConditionalBadgeWhen): boolean {\n const isEmpty = value == null || value === \"\";\n switch (when) {\n case \"empty\":\n return isEmpty;\n case \"present\":\n return !isEmpty;\n case \"truthy\":\n return Boolean(value);\n case \"falsy\":\n return !value;\n }\n}\n\nfunction renderConditionalFallback(\n value: unknown,\n fallback: ConditionalBadgeFallback,\n): React.ReactElement {\n if (fallback === \"dash\" || value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n }\n if (fallback === \"muted-value\") {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\n/**\n * Renders a badge when a condition on the cell value holds, and a configurable\n * fallback otherwise. A generic \"flag/marker\" cell -- e.g. a \"Default\" badge\n * when a boolean is true, or a \"Root\" badge when a parent id is empty.\n *\n * x-ui-cell-options:\n * when: \"empty\" | \"present\" | \"truthy\" | \"falsy\" (default \"truthy\")\n * label: badge text (default: the cell value)\n * variant: Badge variant, e.g. \"outline\" | \"secondary\" (default \"secondary\")\n * fallback: \"dash\" (em dash) | \"value\" | \"muted-value\" (default \"dash\")\n *\n * Carries no domain knowledge -- the condition, label, and styling all come\n * from the schema.\n */\nexport function ConditionalBadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const when = (options.when as ConditionalBadgeWhen | undefined) ?? \"truthy\";\n const variant = (options.variant as BadgeVariant | undefined) ?? \"secondary\";\n const fallback =\n (options.fallback as ConditionalBadgeFallback | undefined) ?? \"dash\";\n\n if (conditionHolds(value, when)) {\n const label =\n options.label != null ? String(options.label) : String(value ?? \"\");\n return <Badge variant={variant}>{label}</Badge>;\n }\n\n return renderConditionalFallback(value, fallback);\n}\n\nexport function DateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDate(value as string | null)}\n </span>\n );\n}\n\nexport function DateTimeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDateTime(value as string | null)}\n </span>\n );\n}\n\nexport function BooleanCell({ value }: CellRendererProps): React.ReactElement {\n return (\n <span className={value ? \"text-green-600\" : \"text-muted-foreground\"}>\n {value ? \"Yes\" : \"No\"}\n </span>\n );\n}\n\nexport function NumberCell({ value }: CellRendererProps): React.ReactElement {\n const text = value == null ? \"\\u2014\" : String(value);\n return <span className=\"tabular-nums\">{text}</span>;\n}\n\nexport function TruncateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const resolved = resolveValue(value, options);\n const text = resolved == null ? \"\\u2014\" : String(resolved);\n return (\n <span className=\"block truncate max-w-xs\" title={text}>\n {text}\n </span>\n );\n}\n\n/**\n * Renders the first item of an array with a \"+N\" overflow count.\n *\n * Options:\n * displayKey -- object field to use as the display label\n * fallbackKey -- object field to use when displayKey is null/undefined\n * prefixKey -- object field to render as a muted prefix before the label (e.g. \"type: name\")\n */\nexport function OverflowListCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const items = Array.isArray(value)\n ? (value as Record<string, unknown>[])\n : [];\n if (items.length === 0)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n\n const displayKey = options.displayKey as string | undefined;\n const fallbackKey = options.fallbackKey as string | undefined;\n const prefixKey = options.prefixKey as string | undefined;\n\n const first = items[0];\n const label =\n (displayKey && (first[displayKey] as string | null | undefined)) ||\n (fallbackKey && (first[fallbackKey] as string)) ||\n \"\";\n\n return (\n <>\n {prefixKey && (\n <span className=\"text-muted-foreground\">\n {String(first[prefixKey])}:{\" \"}\n </span>\n )}\n {label}\n {items.length > 1 && (\n <span className=\"text-muted-foreground ml-1\">+{items.length - 1}</span>\n )}\n </>\n );\n}\n\n/** Joins an array of strings with a separator (default: \", \"). */\nexport function JoinCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const sep = (options.separator as string | undefined) ?? \", \";\n if (!Array.isArray(value) || value.length === 0)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n return <span className=\"text-muted-foreground\">{value.join(sep)}</span>;\n}\n","/**\n * Resolve JSON Schema + UI Schema into a list of ResolvedColumn descriptors.\n *\n * Pure function -- no React, no DOM, fully testable.\n * Extractable to @petrarca/sonnet-core.\n */\n\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport { mergeColumnConfig } from \"./mergeUiSchema\";\nimport { inferCellRenderer } from \"./cellRegistry\";\nimport type { ResolvedColumn, TableUiSchema } from \"./types\";\n\n/**\n * Resolve schema properties into ordered, filtered column descriptors.\n *\n * Steps:\n * 1. Merge x-ui-column + UI schema per property.\n * 2. Drop hidden properties.\n * 3. Sort: properties with explicit order first (ascending), then\n * remaining properties in schema declaration order. Declaration order (not\n * alphabetical) matches the form renderer and what authors expect; columns\n * that need a specific position set x-ui-column.order.\n * 4. Build ResolvedColumn for each.\n */\nexport function resolveColumns(\n schema: JsonSchema,\n uiSchema?: TableUiSchema,\n): ResolvedColumn[] {\n const properties = schema.properties ?? {};\n\n const entries = Object.entries(properties)\n .map(([key, property], index) => {\n const config = mergeColumnConfig(key, property, uiSchema);\n return { key, property, config, index };\n })\n .filter(({ config }) => !config.hidden);\n\n // Split into ordered and unordered buckets.\n const ordered = entries\n .filter(({ config }) => config.order !== undefined)\n .sort((a, b) => a.config.order! - b.config.order!);\n\n // Unordered columns keep their schema declaration order.\n const unordered = entries\n .filter(({ config }) => config.order === undefined)\n .sort((a, b) => a.index - b.index);\n\n const sorted = [...ordered, ...unordered];\n\n return sorted.map(({ key, property, config }) => {\n const cellRenderer =\n config.cellRenderer ?? inferCellRenderer(property.type, property.format);\n\n // Label priority: UI schema label > x-ui-column.label > property title > key\n const label = config.label ?? property.title ?? keyToLabel(key);\n\n return {\n key,\n label,\n property,\n cellRenderer,\n cellOptions: config.cellOptions,\n width: config.width,\n minWidth: config.minWidth,\n };\n });\n}\n\n/** Convert a snake_case key to a Title Case label as a last-resort fallback. */\nfunction keyToLabel(key: string): string {\n return key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * PropertyList — read-only display of a record's properties.\n *\n * Two layout modes:\n * - `\"inline\"` (default) — horizontal two-column grid, key left / value right.\n * - `\"stacked\"` — key label above each value.\n *\n * Values rendered by {@link PropertyValue}. Optional per-property schema\n * refines value rendering (schema is NOT required).\n *\n * Shared by the graph view's node/edge cards and the table inspector so all\n * property displays look identical.\n */\n\nimport React from \"react\";\nimport { copyTextToClipboard } from \"@petrarca/sonnet-core\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { PropertyValue } from \"./PropertyValue\";\n\n/** Layout mode for the property list. */\nexport type PropertyListLayout = \"inline\" | \"stacked\";\n\nexport interface PropertyListProps {\n /** Property name -> value. */\n properties: Record<string, unknown>;\n /** Optional property name -> schema, to refine value rendering. */\n propertySchemas?: Record<string, JsonSchemaProperty>;\n /** Layout mode. Default \"inline\" (horizontal key-value grid). */\n layout?: PropertyListLayout;\n /** Show a \"Properties\" section header. Default false. */\n showHeader?: boolean;\n /** Click value to copy it to the clipboard. Default true. */\n copyable?: boolean;\n /** Message when there are no properties. Default \"No properties\". */\n emptyLabel?: string;\n className?: string;\n}\n\nexport function PropertyList({\n properties,\n propertySchemas,\n layout = \"inline\",\n showHeader = false,\n copyable = true,\n emptyLabel = \"No properties\",\n className,\n}: PropertyListProps): React.ReactElement {\n const entries = Object.entries(properties ?? {});\n\n if (entries.length === 0) {\n return <p className=\"text-sm text-muted-foreground italic\">{emptyLabel}</p>;\n }\n\n const header = showHeader && (\n <p className=\"text-[11px] text-muted-foreground mb-1.5\">Properties</p>\n );\n\n const dtClass = `text-[11px] text-muted-foreground ${copyable ? \"cursor-pointer hover:text-foreground\" : \"\"}`;\n\n const dtProps = (value: unknown) =>\n copyable\n ? {\n onClick: () => copyTextToClipboard(stringForCopy(value)),\n title: \"Click to copy value\",\n }\n : {};\n\n if (layout === \"stacked\") {\n return (\n <div className={className}>\n {header}\n <dl className=\"space-y-1\">\n {entries.map(([key, value]) => (\n <div key={key}>\n <dt className={dtClass} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground font-medium break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n }\n\n // inline (default): horizontal two-column grid\n return (\n <div className={className}>\n {header}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 items-baseline\">\n {entries.map(([key, value]) => (\n <React.Fragment key={key}>\n <dt className={`${dtClass} whitespace-nowrap`} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground min-w-0 break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </React.Fragment>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction stringForCopy(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n","/**\n * PropertyValue — read-only, type-aware rendering of a single property value.\n *\n * Reliable model (matches graph-explorer best practice): render by the actual\n * VALUE TYPE, never by guessing string contents.\n * - object / array -> collapsed summary that expands to a JSON tree (bounded box)\n * - long string -> clamped to a few lines with a \"Show more\" toggle\n * - scalar -> inline text\n * - boolean -> true/false (or schema boolean cell)\n * - array of scalars-> comma list\n *\n * Schema is OPTIONAL and only REFINES rendering when present:\n * - x-ui-cell / inferred type/format (date, datetime, boolean, number)\n * - x-ui-cell: \"json\" forces a JSON tree even for a string value\n * A plain string is treated as text by default — it is NOT auto-parsed as\n * JSON (avoids fragile, surprising behaviour). Schema is the only signal that\n * turns a JSON-looking string into a tree.\n */\n\nimport React, { useState } from \"react\";\nimport { JSONTree } from \"react-json-tree\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { CELL_RENDERERS } from \"../EntityTable/tableSchema\";\nimport { inferCellRenderer } from \"../EntityTable/tableSchema/cellRegistry\";\n\nexport interface PropertyValueProps {\n value: unknown;\n /** Optional schema for this property; refines rendering when present. */\n schema?: JsonSchemaProperty;\n className?: string;\n /** Strings longer than this clamp with a \"Show more\" toggle. */\n clampChars?: number;\n}\n\nconst DEFAULT_CLAMP_CHARS = 180;\n\n// JSON tree theme driven by semantic tokens (dark-mode aware via CSS vars).\nconst tokenTheme = {\n scheme: \"sonnet\",\n base00: \"transparent\",\n base01: \"hsl(var(--muted))\",\n base02: \"hsl(var(--border))\",\n base03: \"hsl(var(--muted-foreground))\",\n base04: \"hsl(var(--muted-foreground))\",\n base05: \"hsl(var(--foreground))\",\n base06: \"hsl(var(--foreground))\",\n base07: \"hsl(var(--foreground))\",\n base08: \"hsl(var(--destructive))\",\n base09: \"hsl(var(--primary))\",\n base0A: \"hsl(var(--primary))\",\n base0B: \"hsl(var(--primary))\",\n base0C: \"hsl(var(--primary))\",\n base0D: \"hsl(var(--primary))\",\n base0E: \"hsl(var(--primary))\",\n base0F: \"hsl(var(--muted-foreground))\",\n} as const;\n\nfunction isObjectLike(v: unknown): v is object {\n return typeof v === \"object\" && v !== null;\n}\n\n/** Object / array value -> collapsed summary that expands to a JSON tree. */\nfunction JsonValue({ value }: { value: object }): React.ReactElement {\n const [open, setOpen] = useState(false);\n const summary = Array.isArray(value)\n ? `[${value.length} item${value.length === 1 ? \"\" : \"s\"}]`\n : `{${Object.keys(value).length} key${Object.keys(value).length === 1 ? \"\" : \"s\"}}`;\n\n if (!open) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-sm font-mono text-muted-foreground hover:text-foreground\"\n >\n {summary} <span className=\"text-xs\">— show</span>\n </button>\n );\n }\n\n return (\n <div className=\"text-xs font-mono\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"mb-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n hide\n </button>\n <div className=\"max-h-64 overflow-auto rounded border border-border bg-muted/30 px-2 py-1\">\n <JSONTree\n data={value}\n theme={tokenTheme}\n invertTheme={false}\n shouldExpandNodeInitially={() => true}\n hideRoot\n />\n </div>\n </div>\n );\n}\n\n/** Long string -> clamped with a \"Show more\" toggle and bounded scroll on expand. */\nfunction LongTextValue({ text }: { text: string }): React.ReactElement {\n const [open, setOpen] = useState(false);\n if (!open) {\n return (\n <span className=\"break-words\">\n <span className=\"line-clamp-3 align-bottom\">{text}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show more\n </button>\n </span>\n );\n }\n return (\n <span className=\"break-words\">\n <span className=\"block max-h-64 overflow-auto whitespace-pre-wrap rounded border border-border bg-muted/30 px-2 py-1\">\n {text}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show less\n </button>\n </span>\n );\n}\n\n/** Schema-driven rendering; returns null to fall through to value-shape. */\nfunction renderFromSchema(\n value: unknown,\n schema: JsonSchemaProperty,\n className?: string,\n): React.ReactElement | null {\n const cellName =\n schema[\"x-ui-cell\"] ?? inferCellRenderer(schema.type, schema.format);\n // \"json\" forces a tree even for string-typed values.\n if (cellName === \"json\") {\n const parsed = typeof value === \"string\" ? safeParse(value) : value;\n return isObjectLike(parsed) ? <JsonValue value={parsed} /> : null;\n }\n if (cellName && cellName !== \"text\") {\n const Renderer = CELL_RENDERERS[cellName];\n if (Renderer) {\n return (\n <span className={className}>\n <Renderer\n value={value}\n row={{}}\n options={\n (schema[\"x-ui-cell-options\"] as Record<string, unknown>) ?? {}\n }\n />\n </span>\n );\n }\n }\n return null;\n}\n\n/** Object/array value: scalar arrays -> comma list; structured -> JSON tree. */\nfunction renderObjectLike(\n value: object,\n className?: string,\n): React.ReactElement {\n if (Array.isArray(value) && value.every((v) => !isObjectLike(v))) {\n return (\n <span className={`break-words ${className ?? \"\"}`}>\n {value.map(String).join(\", \")}\n </span>\n );\n }\n return <JsonValue value={value} />;\n}\n\n/** String value: text by default; long strings clamp with a \"Show more\" toggle. */\nfunction renderString(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (typeof value === \"boolean\") {\n return <span className={className}>{value ? \"true\" : \"false\"}</span>;\n }\n const str = String(value);\n if (str.length > clampChars || str.includes(\"\\n\")) {\n return (\n <span className={className}>\n <LongTextValue text={str} />\n </span>\n );\n }\n return <span className={`break-words ${className ?? \"\"}`}>{str}</span>;\n}\n\n/** Value-shape rendering (reliable: by type, not by guessing string contents). */\nfunction renderFromValue(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (value == null) {\n return (\n <span className={`text-muted-foreground ${className ?? \"\"}`}>—</span>\n );\n }\n if (isObjectLike(value)) return renderObjectLike(value, className);\n return renderString(value, className, clampChars);\n}\n\nexport function PropertyValue({\n value,\n schema,\n className,\n clampChars = DEFAULT_CLAMP_CHARS,\n}: PropertyValueProps): React.ReactElement {\n const fromSchema = schema ? renderFromSchema(value, schema, className) : null;\n return fromSchema ?? renderFromValue(value, className, clampChars);\n}\n\nfunction safeParse(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return undefined;\n }\n}\n","/**\n * EntitySelect -- async searchable single-select for entity references.\n *\n * Fetches options via a pluggable EntityOptionFetcher. The combobox search\n * input drives server-side filtering through the useEntityOptions hook.\n *\n * Extractable to @petrarca/sonnet-ui -- no app-specific imports.\n */\n\nimport * as React from \"react\";\nimport { Check, ChevronsUpDown, Loader2, X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"../button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport {\n useEntityOptions,\n type EntitySelectMode,\n type UseEntityOptionsReturn,\n} from \"@petrarca/sonnet-core/hooks\";\nimport type {\n EntityOptionFetcher,\n EntityOption,\n} from \"@petrarca/sonnet-core/entityOptions\";\n\nfunction emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n}: {\n mode: EntitySelectMode;\n search: string;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n}): string {\n if (isLoading) return \"Loading...\";\n if (mode === \"eager\") return emptyMessage;\n if (search.length === 0) return \"Start typing to search...\";\n if (mode === \"typeahead\" && search.length < minChars)\n return `Type at least ${minChars} character${minChars > 1 ? \"s\" : \"\"} to search...`;\n if (mode === \"explicit\" && !hasSearched) return \"Press Enter to search...\";\n return emptyMessage;\n}\n\n// Explicit mode tracks whether submit() has ever been called.\nfunction useHasSearched(\n submit: UseEntityOptionsReturn[\"submit\"],\n): [boolean, UseEntityOptionsReturn[\"submit\"]] {\n const [hasSearched, setHasSearched] = React.useState(false);\n const wrappedSubmit = React.useCallback(() => {\n setHasSearched(true);\n submit();\n }, [submit]);\n return [hasSearched, wrappedSubmit];\n}\n\nexport interface EntitySelectProps {\n /** The fetcher that provides options from the backend. */\n fetcher: EntityOptionFetcher;\n /**\n * Stable cache key for TanStack Query. Must be unique per fetcher/endpoint\n * combination -- two components using the same key share the same cache entry.\n */\n queryKey: string;\n /**\n * Search mode. Default: \"eager\".\n * eager -- fetch on mount, refetch as user types (small collections)\n * typeahead -- fetch only after minChars are typed (large collections)\n * explicit -- fetch only when user presses Enter\n */\n mode?: EntitySelectMode;\n /** Minimum characters before typeahead mode fires (default 1). */\n minChars?: number;\n /** Currently selected value (controlled). */\n value?: string | null;\n /**\n * The option for the current value, supplying its label. Use when the\n * selected value is set before any options have loaded (e.g. an edit form\n * in typeahead/explicit mode) so the trigger can render the label without\n * fetching the full list. Must match `value`; ignored otherwise.\n */\n selectedOption?: EntityOption | null;\n /** Called when the selection changes. */\n onChange?: (value: string | null) => void;\n /** Called when the selection changes, passing the full option (value + label). */\n onChangeOption?: (option: EntityOption | null) => void;\n /** Called when the dropdown closes (for form blur tracking). */\n onBlur?: () => void;\n /** Label displayed above the select. Pass false to hide. */\n label?: string | false;\n /** Placeholder when nothing is selected. */\n placeholder?: string;\n /** Placeholder for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Message when no options match the search. */\n emptyMessage?: string;\n /** Whether the field is required (shows asterisk). */\n required?: boolean;\n /**\n * Show a clear (X) affordance that resets the selection to null when a value\n * is set. Use for optional entity references (e.g. an assignment that can be\n * removed). Ignored when required or disabled.\n */\n clearable?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Description text below the label. */\n description?: string;\n /** Error message. */\n error?: string;\n /** Additional className for the wrapper. */\n className?: string;\n /** HTML id for the trigger button. */\n id?: string;\n}\n\nfunction resolveEntitySelectDefaults(props: EntitySelectProps) {\n return {\n mode: props.mode ?? \"eager\",\n minChars: props.minChars ?? 1,\n placeholder: props.placeholder ?? \"Select...\",\n searchPlaceholder: props.searchPlaceholder ?? \"Search...\",\n emptyMessage: props.emptyMessage ?? \"No results found\",\n disabled: props.disabled ?? false,\n } as const;\n}\n\nfunction EntitySelectLabel({\n id,\n label,\n required,\n description,\n}: {\n id?: string;\n label?: string | false;\n required?: boolean;\n description?: string;\n}): React.ReactElement | null {\n const hasLabel = label !== undefined && label !== false;\n return (\n <>\n {hasLabel && (\n <label\n htmlFor={id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </>\n );\n}\n\nfunction EntitySelectDropdown({\n searchPlaceholder,\n search,\n setSearch,\n mode,\n submit,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n options,\n value,\n handleSelect,\n}: {\n searchPlaceholder: string;\n search: string;\n setSearch: (v: string) => void;\n mode: EntitySelectMode;\n submit: () => void;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n options: EntityOption[];\n value?: string | null;\n handleSelect: (v: string) => void;\n}): React.ReactElement {\n return (\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={\n mode === \"explicit\"\n ? (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n }\n }\n : undefined\n }\n />\n <CommandList>\n <CommandEmpty>\n {emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n })}\n </CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={handleSelect}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\nexport function EntitySelect(props: EntitySelectProps): React.ReactElement {\n const {\n fetcher,\n queryKey,\n value,\n selectedOption,\n onChange,\n onChangeOption,\n onBlur,\n label,\n required,\n clearable,\n description,\n error,\n className,\n id,\n } = props;\n const {\n mode,\n minChars,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n } = resolveEntitySelectDefaults(props);\n\n const [open, setOpen] = React.useState(false);\n\n // Retain the label of the selected option independently of whether it\n // appears in the current search results. Without this, clearing the search\n // input after a selection causes the trigger to revert to the placeholder.\n const [selectedLabel, setSelectedLabel] = React.useState<string | null>(null);\n\n const {\n options,\n isLoading,\n search,\n setSearch,\n submit: rawSubmit,\n } = useEntityOptions({ fetcher, queryKey, mode, minChars });\n\n const [hasSearched, submit] = useHasSearched(rawSubmit);\n\n // Sync selectedLabel when value changes externally or when options arrive\n // that contain the current value (e.g. initial load).\n React.useEffect(() => {\n if (!value) {\n setSelectedLabel(null);\n return;\n }\n const found = options.find((opt) => opt.value === value);\n if (found) {\n setSelectedLabel(found.label);\n } else if (selectedOption && selectedOption.value === value) {\n // Seed the label for a pre-selected value before options have loaded\n // (e.g. an edit form in typeahead/explicit mode).\n setSelectedLabel(selectedOption.label);\n }\n }, [value, options, selectedOption]);\n\n const handleClear = React.useCallback(\n (e: React.MouseEvent): void => {\n // Reset to null without opening the dropdown.\n e.preventDefault();\n e.stopPropagation();\n setSelectedLabel(null);\n onChange?.(null);\n onChangeOption?.(null);\n },\n [onChange, onChangeOption],\n );\n\n const showClear = Boolean(clearable && value && !required && !disabled);\n\n const handleSelect = React.useCallback(\n (selectedValue: string) => {\n const opt = options.find((o) => o.value === selectedValue);\n if (opt) setSelectedLabel(opt.label);\n const newValue = selectedValue === value ? null : selectedValue;\n if (newValue === null) setSelectedLabel(null);\n onChange?.(newValue);\n onChangeOption?.(newValue === null ? null : (opt ?? null));\n setOpen(false);\n setSearch(\"\");\n },\n [options, value, onChange, onChangeOption, setSearch],\n );\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n setOpen(newOpen);\n if (!newOpen) {\n setSearch(\"\");\n onBlur?.();\n }\n },\n [onBlur, setSearch],\n );\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <EntitySelectLabel\n id={id}\n label={label}\n required={required}\n description={description}\n />\n\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n \"w-full justify-between\",\n !selectedLabel && \"text-muted-foreground\",\n error && \"border-destructive\",\n )}\n disabled={disabled}\n >\n <span className=\"truncate\">{selectedLabel ?? placeholder}</span>\n <div className=\"flex items-center gap-1\">\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin opacity-50\" />\n )}\n {showClear && (\n <span\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n className=\"rounded-sm opacity-50 hover:opacity-100\"\n onPointerDown={handleClear}\n >\n <X className=\"h-4 w-4 shrink-0\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[--radix-popover-trigger-width] p-0\"\n align=\"start\"\n >\n <EntitySelectDropdown\n searchPlaceholder={searchPlaceholder}\n search={search}\n setSearch={setSearch}\n mode={mode}\n submit={submit}\n minChars={minChars}\n isLoading={isLoading}\n hasSearched={hasSearched}\n emptyMessage={emptyMessage}\n options={options}\n value={value}\n handleSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n\n {error && <p className=\"text-sm font-medium text-destructive\">{error}</p>}\n </div>\n );\n}\n","/**\n * EntityTree -- schema-driven tree component.\n *\n * Wraps TreeView and drives column rendering from a JSON Schema +\n * optional UI Schema, using the same resolveColumns / resolveCellRenderer\n * pipeline as EntityTable. Each visible tree node row renders as a set\n * of schema-derived cells.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click sets active row, pencil\n * icon visible on active/hover rows, Enter/Space triggers onNodeEdit.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, pencil icon is hidden, onNodeEdit is suppressed.\n *\n * Loading, error, and empty states are communicated via node flags and\n * the top-level isLoading / isError / isEmpty props.\n *\n * Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type MutableRefObject,\n} from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { TreeView } from \"../TreeView\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"../EntityTable/tableSchema\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { TreeNode, TreeViewHandle, TreeViewProps } from \"../TreeView\";\n\nexport type { CellRenderer, TableUiSchema, TreeNode };\n\n/** Imperative handle for programmatic focus. */\nexport interface EntityTreeHandle {\n focus(): void;\n}\n\nexport interface EntityTreeProps<TData extends Record<string, unknown>> {\n // Column definition\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n renderers?: Record<string, CellRenderer>;\n\n // Tree structure (passed through to TreeView)\n nodes: TreeNode<TData>[];\n expandedIds: Set<string>;\n onExpand: TreeViewProps<TData>[\"onExpand\"];\n onCollapse: TreeViewProps<TData>[\"onCollapse\"];\n\n // Top-level states (for when no nodes are loaded yet)\n isLoading?: boolean;\n isError?: boolean;\n errorMessage?: string;\n entityLabel?: string;\n\n // Interaction\n /** Called on row click -- sets the active row without opening edit. */\n onNodeSelect?: (node: TreeNode<TData>) => void;\n /** Called when the pencil icon is clicked -- opens the edit panel. */\n onNodeEdit?: (node: TreeNode<TData>) => void;\n /** Id of the currently active node. Controls pencil-icon visibility only\n * (always shown on the active node, hover-only on others). Row highlight\n * is managed by TreeView via focus state. */\n activeNodeId?: string;\n\n // Selection mode (opt-in). When true: checkboxes appear, pencil icon\n // is hidden, onNodeEdit is suppressed. When false (default): normal\n // browse/edit behavior.\n selectionMode?: boolean;\n selectedIds?: Set<string>;\n onSelectionChange?: TreeViewProps<TData>[\"onSelectionChange\"];\n /** When true, the first selected node locks subsequent selections to its\n * siblings (nodes at the same depth sharing the same parent). Clearing\n * all selections resets the constraint. Managed internally by TreeView. */\n constrainSelectionToSiblings?: boolean;\n\n /**\n * Optional override for specific node rendering. When provided, called\n * before the default schema-driven renderer. Return a React node to\n * replace the default, or null to fall through to the default.\n */\n renderNodeOverride?: (\n node: TreeNode<TData>,\n depth: number,\n ) => React.ReactNode | null;\n\n indentPx?: number;\n className?: string;\n}\n\nfunction buildCellRow<TData extends Record<string, unknown>>(\n resolved: ResolvedColumn[],\n activeNodeIdRef: MutableRefObject<string | undefined>,\n onNodeEdit: ((node: TreeNode<TData>) => void) | undefined,\n localRenderers?: Record<string, CellRenderer>,\n) {\n return function renderCells(node: TreeNode<TData>): React.ReactElement {\n const isActive = node.id === activeNodeIdRef.current;\n return (\n <span className=\"flex items-center gap-4 min-w-0 w-full group/row\">\n {resolved.map((col) => {\n const Renderer = resolveCellRenderer(\n col.cellRenderer,\n localRenderers,\n );\n const value = node.data[col.key];\n return (\n <span\n key={col.key}\n className=\"shrink-0\"\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n <Renderer\n value={value}\n row={node.data as Record<string, unknown>}\n options={col.cellOptions}\n />\n </span>\n );\n })}\n {onNodeEdit && (\n <span className=\"ml-auto shrink-0\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onNodeEdit(node);\n }}\n aria-label=\"Edit\"\n className={cn(\n \"p-1 rounded hover:bg-background text-muted-foreground hover:text-foreground transition-colors\",\n isActive\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100\",\n )}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </button>\n </span>\n )}\n </span>\n );\n };\n}\n\nfunction resolveEntityTreeDefaults(props: {\n isLoading?: boolean;\n isError?: boolean;\n entityLabel?: string;\n selectionMode?: boolean;\n}) {\n return {\n isLoading: props.isLoading ?? false,\n isError: props.isError ?? false,\n entityLabel: props.entityLabel ?? \"items\",\n selectionMode: props.selectionMode ?? false,\n } as const;\n}\n\n/**\n * Render the appropriate status view for loading/error/empty states.\n * Not a React component -- no hooks. Called as a plain function.\n * Returns null when none of the status conditions apply.\n */\nfunction renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n}: {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n entityLabel: string;\n nodes: unknown[];\n className?: string;\n}): React.ReactElement | null {\n if (isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n Loading\\u2026\n </div>\n );\n }\n\n if (isError) {\n return (\n <div\n className={cn(\"py-8 text-center text-sm text-destructive\", className)}\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </div>\n );\n }\n\n if (!isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No {entityLabel} yet.\n </div>\n );\n }\n\n return null;\n}\n\nfunction resolveRenderNode<TData extends Record<string, unknown>>(\n renderNodeOverride: EntityTreeProps<TData>[\"renderNodeOverride\"],\n defaultRenderNode: (node: TreeNode<TData>) => React.ReactElement,\n): (node: TreeNode<TData>, depth: number) => React.ReactNode {\n if (!renderNodeOverride) return defaultRenderNode;\n return (node: TreeNode<TData>, depth: number): React.ReactNode => {\n const override = renderNodeOverride(node, depth);\n if (override !== null) return override;\n return defaultRenderNode(node);\n };\n}\n\nfunction resolveSelectionProps<TData extends Record<string, unknown>>(\n selectionMode: boolean,\n props: Pick<\n EntityTreeProps<TData>,\n | \"onNodeEdit\"\n | \"selectedIds\"\n | \"onSelectionChange\"\n | \"constrainSelectionToSiblings\"\n >,\n) {\n return {\n effectiveOnNodeEdit: selectionMode ? undefined : props.onNodeEdit,\n onNodeActivate: selectionMode ? undefined : props.onNodeEdit,\n selectedIds: selectionMode ? props.selectedIds : undefined,\n onSelectionChange: selectionMode ? props.onSelectionChange : undefined,\n constrainSelectionToSiblings: selectionMode\n ? props.constrainSelectionToSiblings\n : undefined,\n };\n}\n\n/**\n * EntityTree renders a tree hierarchy where each node row is driven by a\n * JSON Schema column definition, using the same cell renderer pipeline as\n * EntityTable. Row click selects the active node; the pencil icon or Enter\n * triggers edit.\n */\nfunction EntityTreeInner<TData extends Record<string, unknown>>(\n props: EntityTreeProps<TData>,\n ref: React.Ref<EntityTreeHandle>,\n): React.ReactElement {\n const {\n schema,\n uiSchema,\n renderers,\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n errorMessage,\n onNodeSelect,\n onNodeEdit,\n activeNodeId,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n renderNodeOverride,\n indentPx,\n className,\n } = props;\n const { isLoading, isError, entityLabel, selectionMode } =\n resolveEntityTreeDefaults(props);\n\n const treeRef = useRef<TreeViewHandle>(null);\n\n useImperativeHandle(ref, () => ({\n focus() {\n treeRef.current?.focus();\n },\n }));\n\n const resolved = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return resolveColumns(schema, uiSchema);\n }, [schema, uiSchema, renderers]);\n\n // Ref so renderNode reads the current value at call time without\n // recreating the function on every active node change.\n const activeNodeIdRef = useRef(activeNodeId);\n activeNodeIdRef.current = activeNodeId;\n\n const selection = resolveSelectionProps(selectionMode, {\n onNodeEdit,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n });\n\n const defaultRenderNode = useMemo(\n () =>\n buildCellRow<TData>(\n resolved,\n activeNodeIdRef,\n selection.effectiveOnNodeEdit,\n renderers,\n ),\n [resolved, selection.effectiveOnNodeEdit, renderers],\n );\n\n const renderNode = useMemo(\n () => resolveRenderNode(renderNodeOverride, defaultRenderNode),\n [renderNodeOverride, defaultRenderNode],\n );\n\n const statusView = renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n });\n if (statusView) return statusView;\n\n return (\n <div className={cn(\"rounded-lg border\", className)}>\n <TreeView<TData>\n ref={treeRef}\n nodes={nodes}\n expandedIds={expandedIds}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeSelect}\n onNodeActivate={selection.onNodeActivate}\n renderNode={renderNode}\n selectedIds={selection.selectedIds}\n onSelectionChange={selection.onSelectionChange}\n constrainSelectionToSiblings={selection.constrainSelectionToSiblings}\n indentPx={indentPx}\n className=\"p-1\"\n />\n </div>\n );\n}\n\nexport const EntityTree = forwardRef(EntityTreeInner) as <\n TData extends Record<string, unknown>,\n>(\n props: EntityTreeProps<TData> & { ref?: React.Ref<EntityTreeHandle> },\n) => React.ReactElement;\n","/**\n * TreeView -- generic, accessible tree component.\n *\n * Renders a hierarchy of nodes with expand/collapse, keyboard navigation,\n * and optional row selection. Node content is fully delegated to the\n * caller via a renderNode render prop -- this component owns structure\n * and interaction only.\n *\n * Accessibility: implements WAI-ARIA Tree View pattern with\n * role=\"tree\", role=\"treeitem\", aria-expanded, aria-selected.\n * Keyboard: ArrowDown/Up move focus, ArrowRight expands / moves into\n * first child, ArrowLeft collapses / moves to parent, Enter/Space\n * activate the focused node.\n *\n * Loading and error states per node are communicated via the node data\n * itself (isLoading, isError flags). The caller controls data fetching.\n *\n * Extractable to @petrarca/sonnet-ui. Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single node in the tree. TData carries the domain payload. */\nexport interface TreeNode<TData = Record<string, unknown>> {\n /** Stable unique identifier for this node. */\n id: string;\n /** Domain payload, passed through to renderNode. */\n data: TData;\n /** Whether this node can have children (controls expand affordance). */\n hasChildren: boolean;\n /** Children that have already been loaded. undefined = not yet fetched. */\n children?: TreeNode<TData>[];\n /** True while children are being fetched. */\n isLoading?: boolean;\n /** True when the child fetch failed. */\n isError?: boolean;\n}\n\nexport interface TreeViewProps<TData = Record<string, unknown>> {\n /** Root-level nodes. */\n nodes: TreeNode<TData>[];\n /** Set of node ids that are currently expanded. Controlled. */\n expandedIds: Set<string>;\n /** Called when the user requests to expand a node. */\n onExpand: (nodeId: string) => void;\n /** Called when the user requests to collapse a node. */\n onCollapse: (nodeId: string) => void;\n /** Called when the user clicks a node row. */\n onNodeClick?: (node: TreeNode<TData>) => void;\n /** Called when the user activates a node via keyboard (Enter or Space). */\n onNodeActivate?: (node: TreeNode<TData>) => void;\n /**\n * Render the visible content of a single node row.\n * depth starts at 0 for root nodes.\n */\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n /** Row selection -- set of selected node ids. Controlled, opt-in. */\n selectedIds?: Set<string>;\n /** Called when the user toggles selection on a node. */\n onSelectionChange?: (nodeId: string, selected: boolean) => void;\n /** When true, the first selected node locks checkboxes to its siblings\n * (nodes sharing the same parent). Clearing all selections resets the\n * constraint so a different sibling group can be selected next. */\n constrainSelectionToSiblings?: boolean;\n /** Pixels of indentation per depth level. Default 20. */\n indentPx?: number;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Flat ordered list of visible nodes for keyboard navigation. */\ninterface FlatNode<TData> {\n node: TreeNode<TData>;\n depth: number;\n parentId: string | null;\n}\n\nfunction flatten<TData>(\n nodes: TreeNode<TData>[],\n expandedIds: Set<string>,\n depth = 0,\n parentId: string | null = null,\n result: FlatNode<TData>[] = [],\n): FlatNode<TData>[] {\n for (const node of nodes) {\n result.push({ node, depth, parentId });\n if (expandedIds.has(node.id) && node.children) {\n flatten(node.children, expandedIds, depth + 1, node.id, result);\n }\n }\n return result;\n}\n\n// Sentinel value for \"no sibling constraint active\". A Symbol avoids\n// collision with real parentId values (string | null).\nconst UNCONSTRAINED = Symbol.for(\"tree-view:unconstrained\");\n\n// ---------------------------------------------------------------------------\n// ToggleIcon -- expand/collapse/leaf icon for a tree node.\n// ---------------------------------------------------------------------------\n\ninterface ToggleIconProps {\n hasChildren: boolean;\n isLoading?: boolean;\n isExpanded: boolean;\n}\n\nfunction ToggleIcon({\n hasChildren,\n isLoading,\n isExpanded,\n}: ToggleIconProps): React.ReactElement {\n if (!hasChildren) {\n return (\n <span className=\"block w-1.5 h-1.5 rounded-full bg-border mx-auto\" />\n );\n }\n if (isLoading) {\n return (\n <span className=\"block w-3 h-3 rounded-full border-2 border-muted-foreground/40 border-t-foreground animate-spin\" />\n );\n }\n return (\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// NodeRow\n// ---------------------------------------------------------------------------\n\ninterface NodeRowProps<TData> {\n flat: FlatNode<TData>;\n expandedIds: Set<string>;\n selectedIds: Set<string>;\n isSelectable: boolean;\n isFocused: boolean;\n indentPx: number;\n treeId: string;\n onExpand: (id: string) => void;\n onCollapse: (id: string) => void;\n onNodeClick?: (node: TreeNode<TData>) => void;\n onSelectionChange?: (id: string, selected: boolean) => void;\n onFocus: (id: string) => void;\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n}\n\nfunction NodeRow<TData>({\n flat,\n expandedIds,\n selectedIds,\n isSelectable,\n isFocused,\n indentPx,\n treeId,\n onExpand,\n onCollapse,\n onNodeClick,\n onSelectionChange,\n onFocus,\n renderNode,\n}: NodeRowProps<TData>): React.ReactElement {\n const { node, depth } = flat;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = selectedIds.has(node.id);\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isExpanded) {\n onCollapse(node.id);\n } else if (node.hasChildren) {\n onExpand(node.id);\n }\n },\n [isExpanded, node.id, node.hasChildren, onExpand, onCollapse],\n );\n\n const handleClick = useCallback(() => {\n onFocus(node.id);\n onNodeClick?.(node);\n }, [node, onFocus, onNodeClick]);\n\n const handleCheckChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onSelectionChange?.(node.id, e.target.checked);\n },\n [node.id, onSelectionChange],\n );\n\n return (\n <li\n id={`${treeId}-node-${node.id}`}\n role=\"treeitem\"\n aria-expanded={node.hasChildren ? isExpanded : undefined}\n aria-selected={onSelectionChange ? isSelected : undefined}\n aria-busy={node.isLoading}\n tabIndex={isFocused ? 0 : -1}\n className={cn(\n \"flex items-center gap-1 px-2 py-1.5 rounded-sm text-sm select-none\",\n \"cursor-pointer transition-colors\",\n \"hover:bg-accent/60\",\n isFocused && \"bg-accent ring-1 ring-ring ring-inset outline-none\",\n isSelected && \"bg-primary/10\",\n )}\n style={{ paddingLeft: depth * indentPx + 8 }}\n onClick={handleClick}\n >\n {/* Expand / collapse toggle */}\n <span\n className=\"shrink-0 flex items-center justify-center w-4 h-4\"\n onClick={handleToggle}\n aria-hidden\n >\n <ToggleIcon\n hasChildren={node.hasChildren}\n isLoading={node.isLoading}\n isExpanded={isExpanded}\n />\n </span>\n\n {/* Optional checkbox for row selection */}\n {onSelectionChange && isSelectable && (\n <input\n type=\"checkbox\"\n className=\"shrink-0 h-3.5 w-3.5 rounded\"\n checked={isSelected}\n onChange={handleCheckChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select ${node.id}`}\n tabIndex={-1}\n />\n )}\n\n {/* Caller-provided node content */}\n <span className=\"flex-1 min-w-0\">{renderNode(node, depth)}</span>\n\n {/* Error indicator */}\n {node.isError && (\n <span className=\"shrink-0 text-xs text-destructive\" aria-live=\"polite\">\n Failed to load\n </span>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeView\n// ---------------------------------------------------------------------------\n\n/** Imperative handle exposed via ref for programmatic focus. */\nexport interface TreeViewHandle {\n /** Focus the tree so keyboard navigation is active. */\n focus(): void;\n}\n\n/**\n * TreeView renders a hierarchy of nodes with expand/collapse, keyboard\n * navigation, and optional row selection. Fully controlled.\n */\nfunction TreeViewInner<TData = Record<string, unknown>>(\n {\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n onNodeClick,\n onNodeActivate,\n renderNode,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n indentPx = 20,\n className,\n }: TreeViewProps<TData>,\n ref: React.Ref<TreeViewHandle>,\n): React.ReactElement {\n const treeId = useId();\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n // Sibling selection constraint: tracks the parentId of the first selected\n // node. UNCONSTRAINED distinguishes \"no constraint\" from \"root level\"\n // (parentId === null). Reset when selection is cleared externally.\n const [constrainedParent, setConstrainedParent] = useState<\n string | null | typeof UNCONSTRAINED\n >(UNCONSTRAINED);\n\n // Reset constraint when controlled selectedIds becomes empty.\n const selectionSize = selectedIds?.size ?? 0;\n useEffect(() => {\n if (selectionSize === 0) setConstrainedParent(UNCONSTRAINED);\n }, [selectionSize]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n // Focus the currently focused node if one exists, otherwise the first\n // treeitem. Events bubble up to the <ul> onKeyDown from the focused <li>.\n const ul = listRef.current;\n if (!ul) return;\n const target = focusedId\n ? ul.querySelector<HTMLElement>(\n `[id$=\"-node-${CSS.escape(focusedId)}\"]`,\n )\n : ul.querySelector<HTMLElement>('[role=\"treeitem\"]');\n target?.focus();\n },\n }),\n [focusedId],\n );\n\n const flatNodes = useMemo(\n () => flatten(nodes, expandedIds),\n [nodes, expandedIds],\n );\n\n // Build a lookup from node id to its parentId in the flat list.\n const parentById = useMemo(() => {\n const map = new Map<string, string | null>();\n for (const f of flatNodes) map.set(f.node.id, f.parentId);\n return map;\n }, [flatNodes]);\n\n // Derive which nodes are selectable under the sibling constraint.\n const selectableSet = useMemo<Set<string> | undefined>(() => {\n if (!constrainSelectionToSiblings || constrainedParent === UNCONSTRAINED) {\n return undefined;\n }\n const ids = new Set<string>();\n for (const f of flatNodes) {\n if (f.parentId === constrainedParent) ids.add(f.node.id);\n }\n return ids;\n }, [constrainSelectionToSiblings, constrainedParent, flatNodes]);\n\n // Wrap onSelectionChange to lock the constraint on first selection.\n const handleSelectionChange = useCallback(\n (nodeId: string, selected: boolean) => {\n if (\n constrainSelectionToSiblings &&\n selected &&\n constrainedParent === UNCONSTRAINED\n ) {\n setConstrainedParent(parentById.get(nodeId) ?? null);\n }\n onSelectionChange?.(nodeId, selected);\n },\n [\n constrainSelectionToSiblings,\n constrainedParent,\n parentById,\n onSelectionChange,\n ],\n );\n\n const focusedIndex = flatNodes.findIndex((f) => f.node.id === focusedId);\n\n const moveFocus = useCallback(\n (delta: number) => {\n if (flatNodes.length === 0) return;\n const next = Math.max(\n 0,\n Math.min(flatNodes.length - 1, focusedIndex + delta),\n );\n const target = flatNodes[next];\n if (target) {\n setFocusedId(target.node.id);\n // Scroll focused item into view\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${target.node.id}`)}`,\n );\n el?.scrollIntoView({ block: \"nearest\" });\n el?.focus();\n }\n },\n [flatNodes, focusedIndex, treeId],\n );\n\n const handleArrowRight = useCallback(\n (current: FlatNode<TData>) => {\n if (current.node.hasChildren && !expandedIds.has(current.node.id)) {\n onExpand(current.node.id);\n } else if (current.node.children && current.node.children.length > 0) {\n moveFocus(1);\n }\n },\n [expandedIds, onExpand, moveFocus],\n );\n\n const handleArrowLeft = useCallback(\n (current: FlatNode<TData>) => {\n if (expandedIds.has(current.node.id)) {\n onCollapse(current.node.id);\n return;\n }\n if (current.parentId === null) return;\n const parentIdx = flatNodes.findIndex(\n (f) => f.node.id === current.parentId,\n );\n if (parentIdx < 0) return;\n const parentFlat = flatNodes[parentIdx];\n if (!parentFlat) return;\n setFocusedId(parentFlat.node.id);\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${parentFlat.node.id}`)}`,\n );\n el?.focus();\n },\n [expandedIds, onCollapse, flatNodes, treeId],\n );\n\n const getFocusedNode = useCallback((): FlatNode<TData> | null => {\n if (focusedIndex < 0) return null;\n return flatNodes[focusedIndex] ?? null;\n }, [flatNodes, focusedIndex]);\n\n const activateNode = useCallback(\n (flat: FlatNode<TData> | null) => {\n if (flat) onNodeActivate?.(flat.node);\n },\n [onNodeActivate],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveFocus(1);\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n moveFocus(-1);\n break;\n\n case \"ArrowRight\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowRight(current);\n break;\n }\n\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowLeft(current);\n break;\n }\n\n case \"Enter\":\n case \" \":\n e.preventDefault();\n activateNode(getFocusedNode());\n break;\n\n default:\n break;\n }\n },\n [\n moveFocus,\n handleArrowRight,\n handleArrowLeft,\n getFocusedNode,\n activateNode,\n ],\n );\n\n if (nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No items.\n </div>\n );\n }\n\n return (\n <ul\n ref={listRef}\n role=\"tree\"\n aria-label=\"Tree\"\n className={cn(\"outline-none\", className)}\n onKeyDown={handleKeyDown}\n >\n {flatNodes.map((flat) => (\n <NodeRow\n key={flat.node.id}\n flat={flat}\n expandedIds={expandedIds}\n selectedIds={selectedIds ?? new Set()}\n isSelectable={!selectableSet || selectableSet.has(flat.node.id)}\n isFocused={flat.node.id === focusedId}\n indentPx={indentPx}\n treeId={treeId}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeClick}\n onSelectionChange={\n onSelectionChange ? handleSelectionChange : undefined\n }\n onFocus={setFocusedId}\n renderNode={renderNode}\n />\n ))}\n </ul>\n );\n}\n\nexport const TreeView = forwardRef(TreeViewInner) as <\n TData = Record<string, unknown>,\n>(\n props: TreeViewProps<TData> & { ref?: React.Ref<TreeViewHandle> },\n) => React.ReactElement;\n","/**\n * SearchInput -- controlled search and filter input with chip display.\n *\n * Supports two modes:\n * \"explicit\" -- fires only on Enter or the search button (default)\n * \"debounce\" -- fires automatically after the user stops typing\n *\n * Supports two search styles:\n * Simple -- no schema prop; produces a single search term\n * Faceted -- schema prop provided; facets derived from schema properties,\n * value entry delegates to search widgets\n *\n * Faceted field picker:\n * - Opens on ArrowDown or chevron button click\n * - Filters to prefix-matching facets as the user types\n * - ArrowDown/ArrowUp navigate the list; Enter selects when navigated or typed\n * - Click on an item accepts that facet\n * - Closes when a facet is selected, input is submitted, or focus leaves\n *\n * Always emits a FilterExpr. Use flattenFilterExpr() from @/lib/search to\n * convert to flat key/value params for server APIs that do not yet accept AST.\n *\n * Extractable to @petrarca/sonnet-ui: no imports from api/, services/,\n * store/, contexts/, or modules/.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\nimport { Search, X, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Input } from \"../input\";\nimport { Badge } from \"../badge\";\nimport { Button } from \"../button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport { getFieldTitle } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { isEmptyFilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { useSearchInput, type SearchMode } from \"./useSearchInput\";\nimport type { FacetDescriptor } from \"./schemaAdapter\";\nimport {\n DEFAULT_SEARCH_WIDGETS,\n resolveSearchWidget,\n type SearchWidgetRegistry,\n} from \"./widgets\";\n\nexport interface SearchInputProps {\n // Controlled filter state\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n\n /** JSON Schema defining available facets. Providing this activates\n * faceted mode. Each schema property becomes an available facet.\n * Omit for simple single-term search. */\n schema?: JsonSchema;\n\n /** Custom search widgets merged with defaults. Keys are widget names\n * referenced by x-ui-widget in schema properties. */\n widgets?: SearchWidgetRegistry;\n\n // Interaction mode\n mode?: SearchMode;\n debounceMs?: number;\n /** Minimum characters before onChange fires. Simple mode only --\n * has no effect in faceted mode. */\n minChars?: number;\n /** Show an explicit Search button. Only rendered in explicit mode --\n * has no effect when mode is \"debounce\". */\n showSearchButton?: boolean;\n\n /**\n * Simple mode only. When provided, the search text is expanded into a\n * FilterOr with one LIKE term per field instead of the default single\n * { key: \"search\" } term. Enables cross-field search (e.g. match on\n * code OR display). Ignored in faceted mode.\n */\n searchFields?: string[];\n\n placeholder?: string;\n className?: string;\n /** Disable all interaction (e.g. when a prerequisite is not met). */\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults helper -- moves default-parameter branches out of the component.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedSearchDefaults {\n mode: SearchMode;\n debounceMs: number;\n minChars: number;\n showSearchButton: boolean;\n disabled: boolean;\n}\n\nfunction resolveSearchDefaults(\n props: SearchInputProps,\n): ResolvedSearchDefaults {\n return {\n mode: props.mode ?? \"explicit\",\n debounceMs: props.debounceMs ?? 300,\n minChars: props.minChars ?? 0,\n showSearchButton: props.showSearchButton ?? false,\n disabled: props.disabled ?? false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FacetPicker -- the popover that lists available facets.\n// ---------------------------------------------------------------------------\n\ninterface FacetPickerProps {\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nfunction FacetPicker({\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n inputRef,\n}: FacetPickerProps): React.ReactElement {\n return (\n <Popover open={pickerVisible} onOpenChange={setPickerOpen} modal={false}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((o) => !o);\n inputRef.current?.focus();\n }}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-44 p-1\", !hasFacetsToShow && \"hidden\")}\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n >\n {filteredFacets.map((facet, i) => (\n <button\n key={facet.key}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n acceptFacet(facet);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {facet.label}\n </button>\n ))}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ValueEntry -- widget for pending facet, or plain text input.\n// ---------------------------------------------------------------------------\n\ninterface ValueEntryProps {\n pendingFacet: FacetDescriptor | null;\n PendingWidget: ReturnType<typeof resolveSearchWidget> | null;\n pendingWidgetOptions: Record<string, unknown>;\n inputValue: string;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n commitFacetValue: (v: string) => void;\n cancelPendingFacet: () => void;\n resolvedPlaceholder: string;\n disabled: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onInputFocus: () => void;\n}\n\nfunction ValueEntry({\n pendingFacet,\n PendingWidget,\n pendingWidgetOptions,\n inputValue,\n handleInputChange,\n commitFacetValue,\n cancelPendingFacet,\n resolvedPlaceholder,\n disabled,\n inputRef,\n onInputKeyDown,\n onInputChange,\n onInputFocus,\n}: ValueEntryProps): React.ReactElement {\n if (pendingFacet && PendingWidget) {\n return (\n <PendingWidget\n property={pendingFacet.property}\n options={pendingWidgetOptions}\n value={inputValue}\n onChange={(v) =>\n handleInputChange({\n target: { value: v },\n } as React.ChangeEvent<HTMLInputElement>)\n }\n onCommit={(v) => {\n commitFacetValue(v);\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n onCancel={() => {\n cancelPendingFacet();\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n placeholder={pendingFacet.placeholder ?? resolvedPlaceholder}\n autoFocus\n />\n );\n }\n\n return (\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={onInputKeyDown}\n onFocus={onInputFocus}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n autoComplete=\"off\"\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Input onKeyDown handler -- extracted to keep the component body lean.\n// ---------------------------------------------------------------------------\n\ninterface InputKeyDownContext {\n isFaceted: boolean;\n pendingFacet: FacetDescriptor | null;\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n inputValue: string;\n pickerNavigated: boolean;\n setPickerNavigated: React.Dispatch<React.SetStateAction<boolean>>;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n}\n\n/** ArrowDown in the picker: open it or move highlight. Returns true if handled. */\nfunction handlePickerArrowDown(ctx: InputKeyDownContext): boolean {\n if (!ctx.isFaceted || ctx.pendingFacet) return false;\n ctx.setPickerNavigated(true);\n if (!ctx.pickerVisible) {\n ctx.setPickerOpen(true);\n } else {\n ctx.setHighlightedIndex((i) =>\n Math.min(i + 1, ctx.filteredFacets.length - 1),\n );\n }\n return true;\n}\n\n/** Enter while picker shows facets: select the highlighted facet. Returns true if handled. */\nfunction handlePickerEnterSelect(ctx: InputKeyDownContext): boolean {\n if (!ctx.hasFacetsToShow) return false;\n if (!ctx.pickerNavigated && !ctx.inputValue.trim()) return false;\n const clamped = Math.min(ctx.highlightedIndex, ctx.filteredFacets.length - 1);\n if (clamped >= 0 && ctx.filteredFacets[clamped]) {\n ctx.setPickerNavigated(false);\n ctx.acceptFacet(ctx.filteredFacets[clamped]);\n return true;\n }\n return false;\n}\n\nfunction handleInputKeyDown(\n e: React.KeyboardEvent<HTMLInputElement>,\n ctx: InputKeyDownContext,\n): void {\n if (e.key === \"ArrowDown\" && handlePickerArrowDown(ctx)) {\n e.preventDefault();\n return;\n }\n if (e.key === \"ArrowUp\" && ctx.hasFacetsToShow) {\n e.preventDefault();\n ctx.setPickerNavigated(true);\n ctx.setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" && handlePickerEnterSelect(ctx)) {\n e.preventDefault();\n return;\n }\n const reopenPicker = ctx.handleKeyDown(e);\n if (e.key === \"Enter\") {\n ctx.setPickerNavigated(false);\n ctx.setPickerOpen(!!reopenPicker);\n }\n}\n\n// ---------------------------------------------------------------------------\n// resolvePlaceholder -- extract conditional placeholder logic.\n// ---------------------------------------------------------------------------\n\nfunction resolvePlaceholder(\n isFaceted: boolean,\n hasActiveTerms: boolean,\n hasPendingFacet: boolean,\n placeholder: string | undefined,\n): string {\n const defaultPlaceholder = isFaceted ? \"Add filter...\" : \"Search...\";\n if (isFaceted && (hasActiveTerms || hasPendingFacet)) return \"Add filter...\";\n return placeholder ?? defaultPlaceholder;\n}\n\n// ---------------------------------------------------------------------------\n// ActiveChips -- renders filter chips in faceted mode.\n// ---------------------------------------------------------------------------\n\ninterface ActiveChipsProps {\n terms: Array<{ key: string; value: string }>;\n schema?: JsonSchema;\n onRemove: (index: number) => void;\n}\n\nfunction ActiveChips({\n terms,\n schema,\n onRemove,\n}: ActiveChipsProps): React.ReactElement {\n return (\n <>\n {terms.map((term, i) => {\n const property = schema?.properties?.[term.key];\n const label = property ? getFieldTitle(term.key, property) : term.key;\n return (\n <FilterChip\n key={`${term.key}:${term.value}`}\n label={`${label}: ${term.value}`}\n onRemove={() => onRemove(i)}\n />\n );\n })}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// resolveWidgetForFacet -- extract widget resolution branches.\n// ---------------------------------------------------------------------------\n\nfunction resolveWidgetForFacet(\n pendingFacet: FacetDescriptor | null,\n registry: SearchWidgetRegistry,\n): {\n Widget: ReturnType<typeof resolveSearchWidget> | null;\n options: Record<string, unknown>;\n} {\n if (!pendingFacet) return { Widget: null, options: {} };\n return {\n Widget: resolveSearchWidget(pendingFacet.property, registry),\n options:\n (pendingFacet.property[\"x-ui-options\"] as Record<string, unknown>) ?? {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// SearchActions -- clear and search buttons, extracted to reduce parent complexity.\n// ---------------------------------------------------------------------------\n\ninterface SearchActionsProps {\n isEmpty: boolean;\n showSearchButton: boolean;\n mode: SearchMode;\n onClear: () => void;\n onCommit: () => void;\n}\n\nfunction SearchActions({\n isEmpty,\n showSearchButton,\n mode,\n onClear,\n onCommit,\n}: SearchActionsProps): React.ReactElement {\n return (\n <>\n {!isEmpty && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n aria-label=\"Clear search\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n {showSearchButton && mode === \"explicit\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n onCommit();\n }}\n >\n Search\n </Button>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// mergeWidgetRegistry -- extracted to reduce parent branches.\n// ---------------------------------------------------------------------------\n\nfunction mergeWidgetRegistry(\n custom: SearchWidgetRegistry | undefined,\n): SearchWidgetRegistry {\n return custom\n ? { ...DEFAULT_SEARCH_WIDGETS, ...custom }\n : DEFAULT_SEARCH_WIDGETS;\n}\n\n// ---------------------------------------------------------------------------\n// SearchInput\n// ---------------------------------------------------------------------------\n\nexport function SearchInput(props: SearchInputProps): React.ReactElement {\n const {\n value,\n onChange,\n schema,\n widgets: customWidgets,\n searchFields,\n placeholder,\n className,\n } = props;\n const { mode, debounceMs, minChars, showSearchButton, disabled } =\n resolveSearchDefaults(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [pickerNavigated, setPickerNavigated] = useState(false);\n\n // Close picker on clicks outside the component.\n useEffect(() => {\n if (!pickerOpen) return;\n function handleMouseDown(e: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setPickerOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [pickerOpen]);\n\n const widgetRegistry = useMemo<SearchWidgetRegistry>(\n () => mergeWidgetRegistry(customWidgets),\n [customWidgets],\n );\n\n const {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n } = useSearchInput({\n value,\n onChange,\n mode,\n debounceMs,\n minChars,\n schema,\n searchFields,\n });\n const isEmpty = isEmptyFilterExpr(value) && inputValue === \"\";\n\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredFacets, pickerOpen]);\n\n const resolvedPlaceholder = resolvePlaceholder(\n isFaceted,\n activeTerms.length > 0,\n pendingFacet !== null,\n placeholder,\n );\n\n const showFacetControls = isFaceted && !pendingFacet;\n const pickerVisible = showFacetControls && pickerOpen;\n const hasFacetsToShow = pickerVisible && filteredFacets.length > 0;\n\n const acceptFacet = React.useCallback(\n (facet: FacetDescriptor) => {\n selectFacet(facet);\n setPickerOpen(false);\n inputRef.current?.focus();\n },\n [selectFacet],\n );\n\n const { Widget: PendingWidget, options: pendingWidgetOptions } =\n resolveWidgetForFacet(pendingFacet, widgetRegistry);\n\n const keyDownCtx: InputKeyDownContext = {\n isFaceted,\n pendingFacet,\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n inputValue,\n pickerNavigated,\n setPickerNavigated,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n handleKeyDown,\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm min-h-9\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-text\",\n className,\n )}\n onClick={() => !disabled && inputRef.current?.focus()}\n onBlur={(e) => {\n const relatedTarget = e.relatedTarget as Node | null;\n if (relatedTarget && !e.currentTarget.contains(relatedTarget)) {\n setPickerOpen(false);\n }\n }}\n >\n <Search className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n\n {/* Active filter chips -- faceted mode only */}\n {isFaceted && (\n <ActiveChips\n terms={activeTerms}\n schema={schema}\n onRemove={handleRemoveTerm}\n />\n )}\n\n {/* Pending facet chip */}\n {pendingFacet && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {pendingFacet.label}:\n </span>\n )}\n\n {/* Facet picker + text input / widget row */}\n <div className=\"flex items-center gap-1 flex-1 min-w-[120px]\">\n {showFacetControls && (\n <FacetPicker\n pickerVisible={pickerVisible}\n hasFacetsToShow={hasFacetsToShow}\n filteredFacets={filteredFacets}\n highlightedIndex={highlightedIndex}\n setPickerOpen={setPickerOpen}\n setHighlightedIndex={setHighlightedIndex}\n acceptFacet={acceptFacet}\n inputRef={inputRef}\n />\n )}\n\n <ValueEntry\n pendingFacet={pendingFacet}\n PendingWidget={PendingWidget}\n pendingWidgetOptions={pendingWidgetOptions}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n commitFacetValue={commitFacetValue}\n cancelPendingFacet={cancelPendingFacet}\n resolvedPlaceholder={resolvedPlaceholder}\n disabled={disabled}\n inputRef={inputRef}\n onInputKeyDown={(e) => handleInputKeyDown(e, keyDownCtx)}\n onInputChange={(e) => {\n handleInputChange(e);\n setPickerNavigated(false);\n }}\n onInputFocus={() => {\n if (isFaceted && !pendingFacet) setPickerNavigated(false);\n }}\n />\n </div>\n\n <SearchActions\n isEmpty={isEmpty}\n showSearchButton={showSearchButton}\n mode={mode}\n onClear={handleClear}\n onCommit={() => {\n // Missing required facets reopen the picker, exactly as Enter does,\n // instead of the button appearing to do nothing.\n if (handleCommit()) {\n setPickerNavigated(false);\n setPickerOpen(true);\n inputRef.current?.focus();\n }\n }}\n />\n </div>\n );\n}\n\ninterface FilterChipProps {\n label: string;\n onRemove: () => void;\n}\n\nfunction FilterChip({ label, onRemove }: FilterChipProps): React.ReactElement {\n return (\n <Badge\n variant=\"secondary\"\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full\"\n >\n {label}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ml-0.5 hover:text-destructive transition-colors\"\n aria-label={`Remove filter ${label}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n}\n","/**\n * useSearchInput -- internal state machine for SearchInput.\n *\n * Two code paths:\n * Simple (no schema) -- manages a single input string, commits it as\n * a one-term FilterExpr on Enter or debounce.\n * Faceted (schema) -- manages chip accumulation plus a pending\n * facet/value input. Facets are derived from the\n * schema properties via buildFacetDescriptors().\n *\n * Event contract:\n * onChange is the single output event. It fires:\n * Simple mode, explicit -- on Enter\n * Simple mode, debounce -- after the user stops typing\n * Faceted mode -- on submit only (Enter on empty input after\n * chips are composed). Chip accumulation is\n * internal state; the caller never sees it.\n * Remove chip / Clear -- immediately (destructive ops need instant feedback)\n *\n * Faceted field selection:\n * While no facet is pending and the input does NOT end with a space,\n * filteredFacets contains the subset of facets whose labels start with\n * the current input (case-insensitive). Selecting one sets it as the\n * pending facet and clears the input.\n *\n * If the input ends with a space, facet matching is suppressed --\n * the value is committed against facets[0] (implicit default).\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr, FilterTerm } from \"@petrarca/sonnet-core/search\";\nimport { collectTerms } from \"@petrarca/sonnet-core/search\";\nimport { buildFacetDescriptors, type FacetDescriptor } from \"./schemaAdapter\";\n\nexport type SearchMode = \"debounce\" | \"explicit\";\n\ninterface UseSearchInputOptions {\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n mode?: SearchMode;\n debounceMs?: number;\n schema?: JsonSchema;\n minChars?: number;\n /**\n * When provided (simple mode only), the search text is expanded into\n * a FilterOr with one LIKE term per field instead of the single\n * { key: \"search\" } term. Ignored in faceted mode.\n *\n * Example: searchFields = [\"code\", \"display\"] with text \"aspirin\"\n * produces { type: \"or\", children: [\n * { type: \"term\", key: \"code\", value: \"aspirin\" },\n * { type: \"term\", key: \"display\", value: \"aspirin\" },\n * ]}\n */\n searchFields?: string[];\n}\n\ninterface UseSearchInputReturn {\n inputValue: string;\n pendingFacet: FacetDescriptor | null;\n isFaceted: boolean;\n filteredFacets: FacetDescriptor[];\n allFacets: FacetDescriptor[];\n selectFacet: (f: FacetDescriptor | null) => void;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** Returns true when the picker should (re)open (required facets missing). */\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n /** Commit the current entry. Returns true when required facets are missing\n * and the caller should reopen the picker. */\n handleCommit: () => boolean;\n handleRemoveTerm: (index: number) => void;\n handleClear: () => void;\n activeTerms: FilterTerm[];\n commitFacetValue: (value: string) => void;\n cancelPendingFacet: () => void;\n}\n\nfunction buildSimpleExpr(text: string, searchFields?: string[]): FilterExpr {\n const trimmed = text.trim();\n if (!trimmed) return { type: \"and\", children: [] };\n\n // Multi-field OR: one LIKE term per field, wrapped in an OR node.\n if (searchFields && searchFields.length > 0) {\n const terms: FilterTerm[] = searchFields.map((key) => ({\n type: \"term\",\n key,\n value: trimmed,\n }));\n if (terms.length === 1) {\n return { type: \"and\", children: terms };\n }\n return { type: \"and\", children: [{ type: \"or\", children: terms }] };\n }\n\n return {\n type: \"and\",\n children: [{ type: \"term\", key: \"search\", value: trimmed }],\n };\n}\n\nexport function useSearchInput({\n value,\n onChange,\n mode = \"explicit\",\n debounceMs = 300,\n schema,\n minChars = 0,\n searchFields,\n}: UseSearchInputOptions): UseSearchInputReturn {\n const allFacets = useMemo(\n () => (schema ? buildFacetDescriptors(schema) : []),\n [schema],\n );\n\n const isFaceted = allFacets.length > 0;\n\n const initialInput = !isFaceted\n ? (() => {\n const terms = collectTerms(value);\n return terms.length === 1 && terms[0].key === \"search\"\n ? terms[0].value\n : \"\";\n })()\n : \"\";\n\n const [inputValue, setInputValue] = useState(initialInput);\n const [pendingFacet, setPendingFacet] = useState<FacetDescriptor | null>(\n null,\n );\n\n // In faceted mode, chip accumulation lives in draftTerms (local state).\n // onChange is only called on submit or on destructive ops (remove/clear).\n const [draftTerms, setDraftTerms] = useState<FilterTerm[]>(() =>\n isFaceted ? collectTerms(value) : [],\n );\n\n const valueTerms = useMemo(\n () => (!isFaceted ? collectTerms(value) : []),\n [value, isFaceted],\n );\n const activeTerms = isFaceted ? draftTerms : valueTerms;\n\n const activeFieldKeys = useMemo(\n () => new Set(activeTerms.map((t) => t.key)),\n [activeTerms],\n );\n\n const filteredFacets = useMemo<FacetDescriptor[]>(() => {\n if (!isFaceted || pendingFacet || inputValue.endsWith(\" \")) return [];\n const available = allFacets.filter((f) => !activeFieldKeys.has(f.key));\n if (!inputValue.trim()) return available;\n const lower = inputValue.toLowerCase();\n return available.filter((f) => f.label.toLowerCase().startsWith(lower));\n }, [inputValue, pendingFacet, isFaceted, allFacets, activeFieldKeys]);\n\n // Stable refs\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const draftTermsRef = useRef(draftTerms);\n draftTermsRef.current = draftTerms;\n const pendingFacetRef = useRef(pendingFacet);\n pendingFacetRef.current = pendingFacet;\n const inputValueRef = useRef(inputValue);\n inputValueRef.current = inputValue;\n const isFacetedRef = useRef(isFaceted);\n isFacetedRef.current = isFaceted;\n const allFacetsRef = useRef(allFacets);\n allFacetsRef.current = allFacets;\n const filteredFacetsRef = useRef(filteredFacets);\n filteredFacetsRef.current = filteredFacets;\n const minCharsRef = useRef(minChars);\n minCharsRef.current = minChars;\n\n // When the controlled value is reset to empty externally (e.g. after a\n // search result is selected), clear internal draft state to match.\n useEffect(() => {\n if (!isFaceted) return;\n const terms = collectTerms(value);\n if (terms.length === 0) {\n setDraftTerms([]);\n setInputValue(\"\");\n setPendingFacet(null);\n }\n }, [value, isFaceted]);\n\n // Debounce effect (simple mode only)\n const searchFieldsRef = useRef(searchFields);\n searchFieldsRef.current = searchFields;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return;\n }\n if (mode !== \"debounce\" || isFaceted) return;\n if (inputValue.trim().length < minCharsRef.current) return;\n const timer = setTimeout(() => {\n onChangeRef.current(buildSimpleExpr(inputValue, searchFieldsRef.current));\n }, debounceMs);\n return () => clearTimeout(timer);\n }, [inputValue, mode, debounceMs, isFaceted]);\n\n // Flush terms to onChange.\n const submitDraft = useCallback((terms: FilterTerm[]) => {\n onChangeRef.current({ type: \"and\", children: terms });\n }, []);\n\n // Check whether all required facets have a chip in the given terms list.\n // Returns true when all are present, or when no facets are required.\n const allRequiredSatisfied = useCallback((terms: FilterTerm[]) => {\n const requiredKeys = allFacetsRef.current\n .filter((f) => f.required)\n .map((f) => f.key);\n if (requiredKeys.length === 0) return true;\n const presentKeys = new Set(terms.map((t) => t.key));\n return requiredKeys.every((k) => presentKeys.has(k));\n }, []);\n\n // Add a chip to draftTerms. Never calls onChange.\n const addChip = useCallback((text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const facet = pendingFacetRef.current ?? allFacetsRef.current[0] ?? null;\n if (!facet) return;\n const newTerm: FilterTerm = {\n type: \"term\",\n key: facet.key,\n value: trimmed,\n };\n const nextTerms = [...draftTermsRef.current, newTerm];\n setDraftTerms(nextTerms);\n setInputValue(\"\");\n setPendingFacet(null);\n }, []);\n\n const commitFacetValue = addChip;\n const cancelPendingFacet = useCallback(() => {\n setInputValue(\"\");\n setPendingFacet(null);\n }, []);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n },\n [],\n );\n\n // -- Key-down helpers (extracted to reduce cyclomatic complexity) --------\n\n /** Tab/Enter with exactly one filtered match: accept the facet. */\n const tryAcceptSingleMatch = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if (\n !isFacetedRef.current ||\n pendingFacetRef.current ||\n filteredFacetsRef.current.length !== 1 ||\n !inputValueRef.current.trim()\n ) {\n return false;\n }\n e.preventDefault();\n setPendingFacet(filteredFacetsRef.current[0]);\n setInputValue(\"\");\n return true;\n },\n [],\n );\n\n /** Enter in faceted mode: add chip or submit draft. Returns true when\n * required facets are missing and the picker should reopen. */\n const handleEnterFaceted = useCallback((): boolean => {\n const trimmed = inputValueRef.current.trim();\n if (trimmed) {\n addChip(trimmed);\n return false;\n }\n if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n /** Enter in simple mode: commit search text. */\n const handleEnterSimple = useCallback(() => {\n if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n buildSimpleExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n }, []);\n\n /** Backspace on empty input: clear pending facet, last chip, or reset. */\n const handleBackspaceEmpty = useCallback(() => {\n if (isFacetedRef.current) {\n if (pendingFacetRef.current) {\n setPendingFacet(null);\n } else if (draftTermsRef.current.length > 0) {\n setDraftTerms((prev) => prev.slice(0, -1));\n }\n } else {\n onChangeRef.current({ type: \"and\", children: [] });\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if ((e.key === \"Tab\" || e.key === \"Enter\") && tryAcceptSingleMatch(e)) {\n return false;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (isFacetedRef.current) {\n return handleEnterFaceted();\n }\n handleEnterSimple();\n return false;\n }\n\n if (e.key === \"Backspace\" && inputValueRef.current === \"\") {\n handleBackspaceEmpty();\n }\n return false;\n },\n [\n tryAcceptSingleMatch,\n handleEnterFaceted,\n handleEnterSimple,\n handleBackspaceEmpty,\n ],\n );\n\n /** Commit the current entry. Returns true when required facets are missing\n * and the picker should reopen -- the same signal Enter produces, so the\n * search button and the keyboard behave alike rather than the button\n * silently doing nothing. */\n const handleCommit = useCallback((): boolean => {\n if (isFacetedRef.current) {\n const trimmed = inputValueRef.current.trim();\n if (trimmed) {\n addChip(trimmed);\n } else if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n } else if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n buildSimpleExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n // Remove chip -- immediate onChange (destructive op).\n const handleRemoveTerm = useCallback((index: number) => {\n const next = draftTermsRef.current.filter((_, i) => i !== index);\n setDraftTerms(next);\n onChangeRef.current({ type: \"and\", children: next });\n }, []);\n\n const handleClear = useCallback(() => {\n setInputValue(\"\");\n setPendingFacet(null);\n setDraftTerms([]);\n onChangeRef.current({ type: \"and\", children: [] });\n }, []);\n\n const selectFacet = useCallback(\n (f: FacetDescriptor | null) => setPendingFacet(f),\n [],\n );\n\n return {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n allFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n };\n}\n","/**\n * Schema adapter -- reads a JsonSchema and produces internal FacetDescriptor\n * objects for the faceted search mode.\n *\n * This is the bridge between the public schema-based API and the internal\n * representation used by the search hook and widget system.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport {\n getFieldTitle,\n getFieldHelpText,\n getFieldPlaceholder,\n} from \"@petrarca/sonnet-core/schema\";\n\n/** Internal facet descriptor derived from a schema property. */\nexport interface FacetDescriptor {\n /** Property key from the schema -- used as the facet key in FilterExpr. */\n key: string;\n /** Display label for the picker and chips. */\n label: string;\n /** Whether this facet is required (listed in schema.required). */\n required: boolean;\n /** Optional description for tooltip or help text. */\n description?: string;\n /** Placeholder text for the value input. */\n placeholder?: string;\n /** The original schema property -- passed to the search widget. */\n property: JsonSchemaProperty;\n}\n\n/**\n * Derive an ordered list of facet descriptors from a JSON Schema.\n *\n * Respects x-ui-order for display ordering. Properties not listed in\n * x-ui-order are appended in their natural (insertion) order.\n */\nexport function buildFacetDescriptors(schema: JsonSchema): FacetDescriptor[] {\n const properties = schema.properties ?? {};\n const keys = Object.keys(properties);\n if (keys.length === 0) return [];\n\n const requiredSet = new Set((schema.required as string[] | undefined) ?? []);\n\n // Apply x-ui-order: listed keys first, unlisted keys appended\n const order = schema[\"x-ui-order\"] as string[] | undefined;\n const ordered = applyOrder(keys, order);\n\n return ordered.map((key) => {\n const property = properties[key];\n return {\n key,\n label: getFieldTitle(key, property),\n required: requiredSet.has(key),\n description: getFieldHelpText(property),\n placeholder: getFieldPlaceholder(property),\n property,\n };\n });\n}\n\n/**\n * Apply x-ui-order to a list of keys.\n * Keys listed in order come first (in order), unlisted keys are appended\n * in their original order.\n */\nfunction applyOrder(keys: string[], order?: string[]): string[] {\n if (!order || order.length === 0) return keys;\n const keySet = new Set(keys);\n const ordered: string[] = [];\n for (const key of order) {\n if (keySet.has(key)) {\n ordered.push(key);\n keySet.delete(key);\n }\n }\n // Append remaining keys in original order\n for (const key of keys) {\n if (keySet.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n","/**\n * TextSearchWidget -- default search widget for plain text facet values.\n *\n * Renders a borderless inline input. Commits on Enter, cancels on Escape.\n * This is the baseline behavior that all faceted text inputs had before\n * the widget system was introduced.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useRef, useEffect } from \"react\";\nimport { Input } from \"../../input\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function TextSearchWidget({\n value,\n onChange,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <Input\n ref={inputRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const trimmed = value.trim();\n if (trimmed) onCommit(trimmed);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n } else if (e.key === \"Backspace\" && value === \"\") {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={placeholder}\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n","/**\n * EnumSearchWidget -- search widget for facets with a fixed set of values.\n *\n * Renders an inline dropdown populated from the schema property's enum\n * values. Reads x-ui-options.enumNames for display labels. Commits on\n * item selection, cancels on Escape.\n *\n * Triggered automatically when the schema property has an enum array.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../popover\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function EnumSearchWidget({\n property,\n options: widgetOptions,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n const enumValues: string[] = (property.enum as string[]) ?? [];\n const enumNames =\n (widgetOptions.enumNames as Record<string, string> | undefined) ?? {};\n\n const items = enumValues.map((val) => ({\n value: val,\n label: enumNames[val] ?? val,\n }));\n\n const filtered = search\n ? items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase()),\n )\n : items;\n\n // Reset highlight when filtered list changes\n useEffect(() => {\n setHighlightedIndex(0);\n }, [filtered.length, search]);\n\n // Auto-open on mount when autoFocus is set\n useEffect(() => {\n if (autoFocus) {\n requestAnimationFrame(() => setOpen(true));\n }\n }, [autoFocus]);\n\n function handleCommit(val: string) {\n onCommit(val);\n setOpen(false);\n setSearch(\"\");\n }\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) setSearch(\"\");\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n onCancel();\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.min(i + 1, filtered.length - 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n const item = filtered[highlightedIndex];\n if (item) handleCommit(item.value);\n return;\n }\n }\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors truncate text-left\"\n onClick={() => setOpen(true)}\n >\n {placeholder ?? \"Select...\"}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-48 p-1\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <input\n autoFocus\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search...\"\n className=\"w-full px-2 py-1.5 text-sm bg-transparent outline-none border-b border-border mb-1 placeholder:text-muted-foreground\"\n />\n <div>\n {filtered.length === 0 && (\n <p className=\"px-2 py-1.5 text-sm text-muted-foreground\">\n No matches\n </p>\n )}\n {filtered.map((item, i) => (\n <button\n key={item.value}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n handleCommit(item.value);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {item.label}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","/**\n * Search widget resolution.\n *\n * Determines which search widget to render for a given facet based on\n * its JSON Schema property definition:\n *\n * 1. Explicit: x-ui-widget on the property -> look up in registry.\n * 2. Enum: enum present on the property -> \"enum\" widget.\n * 3. Type fallback -> \"text\" widget (default).\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { SearchWidget, SearchWidgetRegistry } from \"./types\";\n\n/** Resolve the search widget for a facet's schema property. */\nexport function resolveSearchWidget(\n property: JsonSchemaProperty,\n registry: SearchWidgetRegistry,\n): SearchWidget {\n // 1. Explicit widget override via x-ui-widget\n const widgetName = property[\"x-ui-widget\"];\n if (widgetName && registry[widgetName]) {\n return registry[widgetName];\n }\n\n // 2. Enum present -> enum widget\n if (property.enum && property.enum.length > 0 && registry[\"enum\"]) {\n return registry[\"enum\"];\n }\n\n // 3. Type-based fallback -> text widget\n return registry[\"text\"];\n}\n","import type { SearchWidgetRegistry } from \"./types\";\nimport { TextSearchWidget } from \"./TextSearchWidget\";\nimport { EnumSearchWidget } from \"./EnumSearchWidget\";\n\nexport type {\n SearchWidgetProps,\n SearchWidget,\n SearchWidgetRegistry,\n} from \"./types\";\nexport { resolveSearchWidget } from \"./resolveSearchWidget\";\nexport { TextSearchWidget } from \"./TextSearchWidget\";\nexport { EnumSearchWidget } from \"./EnumSearchWidget\";\n\n/** Default search widget registry. Consumers extend this via the widgets prop. */\nexport const DEFAULT_SEARCH_WIDGETS: SearchWidgetRegistry = {\n text: TextSearchWidget,\n enum: EnumSearchWidget,\n};\n","import { Copy } from \"lucide-react\";\nimport { Button } from \"../button\";\n\ntype Props = {\n hasItems: boolean;\n onClick: () => void;\n};\n\n/**\n * ClipboardButton - Toolbar button that opens the clipboard menu.\n *\n * Displayed in CytoscapeControls toolbar with enabled/disabled state.\n */\nfunction ClipboardButton({ hasItems, onClick }: Props) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClick}\n disabled={!hasItems}\n style={{\n opacity: hasItems ? 1 : 0.4,\n cursor: hasItems ? \"pointer\" : \"not-allowed\",\n }}\n >\n <Copy size={16} />\n </Button>\n );\n}\n\nexport default ClipboardButton;\n","import { X, Plus } from \"lucide-react\";\nimport { ClipboardItem } from \"./clipboardStore\";\nimport { Button } from \"../button\";\nimport { SimpleGroup } from \"../simple-group\";\n\ntype Props = {\n item: ClipboardItem;\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n onRemove: (itemId: string) => void;\n};\n\n/**\n * ClipboardItem - Individual clipboard item display.\n *\n * Shows item info with color indicator and action buttons.\n * Compact design for dropdown menu.\n */\nfunction ClipboardItemComponent({ item, onAddItem, onRemove }: Props) {\n const handleAddClick = (e: React.MouseEvent) => {\n const keepInClipboard = e.shiftKey;\n onAddItem(item, keepInClipboard);\n };\n\n return (\n <div\n className=\"p-3 rounded mb-2\"\n style={{\n borderLeft: `4px solid ${item.color}`,\n backgroundColor: \"#f8f9fa\",\n }}\n >\n <SimpleGroup justify=\"space-between\" wrap=\"nowrap\" align=\"flex-start\">\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <p className=\"text-sm font-semibold truncate\">{item.label}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {item.displayName}\n </p>\n <p className=\"text-xs text-muted-foreground font-mono\">\n #{item.entityId}\n </p>\n </div>\n <SimpleGroup gap={4} wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={handleAddClick}\n title=\"Click to add and remove from clipboard, Shift+Click to keep in clipboard\"\n >\n <Plus size={16} />\n Add\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onRemove(item.id)}\n title=\"Remove from clipboard\"\n >\n <X size={16} />\n </Button>\n </SimpleGroup>\n </SimpleGroup>\n </div>\n );\n}\n\nexport default ClipboardItemComponent;\n","import { Trash2 } from \"lucide-react\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { Separator } from \"../separator\";\nimport useClipboard, { ClipboardItem } from \"./clipboardStore\";\nimport ClipboardItemComponent from \"./ClipboardItem\";\nimport { Button } from \"../button\";\nimport { SimpleStack } from \"../simple-stack\";\n\ntype Props = {\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n};\n\n/**\n * ClipboardMenu - Dropdown menu content for clipboard management.\n *\n * Displays clipboard items with add and clear all functionality.\n */\nfunction ClipboardMenu({ onAddItem }: Props) {\n const { items, removeItem, clear } = useClipboard();\n\n // Empty state\n if (items.length === 0) {\n return (\n <div style={{ padding: \"16px\", textAlign: \"center\", width: \"300px\" }}>\n <p className=\"text-sm text-muted-foreground\">No items in clipboard</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Right-click a node and select \"Copy\"\n </p>\n </div>\n );\n }\n\n return (\n <div\n style={{\n width: \"380px\",\n maxWidth: \"90vw\",\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"500px\",\n }}\n >\n {/* Items list with flexible height */}\n <ScrollArea className=\"flex-1 p-3 min-h-0\">\n <SimpleStack gap={0}>\n {items.map((item) => (\n <ClipboardItemComponent\n key={item.id}\n item={item}\n onAddItem={onAddItem}\n onRemove={removeItem}\n />\n ))}\n </SimpleStack>\n </ScrollArea>\n\n <Separator />\n\n {/* Footer with clear all - fixed at bottom */}\n <div style={{ padding: \"8px 12px\", flexShrink: 0 }}>\n <Button\n className=\"w-full\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={clear}\n >\n <Trash2 size={16} />\n Clear All ({items.length})\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ClipboardMenu;\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { devLog } from \"@petrarca/sonnet-core\";\n\n/**\n * ClipboardItem - Lightweight representation of an item in the clipboard.\n */\nexport interface ClipboardItem {\n id: string; // unique clipboard item ID (UUID)\n type: string; // item type (e.g. 'node', 'entity', etc.)\n entityId: string; // external entity identifier\n label: string; // entity label/type\n displayName: string; // visual display name\n color: string; // color for UI indicator\n}\n\n/**\n * Input for adding items to clipboard.\n */\nexport interface ClipboardItemInput {\n entityId: string;\n type: string;\n label: string;\n displayName: string;\n color: string;\n}\n\n/**\n * ClipboardItemKey - Unique identifier for deduplication.\n */\ntype ClipboardItemKey = string;\n\nfunction getItemKey(item: ClipboardItem): ClipboardItemKey {\n return `${item.type}:${item.entityId}:${item.label}`;\n}\n\nfunction getInputKey(input: ClipboardItemInput): ClipboardItemKey {\n return `${input.type}:${input.entityId}:${input.label}`;\n}\n\nfunction uuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\ninterface ClipboardStore {\n items: ClipboardItem[];\n\n /**\n * Add items to clipboard with deduplication.\n */\n addItems: (inputs: ClipboardItemInput[]) => void;\n\n /**\n * Remove a single item from clipboard by its unique ID.\n */\n removeItem: (itemId: string) => void;\n\n /**\n * Clear all items from clipboard.\n */\n clear: () => void;\n}\n\nconst MAX_CLIPBOARD_SIZE = 100;\n\nconst useClipboard = create<ClipboardStore>()(\n persist(\n (set, get) => ({\n items: [],\n\n addItems: (inputs) => {\n const currentItems = get().items;\n const existingKeys = new Set(currentItems.map(getItemKey));\n\n const newItems = inputs\n .map(\n (input): ClipboardItem => ({\n id: uuid(),\n type: input.type,\n entityId: input.entityId,\n label: input.label,\n displayName: input.displayName,\n color: input.color,\n }),\n )\n .filter((item) => !existingKeys.has(getInputKey(item)));\n\n if (newItems.length === 0) {\n devLog(\n \"[ClipboardStore] addItems - all items were duplicates, skipped\",\n );\n return;\n }\n\n let updatedItems = [...currentItems, ...newItems];\n\n if (updatedItems.length > MAX_CLIPBOARD_SIZE) {\n const overflow = updatedItems.length - MAX_CLIPBOARD_SIZE;\n updatedItems = updatedItems.slice(overflow);\n devLog(\n \"[ClipboardStore] addItems - size limit exceeded, removed oldest\",\n { overflow },\n );\n }\n\n devLog(\"[ClipboardStore] addItems\", {\n added: newItems.length,\n total: updatedItems.length,\n skippedDuplicates: inputs.length - newItems.length,\n });\n\n set({ items: updatedItems });\n },\n\n removeItem: (itemId) => {\n const currentItems = get().items;\n const updatedItems = currentItems.filter((item) => item.id !== itemId);\n\n if (updatedItems.length === currentItems.length) {\n devLog(\"[ClipboardStore] removeItem - item not found\", { itemId });\n return;\n }\n\n devLog(\"[ClipboardStore] removeItem\", {\n itemId,\n remainingCount: updatedItems.length,\n });\n set({ items: updatedItems });\n },\n\n clear: () => {\n const currentCount = get().items.length;\n devLog(\"[ClipboardStore] clear\", { clearedCount: currentCount });\n set({ items: [] });\n },\n }),\n {\n name: \"clipboard-items\",\n version: 2,\n },\n ),\n);\n\nexport default useClipboard;\n"],"mappings":"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","names":["React","cn","jsx","cva","cn","jsx","React","cva","cn","jsx","React","cn","React","cn","jsx","jsx","jsx","IconButton","cn","React","cn","jsx","React","cn","jsx","CollapsibleTrigger","CollapsibleContent","React","cn","React","cn","jsx","jsxs","jsx","jsxs","cn","React","Check","cn","jsx","jsxs","React","cn","jsx","jsx","React","cn","useLocale","React","cn","jsx","React","ChevronRight","cn","jsx","jsxs","jsx","jsxs","useLocale","cn","React","cn","jsx","jsxs","cn","React","cn","formatIsoDate","jsx","jsxs","formatIsoDate","cn","React","Check","cn","jsx","jsxs","cva","cn","React","cn","jsx","jsx","cn","cva","React","cva","cn","jsx","Label","React","cn","jsx","jsxs","React","cn","jsx","Separator","React","cn","jsx","React","DialogPrimitive","X","cn","jsx","jsxs","cn","jsx","cn","jsx","gapMap","alignMap","justifyMap","cn","jsx","cn","jsx","React","cn","jsx","Check","React","cn","React","React","React","jsx","value","disabled","cn","tabStopId","onKeyDown","Check","SeparatorPrimitive","useCallback","useEffect","useMemo","useRef","useState","ChevronRight","cn","React","Fragment","jsx","jsxs","resolveCellRenderer","React","jsx","jsxs","resolveCellRenderer","useMemo","useEffect","useState","useRef","useCallback","Icon","cn","ChevronRight","React","useState","jsx","jsxs","useState","jsx","jsxs","React","React","Check","X","cn","Fragment","jsx","jsxs","Check","cn","X","forwardRef","useImperativeHandle","useMemo","useRef","cn","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","ChevronRight","cn","jsx","jsxs","jsx","jsxs","resolveCellRenderer","cn","useRef","useImperativeHandle","useMemo","forwardRef","React","useMemo","useRef","useState","useEffect","Search","X","ChevronDown","cn","getFieldTitle","useCallback","useEffect","useMemo","useRef","useState","useMemo","useState","useRef","useEffect","useCallback","useRef","useEffect","jsx","useRef","useEffect","useEffect","useState","cn","jsx","jsxs","useState","useEffect","cn","Fragment","jsx","jsxs","ChevronDown","cn","getFieldTitle","X","useRef","useState","useEffect","useMemo","React","Search","jsx","X","jsx","jsxs","X","jsx","jsxs","Separator"]}
1
+ {"version":3,"sources":["../src/alert.tsx","../src/avatar.tsx","../src/badge.tsx","../src/split-button.tsx","../src/dropdown-menu.tsx","../src/view-switch.tsx","../src/card.tsx","../src/checkbox.tsx","../src/radio-group.tsx","../src/collapsible.tsx","../src/command.tsx","../src/dialog.tsx","../src/input.tsx","../src/DateInput/DateInput.tsx","../src/popover.tsx","../src/DateInput/Calendar.tsx","../src/TimeInput/TimeInput.tsx","../src/DateTimeInput/DateTimeInput.tsx","../src/select.tsx","../src/input-group.tsx","../src/textarea.tsx","../src/label.tsx","../src/scroll-area.tsx","../src/separator.tsx","../src/resize-handle.tsx","../src/sheet.tsx","../src/simple-group.tsx","../src/ListRow/ListRow.tsx","../src/DangerZone/DangerZone.tsx","../src/simple-stack.tsx","../src/coded-value-display.tsx","../src/codeable-concept-display.tsx","../src/skeleton.tsx","../src/spinner.tsx","../src/tabs.tsx","../src/stepper.tsx","../src/radix/hooks/use-as-ref.ts","../src/radix/hooks/use-isomorphic-layout-effect.ts","../src/radix/hooks/use-lazy-ref.ts","../src/EntityTable/EntityTable.tsx","../src/EntityTable/tableSchema/mergeUiSchema.ts","../src/EntityTable/tableSchema/cellRegistry.ts","../src/EntityTable/tableSchema/cellRenderers.tsx","../src/EntityTable/tableSchema/columnResolver.ts","../src/JsonTree/JsonTree.tsx","../src/PropertyList/PropertyList.tsx","../src/PropertyList/PropertyValue.tsx","../src/PropertyList/propertyFields.ts","../src/EntitySelect/EntitySelect.tsx","../src/EntityTree/EntityTree.tsx","../src/TreeView/TreeView.tsx","../src/TreeView/typeAhead.ts","../src/SearchInput/SearchInput.tsx","../src/SearchInput/useSearchInput.ts","../src/SearchInput/schemaAdapter.ts","../src/SearchInput/widgets/TextSearchWidget.tsx","../src/SearchInput/widgets/EnumSearchWidget.tsx","../src/SearchInput/widgets/DateSearchWidget.tsx","../src/SearchInput/widgets/resolveSearchWidget.ts","../src/SearchInput/widgets/index.ts","../src/Clipboard/ClipboardButton.tsx","../src/Clipboard/ClipboardItem.tsx","../src/Clipboard/ClipboardMenu.tsx","../src/Clipboard/clipboardStore.ts"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n badgeColor: {\n grape:\n \"border-transparent bg-purple-100 text-purple-800 hover:bg-purple-200 dark:bg-purple-900 dark:text-purple-200 dark:hover:bg-purple-800\",\n blue: \"border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-200 dark:hover:bg-blue-800\",\n green:\n \"border-transparent bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-200 dark:hover:bg-green-800\",\n red: \"border-transparent bg-red-100 text-red-800 hover:bg-red-200 dark:bg-red-900 dark:text-red-200 dark:hover:bg-red-800\",\n orange:\n \"border-transparent bg-orange-100 text-orange-800 hover:bg-orange-200 dark:bg-orange-900 dark:text-orange-200 dark:hover:bg-orange-800\",\n yellow:\n \"border-transparent bg-yellow-100 text-yellow-800 hover:bg-yellow-200 dark:bg-yellow-900 dark:text-yellow-200 dark:hover:bg-yellow-800\",\n teal: \"border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 dark:bg-teal-900 dark:text-teal-200 dark:hover:bg-teal-800\",\n cyan: \"border-transparent bg-cyan-100 text-cyan-800 hover:bg-cyan-200 dark:bg-cyan-900 dark:text-cyan-200 dark:hover:bg-cyan-800\",\n pink: \"border-transparent bg-pink-100 text-pink-800 hover:bg-pink-200 dark:bg-pink-900 dark:text-pink-200 dark:hover:bg-pink-800\",\n indigo:\n \"border-transparent bg-indigo-100 text-indigo-800 hover:bg-indigo-200 dark:bg-indigo-900 dark:text-indigo-200 dark:hover:bg-indigo-800\",\n violet:\n \"border-transparent bg-violet-100 text-violet-800 hover:bg-violet-200 dark:bg-violet-900 dark:text-violet-200 dark:hover:bg-violet-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, badgeColor, ...props }: BadgeProps) {\n return (\n <div\n className={cn(badgeVariants({ variant, badgeColor }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button, type ButtonProps } from \"./button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\";\n\n/**\n * SplitButton -- a primary action with an attached dropdown of secondary\n * actions (the \"split button\" / menu-button pattern). The main face runs the\n * primary action on click; the caret opens a menu of related alternatives.\n *\n * Use it to keep a cluster of related verbs as one control (e.g. a primary\n * \"Collect\" with a secondary \"Run a single operation\") instead of a row of\n * sibling buttons. For a single action use Button; for a pure menu use\n * DropdownMenu with its own trigger.\n *\n * - `variant`/`size` apply to both faces, so it reads as one control. The two\n * faces share a seam (the primary loses its right radius, the caret its\n * left) and a hairline divider.\n * - `disabled` disables the primary action only; the menu caret stays usable\n * (so secondary actions remain reachable while the primary is unavailable,\n * e.g. mid-run). Pass `menuDisabled` to disable the caret too.\n * - Each item carries its own `disabled`; a `destructive` item tints red.\n *\n * Usage:\n * <SplitButton\n * label=\"Collect\"\n * icon={<Play />}\n * onClick={startCollect}\n * disabled={collecting}\n * items={[\n * { label: \"Run a single operation...\", icon: <Zap />, onSelect: openRun },\n * ]}\n * />\n */\nexport interface SplitButtonItem {\n /** The item's visible text. */\n label: string;\n /** Optional leading icon (bare `<Icon />`, no size class). */\n icon?: React.ReactNode;\n /** Chosen handler. */\n onSelect: () => void;\n /** Disable just this item. */\n disabled?: boolean;\n /** Tint the item red (a destructive secondary action). */\n destructive?: boolean;\n}\n\nexport interface SplitButtonProps\n extends Omit<ButtonProps, \"children\" | \"onClick\"> {\n /** The primary action's label. */\n label: string;\n /** Optional leading icon for the primary face. */\n icon?: React.ReactNode;\n /** The primary action, run when the main face is clicked. */\n onClick?: () => void;\n /** The secondary actions, shown in the dropdown. */\n items: SplitButtonItem[];\n /** Disable the menu caret too (default: only the primary is disabled). */\n menuDisabled?: boolean;\n /** Accessible label for the caret trigger. Default \"More actions\". */\n menuLabel?: string;\n /** Which side the menu opens. Default \"bottom\". */\n menuAlign?: \"start\" | \"center\" | \"end\";\n}\n\nconst SplitButton = React.forwardRef<HTMLButtonElement, SplitButtonProps>(\n (\n {\n label,\n icon,\n onClick,\n items,\n disabled,\n menuDisabled,\n menuLabel = \"More actions\",\n menuAlign = \"end\",\n variant = \"default\",\n size = \"sm\",\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <div className={cn(\"inline-flex shrink-0\", className)}>\n <Button\n ref={ref}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={disabled}\n onClick={onClick}\n className=\"gap-1.5 rounded-r-none\"\n {...props}\n >\n {icon}\n {label}\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n disabled={menuDisabled}\n aria-label={menuLabel}\n className=\"rounded-l-none border-l border-l-black/10 px-1.5 dark:border-l-white/15\"\n >\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={menuAlign}>\n {items.map((item, i) => (\n <DropdownMenuItem\n key={`${i}-${item.label}`}\n disabled={item.disabled}\n onSelect={item.onSelect}\n className={cn(\n item.destructive && \"text-destructive focus:text-destructive\",\n )}\n >\n {item.icon}\n {item.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n },\n);\nSplitButton.displayName = \"SplitButton\";\n\nexport { SplitButton };\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"./button\";\n\n/**\n * ViewSwitch -- a quiet row of icon + text buttons that switches between the\n * views (or modes) of one surface: Graph | Model | Description, Semantic |\n * Text. The current one is filled (secondary), the others are ghost buttons,\n * so the switch sits calmly in a header or next to a query bar.\n *\n * Exactly one option is current; choosing another calls `onChange`. Use it for\n * a handful of short options that change what the surface shows. For content\n * panels that belong to the switch use Tabs; for actions use Button.\n *\n * - Pass bare icons (`<Network />`): the Button sizes child SVGs.\n * - Each option is a toggle button (`aria-pressed`) in a labelled group.\n *\n * Usage:\n * <ViewSwitch\n * label=\"Views\"\n * value={view}\n * onChange={setView}\n * options={[\n * { value: \"graph\", label: \"Graph\", icon: <Network /> },\n * { value: \"model\", label: \"Model\", icon: <Shapes /> },\n * ]}\n * />\n */\nexport interface ViewSwitchOption<T extends string> {\n /** The option's value. */\n value: T;\n /** Its visible text. */\n label: string;\n /** Optional leading icon (bare `<Icon />`, no size class). */\n icon?: React.ReactNode;\n}\n\nexport interface ViewSwitchProps<T extends string> {\n /** The options, in order. */\n options: ViewSwitchOption<T>[];\n /** The current option's value. */\n value: T;\n /** Called with the chosen option's value. */\n onChange: (value: T) => void;\n /** Accessible name of the group (e.g. \"Views\", \"Search mode\"). */\n label: string;\n className?: string;\n}\n\nexport function ViewSwitch<T extends string>({\n options,\n value,\n onChange,\n label,\n className,\n}: ViewSwitchProps<T>): React.ReactElement {\n return (\n <div\n role=\"group\"\n aria-label={label}\n className={cn(\"flex items-center gap-1\", className)}\n >\n {options.map((option) => {\n const current = option.value === value;\n return (\n <Button\n key={option.value}\n type=\"button\"\n variant={current ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"gap-1.5\"\n aria-pressed={current}\n onClick={() => !current && onChange(option.value)}\n >\n {option.icon}\n {option.label}\n </Button>\n );\n })}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"grid place-content-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import * as React from \"react\";\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\";\nimport { Circle } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\n/** A set of options of which one is chosen -- arrow keys move between them. */\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root\n ref={ref}\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\n/** One option of a RadioGroup, styled as the Checkbox is. */\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 shrink-0 rounded-full border border-primary text-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2 w-2 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n));\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","import * as React from \"react\";\nimport { type DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Dialog, DialogContent } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n // Focus: a quiet 1px halo plus a tinted border. Chrome matches\n // :focus-visible on text fields even for mouse clicks, so a heavy\n // ring would fire on every click into a field.\n \"flex h-10 w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n\n/** Renders a field-level error message below an input. */\nexport function InputError({\n error,\n}: {\n error: string | undefined;\n}): React.ReactElement | null {\n if (!error) return null;\n return <p className=\"mt-1 text-sm text-destructive\">{error}</p>;\n}\n","/**\n * DateInput -- text input with a calendar popover for a single date.\n *\n * The value is a partial ISO 8601 date string -- `\"YYYY\"`, `\"YYYY-MM\"`, or\n * `\"YYYY-MM-DD\"` depending on `precision`. Typed entry is parsed leniently\n * (see {@link parseDate}); `\"t\"`, `\"today\"`, or `\".\"` enter the current date;\n * calendar selection drills down to the terminal precision. Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport {\n cn,\n compileDateFormat,\n parseDate,\n formatDateInput,\n formatIsoDate,\n parseIsoDate,\n getLocaleDateFormat,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\nimport { Input, InputError } from \"../input\";\nimport { Popover, PopoverTrigger, PopoverContent } from \"../popover\";\nimport { Calendar } from \"./Calendar\";\n\nexport interface DateInputProps {\n /** Partial ISO date string (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`), or \"\". */\n value?: string;\n /** Called with the new partial ISO date string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Selection precision. Default `\"day\"`. */\n precision?: DatePrecision;\n /** BCP-47 locale override for display/parsing. Defaults to the app locale. */\n locale?: string;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n /** The earliest date that can be picked (`YYYY-MM-DD`); the calendar disables those before. */\n min?: string;\n /** The latest date that can be picked (`YYYY-MM-DD`); the calendar disables those after. */\n max?: string;\n}\n\nexport function DateInput({\n value,\n onChange,\n precision = \"day\",\n locale,\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n min,\n max,\n}: DateInputProps): React.ReactElement {\n const resolvedLocale = useLocale(locale);\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const fmt = React.useMemo(\n () =>\n compileDateFormat({\n format: getLocaleDateFormat(resolvedLocale, precision),\n }),\n [resolvedLocale, precision],\n );\n\n const selectedDate = React.useMemo(() => parseIsoDate(value), [value]);\n const earliest = React.useMemo(() => parseIsoDate(min) ?? undefined, [min]);\n const latest = React.useMemo(() => parseIsoDate(max) ?? undefined, [max]);\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(selectedDate ? formatDateInput(selectedDate, fmt) : \"\");\n setParseError(\"\");\n }, [selectedDate, fmt]);\n\n const commit = (date: Date | null): void => {\n onChange(date ? formatIsoDate(date, precision) : \"\");\n };\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n commit(null);\n onBlur?.();\n return;\n }\n const result = parseDate(inputValue, fmt);\n if (result.date) {\n setInputValue(result.value);\n setParseError(\"\");\n commit(result.date);\n } else {\n setParseError(result.error || \"Invalid date\");\n }\n onBlur?.();\n };\n\n const handleCalendarSelect = (date: Date): void => {\n setInputValue(formatDateInput(date, fmt));\n setParseError(\"\");\n commit(date);\n setOpen(false);\n };\n\n const shownError = error || parseError;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n handleBlur();\n setOpen(false);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n }\n }}\n placeholder={placeholder ?? fmt.format}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Open calendar\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <CalendarIcon size={16} />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-auto p-2\">\n <Calendar\n value={selectedDate}\n onSelect={handleCalendarSelect}\n min={earliest}\n max={latest}\n precision={precision}\n locale={resolvedLocale}\n />\n </PopoverContent>\n </Popover>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\n// Positions the content against an element that is not the trigger (e.g. an\n// input that opens the popover on focus).\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent };\n","/**\n * Calendar -- month/year/decade grid for selecting a single day.\n *\n * A controlled, dependency-light calendar operating on native `Date`. Renders\n * three drill-down views (days, months, years) with header navigation. Styling\n * uses semantic design tokens only.\n */\n\nimport * as React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport {\n cn,\n getWeekdayLabels,\n getFirstDayOfWeek,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\n\ntype CalendarView = \"days\" | \"months\" | \"years\";\n\n// Map a target precision to the calendar view at which selection is terminal.\nconst TERMINAL_VIEW: Record<DatePrecision, CalendarView> = {\n year: \"years\",\n month: \"months\",\n day: \"days\",\n};\n\nexport interface CalendarProps {\n /** Currently selected day, or null. */\n value: Date | null;\n /** Called when the user picks a date at the terminal precision. */\n onSelect: (date: Date) => void;\n /** Month shown when no value is selected. Defaults to today. */\n defaultViewDate?: Date;\n /**\n * Precision at which selection completes: `\"year\"` stops on the years view,\n * `\"month\"` on the months view, `\"day\"` on the days view (default).\n */\n precision?: DatePrecision;\n /** BCP-47 locale for month/weekday labels and week-start. */\n locale?: string;\n /** The earliest day that can be picked; days, months and years before it are disabled. */\n min?: Date;\n /** The latest day that can be picked; days, months and years after it are disabled. */\n max?: Date;\n}\n\n/** The days a calendar may offer: from `min` to `max`, either open. */\ninterface Range {\n min?: Date;\n max?: Date;\n}\n\n// The start of a day: what a range is compared at.\nfunction dayStart(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\n// Whether a span of days -- a day, a month, a year -- lies wholly outside the range.\nfunction outside(start: Date, end: Date, range: Range): boolean {\n return (\n (!!range.min && dayStart(end) < dayStart(range.min)) ||\n (!!range.max && dayStart(start) > dayStart(range.max))\n );\n}\n\n// A cell's look: selected, the current one, out of range, or plain.\nfunction cellClass(\n shape: string,\n selected: boolean,\n current: boolean,\n disabled: boolean,\n): string {\n return cn(\n shape,\n current && !selected && \"border border-primary\",\n selected\n ? \"bg-primary text-primary-foreground\"\n : disabled\n ? \"cursor-not-allowed text-muted-foreground opacity-40\"\n : \"hover:bg-state-hover\",\n );\n}\n\nfunction sameDay(a: Date, b: Date): boolean {\n return (\n a.getDate() === b.getDate() &&\n a.getMonth() === b.getMonth() &&\n a.getFullYear() === b.getFullYear()\n );\n}\n\nfunction monthName(month: number, locale: string): string {\n // Use a fixed safe day (1) to avoid month overflow on day 29-31.\n return new Date(2000, month, 1).toLocaleDateString(locale, { month: \"long\" });\n}\n\nfunction decadeStart(year: number): number {\n return Math.floor(year / 10) * 10;\n}\n\n// Cells for the visible month, padded with blanks before the first weekday,\n// respecting the locale's first day of week.\nfunction buildDayCells(viewDate: Date, firstDay: number): Array<Date | null> {\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n const weekday = new Date(year, month, 1).getDay();\n const leadingBlanks = (weekday - firstDay + 7) % 7;\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n\n const cells: Array<Date | null> = [];\n for (let i = 0; i < leadingBlanks; i++) cells.push(null);\n for (let day = 1; day <= daysInMonth; day++)\n cells.push(new Date(year, month, day));\n return cells;\n}\n\nfunction DaysView({\n viewDate,\n value,\n onSelect,\n locale,\n range,\n}: {\n viewDate: Date;\n value: Date | null;\n onSelect: (date: Date) => void;\n locale: string;\n range: Range;\n}): React.ReactElement {\n const firstDay = getFirstDayOfWeek(locale);\n const cells = buildDayCells(viewDate, firstDay);\n const weekdayLabels = getWeekdayLabels(locale);\n const today = new Date();\n\n return (\n <>\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {weekdayLabels.map((label) => (\n <div\n key={label}\n className=\"text-center text-xs font-medium text-muted-foreground\"\n >\n {label}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {cells.map((date, index) => {\n if (!date) return <div key={`blank-${index}`} className=\"h-8 w-8\" />;\n const isSelected = value ? sameDay(date, value) : false;\n const disabled = outside(date, date, range);\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(date)}\n className={cellClass(\n \"h-8 w-8 rounded-full text-center text-sm\",\n isSelected,\n sameDay(date, today),\n disabled,\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </>\n );\n}\n\nfunction MonthsView({\n viewDate,\n value,\n onPick,\n locale,\n range,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (month: number) => void;\n locale: string;\n range: Range;\n}): React.ReactElement {\n const now = new Date();\n const year = viewDate.getFullYear();\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 12 }, (_, month) => {\n const isCurrent =\n month === now.getMonth() &&\n viewDate.getFullYear() === now.getFullYear();\n const isSelected =\n !!value &&\n month === value.getMonth() &&\n viewDate.getFullYear() === value.getFullYear();\n const disabled = outside(\n new Date(year, month, 1),\n new Date(year, month + 1, 0),\n range,\n );\n return (\n <button\n key={month}\n type=\"button\"\n disabled={disabled}\n onClick={() => onPick(month)}\n className={cellClass(\n \"rounded py-2 text-center text-sm\",\n isSelected,\n isCurrent,\n disabled,\n )}\n >\n {monthName(month, locale)}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction YearsView({\n viewDate,\n value,\n onPick,\n range,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (year: number) => void;\n range: Range;\n}): React.ReactElement {\n const now = new Date().getFullYear();\n const start = decadeStart(viewDate.getFullYear());\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 10 }, (_, i) => {\n const year = start + i;\n const isSelected = !!value && year === value.getFullYear();\n const disabled = outside(\n new Date(year, 0, 1),\n new Date(year, 11, 31),\n range,\n );\n return (\n <button\n key={year}\n type=\"button\"\n disabled={disabled}\n onClick={() => onPick(year)}\n className={cellClass(\n \"rounded py-2 text-center text-sm\",\n isSelected,\n year === now,\n disabled,\n )}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction headerText(\n view: CalendarView,\n viewDate: Date,\n locale: string,\n): string {\n if (view === \"months\") return viewDate.getFullYear().toString();\n if (view === \"years\") {\n const start = decadeStart(viewDate.getFullYear());\n return `${start} - ${start + 9}`;\n }\n return `${monthName(viewDate.getMonth(), locale)} ${viewDate.getFullYear()}`;\n}\n\n// Step the visible range by the unit appropriate to the active view.\nfunction shiftViewDate(\n view: CalendarView,\n viewDate: Date,\n direction: 1 | -1,\n): Date {\n if (view === \"months\") {\n return new Date(viewDate.getFullYear() + direction, viewDate.getMonth(), 1);\n }\n if (view === \"years\") {\n return new Date(decadeStart(viewDate.getFullYear()) + direction * 10, 0, 1);\n }\n return new Date(viewDate.getFullYear(), viewDate.getMonth() + direction, 1);\n}\n\nexport function Calendar({\n value,\n onSelect,\n defaultViewDate,\n precision = \"day\",\n locale,\n min,\n max,\n}: CalendarProps): React.ReactElement {\n const range: Range = { min, max };\n const resolvedLocale = useLocale(locale);\n const terminalView = TERMINAL_VIEW[precision];\n const [view, setView] = React.useState<CalendarView>(terminalView);\n const [viewDate, setViewDate] = React.useState<Date>(\n value ?? defaultViewDate ?? new Date(),\n );\n\n React.useEffect(() => {\n if (value) setViewDate(value);\n }, [value]);\n\n const handleMonthPick = (month: number): void => {\n const next = new Date(viewDate.getFullYear(), month, 1);\n if (precision === \"month\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"days\");\n };\n\n const handleYearPick = (year: number): void => {\n const next = new Date(year, viewDate.getMonth(), 1);\n if (precision === \"year\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"months\");\n };\n\n // The header drills up one level (days -> months -> years) so the user can\n // quickly jump to a distant year. Drilling down is bounded by precision in\n // handleMonthPick / handleYearPick.\n const canDrillUp = view !== \"years\";\n const drillUp = (): void => setView(view === \"days\" ? \"months\" : \"years\");\n\n return (\n <div className=\"w-64\">\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, -1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Previous\"\n >\n <ChevronLeft size={16} />\n </button>\n <button\n type=\"button\"\n onClick={canDrillUp ? drillUp : undefined}\n disabled={!canDrillUp}\n className={cn(\n \"rounded px-2 py-1 font-medium\",\n canDrillUp && \"hover:bg-state-hover\",\n )}\n >\n {headerText(view, viewDate, resolvedLocale)}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, 1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Next\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n\n {view === \"days\" && (\n <DaysView\n viewDate={viewDate}\n value={value}\n onSelect={onSelect}\n locale={resolvedLocale}\n range={range}\n />\n )}\n {view === \"months\" && (\n <MonthsView\n viewDate={viewDate}\n value={value}\n onPick={handleMonthPick}\n locale={resolvedLocale}\n range={range}\n />\n )}\n {view === \"years\" && (\n <YearsView\n viewDate={viewDate}\n value={value}\n onPick={handleYearPick}\n range={range}\n />\n )}\n </div>\n );\n}\n","/**\n * TimeInput -- text input for a zone-free time of day.\n *\n * The value is a normalized ISO time string -- `\"HH:mm\"` (minute granularity,\n * default) or `\"HH:mm:ss\"` (second granularity). A time of day carries no date\n * and no timezone (Temporal.PlainTime); consumers that need an instant combine\n * it with a date and zone at persistence time. Typed entry is parsed leniently\n * (see {@link parseTime}); `\"n\"`, `\"now\"`, or `\".\"` enter the current time.\n * Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport {\n cn,\n parseTime,\n normalizeTime,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { Input, InputError } from \"../input\";\n\nexport interface TimeInputProps {\n /** Normalized ISO time string (`\"HH:mm\"` or `\"HH:mm:ss\"`), or \"\". */\n value?: string;\n /** Called with the new normalized ISO time string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function TimeInput({\n value,\n onChange,\n granularity = \"minute\",\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: TimeInputProps): React.ReactElement {\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const normalized = React.useMemo(\n () => normalizeTime(value, granularity),\n [value, granularity],\n );\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(normalized);\n setParseError(\"\");\n }, [normalized]);\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n onChange(\"\");\n onBlur?.();\n return;\n }\n const result = parseTime(inputValue, granularity);\n if (result.value) {\n setInputValue(result.value);\n setParseError(\"\");\n onChange(result.value);\n } else {\n setParseError(result.error || \"Invalid time\");\n }\n onBlur?.();\n };\n\n const shownError = error || parseError;\n const placeholderText =\n placeholder ?? (granularity === \"second\" ? \"HH:MM:SS\" : \"HH:MM\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n inputMode=\"numeric\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") handleBlur();\n }}\n placeholder={placeholderText}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground\">\n <Clock size={16} />\n </span>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","/**\n * DateTimeInput -- combined date + time entry for a plain wall-clock datetime.\n *\n * The value is a plain wall-clock ISO string `\"YYYY-MM-DDTHH:mm[:ss]\"` with no\n * timezone (Temporal.PlainDateTime). Timezone is intentionally not part of the\n * input: a wall-clock datetime means \"this local time\", and resolving it to an\n * absolute instant (UTC) is the consumer's responsibility at persistence time.\n *\n * The optional `timeZone` prop is a pass-through context value (e.g. a clinic's\n * zone supplied programmatically) shown as a hint -- it is never applied to the\n * value and is never entered by the user. Cross-zone apps that need an explicit\n * zone picker should compose one separately.\n *\n * Composes {@link DateInput} (day precision) and {@link TimeInput}.\n */\n\nimport * as React from \"react\";\nimport {\n cn,\n splitDateTime,\n joinDateTime,\n formatIsoDate,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { DateInput } from \"../DateInput\";\nimport { TimeInput } from \"../TimeInput\";\n\nexport interface DateTimeInputProps {\n /** Plain wall-clock ISO datetime `\"YYYY-MM-DDTHH:mm[:ss]\"`, or \"\". */\n value?: string;\n /** Called with the new plain wall-clock ISO datetime, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n /**\n * Optional timezone context (IANA id, e.g. `\"Europe/Berlin\"`). Shown as a\n * hint only; never applied to the value and never user-entered.\n */\n timeZone?: string;\n /** BCP-47 locale override for the date part. Defaults to the app locale. */\n locale?: string;\n idPrefix?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n /** The earliest datetime (`YYYY-MM-DDTHH:mm...`): its date bounds the calendar. */\n min?: string;\n /** The latest datetime: its date bounds the calendar. */\n max?: string;\n}\n\nexport function DateTimeInput({\n value,\n onChange,\n granularity = \"minute\",\n timeZone,\n locale,\n idPrefix,\n required,\n disabled,\n error,\n className,\n onBlur,\n min,\n max,\n}: DateTimeInputProps): React.ReactElement {\n const { date, time } = React.useMemo(() => splitDateTime(value), [value]);\n\n const handleDateChange = (nextDate: string): void => {\n onChange(joinDateTime(nextDate, time));\n };\n\n const handleTimeChange = (nextTime: string): void => {\n if (!nextTime) {\n onChange(date ? joinDateTime(date, \"\") : \"\");\n return;\n }\n // Entering a time before a date (e.g. via the \"now\" shorthand) defaults\n // the date to today so the result is a complete datetime.\n onChange(joinDateTime(date || formatIsoDate(new Date()), nextTime));\n };\n\n return (\n <div className={cn(\"space-y-1\", className)}>\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <DateInput\n id={idPrefix ? `${idPrefix}-date` : undefined}\n value={date}\n onChange={handleDateChange}\n locale={locale}\n error={error}\n required={required}\n disabled={disabled}\n onBlur={onBlur}\n min={min ? splitDateTime(min).date : undefined}\n max={max ? splitDateTime(max).date : undefined}\n />\n </div>\n <div className=\"w-32\">\n <TimeInput\n id={idPrefix ? `${idPrefix}-time` : undefined}\n value={time}\n onChange={handleTimeChange}\n granularity={granularity}\n disabled={disabled}\n onBlur={onBlur}\n />\n </div>\n </div>\n {timeZone && (\n <p className=\"text-xs text-tertiary-foreground\">Times in {timeZone}</p>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-60\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\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 border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]\",\n \"h-9 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:ring-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium 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 pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5\",\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 // A control of the addon's own keeps the focus it takes; a click elsewhere focuses the input.\n if (\n (e.target as HTMLElement).closest(\"button, input, select, textarea\")\n ) {\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)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] 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 \"text-muted-foreground flex items-center gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\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 focus-visible:ring-0 dark: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-3 shadow-none focus-visible:ring-0 dark: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\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n // Focus treatment matches Input -- see the note there.\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","import * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref,\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nexport interface ResizeHandleProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Orientation of the handle bar:\n * - \"vertical\" (default): a vertical bar separating LEFT/RIGHT panes\n * (drag horizontally). Uses `cursor-col-resize`.\n * - \"horizontal\": a horizontal bar separating TOP/BOTTOM panes\n * (drag vertically). Uses `cursor-row-resize`.\n */\n orientation?: \"vertical\" | \"horizontal\";\n /** Length of the centered grip in pixels. Defaults to 48. */\n gripLength?: number;\n}\n\n/**\n * ResizeHandle — a quiet, flat draggable divider between two resizable panes.\n *\n * Renders a wide invisible hit-area with a short centered grip (quiet\n * `bg-border` at rest, `bg-border-strong` on hover), a focus ring, and the\n * correct `role=\"separator\"` / `aria-orientation` / resize cursor. No\n * full-height seam line — the adjacent panes own their own edges.\n *\n * The consumer owns the resize math: wire `onPointerDown` (and optionally\n * `onDoubleClick`, `tabIndex`, `aria-valuenow`/min/max) via props.\n *\n * @example\n * <ResizeHandle\n * orientation=\"vertical\"\n * aria-valuenow={width}\n * aria-valuemin={MIN}\n * aria-valuemax={MAX}\n * onPointerDown={startResize}\n * onDoubleClick={resetWidth}\n * />\n */\nexport const ResizeHandle = React.forwardRef<HTMLDivElement, ResizeHandleProps>(\n (\n { orientation = \"vertical\", gripLength = 48, className, style, ...props },\n ref,\n ) => {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 select-none touch-none items-center justify-center rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n isVertical\n ? \"mx-1 w-2 cursor-col-resize\"\n : \"my-1 h-2 cursor-row-resize\",\n className,\n )}\n style={style}\n {...props}\n >\n {/* Centered short grip — no full-height seam line. */}\n <div\n className=\"pointer-events-none absolute rounded-full bg-border transition-colors group-hover:bg-border-strong\"\n style={\n isVertical\n ? { width: 4, height: gripLength }\n : { height: 4, width: gripLength }\n }\n />\n </div>\n );\n },\n);\nResizeHandle.displayName = \"ResizeHandle\";\n","/**\n * Sheet — a slide-over panel (drawer) built on Radix Dialog.\n * Slides in from the right edge. Used for create/edit/detail operations.\n *\n * SheetContent accepts an optional `offsetTop` (CSS length, e.g. \"3rem\")\n * to push the panel below a fixed header. The overlay is unaffected so the\n * backdrop still covers the full screen.\n */\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Sheet = DialogPrimitive.Root;\nconst SheetTrigger = DialogPrimitive.Trigger;\nconst SheetClose = DialogPrimitive.Close;\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n side?: \"right\" | \"left\";\n /** CSS length (e.g. \"3rem\" or \"0px\") controlling where the panel starts vertically. Internal use — prefer PanelOptions.coverage at the shell API level. */\n offsetTop?: string;\n }\n>(\n (\n { className, children, side = \"right\", offsetTop = \"0px\", style, ...props },\n ref,\n ) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 flex flex-col bg-background shadow-xl transition-transform duration-300 ease-in-out\",\n \"bottom-0 w-[480px] max-w-[90vw] border-l\",\n side === \"right\" &&\n \"right-0 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n side === \"left\" &&\n \"left-0 border-l-0 border-r data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\n className,\n )}\n style={{ top: offsetTop, ...style }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = \"SheetContent\";\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"shrink-0 border-b px-6 py-4\", className)} {...props} />\n);\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = \"SheetTitle\";\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground mt-1\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = \"SheetDescription\";\n\nconst SheetBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex-1 overflow-y-auto px-6 py-4\", className)}\n {...props}\n />\n);\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"shrink-0 border-t px-6 py-4 flex justify-end gap-2\",\n className,\n )}\n {...props}\n />\n);\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetOverlay,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n};\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n \"flex-start\": \"items-start\",\n \"flex-end\": \"items-end\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n \"space-between\": \"justify-between\",\n \"flex-start\": \"justify-start\",\n \"flex-end\": \"justify-end\",\n} as const;\n\nconst wrapMap = {\n wrap: \"flex-wrap\",\n nowrap: \"flex-nowrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n} as const;\n\nconst mtMap: Record<string, string> = {\n xs: \"mt-1\",\n sm: \"mt-2\",\n md: \"mt-4\",\n lg: \"mt-6\",\n xl: \"mt-8\",\n};\n\ninterface SimpleGroupProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n wrap?: keyof typeof wrapMap;\n grow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n mt?: keyof typeof mtMap;\n onClick?: () => void;\n}\n\n/**\n * SimpleGroup - A horizontal flex container component\n *\n * Replaces Mantine's Group with a simpler Tailwind-based implementation.\n * Defaults to flex-row (horizontal layout).\n *\n * @example\n * <SimpleGroup gap=\"sm\" justify=\"between\">\n * <div>Left item</div>\n * <div>Right item</div>\n * </SimpleGroup>\n */\nexport function SimpleGroup({\n children,\n gap = \"md\",\n align,\n justify,\n wrap,\n grow = false,\n className,\n style,\n mt,\n onClick,\n}: SimpleGroupProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n const wrapClass = wrap ? wrapMap[wrap] : undefined;\n const growClass = grow ? \"[&>*]:flex-1\" : undefined;\n const mtClass = mt ? mtMap[mt] : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-row\",\n gapClass,\n alignClass,\n justifyClass,\n wrapClass,\n growClass,\n mtClass,\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nexport interface ListRowProps {\n /** The item's name. */\n title: React.ReactNode;\n /** Shown next to the title: badges, a key, a status. */\n adornment?: React.ReactNode;\n /** One muted line below the title: a description or a summary of values. */\n detail?: React.ReactNode;\n /** Right-aligned controls, typically icon buttons (edit, delete, test). */\n actions?: React.ReactNode;\n /** Makes the title area a button (e.g. open the item); the actions stay separate. */\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * ListRow -- one item of a short, bordered list: a title with an optional\n * adornment and detail line, and actions on the right. For lists of\n * configurable things (connections, kinds, settings entries); a large or\n * sortable collection belongs in an EntityTable.\n */\nexport function ListRow({\n title,\n adornment,\n detail,\n actions,\n onClick,\n className,\n}: ListRowProps): React.ReactElement {\n const body = (\n <>\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">{title}</span>\n {adornment}\n </div>\n {detail != null && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n {detail}\n </p>\n )}\n </>\n );\n return (\n <div\n className={cn(\"flex items-center gap-3 rounded-md border p-3\", className)}\n >\n {onClick ? (\n <button\n type=\"button\"\n className=\"flex-1 min-w-0 text-left\"\n onClick={onClick}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex-1 min-w-0\">{body}</div>\n )}\n {actions != null && (\n <div className=\"flex items-center gap-1 shrink-0\">{actions}</div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Button } from \"../button\";\nimport { SimpleTooltip } from \"../simple-tooltip\";\n\n/** One action of a Danger zone: what it is, what it destroys, its button. */\nexport interface DangerZoneAction {\n /** What it does, as a heading: \"Delete this source\". */\n title: React.ReactNode;\n /** One sentence saying what it destroys. */\n description: React.ReactNode;\n /** The button's text: \"Delete source\". */\n label: React.ReactNode;\n icon?: React.ComponentType<{ className?: string }>;\n /** Run it -- the caller confirms first (dialog.confirm), naming what is lost. */\n onClick: () => void;\n /**\n * \"destructive\" (the default) for what removes the item itself; \"outline\" for\n * what destroys part of it and leaves the item (drop its data, reset it).\n */\n variant?: \"destructive\" | \"outline\";\n /** Not allowed yet: the button is disabled and this says why, on hover. */\n disabledReason?: React.ReactNode;\n /** Running: the button is disabled until it ends. */\n pending?: boolean;\n}\n\nexport interface DangerZoneProps {\n actions: DangerZoneAction[];\n /** The section's heading; \"Danger zone\" by default. */\n title?: React.ReactNode;\n className?: string;\n}\n\n// One action: its title and consequence on the left, its button on the right.\nfunction DangerZoneRow({\n action,\n}: {\n action: DangerZoneAction;\n}): React.ReactElement {\n const Icon = action.icon;\n const button = (\n <Button\n variant={action.variant ?? \"destructive\"}\n size=\"sm\"\n className=\"gap-1.5\"\n disabled={action.disabledReason != null || action.pending}\n onClick={action.onClick}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {action.label}\n </Button>\n );\n return (\n <div className=\"flex items-center justify-between gap-4 px-5 py-4\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{action.title}</p>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n {action.description}\n </p>\n </div>\n <div className=\"shrink-0\">\n {action.disabledReason != null ? (\n // A disabled button fires no pointer events; the span carries the tooltip.\n <SimpleTooltip label={action.disabledReason}>\n <span tabIndex={0}>{button}</span>\n </SimpleTooltip>\n ) : (\n button\n )}\n </div>\n </div>\n );\n}\n\n/**\n * DangerZone -- the last section of a heavyweight item's Settings tab: what\n * cannot be undone or reaches beyond the item (delete it, drop its data), set\n * apart under a destructive heading and border, one row per action.\n *\n * Each action says what it destroys; one not allowed yet is shown disabled with\n * its reason -- unlike a row action, which is omitted. Confirming is the\n * caller's (sonnet-shell's dialog.confirm), naming what is lost. See\n * docs/design/interaction-patterns.md, \"The Danger zone\".\n */\nexport function DangerZone({\n actions,\n title = \"Danger zone\",\n className,\n}: DangerZoneProps): React.ReactElement | null {\n if (actions.length === 0) return null;\n return (\n <section className={className}>\n <h2 className=\"text-base font-semibold text-destructive mb-4\">{title}</h2>\n <div className=\"rounded-lg border border-destructive/40 divide-y divide-border\">\n {actions.map((action, index) => (\n <DangerZoneRow key={index} action={action} />\n ))}\n </div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n} as const;\n\ninterface SimpleStackProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n className?: string;\n style?: React.CSSProperties;\n h?: number | string;\n}\n\n/**\n * SimpleStack - A vertical flex container component\n *\n * Replaces Mantine's Stack with a simpler Tailwind-based implementation.\n * Defaults to flex-col (vertical stacking).\n *\n * @example\n * <SimpleStack gap=\"md\" align=\"center\">\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </SimpleStack>\n */\nexport function SimpleStack({\n children,\n gap = \"md\",\n align,\n justify,\n className,\n style,\n h,\n}: SimpleStackProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n\n const heightStyle =\n h !== undefined\n ? { height: typeof h === \"number\" ? `${h}px` : h }\n : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n gapClass,\n alignClass,\n justifyClass,\n className,\n )}\n style={{ ...heightStyle, ...style }}\n >\n {children}\n </div>\n );\n}\n","/**\n * CodedValueDisplay -- a coded value as text: its label, and its code beside\n * it, muted; the code alone when there is no label. The code system, when\n * given, shows on hover. Used by the coded-value widget, the `coding` cell\n * renderer, and wherever a stored code is shown without an input.\n */\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { SimpleTooltip } from \"./simple-tooltip\";\n\nexport interface CodedValueDisplayProps {\n code: string;\n display?: string | null;\n /** The code system, shown on hover. */\n system?: string | null;\n className?: string;\n}\n\nexport function CodedValueDisplay({\n code,\n display,\n system,\n className,\n}: CodedValueDisplayProps) {\n const text = (\n <span\n className={cn(\"inline-flex min-w-0 items-baseline gap-1.5\", className)}\n >\n {display && <span className=\"truncate text-sm\">{display}</span>}\n <span\n className={cn(\n \"shrink-0 text-muted-foreground\",\n display ? \"text-xs\" : \"text-sm\",\n )}\n >\n {code}\n </span>\n </span>\n );\n return system ? (\n <SimpleTooltip label={system} side=\"top\">\n {text}\n </SimpleTooltip>\n ) : (\n text\n );\n}\n","/**\n * CodeableConceptDisplay -- a codeable concept as text: its first coding as a\n * coded value is shown, and how many more it has, muted; on hover the others,\n * each with its label, code and match, and the text the person gave. A\n * concept of text alone shows its text. Used by the `coding` cell renderer and\n * wherever a stored codeable concept is shown without an input.\n */\n\nimport { cn, EMPTY_VALUE } from \"@petrarca/sonnet-core\";\nimport {\n codingKey,\n type CodeableConcept,\n type ConceptCoding,\n} from \"@petrarca/sonnet-core/schema\";\nimport { CodedValueDisplay } from \"./coded-value-display\";\nimport { SimpleTooltip } from \"./simple-tooltip\";\n\nexport interface CodeableConceptDisplayProps {\n value: CodeableConcept;\n className?: string;\n}\n\n// The other codings, one per line, and the person's text: what the hover shows.\nfunction OthersList({\n codings,\n text,\n}: {\n codings: ConceptCoding[];\n text?: string;\n}) {\n return (\n <span className=\"flex flex-col gap-0.5\">\n {codings.map((c) => (\n <span key={codingKey(c)} className=\"flex items-baseline gap-1.5\">\n {c.display && <span>{c.display}</span>}\n <span className=\"font-mono text-xs opacity-80\">{c.code}</span>\n {c.match && <span className=\"text-xs opacity-70\">{c.match}</span>}\n </span>\n ))}\n {text && <span className=\"italic opacity-80\">&ldquo;{text}&rdquo;</span>}\n </span>\n );\n}\n\nexport function CodeableConceptDisplay({\n value,\n className,\n}: CodeableConceptDisplayProps) {\n const [first, ...others] = value.codings ?? [];\n if (!first)\n return value.text ? (\n <span className={cn(\"text-sm\", className)}>{value.text}</span>\n ) : (\n <span className=\"text-muted-foreground\">{EMPTY_VALUE}</span>\n );\n const more = others.length > 0 || !!value.text;\n return (\n <span\n className={cn(\"inline-flex min-w-0 items-baseline gap-1.5\", className)}\n >\n <CodedValueDisplay\n code={first.code}\n display={first.display}\n system={first.system}\n />\n {more && (\n <SimpleTooltip\n label={<OthersList codings={others} text={value.text} />}\n side=\"top\"\n >\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {others.length > 0 ? `+${others.length}` : \"…\"}\n </span>\n </SimpleTooltip>\n )}\n </span>\n );\n}\n","import { cn } from \"@petrarca/sonnet-core\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import { cn } from \"@petrarca/sonnet-core\";\n\ninterface SpinnerProps {\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-2\",\n lg: \"h-12 w-12 border-3\",\n};\n\n/**\n * Simple loading spinner component\n *\n * Replaces Mantine's Loader component\n *\n * @example\n * ```tsx\n * <Spinner />\n * <Spinner size=\"lg\" />\n * <Spinner className=\"text-blue-500\" />\n * ```\n */\nexport function Spinner({ className, size = \"md\" }: SpinnerProps) {\n return (\n <div\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\",\n sizeClasses[size],\n className,\n )}\n role=\"status\"\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Tabs = TabsPrimitive.Root;\n\ninterface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n /** Alignment of tabs: 'start' (left), 'center', or 'end' (right). Default: 'start' */\n align?: \"start\" | \"center\" | \"end\";\n}\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, align = \"start\", ...props }, ref) => {\n const alignClass =\n align === \"center\"\n ? \"justify-center\"\n : align === \"end\"\n ? \"justify-end\"\n : \"justify-start\";\n\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center rounded-md bg-muted p-1 text-muted-foreground\",\n alignClass,\n className,\n )}\n {...props}\n />\n );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"data-[state=inactive]:hidden\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\n/**\n * TabsSeparator -- a thin, non-interactive vertical divider placed inside a\n * TabsList to visually group related triggers (e.g. preview tabs vs. source\n * tabs). Presentational only; not part of the roving-tabindex order.\n */\nconst TabsSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n \"mx-2 h-6 w-0.5 shrink-0 rounded-full bg-muted-foreground/40\",\n className,\n )}\n {...props}\n />\n));\nTabsSeparator.displayName = \"TabsSeparator\";\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsSeparator };\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport {\n Direction as DirectionPrimitive,\n Slot as SlotPrimitive,\n} from \"radix-ui\";\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@petrarca/sonnet-core\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useAsRef } from \"./radix/hooks/use-as-ref\";\nimport { useIsomorphicLayoutEffect } from \"./radix/hooks/use-isomorphic-layout-effect\";\nimport { useLazyRef } from \"./radix/hooks/use-lazy-ref\";\n\nconst ROOT_NAME = \"Stepper\";\nconst LIST_NAME = \"StepperList\";\nconst ITEM_NAME = \"StepperItem\";\nconst TRIGGER_NAME = \"StepperTrigger\";\nconst INDICATOR_NAME = \"StepperIndicator\";\nconst SEPARATOR_NAME = \"StepperSeparator\";\nconst TITLE_NAME = \"StepperTitle\";\nconst DESCRIPTION_NAME = \"StepperDescription\";\nconst CONTENT_NAME = \"StepperContent\";\nconst PREV_NAME = \"StepperPrev\";\nconst NEXT_NAME = \"StepperNext\";\n\nconst ENTRY_FOCUS = \"stepperFocusGroup.onEntryFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\nconst ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\ntype Direction = \"ltr\" | \"rtl\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype NavigationDirection = \"next\" | \"prev\";\ntype ActivationMode = \"automatic\" | \"manual\";\ntype DataState = \"inactive\" | \"active\" | \"completed\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype ListElement = React.ComponentRef<typeof StepperList>;\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>;\n\nfunction getId(\n id: string,\n variant: \"trigger\" | \"content\" | \"title\" | \"description\",\n value: string,\n) {\n return `${id}-${variant}-${value}`;\n}\n\ntype FocusIntent = \"first\" | \"last\" | \"prev\" | \"next\";\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\",\n};\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\"\n ? \"ArrowRight\"\n : key === \"ArrowRight\"\n ? \"ArrowLeft\"\n : key;\n}\n\nfunction getFocusIntent(\n event: React.KeyboardEvent<TriggerElement>,\n dir?: Direction,\n orientation?: Orientation,\n) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key))\n return undefined;\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key))\n return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nfunction focusFirst(\n candidates: React.RefObject<TriggerElement | null>[],\n preventScroll = false,\n) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>(\n (_, index) => array[(startIndex + index) % array.length] as T,\n );\n}\n\n/**\n * Handles Enter/Space key activation for manual and non-interactive modes.\n * Returns true if the event was handled (caller should return early).\n */\nfunction handleActivationKeys(\n event: React.KeyboardEvent<TriggerElement>,\n nonInteractive: boolean,\n activationMode: ActivationMode,\n isDisabled: boolean | undefined,\n triggerRef: React.RefObject<TriggerElement | null>,\n): boolean {\n if (event.key === \"Enter\" && nonInteractive) {\n event.preventDefault();\n return true;\n }\n\n if (\n (event.key === \"Enter\" || event.key === \" \") &&\n activationMode === \"manual\" &&\n !nonInteractive\n ) {\n event.preventDefault();\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click();\n }\n return true;\n }\n\n return false;\n}\n\nfunction hasModifierKey(event: React.KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;\n}\n\n/**\n * Resolves the ordered list of focus candidates based on intent direction.\n */\nfunction resolveFocusCandidates(\n items: ItemData[],\n focusIntent: FocusIntent,\n currentTarget: TriggerElement,\n loop: boolean,\n): React.RefObject<TriggerElement | null>[] {\n let candidateRefs = items.map((item) => item.ref);\n\n if (focusIntent === \"last\") {\n candidateRefs.reverse();\n } else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateRefs.reverse();\n const currentIndex = candidateRefs.findIndex(\n (ref) => ref.current === currentTarget,\n );\n candidateRefs = loop\n ? wrapArray(candidateRefs, currentIndex + 1)\n : candidateRefs.slice(currentIndex + 1);\n }\n\n return candidateRefs;\n}\n\n/**\n * Handles step validation and navigation when the store has validation.\n * Returns true if navigation was handled (caller should return early).\n */\nasync function handleValidatedNavigation(\n store: Store,\n candidateRefs: React.RefObject<TriggerElement | null>[],\n items: ItemData[],\n itemValue: string,\n value: string | undefined,\n steps: Map<string, StepState>,\n): Promise<boolean> {\n if (!store.hasValidation() || candidateRefs.length === 0) return false;\n\n const nextRef = candidateRefs[0];\n const nextElement = nextRef?.current;\n const nextItem = items.find((item) => item.ref.current === nextElement);\n\n if (!nextItem || nextItem.value === itemValue) return false;\n\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value);\n const direction: NavigationDirection =\n targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n if (direction === \"next\") {\n const isValid = await store.setStateWithValidation(\n nextItem.value,\n direction,\n );\n if (!isValid) return true;\n } else {\n store.setState(\"value\", nextItem.value);\n }\n\n queueMicrotask(() => nextElement?.focus());\n return true;\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: \"item\" | \"separator\" = \"item\",\n): DataState {\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.indexOf(itemValue);\n\n if (stepState?.completed) return \"completed\";\n\n if (value === itemValue) {\n return variant === \"separator\" ? \"inactive\" : \"active\";\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value);\n\n if (activeIndex > currentIndex) return \"completed\";\n }\n\n return \"inactive\";\n}\n\ninterface StepState {\n value: string;\n completed: boolean;\n disabled: boolean;\n}\n\ninterface StoreState {\n steps: Map<string, StepState>;\n value: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStateWithValidation: (\n value: string,\n direction: NavigationDirection,\n ) => Promise<boolean>;\n hasValidation: () => boolean;\n notify: () => void;\n addStep: (value: string, completed: boolean, disabled: boolean) => void;\n removeStep: (value: string) => void;\n setStep: (value: string, completed: boolean, disabled: boolean) => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector],\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface ItemData {\n id: string;\n ref: React.RefObject<TriggerElement | null>;\n value: string;\n active: boolean;\n disabled: boolean;\n}\n\ninterface StepperContextValue {\n rootId: string;\n dir: Direction;\n orientation: Orientation;\n activationMode: ActivationMode;\n disabled: boolean;\n nonInteractive: boolean;\n loop: boolean;\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null);\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperProps extends DivProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onValueComplete?: (value: string, completed: boolean) => void;\n onValueAdd?: (value: string) => void;\n onValueRemove?: (value: string) => void;\n onValidate?: (\n value: string,\n direction: NavigationDirection,\n ) => boolean | Promise<boolean>;\n activationMode?: ActivationMode;\n dir?: Direction;\n orientation?: Orientation;\n disabled?: boolean;\n loop?: boolean;\n nonInteractive?: boolean;\n}\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = \"horizontal\",\n activationMode = \"automatic\",\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? \"\",\n }));\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState(\"value\", value);\n return true;\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction);\n if (isValid) {\n store.setState(\"value\", value);\n }\n return isValid;\n } catch {\n return false;\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, newStep);\n stateRef.current.steps = next;\n propsRef.current.onValueAdd?.(value);\n store.notify();\n },\n removeStep: (value) => {\n const next = new Map(stateRef.current.steps);\n next.delete(value);\n stateRef.current.steps = next;\n propsRef.current.onValueRemove?.(value);\n store.notify();\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value);\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, updatedStep);\n stateRef.current.steps = next;\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed);\n }\n\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef, propsRef]);\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState(\"value\", value);\n }\n }, [value]);\n\n const dir = DirectionPrimitive.useDirection(dirProp);\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n );\n\n const RootPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn(\n \"flex gap-3\",\n orientation === \"horizontal\" ? \"w-full flex-col\" : \"flex-row\",\n className,\n )}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface FocusContextValue {\n tabStopId: string | null;\n onItemFocus: (tabStopId: string) => void;\n onItemShiftTab: () => void;\n onFocusableItemAdd: () => void;\n onFocusableItemRemove: () => void;\n onItemRegister: (item: ItemData) => void;\n onItemUnregister: (id: string) => void;\n getItems: () => ItemData[];\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null);\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext);\n if (!context) {\n throw new Error(\n `\\`${consumerName}\\` must be used within \\`FocusProvider\\``,\n );\n }\n return context;\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props;\n\n const context = useStepperContext(LIST_NAME);\n const orientation = context.orientation;\n const currentValue = useStore((state) => state.value);\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n });\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null);\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const [focusableItemCount, setFocusableItemCount] = React.useState(0);\n const isClickFocusRef = React.useRef(false);\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map());\n const listRef = React.useRef<ListElement>(null);\n const composedRef = useComposedRefs(ref, listRef);\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId);\n }, []);\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true);\n }, []);\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1);\n }, []);\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1);\n }, []);\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item);\n }, []);\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id);\n }, []);\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n }, []);\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event);\n if (event.defaultPrevented) return;\n\n setIsTabbingBackOut(false);\n },\n [propsRef],\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n const isKeyboardFocus = !isClickFocusRef.current;\n if (\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !isTabbingBackOut\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter(\n (item) => !item.disabled,\n );\n const selectedItem = currentValue\n ? items.find((item) => item.value === currentValue)\n : undefined;\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === tabStopId);\n\n const candidateItems = [\n selectedItem,\n activeItem,\n currentItem,\n ...items,\n ].filter(Boolean) as ItemData[];\n const candidateRefs = candidateItems.map((item) => item.ref);\n focusFirst(candidateRefs, false);\n }\n }\n isClickFocusRef.current = false;\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event);\n\n if (event.defaultPrevented) return;\n\n isClickFocusRef.current = true;\n },\n [propsRef],\n );\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n );\n\n const ListPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n \"flex outline-none\",\n orientation === \"horizontal\"\n ? \"flex-row items-center\"\n : \"flex-col items-start\",\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n );\n}\n\ninterface StepperItemContextValue {\n value: string;\n stepState: StepState | undefined;\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(\n null,\n);\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperItemProps extends DivProps {\n value: string;\n completed?: boolean;\n disabled?: boolean;\n}\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props;\n\n const context = useStepperContext(ITEM_NAME);\n const store = useStoreContext(ITEM_NAME);\n const orientation = context.orientation;\n const value = useStore((state) => state.value);\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled);\n\n return () => {\n store.removeStep(itemValue);\n };\n }, [itemValue, completed, disabled]);\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled);\n }, [itemValue, completed, disabled]);\n\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n \"relative flex not-last:flex-1 items-center\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n );\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props;\n\n const context = useStepperContext(TRIGGER_NAME);\n const itemContext = useStepperItemContext(TRIGGER_NAME);\n const itemValue = itemContext.value;\n\n const store = useStoreContext(TRIGGER_NAME);\n const focusContext = useFocusContext(TRIGGER_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const stepState = useStore((state) => state.steps.get(itemValue));\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n });\n\n const activationMode = context.activationMode;\n const orientation = context.orientation;\n const loop = context.loop;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue);\n\n const stepPosition = stepIndex + 1;\n const stepCount = steps.size;\n\n const triggerId = getId(context.rootId, \"trigger\", itemValue);\n const contentId = getId(context.rootId, \"content\", itemValue);\n const titleId = getId(context.rootId, \"title\", itemValue);\n const descriptionId = getId(context.rootId, \"description\", itemValue);\n\n const isDisabled = disabled || stepState?.disabled || context.disabled;\n const isActive = value === itemValue;\n const isTabStop = focusContext.tabStopId === triggerId;\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const triggerRef = React.useRef<TriggerElement>(null);\n const composedRef = useComposedRefs(ref, triggerRef);\n const isArrowKeyPressedRef = React.useRef(false);\n const isMouseClickRef = React.useRef(false);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true;\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false;\n }\n document.addEventListener(\"keydown\", onKeyDown);\n document.addEventListener(\"keyup\", onKeyUp);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keyup\", onKeyUp);\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n });\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd();\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId);\n if (!isDisabled) {\n focusContext.onFocusableItemRemove();\n }\n };\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled]);\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented) return;\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n },\n [\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n focusContext.onItemFocus(triggerId);\n\n const isKeyboardFocus = !isMouseClickRef.current;\n\n if (\n !isActive &&\n !isDisabled &&\n activationMode !== \"manual\" &&\n !context.nonInteractive &&\n isKeyboardFocus\n ) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n\n isMouseClickRef.current = false;\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (\n handleActivationKeys(\n event,\n context.nonInteractive,\n activationMode,\n isDisabled,\n triggerRef,\n )\n )\n return;\n\n if (event.key === \"Tab\" && event.shiftKey) {\n focusContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== event.currentTarget) return;\n\n const focusIntent = getFocusIntent(event, context.dir, orientation);\n\n if (focusIntent !== undefined) {\n if (hasModifierKey(event)) return;\n event.preventDefault();\n\n const items = focusContext.getItems().filter((item) => !item.disabled);\n const candidateRefs = resolveFocusCandidates(\n items,\n focusIntent,\n event.currentTarget,\n loop,\n );\n\n const didNavigate = await handleValidatedNavigation(\n store,\n candidateRefs,\n items,\n itemValue,\n value,\n steps,\n );\n if (didNavigate) return;\n\n queueMicrotask(() => focusFirst(candidateRefs));\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n isMouseClickRef.current = true;\n\n if (isDisabled) {\n event.preventDefault();\n } else {\n focusContext.onItemFocus(triggerId);\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n );\n\n const TriggerPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? \"step\" : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? \"\" : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full\",\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n );\n}\n\ninterface StepperIndicatorProps extends Omit<DivProps, \"children\"> {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode);\n}\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props;\n\n const context = useStepperContext(INDICATOR_NAME);\n const itemContext = useStepperItemContext(INDICATOR_NAME);\n\n const value = useStore((state) => state.value);\n const itemValue = itemContext.value;\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1;\n\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const IndicatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground\",\n className,\n )}\n >\n {typeof children === \"function\" ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === \"completed\" ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n );\n}\n\ninterface StepperSeparatorProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const {\n className,\n asChild,\n forceMount = false,\n ref,\n ...separatorProps\n } = props;\n\n const context = useStepperContext(SEPARATOR_NAME);\n const itemContext = useStepperItemContext(SEPARATOR_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const orientation = context.orientation;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value);\n\n const isLastStep = stepIndex === steps.size - 1;\n\n if (isLastStep && !forceMount) return null;\n\n const dataState = getDataState(\n value,\n itemContext.value,\n itemContext.stepState,\n steps,\n \"separator\",\n );\n\n const SeparatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n \"bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary\",\n orientation === \"horizontal\" ? \"h-px flex-1\" : \"h-10 w-px\",\n className,\n )}\n />\n );\n}\n\ninterface StepperTitleProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props;\n\n const context = useStepperContext(TITLE_NAME);\n const itemContext = useStepperItemContext(TITLE_NAME);\n\n const titleId = getId(context.rootId, \"title\", itemContext.value);\n\n const TitlePrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn(\"font-medium text-sm\", className)}\n />\n );\n}\n\ninterface StepperDescriptionProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props;\n\n const context = useStepperContext(DESCRIPTION_NAME);\n const itemContext = useStepperItemContext(DESCRIPTION_NAME);\n\n const descriptionId = getId(context.rootId, \"description\", itemContext.value);\n\n const DescriptionPrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn(\"text-muted-foreground text-xs\", className)}\n />\n );\n}\n\ninterface StepperContentProps extends DivProps {\n value: string;\n forceMount?: boolean;\n}\n\nfunction StepperContent(props: StepperContentProps) {\n const {\n value: valueProp,\n asChild,\n forceMount = false,\n ref,\n className,\n ...contentProps\n } = props;\n\n const context = useStepperContext(CONTENT_NAME);\n const value = useStore((state) => state.value);\n\n const contentId = getId(context.rootId, \"content\", valueProp);\n const triggerId = getId(context.rootId, \"trigger\", valueProp);\n\n if (valueProp !== value && !forceMount) return null;\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn(\"flex-1 outline-none\", className)}\n />\n );\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled = disabled || currentIndex <= 0;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const prevIndex = Math.max(currentIndex - 1, 0);\n const prevStepValue = stepKeys[prevIndex];\n\n if (prevStepValue) {\n store.setState(\"value\", prevStepValue);\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const PrevPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <PrevPrimitive\n type=\"button\"\n data-slot=\"stepper-prev\"\n disabled={isDisabled}\n {...prevProps}\n onClick={onClick}\n />\n );\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props;\n\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled =\n disabled || stepKeys.length === 0 || currentIndex >= stepKeys.length - 1;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1);\n const nextStepValue = stepKeys[nextIndex];\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, \"next\");\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const NextPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <NextPrimitive\n type=\"button\"\n data-slot=\"stepper-next\"\n disabled={isDisabled}\n {...nextProps}\n onClick={onClick}\n />\n );\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n};\n","import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n","import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n","/**\n * EntityTable -- generic paginated table driven by JSON Schema + UI Schema.\n *\n * Column definitions are derived from schema.properties via resolveColumns().\n * Domain-specific cell rendering is handled by passing a local renderer\n * registry via the renderers prop; x-ui-cell names in the schema are\n * resolved against the local registry first, then the global registry.\n *\n * Pagination is opt-in. When pagination + onPaginationChange are provided the\n * table runs in manualPagination mode and renders prev/next controls.\n * Sorting is opt-in the same way: with sorting + onSortingChange, the headers of\n * columns marked x-ui-column.sortable become sort controls (manualSorting --\n * the consumer's query does the ordering).\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click on a row calls onRowClick\n * directly (navigation / edit). No keyboard focus management.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, arrow keys navigate rows, Space toggles selection on the\n * focused row, Enter is suppressed. The parent receives selected rows\n * via onSelectionChange.\n *\n * Extractable to @petrarca/sonnet-ui.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n type OnChangeFn,\n type Header,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type Row,\n type ColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { ArrowDown, ArrowUp, ArrowUpDown, ChevronRight } from \"lucide-react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { cn, EMPTY_VALUE, warnLog } from \"@petrarca/sonnet-core\";\nimport { useComponentDefaults } from \"@petrarca/sonnet-core/config\";\nimport { Checkbox } from \"../checkbox\";\nimport type { PageResult } from \"@petrarca/sonnet-core\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"./tableSchema\";\n\nexport type { PageMeta } from \"@petrarca/sonnet-core\";\nexport type { CellRenderer, PageResult, PaginationState, SortingState };\n\n/** How a row's detail (onRowClick) is opened. */\nexport type RowActivation = \"click\" | \"double-click\";\n\n/**\n * How tightly rows are spaced: \"default\", or \"compact\" for dense lists (a file\n * list, a picker in a side panel) -- tighter cells, the same columns and\n * behaviour.\n */\nexport type TableDensity = \"default\" | \"compact\";\n\n// Header and body cell padding at each density, and the line between rows (a\n// compact list reads as one block: no lines).\nconst DENSITY_STYLE: Record<\n TableDensity,\n { head: string; cell: string; row: string }\n> = {\n default: {\n head: \"px-4 py-2.5\",\n cell: \"px-4 py-3\",\n row: \"border-b last:border-b-0\",\n },\n compact: { head: \"px-2 py-1.5\", cell: \"px-2 py-1\", row: \"\" },\n};\n\n/**\n * Progressive loading -- the alternative to page controls for a list one scans:\n * the rows grow as more are loaded. The consumer accumulates the pages (e.g.\n * React Query's useInfiniteQuery) and passes every row loaded so far as\n * `data.data`, the server's total as `data.meta.total`.\n */\nexport interface TableLoadMore {\n /** More rows on the server. */\n hasMore: boolean;\n /** A further page is on its way. */\n isLoading: boolean;\n /** Fetch the next page (the consumer appends it to `data`). */\n onLoadMore: () => void;\n /**\n * Load when the end of the rows scrolls into view (default false) -- in the\n * table's own scroll box with `fill`, else in the page -- instead of on the\n * footer's \"Load more\" button, which then is not shown.\n */\n auto?: boolean;\n}\n\n// The table's density, for the cell sub-components.\nconst DensityContext = createContext<TableDensity>(\"default\");\n\nfunction useDensityStyle(): { head: string; cell: string; row: string } {\n return DENSITY_STYLE[useContext(DensityContext)];\n}\n\n/**\n * Props of EntityTable that can be defaulted app-wide via SonnetConfigProvider.\n * Behavioral, non-data props only.\n */\nexport interface EntityTableConfigurable {\n rowActivation: RowActivation;\n showChevron: boolean;\n}\n\ndeclare module \"@petrarca/sonnet-core\" {\n interface SonnetComponentDefaults {\n EntityTable?: { defaultProps?: Partial<EntityTableConfigurable> };\n }\n}\n\n/** Declarative row action rendered as a button in a trailing \"Actions\" column. */\nexport interface RowAction<TRow> {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n variant?: \"default\" | \"destructive\" | \"ghost\";\n onClick: (row: TRow) => void;\n hidden?: (row: TRow) => boolean;\n disabled?: (row: TRow) => boolean;\n}\n\nconst coreRowModel = getCoreRowModel();\n\nexport interface EntityTableProps<TRow extends RowData> {\n // Column definition via JSON Schema + optional UI Schema overlay.\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n\n // Local cell renderer registry. Checked before the global registry\n // for domain-specific renderers that only apply to this table.\n renderers?: Record<string, CellRenderer>;\n\n // Data\n data: PageResult<TRow> | undefined;\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n\n // Empty state\n entityLabel: string;\n isFiltered?: boolean;\n emptyMessage?: string;\n\n // Row interaction -- opens detail/edit panel.\n onRowClick?: (row: TRow) => void;\n\n /**\n * How onRowClick (open detail) is triggered. Resolved against app-wide\n * config (SonnetConfigProvider) then the built-in default \"click\".\n *\n * \"click\" -- single-click on a row opens detail (default,\n * preserves existing behavior). The chevron is a\n * non-interactive affordance.\n * \"double-click\" -- single-click sets the active row (and fires\n * onActiveRowChange); double-click, or clicking the\n * trailing chevron button, opens detail.\n */\n rowActivation?: RowActivation;\n\n /**\n * Fired when the active (single-selected) row changes. Only meaningful when\n * rowActivation is \"double-click\" and selectionMode is off. null when the\n * active row is cleared.\n */\n onActiveRowChange?: (row: TRow | null) => void;\n\n /**\n * Whether to show the trailing chevron column. Resolved against app-wide\n * config then a built-in default of \"show when onRowClick is set\". In\n * \"double-click\" mode the chevron is an interactive button that opens detail.\n */\n showChevron?: boolean;\n\n /** Row spacing (default \"default\"); \"compact\" for dense lists. */\n density?: TableDensity;\n\n /**\n * Fill the parent's height (default false): the rows scroll inside the\n * table, the header row stays on top and the footer below. The parent gives\n * the height -- e.g. a flex child with `min-h-0`.\n */\n fill?: boolean;\n\n /**\n * Progressive loading instead of pages (opt-in): a \"Load more\" footer, or\n * with `auto` loading when the end is scrolled to. Not with `pagination`.\n */\n loadMore?: TableLoadMore;\n\n /**\n * Render only the rows in view (default false): for long lists -- many\n * pages loaded with `loadMore`, or a large data set at once. Needs `fill`\n * (the table's own scroll box); rows are measured, so wrapping cells work.\n */\n virtualize?: boolean;\n\n // Selection mode (opt-in). When true: checkboxes appear, click toggles\n // selection, pencil/edit gestures are suppressed. When false (default):\n // normal browse/edit behavior with active row and pencil icon.\n selectionMode?: boolean;\n onSelectionChange?: (selectedRows: TRow[]) => void;\n /**\n * Stable identity for a row, used to key the selection.\n *\n * Without it the selection is keyed by row position, so it means \"the rows\n * currently in these slots\" and cannot survive paging or refiltering -- the\n * table clears it whenever `data` changes to keep that safe. Supply this and\n * the selection is keyed by identity instead: it survives a page change, and\n * a bulk action can span pages.\n */\n getRowId?: (row: TRow) => string;\n\n // Server-side pagination (opt-in)\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n\n /**\n * Server-side sorting (opt-in). With both, the header of each sortable column\n * (`x-ui-column.sortable`) is a sort control cycling ascending, descending,\n * unsorted. The table reports the order and never reorders rows itself:\n * forward it to the query (and start again at the first page).\n */\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n\n // Declarative row actions rendered in a trailing \"Actions\" column.\n // Only shown when at least one action is provided.\n rowActions?: RowAction<TRow>[];\n}\n\n// ---------------------------------------------------------------------------\n// Defaults resolver -- moves default-param branches out of EntityTable.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedDefaults {\n isFiltered: boolean;\n selectionMode: boolean;\n density: TableDensity;\n layout: TableLayout;\n /** Rows rendered as they come into view (virtualize, in a fill box). */\n virtual: boolean;\n}\n\nfunction resolveTableDefaults(props: {\n isFiltered?: boolean;\n selectionMode?: boolean;\n density?: TableDensity;\n fill?: boolean;\n virtualize?: boolean;\n}): ResolvedDefaults {\n return {\n isFiltered: props.isFiltered ?? false,\n selectionMode: props.selectionMode ?? false,\n density: props.density ?? \"default\",\n layout: TABLE_LAYOUT[props.fill ? \"fill\" : \"flow\"],\n virtual: Boolean(props.virtualize && props.fill),\n };\n}\n\n// How the table sits in its parent: in the flow of the page (it grows with its\n// rows, the page scrolls), or filling the parent's height (the rows scroll in\n// the bordered box, the header row stays on top -- opaque, so rows pass under\n// it -- and the footer below).\ninterface TableLayout {\n outer: string;\n box: string;\n head: string;\n}\n\nconst TABLE_LAYOUT: Record<\"flow\" | \"fill\", TableLayout> = {\n flow: { outer: \"\", box: \"rounded-lg border\", head: \"\" },\n fill: {\n outer: \"flex h-full min-h-0 flex-col\",\n box: \"min-h-0 flex-1 overflow-auto rounded-lg border\",\n head: \"sticky top-0 z-10 bg-muted\",\n },\n};\n\n// App-wide-configurable behavioral props (rowActivation, showChevron) are\n// resolved here: instance prop > SonnetConfigProvider default > built-in.\nconst ENTITY_TABLE_BUILTIN: EntityTableConfigurable = {\n rowActivation: \"click\",\n showChevron: true,\n};\n\ninterface ResolvedActivation {\n rowActivation: RowActivation;\n // showChevron is only meaningful when onRowClick exists; when explicitly set\n // to false the chevron column is suppressed.\n showChevron: boolean;\n}\n\nfunction useResolvedActivation(props: {\n rowActivation?: RowActivation;\n showChevron?: boolean;\n}): ResolvedActivation {\n const resolved = useComponentDefaults<Record<string, unknown>>(\n \"EntityTable\",\n ENTITY_TABLE_BUILTIN as unknown as Record<string, unknown>,\n {\n rowActivation: props.rowActivation,\n showChevron: props.showChevron,\n } as Record<string, unknown>,\n );\n return {\n rowActivation: resolved.rowActivation as RowActivation,\n showChevron: resolved.showChevron as boolean,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Column builders (unchanged)\n// ---------------------------------------------------------------------------\n\n/** Build TanStack ColumnDef[] from resolved column descriptors. */\nfunction buildColumnDefs<TRow extends RowData>(\n resolved: ResolvedColumn[],\n localRenderers?: Record<string, CellRenderer>,\n): ColumnDef<TRow>[] {\n return resolved.map((col) => {\n const Renderer = resolveCellRenderer(col.cellRenderer, localRenderers);\n const options = col.cellOptions;\n const colDef: ColumnDef<TRow> = {\n id: col.key,\n accessorKey: col.key,\n header: col.label,\n enableSorting: col.sortable,\n cell: ({\n getValue,\n row,\n }: {\n getValue: () => unknown;\n row: Row<TRow>;\n }) => (\n <Renderer\n value={getValue()}\n row={row.original as Record<string, unknown>}\n options={options}\n />\n ),\n };\n if (col.width !== undefined) colDef.size = col.width;\n if (col.minWidth !== undefined) {\n colDef.minSize = col.minWidth;\n // TanStack gives every column a default minSize, so the resolved\n // columnDef cannot tell an authored floor from the framework's. Carry\n // the schema's intent separately for the header to read.\n colDef.meta = { ...colDef.meta, minWidth: col.minWidth };\n }\n return colDef;\n });\n}\n\n/** Checkbox column prepended when row selection is enabled. */\nfunction buildSelectColumn<TRow extends RowData>(): ColumnDef<TRow> {\n return {\n id: \"_select\",\n size: 40,\n enableSorting: false,\n header: ({ table: t }) => (\n <Checkbox\n checked={\n t.getIsAllPageRowsSelected() ||\n (t.getIsSomePageRowsSelected() ? \"indeterminate\" : false)\n }\n onCheckedChange={(value) => t.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Select row\"\n />\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Build TanStack table options -- isolates the conditional spreads.\n// ---------------------------------------------------------------------------\n\nfunction buildTableOptions<TRow extends RowData>(opts: {\n dataRows: TRow[];\n columns: ColumnDef<TRow>[];\n tableState: Record<string, unknown>;\n selectionMode: boolean;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n onPaginationChange: OnChangeFn<PaginationState> | undefined;\n isSortable: boolean;\n onSortingChange: OnChangeFn<SortingState> | undefined;\n getRowId: ((row: TRow) => string) | undefined;\n}) {\n const base = {\n data: opts.dataRows,\n columns: opts.columns,\n getCoreRowModel: coreRowModel,\n state: opts.tableState,\n };\n\n const selectionOpts = opts.selectionMode\n ? { enableRowSelection: true, onRowSelectionChange: opts.setRowSelection }\n : {};\n\n // TanStack keys row selection by whatever getRowId returns, defaulting to the\n // row index. Supplying one makes the selection identity-based.\n const rowIdOpts = opts.getRowId\n ? { getRowId: (row: TRow) => opts.getRowId!(row) }\n : {};\n\n const paginationOpts = opts.isPaginated\n ? {\n manualPagination: true,\n rowCount: opts.data?.meta.total ?? 0,\n onPaginationChange: opts.onPaginationChange,\n }\n : {};\n\n // Manual: the consumer's query orders the data; one column at a time.\n const sortingOpts = opts.isSortable\n ? {\n manualSorting: true,\n enableMultiSort: false,\n onSortingChange: opts.onSortingChange,\n }\n : { enableSorting: false };\n\n return {\n ...base,\n ...selectionOpts,\n ...paginationOpts,\n ...sortingOpts,\n ...rowIdOpts,\n };\n}\n\n// ---------------------------------------------------------------------------\n// useEntityTableState -- all hooks, effects, and table instance.\n// ---------------------------------------------------------------------------\n\ninterface EntityTableState<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n dataRows: TRow[];\n isPaginated: boolean;\n rowSelection: RowSelectionState;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n activeRowIndex: number;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n columns: ColumnDef<TRow>[];\n}\n\nfunction useEntityTableState<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n selectionMode: boolean,\n): EntityTableState<TRow> {\n const {\n schema,\n uiSchema,\n renderers,\n data,\n pagination,\n onPaginationChange,\n sorting,\n onSortingChange,\n onSelectionChange,\n getRowId,\n } = props;\n\n const isPaginated = !!(pagination && onPaginationChange);\n const isSortable = !!(sorting && onSortingChange);\n\n const dataRows = useMemo(() => data?.data ?? [], [data]);\n\n // Clamp pageIndex when total drops below current page after a deletion.\n const total = data?.meta.total;\n const pageIndex = pagination?.pageIndex ?? 0;\n const pageSize = pagination?.pageSize ?? 1;\n useEffect(() => {\n if (!isPaginated || total == null || !onPaginationChange) return;\n const maxPage = Math.max(0, Math.ceil(total / pageSize) - 1);\n if (pageIndex > maxPage) {\n onPaginationChange((prev) => ({ ...prev, pageIndex: maxPage }));\n }\n }, [total, isPaginated, pageIndex, pageSize, onPaginationChange]);\n\n // Row selection state. Without getRowId the selection is keyed by row\n // position, so it silently refers to different records once the rows change;\n // clearing it on every data change is what keeps that safe. With a stable id\n // the keys mean something across pages, so the selection is kept.\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const keyedById = !!getRowId;\n useEffect(() => {\n if (keyedById) return;\n setRowSelection({});\n }, [data, keyedById]);\n\n // Active row index for keyboard navigation.\n const [activeRowIndex, setActiveRowIndex] = useState<number>(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const dataColumns = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return buildColumnDefs<TRow>(resolveColumns(schema, uiSchema), renderers);\n }, [schema, uiSchema, renderers]);\n\n const selectColumn = useMemo(\n () => (selectionMode ? buildSelectColumn<TRow>() : null),\n [selectionMode],\n );\n\n const columns = useMemo<ColumnDef<TRow>[]>(\n () => (selectColumn ? [selectColumn, ...dataColumns] : dataColumns),\n [selectColumn, dataColumns],\n );\n\n // Notify parent when selection changes.\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n useEffect(() => {\n if (!selectionMode || !onSelectionChangeRef.current) return;\n const keys = Object.keys(rowSelection).filter((k) => rowSelection[k]);\n // Keys are ids when getRowId is supplied, row indices otherwise. Either\n // way only rows on the current page can be resolved to objects; a\n // selection spanning pages reports the ones currently loaded.\n const selected = getRowId\n ? dataRows.filter((row) => keys.includes(getRowId(row)))\n : keys\n .map(Number)\n .map((i) => dataRows[i])\n .filter((r): r is TRow => r !== undefined);\n onSelectionChangeRef.current(selected);\n }, [rowSelection, selectionMode, dataRows, getRowId]);\n\n // Build a single unified state object to avoid conditional spread merging.\n const tableState = useMemo(\n () => ({\n ...(isPaginated ? { pagination } : {}),\n ...(isSortable ? { sorting } : {}),\n ...(selectionMode ? { rowSelection } : {}),\n }),\n [isPaginated, pagination, isSortable, sorting, selectionMode, rowSelection],\n );\n\n const tableOptions = buildTableOptions({\n dataRows,\n columns,\n tableState,\n selectionMode,\n setRowSelection,\n isPaginated,\n data,\n onPaginationChange,\n isSortable,\n onSortingChange,\n getRowId,\n });\n\n const table = useReactTable<TRow>(tableOptions);\n\n // Scroll active row into view (virtual rows do it through the virtualizer).\n const virtual = Boolean(props.virtualize && props.fill);\n useEffect(() => {\n if (virtual || activeRowIndex < 0 || !containerRef.current) return;\n const rows = containerRef.current.querySelectorAll(\"tbody tr\");\n rows[activeRowIndex]?.scrollIntoView({ block: \"nearest\" });\n }, [activeRowIndex, virtual]);\n\n return {\n table,\n dataRows,\n isPaginated,\n rowSelection,\n setRowSelection,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n };\n}\n\n// ---------------------------------------------------------------------------\n// useActiveRowEvent -- single-active-row activation + neutral change event.\n// ---------------------------------------------------------------------------\n\n/**\n * In single-active-row mode (rowActivation \"double-click\", not selectionMode),\n * returns a handler that sets the active row, and fires the neutral\n * onActiveRowChange whenever the active row changes -- independent of whether\n * the change came from a click, keyboard, or data update. In all other modes\n * the returned handler only moves the active index and no event fires.\n */\nfunction useActiveRowEvent<TRow extends RowData>(args: {\n selectionMode: boolean;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n onActiveRowChange: ((row: TRow | null) => void) | undefined;\n activeRowIndex: number;\n dataRows: TRow[];\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n}): (index: number) => void {\n const {\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n } = args;\n\n const singleActiveMode =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n\n const onChangeRef = useRef(onActiveRowChange);\n onChangeRef.current = onActiveRowChange;\n\n useEffect(() => {\n if (!singleActiveMode) return;\n const row = activeRowIndex >= 0 ? (dataRows[activeRowIndex] ?? null) : null;\n onChangeRef.current?.(row);\n }, [singleActiveMode, activeRowIndex, dataRows]);\n\n return useCallback(\n (index: number) => setActiveRowIndex(index),\n [setActiveRowIndex],\n );\n}\n\n// ---------------------------------------------------------------------------\n// useTableKeyboard -- keyboard navigation handler.\n// ---------------------------------------------------------------------------\n\nfunction useTableKeyboard<TRow extends RowData>(\n table: ReturnType<typeof useReactTable<TRow>>,\n activeRowIndex: number,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n return useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const tableRows = table.getRowModel().rows;\n if (tableRows.length === 0) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.min(prev + 1, tableRows.length - 1));\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.max(prev - 1, 0));\n break;\n }\n case \"Enter\": {\n handleEnterKey(\n e,\n tableRows,\n selectionMode,\n activeRowIndex,\n onRowClick,\n );\n break;\n }\n case \" \": {\n handleSpaceKey(e, tableRows, selectionMode, activeRowIndex);\n break;\n }\n }\n },\n [activeRowIndex, onRowClick, selectionMode, table, setActiveRowIndex],\n );\n}\n\n// The header's sort state for assistive technology; none when not sortable.\nfunction ariaSort<TRow extends RowData>(\n header: Header<TRow, unknown>,\n): \"ascending\" | \"descending\" | \"none\" | undefined {\n if (!header.column.getCanSort()) return undefined;\n const dir = header.column.getIsSorted();\n if (dir === \"asc\") return \"ascending\";\n if (dir === \"desc\") return \"descending\";\n return \"none\";\n}\n\nconst SORT_ICON = { asc: ArrowUp, desc: ArrowDown, none: ArrowUpDown };\n\n// A header's label; a sort control when its column can sort.\nfunction HeaderLabel<TRow extends RowData>({\n header,\n}: {\n header: Header<TRow, unknown>;\n}): React.ReactElement {\n const label = flexRender(header.column.columnDef.header, header.getContext());\n if (!header.column.getCanSort()) return <>{label}</>;\n const dir = header.column.getIsSorted();\n const Icon = SORT_ICON[dir || \"none\"];\n return (\n <button\n type=\"button\"\n onClick={header.column.getToggleSortingHandler()}\n className=\"inline-flex items-center gap-1 hover:text-foreground/80\"\n >\n {label}\n <Icon\n aria-hidden\n className={cn(\"h-3.5 w-3.5\", !dir && \"text-muted-foreground\")}\n />\n </button>\n );\n}\n\n/**\n * Width style for a header cell. `x-ui-column.width` becomes an exact width and\n * `minWidth` a floor; a column may set either, both, or neither. The floor is\n * read from `meta`, not `minSize`, because TanStack defaults `minSize` on every\n * column and the two are indistinguishable there.\n */\nfunction headerWidthStyle(columnDef: {\n size?: number;\n meta?: { minWidth?: number };\n}): React.CSSProperties | undefined {\n const size = columnDef.size;\n const minWidth = columnDef.meta?.minWidth;\n if (size === undefined && minWidth === undefined) return undefined;\n return {\n ...(size !== undefined && { width: size }),\n ...(minWidth !== undefined && { minWidth }),\n };\n}\n\nfunction handleEnterKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n e.preventDefault();\n if (selectionMode || activeRowIndex < 0 || !onRowClick) return;\n const activeRow = tableRows[activeRowIndex];\n if (activeRow) onRowClick(activeRow.original);\n}\n\nfunction handleSpaceKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n) {\n if (!selectionMode || activeRowIndex < 0) return;\n e.preventDefault();\n tableRows[activeRowIndex]?.toggleSelected();\n}\n\n// ---------------------------------------------------------------------------\n// Trailing-column flags\n// ---------------------------------------------------------------------------\n\ninterface TrailingColFlags {\n hasRowActions: boolean;\n hasChevron: boolean;\n hasTrailingCol: boolean;\n}\n\n/**\n * Whether the table is keyboard-operable, and so needs a tab stop and a key\n * handler. Selection mode uses Space to select; a row-click table uses Enter to\n * open. Gating on selection mode alone left every browse-mode table unreachable\n * by keyboard -- not even focusable -- although the Enter handler exists for it.\n * A table with neither is a static grid and stays out of the tab order.\n */\nfunction isKeyboardOperable<TRow>(\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): boolean {\n return selectionMode || !!onRowClick;\n}\n\nfunction resolveTrailingCols<TRow>(\n rowActions: RowAction<TRow>[] | undefined,\n onRowClick: ((row: TRow) => void) | undefined,\n selectionMode: boolean,\n showChevron: boolean,\n): TrailingColFlags {\n const hasRowActions = !!(rowActions && rowActions.length > 0);\n const hasChevron = !!(\n onRowClick &&\n showChevron &&\n !selectionMode &&\n !hasRowActions\n );\n return {\n hasRowActions,\n hasChevron,\n hasTrailingCol: hasRowActions || hasChevron,\n };\n}\n\n// ---------------------------------------------------------------------------\n// StatusRows sub-component\n// ---------------------------------------------------------------------------\n\ninterface StatusRowsProps {\n isLoading: boolean;\n isError: boolean;\n errorMessage: string | undefined;\n entityLabel: string;\n isFiltered: boolean;\n emptyMessage: string | undefined;\n isEmpty: boolean;\n colCount: number;\n}\n\nfunction StatusRows({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n isFiltered,\n emptyMessage,\n isEmpty,\n colCount,\n}: StatusRowsProps): React.ReactElement | null {\n if (isLoading) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n Loading...\n </td>\n </tr>\n );\n }\n if (isError) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-destructive\"\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </td>\n </tr>\n );\n }\n if (isEmpty) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {resolveEmptyMessage(emptyMessage, isFiltered, entityLabel)}\n </td>\n </tr>\n );\n }\n return null;\n}\n\nfunction resolveEmptyMessage(\n emptyMessage: string | undefined,\n isFiltered: boolean,\n entityLabel: string,\n): string {\n if (emptyMessage) return emptyMessage;\n if (isFiltered) return `No ${entityLabel} match your search.`;\n return `No ${entityLabel} yet.`;\n}\n\n// ---------------------------------------------------------------------------\n// RowActionCell sub-component\n// ---------------------------------------------------------------------------\n\ninterface RowActionCellProps<TRow> {\n actions: RowAction<TRow>[];\n rowOriginal: TRow;\n}\n\nfunction RowActionCell<TRow>({\n actions,\n rowOriginal,\n}: RowActionCellProps<TRow>): React.ReactElement {\n return (\n <td className={cn(useDensityStyle().cell, \"w-24 text-right\")}>\n <div className=\"flex items-center justify-end gap-1\">\n {actions.map((action) => (\n <ActionButton\n key={action.label}\n action={action}\n rowOriginal={rowOriginal}\n />\n ))}\n </div>\n </td>\n );\n}\n\ninterface ActionButtonProps<TRow> {\n action: RowAction<TRow>;\n rowOriginal: TRow;\n}\n\nfunction ActionButton<TRow>({\n action,\n rowOriginal,\n}: ActionButtonProps<TRow>): React.ReactElement | null {\n const isHidden = action.hidden?.(rowOriginal);\n if (isHidden) return null;\n const isDisabled = action.disabled?.(rowOriginal);\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n title={action.label}\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick(rowOriginal);\n }}\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n action.variant === \"destructive\"\n ? \"text-destructive hover:bg-destructive/10\"\n : \"text-muted-foreground hover:bg-accent\",\n isDisabled\n ? \"opacity-30 cursor-not-allowed group-hover/row:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\",\n )}\n >\n {Icon ? (\n <Icon className=\"h-3.5 w-3.5\" />\n ) : (\n <span className=\"text-xs\">{action.label}</span>\n )}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DataRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface DataRowProps<TRow extends RowData> {\n row: Row<TRow>;\n index: number;\n selectionMode: boolean;\n rowActivation: RowActivation;\n activeRowIndex: number;\n onRowClick: ((row: TRow) => void) | undefined;\n onActivateRow: (index: number) => void;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n hasRowActions: boolean;\n hasChevron: boolean;\n rowActions: RowAction<TRow>[] | undefined;\n /** Virtual rows: measures the rendered row (its height may differ from the estimate). */\n measureRef?: (el: HTMLTableRowElement | null) => void;\n}\n\n// Trailing chevron cell. Decorative in \"click\" mode; an interactive\n// \"open detail\" button in \"double-click\" mode (single-click selects instead).\nfunction ChevronCell<TRow>({\n rowOriginal,\n rowActivation,\n onRowClick,\n}: {\n rowOriginal: TRow;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n}): React.ReactElement {\n const asButton = rowActivation === \"double-click\" && !!onRowClick;\n return (\n <td className={cn(useDensityStyle().cell, \"w-10\")}>\n {asButton ? (\n <button\n type=\"button\"\n title=\"Open\"\n onClick={(e) => {\n e.stopPropagation();\n onRowClick!(rowOriginal);\n }}\n className=\"inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </td>\n );\n}\n\nfunction rowClassName<TRow extends RowData>(\n row: Row<TRow>,\n isActive: boolean,\n selectionMode: boolean,\n singleClickSelects: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n separator: string,\n): string {\n return cn(\n separator,\n \"transition-colors group/row\",\n onRowClick && !selectionMode && \"hover:bg-accent/50 cursor-pointer\",\n selectionMode && \"cursor-default\",\n row.getIsSelected() && \"bg-primary/10\",\n isActive && selectionMode && \"bg-accent\",\n isActive && singleClickSelects && \"bg-primary/10\",\n );\n}\n\nfunction DataRow<TRow extends RowData>({\n row,\n index,\n selectionMode,\n rowActivation,\n activeRowIndex,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n measureRef,\n}: DataRowProps<TRow>): React.ReactElement {\n const density = useDensityStyle();\n // In double-click mode a single click selects (sets active row); detail is\n // opened by double-click or the chevron button. In click mode a single click\n // opens detail directly (existing behavior).\n const singleClickSelects =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n const isActive = index === activeRowIndex;\n return (\n <tr\n key={row.id}\n ref={measureRef}\n data-index={index}\n onClick={() => {\n handleRowClick(\n row,\n index,\n selectionMode,\n rowActivation,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n );\n }}\n onDoubleClick={() => {\n if (singleClickSelects && onRowClick) onRowClick(row.original);\n }}\n className={rowClassName(\n row,\n isActive,\n selectionMode,\n singleClickSelects,\n onRowClick,\n density.row,\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className={density.cell}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n {hasRowActions && (\n <RowActionCell actions={rowActions!} rowOriginal={row.original} />\n )}\n {hasChevron && (\n <ChevronCell\n rowOriginal={row.original}\n rowActivation={rowActivation}\n onRowClick={onRowClick}\n />\n )}\n </tr>\n );\n}\n\nfunction handleRowClick<TRow extends RowData>(\n row: Row<TRow>,\n index: number,\n selectionMode: boolean,\n rowActivation: RowActivation,\n onRowClick: ((row: TRow) => void) | undefined,\n onActivateRow: (index: number) => void,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n containerRef: React.RefObject<HTMLDivElement | null>,\n): void {\n if (selectionMode) {\n row.toggleSelected();\n setActiveRowIndex(index);\n containerRef.current?.focus();\n return;\n }\n if (rowActivation === \"double-click\" && onRowClick) {\n // Single click selects the active row; detail opens on double-click.\n onActivateRow(index);\n return;\n }\n if (onRowClick) onRowClick(row.original);\n}\n\n// ---------------------------------------------------------------------------\n// TableFooter sub-component\n// ---------------------------------------------------------------------------\n\ninterface TableFooterProps<TRow extends RowData> {\n isPaginated: boolean;\n loadMore: TableLoadMore | undefined;\n data: PageResult<TRow> | undefined;\n dataRows: TRow[];\n entityLabel: string;\n table: ReturnType<typeof useReactTable<TRow>>;\n}\n\nfunction TableFooter<TRow extends RowData>({\n isPaginated,\n loadMore,\n data,\n dataRows,\n entityLabel,\n table,\n}: TableFooterProps<TRow>): React.ReactElement | null {\n if (!data?.meta) return null;\n if (loadMore) {\n return (\n <LoadMoreFooter\n shown={dataRows.length}\n total={data.meta.total}\n entityLabel={entityLabel}\n loadMore={loadMore}\n />\n );\n }\n if (isPaginated) {\n return <PaginationFooter table={table} entityLabel={entityLabel} />;\n }\n return (\n <p className=\"text-xs text-muted-foreground mt-3\">\n Showing {dataRows.length} of {data.meta.total} {entityLabel}\n </p>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Body rows: all of them, or the ones in view (virtual)\n// ---------------------------------------------------------------------------\n\n// What every row of a table shares.\ntype SharedRowProps<TRow extends RowData> = Omit<\n DataRowProps<TRow>,\n \"row\" | \"index\" | \"measureRef\"\n>;\n\ninterface TableRowsProps<TRow extends RowData> {\n rows: Row<TRow>[];\n virtual: boolean;\n scrollRef: React.RefObject<HTMLDivElement | null>;\n colCount: number;\n shared: SharedRowProps<TRow>;\n}\n\nfunction TableRows<TRow extends RowData>(\n props: TableRowsProps<TRow>,\n): React.ReactElement {\n if (props.virtual) return <VirtualRows {...props} />;\n return (\n <>\n {props.rows.map((row, index) => (\n <DataRow key={row.id} row={row} index={index} {...props.shared} />\n ))}\n </>\n );\n}\n\n// A row's height before it is measured, by density.\nconst ROW_ESTIMATE: Record<TableDensity, number> = { default: 45, compact: 29 };\n\n// The rows in view (and a few around them) between two spacer rows that keep\n// the scroll height of all of them. The active row is scrolled to by index:\n// out of view it is not in the DOM.\nfunction VirtualRows<TRow extends RowData>({\n rows,\n scrollRef,\n colCount,\n shared,\n}: TableRowsProps<TRow>): React.ReactElement {\n const density = useContext(DensityContext);\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_ESTIMATE[density],\n overscan: 12,\n });\n const { activeRowIndex } = shared;\n useEffect(() => {\n if (activeRowIndex >= 0) virtualizer.scrollToIndex(activeRowIndex);\n }, [activeRowIndex, virtualizer]);\n const items = virtualizer.getVirtualItems();\n const top = items[0]?.start ?? 0;\n const bottom = virtualizer.getTotalSize() - (items.at(-1)?.end ?? 0);\n return (\n <>\n <SpacerRow height={top} colCount={colCount} />\n {items.map((item) => (\n <DataRow\n key={rows[item.index].id}\n row={rows[item.index]}\n index={item.index}\n measureRef={virtualizer.measureElement}\n {...shared}\n />\n ))}\n <SpacerRow height={bottom} colCount={colCount} />\n </>\n );\n}\n\nfunction SpacerRow({\n height,\n colCount,\n}: {\n height: number;\n colCount: number;\n}): React.ReactElement | null {\n if (height <= 0) return null;\n return (\n <tr aria-hidden=\"true\" style={{ height }}>\n <td colSpan={colCount} />\n </tr>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Progressive loading: the footer and the end-of-rows marker\n// ---------------------------------------------------------------------------\n\nfunction LoadMoreFooter({\n shown,\n total,\n entityLabel,\n loadMore,\n}: {\n shown: number;\n total: number;\n entityLabel: string;\n loadMore: TableLoadMore;\n}): React.ReactElement {\n return (\n <div className=\"flex items-center justify-between mt-3\">\n <p className=\"text-xs text-muted-foreground\">\n {shown} of {total} {entityLabel}\n </p>\n <LoadMoreAction loadMore={loadMore} />\n </div>\n );\n}\n\n// Explicit loading: a button. Loading on scroll needs none -- every way to the\n// end (scrolling, moving the active row) loads -- so it only says it is loading.\nfunction LoadMoreAction({\n loadMore,\n}: {\n loadMore: TableLoadMore;\n}): React.ReactElement | null {\n const { hasMore, isLoading, onLoadMore, auto } = loadMore;\n if (auto) {\n return isLoading ? (\n <span className=\"text-xs text-muted-foreground\">Loading more...</span>\n ) : null;\n }\n if (!hasMore) return null;\n return (\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n {isLoading ? \"Loading...\" : \"Load more\"}\n </button>\n );\n}\n\n// After the last row: loads the next page when it scrolls into view -- in the\n// table's scroll box (fill), else in the page. Ahead by a margin, so the rows\n// are there by the time one gets to the end. Another list (another order or\n// filter: another first row) starts at the top of the box, not at its end.\nfunction LoadMoreSentinel({\n loadMore,\n inScrollBox,\n listKey,\n}: {\n loadMore: TableLoadMore;\n inScrollBox: boolean;\n listKey: string | undefined;\n}): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const { hasMore, isLoading, onLoadMore } = loadMore;\n useEffect(() => {\n const box = inScrollBox ? ref.current?.parentElement : null;\n if (box) box.scrollTop = 0;\n }, [listKey, inScrollBox]);\n useEffect(() => {\n const el = ref.current;\n if (\n !el ||\n !hasMore ||\n isLoading ||\n typeof IntersectionObserver === \"undefined\"\n )\n return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) onLoadMore();\n },\n { root: inScrollBox ? el.parentElement : null, rootMargin: \"200px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasMore, isLoading, onLoadMore, inScrollBox]);\n return <div ref={ref} aria-hidden=\"true\" className=\"h-px\" />;\n}\n\n// The end-of-rows marker, when the table loads on scroll.\nfunction endOfRowsMarker<TRow>(\n loadMore: TableLoadMore | undefined,\n fill: boolean | undefined,\n firstRow: TRow | undefined,\n getRowId: ((row: TRow) => string) | undefined,\n): React.ReactNode {\n if (!loadMore?.auto) return null;\n const listKey = firstRow && getRowId ? getRowId(firstRow) : undefined;\n return (\n <LoadMoreSentinel\n loadMore={loadMore}\n inScrollBox={Boolean(fill)}\n listKey={listKey}\n />\n );\n}\n\n// Options that do not go together: pages and progressive loading are two ways\n// to the same rows; virtual rows need the table's own scroll box (fill).\nfunction useOptionWarnings(props: {\n pagination?: unknown;\n loadMore?: unknown;\n virtualize?: boolean;\n fill?: boolean;\n}): void {\n const bothPagings = Boolean(props.pagination && props.loadMore);\n const virtualWithoutBox = Boolean(props.virtualize && !props.fill);\n useEffect(() => {\n if (bothPagings)\n warnLog(\n \"EntityTable: pass pagination or loadMore, not both -- loadMore is used.\",\n );\n if (virtualWithoutBox)\n warnLog(\n \"EntityTable: virtualize needs fill (a scroll box of its own) -- all rows are rendered.\",\n );\n }, [bothPagings, virtualWithoutBox]);\n}\n\n// ---------------------------------------------------------------------------\n// EntityTable -- main component\n// ---------------------------------------------------------------------------\n\nexport function EntityTable<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n): React.ReactElement {\n const {\n data,\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n onRowClick,\n onActiveRowChange,\n rowActions,\n } = props;\n\n const { isFiltered, selectionMode, density, layout, virtual } =\n resolveTableDefaults(props);\n useOptionWarnings(props);\n const headCell = cn(DENSITY_STYLE[density].head, layout.head);\n const { rowActivation, showChevron } = useResolvedActivation(props);\n\n const {\n table,\n dataRows,\n isPaginated,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n } = useEntityTableState(props, selectionMode);\n\n const handleKeyDown = useTableKeyboard(\n table,\n activeRowIndex,\n setActiveRowIndex,\n selectionMode,\n onRowClick,\n );\n\n const handleActivateRow = useActiveRowEvent({\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n });\n\n const { hasRowActions, hasChevron, hasTrailingCol } = resolveTrailingCols(\n rowActions,\n onRowClick,\n selectionMode,\n showChevron,\n );\n\n const colCount = columns.length + (hasTrailingCol ? 1 : 0);\n\n const isInteractive = isKeyboardOperable(selectionMode, onRowClick);\n\n return (\n <DensityContext.Provider value={density}>\n <div className={layout.outer}>\n <div\n ref={containerRef}\n tabIndex={isInteractive ? 0 : undefined}\n onKeyDown={isInteractive ? handleKeyDown : undefined}\n className={cn(layout.box, isInteractive && \"outline-none\")}\n >\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/40\">\n {table.getFlatHeaders().map((header) => (\n <th\n key={header.id}\n aria-sort={ariaSort(header)}\n className={cn(\n \"text-left text-xs font-medium text-foreground\",\n headCell,\n )}\n style={headerWidthStyle(header.column.columnDef)}\n >\n {header.isPlaceholder ? null : (\n <HeaderLabel header={header} />\n )}\n </th>\n ))}\n {hasRowActions && (\n <th\n aria-label=\"Actions\"\n scope=\"col\"\n className={cn(\n \"w-24 text-right text-xs font-medium text-foreground\",\n headCell,\n )}\n />\n )}\n {hasChevron && (\n <th\n aria-label=\"Open\"\n scope=\"col\"\n className={cn(\"w-10\", layout.head)}\n />\n )}\n </tr>\n </thead>\n <tbody>\n <StatusRows\n isLoading={isLoading}\n isError={isError}\n errorMessage={errorMessage}\n entityLabel={entityLabel}\n isFiltered={isFiltered}\n emptyMessage={props.emptyMessage}\n isEmpty={!isLoading && !isError && dataRows.length === 0}\n colCount={colCount}\n />\n <TableRows\n rows={table.getRowModel().rows}\n virtual={virtual}\n scrollRef={containerRef}\n colCount={colCount}\n shared={{\n selectionMode,\n rowActivation,\n activeRowIndex,\n onRowClick,\n onActivateRow: handleActivateRow,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n }}\n />\n </tbody>\n </table>\n {endOfRowsMarker(\n props.loadMore,\n props.fill,\n dataRows[0],\n props.getRowId,\n )}\n </div>\n\n <TableFooter\n isPaginated={isPaginated}\n loadMore={props.loadMore}\n data={data}\n dataRows={dataRows}\n entityLabel={entityLabel}\n table={table}\n />\n </div>\n </DensityContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PaginationFooter (unchanged)\n// ---------------------------------------------------------------------------\n\ninterface PaginationFooterProps<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n entityLabel: string;\n}\n\nfunction PaginationFooter<TRow extends RowData>({\n table,\n entityLabel,\n}: PaginationFooterProps<TRow>): React.ReactElement {\n const { pageIndex, pageSize } = table.getState().pagination;\n const rowCount = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = rowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min((pageIndex + 1) * pageSize, rowCount);\n\n return (\n <div className=\"flex items-center justify-between mt-3\">\n <p className=\"text-xs text-muted-foreground\">\n {rowCount === 0\n ? `No ${entityLabel}`\n : `Showing ${from}\\u2013${to} of ${rowCount} ${entityLabel}`}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Previous\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {pageCount > 0 ? `${pageIndex + 1} / ${pageCount}` : EMPTY_VALUE}\n </span>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Merge base schema x-ui-column/x-ui-cell annotations with UI schema overrides.\n *\n * UI schema wins on all conflicts. x-ui-column and x-ui-cell-options are\n * shallow-merged so the UI schema can override individual keys (e.g. just width)\n * without repeating the full config.\n *\n * The merge is add-and-replace only: an overlay may set a key or change its\n * value, but cannot REMOVE a key the base schema set. Writing `null`\n * (e.g. `x-ui-cell-options: { colors: null }`) does not clear an inherited\n * option -- it stores `null`. Clearing an inherited option is deliberately not a\n * capability; if a renderer needs an explicit \"off\", model it as a real value\n * that renderer understands, not as a delete sentinel.\n *\n * Extractable to @petrarca/sonnet-core -- no React, no DOM.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { TableUiSchema } from \"./types\";\n\nexport interface MergedColumnConfig {\n order?: number;\n hidden: boolean;\n width?: number;\n minWidth?: number;\n sortable: boolean;\n label?: string;\n cellRenderer?: string;\n cellOptions: Record<string, unknown>;\n}\n\n/**\n * Merge x-ui-column, x-ui-cell, and x-ui-cell-options from the base property\n * and the UI schema entry for a single field. UI schema wins on all conflicts.\n */\n// Resolve the cell renderer name from schema and UI schema (UI wins).\nfunction resolveCellRenderer(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): string | undefined {\n return uiEntry?.[\"x-ui-cell\"] ?? property[\"x-ui-cell\"];\n}\n\n// Merge cell options from schema and UI schema (UI wins on conflicts). Add and\n// replace only -- see the module docblock; `null` does not clear a base key.\nfunction resolveCellOptions(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): Record<string, unknown> {\n return {\n ...(property[\"x-ui-cell-options\"] ?? {}),\n ...(uiEntry?.[\"x-ui-cell-options\"] ?? {}),\n };\n}\n\nexport function mergeColumnConfig(\n key: string,\n property: JsonSchemaProperty,\n uiSchema?: TableUiSchema,\n): MergedColumnConfig {\n const uiEntry = uiSchema?.[key];\n const merged = {\n ...(property[\"x-ui-column\"] ?? {}),\n ...(uiEntry?.[\"x-ui-column\"] ?? {}),\n };\n\n return {\n order: merged.order,\n hidden: merged.hidden ?? false,\n width: merged.width,\n minWidth: merged.minWidth,\n sortable: merged.sortable ?? false,\n label: merged.label,\n cellRenderer: resolveCellRenderer(property, uiEntry),\n cellOptions: resolveCellOptions(property, uiEntry),\n };\n}\n","/**\n * Cell renderer registry, resolution helpers, and the createRenderer factory.\n *\n * Separate from cellRenderers.tsx so that non-component exports\n * (registry object, pure functions, factory) do not violate react-refresh\n * rules.\n *\n * Extractable to @petrarca/sonnet-core (pure logic) /\n * @petrarca/sonnet-ui (registry with React components).\n */\n\nimport React from \"react\";\nimport { warnLog } from \"@petrarca/sonnet-core\";\nimport {\n TextCell,\n MutedCell,\n BoldCell,\n CodeCell,\n BadgeCell,\n ConditionalBadgeCell,\n DateCell,\n DateTimeCell,\n BooleanCell,\n NumberCell,\n TruncateCell,\n OverflowListCell,\n JoinCell,\n BadgesCell,\n CodingCell,\n type CellRenderer,\n type CellRendererProps,\n} from \"./cellRenderers\";\n\nexport type { CellRenderer };\n\n/** Registry mapping renderer names to components. */\nexport const CELL_RENDERERS: Record<string, CellRenderer> = {\n text: TextCell,\n muted: MutedCell,\n bold: BoldCell,\n code: CodeCell,\n badge: BadgeCell,\n \"badge-when\": ConditionalBadgeCell,\n date: DateCell,\n datetime: DateTimeCell,\n boolean: BooleanCell,\n number: NumberCell,\n truncate: TruncateCell,\n \"overflow-list\": OverflowListCell,\n join: JoinCell,\n badges: BadgesCell,\n coding: CodingCell,\n};\n\n// The one type a property has: its type, or the non-null one of a nullable's list.\nfunction singleType(types: string | string[] | undefined): string | undefined {\n if (!Array.isArray(types)) return types;\n const others = types.filter((t) => t !== \"null\");\n return others.length === 1 ? others[0] : undefined;\n}\n\n/**\n * Infer a default renderer name from a property's type and format.\n * Used when no explicit x-ui-cell is set. A nullable property's type list\n * (`[\"string\", \"null\"]`) infers from its one other type.\n */\nexport function inferCellRenderer(\n types: string | string[] | undefined,\n format: string | undefined,\n): string {\n const type = singleType(types);\n if (type === \"boolean\") return \"boolean\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"string\") {\n if (format === \"date-time\") return \"datetime\";\n if (format === \"date\") return \"date\";\n }\n return \"text\";\n}\n\n/**\n * Resolve a cell renderer by name.\n * Checks the optional local registry first, then the global registry,\n * then falls back to TextCell.\n */\nexport function resolveCellRenderer(\n name: string,\n localRenderers?: Record<string, CellRenderer>,\n): CellRenderer {\n return localRenderers?.[name] ?? CELL_RENDERERS[name] ?? TextCell;\n}\n\n/**\n * Factory for creating typed local cell renderers.\n *\n * Local renderer names must start with `x-` to distinguish them from\n * built-in renderers (e.g. `x-audit-actors`, `x-trade-risk`). This\n * follows the same convention as the `x-ui-*` schema extensions.\n * Built-in names like `badge`, `datetime`, `muted` stay clean and\n * unprefixed. A dev-mode warning is logged if the convention is violated.\n *\n * The render function receives the full typed row and the x-ui-cell-options\n * from the schema. This keeps the schema purely declarative (no functions)\n * while giving domain-specific renderers full type safety.\n *\n * For generic table viewers where the row type is not known, omit the\n * type parameter -- TRow defaults to Record<string, unknown> and you\n * inspect the row dynamically using options as hints.\n *\n * @example\n * ```ts\n * import { createRenderer } from \"@petrarca/sonnet-ui\";\n * import type { AuditLogEntry } from \"../schemas\";\n *\n * const RENDERERS = {\n * \"x-audit-actors\": createRenderer<AuditLogEntry>((row, options) => {\n * // row is fully typed, options from x-ui-cell-options in the schema.\n * return <span>{row.actors[0]?.name ?? EMPTY_VALUE}</span>;\n * }),\n * };\n *\n * // Schema stays pure data:\n * // actors: { \"x-ui-cell\": \"x-audit-actors\" }\n *\n * <EntityTable schema={SCHEMA} renderers={RENDERERS} ... />\n * ```\n */\nexport function createRenderer<TRow = Record<string, unknown>>(\n render: (row: TRow, options: Record<string, unknown>) => React.ReactNode,\n): CellRenderer {\n return ({ row, options }: CellRendererProps) =>\n React.createElement(React.Fragment, null, render(row as TRow, options));\n}\n\n/**\n * Validate that all keys in a local renderer registry follow the x- prefix\n * convention. Logs a warning in dev mode for each violation.\n */\nexport function validateRendererNames(\n renderers: Record<string, CellRenderer>,\n): void {\n for (const name of Object.keys(renderers)) {\n if (!name.startsWith(\"x-\")) {\n warnLog(\n `[EntityTable] Local renderer \"${name}\" should use the x- prefix ` +\n `(e.g. \"x-${name}\"). Built-in renderer names are unprefixed.`,\n );\n }\n }\n}\n","/**\n * Built-in cell renderer components for schema-driven EntityTable.\n *\n * Each renderer is a React component that receives the raw cell value and\n * the merged cell options from x-ui-cell-options. All renderers are\n * display-only -- stateless, no side effects.\n *\n * Cross-cutting options supported by all built-in renderers:\n * valueKey -- extract a sub-field from an object value before rendering\n * nowrap -- apply whitespace-nowrap to the output element\n *\n * Registry, resolution helpers, and the createRenderer factory live in\n * cellRegistry.ts so this file exports only components (react-refresh\n * requirement).\n */\n\nimport React from \"react\";\nimport { Badge, type BadgeProps } from \"../../badge\";\nimport { CodedValueDisplay } from \"../../coded-value-display\";\nimport { CodeableConceptDisplay } from \"../../codeable-concept-display\";\nimport { EMPTY_VALUE, formatDate, formatDateTime } from \"@petrarca/sonnet-core\";\nimport { codingKey, type CodeableConcept } from \"@petrarca/sonnet-core/schema\";\n\n/** Extract a sub-field when options.valueKey is set, otherwise return value as-is. */\nfunction resolveValue(\n value: unknown,\n options: Record<string, unknown>,\n): unknown {\n const key = options.valueKey as string | undefined;\n if (key && value != null && typeof value === \"object\") {\n return (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Build a className string, appending whitespace-nowrap when options.nowrap is true. */\nfunction cx(base: string, options: Record<string, unknown>): string {\n return options.nowrap\n ? [base, \"whitespace-nowrap\"].filter(Boolean).join(\" \")\n : base;\n}\n\ntype BadgeColor = NonNullable<BadgeProps[\"badgeColor\"]>;\n\nexport interface CellRendererProps {\n value: unknown;\n /** Full row record -- available for renderers that need sibling fields. */\n row: Record<string, unknown>;\n options: Record<string, unknown>;\n}\n\nexport type CellRenderer = (props: CellRendererProps) => React.ReactElement;\n\nexport function TextCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"\", options)}>\n {text == null ? EMPTY_VALUE : String(text)}\n </span>\n );\n}\n\nexport function MutedCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {text == null ? EMPTY_VALUE : String(text)}\n </span>\n );\n}\n\nexport function BoldCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-medium\", options)}>\n {text == null ? EMPTY_VALUE : String(text)}\n </span>\n );\n}\n\nexport function CodeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n // No value: the plain dash every cell shows, not a monospace one.\n if (text == null)\n return <span className={cx(\"\", options)}>{EMPTY_VALUE}</span>;\n return (\n <span className={cx(\"font-mono text-xs\", options)}>{String(text)}</span>\n );\n}\n\nexport function BadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n if (value == null)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n const key = String(value);\n const colors = options.colors as Record<string, BadgeColor> | undefined;\n const labels = options.labels as Record<string, string> | undefined;\n const color = colors?.[key];\n const label = labels?.[key] ?? key;\n return <Badge badgeColor={color}>{label}</Badge>;\n}\n\ntype BadgeVariant = NonNullable<BadgeProps[\"variant\"]>;\ntype ConditionalBadgeWhen = \"empty\" | \"present\" | \"truthy\" | \"falsy\";\ntype ConditionalBadgeFallback = \"dash\" | \"value\" | \"muted-value\";\n\nfunction conditionHolds(value: unknown, when: ConditionalBadgeWhen): boolean {\n const isEmpty = value == null || value === \"\";\n switch (when) {\n case \"empty\":\n return isEmpty;\n case \"present\":\n return !isEmpty;\n case \"truthy\":\n return Boolean(value);\n case \"falsy\":\n return !value;\n }\n}\n\nfunction renderConditionalFallback(\n value: unknown,\n fallback: ConditionalBadgeFallback,\n): React.ReactElement {\n if (fallback === \"dash\" || value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n }\n if (fallback === \"muted-value\") {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\n/**\n * Renders a badge when a condition on the cell value holds, and a configurable\n * fallback otherwise. A generic \"flag/marker\" cell -- e.g. a \"Default\" badge\n * when a boolean is true, or a \"Root\" badge when a parent id is empty.\n *\n * x-ui-cell-options:\n * when: \"empty\" | \"present\" | \"truthy\" | \"falsy\" (default \"truthy\")\n * label: badge text (default: the cell value)\n * variant: Badge variant, e.g. \"outline\" | \"secondary\" (default \"secondary\")\n * fallback: \"dash\" (em dash) | \"value\" | \"muted-value\" (default \"dash\")\n *\n * Carries no domain knowledge -- the condition, label, and styling all come\n * from the schema.\n */\nexport function ConditionalBadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const when = (options.when as ConditionalBadgeWhen | undefined) ?? \"truthy\";\n const variant = (options.variant as BadgeVariant | undefined) ?? \"secondary\";\n const fallback =\n (options.fallback as ConditionalBadgeFallback | undefined) ?? \"dash\";\n\n if (conditionHolds(value, when)) {\n const label =\n options.label != null ? String(options.label) : String(value ?? \"\");\n return <Badge variant={variant}>{label}</Badge>;\n }\n\n return renderConditionalFallback(value, fallback);\n}\n\nexport function DateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDate(value as string | null)}\n </span>\n );\n}\n\nexport function DateTimeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDateTime(value as string | null)}\n </span>\n );\n}\n\nexport function BooleanCell({ value }: CellRendererProps): React.ReactElement {\n return (\n <span className={value ? \"text-green-600\" : \"text-muted-foreground\"}>\n {value ? \"Yes\" : \"No\"}\n </span>\n );\n}\n\nexport function NumberCell({ value }: CellRendererProps): React.ReactElement {\n const text = value == null ? EMPTY_VALUE : String(value);\n return <span className=\"tabular-nums\">{text}</span>;\n}\n\nexport function TruncateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const resolved = resolveValue(value, options);\n const text = resolved == null ? EMPTY_VALUE : String(resolved);\n return (\n <span className=\"block truncate max-w-xs\" title={text}>\n {text}\n </span>\n );\n}\n\n/**\n * Renders the first item of an array with a \"+N\" overflow count.\n *\n * Options:\n * displayKey -- object field to use as the display label\n * fallbackKey -- object field to use when displayKey is null/undefined\n * prefixKey -- object field to render as a muted prefix before the label (e.g. \"type: name\")\n */\nexport function OverflowListCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const items = Array.isArray(value)\n ? (value as Record<string, unknown>[])\n : [];\n if (items.length === 0)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n\n const displayKey = options.displayKey as string | undefined;\n const fallbackKey = options.fallbackKey as string | undefined;\n const prefixKey = options.prefixKey as string | undefined;\n\n const first = items[0];\n const label =\n (displayKey && (first[displayKey] as string | null | undefined)) ||\n (fallbackKey && (first[fallbackKey] as string)) ||\n \"\";\n\n return (\n <>\n {prefixKey && (\n <span className=\"text-muted-foreground\">\n {String(first[prefixKey])}:{\" \"}\n </span>\n )}\n {label}\n {items.length > 1 && (\n <span className=\"text-muted-foreground ml-1\">+{items.length - 1}</span>\n )}\n </>\n );\n}\n\n/** Renders each item of an array as a badge (variant from options.variant, default \"secondary\"). */\nexport function BadgesCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const items = Array.isArray(value) ? value : [];\n if (items.length === 0)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n const variant = (options.variant as BadgeVariant | undefined) ?? \"secondary\";\n return (\n <span className=\"inline-flex flex-wrap gap-1.5\">\n {items.map((item) => (\n <Badge key={String(item)} variant={variant}>\n {String(item)}\n </Badge>\n ))}\n </span>\n );\n}\n\n/** Joins an array of strings with a separator (default: \", \"). */\nexport function JoinCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const sep = (options.separator as string | undefined) ?? \", \";\n if (!Array.isArray(value) || value.length === 0)\n return <span className=\"text-muted-foreground\">&mdash;</span>;\n return <span className=\"text-muted-foreground\">{value.join(sep)}</span>;\n}\n\n// A coded value as a cell shows it: a coding's own, or a code with its label and system from the row.\nfunction codedValueOf(\n value: unknown,\n row: Record<string, unknown>,\n options: Record<string, unknown>,\n): { code: string; display?: string; system?: string } | undefined {\n const text = (v: unknown) => (v == null || v === \"\" ? undefined : String(v));\n if (value != null && typeof value === \"object\") {\n const c = value as Record<string, unknown>;\n const code = text(c.code);\n return code\n ? { code, display: text(c.display), system: text(c.system) }\n : undefined;\n }\n const code = text(value);\n if (!code) return undefined;\n const displayField =\n (options.displayField as string | undefined) ?? \"display\";\n const systemField = (options.systemField as string | undefined) ?? \"system\";\n return {\n code,\n display: text(row[displayField]),\n system: text(row[systemField]),\n };\n}\n\n// Whether a value is a codeable concept: its codings, or its text alone.\nfunction isConcept(value: unknown): value is CodeableConcept {\n if (value == null || typeof value !== \"object\" || Array.isArray(value))\n return false;\n const v = value as CodeableConcept;\n return Array.isArray(v.codings) || typeof v.text === \"string\";\n}\n\n/**\n * A coded value: its label, its code muted beside it, its system on hover. The\n * value is a coding (`{ system, code, display }`) -- or a code, its label and\n * system read from the row (options.displayField, default \"display\";\n * options.systemField, default \"system\"). An array of codings, one per line. A\n * codeable concept shows its first coding, the others counted, listed on hover.\n */\nexport function CodingCell({\n value,\n row,\n options,\n}: CellRendererProps): React.ReactElement {\n const concept = resolveValue(value, options);\n if (isConcept(concept))\n return (\n <CodeableConceptDisplay value={concept} className={cx(\"\", options)} />\n );\n const values = Array.isArray(value) ? value : [value];\n const coded = values\n .map((v) => codedValueOf(resolveValue(v, options), row, options))\n .filter((c) => c !== undefined);\n if (coded.length === 0)\n return <span className=\"text-muted-foreground\">{EMPTY_VALUE}</span>;\n return (\n <span className={cx(\"inline-flex flex-col gap-0.5\", options)}>\n {coded.map((c) => (\n <CodedValueDisplay key={codingKey(c)} {...c} />\n ))}\n </span>\n );\n}\n","/**\n * Resolve JSON Schema + UI Schema into a list of ResolvedColumn descriptors.\n *\n * Pure function -- no React, no DOM, fully testable.\n * Extractable to @petrarca/sonnet-core.\n */\n\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport { mergeColumnConfig } from \"./mergeUiSchema\";\nimport { inferCellRenderer } from \"./cellRegistry\";\nimport type { ResolvedColumn, TableUiSchema } from \"./types\";\n\n/**\n * Resolve schema properties into ordered, filtered column descriptors.\n *\n * Steps:\n * 1. Merge x-ui-column + UI schema per property.\n * 2. Drop hidden properties.\n * 3. Sort: properties with explicit order first (ascending), then\n * remaining properties in schema declaration order. Declaration order (not\n * alphabetical) matches the form renderer and what authors expect; columns\n * that need a specific position set x-ui-column.order.\n * 4. Build ResolvedColumn for each.\n */\nexport function resolveColumns(\n schema: JsonSchema,\n uiSchema?: TableUiSchema,\n): ResolvedColumn[] {\n const properties = schema.properties ?? {};\n\n const entries = Object.entries(properties)\n .map(([key, property], index) => {\n const config = mergeColumnConfig(key, property, uiSchema);\n return { key, property, config, index };\n })\n .filter(({ config }) => !config.hidden);\n\n // Split into ordered and unordered buckets.\n const ordered = entries\n .filter(({ config }) => config.order !== undefined)\n .sort((a, b) => a.config.order! - b.config.order!);\n\n // Unordered columns keep their schema declaration order.\n const unordered = entries\n .filter(({ config }) => config.order === undefined)\n .sort((a, b) => a.index - b.index);\n\n const sorted = [...ordered, ...unordered];\n\n return sorted.map(({ key, property, config }) => {\n const cellRenderer =\n config.cellRenderer ?? inferCellRenderer(property.type, property.format);\n\n // Label: the UI schema's (x-ui-column.label, else x-ui-title, as a form's),\n // else the schema's (x-ui-column.label, x-ui-title, title), else the key.\n const label =\n config.label ??\n uiTitle(uiSchema?.[key]?.[\"x-ui-title\"]) ??\n property[\"x-ui-title\"] ??\n property.title ??\n keyToLabel(key);\n\n return {\n key,\n label,\n property,\n cellRenderer,\n cellOptions: config.cellOptions,\n width: config.width,\n minWidth: config.minWidth,\n sortable: config.sortable,\n };\n });\n}\n\n/** A UI schema's x-ui-title as a label: a string only -- false hides a form's label, a column keeps one. */\nfunction uiTitle(title: string | false | undefined): string | undefined {\n return typeof title === \"string\" ? title : undefined;\n}\n\n/** Convert a snake_case key to a Title Case label as a last-resort fallback. */\nfunction keyToLabel(key: string): string {\n return key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * JsonTree -- collapsible JSON tree themed by the semantic design tokens\n * (dark-mode aware via CSS vars). Thin wrapper over react-json-tree so every\n * package renders JSON trees the same way.\n */\nimport React from \"react\";\nimport { JSONTree } from \"react-json-tree\";\n\nconst tokenTheme = {\n scheme: \"sonnet\",\n base00: \"transparent\",\n base01: \"hsl(var(--muted))\",\n base02: \"hsl(var(--border))\",\n base03: \"hsl(var(--muted-foreground))\",\n base04: \"hsl(var(--muted-foreground))\",\n base05: \"hsl(var(--foreground))\",\n base06: \"hsl(var(--foreground))\",\n base07: \"hsl(var(--foreground))\",\n base08: \"hsl(var(--destructive))\",\n base09: \"hsl(var(--primary))\",\n base0A: \"hsl(var(--primary))\",\n base0B: \"hsl(var(--primary))\",\n base0C: \"hsl(var(--primary))\",\n base0D: \"hsl(var(--primary))\",\n base0E: \"hsl(var(--primary))\",\n base0F: \"hsl(var(--muted-foreground))\",\n} as const;\n\nexport interface JsonTreeProps {\n data: unknown;\n /** Expand every node initially. Default true. Ignored when `expandLevel` is set. */\n expanded?: boolean;\n /**\n * Expand only the nodes above this depth initially (the root is level 0):\n * 1 opens the root, 2 also its children. For large documents, where\n * expanding everything is slow and unreadable.\n */\n expandLevel?: number;\n /** Hide the root node label. Default false. */\n hideRoot?: boolean;\n}\n\nexport function JsonTree({\n data,\n expanded = true,\n expandLevel,\n hideRoot = false,\n}: JsonTreeProps): React.ReactElement {\n return (\n <JSONTree\n data={data}\n theme={tokenTheme}\n invertTheme={false}\n shouldExpandNodeInitially={(_keyPath, _data, level) =>\n expandLevel === undefined ? expanded : level < expandLevel\n }\n hideRoot={hideRoot}\n />\n );\n}\n","/**\n * PropertyList — read-only display of a record's properties.\n *\n * Two layout modes:\n * - `\"inline\"` (default) — horizontal two-column grid, key left / value right.\n * - `\"stacked\"` — key label above each value.\n *\n * Two densities:\n * - `\"compact\"` (default) — small keys, tight rows: an inspector, a card.\n * - `\"comfortable\"` — a detail page: a fixed label column, body-size text,\n * rows apart by space alone (no rules between them).\n *\n * Without a schema, every property shows, keyed by its name, rendered by\n * {@link PropertyValue} from its value; `propertySchemas` refines that per\n * property. With a `schema` (an object JSON Schema), the schema decides, as it\n * does for EntityTable's columns: which fields and in which order\n * (`x-ui-column`), their labels (`x-ui-title`, `title`), and how each value\n * renders (`x-ui-cell`, or a local renderer from `renderers`).\n *\n * Shared by the graph view's node/edge cards, the table inspector and detail\n * pages, so all property displays look alike.\n */\n\nimport React from \"react\";\nimport { copyTextToClipboard } from \"@petrarca/sonnet-core\";\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport type { CellRenderer, TableUiSchema } from \"../EntityTable/tableSchema\";\nimport { PropertyValue } from \"./PropertyValue\";\nimport { resolvePropertyFields } from \"./propertyFields\";\n\n/** Layout mode for the property list. */\nexport type PropertyListLayout = \"inline\" | \"stacked\";\n\n/** Density: an inspector's (compact) or a detail page's (comfortable). */\nexport type PropertyListDensity = \"compact\" | \"comfortable\";\n\nexport interface PropertyListProps {\n /** Property name -> value. */\n properties: Record<string, unknown>;\n /** Optional property name -> schema, to refine value rendering. Ignored with `schema`. */\n propertySchemas?: Record<string, JsonSchemaProperty>;\n /** An object JSON Schema deciding the fields, their order, labels and rendering. */\n schema?: JsonSchema;\n /** Per-field overrides of `schema`, as EntityTable's uiSchema. */\n uiSchema?: TableUiSchema;\n /** Local cell renderers (`x-` names) the schema's x-ui-cell may name; given the whole record as the row. */\n renderers?: Record<string, CellRenderer>;\n /** Layout mode. Default \"inline\" (horizontal key-value grid). */\n layout?: PropertyListLayout;\n /** Density. Default \"compact\". */\n density?: PropertyListDensity;\n /** Show a \"Properties\" section header. Default false. */\n showHeader?: boolean;\n /** Click value to copy it to the clipboard. Default true. */\n copyable?: boolean;\n /** Message when there are no properties. Default \"No properties\". */\n emptyLabel?: string;\n className?: string;\n}\n\ninterface Entry {\n key: string;\n label: string;\n value: unknown;\n schema?: JsonSchemaProperty;\n}\n\n// The rows to show: the schema's fields, or every property by its name.\nfunction entriesOf({\n properties,\n propertySchemas,\n schema,\n uiSchema,\n}: PropertyListProps): Entry[] {\n if (schema) {\n return resolvePropertyFields(schema, uiSchema).map((field) => ({\n key: field.key,\n label: field.label,\n value: properties?.[field.key],\n schema: field.schema,\n }));\n }\n return Object.entries(properties ?? {}).map(([key, value]) => ({\n key,\n label: key,\n value,\n schema: propertySchemas?.[key],\n }));\n}\n\nconst STYLES = {\n compact: {\n key: \"text-[11px] text-muted-foreground\",\n inline: \"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 items-baseline\",\n stacked: \"space-y-1\",\n stackedValue: \"text-sm text-foreground font-medium break-words\",\n },\n comfortable: {\n key: \"text-sm text-muted-foreground\",\n inline: \"grid grid-cols-[10rem_1fr] gap-x-6 gap-y-3 items-baseline\",\n stacked: \"space-y-3\",\n stackedValue: \"text-sm text-foreground break-words\",\n },\n} as const;\n\nfunction stringForCopy(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nexport function PropertyList(props: PropertyListProps): React.ReactElement {\n const {\n properties,\n renderers,\n layout = \"inline\",\n density = \"compact\",\n showHeader = false,\n copyable = true,\n emptyLabel = \"No properties\",\n className,\n } = props;\n const entries = entriesOf(props);\n const style = STYLES[density];\n\n if (entries.length === 0) {\n return <p className=\"text-sm text-muted-foreground italic\">{emptyLabel}</p>;\n }\n\n const header = showHeader && (\n <p className=\"text-[11px] text-muted-foreground mb-1.5\">Properties</p>\n );\n\n const dtClass = `${style.key} ${copyable ? \"cursor-pointer hover:text-foreground\" : \"\"}`;\n\n const dtProps = (value: unknown) =>\n copyable\n ? {\n onClick: () => copyTextToClipboard(stringForCopy(value)),\n title: \"Click to copy value\",\n }\n : {};\n\n const valueOf = (entry: Entry) => (\n <PropertyValue\n value={entry.value}\n schema={entry.schema}\n renderers={renderers}\n row={properties}\n />\n );\n\n if (layout === \"stacked\") {\n return (\n <div className={className}>\n {header}\n <dl className={style.stacked}>\n {entries.map((entry) => (\n <div key={entry.key}>\n <dt className={dtClass} {...dtProps(entry.value)}>\n {entry.label}\n </dt>\n <dd className={style.stackedValue}>{valueOf(entry)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n }\n\n // inline (default): horizontal two-column grid\n return (\n <div className={className}>\n {header}\n <dl className={style.inline}>\n {entries.map((entry) => (\n <React.Fragment key={entry.key}>\n <dt\n className={`${dtClass} whitespace-nowrap`}\n {...dtProps(entry.value)}\n >\n {entry.label}\n </dt>\n <dd className=\"text-sm text-foreground min-w-0 break-words\">\n {valueOf(entry)}\n </dd>\n </React.Fragment>\n ))}\n </dl>\n </div>\n );\n}\n","/**\n * PropertyValue — read-only, type-aware rendering of a single property value.\n *\n * Reliable model (matches graph-explorer best practice): render by the actual\n * VALUE TYPE, never by guessing string contents.\n * - object / array -> collapsed summary that expands to a JSON tree (bounded box)\n * - long string -> clamped to a few lines with a \"Show more\" toggle\n * - scalar -> inline text\n * - boolean -> true/false (or schema boolean cell)\n * - array of scalars-> comma list\n *\n * Schema is OPTIONAL and only REFINES rendering when present:\n * - x-ui-cell / inferred type/format (date, datetime, boolean, number)\n * - x-ui-cell: \"json\" forces a JSON tree even for a string value\n * - a local renderer (`renderers`, `x-` names) as EntityTable's, given the row\n * A plain string is treated as text by default — it is NOT auto-parsed as\n * JSON (avoids fragile, surprising behaviour). Schema is the only signal that\n * turns a JSON-looking string into a tree.\n */\n\nimport React, { useState } from \"react\";\nimport { JsonTree } from \"../JsonTree/JsonTree\";\nimport { EMPTY_VALUE } from \"@petrarca/sonnet-core\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { CELL_RENDERERS, type CellRenderer } from \"../EntityTable/tableSchema\";\nimport { inferCellRenderer } from \"../EntityTable/tableSchema/cellRegistry\";\n\nexport interface PropertyValueProps {\n value: unknown;\n /** Optional schema for this property; refines rendering when present. */\n schema?: JsonSchemaProperty;\n className?: string;\n /** Strings longer than this clamp with a \"Show more\" toggle. */\n clampChars?: number;\n /** Local cell renderers (`x-` names) the schema's x-ui-cell may name, as EntityTable's. */\n renderers?: Record<string, CellRenderer>;\n /** The record the value belongs to: a renderer reads sibling fields from it. */\n row?: Record<string, unknown>;\n}\n\nconst DEFAULT_CLAMP_CHARS = 180;\n\nfunction isObjectLike(v: unknown): v is object {\n return typeof v === \"object\" && v !== null;\n}\n\n/** Object / array value -> collapsed summary that expands to a JSON tree. */\nfunction JsonValue({ value }: { value: object }): React.ReactElement {\n const [open, setOpen] = useState(false);\n const summary = Array.isArray(value)\n ? `[${value.length} item${value.length === 1 ? \"\" : \"s\"}]`\n : `{${Object.keys(value).length} key${Object.keys(value).length === 1 ? \"\" : \"s\"}}`;\n\n if (!open) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-sm font-mono text-muted-foreground hover:text-foreground\"\n >\n {summary} <span className=\"text-xs\">— show</span>\n </button>\n );\n }\n\n return (\n <div className=\"text-xs font-mono\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"mb-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n hide\n </button>\n <div className=\"max-h-64 overflow-auto rounded border border-border bg-muted/30 px-2 py-1\">\n <JsonTree data={value} hideRoot />\n </div>\n </div>\n );\n}\n\n/** Long string -> clamped with a \"Show more\" toggle and bounded scroll on expand. */\nfunction LongTextValue({ text }: { text: string }): React.ReactElement {\n const [open, setOpen] = useState(false);\n if (!open) {\n return (\n <span className=\"break-words\">\n <span className=\"line-clamp-3 align-bottom\">{text}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show more\n </button>\n </span>\n );\n }\n return (\n <span className=\"break-words\">\n <span className=\"block max-h-64 overflow-auto whitespace-pre-wrap rounded border border-border bg-muted/30 px-2 py-1\">\n {text}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show less\n </button>\n </span>\n );\n}\n\n/** Where a cell renders: the local renderers and the record the value belongs to. */\ninterface CellContext {\n className?: string;\n renderers?: Record<string, CellRenderer>;\n row?: Record<string, unknown>;\n}\n\n// The renderer a cell name names -- local first, then built-in; none for plain text.\nfunction cellRendererFor(\n cellName: string,\n renderers?: Record<string, CellRenderer>,\n): CellRenderer | undefined {\n if (cellName === \"text\") return undefined;\n return renderers?.[cellName] ?? CELL_RENDERERS[cellName];\n}\n\n/** Schema-driven rendering; returns null to fall through to value-shape. */\nfunction renderFromSchema(\n value: unknown,\n schema: JsonSchemaProperty,\n { className, renderers, row = {} }: CellContext,\n): React.ReactElement | null {\n const cellName =\n schema[\"x-ui-cell\"] ?? inferCellRenderer(schema.type, schema.format);\n // \"json\" forces a tree even for string-typed values.\n if (cellName === \"json\") {\n const parsed = typeof value === \"string\" ? safeParse(value) : value;\n return isObjectLike(parsed) ? <JsonValue value={parsed} /> : null;\n }\n const Renderer = cellRendererFor(cellName, renderers);\n if (!Renderer) return null;\n return (\n <span className={className}>\n <Renderer\n value={value}\n row={row}\n options={(schema[\"x-ui-cell-options\"] as Record<string, unknown>) ?? {}}\n />\n </span>\n );\n}\n\n/** Object/array value: scalar arrays -> comma list; structured -> JSON tree. */\nfunction renderObjectLike(\n value: object,\n className?: string,\n): React.ReactElement {\n if (Array.isArray(value) && value.every((v) => !isObjectLike(v))) {\n return (\n <span className={`break-words ${className ?? \"\"}`}>\n {value.map(String).join(\", \")}\n </span>\n );\n }\n return <JsonValue value={value} />;\n}\n\n/** String value: text by default; long strings clamp with a \"Show more\" toggle. */\nfunction renderString(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (typeof value === \"boolean\") {\n return <span className={className}>{value ? \"true\" : \"false\"}</span>;\n }\n const str = String(value);\n if (str.length > clampChars || str.includes(\"\\n\")) {\n return (\n <span className={className}>\n <LongTextValue text={str} />\n </span>\n );\n }\n return <span className={`break-words ${className ?? \"\"}`}>{str}</span>;\n}\n\n/** Value-shape rendering (reliable: by type, not by guessing string contents). */\nfunction renderFromValue(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (value == null) {\n return (\n <span className={`text-muted-foreground ${className ?? \"\"}`}>\n {EMPTY_VALUE}\n </span>\n );\n }\n if (isObjectLike(value)) return renderObjectLike(value, className);\n return renderString(value, className, clampChars);\n}\n\nexport function PropertyValue({\n value,\n schema,\n className,\n clampChars = DEFAULT_CLAMP_CHARS,\n renderers,\n row,\n}: PropertyValueProps): React.ReactElement {\n const fromSchema = schema\n ? renderFromSchema(value, schema, { className, renderers, row })\n : null;\n return fromSchema ?? renderFromValue(value, className, clampChars);\n}\n\nfunction safeParse(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return undefined;\n }\n}\n","/**\n * Resolve the fields a PropertyList shows from a JSON Schema -- as EntityTable\n * resolves its columns (order, hidden, label, cell), so a record reads the same\n * in a table and on its detail page.\n *\n * Pure: no React, no DOM.\n */\n\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport { resolveColumns, type TableUiSchema } from \"../EntityTable/tableSchema\";\n\n/** One field of a PropertyList: its key, its label, and the schema its value renders by. */\nexport interface PropertyField {\n key: string;\n label: string;\n /** The property, with its resolved x-ui-cell and x-ui-cell-options. */\n schema: JsonSchemaProperty;\n}\n\n/** The schema's fields in order, hidden ones dropped, each labelled and with its cell. */\nexport function resolvePropertyFields(\n schema: JsonSchema,\n uiSchema?: TableUiSchema,\n): PropertyField[] {\n return resolveColumns(schema, uiSchema).map((column) => ({\n key: column.key,\n label: column.label,\n schema: {\n ...column.property,\n \"x-ui-cell\": column.cellRenderer,\n \"x-ui-cell-options\": column.cellOptions,\n },\n }));\n}\n","/**\n * EntitySelect -- async searchable single-select for entity references.\n *\n * Fetches options via a pluggable EntityOptionFetcher. The combobox search\n * input drives server-side filtering through the useEntityOptions hook.\n *\n * Extractable to @petrarca/sonnet-ui -- no app-specific imports.\n */\n\nimport * as React from \"react\";\nimport { Check, ChevronsUpDown, Loader2, X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"../button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport {\n useEntityOptions,\n type EntitySelectMode,\n type UseEntityOptionsReturn,\n} from \"@petrarca/sonnet-core/hooks\";\nimport type {\n EntityOptionFetcher,\n EntityOption,\n} from \"@petrarca/sonnet-core/entityOptions\";\n\nfunction emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n}: {\n mode: EntitySelectMode;\n search: string;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n}): string {\n if (isLoading) return \"Loading...\";\n if (mode === \"eager\") return emptyMessage;\n if (search.length === 0) return \"Start typing to search...\";\n if (mode === \"typeahead\" && search.length < minChars)\n return `Type at least ${minChars} character${minChars > 1 ? \"s\" : \"\"} to search...`;\n if (mode === \"explicit\" && !hasSearched) return \"Press Enter to search...\";\n return emptyMessage;\n}\n\n// Explicit mode tracks whether submit() has ever been called.\nfunction useHasSearched(\n submit: UseEntityOptionsReturn[\"submit\"],\n): [boolean, UseEntityOptionsReturn[\"submit\"]] {\n const [hasSearched, setHasSearched] = React.useState(false);\n const wrappedSubmit = React.useCallback(() => {\n setHasSearched(true);\n submit();\n }, [submit]);\n return [hasSearched, wrappedSubmit];\n}\n\nexport interface EntitySelectProps {\n /** The fetcher that provides options from the backend. */\n fetcher: EntityOptionFetcher;\n /**\n * Stable cache key for TanStack Query. Must be unique per fetcher/endpoint\n * combination -- two components using the same key share the same cache entry.\n */\n queryKey: string;\n /**\n * Search mode. Default: \"eager\".\n * eager -- fetch on mount, refetch as user types (small collections)\n * typeahead -- fetch only after minChars are typed (large collections)\n * explicit -- fetch only when user presses Enter\n */\n mode?: EntitySelectMode;\n /** Minimum characters before typeahead mode fires (default 1). */\n minChars?: number;\n /** Currently selected value (controlled). */\n value?: string | null;\n /**\n * The option for the current value, supplying its label. Use when the\n * selected value is set before any options have loaded (e.g. an edit form\n * in typeahead/explicit mode) so the trigger can render the label without\n * fetching the full list. Must match `value`; ignored otherwise.\n */\n selectedOption?: EntityOption | null;\n /** Called when the selection changes. */\n onChange?: (value: string | null) => void;\n /** Called when the selection changes, passing the full option (value + label). */\n onChangeOption?: (option: EntityOption | null) => void;\n /** Called when the dropdown closes (for form blur tracking). */\n onBlur?: () => void;\n /** Label displayed above the select. Pass false to hide. */\n label?: string | false;\n /** Placeholder when nothing is selected. */\n placeholder?: string;\n /** Placeholder for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Message when no options match the search. */\n emptyMessage?: string;\n /** Whether the field is required (shows asterisk). */\n required?: boolean;\n /**\n * Show a clear (X) affordance that resets the selection to null when a value\n * is set. Use for optional entity references (e.g. an assignment that can be\n * removed). Ignored when required or disabled.\n */\n clearable?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Description text below the label. */\n description?: string;\n /** Error message. */\n error?: string;\n /** Additional className for the wrapper. */\n className?: string;\n /** HTML id for the trigger button. */\n id?: string;\n}\n\nfunction resolveEntitySelectDefaults(props: EntitySelectProps) {\n return {\n mode: props.mode ?? \"eager\",\n minChars: props.minChars ?? 1,\n placeholder: props.placeholder ?? \"Select...\",\n searchPlaceholder: props.searchPlaceholder ?? \"Search...\",\n emptyMessage: props.emptyMessage ?? \"No results found\",\n disabled: props.disabled ?? false,\n } as const;\n}\n\nfunction EntitySelectLabel({\n id,\n label,\n required,\n description,\n}: {\n id?: string;\n label?: string | false;\n required?: boolean;\n description?: string;\n}): React.ReactElement | null {\n const hasLabel = label !== undefined && label !== false;\n return (\n <>\n {hasLabel && (\n <label\n htmlFor={id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </>\n );\n}\n\nfunction EntitySelectDropdown({\n searchPlaceholder,\n search,\n setSearch,\n mode,\n submit,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n options,\n value,\n handleSelect,\n}: {\n searchPlaceholder: string;\n search: string;\n setSearch: (v: string) => void;\n mode: EntitySelectMode;\n submit: () => void;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n options: EntityOption[];\n value?: string | null;\n handleSelect: (v: string) => void;\n}): React.ReactElement {\n return (\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={\n mode === \"explicit\"\n ? (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n }\n }\n : undefined\n }\n />\n <CommandList>\n <CommandEmpty>\n {emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n })}\n </CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={handleSelect}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\nexport function EntitySelect(props: EntitySelectProps): React.ReactElement {\n const {\n fetcher,\n queryKey,\n value,\n selectedOption,\n onChange,\n onChangeOption,\n onBlur,\n label,\n required,\n clearable,\n description,\n error,\n className,\n id,\n } = props;\n const {\n mode,\n minChars,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n } = resolveEntitySelectDefaults(props);\n\n const [open, setOpen] = React.useState(false);\n\n // Retain the label of the selected option independently of whether it\n // appears in the current search results. Without this, clearing the search\n // input after a selection causes the trigger to revert to the placeholder.\n const [selectedLabel, setSelectedLabel] = React.useState<string | null>(null);\n\n const {\n options,\n isLoading,\n search,\n setSearch,\n submit: rawSubmit,\n } = useEntityOptions({ fetcher, queryKey, mode, minChars });\n\n const [hasSearched, submit] = useHasSearched(rawSubmit);\n\n // Sync selectedLabel when value changes externally or when options arrive\n // that contain the current value (e.g. initial load).\n React.useEffect(() => {\n if (!value) {\n setSelectedLabel(null);\n return;\n }\n const found = options.find((opt) => opt.value === value);\n if (found) {\n setSelectedLabel(found.label);\n } else if (selectedOption && selectedOption.value === value) {\n // Seed the label for a pre-selected value before options have loaded\n // (e.g. an edit form in typeahead/explicit mode).\n setSelectedLabel(selectedOption.label);\n }\n }, [value, options, selectedOption]);\n\n const handleClear = React.useCallback(\n (e: React.MouseEvent): void => {\n // Reset to null without opening the dropdown.\n e.preventDefault();\n e.stopPropagation();\n setSelectedLabel(null);\n onChange?.(null);\n onChangeOption?.(null);\n },\n [onChange, onChangeOption],\n );\n\n const showClear = Boolean(clearable && value && !required && !disabled);\n\n const handleSelect = React.useCallback(\n (selectedValue: string) => {\n const opt = options.find((o) => o.value === selectedValue);\n if (opt) setSelectedLabel(opt.label);\n const newValue = selectedValue === value ? null : selectedValue;\n if (newValue === null) setSelectedLabel(null);\n onChange?.(newValue);\n onChangeOption?.(newValue === null ? null : (opt ?? null));\n setOpen(false);\n setSearch(\"\");\n },\n [options, value, onChange, onChangeOption, setSearch],\n );\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n setOpen(newOpen);\n if (!newOpen) {\n setSearch(\"\");\n onBlur?.();\n }\n },\n [onBlur, setSearch],\n );\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <EntitySelectLabel\n id={id}\n label={label}\n required={required}\n description={description}\n />\n\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n \"w-full justify-between\",\n !selectedLabel && \"text-muted-foreground\",\n error && \"border-destructive\",\n )}\n disabled={disabled}\n >\n <span className=\"truncate\">{selectedLabel ?? placeholder}</span>\n <div className=\"flex items-center gap-1\">\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin opacity-50\" />\n )}\n {showClear && (\n <span\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n className=\"rounded-sm opacity-50 hover:opacity-100\"\n onPointerDown={handleClear}\n >\n <X className=\"h-4 w-4 shrink-0\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[--radix-popover-trigger-width] p-0\"\n align=\"start\"\n >\n <EntitySelectDropdown\n searchPlaceholder={searchPlaceholder}\n search={search}\n setSearch={setSearch}\n mode={mode}\n submit={submit}\n minChars={minChars}\n isLoading={isLoading}\n hasSearched={hasSearched}\n emptyMessage={emptyMessage}\n options={options}\n value={value}\n handleSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n\n {error && <p className=\"text-sm font-medium text-destructive\">{error}</p>}\n </div>\n );\n}\n","/**\n * EntityTree -- schema-driven tree component.\n *\n * Wraps TreeView and drives column rendering from a JSON Schema +\n * optional UI Schema, using the same resolveColumns / resolveCellRenderer\n * pipeline as EntityTable. Each visible tree node row renders as a set\n * of schema-derived cells.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click sets active row, pencil\n * icon visible on active/hover rows, Enter/Space triggers onNodeEdit.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, pencil icon is hidden, onNodeEdit is suppressed.\n *\n * Loading, error, and empty states are communicated via node flags and\n * the top-level isLoading / isError / isEmpty props.\n *\n * Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type MutableRefObject,\n} from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { TreeView } from \"../TreeView\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"../EntityTable/tableSchema\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { TreeNode, TreeViewHandle, TreeViewProps } from \"../TreeView\";\n\nexport type { CellRenderer, TableUiSchema, TreeNode };\n\n/** Imperative handle for programmatic focus. */\nexport interface EntityTreeHandle {\n focus(): void;\n}\n\nexport interface EntityTreeProps<TData extends Record<string, unknown>> {\n // Column definition\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n renderers?: Record<string, CellRenderer>;\n\n // Tree structure (passed through to TreeView)\n nodes: TreeNode<TData>[];\n expandedIds: Set<string>;\n onExpand: TreeViewProps<TData>[\"onExpand\"];\n onCollapse: TreeViewProps<TData>[\"onCollapse\"];\n\n // Top-level states (for when no nodes are loaded yet)\n isLoading?: boolean;\n isError?: boolean;\n errorMessage?: string;\n entityLabel?: string;\n\n // Interaction\n /** Called on row click -- sets the active row without opening edit. */\n onNodeSelect?: (node: TreeNode<TData>) => void;\n /** Called when the pencil icon is clicked -- opens the edit panel. */\n onNodeEdit?: (node: TreeNode<TData>) => void;\n /** Id of the currently active node. Controls pencil-icon visibility only\n * (always shown on the active node, hover-only on others). Row highlight\n * is managed by TreeView via focus state. */\n activeNodeId?: string;\n\n // Selection mode (opt-in). When true: checkboxes appear, pencil icon\n // is hidden, onNodeEdit is suppressed. When false (default): normal\n // browse/edit behavior.\n selectionMode?: boolean;\n selectedIds?: Set<string>;\n onSelectionChange?: TreeViewProps<TData>[\"onSelectionChange\"];\n /** When true, the first selected node locks subsequent selections to its\n * siblings (nodes at the same depth sharing the same parent). Clearing\n * all selections resets the constraint. Managed internally by TreeView. */\n constrainSelectionToSiblings?: boolean;\n\n /**\n * Optional override for specific node rendering. When provided, called\n * before the default schema-driven renderer. Return a React node to\n * replace the default, or null to fall through to the default.\n */\n renderNodeOverride?: (\n node: TreeNode<TData>,\n depth: number,\n ) => React.ReactNode | null;\n\n indentPx?: number;\n className?: string;\n}\n\nfunction buildCellRow<TData extends Record<string, unknown>>(\n resolved: ResolvedColumn[],\n activeNodeIdRef: MutableRefObject<string | undefined>,\n onNodeEdit: ((node: TreeNode<TData>) => void) | undefined,\n localRenderers?: Record<string, CellRenderer>,\n) {\n return function renderCells(node: TreeNode<TData>): React.ReactElement {\n const isActive = node.id === activeNodeIdRef.current;\n return (\n <span className=\"flex items-center gap-4 min-w-0 w-full group/row\">\n {resolved.map((col) => {\n const Renderer = resolveCellRenderer(\n col.cellRenderer,\n localRenderers,\n );\n const value = node.data[col.key];\n return (\n <span\n key={col.key}\n className=\"shrink-0\"\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n <Renderer\n value={value}\n row={node.data as Record<string, unknown>}\n options={col.cellOptions}\n />\n </span>\n );\n })}\n {onNodeEdit && (\n <span className=\"ml-auto shrink-0\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onNodeEdit(node);\n }}\n aria-label=\"Edit\"\n className={cn(\n \"p-1 rounded hover:bg-background text-muted-foreground hover:text-foreground transition-colors\",\n isActive\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100\",\n )}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </button>\n </span>\n )}\n </span>\n );\n };\n}\n\nfunction resolveEntityTreeDefaults(props: {\n isLoading?: boolean;\n isError?: boolean;\n entityLabel?: string;\n selectionMode?: boolean;\n}) {\n return {\n isLoading: props.isLoading ?? false,\n isError: props.isError ?? false,\n entityLabel: props.entityLabel ?? \"items\",\n selectionMode: props.selectionMode ?? false,\n } as const;\n}\n\n/**\n * Render the appropriate status view for loading/error/empty states.\n * Not a React component -- no hooks. Called as a plain function.\n * Returns null when none of the status conditions apply.\n */\nfunction renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n}: {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n entityLabel: string;\n nodes: unknown[];\n className?: string;\n}): React.ReactElement | null {\n if (isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n Loading\\u2026\n </div>\n );\n }\n\n if (isError) {\n return (\n <div\n className={cn(\"py-8 text-center text-sm text-destructive\", className)}\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </div>\n );\n }\n\n if (!isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No {entityLabel} yet.\n </div>\n );\n }\n\n return null;\n}\n\nfunction resolveRenderNode<TData extends Record<string, unknown>>(\n renderNodeOverride: EntityTreeProps<TData>[\"renderNodeOverride\"],\n defaultRenderNode: (node: TreeNode<TData>) => React.ReactElement,\n): (node: TreeNode<TData>, depth: number) => React.ReactNode {\n if (!renderNodeOverride) return defaultRenderNode;\n return (node: TreeNode<TData>, depth: number): React.ReactNode => {\n const override = renderNodeOverride(node, depth);\n if (override !== null) return override;\n return defaultRenderNode(node);\n };\n}\n\nfunction resolveSelectionProps<TData extends Record<string, unknown>>(\n selectionMode: boolean,\n props: Pick<\n EntityTreeProps<TData>,\n | \"onNodeEdit\"\n | \"selectedIds\"\n | \"onSelectionChange\"\n | \"constrainSelectionToSiblings\"\n >,\n) {\n return {\n effectiveOnNodeEdit: selectionMode ? undefined : props.onNodeEdit,\n onNodeActivate: selectionMode ? undefined : props.onNodeEdit,\n selectedIds: selectionMode ? props.selectedIds : undefined,\n onSelectionChange: selectionMode ? props.onSelectionChange : undefined,\n constrainSelectionToSiblings: selectionMode\n ? props.constrainSelectionToSiblings\n : undefined,\n };\n}\n\n/**\n * EntityTree renders a tree hierarchy where each node row is driven by a\n * JSON Schema column definition, using the same cell renderer pipeline as\n * EntityTable. Row click selects the active node; the pencil icon or Enter\n * triggers edit.\n */\nfunction EntityTreeInner<TData extends Record<string, unknown>>(\n props: EntityTreeProps<TData>,\n ref: React.Ref<EntityTreeHandle>,\n): React.ReactElement {\n const {\n schema,\n uiSchema,\n renderers,\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n errorMessage,\n onNodeSelect,\n onNodeEdit,\n activeNodeId,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n renderNodeOverride,\n indentPx,\n className,\n } = props;\n const { isLoading, isError, entityLabel, selectionMode } =\n resolveEntityTreeDefaults(props);\n\n const treeRef = useRef<TreeViewHandle>(null);\n\n useImperativeHandle(ref, () => ({\n focus() {\n treeRef.current?.focus();\n },\n }));\n\n const resolved = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return resolveColumns(schema, uiSchema);\n }, [schema, uiSchema, renderers]);\n\n // Ref so renderNode reads the current value at call time without\n // recreating the function on every active node change.\n const activeNodeIdRef = useRef(activeNodeId);\n activeNodeIdRef.current = activeNodeId;\n\n const selection = resolveSelectionProps(selectionMode, {\n onNodeEdit,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n });\n\n const defaultRenderNode = useMemo(\n () =>\n buildCellRow<TData>(\n resolved,\n activeNodeIdRef,\n selection.effectiveOnNodeEdit,\n renderers,\n ),\n [resolved, selection.effectiveOnNodeEdit, renderers],\n );\n\n const renderNode = useMemo(\n () => resolveRenderNode(renderNodeOverride, defaultRenderNode),\n [renderNodeOverride, defaultRenderNode],\n );\n\n const statusView = renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n });\n if (statusView) return statusView;\n\n return (\n <div className={cn(\"rounded-lg border\", className)}>\n <TreeView<TData>\n ref={treeRef}\n nodes={nodes}\n expandedIds={expandedIds}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeSelect}\n onNodeActivate={selection.onNodeActivate}\n renderNode={renderNode}\n selectedIds={selection.selectedIds}\n onSelectionChange={selection.onSelectionChange}\n constrainSelectionToSiblings={selection.constrainSelectionToSiblings}\n indentPx={indentPx}\n className=\"p-1\"\n />\n </div>\n );\n}\n\nexport const EntityTree = forwardRef(EntityTreeInner) as <\n TData extends Record<string, unknown>,\n>(\n props: EntityTreeProps<TData> & { ref?: React.Ref<EntityTreeHandle> },\n) => React.ReactElement;\n","/**\n * TreeView -- generic, accessible tree component.\n *\n * Renders a hierarchy of nodes with expand/collapse, keyboard navigation,\n * and optional row selection. Node content is fully delegated to the\n * caller via a renderNode render prop -- this component owns structure\n * and interaction only.\n *\n * Accessibility: implements WAI-ARIA Tree View pattern with\n * role=\"tree\", role=\"treeitem\", aria-expanded, aria-selected.\n * Keyboard: ArrowDown/Up move focus, ArrowRight expands / moves into\n * first child, ArrowLeft collapses / moves to parent, Enter/Space\n * activate the focused node.\n *\n * Loading and error states per node are communicated via the node data\n * itself (isLoading, isError flags). The caller controls data fetching.\n *\n * Large trees: with virtualize, only the rows in view are rendered -- the tree\n * scrolls itself, in a box of bounded height the caller gives it -- and each\n * row states its level and place among its siblings (aria-level, -setsize,\n * -posinset), since the others are not in the DOM. Focus and the active node\n * follow a row out of view: it is scrolled to, then focused. Off by default.\n *\n * Sticky parents (with virtualize): the ancestors of the topmost row in view\n * stay pinned at the top -- deep in a level of thousands, its parent is one\n * click away. Home/End focus the first and the last visible node.\n *\n * Type-to-find: given getTypeAheadLabel, typing moves focus to the next\n * visible row whose label starts with what was typed (WAI-ARIA tree view).\n * Off without it.\n *\n * Extractable to @petrarca/sonnet-ui. Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useVirtualizer, type Virtualizer } from \"@tanstack/react-virtual\";\nimport {\n TYPE_AHEAD_RESET_MS,\n findTypeAhead,\n isTypeAheadKey,\n} from \"./typeAhead\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single node in the tree. TData carries the domain payload. */\nexport interface TreeNode<TData = Record<string, unknown>> {\n /** Stable unique identifier for this node. */\n id: string;\n /** Domain payload, passed through to renderNode. */\n data: TData;\n /** Whether this node can have children (controls expand affordance). */\n hasChildren: boolean;\n /** Children that have already been loaded. undefined = not yet fetched. */\n children?: TreeNode<TData>[];\n /** True while children are being fetched. */\n isLoading?: boolean;\n /** True when the child fetch failed. */\n isError?: boolean;\n}\n\nexport interface TreeViewProps<TData = Record<string, unknown>> {\n /** Root-level nodes. */\n nodes: TreeNode<TData>[];\n /** Set of node ids that are currently expanded. Controlled. */\n expandedIds: Set<string>;\n /** Called when the user requests to expand a node. */\n onExpand: (nodeId: string) => void;\n /** Called when the user requests to collapse a node. */\n onCollapse: (nodeId: string) => void;\n /** Called when the user clicks a node row. */\n onNodeClick?: (node: TreeNode<TData>) => void;\n /** Called when the user activates a node via keyboard (Enter or Space). */\n onNodeActivate?: (node: TreeNode<TData>) => void;\n /**\n * Render the visible content of a single node row.\n * depth starts at 0 for root nodes.\n */\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n /** Row selection -- set of selected node ids. Controlled, opt-in. */\n selectedIds?: Set<string>;\n /** Called when the user toggles selection on a node. */\n onSelectionChange?: (nodeId: string, selected: boolean) => void;\n /** When true, the first selected node locks checkboxes to its siblings\n * (nodes sharing the same parent). Clearing all selections resets the\n * constraint so a different sibling group can be selected next. */\n constrainSelectionToSiblings?: boolean;\n /** The node that is open (e.g. the file shown next to the tree): marked,\n * announced as selected and scrolled into view once shown. Independent of\n * the checkbox selection. */\n activeId?: string;\n /** Accessible name of the tree. Default \"Tree\". */\n label?: string;\n /** Pixels of indentation per depth level. Default 20. */\n indentPx?: number;\n /**\n * Render only the rows in view. The tree then scrolls itself and needs a\n * bounded height (h-full in a box of known height, or a fixed height).\n * Default false: every visible row is rendered, as before.\n */\n virtualize?: boolean;\n /** A row's height before it is measured, in pixels (virtualize). Default 32. */\n rowHeight?: number;\n /**\n * Type-to-find: a node's label, as typed to find it. Given, typing moves\n * focus to the next visible row whose label starts with what was typed\n * (case-insensitive; one character again moves on to the next match).\n */\n getTypeAheadLabel?: (node: TreeNode<TData>) => string;\n /**\n * With virtualize: pin the ancestors of the topmost row in view at the top,\n * so a long level's parent stays visible and one click away (it is scrolled\n * to, focused and reported as a click). A visual aid, hidden from assistive\n * technology -- ArrowLeft moves to the parent. Default false.\n */\n stickyParents?: boolean;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Flat ordered list of visible nodes for keyboard navigation. */\ninterface FlatNode<TData> {\n node: TreeNode<TData>;\n depth: number;\n parentId: string | null;\n /** Its place among its loaded siblings, from 1, and how many they are. */\n posInSet: number;\n setSize: number;\n}\n\nfunction flatten<TData>(\n nodes: TreeNode<TData>[],\n expandedIds: Set<string>,\n depth = 0,\n parentId: string | null = null,\n result: FlatNode<TData>[] = [],\n): FlatNode<TData>[] {\n for (const [i, node] of nodes.entries()) {\n result.push({\n node,\n depth,\n parentId,\n posInSet: i + 1,\n setSize: nodes.length,\n });\n if (expandedIds.has(node.id) && node.children) {\n flatten(node.children, expandedIds, depth + 1, node.id, result);\n }\n }\n return result;\n}\n\n// Sentinel value for \"no sibling constraint active\". A Symbol avoids\n// collision with real parentId values (string | null).\nconst UNCONSTRAINED = Symbol.for(\"tree-view:unconstrained\");\n\n// ---------------------------------------------------------------------------\n// ToggleIcon -- expand/collapse/leaf icon for a tree node.\n// ---------------------------------------------------------------------------\n\ninterface ToggleIconProps {\n hasChildren: boolean;\n isLoading?: boolean;\n isExpanded: boolean;\n}\n\nfunction ToggleIcon({\n hasChildren,\n isLoading,\n isExpanded,\n}: ToggleIconProps): React.ReactElement {\n if (!hasChildren) {\n return (\n <span className=\"block w-1.5 h-1.5 rounded-full bg-border mx-auto\" />\n );\n }\n if (isLoading) {\n return (\n <span className=\"block w-3 h-3 rounded-full border-2 border-muted-foreground/40 border-t-foreground animate-spin\" />\n );\n }\n return (\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// NodeRow\n// ---------------------------------------------------------------------------\n\ninterface NodeRowProps<TData> {\n flat: FlatNode<TData>;\n expandedIds: Set<string>;\n selectedIds: Set<string>;\n /** The open node, when the tree marks one (activeId). */\n isActive?: boolean;\n isSelectable: boolean;\n isFocused: boolean;\n indentPx: number;\n treeId: string;\n onExpand: (id: string) => void;\n onCollapse: (id: string) => void;\n onNodeClick?: (node: TreeNode<TData>) => void;\n onSelectionChange?: (id: string, selected: boolean) => void;\n onFocus: (id: string) => void;\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n /** Virtualized: its index in the visible rows, and the virtualizer's measure. */\n virtualIndex?: number;\n measureRef?: (el: HTMLLIElement | null) => void;\n}\n\n// A virtual row's level and place among its siblings -- the others may not be\n// in the DOM to count; a row of a tree not virtualized states none, as before.\nfunction positionOf<TData>(\n flat: FlatNode<TData>,\n virtualIndex: number | undefined,\n): React.AriaAttributes {\n if (virtualIndex === undefined) return {};\n return {\n \"aria-level\": flat.depth + 1,\n \"aria-setsize\": flat.setSize,\n \"aria-posinset\": flat.posInSet,\n };\n}\n\nfunction NodeRow<TData>({\n flat,\n expandedIds,\n selectedIds,\n isActive,\n isSelectable,\n isFocused,\n indentPx,\n treeId,\n onExpand,\n onCollapse,\n onNodeClick,\n onSelectionChange,\n onFocus,\n renderNode,\n virtualIndex,\n measureRef,\n}: NodeRowProps<TData>): React.ReactElement {\n const { node, depth } = flat;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = selectedIds.has(node.id);\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isExpanded) {\n onCollapse(node.id);\n } else if (node.hasChildren) {\n onExpand(node.id);\n }\n },\n [isExpanded, node.id, node.hasChildren, onExpand, onCollapse],\n );\n\n const handleClick = useCallback(() => {\n onFocus(node.id);\n onNodeClick?.(node);\n }, [node, onFocus, onNodeClick]);\n\n const handleCheckChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onSelectionChange?.(node.id, e.target.checked);\n },\n [node.id, onSelectionChange],\n );\n\n return (\n <li\n ref={measureRef}\n data-index={virtualIndex}\n id={`${treeId}-node-${node.id}`}\n role=\"treeitem\"\n {...positionOf(flat, virtualIndex)}\n aria-expanded={node.hasChildren ? isExpanded : undefined}\n aria-selected={onSelectionChange ? isSelected : isActive}\n aria-busy={node.isLoading}\n tabIndex={isFocused ? 0 : -1}\n className={cn(\n \"flex items-center gap-1 px-2 py-1.5 rounded-sm text-sm select-none\",\n \"cursor-pointer transition-colors\",\n \"hover:bg-accent/60\",\n isFocused && \"bg-accent ring-1 ring-ring ring-inset outline-none\",\n isSelected && \"bg-primary/10\",\n isActive && \"bg-primary/10 font-medium\",\n )}\n style={{ paddingLeft: depth * indentPx + 8 }}\n onClick={handleClick}\n >\n {/* Expand / collapse toggle */}\n <span\n className=\"shrink-0 flex items-center justify-center w-4 h-4\"\n onClick={handleToggle}\n aria-hidden\n >\n <ToggleIcon\n hasChildren={node.hasChildren}\n isLoading={node.isLoading}\n isExpanded={isExpanded}\n />\n </span>\n\n {/* Optional checkbox for row selection */}\n {onSelectionChange && isSelectable && (\n <input\n type=\"checkbox\"\n className=\"shrink-0 h-3.5 w-3.5 rounded\"\n checked={isSelected}\n onChange={handleCheckChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select ${node.id}`}\n tabIndex={-1}\n />\n )}\n\n {/* Caller-provided node content */}\n <span className=\"flex-1 min-w-0\">{renderNode(node, depth)}</span>\n\n {/* Error indicator */}\n {node.isError && (\n <span className=\"shrink-0 text-xs text-destructive\" aria-live=\"polite\">\n Failed to load\n </span>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeView\n// ---------------------------------------------------------------------------\n\n/** Imperative handle exposed via ref for programmatic focus. */\nexport interface TreeViewHandle {\n /** Focus the tree so keyboard navigation is active. */\n focus(): void;\n}\n\n/**\n * TreeView renders a hierarchy of nodes with expand/collapse, keyboard\n * navigation, and optional row selection. Fully controlled.\n */\nfunction TreeViewInner<TData = Record<string, unknown>>(\n {\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n onNodeClick,\n onNodeActivate,\n renderNode,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n activeId,\n label = \"Tree\",\n indentPx = 20,\n virtualize = false,\n rowHeight = 32,\n getTypeAheadLabel,\n stickyParents,\n className,\n }: TreeViewProps<TData>,\n ref: React.Ref<TreeViewHandle>,\n): React.ReactElement {\n const treeId = useId();\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n // A row to focus once it is rendered: scrolled to while out of view (virtualize).\n const pendingFocusRef = useRef<string | null>(null);\n\n // Sibling selection constraint: tracks the parentId of the first selected\n // node. UNCONSTRAINED distinguishes \"no constraint\" from \"root level\"\n // (parentId === null). Reset when selection is cleared externally.\n const [constrainedParent, setConstrainedParent] = useState<\n string | null | typeof UNCONSTRAINED\n >(UNCONSTRAINED);\n\n // Reset constraint when controlled selectedIds becomes empty.\n const selectionSize = selectedIds?.size ?? 0;\n useEffect(() => {\n if (selectionSize === 0) setConstrainedParent(UNCONSTRAINED);\n }, [selectionSize]);\n\n const flatNodes = useMemo(\n () => flatten(nodes, expandedIds),\n [nodes, expandedIds],\n );\n\n // Only the rows in view, when virtualized; disabled otherwise.\n const virtualizer = useVirtualizer({\n count: flatNodes.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => rowHeight,\n overscan: 12,\n enabled: virtualize,\n });\n\n const rowElement = useCallback(\n (id: string): HTMLElement | null =>\n listRef.current?.ownerDocument.getElementById(`${treeId}-node-${id}`) ??\n null,\n [treeId],\n );\n\n // Focus a row: at once when it is rendered; scrolled to first when it is not.\n const focusRow = useCallback(\n (index: number) => {\n const target = flatNodes[index];\n if (!target) return;\n setFocusedId(target.node.id);\n const el = rowElement(target.node.id);\n if (el) {\n el.scrollIntoView?.({ block: \"nearest\" });\n el.focus();\n } else if (virtualize) {\n pendingFocusRef.current = target.node.id;\n virtualizer.scrollToIndex(index, { align: \"auto\" });\n }\n },\n [flatNodes, rowElement, virtualize, virtualizer],\n );\n\n // A row scrolled to is focused once it is rendered.\n useEffect(() => {\n const id = pendingFocusRef.current;\n if (id === null) return;\n const el = rowElement(id);\n if (!el) return;\n pendingFocusRef.current = null;\n el.focus();\n });\n\n // Whether keyboard focus is in the tree. A focused row that is removed takes\n // the focus with it (it falls to the page), so leaving is told apart from that:\n // focus left when the row it left is still in the document.\n const treeFocusedRef = useRef(false);\n const handleTreeFocus = useCallback(() => {\n treeFocusedRef.current = true;\n }, []);\n const handleTreeBlur = useCallback((e: React.FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next) {\n if (!listRef.current?.contains(next)) treeFocusedRef.current = false;\n return;\n }\n // Focus went nowhere: the tree was left (a click on the page), unless the\n // row was removed.\n const left = e.target as Node;\n setTimeout(() => {\n if (left.isConnected) treeFocusedRef.current = false;\n }, 0);\n }, []);\n // Focus may be put back in the tree: it is there, or fell to the page from it.\n const mayRefocus = useCallback((): boolean => {\n if (!treeFocusedRef.current) return false;\n const active = listRef.current?.ownerDocument.activeElement;\n return (\n !active ||\n active === active.ownerDocument.body ||\n Boolean(listRef.current?.contains(active))\n );\n }, []);\n\n // When the focused row goes, focus stays in the tree: on the ancestor that\n // was collapsed over it; otherwise -- a \"Show more\" row replaced by the page\n // it loaded, a node removed -- on the row now in its place (the last row\n // when the tree got shorter).\n const lastFocusedRef = useRef<{ index: number; ancestors: string[] }>({\n index: -1,\n ancestors: [],\n });\n useEffect(() => {\n if (focusedId === null) return;\n const index = flatNodes.findIndex((f) => f.node.id === focusedId);\n if (index >= 0) {\n lastFocusedRef.current = {\n index,\n ancestors: ancestorIds(flatNodes, index),\n };\n return;\n }\n const { index: last, ancestors } = lastFocusedRef.current;\n const collapsed = ancestors.find((id) => !expandedIds.has(id));\n const byAncestor = collapsed\n ? flatNodes.findIndex((f) => f.node.id === collapsed)\n : -1;\n const next =\n byAncestor >= 0 ? byAncestor : Math.min(last, flatNodes.length - 1);\n const target = flatNodes[next];\n if (!target) return;\n if (mayRefocus()) focusRow(next);\n else setFocusedId(target.node.id);\n }, [flatNodes, focusedId, focusRow, expandedIds, mayRefocus]);\n\n // The open node is scrolled into view once it is shown -- also when it\n // appears later, as its ancestors' children load; out of view (virtualize),\n // by its index.\n const scrolledActiveRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (activeId === undefined || scrolledActiveRef.current === activeId)\n return;\n const el = rowElement(activeId);\n if (el) {\n // Optional call: environments without layout (jsdom) lack it.\n el.scrollIntoView?.({ block: \"nearest\" });\n scrolledActiveRef.current = activeId;\n return;\n }\n const index = virtualize\n ? flatNodes.findIndex((f) => f.node.id === activeId)\n : -1;\n if (index < 0) return;\n virtualizer.scrollToIndex(index, { align: \"auto\" });\n scrolledActiveRef.current = activeId;\n });\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n // Focus the currently focused node if one exists, otherwise the first\n // treeitem. Events bubble up to the <ul> onKeyDown from the focused <li>.\n const index = focusedId\n ? flatNodes.findIndex((f) => f.node.id === focusedId)\n : 0;\n focusRow(Math.max(index, 0));\n },\n }),\n [focusedId, flatNodes, focusRow],\n );\n\n // Build a lookup from node id to its parentId in the flat list.\n const parentById = useMemo(() => {\n const map = new Map<string, string | null>();\n for (const f of flatNodes) map.set(f.node.id, f.parentId);\n return map;\n }, [flatNodes]);\n\n // Derive which nodes are selectable under the sibling constraint.\n const selectableSet = useMemo<Set<string> | undefined>(() => {\n if (!constrainSelectionToSiblings || constrainedParent === UNCONSTRAINED) {\n return undefined;\n }\n const ids = new Set<string>();\n for (const f of flatNodes) {\n if (f.parentId === constrainedParent) ids.add(f.node.id);\n }\n return ids;\n }, [constrainSelectionToSiblings, constrainedParent, flatNodes]);\n\n // Wrap onSelectionChange to lock the constraint on first selection.\n const handleSelectionChange = useCallback(\n (nodeId: string, selected: boolean) => {\n if (\n constrainSelectionToSiblings &&\n selected &&\n constrainedParent === UNCONSTRAINED\n ) {\n setConstrainedParent(parentById.get(nodeId) ?? null);\n }\n onSelectionChange?.(nodeId, selected);\n },\n [\n constrainSelectionToSiblings,\n constrainedParent,\n parentById,\n onSelectionChange,\n ],\n );\n\n const focusedIndex = flatNodes.findIndex((f) => f.node.id === focusedId);\n\n const moveFocus = useCallback(\n (delta: number) => {\n if (flatNodes.length === 0) return;\n focusRow(\n Math.max(0, Math.min(flatNodes.length - 1, focusedIndex + delta)),\n );\n },\n [flatNodes.length, focusedIndex, focusRow],\n );\n\n const handleArrowRight = useCallback(\n (current: FlatNode<TData>) => {\n if (current.node.hasChildren && !expandedIds.has(current.node.id)) {\n onExpand(current.node.id);\n } else if (current.node.children && current.node.children.length > 0) {\n moveFocus(1);\n }\n },\n [expandedIds, onExpand, moveFocus],\n );\n\n const handleArrowLeft = useCallback(\n (current: FlatNode<TData>) => {\n if (expandedIds.has(current.node.id)) {\n onCollapse(current.node.id);\n return;\n }\n if (current.parentId === null) return;\n const parentIdx = flatNodes.findIndex(\n (f) => f.node.id === current.parentId,\n );\n if (parentIdx >= 0) focusRow(parentIdx);\n },\n [expandedIds, onCollapse, flatNodes, focusRow],\n );\n\n const getFocusedNode = useCallback((): FlatNode<TData> | null => {\n if (focusedIndex < 0) return null;\n return flatNodes[focusedIndex] ?? null;\n }, [flatNodes, focusedIndex]);\n\n const activateNode = useCallback(\n (flat: FlatNode<TData> | null) => {\n if (flat) onNodeActivate?.(flat.node);\n },\n [onNodeActivate],\n );\n\n // What was typed in quick succession: type-to-find's query.\n const typedRef = useRef({ query: \"\", at: 0 });\n const typeAhead = useCallback(\n (e: React.KeyboardEvent) => {\n if (!getTypeAheadLabel || !isTypeAheadKey(e)) return;\n e.preventDefault();\n const now = Date.now();\n const typed = typedRef.current;\n const query =\n (now - typed.at < TYPE_AHEAD_RESET_MS ? typed.query : \"\") + e.key;\n typedRef.current = { query, at: now };\n const labels = flatNodes.map((f) => getTypeAheadLabel(f.node));\n const index = findTypeAhead(labels, focusedIndex, query);\n if (index >= 0) focusRow(index);\n },\n [getTypeAheadLabel, flatNodes, focusedIndex, focusRow],\n );\n\n // What each key does; any other key may find a row by its label.\n const keyActions = useMemo<Record<string, () => void>>(() => {\n const onFocused = (act: (f: FlatNode<TData>) => void) => () => {\n const current = getFocusedNode();\n if (current) act(current);\n };\n const activate = () => activateNode(getFocusedNode());\n return {\n ArrowDown: () => moveFocus(1),\n ArrowUp: () => moveFocus(-1),\n ArrowRight: onFocused(handleArrowRight),\n ArrowLeft: onFocused(handleArrowLeft),\n Enter: activate,\n \" \": activate,\n Home: () => focusRow(0),\n End: () => focusRow(flatNodes.length - 1),\n };\n }, [\n getFocusedNode,\n activateNode,\n moveFocus,\n handleArrowRight,\n handleArrowLeft,\n focusRow,\n flatNodes.length,\n ]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const action = keyActions[e.key];\n if (!action) return typeAhead(e);\n e.preventDefault();\n action();\n },\n [keyActions, typeAhead],\n );\n\n // A pinned parent picked: scrolled to the top, focused, reported as a click.\n const pickParent = useCallback(\n (index: number) => {\n const target = flatNodes[index];\n if (!target) return;\n setFocusedId(target.node.id);\n pendingFocusRef.current = target.node.id;\n virtualizer.scrollToIndex(index, { align: \"start\" });\n onNodeClick?.(target.node);\n },\n [flatNodes, virtualizer, onNodeClick],\n );\n\n if (nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No items.\n </div>\n );\n }\n\n const renderRow = (\n flat: FlatNode<TData>,\n virtualIndex?: number,\n ): React.ReactElement => (\n <NodeRow\n key={flat.node.id}\n flat={flat}\n expandedIds={expandedIds}\n selectedIds={selectedIds ?? new Set()}\n isActive={activeId === undefined ? undefined : flat.node.id === activeId}\n isSelectable={!selectableSet || selectableSet.has(flat.node.id)}\n isFocused={flat.node.id === focusedId}\n indentPx={indentPx}\n treeId={treeId}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeClick}\n onSelectionChange={onSelectionChange ? handleSelectionChange : undefined}\n onFocus={setFocusedId}\n renderNode={renderNode}\n virtualIndex={virtualIndex}\n measureRef={\n virtualIndex === undefined ? undefined : virtualizer.measureElement\n }\n />\n );\n\n const tree = (\n rows: React.ReactNode,\n treeClassName: string | undefined,\n ): React.ReactElement => (\n <ul\n ref={listRef}\n role=\"tree\"\n aria-label={label}\n className={cn(\"outline-none\", treeClassName)}\n onKeyDown={handleKeyDown}\n onFocus={handleTreeFocus}\n onBlur={handleTreeBlur}\n >\n {rows}\n </ul>\n );\n\n if (!virtualize)\n return tree(\n flatNodes.map((f) => renderRow(f)),\n className,\n );\n\n return (\n <div ref={scrollRef} className={cn(\"h-full overflow-y-auto\", className)}>\n {stickyParents && (\n <StickyParents\n flatNodes={flatNodes}\n virtualizer={virtualizer}\n indentPx={indentPx}\n renderNode={renderNode}\n onPick={pickParent}\n />\n )}\n {tree(\n <VirtualRows\n virtualizer={virtualizer}\n render={(index) => renderRow(flatNodes[index]!, index)}\n />,\n undefined,\n )}\n </div>\n );\n}\n\n// The ids of a row's ancestors, nearest first.\nfunction ancestorIds<TData>(\n flatNodes: FlatNode<TData>[],\n index: number,\n): string[] {\n const parentOf = new Map(flatNodes.map((f) => [f.node.id, f.parentId]));\n const ids: string[] = [];\n let parentId = flatNodes[index]?.parentId ?? null;\n while (parentId !== null) {\n ids.push(parentId);\n parentId = parentOf.get(parentId) ?? null;\n }\n return ids;\n}\n\n// The ancestors of the topmost row in view, root first, as indices of the rows.\nfunction ancestorsOfTop<TData>(\n flatNodes: FlatNode<TData>[],\n virtualizer: Virtualizer<HTMLDivElement, Element>,\n): number[] {\n const offset = virtualizer.scrollOffset ?? 0;\n const top = virtualizer.getVirtualItems().find((i) => i.end > offset);\n if (!top) return [];\n const indexOf = new Map(flatNodes.map((f, i) => [f.node.id, i]));\n const chain: number[] = [];\n let parentId = flatNodes[top.index]?.parentId ?? null;\n while (parentId !== null) {\n const index = indexOf.get(parentId);\n if (index === undefined) break;\n chain.unshift(index);\n parentId = flatNodes[index]?.parentId ?? null;\n }\n return chain;\n}\n\n// The parents of the rows in view, pinned at the top while they are scrolled\n// out: a click goes to one. Shown, not announced -- ArrowLeft is the way there\n// by keyboard.\nfunction StickyParents<TData>({\n flatNodes,\n virtualizer,\n indentPx,\n renderNode,\n onPick,\n}: {\n flatNodes: FlatNode<TData>[];\n virtualizer: Virtualizer<HTMLDivElement, Element>;\n indentPx: number;\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n onPick: (index: number) => void;\n}): React.ReactElement | null {\n const chain = ancestorsOfTop(flatNodes, virtualizer);\n if (!chain.length) return null;\n // Sticky with no height of its own: it lies over the rows instead of pushing\n // them down when it appears -- which would move a row just scrolled to (the\n // open node, a focused row) out of view again.\n return (\n <div aria-hidden=\"true\" className=\"sticky top-0 z-10 h-0\">\n <div className=\"border-b bg-background shadow-sm\">\n {chain.map((index) => {\n const { node, depth } = flatNodes[index]!;\n return (\n <div\n key={node.id}\n className=\"flex cursor-pointer select-none items-center gap-1 rounded-sm px-2 py-1.5 text-sm hover:bg-accent/60\"\n style={{ paddingLeft: depth * indentPx + 8 }}\n onClick={() => onPick(index)}\n >\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <ToggleIcon hasChildren isExpanded />\n </span>\n <span className=\"min-w-0 flex-1\">{renderNode(node, depth)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// The rows in view between two spacers that keep the height of all of them.\nfunction VirtualRows({\n virtualizer,\n render,\n}: {\n virtualizer: Virtualizer<HTMLDivElement, Element>;\n render: (index: number) => React.ReactElement;\n}): React.ReactElement {\n const items = virtualizer.getVirtualItems();\n const top = items[0]?.start ?? 0;\n const bottom = virtualizer.getTotalSize() - (items.at(-1)?.end ?? 0);\n return (\n <>\n <Spacer height={top} />\n {items.map((item) => render(item.index))}\n <Spacer height={bottom} />\n </>\n );\n}\n\n// Keeps the scroll height of the rows not rendered (virtualize).\nfunction Spacer({ height }: { height: number }): React.ReactElement | null {\n if (height <= 0) return null;\n return <li role=\"none\" aria-hidden=\"true\" style={{ height }} />;\n}\n\nexport const TreeView = forwardRef(TreeViewInner) as <\n TData = Record<string, unknown>,\n>(\n props: TreeViewProps<TData> & { ref?: React.Ref<TreeViewHandle> },\n) => React.ReactElement;\n","/**\n * typeAhead -- which row a tree's type-to-find moves to (WAI-ARIA tree view).\n *\n * The query is what was typed in quick succession. The next row whose label\n * starts with it, case-insensitive, from the focused row on, wrapping at the\n * end. One character typed again (or held) moves on to the next match instead\n * of staying -- \"p\", \"p\", \"p\" walks through the rows starting with \"p\".\n *\n * Pure; extractable with TreeView.\n */\n\n/** How long a pause starts a new query, in milliseconds. */\nexport const TYPE_AHEAD_RESET_MS = 500;\n\n// A query of one character typed one or more times: it cycles.\nconst isRepeated = (query: string): boolean =>\n [...query].every((c) => c === query[0]);\n\n/**\n * The index of the row type-to-find moves to, or -1 when no label matches.\n * `from` is the focused row (-1: none).\n */\nexport function findTypeAhead(\n labels: string[],\n from: number,\n query: string,\n): number {\n if (!query || labels.length === 0) return -1;\n const cycling = isRepeated(query);\n const prefix = (cycling ? query[0] : query).toLowerCase();\n // A new query may stay on the focused row; a repeated one moves on.\n const start = cycling ? from + 1 : Math.max(from, 0);\n for (let step = 0; step < labels.length; step++) {\n const i = (start + step) % labels.length;\n if (labels[i]?.toLowerCase().startsWith(prefix)) return i;\n }\n return -1;\n}\n\n/** Whether a key adds to the query: one printable character, no modifier. */\nexport function isTypeAheadKey(e: {\n key: string;\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n}): boolean {\n return (\n e.key.length === 1 && e.key !== \" \" && !e.ctrlKey && !e.metaKey && !e.altKey\n );\n}\n","/**\n * SearchInput -- controlled search and filter input with chip display.\n *\n * Supports two modes:\n * \"explicit\" -- fires only on Enter or the search button (default)\n * \"debounce\" -- fires automatically after the user stops typing\n *\n * Supports two search styles:\n * Simple -- no schema prop; produces a single search term\n * Faceted -- schema prop provided; facets derived from schema properties,\n * value entry delegates to search widgets\n * Free text -- faceted plus textKey: the typed text is the query, submitted\n * with the chips; facets come from the picker\n *\n * Faceted field picker:\n * - Opens on ArrowDown or chevron button click\n * - Filters to prefix-matching facets as the user types\n * - ArrowDown/ArrowUp navigate the list; Enter selects when navigated or typed\n * - Click on an item accepts that facet\n * - Closes when a facet is selected, input is submitted, or focus leaves\n *\n * Always emits a FilterExpr. Use flattenFilterExpr() from @/lib/search to\n * convert to flat key/value params for server APIs that do not yet accept AST.\n *\n * Extractable to @petrarca/sonnet-ui: no imports from api/, services/,\n * store/, contexts/, or modules/.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\nimport { Search, X, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Input } from \"../input\";\nimport { Badge } from \"../badge\";\nimport { Button } from \"../button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport { getFieldTitle } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { isEmptyFilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { useSearchInput, type SearchMode } from \"./useSearchInput\";\nimport type { FacetDescriptor } from \"./schemaAdapter\";\nimport {\n DEFAULT_SEARCH_WIDGETS,\n resolveSearchWidget,\n type SearchWidgetRegistry,\n} from \"./widgets\";\n\nexport interface SearchInputProps {\n // Controlled filter state\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n\n /** JSON Schema defining available facets. Providing this activates\n * faceted mode. Each schema property becomes an available facet.\n * Omit for simple single-term search. */\n schema?: JsonSchema;\n\n /** Custom search widgets merged with defaults. Keys are widget names\n * referenced by x-ui-widget in schema properties. */\n widgets?: SearchWidgetRegistry;\n\n // Interaction mode: \"debounce\" fires as typing pauses -- in simple mode, and\n // with textKey (the chips and the text); otherwise faceted commits on Enter.\n mode?: SearchMode;\n debounceMs?: number;\n /** Minimum characters before onChange fires. Simple mode only --\n * has no effect in faceted mode. */\n minChars?: number;\n /** Show an explicit Search button. Only rendered in explicit mode --\n * has no effect when mode is \"debounce\". */\n showSearchButton?: boolean;\n\n /**\n * Simple mode only. When provided, the search text is expanded into a\n * FilterOr with one LIKE term per field instead of the default single\n * { key: \"search\" } term. Enables cross-field search (e.g. match on\n * code OR display). Ignored in faceted mode.\n */\n searchFields?: string[];\n\n /**\n * Faceted mode only. The key of the free-text term: typed text is the\n * search itself -- it stays in the input and is submitted with the chips as\n * a term with this key -- and facets come from the picker (the chevron or\n * ArrowDown). One field for a query and its filters. Without it, typed text\n * narrows the picker or becomes a value of the first facet.\n */\n textKey?: string;\n\n placeholder?: string;\n className?: string;\n /** Disable all interaction (e.g. when a prerequisite is not met). */\n disabled?: boolean;\n /**\n * Faceted mode only: the filter the chips (and the free text) make, each\n * time they change -- before Enter commits them through onChange. For a\n * page with a control of its own that runs the search (a Run button).\n */\n onDraftChange?: (draft: FilterExpr) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults helper -- moves default-parameter branches out of the component.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedSearchDefaults {\n mode: SearchMode;\n debounceMs: number;\n minChars: number;\n showSearchButton: boolean;\n disabled: boolean;\n}\n\nfunction resolveSearchDefaults(\n props: SearchInputProps,\n): ResolvedSearchDefaults {\n return {\n mode: props.mode ?? \"explicit\",\n debounceMs: props.debounceMs ?? 300,\n minChars: props.minChars ?? 0,\n showSearchButton: props.showSearchButton ?? false,\n disabled: props.disabled ?? false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FacetPicker -- the popover that lists available facets.\n// ---------------------------------------------------------------------------\n\ninterface FacetPickerProps {\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nfunction FacetPicker({\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n inputRef,\n}: FacetPickerProps): React.ReactElement {\n return (\n <Popover open={pickerVisible} onOpenChange={setPickerOpen} modal={false}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((o) => !o);\n inputRef.current?.focus();\n }}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-44 p-1\", !hasFacetsToShow && \"hidden\")}\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n >\n {filteredFacets.map((facet, i) => (\n <button\n key={facet.key}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n acceptFacet(facet);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {facet.label}\n </button>\n ))}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ValueEntry -- widget for pending facet, or plain text input.\n// ---------------------------------------------------------------------------\n\ninterface ValueEntryProps {\n pendingFacet: FacetDescriptor | null;\n PendingWidget: ReturnType<typeof resolveSearchWidget> | null;\n pendingWidgetOptions: Record<string, unknown>;\n inputValue: string;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n commitFacetValue: (v: string) => void;\n cancelPendingFacet: () => void;\n resolvedPlaceholder: string;\n disabled: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onInputFocus: () => void;\n}\n\nfunction ValueEntry({\n pendingFacet,\n PendingWidget,\n pendingWidgetOptions,\n inputValue,\n handleInputChange,\n commitFacetValue,\n cancelPendingFacet,\n resolvedPlaceholder,\n disabled,\n inputRef,\n onInputKeyDown,\n onInputChange,\n onInputFocus,\n}: ValueEntryProps): React.ReactElement {\n if (pendingFacet && PendingWidget) {\n return (\n <PendingWidget\n property={pendingFacet.property}\n options={pendingWidgetOptions}\n value={inputValue}\n onChange={(v) =>\n handleInputChange({\n target: { value: v },\n } as React.ChangeEvent<HTMLInputElement>)\n }\n onCommit={(v) => {\n commitFacetValue(v);\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n onCancel={() => {\n cancelPendingFacet();\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n placeholder={pendingFacet.placeholder ?? resolvedPlaceholder}\n autoFocus\n />\n );\n }\n\n return (\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={onInputKeyDown}\n onFocus={onInputFocus}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n autoComplete=\"off\"\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Input onKeyDown handler -- extracted to keep the component body lean.\n// ---------------------------------------------------------------------------\n\ninterface InputKeyDownContext {\n isFaceted: boolean;\n pendingFacet: FacetDescriptor | null;\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n inputValue: string;\n pickerNavigated: boolean;\n setPickerNavigated: React.Dispatch<React.SetStateAction<boolean>>;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n}\n\n/** ArrowDown in the picker: open it or move highlight. Returns true if handled. */\nfunction handlePickerArrowDown(ctx: InputKeyDownContext): boolean {\n if (!ctx.isFaceted || ctx.pendingFacet) return false;\n ctx.setPickerNavigated(true);\n if (!ctx.pickerVisible) {\n ctx.setPickerOpen(true);\n } else {\n ctx.setHighlightedIndex((i) =>\n Math.min(i + 1, ctx.filteredFacets.length - 1),\n );\n }\n return true;\n}\n\n/** Enter while picker shows facets: select the highlighted facet. Returns true if handled. */\nfunction handlePickerEnterSelect(ctx: InputKeyDownContext): boolean {\n if (!ctx.hasFacetsToShow) return false;\n if (!ctx.pickerNavigated && !ctx.inputValue.trim()) return false;\n const clamped = Math.min(ctx.highlightedIndex, ctx.filteredFacets.length - 1);\n if (clamped >= 0 && ctx.filteredFacets[clamped]) {\n ctx.setPickerNavigated(false);\n ctx.acceptFacet(ctx.filteredFacets[clamped]);\n return true;\n }\n return false;\n}\n\nfunction handleInputKeyDown(\n e: React.KeyboardEvent<HTMLInputElement>,\n ctx: InputKeyDownContext,\n): void {\n if (e.key === \"ArrowDown\" && handlePickerArrowDown(ctx)) {\n e.preventDefault();\n return;\n }\n if (e.key === \"ArrowUp\" && ctx.hasFacetsToShow) {\n e.preventDefault();\n ctx.setPickerNavigated(true);\n ctx.setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" && handlePickerEnterSelect(ctx)) {\n e.preventDefault();\n return;\n }\n const reopenPicker = ctx.handleKeyDown(e);\n if (e.key === \"Enter\") {\n ctx.setPickerNavigated(false);\n ctx.setPickerOpen(!!reopenPicker);\n }\n}\n\n// ---------------------------------------------------------------------------\n// resolvePlaceholder -- extract conditional placeholder logic.\n// ---------------------------------------------------------------------------\n\nfunction resolvePlaceholder(\n isFaceted: boolean,\n hasActiveTerms: boolean,\n hasPendingFacet: boolean,\n placeholder: string | undefined,\n): string {\n const defaultPlaceholder = isFaceted ? \"Add filter...\" : \"Search...\";\n if (isFaceted && (hasActiveTerms || hasPendingFacet)) return \"Add filter...\";\n return placeholder ?? defaultPlaceholder;\n}\n\n// ---------------------------------------------------------------------------\n// ActiveChips -- renders filter chips in faceted mode.\n// ---------------------------------------------------------------------------\n\ninterface ActiveChipsProps {\n terms: Array<{ key: string; value: string }>;\n schema?: JsonSchema;\n onRemove: (index: number) => void;\n}\n\n// A chip's value as the enum widget lists it (x-ui-options.enumNames), else as is.\nfunction valueLabel(\n property: JsonSchemaProperty | undefined,\n value: string,\n): string {\n const options = property?.[\"x-ui-options\"] as\n | { enumNames?: Record<string, string> }\n | undefined;\n return options?.enumNames?.[value] ?? value;\n}\n\nfunction ActiveChips({\n terms,\n schema,\n onRemove,\n}: ActiveChipsProps): React.ReactElement {\n return (\n <>\n {terms.map((term, i) => {\n const property = schema?.properties?.[term.key];\n const label = property ? getFieldTitle(term.key, property) : term.key;\n return (\n <FilterChip\n key={`${term.key}:${term.value}`}\n label={`${label}: ${valueLabel(property, term.value)}`}\n onRemove={() => onRemove(i)}\n />\n );\n })}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// resolveWidgetForFacet -- extract widget resolution branches.\n// ---------------------------------------------------------------------------\n\nfunction resolveWidgetForFacet(\n pendingFacet: FacetDescriptor | null,\n registry: SearchWidgetRegistry,\n): {\n Widget: ReturnType<typeof resolveSearchWidget> | null;\n options: Record<string, unknown>;\n} {\n if (!pendingFacet) return { Widget: null, options: {} };\n return {\n Widget: resolveSearchWidget(pendingFacet.property, registry),\n options:\n (pendingFacet.property[\"x-ui-options\"] as Record<string, unknown>) ?? {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// SearchActions -- clear and search buttons, extracted to reduce parent complexity.\n// ---------------------------------------------------------------------------\n\ninterface SearchActionsProps {\n isEmpty: boolean;\n showSearchButton: boolean;\n mode: SearchMode;\n onClear: () => void;\n onCommit: () => void;\n}\n\nfunction SearchActions({\n isEmpty,\n showSearchButton,\n mode,\n onClear,\n onCommit,\n}: SearchActionsProps): React.ReactElement {\n return (\n <>\n {!isEmpty && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n aria-label=\"Clear search\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n {showSearchButton && mode === \"explicit\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n onCommit();\n }}\n >\n Search\n </Button>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// mergeWidgetRegistry -- extracted to reduce parent branches.\n// ---------------------------------------------------------------------------\n\nfunction mergeWidgetRegistry(\n custom: SearchWidgetRegistry | undefined,\n): SearchWidgetRegistry {\n return custom\n ? { ...DEFAULT_SEARCH_WIDGETS, ...custom }\n : DEFAULT_SEARCH_WIDGETS;\n}\n\n// ---------------------------------------------------------------------------\n// SearchInput\n// ---------------------------------------------------------------------------\n\nexport function SearchInput(props: SearchInputProps): React.ReactElement {\n const {\n value,\n onChange,\n schema,\n widgets: customWidgets,\n searchFields,\n textKey,\n placeholder,\n className,\n } = props;\n const { mode, debounceMs, minChars, showSearchButton, disabled } =\n resolveSearchDefaults(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [pickerNavigated, setPickerNavigated] = useState(false);\n\n // Close picker on clicks outside the component.\n useEffect(() => {\n if (!pickerOpen) return;\n function handleMouseDown(e: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setPickerOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [pickerOpen]);\n\n const widgetRegistry = useMemo<SearchWidgetRegistry>(\n () => mergeWidgetRegistry(customWidgets),\n [customWidgets],\n );\n\n const {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n } = useSearchInput({\n value,\n onChange,\n mode,\n debounceMs,\n minChars,\n schema,\n searchFields,\n textKey,\n onDraftChange: props.onDraftChange,\n });\n const isEmpty = isEmptyFilterExpr(value) && inputValue === \"\";\n\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredFacets, pickerOpen]);\n\n const resolvedPlaceholder = resolvePlaceholder(\n isFaceted && !textKey,\n activeTerms.length > 0,\n pendingFacet !== null,\n placeholder,\n );\n\n const showFacetControls = isFaceted && !pendingFacet;\n const pickerVisible = showFacetControls && pickerOpen;\n const hasFacetsToShow = pickerVisible && filteredFacets.length > 0;\n\n const acceptFacet = React.useCallback(\n (facet: FacetDescriptor) => {\n selectFacet(facet);\n setPickerOpen(false);\n inputRef.current?.focus();\n },\n [selectFacet],\n );\n\n const { Widget: PendingWidget, options: pendingWidgetOptions } =\n resolveWidgetForFacet(pendingFacet, widgetRegistry);\n\n const keyDownCtx: InputKeyDownContext = {\n isFaceted,\n pendingFacet,\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n inputValue,\n pickerNavigated,\n setPickerNavigated,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n handleKeyDown,\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm min-h-9\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-text\",\n className,\n )}\n onClick={() => !disabled && inputRef.current?.focus()}\n onBlur={(e) => {\n const relatedTarget = e.relatedTarget as Node | null;\n if (relatedTarget && !e.currentTarget.contains(relatedTarget)) {\n setPickerOpen(false);\n }\n }}\n >\n <Search className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n\n {/* Active filter chips -- faceted mode only */}\n {isFaceted && (\n <ActiveChips\n terms={activeTerms}\n schema={schema}\n onRemove={handleRemoveTerm}\n />\n )}\n\n {/* Pending facet chip */}\n {pendingFacet && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {pendingFacet.label}:\n </span>\n )}\n\n {/* Facet picker + text input / widget row */}\n <div className=\"flex items-center gap-1 flex-1 min-w-[120px]\">\n {showFacetControls && (\n <FacetPicker\n pickerVisible={pickerVisible}\n hasFacetsToShow={hasFacetsToShow}\n filteredFacets={filteredFacets}\n highlightedIndex={highlightedIndex}\n setPickerOpen={setPickerOpen}\n setHighlightedIndex={setHighlightedIndex}\n acceptFacet={acceptFacet}\n inputRef={inputRef}\n />\n )}\n\n <ValueEntry\n pendingFacet={pendingFacet}\n PendingWidget={PendingWidget}\n pendingWidgetOptions={pendingWidgetOptions}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n commitFacetValue={commitFacetValue}\n cancelPendingFacet={cancelPendingFacet}\n resolvedPlaceholder={resolvedPlaceholder}\n disabled={disabled}\n inputRef={inputRef}\n onInputKeyDown={(e) => handleInputKeyDown(e, keyDownCtx)}\n onInputChange={(e) => {\n handleInputChange(e);\n setPickerNavigated(false);\n }}\n onInputFocus={() => {\n if (isFaceted && !pendingFacet) setPickerNavigated(false);\n }}\n />\n </div>\n\n <SearchActions\n isEmpty={isEmpty}\n showSearchButton={showSearchButton}\n mode={mode}\n onClear={handleClear}\n onCommit={() => {\n // Missing required facets reopen the picker, exactly as Enter does,\n // instead of the button appearing to do nothing.\n if (handleCommit()) {\n setPickerNavigated(false);\n setPickerOpen(true);\n inputRef.current?.focus();\n }\n }}\n />\n </div>\n );\n}\n\ninterface FilterChipProps {\n label: string;\n onRemove: () => void;\n}\n\nfunction FilterChip({ label, onRemove }: FilterChipProps): React.ReactElement {\n return (\n <Badge\n variant=\"secondary\"\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full\"\n >\n {label}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ml-0.5 hover:text-destructive transition-colors\"\n aria-label={`Remove filter ${label}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n}\n","/**\n * useSearchInput -- internal state machine for SearchInput.\n *\n * Two code paths:\n * Simple (no schema) -- manages a single input string, commits it as\n * a one-term FilterExpr on Enter or debounce.\n * Faceted (schema) -- manages chip accumulation plus a pending\n * facet/value input. Facets are derived from the\n * schema properties via buildFacetDescriptors().\n *\n * Event contract:\n * onChange is the single output event. It fires:\n * Simple mode, explicit -- on Enter\n * Simple mode, debounce -- after the user stops typing\n * Faceted mode -- on submit only (Enter on empty input after\n * chips are composed). Chip accumulation is\n * internal state; the caller never sees it.\n * Free text, debounce -- the chips and the text, after the user stops\n * typing (faceted with textKey)\n * Remove chip / Clear -- immediately (destructive ops need instant feedback)\n *\n * Faceted field selection:\n * While no facet is pending and the input does NOT end with a space,\n * filteredFacets contains the subset of facets whose labels start with\n * the current input (case-insensitive). Selecting one sets it as the\n * pending facet and clears the input.\n *\n * If the input ends with a space, facet matching is suppressed --\n * the value is committed against facets[0] (implicit default).\n *\n * Free text (faceted, with textKey):\n * The typed text is the search itself, not a facet value: it stays in the\n * input and is submitted with the chips as a term keyed textKey. Facets\n * come from the picker only (typing does not narrow or select them); while\n * a facet's value is entered, the text is held and comes back after.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr, FilterTerm } from \"@petrarca/sonnet-core/search\";\nimport { collectTerms, textSearchExpr } from \"@petrarca/sonnet-core/search\";\nimport { buildFacetDescriptors, type FacetDescriptor } from \"./schemaAdapter\";\n\nexport type SearchMode = \"debounce\" | \"explicit\";\n\ninterface UseSearchInputOptions {\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n mode?: SearchMode;\n debounceMs?: number;\n schema?: JsonSchema;\n minChars?: number;\n /**\n * When provided (simple mode only), the search text is expanded into\n * a FilterOr with one LIKE term per field instead of the single\n * { key: \"search\" } term. Ignored in faceted mode.\n *\n * Example: searchFields = [\"code\", \"display\"] with text \"aspirin\"\n * produces { type: \"or\", children: [\n * { type: \"term\", key: \"code\", value: \"aspirin\" },\n * { type: \"term\", key: \"display\", value: \"aspirin\" },\n * ]}\n */\n searchFields?: string[];\n /** Faceted mode only: the key of the free-text term (see the header). */\n textKey?: string;\n /**\n * Faceted mode only: called with the filter the chips (and, with a\n * textKey, the text) make whenever they change -- before they are\n * committed. For a caller that acts on the search with a control of its\n * own (a Run button) and must see what is entered, not only what was\n * committed.\n */\n onDraftChange?: (draft: FilterExpr) => void;\n}\n\ninterface UseSearchInputReturn {\n inputValue: string;\n pendingFacet: FacetDescriptor | null;\n isFaceted: boolean;\n filteredFacets: FacetDescriptor[];\n allFacets: FacetDescriptor[];\n selectFacet: (f: FacetDescriptor | null) => void;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** Returns true when the picker should (re)open (required facets missing). */\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n /** Commit the current entry. Returns true when required facets are missing\n * and the caller should reopen the picker. */\n handleCommit: () => boolean;\n handleRemoveTerm: (index: number) => void;\n handleClear: () => void;\n activeTerms: FilterTerm[];\n commitFacetValue: (value: string) => void;\n cancelPendingFacet: () => void;\n}\n\n// Whether two lists of chips are the same, in order.\nfunction sameTerms(a: FilterTerm[], b: FilterTerm[]): boolean {\n return (\n a.length === b.length &&\n a.every((t, i) => t.key === b[i].key && t.value === b[i].value)\n );\n}\n\nexport function useSearchInput({\n value,\n onChange,\n mode = \"explicit\",\n debounceMs = 300,\n schema,\n minChars = 0,\n searchFields,\n textKey,\n onDraftChange,\n}: UseSearchInputOptions): UseSearchInputReturn {\n const allFacets = useMemo(\n () => (schema ? buildFacetDescriptors(schema) : []),\n [schema],\n );\n\n const isFaceted = allFacets.length > 0;\n // The free text, in faceted mode with a textKey.\n const freeTextKey = isFaceted ? textKey : undefined;\n const isText = (t: FilterTerm) => t.key === freeTextKey;\n\n const initialInput = (() => {\n const terms = collectTerms(value);\n if (freeTextKey) return terms.find(isText)?.value ?? \"\";\n if (isFaceted) return \"\";\n return terms.length === 1 && terms[0].key === \"search\"\n ? terms[0].value\n : \"\";\n })();\n\n const [inputValue, setInputValue] = useState(initialInput);\n const [pendingFacet, setPendingFacet] = useState<FacetDescriptor | null>(\n null,\n );\n\n // In faceted mode, chip accumulation lives in draftTerms (local state).\n // onChange is only called on submit or on destructive ops (remove/clear).\n const [draftTerms, setDraftTerms] = useState<FilterTerm[]>(() =>\n isFaceted ? collectTerms(value).filter((t) => !isText(t)) : [],\n );\n // The free text, held while a facet's value is entered in the input.\n const heldTextRef = useRef(\"\");\n\n const valueTerms = useMemo(\n () => (!isFaceted ? collectTerms(value) : []),\n [value, isFaceted],\n );\n const activeTerms = isFaceted ? draftTerms : valueTerms;\n\n const activeFieldKeys = useMemo(\n () => new Set(activeTerms.map((t) => t.key)),\n [activeTerms],\n );\n\n const filteredFacets = useMemo<FacetDescriptor[]>(() => {\n if (!isFaceted || pendingFacet || inputValue.endsWith(\" \")) return [];\n const available = allFacets.filter(\n (f) => f.repeatable || !activeFieldKeys.has(f.key),\n );\n if (freeTextKey || !inputValue.trim()) return available;\n const lower = inputValue.toLowerCase();\n return available.filter((f) => f.label.toLowerCase().startsWith(lower));\n }, [\n inputValue,\n pendingFacet,\n isFaceted,\n allFacets,\n activeFieldKeys,\n freeTextKey,\n ]);\n\n // Stable refs\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const draftTermsRef = useRef(draftTerms);\n draftTermsRef.current = draftTerms;\n const pendingFacetRef = useRef(pendingFacet);\n pendingFacetRef.current = pendingFacet;\n const inputValueRef = useRef(inputValue);\n inputValueRef.current = inputValue;\n const isFacetedRef = useRef(isFaceted);\n isFacetedRef.current = isFaceted;\n const allFacetsRef = useRef(allFacets);\n allFacetsRef.current = allFacets;\n const filteredFacetsRef = useRef(filteredFacets);\n filteredFacetsRef.current = filteredFacets;\n const minCharsRef = useRef(minChars);\n minCharsRef.current = minChars;\n const freeTextKeyRef = useRef(freeTextKey);\n freeTextKeyRef.current = freeTextKey;\n\n // When the controlled value is reset to empty externally (e.g. after a\n // search result is selected), clear internal draft state to match. When it\n // is set to other chips externally (a page opened narrowed, say), show them\n // and its text; our own submissions come back with the chips we hold.\n useEffect(() => {\n if (!isFaceted) return;\n const terms = collectTerms(value);\n if (terms.length === 0) {\n setDraftTerms([]);\n setInputValue(\"\");\n heldTextRef.current = \"\";\n setPendingFacet(null);\n return;\n }\n const textKey = freeTextKeyRef.current;\n const chips = terms.filter((t) => t.key !== textKey);\n if (sameTerms(chips, draftTermsRef.current)) return;\n setDraftTerms(chips);\n setInputValue(terms.find((t) => textKey && t.key === textKey)?.value ?? \"\");\n heldTextRef.current = \"\";\n setPendingFacet(null);\n }, [value, isFaceted]);\n\n // Debounce effect (simple mode; the free text has its own, below)\n const searchFieldsRef = useRef(searchFields);\n searchFieldsRef.current = searchFields;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return;\n }\n if (mode !== \"debounce\" || isFaceted) return;\n if (inputValue.trim().length < minCharsRef.current) return;\n const timer = setTimeout(() => {\n onChangeRef.current(textSearchExpr(inputValue, searchFieldsRef.current));\n }, debounceMs);\n return () => clearTimeout(timer);\n }, [inputValue, mode, debounceMs, isFaceted]);\n\n // The filter the chips and, with a textKey, the typed text make.\n const draftExpr = useCallback((terms: FilterTerm[]): FilterExpr => {\n const key = freeTextKeyRef.current;\n const text = key ? inputValueRef.current.trim() : \"\";\n return {\n type: \"and\",\n children:\n key && text ? [...terms, { type: \"term\", key, value: text }] : terms,\n };\n }, []);\n\n // Report the draft as it changes, for a caller that acts on it before Enter.\n const onDraftChangeRef = useRef(onDraftChange);\n onDraftChangeRef.current = onDraftChange;\n useEffect(() => {\n if (isFaceted) onDraftChangeRef.current?.(draftExpr(draftTerms));\n }, [draftTerms, inputValue, isFaceted, draftExpr]);\n\n // Flush terms to onChange, with the free text when there is one.\n const lastSubmittedRef = useRef<string | null>(null);\n const submitDraft = useCallback(\n (terms: FilterTerm[]) => {\n const expr = draftExpr(terms);\n lastSubmittedRef.current = JSON.stringify(expr);\n onChangeRef.current(expr);\n },\n [draftExpr],\n );\n\n // Debounce of the free text (faceted with textKey): the chips and the text\n // fire as typing pauses -- not while a facet's value is entered, and not on\n // mount. A committed chip applies the same way; what was just submitted\n // (a removed chip fires at once) is not sent again.\n const liveStartedRef = useRef(false);\n useEffect(() => {\n if (!liveStartedRef.current) {\n liveStartedRef.current = true;\n return;\n }\n if (mode !== \"debounce\" || !freeTextKey || pendingFacet) return;\n const length = inputValue.trim().length;\n if (length > 0 && length < minCharsRef.current) return;\n const timer = setTimeout(() => {\n const terms = draftTermsRef.current;\n if (JSON.stringify(draftExpr(terms)) !== lastSubmittedRef.current) {\n submitDraft(terms);\n }\n }, debounceMs);\n return () => clearTimeout(timer);\n }, [\n inputValue,\n draftTerms,\n mode,\n debounceMs,\n freeTextKey,\n pendingFacet,\n draftExpr,\n submitDraft,\n ]);\n\n // End a facet's value entry: the input gets the held free text back.\n const endPending = useCallback(() => {\n setInputValue(heldTextRef.current);\n heldTextRef.current = \"\";\n setPendingFacet(null);\n }, []);\n\n // Check whether all required facets have a chip in the given terms list.\n // Returns true when all are present, or when no facets are required.\n const allRequiredSatisfied = useCallback((terms: FilterTerm[]) => {\n const requiredKeys = allFacetsRef.current\n .filter((f) => f.required)\n .map((f) => f.key);\n if (requiredKeys.length === 0) return true;\n const presentKeys = new Set(terms.map((t) => t.key));\n return requiredKeys.every((k) => presentKeys.has(k));\n }, []);\n\n // Add a chip to draftTerms. Never calls onChange.\n const addChip = useCallback(\n (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const facet = pendingFacetRef.current ?? allFacetsRef.current[0] ?? null;\n if (!facet) return;\n const newTerm: FilterTerm = {\n type: \"term\",\n key: facet.key,\n value: trimmed,\n };\n // A value already filtered on is not added again (a repeatable facet).\n const present = draftTermsRef.current.some(\n (t) => t.key === newTerm.key && t.value === newTerm.value,\n );\n if (!present) setDraftTerms([...draftTermsRef.current, newTerm]);\n endPending();\n },\n [endPending],\n );\n\n const commitFacetValue = addChip;\n const cancelPendingFacet = endPending;\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n },\n [],\n );\n\n // -- Key-down helpers (extracted to reduce cyclomatic complexity) --------\n\n /** Tab/Enter with exactly one filtered match: accept the facet. */\n const tryAcceptSingleMatch = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if (\n !isFacetedRef.current ||\n freeTextKeyRef.current ||\n pendingFacetRef.current ||\n filteredFacetsRef.current.length !== 1 ||\n !inputValueRef.current.trim()\n ) {\n return false;\n }\n e.preventDefault();\n setPendingFacet(filteredFacetsRef.current[0]);\n setInputValue(\"\");\n return true;\n },\n [],\n );\n\n /** Enter in faceted mode: add chip or submit draft. Returns true when\n * required facets are missing and the picker should reopen. */\n const handleEnterFaceted = useCallback((): boolean => {\n const trimmed = inputValueRef.current.trim();\n if (trimmed && !freeTextKeyRef.current) {\n addChip(trimmed);\n return false;\n }\n if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n /** Enter in simple mode: commit search text. */\n const handleEnterSimple = useCallback(() => {\n if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n textSearchExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n }, []);\n\n /** Backspace on empty input: clear pending facet, last chip, or reset. */\n const handleBackspaceEmpty = useCallback(() => {\n if (isFacetedRef.current) {\n if (pendingFacetRef.current) {\n endPending();\n } else if (draftTermsRef.current.length > 0) {\n setDraftTerms((prev) => prev.slice(0, -1));\n }\n } else {\n onChangeRef.current({ type: \"and\", children: [] });\n }\n }, [endPending]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if ((e.key === \"Tab\" || e.key === \"Enter\") && tryAcceptSingleMatch(e)) {\n return false;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (isFacetedRef.current) {\n return handleEnterFaceted();\n }\n handleEnterSimple();\n return false;\n }\n\n if (e.key === \"Backspace\" && inputValueRef.current === \"\") {\n handleBackspaceEmpty();\n }\n return false;\n },\n [\n tryAcceptSingleMatch,\n handleEnterFaceted,\n handleEnterSimple,\n handleBackspaceEmpty,\n ],\n );\n\n /** Commit the current entry. Returns true when required facets are missing\n * and the picker should reopen -- the same signal Enter produces, so the\n * search button and the keyboard behave alike rather than the button\n * silently doing nothing. */\n const handleCommit = useCallback((): boolean => {\n if (isFacetedRef.current) {\n const trimmed = inputValueRef.current.trim();\n if (trimmed && !freeTextKeyRef.current) {\n addChip(trimmed);\n } else if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n } else if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n textSearchExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n // Remove chip -- immediate onChange (destructive op).\n const handleRemoveTerm = useCallback(\n (index: number) => {\n const next = draftTermsRef.current.filter((_, i) => i !== index);\n setDraftTerms(next);\n submitDraft(next);\n },\n [submitDraft],\n );\n\n const handleClear = useCallback(() => {\n heldTextRef.current = \"\";\n setInputValue(\"\");\n setPendingFacet(null);\n setDraftTerms([]);\n onChangeRef.current({ type: \"and\", children: [] });\n }, []);\n\n // Choosing a facet clears the input for its value: free text is held\n // until the value is entered; without free text the input only filtered\n // the picker.\n const selectFacet = useCallback((f: FacetDescriptor | null) => {\n if (f && !pendingFacetRef.current) {\n if (freeTextKeyRef.current) heldTextRef.current = inputValueRef.current;\n setInputValue(\"\");\n }\n setPendingFacet(f);\n }, []);\n\n return {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n allFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n };\n}\n","/**\n * Schema adapter -- reads a JsonSchema and produces internal FacetDescriptor\n * objects for the faceted search mode.\n *\n * This is the bridge between the public schema-based API and the internal\n * representation used by the search hook and widget system.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport {\n getFieldTitle,\n getFieldHelpText,\n getFieldPlaceholder,\n} from \"@petrarca/sonnet-core/schema\";\n\n/** Internal facet descriptor derived from a schema property. */\nexport interface FacetDescriptor {\n /** Property key from the schema -- used as the facet key in FilterExpr. */\n key: string;\n /** Display label for the picker and chips. */\n label: string;\n /** Whether this facet is required (listed in schema.required). */\n required: boolean;\n /** Optional description for tooltip or help text. */\n description?: string;\n /** Placeholder text for the value input. */\n placeholder?: string;\n /**\n * Whether the facet can be added more than once -- one chip per value. True\n * for an array property (e.g. `labels: string[]`); each chip is a value of it.\n */\n repeatable: boolean;\n /**\n * The schema of one value -- passed to the search widget. The property itself,\n * or for a repeatable (array) facet its `items`.\n */\n property: JsonSchemaProperty;\n}\n\n/**\n * Derive an ordered list of facet descriptors from a JSON Schema.\n *\n * Respects x-ui-order for display ordering. Properties not listed in\n * x-ui-order are appended in their natural (insertion) order.\n */\nexport function buildFacetDescriptors(schema: JsonSchema): FacetDescriptor[] {\n const properties = schema.properties ?? {};\n const keys = Object.keys(properties);\n if (keys.length === 0) return [];\n\n const requiredSet = new Set((schema.required as string[] | undefined) ?? []);\n\n // Apply x-ui-order: listed keys first, unlisted keys appended\n const order = schema[\"x-ui-order\"] as string[] | undefined;\n const ordered = applyOrder(keys, order);\n\n return ordered.map((key) => {\n const property = properties[key];\n const repeatable = property.type === \"array\";\n return {\n key,\n label: getFieldTitle(key, property),\n required: requiredSet.has(key),\n description: getFieldHelpText(property),\n placeholder: getFieldPlaceholder(property),\n repeatable,\n property: repeatable ? valueSchema(property) : property,\n };\n });\n}\n\n// The schema of one value of an array facet: its items (a string when it\n// declares none).\nfunction valueSchema(property: JsonSchemaProperty): JsonSchemaProperty {\n return property.items ?? { type: \"string\" };\n}\n\n/**\n * Apply x-ui-order to a list of keys.\n * Keys listed in order come first (in order), unlisted keys are appended\n * in their original order.\n */\nfunction applyOrder(keys: string[], order?: string[]): string[] {\n if (!order || order.length === 0) return keys;\n const keySet = new Set(keys);\n const ordered: string[] = [];\n for (const key of order) {\n if (keySet.has(key)) {\n ordered.push(key);\n keySet.delete(key);\n }\n }\n // Append remaining keys in original order\n for (const key of keys) {\n if (keySet.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n","/**\n * TextSearchWidget -- default search widget for plain text facet values.\n *\n * Renders a borderless inline input. Commits on Enter, cancels on Escape.\n * This is the baseline behavior that all faceted text inputs had before\n * the widget system was introduced.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useRef, useEffect } from \"react\";\nimport { Input } from \"../../input\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function TextSearchWidget({\n value,\n onChange,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <Input\n ref={inputRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const trimmed = value.trim();\n if (trimmed) onCommit(trimmed);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n } else if (e.key === \"Backspace\" && value === \"\") {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={placeholder}\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n","/**\n * EnumSearchWidget -- search widget for facets with a fixed set of values.\n *\n * Renders an inline dropdown populated from the schema property's enum\n * values. Reads x-ui-options.enumNames for display labels. Commits on\n * item selection, cancels on Escape.\n *\n * Triggered automatically when the schema property has an enum array.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../popover\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function EnumSearchWidget({\n property,\n options: widgetOptions,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n const enumValues: string[] = (property.enum as string[]) ?? [];\n const enumNames =\n (widgetOptions.enumNames as Record<string, string> | undefined) ?? {};\n\n const items = enumValues.map((val) => ({\n value: val,\n label: enumNames[val] ?? val,\n }));\n\n const filtered = search\n ? items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase()),\n )\n : items;\n\n // Reset highlight when filtered list changes\n useEffect(() => {\n setHighlightedIndex(0);\n }, [filtered.length, search]);\n\n // Auto-open on mount when autoFocus is set\n useEffect(() => {\n if (autoFocus) {\n requestAnimationFrame(() => setOpen(true));\n }\n }, [autoFocus]);\n\n function handleCommit(val: string) {\n onCommit(val);\n setOpen(false);\n setSearch(\"\");\n }\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) setSearch(\"\");\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n onCancel();\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.min(i + 1, filtered.length - 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n const item = filtered[highlightedIndex];\n if (item) handleCommit(item.value);\n return;\n }\n }\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors truncate text-left\"\n onClick={() => setOpen(true)}\n >\n {placeholder ?? \"Select...\"}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-48 p-1\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <input\n autoFocus\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search...\"\n className=\"w-full px-2 py-1.5 text-sm bg-transparent outline-none border-b border-border mb-1 placeholder:text-muted-foreground\"\n />\n <div>\n {filtered.length === 0 && (\n <p className=\"px-2 py-1.5 text-sm text-muted-foreground\">\n No matches\n </p>\n )}\n {filtered.map((item, i) => (\n <button\n key={item.value}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n handleCommit(item.value);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {item.label}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","/**\n * DateSearchWidget -- search widget for facets whose value is a date.\n *\n * Renders a borderless inline input with a calendar that opens on mount. A\n * calendar pick commits the date; a typed date commits on Enter, parsed the\n * way DateInput parses it (the locale's format, leniently; \"t\" or \"today\" for\n * the current date). The committed value is an ISO date (\"YYYY-MM-DD\"). Escape\n * cancels; Backspace in an empty input cancels too, like the text widget.\n *\n * Selected with `x-ui-widget: \"date\"` on the facet's schema property.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n cn,\n compileDateFormat,\n formatIsoDate,\n getLocaleDateFormat,\n parseDate,\n parseIsoDate,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\nimport { Input } from \"../../input\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"../../popover\";\nimport { Calendar } from \"../../DateInput\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function DateSearchWidget({\n value,\n onChange,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const locale = useLocale();\n const fmt = useMemo(\n () => compileDateFormat({ format: getLocaleDateFormat(locale, \"day\") }),\n [locale],\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [invalid, setInvalid] = useState(false);\n\n useEffect(() => {\n if (!autoFocus) return;\n inputRef.current?.focus();\n requestAnimationFrame(() => setOpen(true));\n }, [autoFocus]);\n\n const commit = (date: Date): void => {\n setOpen(false);\n onCommit(formatIsoDate(date, \"day\"));\n };\n\n const commitTyped = (): void => {\n const result = parseDate(value, fmt);\n if (result.date) commit(result.date);\n else setInvalid(true);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <Input\n ref={inputRef}\n value={value}\n onChange={(e) => {\n setInvalid(false);\n onChange(e.target.value);\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (value.trim()) commitTyped();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n onCancel();\n } else if (e.key === \"Backspace\" && value === \"\") {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={placeholder ?? fmt.format}\n aria-invalid={invalid || undefined}\n className={cn(\n \"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\",\n invalid && \"text-destructive\",\n )}\n />\n </PopoverAnchor>\n <PopoverContent\n align=\"start\"\n className=\"w-auto p-2\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Calendar\n value={parseIsoDate(value)}\n onSelect={commit}\n precision=\"day\"\n locale={locale}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","/**\n * Search widget resolution.\n *\n * Determines which search widget to render for a given facet based on\n * its JSON Schema property definition:\n *\n * 1. Explicit: x-ui-widget on the property -> look up in registry.\n * 2. Enum: enum present on the property -> \"enum\" widget.\n * 3. Type fallback -> \"text\" widget (default).\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { SearchWidget, SearchWidgetRegistry } from \"./types\";\n\n/** Resolve the search widget for a facet's schema property. */\nexport function resolveSearchWidget(\n property: JsonSchemaProperty,\n registry: SearchWidgetRegistry,\n): SearchWidget {\n // 1. Explicit widget override via x-ui-widget\n const widgetName = property[\"x-ui-widget\"];\n if (widgetName && registry[widgetName]) {\n return registry[widgetName];\n }\n\n // 2. Enum present -> enum widget\n if (property.enum && property.enum.length > 0 && registry[\"enum\"]) {\n return registry[\"enum\"];\n }\n\n // 3. Type-based fallback -> text widget\n return registry[\"text\"];\n}\n","import type { SearchWidgetRegistry } from \"./types\";\nimport { TextSearchWidget } from \"./TextSearchWidget\";\nimport { EnumSearchWidget } from \"./EnumSearchWidget\";\nimport { DateSearchWidget } from \"./DateSearchWidget\";\n\nexport type {\n SearchWidgetProps,\n SearchWidget,\n SearchWidgetRegistry,\n} from \"./types\";\nexport { resolveSearchWidget } from \"./resolveSearchWidget\";\nexport { TextSearchWidget } from \"./TextSearchWidget\";\nexport { EnumSearchWidget } from \"./EnumSearchWidget\";\nexport { DateSearchWidget } from \"./DateSearchWidget\";\n\n/** Default search widget registry. Consumers extend this via the widgets prop. */\nexport const DEFAULT_SEARCH_WIDGETS: SearchWidgetRegistry = {\n text: TextSearchWidget,\n enum: EnumSearchWidget,\n date: DateSearchWidget,\n};\n","import { Copy } from \"lucide-react\";\nimport { Button } from \"../button\";\n\ntype Props = {\n hasItems: boolean;\n onClick: () => void;\n};\n\n/**\n * ClipboardButton - Toolbar button that opens the clipboard menu.\n *\n * Displayed in CytoscapeControls toolbar with enabled/disabled state.\n */\nfunction ClipboardButton({ hasItems, onClick }: Props) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClick}\n disabled={!hasItems}\n style={{\n opacity: hasItems ? 1 : 0.4,\n cursor: hasItems ? \"pointer\" : \"not-allowed\",\n }}\n >\n <Copy size={16} />\n </Button>\n );\n}\n\nexport default ClipboardButton;\n","import { X, Plus } from \"lucide-react\";\nimport { ClipboardItem } from \"./clipboardStore\";\nimport { Button } from \"../button\";\nimport { SimpleGroup } from \"../simple-group\";\n\ntype Props = {\n item: ClipboardItem;\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n onRemove: (itemId: string) => void;\n};\n\n/**\n * ClipboardItem - Individual clipboard item display.\n *\n * Shows item info with color indicator and action buttons.\n * Compact design for dropdown menu.\n */\nfunction ClipboardItemComponent({ item, onAddItem, onRemove }: Props) {\n const handleAddClick = (e: React.MouseEvent) => {\n const keepInClipboard = e.shiftKey;\n onAddItem(item, keepInClipboard);\n };\n\n return (\n <div\n className=\"p-3 rounded mb-2\"\n style={{\n borderLeft: `4px solid ${item.color}`,\n backgroundColor: \"#f8f9fa\",\n }}\n >\n <SimpleGroup justify=\"space-between\" wrap=\"nowrap\" align=\"flex-start\">\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <p className=\"text-sm font-semibold truncate\">{item.label}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {item.displayName}\n </p>\n <p className=\"text-xs text-muted-foreground font-mono\">\n #{item.entityId}\n </p>\n </div>\n <SimpleGroup gap={4} wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={handleAddClick}\n title=\"Click to add and remove from clipboard, Shift+Click to keep in clipboard\"\n >\n <Plus size={16} />\n Add\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onRemove(item.id)}\n title=\"Remove from clipboard\"\n >\n <X size={16} />\n </Button>\n </SimpleGroup>\n </SimpleGroup>\n </div>\n );\n}\n\nexport default ClipboardItemComponent;\n","import { Trash2 } from \"lucide-react\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { Separator } from \"../separator\";\nimport useClipboard, { ClipboardItem } from \"./clipboardStore\";\nimport ClipboardItemComponent from \"./ClipboardItem\";\nimport { Button } from \"../button\";\nimport { SimpleStack } from \"../simple-stack\";\n\ntype Props = {\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n};\n\n/**\n * ClipboardMenu - Dropdown menu content for clipboard management.\n *\n * Displays clipboard items with add and clear all functionality.\n */\nfunction ClipboardMenu({ onAddItem }: Props) {\n const { items, removeItem, clear } = useClipboard();\n\n // Empty state\n if (items.length === 0) {\n return (\n <div style={{ padding: \"16px\", textAlign: \"center\", width: \"300px\" }}>\n <p className=\"text-sm text-muted-foreground\">No items in clipboard</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Right-click a node and select \"Copy\"\n </p>\n </div>\n );\n }\n\n return (\n <div\n style={{\n width: \"380px\",\n maxWidth: \"90vw\",\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"500px\",\n }}\n >\n {/* Items list with flexible height */}\n <ScrollArea className=\"flex-1 p-3 min-h-0\">\n <SimpleStack gap={0}>\n {items.map((item) => (\n <ClipboardItemComponent\n key={item.id}\n item={item}\n onAddItem={onAddItem}\n onRemove={removeItem}\n />\n ))}\n </SimpleStack>\n </ScrollArea>\n\n <Separator />\n\n {/* Footer with clear all - fixed at bottom */}\n <div style={{ padding: \"8px 12px\", flexShrink: 0 }}>\n <Button\n className=\"w-full\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={clear}\n >\n <Trash2 size={16} />\n Clear All ({items.length})\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ClipboardMenu;\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { devLog } from \"@petrarca/sonnet-core\";\n\n/**\n * ClipboardItem - Lightweight representation of an item in the clipboard.\n */\nexport interface ClipboardItem {\n id: string; // unique clipboard item ID (UUID)\n type: string; // item type (e.g. 'node', 'entity', etc.)\n entityId: string; // external entity identifier\n label: string; // entity label/type\n displayName: string; // visual display name\n color: string; // color for UI indicator\n}\n\n/**\n * Input for adding items to clipboard.\n */\nexport interface ClipboardItemInput {\n entityId: string;\n type: string;\n label: string;\n displayName: string;\n color: string;\n}\n\n/**\n * ClipboardItemKey - Unique identifier for deduplication.\n */\ntype ClipboardItemKey = string;\n\nfunction getItemKey(item: ClipboardItem): ClipboardItemKey {\n return `${item.type}:${item.entityId}:${item.label}`;\n}\n\nfunction getInputKey(input: ClipboardItemInput): ClipboardItemKey {\n return `${input.type}:${input.entityId}:${input.label}`;\n}\n\nfunction uuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\ninterface ClipboardStore {\n items: ClipboardItem[];\n\n /**\n * Add items to clipboard with deduplication.\n */\n addItems: (inputs: ClipboardItemInput[]) => void;\n\n /**\n * Remove a single item from clipboard by its unique ID.\n */\n removeItem: (itemId: string) => void;\n\n /**\n * Clear all items from clipboard.\n */\n clear: () => void;\n}\n\nconst MAX_CLIPBOARD_SIZE = 100;\n\nconst useClipboard = create<ClipboardStore>()(\n persist(\n (set, get) => ({\n items: [],\n\n addItems: (inputs) => {\n const currentItems = get().items;\n const existingKeys = new Set(currentItems.map(getItemKey));\n\n const newItems = inputs\n .map(\n (input): ClipboardItem => ({\n id: uuid(),\n type: input.type,\n entityId: input.entityId,\n label: input.label,\n displayName: input.displayName,\n color: input.color,\n }),\n )\n .filter((item) => !existingKeys.has(getInputKey(item)));\n\n if (newItems.length === 0) {\n devLog(\n \"[ClipboardStore] addItems - all items were duplicates, skipped\",\n );\n return;\n }\n\n let updatedItems = [...currentItems, ...newItems];\n\n if (updatedItems.length > MAX_CLIPBOARD_SIZE) {\n const overflow = updatedItems.length - MAX_CLIPBOARD_SIZE;\n updatedItems = updatedItems.slice(overflow);\n devLog(\n \"[ClipboardStore] addItems - size limit exceeded, removed oldest\",\n { overflow },\n );\n }\n\n devLog(\"[ClipboardStore] addItems\", {\n added: newItems.length,\n total: updatedItems.length,\n skippedDuplicates: inputs.length - newItems.length,\n });\n\n set({ items: updatedItems });\n },\n\n removeItem: (itemId) => {\n const currentItems = get().items;\n const updatedItems = currentItems.filter((item) => item.id !== itemId);\n\n if (updatedItems.length === currentItems.length) {\n devLog(\"[ClipboardStore] removeItem - item not found\", { itemId });\n return;\n }\n\n devLog(\"[ClipboardStore] removeItem\", {\n itemId,\n remainingCount: updatedItems.length,\n });\n set({ items: updatedItems });\n },\n\n clear: () => {\n const currentCount = get().items.length;\n devLog(\"[ClipboardStore] clear\", { clearedCount: currentCount });\n set({ items: [] });\n },\n }),\n {\n name: \"clipboard-items\",\n version: 2,\n },\n ),\n);\n\nexport default useClipboard;\n"],"mappings":"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","names":["React","cn","jsx","cva","cn","jsx","React","cn","React","cn","jsx","jsx","jsxs","cn","cn","jsx","jsxs","cn","React","cn","jsx","React","Check","cn","jsx","React","Circle","cn","jsx","RadioGroup","CollapsibleTrigger","CollapsibleContent","React","cn","React","cn","jsx","jsxs","jsx","jsxs","cn","React","cn","jsx","jsx","React","cn","useLocale","React","cn","jsx","React","ChevronRight","cn","jsx","jsxs","jsx","jsxs","useLocale","cn","React","cn","jsx","jsxs","cn","React","cn","formatIsoDate","jsx","jsxs","formatIsoDate","cn","React","Check","ChevronDown","cn","jsx","jsxs","cva","cn","React","cn","jsx","jsx","cn","cva","React","cva","cn","jsx","Label","React","cn","jsx","jsxs","React","cn","jsx","Separator","React","cn","jsx","React","DialogPrimitive","X","cn","jsx","jsxs","cn","jsx","cn","Fragment","jsx","jsxs","jsx","jsxs","Icon","cn","jsx","gapMap","alignMap","justifyMap","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn","cn","jsx","cn","jsx","React","cn","jsx","Check","React","cn","React","React","React","jsx","value","disabled","cn","tabStopId","onKeyDown","Check","SeparatorPrimitive","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","ChevronRight","cn","EMPTY_VALUE","warnLog","React","EMPTY_VALUE","codingKey","Fragment","jsx","jsxs","code","resolveCellRenderer","React","Fragment","jsx","jsxs","createContext","useContext","resolveCellRenderer","useMemo","useEffect","useState","useRef","useCallback","Icon","cn","ChevronRight","warnLog","EMPTY_VALUE","jsx","React","useState","EMPTY_VALUE","jsx","jsxs","useState","EMPTY_VALUE","jsx","jsxs","React","React","Check","X","cn","Fragment","jsx","jsxs","Check","cn","X","forwardRef","useImperativeHandle","useMemo","useRef","cn","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","ChevronRight","useVirtualizer","cn","Fragment","jsx","jsxs","ChevronRight","useCallback","useId","useState","useRef","useEffect","useMemo","useVirtualizer","VirtualRows","forwardRef","jsx","jsxs","resolveCellRenderer","cn","useRef","useImperativeHandle","useMemo","forwardRef","React","useMemo","useRef","useState","useEffect","Search","X","ChevronDown","cn","getFieldTitle","useCallback","useEffect","useMemo","useRef","useState","useMemo","useState","useRef","useEffect","textKey","useCallback","useRef","useEffect","jsx","useRef","useEffect","useEffect","useState","cn","jsx","jsxs","useState","useEffect","cn","useEffect","useMemo","useRef","useState","cn","compileDateFormat","formatIsoDate","getLocaleDateFormat","parseDate","parseIsoDate","useLocale","jsx","jsxs","useLocale","useMemo","compileDateFormat","getLocaleDateFormat","useRef","useState","useEffect","formatIsoDate","parseDate","cn","parseIsoDate","Fragment","jsx","jsxs","ChevronDown","cn","getFieldTitle","X","useRef","useState","useEffect","useMemo","React","Search","jsx","X","jsx","jsxs","X","jsx","jsxs","Separator"]}