@petrarca/sonnet-ui 0.1.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/LICENSE.md +190 -0
- package/dist/index.d.ts +989 -0
- package/dist/index.js +5016 -0
- package/dist/index.js.map +1 -0
- package/dist/json-editor/index.d.ts +51 -0
- package/dist/json-editor/index.js +131 -0
- package/dist/json-editor/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/alert.tsx","../src/avatar.tsx","../src/badge.tsx","../src/button.tsx","../src/card.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/command.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/input.tsx","../src/input-group.tsx","../src/textarea.tsx","../src/label.tsx","../src/popover.tsx","../src/scroll-area.tsx","../src/separator.tsx","../src/sheet.tsx","../src/simple-group.tsx","../src/simple-stack.tsx","../src/tooltip.tsx","../src/simple-tooltip.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/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-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\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\";\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 \"flex h-10 w-full rounded-md border border-input bg-background 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 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","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 \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base placeholder:text-muted-foreground focus-visible:outline-none 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 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","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","/**\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\", ...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 }}\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","\"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 { 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\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\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 stateRef.current.steps.set(value, newStep);\n propsRef.current.onValueAdd?.(value);\n store.notify();\n },\n removeStep: (value) => {\n stateRef.current.steps.delete(value);\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 stateRef.current.steps.set(value, updatedStep);\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-6\",\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 = value ? 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 = value ? stepKeys.indexOf(value) : -1;\n const isDisabled = disabled || 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 { Checkbox } from \"../checkbox\";\nimport type { PageMeta, 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 { CellRenderer, PageMeta, PageResult, PaginationState };\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 (normal mode only).\n onRowClick?: (row: TRow) => void;\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 // 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// ---------------------------------------------------------------------------\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) colDef.minSize = col.minWidth;\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}) {\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 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 };\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 } = 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 -- reset when data changes (page navigation, filter).\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n useEffect(() => {\n setRowSelection({});\n }, [data]);\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 selected = Object.keys(rowSelection)\n .filter((k) => rowSelection[k])\n .map(Number)\n .map((i) => dataRows[i])\n .filter((r): r is TRow => r !== undefined);\n onSelectionChangeRef.current(selected);\n }, [rowSelection, selectionMode, dataRows]);\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 });\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// 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\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\nfunction resolveTrailingCols<TRow>(\n rowActions: RowAction<TRow>[] | undefined,\n onRowClick: ((row: TRow) => void) | undefined,\n selectionMode: boolean,\n): TrailingColFlags {\n const hasRowActions = !!(rowActions && rowActions.length > 0);\n const hasChevron = !!(onRowClick && !selectionMode && !hasRowActions);\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 activeRowIndex: number;\n onRowClick: ((row: TRow) => void) | undefined;\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\nfunction DataRow<TRow extends RowData>({\n row,\n index,\n selectionMode,\n activeRowIndex,\n onRowClick,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n}: DataRowProps<TRow>): React.ReactElement {\n return (\n <tr\n key={row.id}\n onClick={() => {\n handleRowClick(\n row,\n index,\n selectionMode,\n onRowClick,\n setActiveRowIndex,\n containerRef,\n );\n }}\n className={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 index === activeRowIndex && selectionMode && \"bg-accent\",\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 <td className=\"px-4 py-3 w-10\">\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </td>\n )}\n </tr>\n );\n}\n\nfunction handleRowClick<TRow extends RowData>(\n row: Row<TRow>,\n index: number,\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\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 } else if (onRowClick) {\n onRowClick(row.original);\n }\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 rowActions,\n } = props;\n\n const { isFiltered, selectionMode } = resolveTableDefaults(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 { hasRowActions, hasChevron, hasTrailingCol } = resolveTrailingCols(\n rowActions,\n onRowClick,\n selectionMode,\n );\n\n const colCount = columns.length + (hasTrailingCol ? 1 : 0);\n\n return (\n <div>\n <div\n ref={selectionMode ? containerRef : undefined}\n tabIndex={selectionMode ? 0 : undefined}\n onKeyDown={selectionMode ? handleKeyDown : undefined}\n className={cn(\"rounded-lg border\", selectionMode && \"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-muted-foreground px-4 py-2.5\"\n style={\n header.column.columnDef.size !== undefined\n ? { width: header.column.columnDef.size }\n : undefined\n }\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-muted-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 activeRowIndex={activeRowIndex}\n onRowClick={onRowClick}\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 is shallow-merged so that\n * the UI schema can override individual keys (e.g. just width) without\n * repeating the full column config.\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).\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 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 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\">—</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\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\">—</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\">—</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 sorted by key name for determinism.\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]) => {\n const config = mergeColumnConfig(key, property, uiSchema);\n return { key, property, config };\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 const unordered = entries\n .filter(({ config }) => config.order === undefined)\n .sort((a, b) => a.key.localeCompare(b.key));\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 * 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 } 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 /** 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 /** 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 onChange,\n onChangeOption,\n onBlur,\n label,\n required,\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 }\n }, [value, options]);\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 <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={handleCommit}\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 handleCommit: () => void;\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 const handleCommit = useCallback(() => {\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 }\n }\n } else if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n buildSimpleExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\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","jsx","React","cn","jsx","CollapsibleTrigger","CollapsibleContent","React","cn","React","cn","jsx","jsx","jsxs","cn","React","Check","cn","jsx","jsxs","React","cn","jsx","cva","cn","React","cn","jsx","jsx","cn","cva","jsx","cn","React","cva","cn","jsx","Label","React","cn","jsx","React","cn","jsx","jsxs","React","cn","jsx","Separator","React","DialogPrimitive","X","cn","jsx","jsxs","cn","jsx","cn","jsx","gapMap","alignMap","justifyMap","React","cn","jsx","jsx","jsxs","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","jsx","jsxs","resolveCellRenderer","React","jsx","jsxs","resolveCellRenderer","useMemo","useEffect","useState","useRef","useCallback","cn","ChevronRight","React","Check","cn","Fragment","jsx","jsxs","Check","cn","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","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","cn","getFieldTitle","X","useRef","useState","useEffect","useMemo","React","Search","jsx","X","jsx","jsxs","X","jsx","jsxs","Separator"]}
|