@petrarca/sonnet-ui 0.5.0 → 0.7.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/README.md +64 -65
- package/dist/index.d.ts +165 -2
- package/dist/index.js +1198 -510
- package/dist/index.js.map +1 -1
- package/dist/json-editor/index.d.ts +4 -2
- package/dist/json-editor/index.js +32 -17
- package/dist/json-editor/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/alert.tsx","../src/avatar.tsx","../src/badge.tsx","../src/button.tsx","../src/icon-button.tsx","../src/tooltip.tsx","../src/simple-tooltip.tsx","../src/card.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/command.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/input.tsx","../src/input-group.tsx","../src/textarea.tsx","../src/label.tsx","../src/popover.tsx","../src/scroll-area.tsx","../src/separator.tsx","../src/resize-handle.tsx","../src/sheet.tsx","../src/simple-group.tsx","../src/simple-stack.tsx","../src/skeleton.tsx","../src/spinner.tsx","../src/tabs.tsx","../src/stepper.tsx","../src/radix/hooks/use-as-ref.ts","../src/radix/hooks/use-isomorphic-layout-effect.ts","../src/radix/hooks/use-lazy-ref.ts","../src/EntityTable/EntityTable.tsx","../src/EntityTable/tableSchema/mergeUiSchema.ts","../src/EntityTable/tableSchema/cellRegistry.ts","../src/EntityTable/tableSchema/cellRenderers.tsx","../src/EntityTable/tableSchema/columnResolver.ts","../src/PropertyList/PropertyList.tsx","../src/PropertyList/PropertyValue.tsx","../src/EntitySelect/EntitySelect.tsx","../src/EntityTree/EntityTree.tsx","../src/TreeView/TreeView.tsx","../src/SearchInput/SearchInput.tsx","../src/SearchInput/useSearchInput.ts","../src/SearchInput/schemaAdapter.ts","../src/SearchInput/widgets/TextSearchWidget.tsx","../src/SearchInput/widgets/EnumSearchWidget.tsx","../src/SearchInput/widgets/resolveSearchWidget.ts","../src/SearchInput/widgets/index.ts","../src/Clipboard/ClipboardButton.tsx","../src/Clipboard/ClipboardItem.tsx","../src/Clipboard/ClipboardMenu.tsx","../src/Clipboard/clipboardStore.ts"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n badgeColor: {\n grape:\n \"border-transparent bg-purple-100 text-purple-800 hover:bg-purple-200 dark:bg-purple-900 dark:text-purple-200 dark:hover:bg-purple-800\",\n blue: \"border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-200 dark:hover:bg-blue-800\",\n green:\n \"border-transparent bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-200 dark:hover:bg-green-800\",\n red: \"border-transparent bg-red-100 text-red-800 hover:bg-red-200 dark:bg-red-900 dark:text-red-200 dark:hover:bg-red-800\",\n orange:\n \"border-transparent bg-orange-100 text-orange-800 hover:bg-orange-200 dark:bg-orange-900 dark:text-orange-200 dark:hover:bg-orange-800\",\n yellow:\n \"border-transparent bg-yellow-100 text-yellow-800 hover:bg-yellow-200 dark:bg-yellow-900 dark:text-yellow-200 dark:hover:bg-yellow-800\",\n teal: \"border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 dark:bg-teal-900 dark:text-teal-200 dark:hover:bg-teal-800\",\n cyan: \"border-transparent bg-cyan-100 text-cyan-800 hover:bg-cyan-200 dark:bg-cyan-900 dark:text-cyan-200 dark:hover:bg-cyan-800\",\n pink: \"border-transparent bg-pink-100 text-pink-800 hover:bg-pink-200 dark:bg-pink-900 dark:text-pink-200 dark:hover:bg-pink-800\",\n indigo:\n \"border-transparent bg-indigo-100 text-indigo-800 hover:bg-indigo-200 dark:bg-indigo-900 dark:text-indigo-200 dark:hover:bg-indigo-800\",\n violet:\n \"border-transparent bg-violet-100 text-violet-800 hover:bg-violet-200 dark:bg-violet-900 dark:text-violet-200 dark:hover:bg-violet-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, badgeColor, ...props }: BadgeProps) {\n return (\n <div\n className={cn(badgeVariants({ variant, badgeColor }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n compact: \"h-7 w-7 p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { SimpleTooltip } from \"./simple-tooltip\";\n\n/**\n * IconButton -- a compact, square icon-only button with an accessible label\n * and a tooltip. The house standard for inline affordances (rename, delete,\n * edit) and small toolbar actions across the Sonnet apps.\n *\n * - `variant` defaults to \"ghost\" (borderless, for inline/hover-reveal rows).\n * Use \"outline\" for standalone toolbar buttons.\n * - `tone=\"destructive\"` tints the hover state red (e.g. delete).\n * - The `label` is both the tooltip text and the aria-label, so the button is\n * always accessible without visible text.\n * - Do not size the icon yourself: the underlying Button forces child SVGs to\n * `size-4` (16px), so pass a bare `<Icon />` (no h-/w- class).\n * - `revealOnHover` applies the house row-action convention: the button is\n * hidden at rest and revealed when the row is hovered or the button is\n * keyboard-focused; a disabled action stays faintly visible (opacity-30)\n * rather than hidden. The row must set the `group/row` class for this.\n *\n * Usage:\n * <IconButton label=\"Delete\" tone=\"destructive\" onClick={...}>\n * <Trash2 />\n * </IconButton>\n *\n * // row-action (parent row has className=\"... group/row\"):\n * <IconButton label=\"Edit\" revealOnHover onClick={...}><Pencil /></IconButton>\n */\nexport interface IconButtonProps\n extends Omit<ButtonProps, \"size\" | \"children\" | \"aria-label\"> {\n /** Tooltip text and accessible label. */\n label: string;\n /** The icon to render. */\n children: React.ReactNode;\n /** Hover tone. \"destructive\" tints hover red. Default \"default\". */\n tone?: \"default\" | \"destructive\";\n /** Tooltip side. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /**\n * Row-action reveal: hidden at rest, shown on row hover (`group/row`) or\n * keyboard focus. Disabled buttons stay at opacity-30 instead of hidden, so\n * the affordance reads as \"present but unavailable\". Default false.\n */\n revealOnHover?: boolean;\n}\n\n// The house row-action reveal convention (matches EntityTable's RowActionCell):\n// hidden until the row is hovered or the button focused; a disabled action\n// stays faintly visible rather than hidden. The `disabled:` variant is used so\n// it overrides Button's base `disabled:opacity-50` (tailwind-merge resolves the\n// conflicting disabled-opacity utilities to this one).\nfunction revealClass(disabled: boolean | undefined): string {\n return disabled\n ? \"disabled:opacity-30 group-hover/row:disabled:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\";\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButton(\n {\n label,\n children,\n tone = \"default\",\n variant = \"ghost\",\n tooltipSide,\n revealOnHover = false,\n className,\n disabled,\n ...props\n },\n ref,\n ) {\n const toneClass =\n variant === \"ghost\"\n ? tone === \"destructive\"\n ? \"text-muted-foreground hover:text-destructive\"\n : \"text-muted-foreground hover:text-foreground\"\n : tone === \"destructive\"\n ? \"hover:text-destructive\"\n : undefined;\n return (\n <SimpleTooltip label={label} side={tooltipSide}>\n <Button\n ref={ref}\n type=\"button\"\n size=\"compact\"\n variant={variant}\n aria-label={label}\n disabled={disabled}\n className={cn(\n toneClass,\n revealOnHover && revealClass(disabled),\n className,\n )}\n {...props}\n >\n {children}\n </Button>\n </SimpleTooltip>\n );\n },\n);\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\ninterface SimpleTooltipProps {\n label: React.ReactNode;\n children: React.ReactElement;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n delayDuration?: number;\n sideOffset?: number;\n}\n\n/**\n * Simplified Tooltip wrapper that matches Mantine's simple API.\n * Usage: <SimpleTooltip label=\"Click me\"><Button>Click</Button></SimpleTooltip>\n */\nexport function SimpleTooltip({\n label,\n children,\n side,\n align,\n delayDuration = 700,\n sideOffset,\n}: SimpleTooltipProps) {\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} align={align} sideOffset={sideOffset}>\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"grid place-content-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","import * as React from \"react\";\nimport { type DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Dialog, DialogContent } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"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","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nexport interface ResizeHandleProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Orientation of the handle bar:\n * - \"vertical\" (default): a vertical bar separating LEFT/RIGHT panes\n * (drag horizontally). Uses `cursor-col-resize`.\n * - \"horizontal\": a horizontal bar separating TOP/BOTTOM panes\n * (drag vertically). Uses `cursor-row-resize`.\n */\n orientation?: \"vertical\" | \"horizontal\";\n /** Length of the centered grip in pixels. Defaults to 48. */\n gripLength?: number;\n}\n\n/**\n * ResizeHandle — a quiet, flat draggable divider between two resizable panes.\n *\n * Renders a wide invisible hit-area with a short centered grip (quiet\n * `bg-border` at rest, `bg-border-strong` on hover), a focus ring, and the\n * correct `role=\"separator\"` / `aria-orientation` / resize cursor. No\n * full-height seam line — the adjacent panes own their own edges.\n *\n * The consumer owns the resize math: wire `onPointerDown` (and optionally\n * `onDoubleClick`, `tabIndex`, `aria-valuenow`/min/max) via props.\n *\n * @example\n * <ResizeHandle\n * orientation=\"vertical\"\n * aria-valuenow={width}\n * aria-valuemin={MIN}\n * aria-valuemax={MAX}\n * onPointerDown={startResize}\n * onDoubleClick={resetWidth}\n * />\n */\nexport const ResizeHandle = React.forwardRef<HTMLDivElement, ResizeHandleProps>(\n (\n { orientation = \"vertical\", gripLength = 48, className, style, ...props },\n ref,\n ) => {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 select-none touch-none items-center justify-center rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n isVertical\n ? \"mx-1 w-2 cursor-col-resize\"\n : \"my-1 h-2 cursor-row-resize\",\n className,\n )}\n style={style}\n {...props}\n >\n {/* Centered short grip — no full-height seam line. */}\n <div\n className=\"pointer-events-none absolute rounded-full bg-border transition-colors group-hover:bg-border-strong\"\n style={\n isVertical\n ? { width: 4, height: gripLength }\n : { height: 4, width: gripLength }\n }\n />\n </div>\n );\n },\n);\nResizeHandle.displayName = \"ResizeHandle\";\n","/**\n * Sheet — a slide-over panel (drawer) built on Radix Dialog.\n * Slides in from the right edge. Used for create/edit/detail operations.\n *\n * SheetContent accepts an optional `offsetTop` (CSS length, e.g. \"3rem\")\n * to push the panel below a fixed header. The overlay is unaffected so the\n * backdrop still covers the full screen.\n */\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Sheet = DialogPrimitive.Root;\nconst SheetTrigger = DialogPrimitive.Trigger;\nconst SheetClose = DialogPrimitive.Close;\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n side?: \"right\" | \"left\";\n /** CSS length (e.g. \"3rem\" or \"0px\") controlling where the panel starts vertically. Internal use — prefer PanelOptions.coverage at the shell API level. */\n offsetTop?: string;\n }\n>(\n (\n { className, children, side = \"right\", offsetTop = \"0px\", style, ...props },\n ref,\n ) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 flex flex-col bg-background shadow-xl transition-transform duration-300 ease-in-out\",\n \"bottom-0 w-[480px] max-w-[90vw] border-l\",\n side === \"right\" &&\n \"right-0 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n side === \"left\" &&\n \"left-0 border-l-0 border-r data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\n className,\n )}\n style={{ top: offsetTop, ...style }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = \"SheetContent\";\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"shrink-0 border-b px-6 py-4\", className)} {...props} />\n);\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = \"SheetTitle\";\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground mt-1\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = \"SheetDescription\";\n\nconst SheetBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex-1 overflow-y-auto px-6 py-4\", className)}\n {...props}\n />\n);\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"shrink-0 border-t px-6 py-4 flex justify-end gap-2\",\n className,\n )}\n {...props}\n />\n);\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetOverlay,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n};\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n \"flex-start\": \"items-start\",\n \"flex-end\": \"items-end\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n \"space-between\": \"justify-between\",\n \"flex-start\": \"justify-start\",\n \"flex-end\": \"justify-end\",\n} as const;\n\nconst wrapMap = {\n wrap: \"flex-wrap\",\n nowrap: \"flex-nowrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n} as const;\n\nconst mtMap: Record<string, string> = {\n xs: \"mt-1\",\n sm: \"mt-2\",\n md: \"mt-4\",\n lg: \"mt-6\",\n xl: \"mt-8\",\n};\n\ninterface SimpleGroupProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n wrap?: keyof typeof wrapMap;\n grow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n mt?: keyof typeof mtMap;\n onClick?: () => void;\n}\n\n/**\n * SimpleGroup - A horizontal flex container component\n *\n * Replaces Mantine's Group with a simpler Tailwind-based implementation.\n * Defaults to flex-row (horizontal layout).\n *\n * @example\n * <SimpleGroup gap=\"sm\" justify=\"between\">\n * <div>Left item</div>\n * <div>Right item</div>\n * </SimpleGroup>\n */\nexport function SimpleGroup({\n children,\n gap = \"md\",\n align,\n justify,\n wrap,\n grow = false,\n className,\n style,\n mt,\n onClick,\n}: SimpleGroupProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n const wrapClass = wrap ? wrapMap[wrap] : undefined;\n const growClass = grow ? \"[&>*]:flex-1\" : undefined;\n const mtClass = mt ? mtMap[mt] : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-row\",\n gapClass,\n alignClass,\n justifyClass,\n wrapClass,\n growClass,\n mtClass,\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n} as const;\n\ninterface SimpleStackProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n className?: string;\n style?: React.CSSProperties;\n h?: number | string;\n}\n\n/**\n * SimpleStack - A vertical flex container component\n *\n * Replaces Mantine's Stack with a simpler Tailwind-based implementation.\n * Defaults to flex-col (vertical stacking).\n *\n * @example\n * <SimpleStack gap=\"md\" align=\"center\">\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </SimpleStack>\n */\nexport function SimpleStack({\n children,\n gap = \"md\",\n align,\n justify,\n className,\n style,\n h,\n}: SimpleStackProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n\n const heightStyle =\n h !== undefined\n ? { height: typeof h === \"number\" ? `${h}px` : h }\n : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n gapClass,\n alignClass,\n justifyClass,\n className,\n )}\n style={{ ...heightStyle, ...style }}\n >\n {children}\n </div>\n );\n}\n","import { cn } from \"@petrarca/sonnet-core\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import { cn } from \"@petrarca/sonnet-core\";\n\ninterface SpinnerProps {\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-2\",\n lg: \"h-12 w-12 border-3\",\n};\n\n/**\n * Simple loading spinner component\n *\n * Replaces Mantine's Loader component\n *\n * @example\n * ```tsx\n * <Spinner />\n * <Spinner size=\"lg\" />\n * <Spinner className=\"text-blue-500\" />\n * ```\n */\nexport function Spinner({ className, size = \"md\" }: SpinnerProps) {\n return (\n <div\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\",\n sizeClasses[size],\n className,\n )}\n role=\"status\"\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Tabs = TabsPrimitive.Root;\n\ninterface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n /** Alignment of tabs: 'start' (left), 'center', or 'end' (right). Default: 'start' */\n align?: \"start\" | \"center\" | \"end\";\n}\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, align = \"start\", ...props }, ref) => {\n const alignClass =\n align === \"center\"\n ? \"justify-center\"\n : align === \"end\"\n ? \"justify-end\"\n : \"justify-start\";\n\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center rounded-md bg-muted p-1 text-muted-foreground\",\n alignClass,\n className,\n )}\n {...props}\n />\n );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"data-[state=inactive]:hidden\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\n/**\n * TabsSeparator -- a thin, non-interactive vertical divider placed inside a\n * TabsList to visually group related triggers (e.g. preview tabs vs. source\n * tabs). Presentational only; not part of the roving-tabindex order.\n */\nconst TabsSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n \"mx-2 h-6 w-0.5 shrink-0 rounded-full bg-muted-foreground/40\",\n className,\n )}\n {...props}\n />\n));\nTabsSeparator.displayName = \"TabsSeparator\";\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsSeparator };\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport {\n Direction as DirectionPrimitive,\n Slot as SlotPrimitive,\n} from \"radix-ui\";\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@petrarca/sonnet-core\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useAsRef } from \"./radix/hooks/use-as-ref\";\nimport { useIsomorphicLayoutEffect } from \"./radix/hooks/use-isomorphic-layout-effect\";\nimport { useLazyRef } from \"./radix/hooks/use-lazy-ref\";\n\nconst ROOT_NAME = \"Stepper\";\nconst LIST_NAME = \"StepperList\";\nconst ITEM_NAME = \"StepperItem\";\nconst TRIGGER_NAME = \"StepperTrigger\";\nconst INDICATOR_NAME = \"StepperIndicator\";\nconst SEPARATOR_NAME = \"StepperSeparator\";\nconst TITLE_NAME = \"StepperTitle\";\nconst DESCRIPTION_NAME = \"StepperDescription\";\nconst CONTENT_NAME = \"StepperContent\";\nconst PREV_NAME = \"StepperPrev\";\nconst NEXT_NAME = \"StepperNext\";\n\nconst ENTRY_FOCUS = \"stepperFocusGroup.onEntryFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\nconst ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\ntype Direction = \"ltr\" | \"rtl\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype NavigationDirection = \"next\" | \"prev\";\ntype ActivationMode = \"automatic\" | \"manual\";\ntype DataState = \"inactive\" | \"active\" | \"completed\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype ListElement = React.ComponentRef<typeof StepperList>;\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>;\n\nfunction getId(\n id: string,\n variant: \"trigger\" | \"content\" | \"title\" | \"description\",\n value: string,\n) {\n return `${id}-${variant}-${value}`;\n}\n\ntype FocusIntent = \"first\" | \"last\" | \"prev\" | \"next\";\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\",\n};\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\"\n ? \"ArrowRight\"\n : key === \"ArrowRight\"\n ? \"ArrowLeft\"\n : key;\n}\n\nfunction getFocusIntent(\n event: React.KeyboardEvent<TriggerElement>,\n dir?: Direction,\n orientation?: Orientation,\n) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key))\n return undefined;\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key))\n return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nfunction focusFirst(\n candidates: React.RefObject<TriggerElement | null>[],\n preventScroll = false,\n) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>(\n (_, index) => array[(startIndex + index) % array.length] as T,\n );\n}\n\n/**\n * Handles Enter/Space key activation for manual and non-interactive modes.\n * Returns true if the event was handled (caller should return early).\n */\nfunction handleActivationKeys(\n event: React.KeyboardEvent<TriggerElement>,\n nonInteractive: boolean,\n activationMode: ActivationMode,\n isDisabled: boolean | undefined,\n triggerRef: React.RefObject<TriggerElement | null>,\n): boolean {\n if (event.key === \"Enter\" && nonInteractive) {\n event.preventDefault();\n return true;\n }\n\n if (\n (event.key === \"Enter\" || event.key === \" \") &&\n activationMode === \"manual\" &&\n !nonInteractive\n ) {\n event.preventDefault();\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click();\n }\n return true;\n }\n\n return false;\n}\n\nfunction hasModifierKey(event: React.KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;\n}\n\n/**\n * Resolves the ordered list of focus candidates based on intent direction.\n */\nfunction resolveFocusCandidates(\n items: ItemData[],\n focusIntent: FocusIntent,\n currentTarget: TriggerElement,\n loop: boolean,\n): React.RefObject<TriggerElement | null>[] {\n let candidateRefs = items.map((item) => item.ref);\n\n if (focusIntent === \"last\") {\n candidateRefs.reverse();\n } else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateRefs.reverse();\n const currentIndex = candidateRefs.findIndex(\n (ref) => ref.current === currentTarget,\n );\n candidateRefs = loop\n ? wrapArray(candidateRefs, currentIndex + 1)\n : candidateRefs.slice(currentIndex + 1);\n }\n\n return candidateRefs;\n}\n\n/**\n * Handles step validation and navigation when the store has validation.\n * Returns true if navigation was handled (caller should return early).\n */\nasync function handleValidatedNavigation(\n store: Store,\n candidateRefs: React.RefObject<TriggerElement | null>[],\n items: ItemData[],\n itemValue: string,\n value: string | undefined,\n steps: Map<string, StepState>,\n): Promise<boolean> {\n if (!store.hasValidation() || candidateRefs.length === 0) return false;\n\n const nextRef = candidateRefs[0];\n const nextElement = nextRef?.current;\n const nextItem = items.find((item) => item.ref.current === nextElement);\n\n if (!nextItem || nextItem.value === itemValue) return false;\n\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value);\n const direction: NavigationDirection =\n targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n if (direction === \"next\") {\n const isValid = await store.setStateWithValidation(\n nextItem.value,\n direction,\n );\n if (!isValid) return true;\n } else {\n store.setState(\"value\", nextItem.value);\n }\n\n queueMicrotask(() => nextElement?.focus());\n return true;\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: \"item\" | \"separator\" = \"item\",\n): DataState {\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.indexOf(itemValue);\n\n if (stepState?.completed) return \"completed\";\n\n if (value === itemValue) {\n return variant === \"separator\" ? \"inactive\" : \"active\";\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value);\n\n if (activeIndex > currentIndex) return \"completed\";\n }\n\n return \"inactive\";\n}\n\ninterface StepState {\n value: string;\n completed: boolean;\n disabled: boolean;\n}\n\ninterface StoreState {\n steps: Map<string, StepState>;\n value: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStateWithValidation: (\n value: string,\n direction: NavigationDirection,\n ) => Promise<boolean>;\n hasValidation: () => boolean;\n notify: () => void;\n addStep: (value: string, completed: boolean, disabled: boolean) => void;\n removeStep: (value: string) => void;\n setStep: (value: string, completed: boolean, disabled: boolean) => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector],\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface ItemData {\n id: string;\n ref: React.RefObject<TriggerElement | null>;\n value: string;\n active: boolean;\n disabled: boolean;\n}\n\ninterface StepperContextValue {\n rootId: string;\n dir: Direction;\n orientation: Orientation;\n activationMode: ActivationMode;\n disabled: boolean;\n nonInteractive: boolean;\n loop: boolean;\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null);\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperProps extends DivProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onValueComplete?: (value: string, completed: boolean) => void;\n onValueAdd?: (value: string) => void;\n onValueRemove?: (value: string) => void;\n onValidate?: (\n value: string,\n direction: NavigationDirection,\n ) => boolean | Promise<boolean>;\n activationMode?: ActivationMode;\n dir?: Direction;\n orientation?: Orientation;\n disabled?: boolean;\n loop?: boolean;\n nonInteractive?: boolean;\n}\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = \"horizontal\",\n activationMode = \"automatic\",\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? \"\",\n }));\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState(\"value\", value);\n return true;\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction);\n if (isValid) {\n store.setState(\"value\", value);\n }\n return isValid;\n } catch {\n return false;\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, newStep);\n stateRef.current.steps = next;\n propsRef.current.onValueAdd?.(value);\n store.notify();\n },\n removeStep: (value) => {\n const next = new Map(stateRef.current.steps);\n next.delete(value);\n stateRef.current.steps = next;\n propsRef.current.onValueRemove?.(value);\n store.notify();\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value);\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, updatedStep);\n stateRef.current.steps = next;\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed);\n }\n\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef, propsRef]);\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState(\"value\", value);\n }\n }, [value]);\n\n const dir = DirectionPrimitive.useDirection(dirProp);\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n );\n\n const RootPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn(\n \"flex gap-3\",\n orientation === \"horizontal\" ? \"w-full flex-col\" : \"flex-row\",\n className,\n )}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface FocusContextValue {\n tabStopId: string | null;\n onItemFocus: (tabStopId: string) => void;\n onItemShiftTab: () => void;\n onFocusableItemAdd: () => void;\n onFocusableItemRemove: () => void;\n onItemRegister: (item: ItemData) => void;\n onItemUnregister: (id: string) => void;\n getItems: () => ItemData[];\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null);\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext);\n if (!context) {\n throw new Error(\n `\\`${consumerName}\\` must be used within \\`FocusProvider\\``,\n );\n }\n return context;\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props;\n\n const context = useStepperContext(LIST_NAME);\n const orientation = context.orientation;\n const currentValue = useStore((state) => state.value);\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n });\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null);\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const [focusableItemCount, setFocusableItemCount] = React.useState(0);\n const isClickFocusRef = React.useRef(false);\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map());\n const listRef = React.useRef<ListElement>(null);\n const composedRef = useComposedRefs(ref, listRef);\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId);\n }, []);\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true);\n }, []);\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1);\n }, []);\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1);\n }, []);\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item);\n }, []);\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id);\n }, []);\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n }, []);\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event);\n if (event.defaultPrevented) return;\n\n setIsTabbingBackOut(false);\n },\n [propsRef],\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n const isKeyboardFocus = !isClickFocusRef.current;\n if (\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !isTabbingBackOut\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter(\n (item) => !item.disabled,\n );\n const selectedItem = currentValue\n ? items.find((item) => item.value === currentValue)\n : undefined;\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === tabStopId);\n\n const candidateItems = [\n selectedItem,\n activeItem,\n currentItem,\n ...items,\n ].filter(Boolean) as ItemData[];\n const candidateRefs = candidateItems.map((item) => item.ref);\n focusFirst(candidateRefs, false);\n }\n }\n isClickFocusRef.current = false;\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event);\n\n if (event.defaultPrevented) return;\n\n isClickFocusRef.current = true;\n },\n [propsRef],\n );\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n );\n\n const ListPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n \"flex outline-none\",\n orientation === \"horizontal\"\n ? \"flex-row items-center\"\n : \"flex-col items-start\",\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n );\n}\n\ninterface StepperItemContextValue {\n value: string;\n stepState: StepState | undefined;\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(\n null,\n);\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperItemProps extends DivProps {\n value: string;\n completed?: boolean;\n disabled?: boolean;\n}\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props;\n\n const context = useStepperContext(ITEM_NAME);\n const store = useStoreContext(ITEM_NAME);\n const orientation = context.orientation;\n const value = useStore((state) => state.value);\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled);\n\n return () => {\n store.removeStep(itemValue);\n };\n }, [itemValue, completed, disabled]);\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled);\n }, [itemValue, completed, disabled]);\n\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n \"relative flex not-last:flex-1 items-center\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n );\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props;\n\n const context = useStepperContext(TRIGGER_NAME);\n const itemContext = useStepperItemContext(TRIGGER_NAME);\n const itemValue = itemContext.value;\n\n const store = useStoreContext(TRIGGER_NAME);\n const focusContext = useFocusContext(TRIGGER_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const stepState = useStore((state) => state.steps.get(itemValue));\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n });\n\n const activationMode = context.activationMode;\n const orientation = context.orientation;\n const loop = context.loop;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue);\n\n const stepPosition = stepIndex + 1;\n const stepCount = steps.size;\n\n const triggerId = getId(context.rootId, \"trigger\", itemValue);\n const contentId = getId(context.rootId, \"content\", itemValue);\n const titleId = getId(context.rootId, \"title\", itemValue);\n const descriptionId = getId(context.rootId, \"description\", itemValue);\n\n const isDisabled = disabled || stepState?.disabled || context.disabled;\n const isActive = value === itemValue;\n const isTabStop = focusContext.tabStopId === triggerId;\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const triggerRef = React.useRef<TriggerElement>(null);\n const composedRef = useComposedRefs(ref, triggerRef);\n const isArrowKeyPressedRef = React.useRef(false);\n const isMouseClickRef = React.useRef(false);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true;\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false;\n }\n document.addEventListener(\"keydown\", onKeyDown);\n document.addEventListener(\"keyup\", onKeyUp);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keyup\", onKeyUp);\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n });\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd();\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId);\n if (!isDisabled) {\n focusContext.onFocusableItemRemove();\n }\n };\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled]);\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented) return;\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n },\n [\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n focusContext.onItemFocus(triggerId);\n\n const isKeyboardFocus = !isMouseClickRef.current;\n\n if (\n !isActive &&\n !isDisabled &&\n activationMode !== \"manual\" &&\n !context.nonInteractive &&\n isKeyboardFocus\n ) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n\n isMouseClickRef.current = false;\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (\n handleActivationKeys(\n event,\n context.nonInteractive,\n activationMode,\n isDisabled,\n triggerRef,\n )\n )\n return;\n\n if (event.key === \"Tab\" && event.shiftKey) {\n focusContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== event.currentTarget) return;\n\n const focusIntent = getFocusIntent(event, context.dir, orientation);\n\n if (focusIntent !== undefined) {\n if (hasModifierKey(event)) return;\n event.preventDefault();\n\n const items = focusContext.getItems().filter((item) => !item.disabled);\n const candidateRefs = resolveFocusCandidates(\n items,\n focusIntent,\n event.currentTarget,\n loop,\n );\n\n const didNavigate = await handleValidatedNavigation(\n store,\n candidateRefs,\n items,\n itemValue,\n value,\n steps,\n );\n if (didNavigate) return;\n\n queueMicrotask(() => focusFirst(candidateRefs));\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n isMouseClickRef.current = true;\n\n if (isDisabled) {\n event.preventDefault();\n } else {\n focusContext.onItemFocus(triggerId);\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n );\n\n const TriggerPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? \"step\" : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? \"\" : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full\",\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n );\n}\n\ninterface StepperIndicatorProps extends Omit<DivProps, \"children\"> {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode);\n}\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props;\n\n const context = useStepperContext(INDICATOR_NAME);\n const itemContext = useStepperItemContext(INDICATOR_NAME);\n\n const value = useStore((state) => state.value);\n const itemValue = itemContext.value;\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1;\n\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const IndicatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground\",\n className,\n )}\n >\n {typeof children === \"function\" ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === \"completed\" ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n );\n}\n\ninterface StepperSeparatorProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const {\n className,\n asChild,\n forceMount = false,\n ref,\n ...separatorProps\n } = props;\n\n const context = useStepperContext(SEPARATOR_NAME);\n const itemContext = useStepperItemContext(SEPARATOR_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const orientation = context.orientation;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value);\n\n const isLastStep = stepIndex === steps.size - 1;\n\n if (isLastStep && !forceMount) return null;\n\n const dataState = getDataState(\n value,\n itemContext.value,\n itemContext.stepState,\n steps,\n \"separator\",\n );\n\n const SeparatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n \"bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary\",\n orientation === \"horizontal\" ? \"h-px flex-1\" : \"h-10 w-px\",\n className,\n )}\n />\n );\n}\n\ninterface StepperTitleProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props;\n\n const context = useStepperContext(TITLE_NAME);\n const itemContext = useStepperItemContext(TITLE_NAME);\n\n const titleId = getId(context.rootId, \"title\", itemContext.value);\n\n const TitlePrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn(\"font-medium text-sm\", className)}\n />\n );\n}\n\ninterface StepperDescriptionProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props;\n\n const context = useStepperContext(DESCRIPTION_NAME);\n const itemContext = useStepperItemContext(DESCRIPTION_NAME);\n\n const descriptionId = getId(context.rootId, \"description\", itemContext.value);\n\n const DescriptionPrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn(\"text-muted-foreground text-xs\", className)}\n />\n );\n}\n\ninterface StepperContentProps extends DivProps {\n value: string;\n forceMount?: boolean;\n}\n\nfunction StepperContent(props: StepperContentProps) {\n const {\n value: valueProp,\n asChild,\n forceMount = false,\n ref,\n className,\n ...contentProps\n } = props;\n\n const context = useStepperContext(CONTENT_NAME);\n const value = useStore((state) => state.value);\n\n const contentId = getId(context.rootId, \"content\", valueProp);\n const triggerId = getId(context.rootId, \"trigger\", valueProp);\n\n if (valueProp !== value && !forceMount) return null;\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn(\"flex-1 outline-none\", className)}\n />\n );\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled = disabled || currentIndex <= 0;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const prevIndex = Math.max(currentIndex - 1, 0);\n const prevStepValue = stepKeys[prevIndex];\n\n if (prevStepValue) {\n store.setState(\"value\", prevStepValue);\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const PrevPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <PrevPrimitive\n type=\"button\"\n data-slot=\"stepper-prev\"\n disabled={isDisabled}\n {...prevProps}\n onClick={onClick}\n />\n );\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props;\n\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled =\n disabled || stepKeys.length === 0 || currentIndex >= stepKeys.length - 1;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1);\n const nextStepValue = stepKeys[nextIndex];\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, \"next\");\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const NextPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <NextPrimitive\n type=\"button\"\n data-slot=\"stepper-next\"\n disabled={isDisabled}\n {...nextProps}\n onClick={onClick}\n />\n );\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n};\n","import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n","import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n","/**\n * EntityTable -- generic paginated table driven by JSON Schema + UI Schema.\n *\n * Column definitions are derived from schema.properties via resolveColumns().\n * Domain-specific cell rendering is handled by passing a local renderer\n * registry via the renderers prop; x-ui-cell names in the schema are\n * resolved against the local registry first, then the global registry.\n *\n * Pagination is opt-in. When pagination + onPaginationChange are provided the\n * table runs in manualPagination mode and renders prev/next controls.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click on a row calls onRowClick\n * directly (navigation / edit). No keyboard focus management.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, arrow keys navigate rows, Space toggles selection on the\n * focused row, Enter is suppressed. The parent receives selected rows\n * via onSelectionChange.\n *\n * Extractable to @petrarca/sonnet-ui.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type Row,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useComponentDefaults } from \"@petrarca/sonnet-core/config\";\nimport { Checkbox } from \"../checkbox\";\nimport type { PageResult } from \"@petrarca/sonnet-core\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"./tableSchema\";\n\nexport type { PageMeta } from \"@petrarca/sonnet-core\";\nexport type { CellRenderer, PageResult, PaginationState };\n\n/** How a row's detail (onRowClick) is opened. */\nexport type RowActivation = \"click\" | \"double-click\";\n\n/**\n * Props of EntityTable that can be defaulted app-wide via SonnetConfigProvider.\n * Behavioral, non-data props only.\n */\nexport interface EntityTableConfigurable {\n rowActivation: RowActivation;\n showChevron: boolean;\n}\n\ndeclare module \"@petrarca/sonnet-core\" {\n interface SonnetComponentDefaults {\n EntityTable?: { defaultProps?: Partial<EntityTableConfigurable> };\n }\n}\n\n/** Declarative row action rendered as a button in a trailing \"Actions\" column. */\nexport interface RowAction<TRow> {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n variant?: \"default\" | \"destructive\" | \"ghost\";\n onClick: (row: TRow) => void;\n hidden?: (row: TRow) => boolean;\n disabled?: (row: TRow) => boolean;\n}\n\nconst coreRowModel = getCoreRowModel();\n\nexport interface EntityTableProps<TRow extends RowData> {\n // Column definition via JSON Schema + optional UI Schema overlay.\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n\n // Local cell renderer registry. Checked before the global registry\n // for domain-specific renderers that only apply to this table.\n renderers?: Record<string, CellRenderer>;\n\n // Data\n data: PageResult<TRow> | undefined;\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n\n // Empty state\n entityLabel: string;\n isFiltered?: boolean;\n emptyMessage?: string;\n\n // Row interaction -- opens detail/edit panel.\n onRowClick?: (row: TRow) => void;\n\n /**\n * How onRowClick (open detail) is triggered. Resolved against app-wide\n * config (SonnetConfigProvider) then the built-in default \"click\".\n *\n * \"click\" -- single-click on a row opens detail (default,\n * preserves existing behavior). The chevron is a\n * non-interactive affordance.\n * \"double-click\" -- single-click sets the active row (and fires\n * onActiveRowChange); double-click, or clicking the\n * trailing chevron button, opens detail.\n */\n rowActivation?: RowActivation;\n\n /**\n * Fired when the active (single-selected) row changes. Only meaningful when\n * rowActivation is \"double-click\" and selectionMode is off. null when the\n * active row is cleared.\n */\n onActiveRowChange?: (row: TRow | null) => void;\n\n /**\n * Whether to show the trailing chevron column. Resolved against app-wide\n * config then a built-in default of \"show when onRowClick is set\". In\n * \"double-click\" mode the chevron is an interactive button that opens detail.\n */\n showChevron?: boolean;\n\n // Selection mode (opt-in). When true: checkboxes appear, click toggles\n // selection, pencil/edit gestures are suppressed. When false (default):\n // normal browse/edit behavior with active row and pencil icon.\n selectionMode?: boolean;\n onSelectionChange?: (selectedRows: TRow[]) => void;\n\n // Server-side pagination (opt-in)\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n\n // Declarative row actions rendered in a trailing \"Actions\" column.\n // Only shown when at least one action is provided.\n rowActions?: RowAction<TRow>[];\n}\n\n// ---------------------------------------------------------------------------\n// Defaults resolver -- moves default-param branches out of EntityTable.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedDefaults {\n isFiltered: boolean;\n selectionMode: boolean;\n}\n\nfunction resolveTableDefaults(props: {\n isFiltered?: boolean;\n selectionMode?: boolean;\n}): ResolvedDefaults {\n return {\n isFiltered: props.isFiltered ?? false,\n selectionMode: props.selectionMode ?? false,\n };\n}\n\n// App-wide-configurable behavioral props (rowActivation, showChevron) are\n// resolved here: instance prop > SonnetConfigProvider default > built-in.\nconst ENTITY_TABLE_BUILTIN: EntityTableConfigurable = {\n rowActivation: \"click\",\n showChevron: true,\n};\n\ninterface ResolvedActivation {\n rowActivation: RowActivation;\n // showChevron is only meaningful when onRowClick exists; when explicitly set\n // to false the chevron column is suppressed.\n showChevron: boolean;\n}\n\nfunction useResolvedActivation(props: {\n rowActivation?: RowActivation;\n showChevron?: boolean;\n}): ResolvedActivation {\n const resolved = useComponentDefaults<Record<string, unknown>>(\n \"EntityTable\",\n ENTITY_TABLE_BUILTIN as unknown as Record<string, unknown>,\n {\n rowActivation: props.rowActivation,\n showChevron: props.showChevron,\n } as Record<string, unknown>,\n );\n return {\n rowActivation: resolved.rowActivation as RowActivation,\n showChevron: resolved.showChevron as boolean,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Column builders (unchanged)\n// ---------------------------------------------------------------------------\n\n/** Build TanStack ColumnDef[] from resolved column descriptors. */\nfunction buildColumnDefs<TRow extends RowData>(\n resolved: ResolvedColumn[],\n localRenderers?: Record<string, CellRenderer>,\n): ColumnDef<TRow>[] {\n return resolved.map((col) => {\n const Renderer = resolveCellRenderer(col.cellRenderer, localRenderers);\n const options = col.cellOptions;\n const colDef: ColumnDef<TRow> = {\n id: col.key,\n accessorKey: col.key,\n header: col.label,\n cell: ({\n getValue,\n row,\n }: {\n getValue: () => unknown;\n row: Row<TRow>;\n }) => (\n <Renderer\n value={getValue()}\n row={row.original as Record<string, unknown>}\n options={options}\n />\n ),\n };\n if (col.width !== undefined) colDef.size = col.width;\n if (col.minWidth !== undefined) 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// useActiveRowEvent -- single-active-row activation + neutral change event.\n// ---------------------------------------------------------------------------\n\n/**\n * In single-active-row mode (rowActivation \"double-click\", not selectionMode),\n * returns a handler that sets the active row, and fires the neutral\n * onActiveRowChange whenever the active row changes -- independent of whether\n * the change came from a click, keyboard, or data update. In all other modes\n * the returned handler only moves the active index and no event fires.\n */\nfunction useActiveRowEvent<TRow extends RowData>(args: {\n selectionMode: boolean;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n onActiveRowChange: ((row: TRow | null) => void) | undefined;\n activeRowIndex: number;\n dataRows: TRow[];\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n}): (index: number) => void {\n const {\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n } = args;\n\n const singleActiveMode =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n\n const onChangeRef = useRef(onActiveRowChange);\n onChangeRef.current = onActiveRowChange;\n\n useEffect(() => {\n if (!singleActiveMode) return;\n const row = activeRowIndex >= 0 ? (dataRows[activeRowIndex] ?? null) : null;\n onChangeRef.current?.(row);\n }, [singleActiveMode, activeRowIndex, dataRows]);\n\n return useCallback(\n (index: number) => setActiveRowIndex(index),\n [setActiveRowIndex],\n );\n}\n\n// ---------------------------------------------------------------------------\n// useTableKeyboard -- keyboard navigation handler.\n// ---------------------------------------------------------------------------\n\nfunction useTableKeyboard<TRow extends RowData>(\n table: ReturnType<typeof useReactTable<TRow>>,\n activeRowIndex: number,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n return useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const tableRows = table.getRowModel().rows;\n if (tableRows.length === 0) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.min(prev + 1, tableRows.length - 1));\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.max(prev - 1, 0));\n break;\n }\n case \"Enter\": {\n handleEnterKey(\n e,\n tableRows,\n selectionMode,\n activeRowIndex,\n onRowClick,\n );\n break;\n }\n case \" \": {\n handleSpaceKey(e, tableRows, selectionMode, activeRowIndex);\n break;\n }\n }\n },\n [activeRowIndex, onRowClick, selectionMode, table, setActiveRowIndex],\n );\n}\n\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 showChevron: boolean,\n): TrailingColFlags {\n const hasRowActions = !!(rowActions && rowActions.length > 0);\n const hasChevron = !!(\n onRowClick &&\n showChevron &&\n !selectionMode &&\n !hasRowActions\n );\n return {\n hasRowActions,\n hasChevron,\n hasTrailingCol: hasRowActions || hasChevron,\n };\n}\n\n// ---------------------------------------------------------------------------\n// StatusRows sub-component\n// ---------------------------------------------------------------------------\n\ninterface StatusRowsProps {\n isLoading: boolean;\n isError: boolean;\n errorMessage: string | undefined;\n entityLabel: string;\n isFiltered: boolean;\n emptyMessage: string | undefined;\n isEmpty: boolean;\n colCount: number;\n}\n\nfunction StatusRows({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n isFiltered,\n emptyMessage,\n isEmpty,\n colCount,\n}: StatusRowsProps): React.ReactElement | null {\n if (isLoading) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n Loading...\n </td>\n </tr>\n );\n }\n if (isError) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-destructive\"\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </td>\n </tr>\n );\n }\n if (isEmpty) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {resolveEmptyMessage(emptyMessage, isFiltered, entityLabel)}\n </td>\n </tr>\n );\n }\n return null;\n}\n\nfunction resolveEmptyMessage(\n emptyMessage: string | undefined,\n isFiltered: boolean,\n entityLabel: string,\n): string {\n if (emptyMessage) return emptyMessage;\n if (isFiltered) return `No ${entityLabel} match your search.`;\n return `No ${entityLabel} yet.`;\n}\n\n// ---------------------------------------------------------------------------\n// RowActionCell sub-component\n// ---------------------------------------------------------------------------\n\ninterface RowActionCellProps<TRow> {\n actions: RowAction<TRow>[];\n rowOriginal: TRow;\n}\n\nfunction RowActionCell<TRow>({\n actions,\n rowOriginal,\n}: RowActionCellProps<TRow>): React.ReactElement {\n return (\n <td className=\"px-4 py-3 w-24 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {actions.map((action) => (\n <ActionButton\n key={action.label}\n action={action}\n rowOriginal={rowOriginal}\n />\n ))}\n </div>\n </td>\n );\n}\n\ninterface ActionButtonProps<TRow> {\n action: RowAction<TRow>;\n rowOriginal: TRow;\n}\n\nfunction ActionButton<TRow>({\n action,\n rowOriginal,\n}: ActionButtonProps<TRow>): React.ReactElement | null {\n const isHidden = action.hidden?.(rowOriginal);\n if (isHidden) return null;\n const isDisabled = action.disabled?.(rowOriginal);\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n title={action.label}\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick(rowOriginal);\n }}\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n action.variant === \"destructive\"\n ? \"text-destructive hover:bg-destructive/10\"\n : \"text-muted-foreground hover:bg-accent\",\n isDisabled\n ? \"opacity-30 cursor-not-allowed group-hover/row:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\",\n )}\n >\n {Icon ? (\n <Icon className=\"h-3.5 w-3.5\" />\n ) : (\n <span className=\"text-xs\">{action.label}</span>\n )}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DataRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface DataRowProps<TRow extends RowData> {\n row: Row<TRow>;\n index: number;\n selectionMode: boolean;\n rowActivation: RowActivation;\n activeRowIndex: number;\n onRowClick: ((row: TRow) => void) | undefined;\n onActivateRow: (index: number) => void;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n hasRowActions: boolean;\n hasChevron: boolean;\n rowActions: RowAction<TRow>[] | undefined;\n}\n\n// Trailing chevron cell. Decorative in \"click\" mode; an interactive\n// \"open detail\" button in \"double-click\" mode (single-click selects instead).\nfunction ChevronCell<TRow>({\n rowOriginal,\n rowActivation,\n onRowClick,\n}: {\n rowOriginal: TRow;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n}): React.ReactElement {\n const asButton = rowActivation === \"double-click\" && !!onRowClick;\n return (\n <td className=\"px-4 py-3 w-10\">\n {asButton ? (\n <button\n type=\"button\"\n title=\"Open\"\n onClick={(e) => {\n e.stopPropagation();\n onRowClick!(rowOriginal);\n }}\n className=\"inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </td>\n );\n}\n\nfunction rowClassName<TRow extends RowData>(\n row: Row<TRow>,\n isActive: boolean,\n selectionMode: boolean,\n singleClickSelects: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): string {\n return cn(\n \"border-b last:border-b-0 transition-colors group/row\",\n onRowClick && !selectionMode && \"hover:bg-accent/50 cursor-pointer\",\n selectionMode && \"cursor-default\",\n row.getIsSelected() && \"bg-primary/10\",\n isActive && selectionMode && \"bg-accent\",\n isActive && singleClickSelects && \"bg-primary/10\",\n );\n}\n\nfunction DataRow<TRow extends RowData>({\n row,\n index,\n selectionMode,\n rowActivation,\n activeRowIndex,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n}: DataRowProps<TRow>): React.ReactElement {\n // In double-click mode a single click selects (sets active row); detail is\n // opened by double-click or the chevron button. In click mode a single click\n // opens detail directly (existing behavior).\n const singleClickSelects =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n const isActive = index === activeRowIndex;\n return (\n <tr\n key={row.id}\n onClick={() => {\n handleRowClick(\n row,\n index,\n selectionMode,\n rowActivation,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n );\n }}\n onDoubleClick={() => {\n if (singleClickSelects && onRowClick) onRowClick(row.original);\n }}\n className={rowClassName(\n row,\n isActive,\n selectionMode,\n singleClickSelects,\n onRowClick,\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n {hasRowActions && (\n <RowActionCell actions={rowActions!} rowOriginal={row.original} />\n )}\n {hasChevron && (\n <ChevronCell\n rowOriginal={row.original}\n rowActivation={rowActivation}\n onRowClick={onRowClick}\n />\n )}\n </tr>\n );\n}\n\nfunction handleRowClick<TRow extends RowData>(\n row: Row<TRow>,\n index: number,\n selectionMode: boolean,\n rowActivation: RowActivation,\n onRowClick: ((row: TRow) => void) | undefined,\n onActivateRow: (index: number) => void,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n containerRef: React.RefObject<HTMLDivElement | null>,\n): void {\n if (selectionMode) {\n row.toggleSelected();\n setActiveRowIndex(index);\n containerRef.current?.focus();\n return;\n }\n if (rowActivation === \"double-click\" && onRowClick) {\n // Single click selects the active row; detail opens on double-click.\n onActivateRow(index);\n return;\n }\n if (onRowClick) onRowClick(row.original);\n}\n\n// ---------------------------------------------------------------------------\n// TableFooter sub-component\n// ---------------------------------------------------------------------------\n\ninterface TableFooterProps<TRow extends RowData> {\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n dataRows: TRow[];\n entityLabel: string;\n table: ReturnType<typeof useReactTable<TRow>>;\n}\n\nfunction TableFooter<TRow extends RowData>({\n isPaginated,\n data,\n dataRows,\n entityLabel,\n table,\n}: TableFooterProps<TRow>): React.ReactElement | null {\n if (!data?.meta) return null;\n if (isPaginated) {\n return <PaginationFooter table={table} entityLabel={entityLabel} />;\n }\n return (\n <p className=\"text-xs text-muted-foreground mt-3\">\n Showing {dataRows.length} of {data.meta.total} {entityLabel}\n </p>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EntityTable -- main component\n// ---------------------------------------------------------------------------\n\nexport function EntityTable<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n): React.ReactElement {\n const {\n data,\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n onRowClick,\n onActiveRowChange,\n rowActions,\n } = props;\n\n const { isFiltered, selectionMode } = resolveTableDefaults(props);\n const { rowActivation, showChevron } = useResolvedActivation(props);\n\n const {\n table,\n dataRows,\n isPaginated,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n } = useEntityTableState(props, selectionMode);\n\n const handleKeyDown = useTableKeyboard(\n table,\n activeRowIndex,\n setActiveRowIndex,\n selectionMode,\n onRowClick,\n );\n\n const handleActivateRow = useActiveRowEvent({\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n });\n\n const { hasRowActions, hasChevron, hasTrailingCol } = resolveTrailingCols(\n rowActions,\n onRowClick,\n selectionMode,\n showChevron,\n );\n\n const colCount = columns.length + (hasTrailingCol ? 1 : 0);\n\n 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 rowActivation={rowActivation}\n activeRowIndex={activeRowIndex}\n onRowClick={onRowClick}\n onActivateRow={handleActivateRow}\n setActiveRowIndex={setActiveRowIndex}\n containerRef={containerRef}\n hasRowActions={hasRowActions}\n hasChevron={hasChevron}\n rowActions={rowActions}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n <TableFooter\n isPaginated={isPaginated}\n data={data}\n dataRows={dataRows}\n entityLabel={entityLabel}\n table={table}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PaginationFooter (unchanged)\n// ---------------------------------------------------------------------------\n\ninterface PaginationFooterProps<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n entityLabel: string;\n}\n\nfunction PaginationFooter<TRow extends RowData>({\n table,\n entityLabel,\n}: PaginationFooterProps<TRow>): React.ReactElement {\n const { pageIndex, pageSize } = table.getState().pagination;\n const rowCount = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = rowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min((pageIndex + 1) * pageSize, rowCount);\n\n return (\n <div className=\"flex items-center justify-between mt-3\">\n <p className=\"text-xs text-muted-foreground\">\n {rowCount === 0\n ? `No ${entityLabel}`\n : `Showing ${from}\\u2013${to} of ${rowCount} ${entityLabel}`}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Previous\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {pageCount > 0 ? `${pageIndex + 1} / ${pageCount}` : \"--\"}\n </span>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Merge base schema x-ui-column/x-ui-cell annotations with UI schema overrides.\n *\n * UI schema wins on all conflicts. x-ui-column 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 ConditionalBadgeCell,\n DateCell,\n DateTimeCell,\n BooleanCell,\n NumberCell,\n TruncateCell,\n OverflowListCell,\n JoinCell,\n type CellRenderer,\n type CellRendererProps,\n} from \"./cellRenderers\";\n\nexport type { CellRenderer };\n\n/** Registry mapping renderer names to components. */\nexport const CELL_RENDERERS: Record<string, CellRenderer> = {\n text: TextCell,\n muted: MutedCell,\n bold: BoldCell,\n code: CodeCell,\n badge: BadgeCell,\n \"badge-when\": ConditionalBadgeCell,\n date: DateCell,\n datetime: DateTimeCell,\n boolean: BooleanCell,\n number: NumberCell,\n truncate: TruncateCell,\n \"overflow-list\": OverflowListCell,\n join: JoinCell,\n};\n\n/**\n * Infer a default renderer name from a property's type and format.\n * Used when no explicit x-ui-cell is set.\n */\nexport function inferCellRenderer(\n type: string | undefined,\n format: string | undefined,\n): string {\n if (type === \"boolean\") return \"boolean\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"string\") {\n if (format === \"date-time\") return \"datetime\";\n if (format === \"date\") return \"date\";\n }\n return \"text\";\n}\n\n/**\n * Resolve a cell renderer by name.\n * Checks the optional local registry first, then the global registry,\n * then falls back to TextCell.\n */\nexport function resolveCellRenderer(\n name: string,\n localRenderers?: Record<string, CellRenderer>,\n): CellRenderer {\n return localRenderers?.[name] ?? CELL_RENDERERS[name] ?? TextCell;\n}\n\n/**\n * Factory for creating typed local cell renderers.\n *\n * Local renderer names must start with `x-` to distinguish them from\n * built-in renderers (e.g. `x-audit-actors`, `x-trade-risk`). This\n * follows the same convention as the `x-ui-*` schema extensions.\n * Built-in names like `badge`, `datetime`, `muted` stay clean and\n * unprefixed. A dev-mode warning is logged if the convention is violated.\n *\n * The render function receives the full typed row and the x-ui-cell-options\n * from the schema. This keeps the schema purely declarative (no functions)\n * while giving domain-specific renderers full type safety.\n *\n * For generic table viewers where the row type is not known, omit the\n * type parameter -- TRow defaults to Record<string, unknown> and you\n * inspect the row dynamically using options as hints.\n *\n * @example\n * ```ts\n * import { createRenderer } from \"@petrarca/sonnet-ui\";\n * import type { AuditLogEntry } from \"../schemas\";\n *\n * const RENDERERS = {\n * \"x-audit-actors\": createRenderer<AuditLogEntry>((row, options) => {\n * // row is fully typed, options from x-ui-cell-options in the schema.\n * return <span>{row.actors[0]?.name ?? \"--\"}</span>;\n * }),\n * };\n *\n * // Schema stays pure data:\n * // actors: { \"x-ui-cell\": \"x-audit-actors\" }\n *\n * <EntityTable schema={SCHEMA} renderers={RENDERERS} ... />\n * ```\n */\nexport function createRenderer<TRow = Record<string, unknown>>(\n render: (row: TRow, options: Record<string, unknown>) => React.ReactNode,\n): CellRenderer {\n return ({ row, options }: CellRendererProps) =>\n React.createElement(React.Fragment, null, render(row as TRow, options));\n}\n\n/**\n * Validate that all keys in a local renderer registry follow the x- prefix\n * convention. Logs a warning in dev mode for each violation.\n */\nexport function validateRendererNames(\n renderers: Record<string, CellRenderer>,\n): void {\n for (const name of Object.keys(renderers)) {\n if (!name.startsWith(\"x-\")) {\n warnLog(\n `[EntityTable] Local renderer \"${name}\" should use the x- prefix ` +\n `(e.g. \"x-${name}\"). Built-in renderer names are unprefixed.`,\n );\n }\n }\n}\n","/**\n * Built-in cell renderer components for schema-driven EntityTable.\n *\n * Each renderer is a React component that receives the raw cell value and\n * the merged cell options from x-ui-cell-options. All renderers are\n * display-only -- stateless, no side effects.\n *\n * Cross-cutting options supported by all built-in renderers:\n * valueKey -- extract a sub-field from an object value before rendering\n * nowrap -- apply whitespace-nowrap to the output element\n *\n * Registry, resolution helpers, and the createRenderer factory live in\n * cellRegistry.ts so this file exports only components (react-refresh\n * requirement).\n */\n\nimport React from \"react\";\nimport { Badge, type BadgeProps } from \"../../badge\";\nimport { formatDate, formatDateTime } from \"@petrarca/sonnet-core\";\n\n/** Extract a sub-field when options.valueKey is set, otherwise return value as-is. */\nfunction resolveValue(\n value: unknown,\n options: Record<string, unknown>,\n): unknown {\n const key = options.valueKey as string | undefined;\n if (key && value != null && typeof value === \"object\") {\n return (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Build a className string, appending whitespace-nowrap when options.nowrap is true. */\nfunction cx(base: string, options: Record<string, unknown>): string {\n return options.nowrap\n ? [base, \"whitespace-nowrap\"].filter(Boolean).join(\" \")\n : base;\n}\n\ntype BadgeColor = NonNullable<BadgeProps[\"badgeColor\"]>;\n\nexport interface CellRendererProps {\n value: unknown;\n /** Full row record -- available for renderers that need sibling fields. */\n row: Record<string, unknown>;\n options: Record<string, unknown>;\n}\n\nexport type CellRenderer = (props: CellRendererProps) => React.ReactElement;\n\nexport function TextCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function MutedCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BoldCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-medium\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function CodeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-mono text-xs\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n if (value == null)\n return <span className=\"text-muted-foreground\">—</span>;\n const key = String(value);\n const colors = options.colors as Record<string, BadgeColor> | undefined;\n const labels = options.labels as Record<string, string> | undefined;\n const color = colors?.[key];\n const label = labels?.[key] ?? key;\n return <Badge badgeColor={color}>{label}</Badge>;\n}\n\ntype BadgeVariant = NonNullable<BadgeProps[\"variant\"]>;\ntype ConditionalBadgeWhen = \"empty\" | \"present\" | \"truthy\" | \"falsy\";\ntype ConditionalBadgeFallback = \"dash\" | \"value\" | \"muted-value\";\n\nfunction conditionHolds(value: unknown, when: ConditionalBadgeWhen): boolean {\n const isEmpty = value == null || value === \"\";\n switch (when) {\n case \"empty\":\n return isEmpty;\n case \"present\":\n return !isEmpty;\n case \"truthy\":\n return Boolean(value);\n case \"falsy\":\n return !value;\n }\n}\n\nfunction renderConditionalFallback(\n value: unknown,\n fallback: ConditionalBadgeFallback,\n): React.ReactElement {\n if (fallback === \"dash\" || value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n if (fallback === \"muted-value\") {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\n/**\n * Renders a badge when a condition on the cell value holds, and a configurable\n * fallback otherwise. A generic \"flag/marker\" cell -- e.g. a \"Default\" badge\n * when a boolean is true, or a \"Root\" badge when a parent id is empty.\n *\n * x-ui-cell-options:\n * when: \"empty\" | \"present\" | \"truthy\" | \"falsy\" (default \"truthy\")\n * label: badge text (default: the cell value)\n * variant: Badge variant, e.g. \"outline\" | \"secondary\" (default \"secondary\")\n * fallback: \"dash\" (em dash) | \"value\" | \"muted-value\" (default \"dash\")\n *\n * Carries no domain knowledge -- the condition, label, and styling all come\n * from the schema.\n */\nexport function ConditionalBadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const when = (options.when as ConditionalBadgeWhen | undefined) ?? \"truthy\";\n const variant = (options.variant as BadgeVariant | undefined) ?? \"secondary\";\n const fallback =\n (options.fallback as ConditionalBadgeFallback | undefined) ?? \"dash\";\n\n if (conditionHolds(value, when)) {\n const label =\n options.label != null ? String(options.label) : String(value ?? \"\");\n return <Badge variant={variant}>{label}</Badge>;\n }\n\n return renderConditionalFallback(value, fallback);\n}\n\nexport function DateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDate(value as string | null)}\n </span>\n );\n}\n\nexport function DateTimeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDateTime(value as string | null)}\n </span>\n );\n}\n\nexport function BooleanCell({ value }: CellRendererProps): React.ReactElement {\n return (\n <span className={value ? \"text-green-600\" : \"text-muted-foreground\"}>\n {value ? \"Yes\" : \"No\"}\n </span>\n );\n}\n\nexport function NumberCell({ value }: CellRendererProps): React.ReactElement {\n const text = value == null ? \"\\u2014\" : String(value);\n return <span className=\"tabular-nums\">{text}</span>;\n}\n\nexport function TruncateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const resolved = resolveValue(value, options);\n const text = resolved == null ? \"\\u2014\" : String(resolved);\n return (\n <span className=\"block truncate max-w-xs\" title={text}>\n {text}\n </span>\n );\n}\n\n/**\n * Renders the first item of an array with a \"+N\" overflow count.\n *\n * Options:\n * displayKey -- object field to use as the display label\n * fallbackKey -- object field to use when displayKey is null/undefined\n * prefixKey -- object field to render as a muted prefix before the label (e.g. \"type: name\")\n */\nexport function OverflowListCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const items = Array.isArray(value)\n ? (value as Record<string, unknown>[])\n : [];\n if (items.length === 0)\n return <span className=\"text-muted-foreground\">—</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 in schema declaration order. Declaration order (not\n * alphabetical) matches the form renderer and what authors expect; columns\n * that need a specific position set x-ui-column.order.\n * 4. Build ResolvedColumn for each.\n */\nexport function resolveColumns(\n schema: JsonSchema,\n uiSchema?: TableUiSchema,\n): ResolvedColumn[] {\n const properties = schema.properties ?? {};\n\n const entries = Object.entries(properties)\n .map(([key, property], index) => {\n const config = mergeColumnConfig(key, property, uiSchema);\n return { key, property, config, index };\n })\n .filter(({ config }) => !config.hidden);\n\n // Split into ordered and unordered buckets.\n const ordered = entries\n .filter(({ config }) => config.order !== undefined)\n .sort((a, b) => a.config.order! - b.config.order!);\n\n // Unordered columns keep their schema declaration order.\n const unordered = entries\n .filter(({ config }) => config.order === undefined)\n .sort((a, b) => a.index - b.index);\n\n const sorted = [...ordered, ...unordered];\n\n return sorted.map(({ key, property, config }) => {\n const cellRenderer =\n config.cellRenderer ?? inferCellRenderer(property.type, property.format);\n\n // Label priority: UI schema label > x-ui-column.label > property title > key\n const label = config.label ?? property.title ?? keyToLabel(key);\n\n return {\n key,\n label,\n property,\n cellRenderer,\n cellOptions: config.cellOptions,\n width: config.width,\n minWidth: config.minWidth,\n };\n });\n}\n\n/** Convert a snake_case key to a Title Case label as a last-resort fallback. */\nfunction keyToLabel(key: string): string {\n return key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * PropertyList — read-only display of a record's properties.\n *\n * Two layout modes:\n * - `\"inline\"` (default) — horizontal two-column grid, key left / value right.\n * - `\"stacked\"` — key label above each value.\n *\n * Values rendered by {@link PropertyValue}. Optional per-property schema\n * refines value rendering (schema is NOT required).\n *\n * Shared by the graph view's node/edge cards and the table inspector so all\n * property displays look identical.\n */\n\nimport React from \"react\";\nimport { copyTextToClipboard } from \"@petrarca/sonnet-core\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { PropertyValue } from \"./PropertyValue\";\n\n/** Layout mode for the property list. */\nexport type PropertyListLayout = \"inline\" | \"stacked\";\n\nexport interface PropertyListProps {\n /** Property name -> value. */\n properties: Record<string, unknown>;\n /** Optional property name -> schema, to refine value rendering. */\n propertySchemas?: Record<string, JsonSchemaProperty>;\n /** Layout mode. Default \"inline\" (horizontal key-value grid). */\n layout?: PropertyListLayout;\n /** Show a \"Properties\" section header. Default false. */\n showHeader?: boolean;\n /** Click value to copy it to the clipboard. Default true. */\n copyable?: boolean;\n /** Message when there are no properties. Default \"No properties\". */\n emptyLabel?: string;\n className?: string;\n}\n\nexport function PropertyList({\n properties,\n propertySchemas,\n layout = \"inline\",\n showHeader = false,\n copyable = true,\n emptyLabel = \"No properties\",\n className,\n}: PropertyListProps): React.ReactElement {\n const entries = Object.entries(properties ?? {});\n\n if (entries.length === 0) {\n return <p className=\"text-sm text-muted-foreground italic\">{emptyLabel}</p>;\n }\n\n const header = showHeader && (\n <p className=\"text-[11px] text-muted-foreground mb-1.5\">Properties</p>\n );\n\n const dtClass = `text-[11px] text-muted-foreground ${copyable ? \"cursor-pointer hover:text-foreground\" : \"\"}`;\n\n const dtProps = (value: unknown) =>\n copyable\n ? {\n onClick: () => copyTextToClipboard(stringForCopy(value)),\n title: \"Click to copy value\",\n }\n : {};\n\n if (layout === \"stacked\") {\n return (\n <div className={className}>\n {header}\n <dl className=\"space-y-1\">\n {entries.map(([key, value]) => (\n <div key={key}>\n <dt className={dtClass} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground font-medium break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n }\n\n // inline (default): horizontal two-column grid\n return (\n <div className={className}>\n {header}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 items-baseline\">\n {entries.map(([key, value]) => (\n <React.Fragment key={key}>\n <dt className={`${dtClass} whitespace-nowrap`} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground min-w-0 break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </React.Fragment>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction stringForCopy(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n","/**\n * PropertyValue — read-only, type-aware rendering of a single property value.\n *\n * Reliable model (matches graph-explorer best practice): render by the actual\n * VALUE TYPE, never by guessing string contents.\n * - object / array -> collapsed summary that expands to a JSON tree (bounded box)\n * - long string -> clamped to a few lines with a \"Show more\" toggle\n * - scalar -> inline text\n * - boolean -> true/false (or schema boolean cell)\n * - array of scalars-> comma list\n *\n * Schema is OPTIONAL and only REFINES rendering when present:\n * - x-ui-cell / inferred type/format (date, datetime, boolean, number)\n * - x-ui-cell: \"json\" forces a JSON tree even for a string value\n * A plain string is treated as text by default — it is NOT auto-parsed as\n * JSON (avoids fragile, surprising behaviour). Schema is the only signal that\n * turns a JSON-looking string into a tree.\n */\n\nimport React, { useState } from \"react\";\nimport { JSONTree } from \"react-json-tree\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { CELL_RENDERERS } from \"../EntityTable/tableSchema\";\nimport { inferCellRenderer } from \"../EntityTable/tableSchema/cellRegistry\";\n\nexport interface PropertyValueProps {\n value: unknown;\n /** Optional schema for this property; refines rendering when present. */\n schema?: JsonSchemaProperty;\n className?: string;\n /** Strings longer than this clamp with a \"Show more\" toggle. */\n clampChars?: number;\n}\n\nconst DEFAULT_CLAMP_CHARS = 180;\n\n// JSON tree theme driven by semantic tokens (dark-mode aware via CSS vars).\nconst tokenTheme = {\n scheme: \"sonnet\",\n base00: \"transparent\",\n base01: \"hsl(var(--muted))\",\n base02: \"hsl(var(--border))\",\n base03: \"hsl(var(--muted-foreground))\",\n base04: \"hsl(var(--muted-foreground))\",\n base05: \"hsl(var(--foreground))\",\n base06: \"hsl(var(--foreground))\",\n base07: \"hsl(var(--foreground))\",\n base08: \"hsl(var(--destructive))\",\n base09: \"hsl(var(--primary))\",\n base0A: \"hsl(var(--primary))\",\n base0B: \"hsl(var(--primary))\",\n base0C: \"hsl(var(--primary))\",\n base0D: \"hsl(var(--primary))\",\n base0E: \"hsl(var(--primary))\",\n base0F: \"hsl(var(--muted-foreground))\",\n} as const;\n\nfunction isObjectLike(v: unknown): v is object {\n return typeof v === \"object\" && v !== null;\n}\n\n/** Object / array value -> collapsed summary that expands to a JSON tree. */\nfunction JsonValue({ value }: { value: object }): React.ReactElement {\n const [open, setOpen] = useState(false);\n const summary = Array.isArray(value)\n ? `[${value.length} item${value.length === 1 ? \"\" : \"s\"}]`\n : `{${Object.keys(value).length} key${Object.keys(value).length === 1 ? \"\" : \"s\"}}`;\n\n if (!open) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-sm font-mono text-muted-foreground hover:text-foreground\"\n >\n {summary} <span className=\"text-xs\">— show</span>\n </button>\n );\n }\n\n return (\n <div className=\"text-xs font-mono\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"mb-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n hide\n </button>\n <div className=\"max-h-64 overflow-auto rounded border border-border bg-muted/30 px-2 py-1\">\n <JSONTree\n data={value}\n theme={tokenTheme}\n invertTheme={false}\n shouldExpandNodeInitially={() => true}\n hideRoot\n />\n </div>\n </div>\n );\n}\n\n/** Long string -> clamped with a \"Show more\" toggle and bounded scroll on expand. */\nfunction LongTextValue({ text }: { text: string }): React.ReactElement {\n const [open, setOpen] = useState(false);\n if (!open) {\n return (\n <span className=\"break-words\">\n <span className=\"line-clamp-3 align-bottom\">{text}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show more\n </button>\n </span>\n );\n }\n return (\n <span className=\"break-words\">\n <span className=\"block max-h-64 overflow-auto whitespace-pre-wrap rounded border border-border bg-muted/30 px-2 py-1\">\n {text}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show less\n </button>\n </span>\n );\n}\n\n/** Schema-driven rendering; returns null to fall through to value-shape. */\nfunction renderFromSchema(\n value: unknown,\n schema: JsonSchemaProperty,\n className?: string,\n): React.ReactElement | null {\n const cellName =\n schema[\"x-ui-cell\"] ?? inferCellRenderer(schema.type, schema.format);\n // \"json\" forces a tree even for string-typed values.\n if (cellName === \"json\") {\n const parsed = typeof value === \"string\" ? safeParse(value) : value;\n return isObjectLike(parsed) ? <JsonValue value={parsed} /> : null;\n }\n if (cellName && cellName !== \"text\") {\n const Renderer = CELL_RENDERERS[cellName];\n if (Renderer) {\n return (\n <span className={className}>\n <Renderer\n value={value}\n row={{}}\n options={\n (schema[\"x-ui-cell-options\"] as Record<string, unknown>) ?? {}\n }\n />\n </span>\n );\n }\n }\n return null;\n}\n\n/** Object/array value: scalar arrays -> comma list; structured -> JSON tree. */\nfunction renderObjectLike(\n value: object,\n className?: string,\n): React.ReactElement {\n if (Array.isArray(value) && value.every((v) => !isObjectLike(v))) {\n return (\n <span className={`break-words ${className ?? \"\"}`}>\n {value.map(String).join(\", \")}\n </span>\n );\n }\n return <JsonValue value={value} />;\n}\n\n/** String value: text by default; long strings clamp with a \"Show more\" toggle. */\nfunction renderString(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (typeof value === \"boolean\") {\n return <span className={className}>{value ? \"true\" : \"false\"}</span>;\n }\n const str = String(value);\n if (str.length > clampChars || str.includes(\"\\n\")) {\n return (\n <span className={className}>\n <LongTextValue text={str} />\n </span>\n );\n }\n return <span className={`break-words ${className ?? \"\"}`}>{str}</span>;\n}\n\n/** Value-shape rendering (reliable: by type, not by guessing string contents). */\nfunction renderFromValue(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (value == null) {\n return (\n <span className={`text-muted-foreground ${className ?? \"\"}`}>—</span>\n );\n }\n if (isObjectLike(value)) return renderObjectLike(value, className);\n return renderString(value, className, clampChars);\n}\n\nexport function PropertyValue({\n value,\n schema,\n className,\n clampChars = DEFAULT_CLAMP_CHARS,\n}: PropertyValueProps): React.ReactElement {\n const fromSchema = schema ? renderFromSchema(value, schema, className) : null;\n return fromSchema ?? renderFromValue(value, className, clampChars);\n}\n\nfunction safeParse(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return undefined;\n }\n}\n","/**\n * EntitySelect -- async searchable single-select for entity references.\n *\n * Fetches options via a pluggable EntityOptionFetcher. The combobox search\n * input drives server-side filtering through the useEntityOptions hook.\n *\n * Extractable to @petrarca/sonnet-ui -- no app-specific imports.\n */\n\nimport * as React from \"react\";\nimport { Check, ChevronsUpDown, Loader2, X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"../button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport {\n useEntityOptions,\n type EntitySelectMode,\n type UseEntityOptionsReturn,\n} from \"@petrarca/sonnet-core/hooks\";\nimport type {\n EntityOptionFetcher,\n EntityOption,\n} from \"@petrarca/sonnet-core/entityOptions\";\n\nfunction emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n}: {\n mode: EntitySelectMode;\n search: string;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n}): string {\n if (isLoading) return \"Loading...\";\n if (mode === \"eager\") return emptyMessage;\n if (search.length === 0) return \"Start typing to search...\";\n if (mode === \"typeahead\" && search.length < minChars)\n return `Type at least ${minChars} character${minChars > 1 ? \"s\" : \"\"} to search...`;\n if (mode === \"explicit\" && !hasSearched) return \"Press Enter to search...\";\n return emptyMessage;\n}\n\n// Explicit mode tracks whether submit() has ever been called.\nfunction useHasSearched(\n submit: UseEntityOptionsReturn[\"submit\"],\n): [boolean, UseEntityOptionsReturn[\"submit\"]] {\n const [hasSearched, setHasSearched] = React.useState(false);\n const wrappedSubmit = React.useCallback(() => {\n setHasSearched(true);\n submit();\n }, [submit]);\n return [hasSearched, wrappedSubmit];\n}\n\nexport interface EntitySelectProps {\n /** The fetcher that provides options from the backend. */\n fetcher: EntityOptionFetcher;\n /**\n * Stable cache key for TanStack Query. Must be unique per fetcher/endpoint\n * combination -- two components using the same key share the same cache entry.\n */\n queryKey: string;\n /**\n * Search mode. Default: \"eager\".\n * eager -- fetch on mount, refetch as user types (small collections)\n * typeahead -- fetch only after minChars are typed (large collections)\n * explicit -- fetch only when user presses Enter\n */\n mode?: EntitySelectMode;\n /** Minimum characters before typeahead mode fires (default 1). */\n minChars?: number;\n /** Currently selected value (controlled). */\n value?: string | null;\n /**\n * The option for the current value, supplying its label. Use when the\n * selected value is set before any options have loaded (e.g. an edit form\n * in typeahead/explicit mode) so the trigger can render the label without\n * fetching the full list. Must match `value`; ignored otherwise.\n */\n selectedOption?: EntityOption | null;\n /** Called when the selection changes. */\n onChange?: (value: string | null) => void;\n /** Called when the selection changes, passing the full option (value + label). */\n onChangeOption?: (option: EntityOption | null) => void;\n /** Called when the dropdown closes (for form blur tracking). */\n onBlur?: () => void;\n /** Label displayed above the select. Pass false to hide. */\n label?: string | false;\n /** Placeholder when nothing is selected. */\n placeholder?: string;\n /** Placeholder for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Message when no options match the search. */\n emptyMessage?: string;\n /** Whether the field is required (shows asterisk). */\n required?: boolean;\n /**\n * Show a clear (X) affordance that resets the selection to null when a value\n * is set. Use for optional entity references (e.g. an assignment that can be\n * removed). Ignored when required or disabled.\n */\n clearable?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Description text below the label. */\n description?: string;\n /** Error message. */\n error?: string;\n /** Additional className for the wrapper. */\n className?: string;\n /** HTML id for the trigger button. */\n id?: string;\n}\n\nfunction resolveEntitySelectDefaults(props: EntitySelectProps) {\n return {\n mode: props.mode ?? \"eager\",\n minChars: props.minChars ?? 1,\n placeholder: props.placeholder ?? \"Select...\",\n searchPlaceholder: props.searchPlaceholder ?? \"Search...\",\n emptyMessage: props.emptyMessage ?? \"No results found\",\n disabled: props.disabled ?? false,\n } as const;\n}\n\nfunction EntitySelectLabel({\n id,\n label,\n required,\n description,\n}: {\n id?: string;\n label?: string | false;\n required?: boolean;\n description?: string;\n}): React.ReactElement | null {\n const hasLabel = label !== undefined && label !== false;\n return (\n <>\n {hasLabel && (\n <label\n htmlFor={id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </>\n );\n}\n\nfunction EntitySelectDropdown({\n searchPlaceholder,\n search,\n setSearch,\n mode,\n submit,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n options,\n value,\n handleSelect,\n}: {\n searchPlaceholder: string;\n search: string;\n setSearch: (v: string) => void;\n mode: EntitySelectMode;\n submit: () => void;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n options: EntityOption[];\n value?: string | null;\n handleSelect: (v: string) => void;\n}): React.ReactElement {\n return (\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={\n mode === \"explicit\"\n ? (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n }\n }\n : undefined\n }\n />\n <CommandList>\n <CommandEmpty>\n {emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n })}\n </CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={handleSelect}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\nexport function EntitySelect(props: EntitySelectProps): React.ReactElement {\n const {\n fetcher,\n queryKey,\n value,\n selectedOption,\n onChange,\n onChangeOption,\n onBlur,\n label,\n required,\n clearable,\n description,\n error,\n className,\n id,\n } = props;\n const {\n mode,\n minChars,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n } = resolveEntitySelectDefaults(props);\n\n const [open, setOpen] = React.useState(false);\n\n // Retain the label of the selected option independently of whether it\n // appears in the current search results. Without this, clearing the search\n // input after a selection causes the trigger to revert to the placeholder.\n const [selectedLabel, setSelectedLabel] = React.useState<string | null>(null);\n\n const {\n options,\n isLoading,\n search,\n setSearch,\n submit: rawSubmit,\n } = useEntityOptions({ fetcher, queryKey, mode, minChars });\n\n const [hasSearched, submit] = useHasSearched(rawSubmit);\n\n // Sync selectedLabel when value changes externally or when options arrive\n // that contain the current value (e.g. initial load).\n React.useEffect(() => {\n if (!value) {\n setSelectedLabel(null);\n return;\n }\n const found = options.find((opt) => opt.value === value);\n if (found) {\n setSelectedLabel(found.label);\n } else if (selectedOption && selectedOption.value === value) {\n // Seed the label for a pre-selected value before options have loaded\n // (e.g. an edit form in typeahead/explicit mode).\n setSelectedLabel(selectedOption.label);\n }\n }, [value, options, selectedOption]);\n\n const handleClear = React.useCallback(\n (e: React.MouseEvent): void => {\n // Reset to null without opening the dropdown.\n e.preventDefault();\n e.stopPropagation();\n setSelectedLabel(null);\n onChange?.(null);\n onChangeOption?.(null);\n },\n [onChange, onChangeOption],\n );\n\n const showClear = Boolean(clearable && value && !required && !disabled);\n\n const handleSelect = React.useCallback(\n (selectedValue: string) => {\n const opt = options.find((o) => o.value === selectedValue);\n if (opt) setSelectedLabel(opt.label);\n const newValue = selectedValue === value ? null : selectedValue;\n if (newValue === null) setSelectedLabel(null);\n onChange?.(newValue);\n onChangeOption?.(newValue === null ? null : (opt ?? null));\n setOpen(false);\n setSearch(\"\");\n },\n [options, value, onChange, onChangeOption, setSearch],\n );\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n setOpen(newOpen);\n if (!newOpen) {\n setSearch(\"\");\n onBlur?.();\n }\n },\n [onBlur, setSearch],\n );\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <EntitySelectLabel\n id={id}\n label={label}\n required={required}\n description={description}\n />\n\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n \"w-full justify-between\",\n !selectedLabel && \"text-muted-foreground\",\n error && \"border-destructive\",\n )}\n disabled={disabled}\n >\n <span className=\"truncate\">{selectedLabel ?? placeholder}</span>\n <div className=\"flex items-center gap-1\">\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin opacity-50\" />\n )}\n {showClear && (\n <span\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n className=\"rounded-sm opacity-50 hover:opacity-100\"\n onPointerDown={handleClear}\n >\n <X className=\"h-4 w-4 shrink-0\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[--radix-popover-trigger-width] p-0\"\n align=\"start\"\n >\n <EntitySelectDropdown\n searchPlaceholder={searchPlaceholder}\n search={search}\n setSearch={setSearch}\n mode={mode}\n submit={submit}\n minChars={minChars}\n isLoading={isLoading}\n hasSearched={hasSearched}\n emptyMessage={emptyMessage}\n options={options}\n value={value}\n handleSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n\n {error && <p className=\"text-sm font-medium text-destructive\">{error}</p>}\n </div>\n );\n}\n","/**\n * EntityTree -- schema-driven tree component.\n *\n * Wraps TreeView and drives column rendering from a JSON Schema +\n * optional UI Schema, using the same resolveColumns / resolveCellRenderer\n * pipeline as EntityTable. Each visible tree node row renders as a set\n * of schema-derived cells.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click sets active row, pencil\n * icon visible on active/hover rows, Enter/Space triggers onNodeEdit.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, pencil icon is hidden, onNodeEdit is suppressed.\n *\n * Loading, error, and empty states are communicated via node flags and\n * the top-level isLoading / isError / isEmpty props.\n *\n * Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type MutableRefObject,\n} from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { TreeView } from \"../TreeView\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"../EntityTable/tableSchema\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { TreeNode, TreeViewHandle, TreeViewProps } from \"../TreeView\";\n\nexport type { CellRenderer, TableUiSchema, TreeNode };\n\n/** Imperative handle for programmatic focus. */\nexport interface EntityTreeHandle {\n focus(): void;\n}\n\nexport interface EntityTreeProps<TData extends Record<string, unknown>> {\n // Column definition\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n renderers?: Record<string, CellRenderer>;\n\n // Tree structure (passed through to TreeView)\n nodes: TreeNode<TData>[];\n expandedIds: Set<string>;\n onExpand: TreeViewProps<TData>[\"onExpand\"];\n onCollapse: TreeViewProps<TData>[\"onCollapse\"];\n\n // Top-level states (for when no nodes are loaded yet)\n isLoading?: boolean;\n isError?: boolean;\n errorMessage?: string;\n entityLabel?: string;\n\n // Interaction\n /** Called on row click -- sets the active row without opening edit. */\n onNodeSelect?: (node: TreeNode<TData>) => void;\n /** Called when the pencil icon is clicked -- opens the edit panel. */\n onNodeEdit?: (node: TreeNode<TData>) => void;\n /** Id of the currently active node. Controls pencil-icon visibility only\n * (always shown on the active node, hover-only on others). Row highlight\n * is managed by TreeView via focus state. */\n activeNodeId?: string;\n\n // Selection mode (opt-in). When true: checkboxes appear, pencil icon\n // is hidden, onNodeEdit is suppressed. When false (default): normal\n // browse/edit behavior.\n selectionMode?: boolean;\n selectedIds?: Set<string>;\n onSelectionChange?: TreeViewProps<TData>[\"onSelectionChange\"];\n /** When true, the first selected node locks subsequent selections to its\n * siblings (nodes at the same depth sharing the same parent). Clearing\n * all selections resets the constraint. Managed internally by TreeView. */\n constrainSelectionToSiblings?: boolean;\n\n /**\n * Optional override for specific node rendering. When provided, called\n * before the default schema-driven renderer. Return a React node to\n * replace the default, or null to fall through to the default.\n */\n renderNodeOverride?: (\n node: TreeNode<TData>,\n depth: number,\n ) => React.ReactNode | null;\n\n indentPx?: number;\n className?: string;\n}\n\nfunction buildCellRow<TData extends Record<string, unknown>>(\n resolved: ResolvedColumn[],\n activeNodeIdRef: MutableRefObject<string | undefined>,\n onNodeEdit: ((node: TreeNode<TData>) => void) | undefined,\n localRenderers?: Record<string, CellRenderer>,\n) {\n return function renderCells(node: TreeNode<TData>): React.ReactElement {\n const isActive = node.id === activeNodeIdRef.current;\n return (\n <span className=\"flex items-center gap-4 min-w-0 w-full group/row\">\n {resolved.map((col) => {\n const Renderer = resolveCellRenderer(\n col.cellRenderer,\n localRenderers,\n );\n const value = node.data[col.key];\n return (\n <span\n key={col.key}\n className=\"shrink-0\"\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n <Renderer\n value={value}\n row={node.data as Record<string, unknown>}\n options={col.cellOptions}\n />\n </span>\n );\n })}\n {onNodeEdit && (\n <span className=\"ml-auto shrink-0\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onNodeEdit(node);\n }}\n aria-label=\"Edit\"\n className={cn(\n \"p-1 rounded hover:bg-background text-muted-foreground hover:text-foreground transition-colors\",\n isActive\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100\",\n )}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </button>\n </span>\n )}\n </span>\n );\n };\n}\n\nfunction resolveEntityTreeDefaults(props: {\n isLoading?: boolean;\n isError?: boolean;\n entityLabel?: string;\n selectionMode?: boolean;\n}) {\n return {\n isLoading: props.isLoading ?? false,\n isError: props.isError ?? false,\n entityLabel: props.entityLabel ?? \"items\",\n selectionMode: props.selectionMode ?? false,\n } as const;\n}\n\n/**\n * Render the appropriate status view for loading/error/empty states.\n * Not a React component -- no hooks. Called as a plain function.\n * Returns null when none of the status conditions apply.\n */\nfunction renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n}: {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n entityLabel: string;\n nodes: unknown[];\n className?: string;\n}): React.ReactElement | null {\n if (isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n Loading\\u2026\n </div>\n );\n }\n\n if (isError) {\n return (\n <div\n className={cn(\"py-8 text-center text-sm text-destructive\", className)}\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </div>\n );\n }\n\n if (!isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No {entityLabel} yet.\n </div>\n );\n }\n\n return null;\n}\n\nfunction resolveRenderNode<TData extends Record<string, unknown>>(\n renderNodeOverride: EntityTreeProps<TData>[\"renderNodeOverride\"],\n defaultRenderNode: (node: TreeNode<TData>) => React.ReactElement,\n): (node: TreeNode<TData>, depth: number) => React.ReactNode {\n if (!renderNodeOverride) return defaultRenderNode;\n return (node: TreeNode<TData>, depth: number): React.ReactNode => {\n const override = renderNodeOverride(node, depth);\n if (override !== null) return override;\n return defaultRenderNode(node);\n };\n}\n\nfunction resolveSelectionProps<TData extends Record<string, unknown>>(\n selectionMode: boolean,\n props: Pick<\n EntityTreeProps<TData>,\n | \"onNodeEdit\"\n | \"selectedIds\"\n | \"onSelectionChange\"\n | \"constrainSelectionToSiblings\"\n >,\n) {\n return {\n effectiveOnNodeEdit: selectionMode ? undefined : props.onNodeEdit,\n onNodeActivate: selectionMode ? undefined : props.onNodeEdit,\n selectedIds: selectionMode ? props.selectedIds : undefined,\n onSelectionChange: selectionMode ? props.onSelectionChange : undefined,\n constrainSelectionToSiblings: selectionMode\n ? props.constrainSelectionToSiblings\n : undefined,\n };\n}\n\n/**\n * EntityTree renders a tree hierarchy where each node row is driven by a\n * JSON Schema column definition, using the same cell renderer pipeline as\n * EntityTable. Row click selects the active node; the pencil icon or Enter\n * triggers edit.\n */\nfunction EntityTreeInner<TData extends Record<string, unknown>>(\n props: EntityTreeProps<TData>,\n ref: React.Ref<EntityTreeHandle>,\n): React.ReactElement {\n const {\n schema,\n uiSchema,\n renderers,\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n errorMessage,\n onNodeSelect,\n onNodeEdit,\n activeNodeId,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n renderNodeOverride,\n indentPx,\n className,\n } = props;\n const { isLoading, isError, entityLabel, selectionMode } =\n resolveEntityTreeDefaults(props);\n\n const treeRef = useRef<TreeViewHandle>(null);\n\n useImperativeHandle(ref, () => ({\n focus() {\n treeRef.current?.focus();\n },\n }));\n\n const resolved = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return resolveColumns(schema, uiSchema);\n }, [schema, uiSchema, renderers]);\n\n // Ref so renderNode reads the current value at call time without\n // recreating the function on every active node change.\n const activeNodeIdRef = useRef(activeNodeId);\n activeNodeIdRef.current = activeNodeId;\n\n const selection = resolveSelectionProps(selectionMode, {\n onNodeEdit,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n });\n\n const defaultRenderNode = useMemo(\n () =>\n buildCellRow<TData>(\n resolved,\n activeNodeIdRef,\n selection.effectiveOnNodeEdit,\n renderers,\n ),\n [resolved, selection.effectiveOnNodeEdit, renderers],\n );\n\n const renderNode = useMemo(\n () => resolveRenderNode(renderNodeOverride, defaultRenderNode),\n [renderNodeOverride, defaultRenderNode],\n );\n\n const statusView = renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n });\n if (statusView) return statusView;\n\n return (\n <div className={cn(\"rounded-lg border\", className)}>\n <TreeView<TData>\n ref={treeRef}\n nodes={nodes}\n expandedIds={expandedIds}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeSelect}\n onNodeActivate={selection.onNodeActivate}\n renderNode={renderNode}\n selectedIds={selection.selectedIds}\n onSelectionChange={selection.onSelectionChange}\n constrainSelectionToSiblings={selection.constrainSelectionToSiblings}\n indentPx={indentPx}\n className=\"p-1\"\n />\n </div>\n );\n}\n\nexport const EntityTree = forwardRef(EntityTreeInner) as <\n TData extends Record<string, unknown>,\n>(\n props: EntityTreeProps<TData> & { ref?: React.Ref<EntityTreeHandle> },\n) => React.ReactElement;\n","/**\n * TreeView -- generic, accessible tree component.\n *\n * Renders a hierarchy of nodes with expand/collapse, keyboard navigation,\n * and optional row selection. Node content is fully delegated to the\n * caller via a renderNode render prop -- this component owns structure\n * and interaction only.\n *\n * Accessibility: implements WAI-ARIA Tree View pattern with\n * role=\"tree\", role=\"treeitem\", aria-expanded, aria-selected.\n * Keyboard: ArrowDown/Up move focus, ArrowRight expands / moves into\n * first child, ArrowLeft collapses / moves to parent, Enter/Space\n * activate the focused node.\n *\n * Loading and error states per node are communicated via the node data\n * itself (isLoading, isError flags). The caller controls data fetching.\n *\n * Extractable to @petrarca/sonnet-ui. Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single node in the tree. TData carries the domain payload. */\nexport interface TreeNode<TData = Record<string, unknown>> {\n /** Stable unique identifier for this node. */\n id: string;\n /** Domain payload, passed through to renderNode. */\n data: TData;\n /** Whether this node can have children (controls expand affordance). */\n hasChildren: boolean;\n /** Children that have already been loaded. undefined = not yet fetched. */\n children?: TreeNode<TData>[];\n /** True while children are being fetched. */\n isLoading?: boolean;\n /** True when the child fetch failed. */\n isError?: boolean;\n}\n\nexport interface TreeViewProps<TData = Record<string, unknown>> {\n /** Root-level nodes. */\n nodes: TreeNode<TData>[];\n /** Set of node ids that are currently expanded. Controlled. */\n expandedIds: Set<string>;\n /** Called when the user requests to expand a node. */\n onExpand: (nodeId: string) => void;\n /** Called when the user requests to collapse a node. */\n onCollapse: (nodeId: string) => void;\n /** Called when the user clicks a node row. */\n onNodeClick?: (node: TreeNode<TData>) => void;\n /** Called when the user activates a node via keyboard (Enter or Space). */\n onNodeActivate?: (node: TreeNode<TData>) => void;\n /**\n * Render the visible content of a single node row.\n * depth starts at 0 for root nodes.\n */\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n /** Row selection -- set of selected node ids. Controlled, opt-in. */\n selectedIds?: Set<string>;\n /** Called when the user toggles selection on a node. */\n onSelectionChange?: (nodeId: string, selected: boolean) => void;\n /** When true, the first selected node locks checkboxes to its siblings\n * (nodes sharing the same parent). Clearing all selections resets the\n * constraint so a different sibling group can be selected next. */\n constrainSelectionToSiblings?: boolean;\n /** Pixels of indentation per depth level. Default 20. */\n indentPx?: number;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Flat ordered list of visible nodes for keyboard navigation. */\ninterface FlatNode<TData> {\n node: TreeNode<TData>;\n depth: number;\n parentId: string | null;\n}\n\nfunction flatten<TData>(\n nodes: TreeNode<TData>[],\n expandedIds: Set<string>,\n depth = 0,\n parentId: string | null = null,\n result: FlatNode<TData>[] = [],\n): FlatNode<TData>[] {\n for (const node of nodes) {\n result.push({ node, depth, parentId });\n if (expandedIds.has(node.id) && node.children) {\n flatten(node.children, expandedIds, depth + 1, node.id, result);\n }\n }\n return result;\n}\n\n// Sentinel value for \"no sibling constraint active\". A Symbol avoids\n// collision with real parentId values (string | null).\nconst UNCONSTRAINED = Symbol.for(\"tree-view:unconstrained\");\n\n// ---------------------------------------------------------------------------\n// ToggleIcon -- expand/collapse/leaf icon for a tree node.\n// ---------------------------------------------------------------------------\n\ninterface ToggleIconProps {\n hasChildren: boolean;\n isLoading?: boolean;\n isExpanded: boolean;\n}\n\nfunction ToggleIcon({\n hasChildren,\n isLoading,\n isExpanded,\n}: ToggleIconProps): React.ReactElement {\n if (!hasChildren) {\n return (\n <span className=\"block w-1.5 h-1.5 rounded-full bg-border mx-auto\" />\n );\n }\n if (isLoading) {\n return (\n <span className=\"block w-3 h-3 rounded-full border-2 border-muted-foreground/40 border-t-foreground animate-spin\" />\n );\n }\n return (\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// NodeRow\n// ---------------------------------------------------------------------------\n\ninterface NodeRowProps<TData> {\n flat: FlatNode<TData>;\n expandedIds: Set<string>;\n selectedIds: Set<string>;\n isSelectable: boolean;\n isFocused: boolean;\n indentPx: number;\n treeId: string;\n onExpand: (id: string) => void;\n onCollapse: (id: string) => void;\n onNodeClick?: (node: TreeNode<TData>) => void;\n onSelectionChange?: (id: string, selected: boolean) => void;\n onFocus: (id: string) => void;\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n}\n\nfunction NodeRow<TData>({\n flat,\n expandedIds,\n selectedIds,\n isSelectable,\n isFocused,\n indentPx,\n treeId,\n onExpand,\n onCollapse,\n onNodeClick,\n onSelectionChange,\n onFocus,\n renderNode,\n}: NodeRowProps<TData>): React.ReactElement {\n const { node, depth } = flat;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = selectedIds.has(node.id);\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isExpanded) {\n onCollapse(node.id);\n } else if (node.hasChildren) {\n onExpand(node.id);\n }\n },\n [isExpanded, node.id, node.hasChildren, onExpand, onCollapse],\n );\n\n const handleClick = useCallback(() => {\n onFocus(node.id);\n onNodeClick?.(node);\n }, [node, onFocus, onNodeClick]);\n\n const handleCheckChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onSelectionChange?.(node.id, e.target.checked);\n },\n [node.id, onSelectionChange],\n );\n\n return (\n <li\n id={`${treeId}-node-${node.id}`}\n role=\"treeitem\"\n aria-expanded={node.hasChildren ? isExpanded : undefined}\n aria-selected={onSelectionChange ? isSelected : undefined}\n aria-busy={node.isLoading}\n tabIndex={isFocused ? 0 : -1}\n className={cn(\n \"flex items-center gap-1 px-2 py-1.5 rounded-sm text-sm select-none\",\n \"cursor-pointer transition-colors\",\n \"hover:bg-accent/60\",\n isFocused && \"bg-accent ring-1 ring-ring ring-inset outline-none\",\n isSelected && \"bg-primary/10\",\n )}\n style={{ paddingLeft: depth * indentPx + 8 }}\n onClick={handleClick}\n >\n {/* Expand / collapse toggle */}\n <span\n className=\"shrink-0 flex items-center justify-center w-4 h-4\"\n onClick={handleToggle}\n aria-hidden\n >\n <ToggleIcon\n hasChildren={node.hasChildren}\n isLoading={node.isLoading}\n isExpanded={isExpanded}\n />\n </span>\n\n {/* Optional checkbox for row selection */}\n {onSelectionChange && isSelectable && (\n <input\n type=\"checkbox\"\n className=\"shrink-0 h-3.5 w-3.5 rounded\"\n checked={isSelected}\n onChange={handleCheckChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select ${node.id}`}\n tabIndex={-1}\n />\n )}\n\n {/* Caller-provided node content */}\n <span className=\"flex-1 min-w-0\">{renderNode(node, depth)}</span>\n\n {/* Error indicator */}\n {node.isError && (\n <span className=\"shrink-0 text-xs text-destructive\" aria-live=\"polite\">\n Failed to load\n </span>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeView\n// ---------------------------------------------------------------------------\n\n/** Imperative handle exposed via ref for programmatic focus. */\nexport interface TreeViewHandle {\n /** Focus the tree so keyboard navigation is active. */\n focus(): void;\n}\n\n/**\n * TreeView renders a hierarchy of nodes with expand/collapse, keyboard\n * navigation, and optional row selection. Fully controlled.\n */\nfunction TreeViewInner<TData = Record<string, unknown>>(\n {\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n onNodeClick,\n onNodeActivate,\n renderNode,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n indentPx = 20,\n className,\n }: TreeViewProps<TData>,\n ref: React.Ref<TreeViewHandle>,\n): React.ReactElement {\n const treeId = useId();\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n // Sibling selection constraint: tracks the parentId of the first selected\n // node. UNCONSTRAINED distinguishes \"no constraint\" from \"root level\"\n // (parentId === null). Reset when selection is cleared externally.\n const [constrainedParent, setConstrainedParent] = useState<\n string | null | typeof UNCONSTRAINED\n >(UNCONSTRAINED);\n\n // Reset constraint when controlled selectedIds becomes empty.\n const selectionSize = selectedIds?.size ?? 0;\n useEffect(() => {\n if (selectionSize === 0) setConstrainedParent(UNCONSTRAINED);\n }, [selectionSize]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n // Focus the currently focused node if one exists, otherwise the first\n // treeitem. Events bubble up to the <ul> onKeyDown from the focused <li>.\n const ul = listRef.current;\n if (!ul) return;\n const target = focusedId\n ? ul.querySelector<HTMLElement>(\n `[id$=\"-node-${CSS.escape(focusedId)}\"]`,\n )\n : ul.querySelector<HTMLElement>('[role=\"treeitem\"]');\n target?.focus();\n },\n }),\n [focusedId],\n );\n\n const flatNodes = useMemo(\n () => flatten(nodes, expandedIds),\n [nodes, expandedIds],\n );\n\n // Build a lookup from node id to its parentId in the flat list.\n const parentById = useMemo(() => {\n const map = new Map<string, string | null>();\n for (const f of flatNodes) map.set(f.node.id, f.parentId);\n return map;\n }, [flatNodes]);\n\n // Derive which nodes are selectable under the sibling constraint.\n const selectableSet = useMemo<Set<string> | undefined>(() => {\n if (!constrainSelectionToSiblings || constrainedParent === UNCONSTRAINED) {\n return undefined;\n }\n const ids = new Set<string>();\n for (const f of flatNodes) {\n if (f.parentId === constrainedParent) ids.add(f.node.id);\n }\n return ids;\n }, [constrainSelectionToSiblings, constrainedParent, flatNodes]);\n\n // Wrap onSelectionChange to lock the constraint on first selection.\n const handleSelectionChange = useCallback(\n (nodeId: string, selected: boolean) => {\n if (\n constrainSelectionToSiblings &&\n selected &&\n constrainedParent === UNCONSTRAINED\n ) {\n setConstrainedParent(parentById.get(nodeId) ?? null);\n }\n onSelectionChange?.(nodeId, selected);\n },\n [\n constrainSelectionToSiblings,\n constrainedParent,\n parentById,\n onSelectionChange,\n ],\n );\n\n const focusedIndex = flatNodes.findIndex((f) => f.node.id === focusedId);\n\n const moveFocus = useCallback(\n (delta: number) => {\n if (flatNodes.length === 0) return;\n const next = Math.max(\n 0,\n Math.min(flatNodes.length - 1, focusedIndex + delta),\n );\n const target = flatNodes[next];\n if (target) {\n setFocusedId(target.node.id);\n // Scroll focused item into view\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${target.node.id}`)}`,\n );\n el?.scrollIntoView({ block: \"nearest\" });\n el?.focus();\n }\n },\n [flatNodes, focusedIndex, treeId],\n );\n\n const handleArrowRight = useCallback(\n (current: FlatNode<TData>) => {\n if (current.node.hasChildren && !expandedIds.has(current.node.id)) {\n onExpand(current.node.id);\n } else if (current.node.children && current.node.children.length > 0) {\n moveFocus(1);\n }\n },\n [expandedIds, onExpand, moveFocus],\n );\n\n const handleArrowLeft = useCallback(\n (current: FlatNode<TData>) => {\n if (expandedIds.has(current.node.id)) {\n onCollapse(current.node.id);\n return;\n }\n if (current.parentId === null) return;\n const parentIdx = flatNodes.findIndex(\n (f) => f.node.id === current.parentId,\n );\n if (parentIdx < 0) return;\n const parentFlat = flatNodes[parentIdx];\n if (!parentFlat) return;\n setFocusedId(parentFlat.node.id);\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${parentFlat.node.id}`)}`,\n );\n el?.focus();\n },\n [expandedIds, onCollapse, flatNodes, treeId],\n );\n\n const getFocusedNode = useCallback((): FlatNode<TData> | null => {\n if (focusedIndex < 0) return null;\n return flatNodes[focusedIndex] ?? null;\n }, [flatNodes, focusedIndex]);\n\n const activateNode = useCallback(\n (flat: FlatNode<TData> | null) => {\n if (flat) onNodeActivate?.(flat.node);\n },\n [onNodeActivate],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveFocus(1);\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n moveFocus(-1);\n break;\n\n case \"ArrowRight\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowRight(current);\n break;\n }\n\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowLeft(current);\n break;\n }\n\n case \"Enter\":\n case \" \":\n e.preventDefault();\n activateNode(getFocusedNode());\n break;\n\n default:\n break;\n }\n },\n [\n moveFocus,\n handleArrowRight,\n handleArrowLeft,\n getFocusedNode,\n activateNode,\n ],\n );\n\n if (nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No items.\n </div>\n );\n }\n\n return (\n <ul\n ref={listRef}\n role=\"tree\"\n aria-label=\"Tree\"\n className={cn(\"outline-none\", className)}\n onKeyDown={handleKeyDown}\n >\n {flatNodes.map((flat) => (\n <NodeRow\n key={flat.node.id}\n flat={flat}\n expandedIds={expandedIds}\n selectedIds={selectedIds ?? new Set()}\n isSelectable={!selectableSet || selectableSet.has(flat.node.id)}\n isFocused={flat.node.id === focusedId}\n indentPx={indentPx}\n treeId={treeId}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeClick}\n onSelectionChange={\n onSelectionChange ? handleSelectionChange : undefined\n }\n onFocus={setFocusedId}\n renderNode={renderNode}\n />\n ))}\n </ul>\n );\n}\n\nexport const TreeView = forwardRef(TreeViewInner) as <\n TData = Record<string, unknown>,\n>(\n props: TreeViewProps<TData> & { ref?: React.Ref<TreeViewHandle> },\n) => React.ReactElement;\n","/**\n * SearchInput -- controlled search and filter input with chip display.\n *\n * Supports two modes:\n * \"explicit\" -- fires only on Enter or the search button (default)\n * \"debounce\" -- fires automatically after the user stops typing\n *\n * Supports two search styles:\n * Simple -- no schema prop; produces a single search term\n * Faceted -- schema prop provided; facets derived from schema properties,\n * value entry delegates to search widgets\n *\n * Faceted field picker:\n * - Opens on ArrowDown or chevron button click\n * - Filters to prefix-matching facets as the user types\n * - ArrowDown/ArrowUp navigate the list; Enter selects when navigated or typed\n * - Click on an item accepts that facet\n * - Closes when a facet is selected, input is submitted, or focus leaves\n *\n * Always emits a FilterExpr. Use flattenFilterExpr() from @/lib/search to\n * convert to flat key/value params for server APIs that do not yet accept AST.\n *\n * Extractable to @petrarca/sonnet-ui: no imports from api/, services/,\n * store/, contexts/, or modules/.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\nimport { Search, X, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Input } from \"../input\";\nimport { Badge } from \"../badge\";\nimport { Button } from \"../button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport { getFieldTitle } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { isEmptyFilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { useSearchInput, type SearchMode } from \"./useSearchInput\";\nimport type { FacetDescriptor } from \"./schemaAdapter\";\nimport {\n DEFAULT_SEARCH_WIDGETS,\n resolveSearchWidget,\n type SearchWidgetRegistry,\n} from \"./widgets\";\n\nexport interface SearchInputProps {\n // Controlled filter state\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n\n /** JSON Schema defining available facets. Providing this activates\n * faceted mode. Each schema property becomes an available facet.\n * Omit for simple single-term search. */\n schema?: JsonSchema;\n\n /** Custom search widgets merged with defaults. Keys are widget names\n * referenced by x-ui-widget in schema properties. */\n widgets?: SearchWidgetRegistry;\n\n // Interaction mode\n mode?: SearchMode;\n debounceMs?: number;\n /** Minimum characters before onChange fires. Simple mode only --\n * has no effect in faceted mode. */\n minChars?: number;\n /** Show an explicit Search button. Only rendered in explicit mode --\n * has no effect when mode is \"debounce\". */\n showSearchButton?: boolean;\n\n /**\n * Simple mode only. When provided, the search text is expanded into a\n * FilterOr with one LIKE term per field instead of the default single\n * { key: \"search\" } term. Enables cross-field search (e.g. match on\n * code OR display). Ignored in faceted mode.\n */\n searchFields?: string[];\n\n placeholder?: string;\n className?: string;\n /** Disable all interaction (e.g. when a prerequisite is not met). */\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults helper -- moves default-parameter branches out of the component.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedSearchDefaults {\n mode: SearchMode;\n debounceMs: number;\n minChars: number;\n showSearchButton: boolean;\n disabled: boolean;\n}\n\nfunction resolveSearchDefaults(\n props: SearchInputProps,\n): ResolvedSearchDefaults {\n return {\n mode: props.mode ?? \"explicit\",\n debounceMs: props.debounceMs ?? 300,\n minChars: props.minChars ?? 0,\n showSearchButton: props.showSearchButton ?? false,\n disabled: props.disabled ?? false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FacetPicker -- the popover that lists available facets.\n// ---------------------------------------------------------------------------\n\ninterface FacetPickerProps {\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nfunction FacetPicker({\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n inputRef,\n}: FacetPickerProps): React.ReactElement {\n return (\n <Popover open={pickerVisible} onOpenChange={setPickerOpen} modal={false}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((o) => !o);\n inputRef.current?.focus();\n }}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-44 p-1\", !hasFacetsToShow && \"hidden\")}\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n >\n {filteredFacets.map((facet, i) => (\n <button\n key={facet.key}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n acceptFacet(facet);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {facet.label}\n </button>\n ))}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ValueEntry -- widget for pending facet, or plain text input.\n// ---------------------------------------------------------------------------\n\ninterface ValueEntryProps {\n pendingFacet: FacetDescriptor | null;\n PendingWidget: ReturnType<typeof resolveSearchWidget> | null;\n pendingWidgetOptions: Record<string, unknown>;\n inputValue: string;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n commitFacetValue: (v: string) => void;\n cancelPendingFacet: () => void;\n resolvedPlaceholder: string;\n disabled: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onInputFocus: () => void;\n}\n\nfunction ValueEntry({\n pendingFacet,\n PendingWidget,\n pendingWidgetOptions,\n inputValue,\n handleInputChange,\n commitFacetValue,\n cancelPendingFacet,\n resolvedPlaceholder,\n disabled,\n inputRef,\n onInputKeyDown,\n onInputChange,\n onInputFocus,\n}: ValueEntryProps): React.ReactElement {\n if (pendingFacet && PendingWidget) {\n return (\n <PendingWidget\n property={pendingFacet.property}\n options={pendingWidgetOptions}\n value={inputValue}\n onChange={(v) =>\n handleInputChange({\n target: { value: v },\n } as React.ChangeEvent<HTMLInputElement>)\n }\n onCommit={(v) => {\n commitFacetValue(v);\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n onCancel={() => {\n cancelPendingFacet();\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n placeholder={pendingFacet.placeholder ?? resolvedPlaceholder}\n autoFocus\n />\n );\n }\n\n return (\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={onInputKeyDown}\n onFocus={onInputFocus}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n autoComplete=\"off\"\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Input onKeyDown handler -- extracted to keep the component body lean.\n// ---------------------------------------------------------------------------\n\ninterface InputKeyDownContext {\n isFaceted: boolean;\n pendingFacet: FacetDescriptor | null;\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n inputValue: string;\n pickerNavigated: boolean;\n setPickerNavigated: React.Dispatch<React.SetStateAction<boolean>>;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n}\n\n/** ArrowDown in the picker: open it or move highlight. Returns true if handled. */\nfunction handlePickerArrowDown(ctx: InputKeyDownContext): boolean {\n if (!ctx.isFaceted || ctx.pendingFacet) return false;\n ctx.setPickerNavigated(true);\n if (!ctx.pickerVisible) {\n ctx.setPickerOpen(true);\n } else {\n ctx.setHighlightedIndex((i) =>\n Math.min(i + 1, ctx.filteredFacets.length - 1),\n );\n }\n return true;\n}\n\n/** Enter while picker shows facets: select the highlighted facet. Returns true if handled. */\nfunction handlePickerEnterSelect(ctx: InputKeyDownContext): boolean {\n if (!ctx.hasFacetsToShow) return false;\n if (!ctx.pickerNavigated && !ctx.inputValue.trim()) return false;\n const clamped = Math.min(ctx.highlightedIndex, ctx.filteredFacets.length - 1);\n if (clamped >= 0 && ctx.filteredFacets[clamped]) {\n ctx.setPickerNavigated(false);\n ctx.acceptFacet(ctx.filteredFacets[clamped]);\n return true;\n }\n return false;\n}\n\nfunction handleInputKeyDown(\n e: React.KeyboardEvent<HTMLInputElement>,\n ctx: InputKeyDownContext,\n): void {\n if (e.key === \"ArrowDown\" && handlePickerArrowDown(ctx)) {\n e.preventDefault();\n return;\n }\n if (e.key === \"ArrowUp\" && ctx.hasFacetsToShow) {\n e.preventDefault();\n ctx.setPickerNavigated(true);\n ctx.setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" && handlePickerEnterSelect(ctx)) {\n e.preventDefault();\n return;\n }\n const reopenPicker = ctx.handleKeyDown(e);\n if (e.key === \"Enter\") {\n ctx.setPickerNavigated(false);\n ctx.setPickerOpen(!!reopenPicker);\n }\n}\n\n// ---------------------------------------------------------------------------\n// resolvePlaceholder -- extract conditional placeholder logic.\n// ---------------------------------------------------------------------------\n\nfunction resolvePlaceholder(\n isFaceted: boolean,\n hasActiveTerms: boolean,\n hasPendingFacet: boolean,\n placeholder: string | undefined,\n): string {\n const defaultPlaceholder = isFaceted ? \"Add filter...\" : \"Search...\";\n if (isFaceted && (hasActiveTerms || hasPendingFacet)) return \"Add filter...\";\n return placeholder ?? defaultPlaceholder;\n}\n\n// ---------------------------------------------------------------------------\n// ActiveChips -- renders filter chips in faceted mode.\n// ---------------------------------------------------------------------------\n\ninterface ActiveChipsProps {\n terms: Array<{ key: string; value: string }>;\n schema?: JsonSchema;\n onRemove: (index: number) => void;\n}\n\nfunction ActiveChips({\n terms,\n schema,\n onRemove,\n}: ActiveChipsProps): React.ReactElement {\n return (\n <>\n {terms.map((term, i) => {\n const property = schema?.properties?.[term.key];\n const label = property ? getFieldTitle(term.key, property) : term.key;\n return (\n <FilterChip\n key={`${term.key}:${term.value}`}\n label={`${label}: ${term.value}`}\n onRemove={() => onRemove(i)}\n />\n );\n })}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// resolveWidgetForFacet -- extract widget resolution branches.\n// ---------------------------------------------------------------------------\n\nfunction resolveWidgetForFacet(\n pendingFacet: FacetDescriptor | null,\n registry: SearchWidgetRegistry,\n): {\n Widget: ReturnType<typeof resolveSearchWidget> | null;\n options: Record<string, unknown>;\n} {\n if (!pendingFacet) return { Widget: null, options: {} };\n return {\n Widget: resolveSearchWidget(pendingFacet.property, registry),\n options:\n (pendingFacet.property[\"x-ui-options\"] as Record<string, unknown>) ?? {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// SearchActions -- clear and search buttons, extracted to reduce parent complexity.\n// ---------------------------------------------------------------------------\n\ninterface SearchActionsProps {\n isEmpty: boolean;\n showSearchButton: boolean;\n mode: SearchMode;\n onClear: () => void;\n onCommit: () => void;\n}\n\nfunction SearchActions({\n isEmpty,\n showSearchButton,\n mode,\n onClear,\n onCommit,\n}: SearchActionsProps): React.ReactElement {\n return (\n <>\n {!isEmpty && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n aria-label=\"Clear search\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n {showSearchButton && mode === \"explicit\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n onCommit();\n }}\n >\n Search\n </Button>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// mergeWidgetRegistry -- extracted to reduce parent branches.\n// ---------------------------------------------------------------------------\n\nfunction mergeWidgetRegistry(\n custom: SearchWidgetRegistry | undefined,\n): SearchWidgetRegistry {\n return custom\n ? { ...DEFAULT_SEARCH_WIDGETS, ...custom }\n : DEFAULT_SEARCH_WIDGETS;\n}\n\n// ---------------------------------------------------------------------------\n// SearchInput\n// ---------------------------------------------------------------------------\n\nexport function SearchInput(props: SearchInputProps): React.ReactElement {\n const {\n value,\n onChange,\n schema,\n widgets: customWidgets,\n searchFields,\n placeholder,\n className,\n } = props;\n const { mode, debounceMs, minChars, showSearchButton, disabled } =\n resolveSearchDefaults(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [pickerNavigated, setPickerNavigated] = useState(false);\n\n // Close picker on clicks outside the component.\n useEffect(() => {\n if (!pickerOpen) return;\n function handleMouseDown(e: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setPickerOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [pickerOpen]);\n\n const widgetRegistry = useMemo<SearchWidgetRegistry>(\n () => mergeWidgetRegistry(customWidgets),\n [customWidgets],\n );\n\n const {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n } = useSearchInput({\n value,\n onChange,\n mode,\n debounceMs,\n minChars,\n schema,\n searchFields,\n });\n const isEmpty = isEmptyFilterExpr(value) && inputValue === \"\";\n\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredFacets, pickerOpen]);\n\n const resolvedPlaceholder = resolvePlaceholder(\n isFaceted,\n activeTerms.length > 0,\n pendingFacet !== null,\n placeholder,\n );\n\n const showFacetControls = isFaceted && !pendingFacet;\n const pickerVisible = showFacetControls && pickerOpen;\n const hasFacetsToShow = pickerVisible && filteredFacets.length > 0;\n\n const acceptFacet = React.useCallback(\n (facet: FacetDescriptor) => {\n selectFacet(facet);\n setPickerOpen(false);\n inputRef.current?.focus();\n },\n [selectFacet],\n );\n\n const { Widget: PendingWidget, options: pendingWidgetOptions } =\n resolveWidgetForFacet(pendingFacet, widgetRegistry);\n\n const keyDownCtx: InputKeyDownContext = {\n isFaceted,\n pendingFacet,\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n inputValue,\n pickerNavigated,\n setPickerNavigated,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n handleKeyDown,\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm min-h-9\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-text\",\n className,\n )}\n onClick={() => !disabled && inputRef.current?.focus()}\n onBlur={(e) => {\n const relatedTarget = e.relatedTarget as Node | null;\n if (relatedTarget && !e.currentTarget.contains(relatedTarget)) {\n setPickerOpen(false);\n }\n }}\n >\n <Search className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n\n {/* Active filter chips -- faceted mode only */}\n {isFaceted && (\n <ActiveChips\n terms={activeTerms}\n schema={schema}\n onRemove={handleRemoveTerm}\n />\n )}\n\n {/* Pending facet chip */}\n {pendingFacet && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {pendingFacet.label}:\n </span>\n )}\n\n {/* Facet picker + text input / widget row */}\n <div className=\"flex items-center gap-1 flex-1 min-w-[120px]\">\n {showFacetControls && (\n <FacetPicker\n pickerVisible={pickerVisible}\n hasFacetsToShow={hasFacetsToShow}\n filteredFacets={filteredFacets}\n highlightedIndex={highlightedIndex}\n setPickerOpen={setPickerOpen}\n setHighlightedIndex={setHighlightedIndex}\n acceptFacet={acceptFacet}\n inputRef={inputRef}\n />\n )}\n\n <ValueEntry\n pendingFacet={pendingFacet}\n PendingWidget={PendingWidget}\n pendingWidgetOptions={pendingWidgetOptions}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n commitFacetValue={commitFacetValue}\n cancelPendingFacet={cancelPendingFacet}\n resolvedPlaceholder={resolvedPlaceholder}\n disabled={disabled}\n inputRef={inputRef}\n onInputKeyDown={(e) => handleInputKeyDown(e, keyDownCtx)}\n onInputChange={(e) => {\n handleInputChange(e);\n setPickerNavigated(false);\n }}\n onInputFocus={() => {\n if (isFaceted && !pendingFacet) setPickerNavigated(false);\n }}\n />\n </div>\n\n <SearchActions\n isEmpty={isEmpty}\n showSearchButton={showSearchButton}\n mode={mode}\n onClear={handleClear}\n onCommit={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","React","cn","jsx","jsx","jsx","IconButton","cn","React","cn","jsx","React","cn","jsx","CollapsibleTrigger","CollapsibleContent","React","cn","React","cn","jsx","jsxs","jsx","jsxs","cn","React","Check","cn","jsx","jsxs","React","cn","jsx","cva","cn","React","cn","jsx","jsx","cn","cva","React","cva","cn","jsx","Label","React","cn","jsx","React","cn","jsx","jsxs","React","cn","jsx","Separator","React","cn","jsx","React","DialogPrimitive","X","cn","jsx","jsxs","cn","jsx","cn","jsx","gapMap","alignMap","justifyMap","cn","jsx","cn","jsx","React","cn","jsx","Check","React","cn","React","React","React","jsx","value","disabled","cn","tabStopId","onKeyDown","Check","SeparatorPrimitive","useCallback","useEffect","useMemo","useRef","useState","ChevronRight","cn","React","jsx","jsxs","resolveCellRenderer","React","jsx","jsxs","resolveCellRenderer","useMemo","useEffect","useState","useRef","useCallback","cn","ChevronRight","React","useState","jsx","jsxs","useState","jsx","jsxs","React","React","Check","X","cn","Fragment","jsx","jsxs","Check","cn","X","forwardRef","useImperativeHandle","useMemo","useRef","cn","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","ChevronRight","cn","jsx","jsxs","jsx","jsxs","resolveCellRenderer","cn","useRef","useImperativeHandle","useMemo","forwardRef","React","useMemo","useRef","useState","useEffect","Search","X","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/alert.tsx","../src/avatar.tsx","../src/badge.tsx","../src/button.tsx","../src/icon-button.tsx","../src/tooltip.tsx","../src/simple-tooltip.tsx","../src/card.tsx","../src/checkbox.tsx","../src/collapsible.tsx","../src/command.tsx","../src/dialog.tsx","../src/dropdown-menu.tsx","../src/input.tsx","../src/DateInput/DateInput.tsx","../src/popover.tsx","../src/DateInput/Calendar.tsx","../src/TimeInput/TimeInput.tsx","../src/DateTimeInput/DateTimeInput.tsx","../src/select.tsx","../src/input-group.tsx","../src/textarea.tsx","../src/label.tsx","../src/scroll-area.tsx","../src/separator.tsx","../src/resize-handle.tsx","../src/sheet.tsx","../src/simple-group.tsx","../src/simple-stack.tsx","../src/skeleton.tsx","../src/spinner.tsx","../src/tabs.tsx","../src/stepper.tsx","../src/radix/hooks/use-as-ref.ts","../src/radix/hooks/use-isomorphic-layout-effect.ts","../src/radix/hooks/use-lazy-ref.ts","../src/EntityTable/EntityTable.tsx","../src/EntityTable/tableSchema/mergeUiSchema.ts","../src/EntityTable/tableSchema/cellRegistry.ts","../src/EntityTable/tableSchema/cellRenderers.tsx","../src/EntityTable/tableSchema/columnResolver.ts","../src/PropertyList/PropertyList.tsx","../src/PropertyList/PropertyValue.tsx","../src/EntitySelect/EntitySelect.tsx","../src/EntityTree/EntityTree.tsx","../src/TreeView/TreeView.tsx","../src/SearchInput/SearchInput.tsx","../src/SearchInput/useSearchInput.ts","../src/SearchInput/schemaAdapter.ts","../src/SearchInput/widgets/TextSearchWidget.tsx","../src/SearchInput/widgets/EnumSearchWidget.tsx","../src/SearchInput/widgets/resolveSearchWidget.ts","../src/SearchInput/widgets/index.ts","../src/Clipboard/ClipboardButton.tsx","../src/Clipboard/ClipboardItem.tsx","../src/Clipboard/ClipboardMenu.tsx","../src/Clipboard/clipboardStore.ts"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground\",\n destructive:\n \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription };\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n badgeColor: {\n grape:\n \"border-transparent bg-purple-100 text-purple-800 hover:bg-purple-200 dark:bg-purple-900 dark:text-purple-200 dark:hover:bg-purple-800\",\n blue: \"border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 dark:bg-blue-900 dark:text-blue-200 dark:hover:bg-blue-800\",\n green:\n \"border-transparent bg-green-100 text-green-800 hover:bg-green-200 dark:bg-green-900 dark:text-green-200 dark:hover:bg-green-800\",\n red: \"border-transparent bg-red-100 text-red-800 hover:bg-red-200 dark:bg-red-900 dark:text-red-200 dark:hover:bg-red-800\",\n orange:\n \"border-transparent bg-orange-100 text-orange-800 hover:bg-orange-200 dark:bg-orange-900 dark:text-orange-200 dark:hover:bg-orange-800\",\n yellow:\n \"border-transparent bg-yellow-100 text-yellow-800 hover:bg-yellow-200 dark:bg-yellow-900 dark:text-yellow-200 dark:hover:bg-yellow-800\",\n teal: \"border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 dark:bg-teal-900 dark:text-teal-200 dark:hover:bg-teal-800\",\n cyan: \"border-transparent bg-cyan-100 text-cyan-800 hover:bg-cyan-200 dark:bg-cyan-900 dark:text-cyan-200 dark:hover:bg-cyan-800\",\n pink: \"border-transparent bg-pink-100 text-pink-800 hover:bg-pink-200 dark:bg-pink-900 dark:text-pink-200 dark:hover:bg-pink-800\",\n indigo:\n \"border-transparent bg-indigo-100 text-indigo-800 hover:bg-indigo-200 dark:bg-indigo-900 dark:text-indigo-200 dark:hover:bg-indigo-800\",\n violet:\n \"border-transparent bg-violet-100 text-violet-800 hover:bg-violet-200 dark:bg-violet-900 dark:text-violet-200 dark:hover:bg-violet-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, badgeColor, ...props }: BadgeProps) {\n return (\n <div\n className={cn(badgeVariants({ variant, badgeColor }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n compact: \"h-7 w-7 p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { SimpleTooltip } from \"./simple-tooltip\";\n\n/**\n * IconButton -- a compact, square icon-only button with an accessible label\n * and a tooltip. The house standard for inline affordances (rename, delete,\n * edit) and small toolbar actions across the Sonnet apps.\n *\n * - `variant` defaults to \"ghost\" (borderless, for inline/hover-reveal rows).\n * Use \"outline\" for standalone toolbar buttons.\n * - `tone=\"destructive\"` tints the hover state red (e.g. delete).\n * - The `label` is both the tooltip text and the aria-label, so the button is\n * always accessible without visible text.\n * - Do not size the icon yourself: the underlying Button forces child SVGs to\n * `size-4` (16px), so pass a bare `<Icon />` (no h-/w- class).\n * - `revealOnHover` applies the house row-action convention: the button is\n * hidden at rest and revealed when the row is hovered or the button is\n * keyboard-focused; a disabled action stays faintly visible (opacity-30)\n * rather than hidden. The row must set the `group/row` class for this.\n *\n * Usage:\n * <IconButton label=\"Delete\" tone=\"destructive\" onClick={...}>\n * <Trash2 />\n * </IconButton>\n *\n * // row-action (parent row has className=\"... group/row\"):\n * <IconButton label=\"Edit\" revealOnHover onClick={...}><Pencil /></IconButton>\n */\nexport interface IconButtonProps\n extends Omit<ButtonProps, \"size\" | \"children\" | \"aria-label\"> {\n /** Tooltip text and accessible label. */\n label: string;\n /** The icon to render. */\n children: React.ReactNode;\n /** Hover tone. \"destructive\" tints hover red. Default \"default\". */\n tone?: \"default\" | \"destructive\";\n /** Tooltip side. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /**\n * Row-action reveal: hidden at rest, shown on row hover (`group/row`) or\n * keyboard focus. Disabled buttons stay at opacity-30 instead of hidden, so\n * the affordance reads as \"present but unavailable\". Default false.\n */\n revealOnHover?: boolean;\n}\n\n// The house row-action reveal convention (matches EntityTable's RowActionCell):\n// hidden until the row is hovered or the button focused; a disabled action\n// stays faintly visible rather than hidden. The `disabled:` variant is used so\n// it overrides Button's base `disabled:opacity-50` (tailwind-merge resolves the\n// conflicting disabled-opacity utilities to this one).\nfunction revealClass(disabled: boolean | undefined): string {\n return disabled\n ? \"disabled:opacity-30 group-hover/row:disabled:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\";\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButton(\n {\n label,\n children,\n tone = \"default\",\n variant = \"ghost\",\n tooltipSide,\n revealOnHover = false,\n className,\n disabled,\n ...props\n },\n ref,\n ) {\n const toneClass =\n variant === \"ghost\"\n ? tone === \"destructive\"\n ? \"text-muted-foreground hover:text-destructive\"\n : \"text-muted-foreground hover:text-foreground\"\n : tone === \"destructive\"\n ? \"hover:text-destructive\"\n : undefined;\n return (\n <SimpleTooltip label={label} side={tooltipSide}>\n <Button\n ref={ref}\n type=\"button\"\n size=\"compact\"\n variant={variant}\n aria-label={label}\n disabled={disabled}\n className={cn(\n toneClass,\n revealOnHover && revealClass(disabled),\n className,\n )}\n {...props}\n >\n {children}\n </Button>\n </SimpleTooltip>\n );\n },\n);\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\ninterface SimpleTooltipProps {\n label: React.ReactNode;\n children: React.ReactElement;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n delayDuration?: number;\n sideOffset?: number;\n}\n\n/**\n * Simplified Tooltip wrapper that matches Mantine's simple API.\n * Usage: <SimpleTooltip label=\"Click me\"><Button>Click</Button></SimpleTooltip>\n */\nexport function SimpleTooltip({\n label,\n children,\n side,\n align,\n delayDuration = 700,\n sideOffset,\n}: SimpleTooltipProps) {\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} align={align} sideOffset={sideOffset}>\n {label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"grid place-content-center peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"grid place-content-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","import * as React from \"react\";\nimport { type DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Dialog, DialogContent } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n // Focus: a quiet 1px halo plus a tinted border. Chrome matches\n // :focus-visible on text fields even for mouse clicks, so a heavy\n // ring would fire on every click into a field.\n \"flex h-10 w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n\n/** Renders a field-level error message below an input. */\nexport function InputError({\n error,\n}: {\n error: string | undefined;\n}): React.ReactElement | null {\n if (!error) return null;\n return <p className=\"mt-1 text-sm text-destructive\">{error}</p>;\n}\n","/**\n * DateInput -- text input with a calendar popover for a single date.\n *\n * The value is a partial ISO 8601 date string -- `\"YYYY\"`, `\"YYYY-MM\"`, or\n * `\"YYYY-MM-DD\"` depending on `precision`. Typed entry is parsed leniently\n * (see {@link parseDate}); `\"t\"`, `\"today\"`, or `\".\"` enter the current date;\n * calendar selection drills down to the terminal precision. Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Calendar as CalendarIcon } from \"lucide-react\";\nimport {\n cn,\n compileDateFormat,\n parseDate,\n formatDateInput,\n formatIsoDate,\n parseIsoDate,\n getLocaleDateFormat,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\nimport { Input, InputError } from \"../input\";\nimport { Popover, PopoverTrigger, PopoverContent } from \"../popover\";\nimport { Calendar } from \"./Calendar\";\n\nexport interface DateInputProps {\n /** Partial ISO date string (`YYYY`, `YYYY-MM`, or `YYYY-MM-DD`), or \"\". */\n value?: string;\n /** Called with the new partial ISO date string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Selection precision. Default `\"day\"`. */\n precision?: DatePrecision;\n /** BCP-47 locale override for display/parsing. Defaults to the app locale. */\n locale?: string;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function DateInput({\n value,\n onChange,\n precision = \"day\",\n locale,\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: DateInputProps): React.ReactElement {\n const resolvedLocale = useLocale(locale);\n const [open, setOpen] = React.useState(false);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const fmt = React.useMemo(\n () =>\n compileDateFormat({\n format: getLocaleDateFormat(resolvedLocale, precision),\n }),\n [resolvedLocale, precision],\n );\n\n const selectedDate = React.useMemo(() => parseIsoDate(value), [value]);\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(selectedDate ? formatDateInput(selectedDate, fmt) : \"\");\n setParseError(\"\");\n }, [selectedDate, fmt]);\n\n const commit = (date: Date | null): void => {\n onChange(date ? formatIsoDate(date, precision) : \"\");\n };\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n commit(null);\n onBlur?.();\n return;\n }\n const result = parseDate(inputValue, fmt);\n if (result.date) {\n setInputValue(result.value);\n setParseError(\"\");\n commit(result.date);\n } else {\n setParseError(result.error || \"Invalid date\");\n }\n onBlur?.();\n };\n\n const handleCalendarSelect = (date: Date): void => {\n setInputValue(formatDateInput(date, fmt));\n setParseError(\"\");\n commit(date);\n setOpen(false);\n };\n\n const shownError = error || parseError;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n handleBlur();\n setOpen(false);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n }\n }}\n placeholder={placeholder ?? fmt.format}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Open calendar\"\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <CalendarIcon size={16} />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-auto p-2\">\n <Calendar\n value={selectedDate}\n onSelect={handleCalendarSelect}\n precision={precision}\n locale={resolvedLocale}\n />\n </PopoverContent>\n </Popover>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","/**\n * Calendar -- month/year/decade grid for selecting a single day.\n *\n * A controlled, dependency-light calendar operating on native `Date`. Renders\n * three drill-down views (days, months, years) with header navigation. Styling\n * uses semantic design tokens only.\n */\n\nimport * as React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport {\n cn,\n getWeekdayLabels,\n getFirstDayOfWeek,\n type DatePrecision,\n} from \"@petrarca/sonnet-core\";\nimport { useLocale } from \"@petrarca/sonnet-core/config\";\n\ntype CalendarView = \"days\" | \"months\" | \"years\";\n\n// Map a target precision to the calendar view at which selection is terminal.\nconst TERMINAL_VIEW: Record<DatePrecision, CalendarView> = {\n year: \"years\",\n month: \"months\",\n day: \"days\",\n};\n\nexport interface CalendarProps {\n /** Currently selected day, or null. */\n value: Date | null;\n /** Called when the user picks a date at the terminal precision. */\n onSelect: (date: Date) => void;\n /** Month shown when no value is selected. Defaults to today. */\n defaultViewDate?: Date;\n /**\n * Precision at which selection completes: `\"year\"` stops on the years view,\n * `\"month\"` on the months view, `\"day\"` on the days view (default).\n */\n precision?: DatePrecision;\n /** BCP-47 locale for month/weekday labels and week-start. */\n locale?: string;\n}\n\nfunction sameDay(a: Date, b: Date): boolean {\n return (\n a.getDate() === b.getDate() &&\n a.getMonth() === b.getMonth() &&\n a.getFullYear() === b.getFullYear()\n );\n}\n\nfunction monthName(month: number, locale: string): string {\n // Use a fixed safe day (1) to avoid month overflow on day 29-31.\n return new Date(2000, month, 1).toLocaleDateString(locale, { month: \"long\" });\n}\n\nfunction decadeStart(year: number): number {\n return Math.floor(year / 10) * 10;\n}\n\n// Cells for the visible month, padded with blanks before the first weekday,\n// respecting the locale's first day of week.\nfunction buildDayCells(viewDate: Date, firstDay: number): Array<Date | null> {\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n const weekday = new Date(year, month, 1).getDay();\n const leadingBlanks = (weekday - firstDay + 7) % 7;\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n\n const cells: Array<Date | null> = [];\n for (let i = 0; i < leadingBlanks; i++) cells.push(null);\n for (let day = 1; day <= daysInMonth; day++)\n cells.push(new Date(year, month, day));\n return cells;\n}\n\nfunction DaysView({\n viewDate,\n value,\n onSelect,\n locale,\n}: {\n viewDate: Date;\n value: Date | null;\n onSelect: (date: Date) => void;\n locale: string;\n}): React.ReactElement {\n const firstDay = getFirstDayOfWeek(locale);\n const cells = buildDayCells(viewDate, firstDay);\n const weekdayLabels = getWeekdayLabels(locale);\n const today = new Date();\n\n return (\n <>\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {weekdayLabels.map((label) => (\n <div\n key={label}\n className=\"text-center text-xs font-medium text-muted-foreground\"\n >\n {label}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {cells.map((date, index) => {\n if (!date) return <div key={`blank-${index}`} className=\"h-8 w-8\" />;\n const isSelected = value ? sameDay(date, value) : false;\n const isToday = sameDay(date, today);\n return (\n <button\n key={date.toISOString()}\n type=\"button\"\n onClick={() => onSelect(date)}\n className={cn(\n \"h-8 w-8 rounded-full text-center text-sm\",\n isToday && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </>\n );\n}\n\nfunction MonthsView({\n viewDate,\n value,\n onPick,\n locale,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (month: number) => void;\n locale: string;\n}): React.ReactElement {\n const now = new Date();\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 12 }, (_, month) => {\n const isCurrent =\n month === now.getMonth() &&\n viewDate.getFullYear() === now.getFullYear();\n const isSelected =\n !!value &&\n month === value.getMonth() &&\n viewDate.getFullYear() === value.getFullYear();\n return (\n <button\n key={month}\n type=\"button\"\n onClick={() => onPick(month)}\n className={cn(\n \"rounded py-2 text-center text-sm\",\n isCurrent && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {monthName(month, locale)}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction YearsView({\n viewDate,\n value,\n onPick,\n}: {\n viewDate: Date;\n value: Date | null;\n onPick: (year: number) => void;\n}): React.ReactElement {\n const now = new Date().getFullYear();\n const start = decadeStart(viewDate.getFullYear());\n return (\n <div className=\"grid grid-cols-3 gap-2\">\n {Array.from({ length: 10 }, (_, i) => {\n const year = start + i;\n const isSelected = !!value && year === value.getFullYear();\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => onPick(year)}\n className={cn(\n \"rounded py-2 text-center text-sm\",\n year === now && !isSelected && \"border border-primary\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"hover:bg-state-hover\",\n )}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction headerText(\n view: CalendarView,\n viewDate: Date,\n locale: string,\n): string {\n if (view === \"months\") return viewDate.getFullYear().toString();\n if (view === \"years\") {\n const start = decadeStart(viewDate.getFullYear());\n return `${start} - ${start + 9}`;\n }\n return `${monthName(viewDate.getMonth(), locale)} ${viewDate.getFullYear()}`;\n}\n\n// Step the visible range by the unit appropriate to the active view.\nfunction shiftViewDate(\n view: CalendarView,\n viewDate: Date,\n direction: 1 | -1,\n): Date {\n if (view === \"months\") {\n return new Date(viewDate.getFullYear() + direction, viewDate.getMonth(), 1);\n }\n if (view === \"years\") {\n return new Date(decadeStart(viewDate.getFullYear()) + direction * 10, 0, 1);\n }\n return new Date(viewDate.getFullYear(), viewDate.getMonth() + direction, 1);\n}\n\nexport function Calendar({\n value,\n onSelect,\n defaultViewDate,\n precision = \"day\",\n locale,\n}: CalendarProps): React.ReactElement {\n const resolvedLocale = useLocale(locale);\n const terminalView = TERMINAL_VIEW[precision];\n const [view, setView] = React.useState<CalendarView>(terminalView);\n const [viewDate, setViewDate] = React.useState<Date>(\n value ?? defaultViewDate ?? new Date(),\n );\n\n React.useEffect(() => {\n if (value) setViewDate(value);\n }, [value]);\n\n const handleMonthPick = (month: number): void => {\n const next = new Date(viewDate.getFullYear(), month, 1);\n if (precision === \"month\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"days\");\n };\n\n const handleYearPick = (year: number): void => {\n const next = new Date(year, viewDate.getMonth(), 1);\n if (precision === \"year\") {\n onSelect(next);\n return;\n }\n setViewDate(next);\n setView(\"months\");\n };\n\n // The header drills up one level (days -> months -> years) so the user can\n // quickly jump to a distant year. Drilling down is bounded by precision in\n // handleMonthPick / handleYearPick.\n const canDrillUp = view !== \"years\";\n const drillUp = (): void => setView(view === \"days\" ? \"months\" : \"years\");\n\n return (\n <div className=\"w-64\">\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, -1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Previous\"\n >\n <ChevronLeft size={16} />\n </button>\n <button\n type=\"button\"\n onClick={canDrillUp ? drillUp : undefined}\n disabled={!canDrillUp}\n className={cn(\n \"rounded px-2 py-1 font-medium\",\n canDrillUp && \"hover:bg-state-hover\",\n )}\n >\n {headerText(view, viewDate, resolvedLocale)}\n </button>\n <button\n type=\"button\"\n onClick={() => setViewDate(shiftViewDate(view, viewDate, 1))}\n className=\"rounded-full p-1 hover:bg-state-hover\"\n aria-label=\"Next\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n\n {view === \"days\" && (\n <DaysView\n viewDate={viewDate}\n value={value}\n onSelect={onSelect}\n locale={resolvedLocale}\n />\n )}\n {view === \"months\" && (\n <MonthsView\n viewDate={viewDate}\n value={value}\n onPick={handleMonthPick}\n locale={resolvedLocale}\n />\n )}\n {view === \"years\" && (\n <YearsView viewDate={viewDate} value={value} onPick={handleYearPick} />\n )}\n </div>\n );\n}\n","/**\n * TimeInput -- text input for a zone-free time of day.\n *\n * The value is a normalized ISO time string -- `\"HH:mm\"` (minute granularity,\n * default) or `\"HH:mm:ss\"` (second granularity). A time of day carries no date\n * and no timezone (Temporal.PlainTime); consumers that need an instant combine\n * it with a date and zone at persistence time. Typed entry is parsed leniently\n * (see {@link parseTime}); `\"n\"`, `\"now\"`, or `\".\"` enter the current time.\n * Empty value emits \"\".\n */\n\nimport * as React from \"react\";\nimport { Clock } from \"lucide-react\";\nimport {\n cn,\n parseTime,\n normalizeTime,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { Input, InputError } from \"../input\";\n\nexport interface TimeInputProps {\n /** Normalized ISO time string (`\"HH:mm\"` or `\"HH:mm:ss\"`), or \"\". */\n value?: string;\n /** Called with the new normalized ISO time string, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n id?: string;\n name?: string;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function TimeInput({\n value,\n onChange,\n granularity = \"minute\",\n id,\n name,\n placeholder,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: TimeInputProps): React.ReactElement {\n const [inputValue, setInputValue] = React.useState(\"\");\n const [parseError, setParseError] = React.useState(\"\");\n\n const normalized = React.useMemo(\n () => normalizeTime(value, granularity),\n [value, granularity],\n );\n\n // Reflect external value changes into the display string.\n React.useEffect(() => {\n setInputValue(normalized);\n setParseError(\"\");\n }, [normalized]);\n\n const handleBlur = (): void => {\n if (!inputValue.trim()) {\n setParseError(\"\");\n onChange(\"\");\n onBlur?.();\n return;\n }\n const result = parseTime(inputValue, granularity);\n if (result.value) {\n setInputValue(result.value);\n setParseError(\"\");\n onChange(result.value);\n } else {\n setParseError(result.error || \"Invalid time\");\n }\n onBlur?.();\n };\n\n const shownError = error || parseError;\n const placeholderText =\n placeholder ?? (granularity === \"second\" ? \"HH:MM:SS\" : \"HH:MM\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <div className=\"relative\">\n <Input\n id={id}\n name={name}\n type=\"text\"\n inputMode=\"numeric\"\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.currentTarget.value);\n setParseError(\"\");\n }}\n onBlur={handleBlur}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") handleBlur();\n }}\n placeholder={placeholderText}\n required={required}\n disabled={disabled}\n autoComplete=\"off\"\n aria-invalid={shownError ? true : undefined}\n className={cn(\"pr-10\", shownError && \"border-destructive\")}\n />\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-3 text-muted-foreground\">\n <Clock size={16} />\n </span>\n </div>\n <InputError error={shownError} />\n </div>\n );\n}\n","/**\n * DateTimeInput -- combined date + time entry for a plain wall-clock datetime.\n *\n * The value is a plain wall-clock ISO string `\"YYYY-MM-DDTHH:mm[:ss]\"` with no\n * timezone (Temporal.PlainDateTime). Timezone is intentionally not part of the\n * input: a wall-clock datetime means \"this local time\", and resolving it to an\n * absolute instant (UTC) is the consumer's responsibility at persistence time.\n *\n * The optional `timeZone` prop is a pass-through context value (e.g. a clinic's\n * zone supplied programmatically) shown as a hint -- it is never applied to the\n * value and is never entered by the user. Cross-zone apps that need an explicit\n * zone picker should compose one separately.\n *\n * Composes {@link DateInput} (day precision) and {@link TimeInput}.\n */\n\nimport * as React from \"react\";\nimport {\n cn,\n splitDateTime,\n joinDateTime,\n formatIsoDate,\n type TimeGranularity,\n} from \"@petrarca/sonnet-core\";\nimport { DateInput } from \"../DateInput\";\nimport { TimeInput } from \"../TimeInput\";\n\nexport interface DateTimeInputProps {\n /** Plain wall-clock ISO datetime `\"YYYY-MM-DDTHH:mm[:ss]\"`, or \"\". */\n value?: string;\n /** Called with the new plain wall-clock ISO datetime, or \"\" when cleared. */\n onChange: (value: string) => void;\n /** Time granularity. Default `\"minute\"`. */\n granularity?: TimeGranularity;\n /**\n * Optional timezone context (IANA id, e.g. `\"Europe/Berlin\"`). Shown as a\n * hint only; never applied to the value and never user-entered.\n */\n timeZone?: string;\n /** BCP-47 locale override for the date part. Defaults to the app locale. */\n locale?: string;\n idPrefix?: string;\n required?: boolean;\n disabled?: boolean;\n error?: string;\n className?: string;\n onBlur?: () => void;\n}\n\nexport function DateTimeInput({\n value,\n onChange,\n granularity = \"minute\",\n timeZone,\n locale,\n idPrefix,\n required,\n disabled,\n error,\n className,\n onBlur,\n}: DateTimeInputProps): React.ReactElement {\n const { date, time } = React.useMemo(() => splitDateTime(value), [value]);\n\n const handleDateChange = (nextDate: string): void => {\n onChange(joinDateTime(nextDate, time));\n };\n\n const handleTimeChange = (nextTime: string): void => {\n if (!nextTime) {\n onChange(date ? joinDateTime(date, \"\") : \"\");\n return;\n }\n // Entering a time before a date (e.g. via the \"now\" shorthand) defaults\n // the date to today so the result is a complete datetime.\n onChange(joinDateTime(date || formatIsoDate(new Date()), nextTime));\n };\n\n return (\n <div className={cn(\"space-y-1\", className)}>\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <DateInput\n id={idPrefix ? `${idPrefix}-date` : undefined}\n value={date}\n onChange={handleDateChange}\n locale={locale}\n error={error}\n required={required}\n disabled={disabled}\n onBlur={onBlur}\n />\n </div>\n <div className=\"w-32\">\n <TimeInput\n id={idPrefix ? `${idPrefix}-time` : undefined}\n value={time}\n onChange={handleTimeChange}\n granularity={granularity}\n disabled={disabled}\n onBlur={onBlur}\n />\n </div>\n </div>\n {timeZone && (\n <p className=\"text-xs text-tertiary-foreground\">Times in {timeZone}</p>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-60\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className,\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]\",\n \"h-9 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:ring-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n },\n);\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n // Focus treatment matches Input -- see the note there.\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background transition-[color,box-shadow] px-3 py-2 text-base placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","import * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref,\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n ),\n);\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import * as React from \"react\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nexport interface ResizeHandleProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Orientation of the handle bar:\n * - \"vertical\" (default): a vertical bar separating LEFT/RIGHT panes\n * (drag horizontally). Uses `cursor-col-resize`.\n * - \"horizontal\": a horizontal bar separating TOP/BOTTOM panes\n * (drag vertically). Uses `cursor-row-resize`.\n */\n orientation?: \"vertical\" | \"horizontal\";\n /** Length of the centered grip in pixels. Defaults to 48. */\n gripLength?: number;\n}\n\n/**\n * ResizeHandle — a quiet, flat draggable divider between two resizable panes.\n *\n * Renders a wide invisible hit-area with a short centered grip (quiet\n * `bg-border` at rest, `bg-border-strong` on hover), a focus ring, and the\n * correct `role=\"separator\"` / `aria-orientation` / resize cursor. No\n * full-height seam line — the adjacent panes own their own edges.\n *\n * The consumer owns the resize math: wire `onPointerDown` (and optionally\n * `onDoubleClick`, `tabIndex`, `aria-valuenow`/min/max) via props.\n *\n * @example\n * <ResizeHandle\n * orientation=\"vertical\"\n * aria-valuenow={width}\n * aria-valuemin={MIN}\n * aria-valuemax={MAX}\n * onPointerDown={startResize}\n * onDoubleClick={resetWidth}\n * />\n */\nexport const ResizeHandle = React.forwardRef<HTMLDivElement, ResizeHandleProps>(\n (\n { orientation = \"vertical\", gripLength = 48, className, style, ...props },\n ref,\n ) => {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n \"group relative flex shrink-0 select-none touch-none items-center justify-center rounded-sm\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n isVertical\n ? \"mx-1 w-2 cursor-col-resize\"\n : \"my-1 h-2 cursor-row-resize\",\n className,\n )}\n style={style}\n {...props}\n >\n {/* Centered short grip — no full-height seam line. */}\n <div\n className=\"pointer-events-none absolute rounded-full bg-border transition-colors group-hover:bg-border-strong\"\n style={\n isVertical\n ? { width: 4, height: gripLength }\n : { height: 4, width: gripLength }\n }\n />\n </div>\n );\n },\n);\nResizeHandle.displayName = \"ResizeHandle\";\n","/**\n * Sheet — a slide-over panel (drawer) built on Radix Dialog.\n * Slides in from the right edge. Used for create/edit/detail operations.\n *\n * SheetContent accepts an optional `offsetTop` (CSS length, e.g. \"3rem\")\n * to push the panel below a fixed header. The overlay is unaffected so the\n * backdrop still covers the full screen.\n */\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Sheet = DialogPrimitive.Root;\nconst SheetTrigger = DialogPrimitive.Trigger;\nconst SheetClose = DialogPrimitive.Close;\nconst SheetPortal = DialogPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst SheetContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n side?: \"right\" | \"left\";\n /** CSS length (e.g. \"3rem\" or \"0px\") controlling where the panel starts vertically. Internal use — prefer PanelOptions.coverage at the shell API level. */\n offsetTop?: string;\n }\n>(\n (\n { className, children, side = \"right\", offsetTop = \"0px\", style, ...props },\n ref,\n ) => (\n <SheetPortal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 flex flex-col bg-background shadow-xl transition-transform duration-300 ease-in-out\",\n \"bottom-0 w-[480px] max-w-[90vw] border-l\",\n side === \"right\" &&\n \"right-0 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n side === \"left\" &&\n \"left-0 border-l-0 border-r data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left\",\n className,\n )}\n style={{ top: offsetTop, ...style }}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </SheetPortal>\n ),\n);\nSheetContent.displayName = \"SheetContent\";\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"shrink-0 border-b px-6 py-4\", className)} {...props} />\n);\n\nconst SheetTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = \"SheetTitle\";\n\nconst SheetDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground mt-1\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = \"SheetDescription\";\n\nconst SheetBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex-1 overflow-y-auto px-6 py-4\", className)}\n {...props}\n />\n);\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"shrink-0 border-t px-6 py-4 flex justify-end gap-2\",\n className,\n )}\n {...props}\n />\n);\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetOverlay,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n SheetFooter,\n};\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n \"flex-start\": \"items-start\",\n \"flex-end\": \"items-end\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n \"space-between\": \"justify-between\",\n \"flex-start\": \"justify-start\",\n \"flex-end\": \"justify-end\",\n} as const;\n\nconst wrapMap = {\n wrap: \"flex-wrap\",\n nowrap: \"flex-nowrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n} as const;\n\nconst mtMap: Record<string, string> = {\n xs: \"mt-1\",\n sm: \"mt-2\",\n md: \"mt-4\",\n lg: \"mt-6\",\n xl: \"mt-8\",\n};\n\ninterface SimpleGroupProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n wrap?: keyof typeof wrapMap;\n grow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n mt?: keyof typeof mtMap;\n onClick?: () => void;\n}\n\n/**\n * SimpleGroup - A horizontal flex container component\n *\n * Replaces Mantine's Group with a simpler Tailwind-based implementation.\n * Defaults to flex-row (horizontal layout).\n *\n * @example\n * <SimpleGroup gap=\"sm\" justify=\"between\">\n * <div>Left item</div>\n * <div>Right item</div>\n * </SimpleGroup>\n */\nexport function SimpleGroup({\n children,\n gap = \"md\",\n align,\n justify,\n wrap,\n grow = false,\n className,\n style,\n mt,\n onClick,\n}: SimpleGroupProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n const wrapClass = wrap ? wrapMap[wrap] : undefined;\n const growClass = grow ? \"[&>*]:flex-1\" : undefined;\n const mtClass = mt ? mtMap[mt] : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-row\",\n gapClass,\n alignClass,\n justifyClass,\n wrapClass,\n growClass,\n mtClass,\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst gapMap = {\n 0: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n 2: \"gap-0.5\",\n 4: \"gap-1\",\n 6: \"gap-1.5\",\n 8: \"gap-2\",\n 24: \"gap-6\",\n} as const;\n\nconst alignMap = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n} as const;\n\nconst justifyMap = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n} as const;\n\ninterface SimpleStackProps {\n children: React.ReactNode;\n gap?: keyof typeof gapMap;\n align?: keyof typeof alignMap;\n justify?: keyof typeof justifyMap;\n className?: string;\n style?: React.CSSProperties;\n h?: number | string;\n}\n\n/**\n * SimpleStack - A vertical flex container component\n *\n * Replaces Mantine's Stack with a simpler Tailwind-based implementation.\n * Defaults to flex-col (vertical stacking).\n *\n * @example\n * <SimpleStack gap=\"md\" align=\"center\">\n * <div>Item 1</div>\n * <div>Item 2</div>\n * </SimpleStack>\n */\nexport function SimpleStack({\n children,\n gap = \"md\",\n align,\n justify,\n className,\n style,\n h,\n}: SimpleStackProps): React.ReactElement {\n const gapClass = gapMap[gap] || gapMap.md;\n const alignClass = align ? alignMap[align] : undefined;\n const justifyClass = justify ? justifyMap[justify] : undefined;\n\n const heightStyle =\n h !== undefined\n ? { height: typeof h === \"number\" ? `${h}px` : h }\n : undefined;\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n gapClass,\n alignClass,\n justifyClass,\n className,\n )}\n style={{ ...heightStyle, ...style }}\n >\n {children}\n </div>\n );\n}\n","import { cn } from \"@petrarca/sonnet-core\";\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import { cn } from \"@petrarca/sonnet-core\";\n\ninterface SpinnerProps {\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4 border-2\",\n md: \"h-8 w-8 border-2\",\n lg: \"h-12 w-12 border-3\",\n};\n\n/**\n * Simple loading spinner component\n *\n * Replaces Mantine's Loader component\n *\n * @example\n * ```tsx\n * <Spinner />\n * <Spinner size=\"lg\" />\n * <Spinner className=\"text-blue-500\" />\n * ```\n */\nexport function Spinner({ className, size = \"md\" }: SpinnerProps) {\n return (\n <div\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\",\n sizeClasses[size],\n className,\n )}\n role=\"status\"\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n}\n","import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@petrarca/sonnet-core\";\n\nconst Tabs = TabsPrimitive.Root;\n\ninterface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n /** Alignment of tabs: 'start' (left), 'center', or 'end' (right). Default: 'start' */\n align?: \"start\" | \"center\" | \"end\";\n}\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, align = \"start\", ...props }, ref) => {\n const alignClass =\n align === \"center\"\n ? \"justify-center\"\n : align === \"end\"\n ? \"justify-end\"\n : \"justify-start\";\n\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center rounded-md bg-muted p-1 text-muted-foreground\",\n alignClass,\n className,\n )}\n {...props}\n />\n );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"data-[state=inactive]:hidden\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\n/**\n * TabsSeparator -- a thin, non-interactive vertical divider placed inside a\n * TabsList to visually group related triggers (e.g. preview tabs vs. source\n * tabs). Presentational only; not part of the roving-tabindex order.\n */\nconst TabsSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\n \"mx-2 h-6 w-0.5 shrink-0 rounded-full bg-muted-foreground/40\",\n className,\n )}\n {...props}\n />\n));\nTabsSeparator.displayName = \"TabsSeparator\";\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, TabsSeparator };\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport {\n Direction as DirectionPrimitive,\n Slot as SlotPrimitive,\n} from \"radix-ui\";\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@petrarca/sonnet-core\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useAsRef } from \"./radix/hooks/use-as-ref\";\nimport { useIsomorphicLayoutEffect } from \"./radix/hooks/use-isomorphic-layout-effect\";\nimport { useLazyRef } from \"./radix/hooks/use-lazy-ref\";\n\nconst ROOT_NAME = \"Stepper\";\nconst LIST_NAME = \"StepperList\";\nconst ITEM_NAME = \"StepperItem\";\nconst TRIGGER_NAME = \"StepperTrigger\";\nconst INDICATOR_NAME = \"StepperIndicator\";\nconst SEPARATOR_NAME = \"StepperSeparator\";\nconst TITLE_NAME = \"StepperTitle\";\nconst DESCRIPTION_NAME = \"StepperDescription\";\nconst CONTENT_NAME = \"StepperContent\";\nconst PREV_NAME = \"StepperPrev\";\nconst NEXT_NAME = \"StepperNext\";\n\nconst ENTRY_FOCUS = \"stepperFocusGroup.onEntryFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\nconst ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\ntype Direction = \"ltr\" | \"rtl\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype NavigationDirection = \"next\" | \"prev\";\ntype ActivationMode = \"automatic\" | \"manual\";\ntype DataState = \"inactive\" | \"active\" | \"completed\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype ListElement = React.ComponentRef<typeof StepperList>;\ntype TriggerElement = React.ComponentRef<typeof StepperTrigger>;\n\nfunction getId(\n id: string,\n variant: \"trigger\" | \"content\" | \"title\" | \"description\",\n value: string,\n) {\n return `${id}-${variant}-${value}`;\n}\n\ntype FocusIntent = \"first\" | \"last\" | \"prev\" | \"next\";\n\nconst MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\",\n};\n\nfunction getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\"\n ? \"ArrowRight\"\n : key === \"ArrowRight\"\n ? \"ArrowLeft\"\n : key;\n}\n\nfunction getFocusIntent(\n event: React.KeyboardEvent<TriggerElement>,\n dir?: Direction,\n orientation?: Orientation,\n) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key))\n return undefined;\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key))\n return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nfunction focusFirst(\n candidates: React.RefObject<TriggerElement | null>[],\n preventScroll = false,\n) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map<T>(\n (_, index) => array[(startIndex + index) % array.length] as T,\n );\n}\n\n/**\n * Handles Enter/Space key activation for manual and non-interactive modes.\n * Returns true if the event was handled (caller should return early).\n */\nfunction handleActivationKeys(\n event: React.KeyboardEvent<TriggerElement>,\n nonInteractive: boolean,\n activationMode: ActivationMode,\n isDisabled: boolean | undefined,\n triggerRef: React.RefObject<TriggerElement | null>,\n): boolean {\n if (event.key === \"Enter\" && nonInteractive) {\n event.preventDefault();\n return true;\n }\n\n if (\n (event.key === \"Enter\" || event.key === \" \") &&\n activationMode === \"manual\" &&\n !nonInteractive\n ) {\n event.preventDefault();\n if (!isDisabled && triggerRef.current) {\n triggerRef.current.click();\n }\n return true;\n }\n\n return false;\n}\n\nfunction hasModifierKey(event: React.KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;\n}\n\n/**\n * Resolves the ordered list of focus candidates based on intent direction.\n */\nfunction resolveFocusCandidates(\n items: ItemData[],\n focusIntent: FocusIntent,\n currentTarget: TriggerElement,\n loop: boolean,\n): React.RefObject<TriggerElement | null>[] {\n let candidateRefs = items.map((item) => item.ref);\n\n if (focusIntent === \"last\") {\n candidateRefs.reverse();\n } else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateRefs.reverse();\n const currentIndex = candidateRefs.findIndex(\n (ref) => ref.current === currentTarget,\n );\n candidateRefs = loop\n ? wrapArray(candidateRefs, currentIndex + 1)\n : candidateRefs.slice(currentIndex + 1);\n }\n\n return candidateRefs;\n}\n\n/**\n * Handles step validation and navigation when the store has validation.\n * Returns true if navigation was handled (caller should return early).\n */\nasync function handleValidatedNavigation(\n store: Store,\n candidateRefs: React.RefObject<TriggerElement | null>[],\n items: ItemData[],\n itemValue: string,\n value: string | undefined,\n steps: Map<string, StepState>,\n): Promise<boolean> {\n if (!store.hasValidation() || candidateRefs.length === 0) return false;\n\n const nextRef = candidateRefs[0];\n const nextElement = nextRef?.current;\n const nextItem = items.find((item) => item.ref.current === nextElement);\n\n if (!nextItem || nextItem.value === itemValue) return false;\n\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(nextItem.value);\n const direction: NavigationDirection =\n targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n if (direction === \"next\") {\n const isValid = await store.setStateWithValidation(\n nextItem.value,\n direction,\n );\n if (!isValid) return true;\n } else {\n store.setState(\"value\", nextItem.value);\n }\n\n queueMicrotask(() => nextElement?.focus());\n return true;\n}\n\nfunction getDataState(\n value: string | undefined,\n itemValue: string,\n stepState: StepState | undefined,\n steps: Map<string, StepState>,\n variant: \"item\" | \"separator\" = \"item\",\n): DataState {\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.indexOf(itemValue);\n\n if (stepState?.completed) return \"completed\";\n\n if (value === itemValue) {\n return variant === \"separator\" ? \"inactive\" : \"active\";\n }\n\n if (value) {\n const activeIndex = stepKeys.indexOf(value);\n\n if (activeIndex > currentIndex) return \"completed\";\n }\n\n return \"inactive\";\n}\n\ninterface StepState {\n value: string;\n completed: boolean;\n disabled: boolean;\n}\n\ninterface StoreState {\n steps: Map<string, StepState>;\n value: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStateWithValidation: (\n value: string,\n direction: NavigationDirection,\n ) => Promise<boolean>;\n hasValidation: () => boolean;\n notify: () => void;\n addStep: (value: string, completed: boolean, disabled: boolean) => void;\n removeStep: (value: string) => void;\n setStep: (value: string, completed: boolean, disabled: boolean) => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector],\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ninterface ItemData {\n id: string;\n ref: React.RefObject<TriggerElement | null>;\n value: string;\n active: boolean;\n disabled: boolean;\n}\n\ninterface StepperContextValue {\n rootId: string;\n dir: Direction;\n orientation: Orientation;\n activationMode: ActivationMode;\n disabled: boolean;\n nonInteractive: boolean;\n loop: boolean;\n}\n\nconst StepperContext = React.createContext<StepperContextValue | null>(null);\n\nfunction useStepperContext(consumerName: string) {\n const context = React.useContext(StepperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperProps extends DivProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onValueComplete?: (value: string, completed: boolean) => void;\n onValueAdd?: (value: string) => void;\n onValueRemove?: (value: string) => void;\n onValidate?: (\n value: string,\n direction: NavigationDirection,\n ) => boolean | Promise<boolean>;\n activationMode?: ActivationMode;\n dir?: Direction;\n orientation?: Orientation;\n disabled?: boolean;\n loop?: boolean;\n nonInteractive?: boolean;\n}\n\nfunction Stepper(props: StepperProps) {\n const {\n value,\n defaultValue,\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n dir: dirProp,\n orientation = \"horizontal\",\n activationMode = \"automatic\",\n asChild,\n disabled = false,\n nonInteractive = false,\n loop = false,\n className,\n id,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n steps: new Map(),\n value: value ?? defaultValue ?? \"\",\n }));\n\n const propsRef = useAsRef({\n onValueChange,\n onValueComplete,\n onValueAdd,\n onValueRemove,\n onValidate,\n });\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n setStateWithValidation: async (value, direction) => {\n if (!propsRef.current.onValidate) {\n store.setState(\"value\", value);\n return true;\n }\n\n try {\n const isValid = await propsRef.current.onValidate(value, direction);\n if (isValid) {\n store.setState(\"value\", value);\n }\n return isValid;\n } catch {\n return false;\n }\n },\n hasValidation: () => !!propsRef.current.onValidate,\n addStep: (value, completed, disabled) => {\n const newStep: StepState = { value, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, newStep);\n stateRef.current.steps = next;\n propsRef.current.onValueAdd?.(value);\n store.notify();\n },\n removeStep: (value) => {\n const next = new Map(stateRef.current.steps);\n next.delete(value);\n stateRef.current.steps = next;\n propsRef.current.onValueRemove?.(value);\n store.notify();\n },\n setStep: (value, completed, disabled) => {\n const step = stateRef.current.steps.get(value);\n if (step) {\n const updatedStep: StepState = { ...step, completed, disabled };\n const next = new Map(stateRef.current.steps);\n next.set(value, updatedStep);\n stateRef.current.steps = next;\n\n if (completed !== step.completed) {\n propsRef.current.onValueComplete?.(value, completed);\n }\n\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef, propsRef]);\n\n useIsomorphicLayoutEffect(() => {\n if (value !== undefined) {\n store.setState(\"value\", value);\n }\n }, [value]);\n\n const dir = DirectionPrimitive.useDirection(dirProp);\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n\n const contextValue = React.useMemo<StepperContextValue>(\n () => ({\n rootId,\n dir,\n orientation,\n activationMode,\n disabled,\n nonInteractive,\n loop,\n }),\n [rootId, dir, orientation, activationMode, disabled, nonInteractive, loop],\n );\n\n const RootPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <StepperContext.Provider value={contextValue}>\n <RootPrimitive\n id={rootId}\n data-disabled={disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-slot=\"stepper\"\n dir={dir}\n {...rootProps}\n className={cn(\n \"flex gap-3\",\n orientation === \"horizontal\" ? \"w-full flex-col\" : \"flex-row\",\n className,\n )}\n />\n </StepperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface FocusContextValue {\n tabStopId: string | null;\n onItemFocus: (tabStopId: string) => void;\n onItemShiftTab: () => void;\n onFocusableItemAdd: () => void;\n onFocusableItemRemove: () => void;\n onItemRegister: (item: ItemData) => void;\n onItemUnregister: (id: string) => void;\n getItems: () => ItemData[];\n}\n\nconst FocusContext = React.createContext<FocusContextValue | null>(null);\n\nfunction useFocusContext(consumerName: string) {\n const context = React.useContext(FocusContext);\n if (!context) {\n throw new Error(\n `\\`${consumerName}\\` must be used within \\`FocusProvider\\``,\n );\n }\n return context;\n}\n\nfunction StepperList(props: DivProps) {\n const {\n asChild,\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n className,\n children,\n ref,\n ...listProps\n } = props;\n\n const context = useStepperContext(LIST_NAME);\n const orientation = context.orientation;\n const currentValue = useStore((state) => state.value);\n\n const propsRef = useAsRef({\n onBlur: onBlurProp,\n onFocus: onFocusProp,\n onMouseDown: onMouseDownProp,\n });\n\n const [tabStopId, setTabStopId] = React.useState<string | null>(null);\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const [focusableItemCount, setFocusableItemCount] = React.useState(0);\n const isClickFocusRef = React.useRef(false);\n const itemsRef = React.useRef<Map<string, ItemData>>(new Map());\n const listRef = React.useRef<ListElement>(null);\n const composedRef = useComposedRefs(ref, listRef);\n\n const onItemFocus = React.useCallback((tabStopId: string) => {\n setTabStopId(tabStopId);\n }, []);\n\n const onItemShiftTab = React.useCallback(() => {\n setIsTabbingBackOut(true);\n }, []);\n\n const onFocusableItemAdd = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount + 1);\n }, []);\n\n const onFocusableItemRemove = React.useCallback(() => {\n setFocusableItemCount((prevCount) => prevCount - 1);\n }, []);\n\n const onItemRegister = React.useCallback((item: ItemData) => {\n itemsRef.current.set(item.id, item);\n }, []);\n\n const onItemUnregister = React.useCallback((id: string) => {\n itemsRef.current.delete(id);\n }, []);\n\n const getItems = React.useCallback(() => {\n return Array.from(itemsRef.current.values())\n .filter((item) => item.ref.current)\n .sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n }, []);\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onBlur?.(event);\n if (event.defaultPrevented) return;\n\n setIsTabbingBackOut(false);\n },\n [propsRef],\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<ListElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n const isKeyboardFocus = !isClickFocusRef.current;\n if (\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !isTabbingBackOut\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = Array.from(itemsRef.current.values()).filter(\n (item) => !item.disabled,\n );\n const selectedItem = currentValue\n ? items.find((item) => item.value === currentValue)\n : undefined;\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === tabStopId);\n\n const candidateItems = [\n selectedItem,\n activeItem,\n currentItem,\n ...items,\n ].filter(Boolean) as ItemData[];\n const candidateRefs = candidateItems.map((item) => item.ref);\n focusFirst(candidateRefs, false);\n }\n }\n isClickFocusRef.current = false;\n },\n [propsRef, isTabbingBackOut, currentValue, tabStopId],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<ListElement>) => {\n propsRef.current.onMouseDown?.(event);\n\n if (event.defaultPrevented) return;\n\n isClickFocusRef.current = true;\n },\n [propsRef],\n );\n\n const focusContextValue = React.useMemo<FocusContextValue>(\n () => ({\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n }),\n [\n tabStopId,\n onItemFocus,\n onItemShiftTab,\n onFocusableItemAdd,\n onFocusableItemRemove,\n onItemRegister,\n onItemUnregister,\n getItems,\n ],\n );\n\n const ListPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <FocusContext.Provider value={focusContextValue}>\n <ListPrimitive\n role=\"tablist\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-slot=\"stepper-list\"\n dir={context.dir}\n tabIndex={isTabbingBackOut || focusableItemCount === 0 ? -1 : 0}\n {...listProps}\n ref={composedRef}\n className={cn(\n \"flex outline-none\",\n orientation === \"horizontal\"\n ? \"flex-row items-center\"\n : \"flex-col items-start\",\n className,\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n onMouseDown={onMouseDown}\n >\n {children}\n </ListPrimitive>\n </FocusContext.Provider>\n );\n}\n\ninterface StepperItemContextValue {\n value: string;\n stepState: StepState | undefined;\n}\n\nconst StepperItemContext = React.createContext<StepperItemContextValue | null>(\n null,\n);\n\nfunction useStepperItemContext(consumerName: string) {\n const context = React.useContext(StepperItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface StepperItemProps extends DivProps {\n value: string;\n completed?: boolean;\n disabled?: boolean;\n}\n\nfunction StepperItem(props: StepperItemProps) {\n const {\n value: itemValue,\n completed = false,\n disabled = false,\n asChild,\n className,\n children,\n ref,\n ...itemProps\n } = props;\n\n const context = useStepperContext(ITEM_NAME);\n const store = useStoreContext(ITEM_NAME);\n const orientation = context.orientation;\n const value = useStore((state) => state.value);\n\n useIsomorphicLayoutEffect(() => {\n store.addStep(itemValue, completed, disabled);\n\n return () => {\n store.removeStep(itemValue);\n };\n }, [itemValue, completed, disabled]);\n\n useIsomorphicLayoutEffect(() => {\n store.setStep(itemValue, completed, disabled);\n }, [itemValue, completed, disabled]);\n\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const itemContextValue = React.useMemo<StepperItemContextValue>(\n () => ({\n value: itemValue,\n stepState,\n }),\n [itemValue, stepState],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <StepperItemContext.Provider value={itemContextValue}>\n <ItemPrimitive\n data-disabled={stepState?.disabled ? \"\" : undefined}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-item\"\n dir={context.dir}\n {...itemProps}\n ref={ref}\n className={cn(\n \"relative flex not-last:flex-1 items-center\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className,\n )}\n >\n {children}\n </ItemPrimitive>\n </StepperItemContext.Provider>\n );\n}\n\nfunction StepperTrigger(props: ButtonProps) {\n const {\n asChild,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n disabled,\n className,\n ref,\n ...triggerProps\n } = props;\n\n const context = useStepperContext(TRIGGER_NAME);\n const itemContext = useStepperItemContext(TRIGGER_NAME);\n const itemValue = itemContext.value;\n\n const store = useStoreContext(TRIGGER_NAME);\n const focusContext = useFocusContext(TRIGGER_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const stepState = useStore((state) => state.steps.get(itemValue));\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n onMouseDown: onMouseDownProp,\n });\n\n const activationMode = context.activationMode;\n const orientation = context.orientation;\n const loop = context.loop;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemValue);\n\n const stepPosition = stepIndex + 1;\n const stepCount = steps.size;\n\n const triggerId = getId(context.rootId, \"trigger\", itemValue);\n const contentId = getId(context.rootId, \"content\", itemValue);\n const titleId = getId(context.rootId, \"title\", itemValue);\n const descriptionId = getId(context.rootId, \"description\", itemValue);\n\n const isDisabled = disabled || stepState?.disabled || context.disabled;\n const isActive = value === itemValue;\n const isTabStop = focusContext.tabStopId === triggerId;\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const triggerRef = React.useRef<TriggerElement>(null);\n const composedRef = useComposedRefs(ref, triggerRef);\n const isArrowKeyPressedRef = React.useRef(false);\n const isMouseClickRef = React.useRef(false);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (ARROW_KEYS.includes(event.key)) {\n isArrowKeyPressedRef.current = true;\n }\n }\n function onKeyUp() {\n isArrowKeyPressedRef.current = false;\n }\n document.addEventListener(\"keydown\", onKeyDown);\n document.addEventListener(\"keyup\", onKeyUp);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keyup\", onKeyUp);\n };\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n focusContext.onItemRegister({\n id: triggerId,\n ref: triggerRef,\n value: itemValue,\n active: isTabStop,\n disabled: !!isDisabled,\n });\n\n if (!isDisabled) {\n focusContext.onFocusableItemAdd();\n }\n\n return () => {\n focusContext.onItemUnregister(triggerId);\n if (!isDisabled) {\n focusContext.onFocusableItemRemove();\n }\n };\n }, [focusContext, triggerId, itemValue, isTabStop, isDisabled]);\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented) return;\n\n if (!isDisabled && !context.nonInteractive) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value ?? \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n },\n [\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onFocus = React.useCallback(\n async (event: React.FocusEvent<TriggerElement>) => {\n propsRef.current.onFocus?.(event);\n if (event.defaultPrevented) return;\n\n focusContext.onItemFocus(triggerId);\n\n const isKeyboardFocus = !isMouseClickRef.current;\n\n if (\n !isActive &&\n !isDisabled &&\n activationMode !== \"manual\" &&\n !context.nonInteractive &&\n isKeyboardFocus\n ) {\n const currentStepIndex = Array.from(steps.keys()).indexOf(value || \"\");\n const targetStepIndex = Array.from(steps.keys()).indexOf(itemValue);\n const direction = targetStepIndex > currentStepIndex ? \"next\" : \"prev\";\n\n await store.setStateWithValidation(itemValue, direction);\n }\n\n isMouseClickRef.current = false;\n },\n [\n focusContext,\n triggerId,\n activationMode,\n isActive,\n isDisabled,\n context.nonInteractive,\n store,\n itemValue,\n value,\n steps,\n propsRef,\n ],\n );\n\n const onKeyDown = React.useCallback(\n async (event: React.KeyboardEvent<TriggerElement>) => {\n propsRef.current.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (\n handleActivationKeys(\n event,\n context.nonInteractive,\n activationMode,\n isDisabled,\n triggerRef,\n )\n )\n return;\n\n if (event.key === \"Tab\" && event.shiftKey) {\n focusContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== event.currentTarget) return;\n\n const focusIntent = getFocusIntent(event, context.dir, orientation);\n\n if (focusIntent !== undefined) {\n if (hasModifierKey(event)) return;\n event.preventDefault();\n\n const items = focusContext.getItems().filter((item) => !item.disabled);\n const candidateRefs = resolveFocusCandidates(\n items,\n focusIntent,\n event.currentTarget,\n loop,\n );\n\n const didNavigate = await handleValidatedNavigation(\n store,\n candidateRefs,\n items,\n itemValue,\n value,\n steps,\n );\n if (didNavigate) return;\n\n queueMicrotask(() => focusFirst(candidateRefs));\n }\n },\n [\n focusContext,\n context.nonInteractive,\n context.dir,\n activationMode,\n orientation,\n loop,\n isDisabled,\n store,\n propsRef,\n itemValue,\n value,\n steps,\n ],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<TriggerElement>) => {\n propsRef.current.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n isMouseClickRef.current = true;\n\n if (isDisabled) {\n event.preventDefault();\n } else {\n focusContext.onItemFocus(triggerId);\n }\n },\n [focusContext, triggerId, isDisabled, propsRef],\n );\n\n const TriggerPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <TriggerPrimitive\n id={triggerId}\n role=\"tab\"\n type=\"button\"\n aria-controls={contentId}\n aria-current={isActive ? \"step\" : undefined}\n aria-describedby={`${titleId} ${descriptionId}`}\n aria-posinset={stepPosition}\n aria-selected={isActive}\n aria-setsize={stepCount}\n data-disabled={isDisabled ? \"\" : undefined}\n data-state={dataState}\n data-slot=\"stepper-trigger\"\n disabled={isDisabled}\n tabIndex={isTabStop ? 0 : -1}\n {...triggerProps}\n ref={composedRef}\n className={cn(\n \"inline-flex items-center justify-center gap-3 rounded-md text-left outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"not-has-data-[slot=description]:rounded-full not-has-data-[slot=title]:rounded-full\",\n className,\n )}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n />\n );\n}\n\ninterface StepperIndicatorProps extends Omit<DivProps, \"children\"> {\n children?: React.ReactNode | ((dataState: DataState) => React.ReactNode);\n}\n\nfunction StepperIndicator(props: StepperIndicatorProps) {\n const { className, children, asChild, ref, ...indicatorProps } = props;\n\n const context = useStepperContext(INDICATOR_NAME);\n const itemContext = useStepperItemContext(INDICATOR_NAME);\n\n const value = useStore((state) => state.value);\n const itemValue = itemContext.value;\n const stepState = useStore((state) => state.steps.get(itemValue));\n const steps = useStore((state) => state.steps);\n\n const stepPosition = Array.from(steps.keys()).indexOf(itemValue) + 1;\n\n const dataState = getDataState(value, itemValue, stepState, steps);\n\n const IndicatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <IndicatorPrimitive\n data-state={dataState}\n data-slot=\"stepper-indicator\"\n dir={context.dir}\n {...indicatorProps}\n ref={ref}\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-full border-2 border-muted bg-background font-medium text-muted-foreground text-sm transition-colors data-[state=active]:border-primary data-[state=completed]:border-primary data-[state=active]:bg-primary data-[state=completed]:bg-primary data-[state=active]:text-primary-foreground data-[state=completed]:text-primary-foreground\",\n className,\n )}\n >\n {typeof children === \"function\" ? (\n children(dataState)\n ) : children ? (\n children\n ) : dataState === \"completed\" ? (\n <Check className=\"size-4\" />\n ) : (\n stepPosition\n )}\n </IndicatorPrimitive>\n );\n}\n\ninterface StepperSeparatorProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction StepperSeparator(props: StepperSeparatorProps) {\n const {\n className,\n asChild,\n forceMount = false,\n ref,\n ...separatorProps\n } = props;\n\n const context = useStepperContext(SEPARATOR_NAME);\n const itemContext = useStepperItemContext(SEPARATOR_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const orientation = context.orientation;\n\n const stepIndex = Array.from(steps.keys()).indexOf(itemContext.value);\n\n const isLastStep = stepIndex === steps.size - 1;\n\n if (isLastStep && !forceMount) return null;\n\n const dataState = getDataState(\n value,\n itemContext.value,\n itemContext.stepState,\n steps,\n \"separator\",\n );\n\n const SeparatorPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SeparatorPrimitive\n role=\"separator\"\n aria-hidden=\"true\"\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={dataState}\n data-slot=\"stepper-separator\"\n dir={context.dir}\n {...separatorProps}\n ref={ref}\n className={cn(\n \"bg-border transition-colors data-[state=active]:bg-primary data-[state=completed]:bg-primary\",\n orientation === \"horizontal\" ? \"h-px flex-1\" : \"h-10 w-px\",\n className,\n )}\n />\n );\n}\n\ninterface StepperTitleProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperTitle(props: StepperTitleProps) {\n const { className, asChild, ref, ...titleProps } = props;\n\n const context = useStepperContext(TITLE_NAME);\n const itemContext = useStepperItemContext(TITLE_NAME);\n\n const titleId = getId(context.rootId, \"title\", itemContext.value);\n\n const TitlePrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <TitlePrimitive\n id={titleId}\n data-slot=\"title\"\n dir={context.dir}\n {...titleProps}\n ref={ref}\n className={cn(\"font-medium text-sm\", className)}\n />\n );\n}\n\ninterface StepperDescriptionProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction StepperDescription(props: StepperDescriptionProps) {\n const { className, asChild, ref, ...descriptionProps } = props;\n\n const context = useStepperContext(DESCRIPTION_NAME);\n const itemContext = useStepperItemContext(DESCRIPTION_NAME);\n\n const descriptionId = getId(context.rootId, \"description\", itemContext.value);\n\n const DescriptionPrimitive = asChild ? SlotPrimitive.Slot : \"span\";\n\n return (\n <DescriptionPrimitive\n id={descriptionId}\n data-slot=\"description\"\n dir={context.dir}\n {...descriptionProps}\n ref={ref}\n className={cn(\"text-muted-foreground text-xs\", className)}\n />\n );\n}\n\ninterface StepperContentProps extends DivProps {\n value: string;\n forceMount?: boolean;\n}\n\nfunction StepperContent(props: StepperContentProps) {\n const {\n value: valueProp,\n asChild,\n forceMount = false,\n ref,\n className,\n ...contentProps\n } = props;\n\n const context = useStepperContext(CONTENT_NAME);\n const value = useStore((state) => state.value);\n\n const contentId = getId(context.rootId, \"content\", valueProp);\n const triggerId = getId(context.rootId, \"trigger\", valueProp);\n\n if (valueProp !== value && !forceMount) return null;\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <ContentPrimitive\n id={contentId}\n role=\"tabpanel\"\n aria-labelledby={triggerId}\n data-slot=\"stepper-content\"\n dir={context.dir}\n {...contentProps}\n ref={ref}\n className={cn(\"flex-1 outline-none\", className)}\n />\n );\n}\n\nfunction StepperPrev(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...prevProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled = disabled || currentIndex <= 0;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const prevIndex = Math.max(currentIndex - 1, 0);\n const prevStepValue = stepKeys[prevIndex];\n\n if (prevStepValue) {\n store.setState(\"value\", prevStepValue);\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const PrevPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <PrevPrimitive\n type=\"button\"\n data-slot=\"stepper-prev\"\n disabled={isDisabled}\n {...prevProps}\n onClick={onClick}\n />\n );\n}\n\nfunction StepperNext(props: ButtonProps) {\n const { asChild, onClick: onClickProp, disabled, ...nextProps } = props;\n\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const propsRef = useAsRef({\n onClick: onClickProp,\n });\n\n const stepKeys = Array.from(steps.keys());\n const currentIndex = stepKeys.length > 0 ? stepKeys.indexOf(value ?? \"\") : -1;\n const isDisabled =\n disabled || stepKeys.length === 0 || currentIndex >= stepKeys.length - 1;\n\n const onClick = React.useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n propsRef.current.onClick?.(event);\n if (event.defaultPrevented || isDisabled) return;\n\n const nextIndex = Math.min(currentIndex + 1, stepKeys.length - 1);\n const nextStepValue = stepKeys[nextIndex];\n\n if (nextStepValue) {\n await store.setStateWithValidation(nextStepValue, \"next\");\n }\n },\n [propsRef, isDisabled, currentIndex, stepKeys, store],\n );\n\n const NextPrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <NextPrimitive\n type=\"button\"\n data-slot=\"stepper-next\"\n disabled={isDisabled}\n {...nextProps}\n onClick={onClick}\n />\n );\n}\n\nexport {\n Stepper,\n StepperList,\n StepperItem,\n StepperTrigger,\n StepperIndicator,\n StepperSeparator,\n StepperTitle,\n StepperDescription,\n StepperContent,\n StepperPrev,\n StepperNext,\n //\n useStore as useStepper,\n //\n type StepperProps,\n};\n","import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n","import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n","/**\n * EntityTable -- generic paginated table driven by JSON Schema + UI Schema.\n *\n * Column definitions are derived from schema.properties via resolveColumns().\n * Domain-specific cell rendering is handled by passing a local renderer\n * registry via the renderers prop; x-ui-cell names in the schema are\n * resolved against the local registry first, then the global registry.\n *\n * Pagination is opt-in. When pagination + onPaginationChange are provided the\n * table runs in manualPagination mode and renders prev/next controls.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click on a row calls onRowClick\n * directly (navigation / edit). No keyboard focus management.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, arrow keys navigate rows, Space toggles selection on the\n * focused row, Enter is suppressed. The parent receives selected rows\n * via onSelectionChange.\n *\n * Extractable to @petrarca/sonnet-ui.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type Row,\n type ColumnDef,\n} from \"@tanstack/react-table\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { useComponentDefaults } from \"@petrarca/sonnet-core/config\";\nimport { Checkbox } from \"../checkbox\";\nimport type { PageResult } from \"@petrarca/sonnet-core\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"./tableSchema\";\n\nexport type { PageMeta } from \"@petrarca/sonnet-core\";\nexport type { CellRenderer, PageResult, PaginationState };\n\n/** How a row's detail (onRowClick) is opened. */\nexport type RowActivation = \"click\" | \"double-click\";\n\n/**\n * Props of EntityTable that can be defaulted app-wide via SonnetConfigProvider.\n * Behavioral, non-data props only.\n */\nexport interface EntityTableConfigurable {\n rowActivation: RowActivation;\n showChevron: boolean;\n}\n\ndeclare module \"@petrarca/sonnet-core\" {\n interface SonnetComponentDefaults {\n EntityTable?: { defaultProps?: Partial<EntityTableConfigurable> };\n }\n}\n\n/** Declarative row action rendered as a button in a trailing \"Actions\" column. */\nexport interface RowAction<TRow> {\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n variant?: \"default\" | \"destructive\" | \"ghost\";\n onClick: (row: TRow) => void;\n hidden?: (row: TRow) => boolean;\n disabled?: (row: TRow) => boolean;\n}\n\nconst coreRowModel = getCoreRowModel();\n\nexport interface EntityTableProps<TRow extends RowData> {\n // Column definition via JSON Schema + optional UI Schema overlay.\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n\n // Local cell renderer registry. Checked before the global registry\n // for domain-specific renderers that only apply to this table.\n renderers?: Record<string, CellRenderer>;\n\n // Data\n data: PageResult<TRow> | undefined;\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n\n // Empty state\n entityLabel: string;\n isFiltered?: boolean;\n emptyMessage?: string;\n\n // Row interaction -- opens detail/edit panel.\n onRowClick?: (row: TRow) => void;\n\n /**\n * How onRowClick (open detail) is triggered. Resolved against app-wide\n * config (SonnetConfigProvider) then the built-in default \"click\".\n *\n * \"click\" -- single-click on a row opens detail (default,\n * preserves existing behavior). The chevron is a\n * non-interactive affordance.\n * \"double-click\" -- single-click sets the active row (and fires\n * onActiveRowChange); double-click, or clicking the\n * trailing chevron button, opens detail.\n */\n rowActivation?: RowActivation;\n\n /**\n * Fired when the active (single-selected) row changes. Only meaningful when\n * rowActivation is \"double-click\" and selectionMode is off. null when the\n * active row is cleared.\n */\n onActiveRowChange?: (row: TRow | null) => void;\n\n /**\n * Whether to show the trailing chevron column. Resolved against app-wide\n * config then a built-in default of \"show when onRowClick is set\". In\n * \"double-click\" mode the chevron is an interactive button that opens detail.\n */\n showChevron?: boolean;\n\n // Selection mode (opt-in). When true: checkboxes appear, click toggles\n // selection, pencil/edit gestures are suppressed. When false (default):\n // normal browse/edit behavior with active row and pencil icon.\n selectionMode?: boolean;\n onSelectionChange?: (selectedRows: TRow[]) => void;\n /**\n * Stable identity for a row, used to key the selection.\n *\n * Without it the selection is keyed by row position, so it means \"the rows\n * currently in these slots\" and cannot survive paging or refiltering -- the\n * table clears it whenever `data` changes to keep that safe. Supply this and\n * the selection is keyed by identity instead: it survives a page change, and\n * a bulk action can span pages.\n */\n getRowId?: (row: TRow) => string;\n\n // Server-side pagination (opt-in)\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n\n // Declarative row actions rendered in a trailing \"Actions\" column.\n // Only shown when at least one action is provided.\n rowActions?: RowAction<TRow>[];\n}\n\n// ---------------------------------------------------------------------------\n// Defaults resolver -- moves default-param branches out of EntityTable.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedDefaults {\n isFiltered: boolean;\n selectionMode: boolean;\n}\n\nfunction resolveTableDefaults(props: {\n isFiltered?: boolean;\n selectionMode?: boolean;\n}): ResolvedDefaults {\n return {\n isFiltered: props.isFiltered ?? false,\n selectionMode: props.selectionMode ?? false,\n };\n}\n\n// App-wide-configurable behavioral props (rowActivation, showChevron) are\n// resolved here: instance prop > SonnetConfigProvider default > built-in.\nconst ENTITY_TABLE_BUILTIN: EntityTableConfigurable = {\n rowActivation: \"click\",\n showChevron: true,\n};\n\ninterface ResolvedActivation {\n rowActivation: RowActivation;\n // showChevron is only meaningful when onRowClick exists; when explicitly set\n // to false the chevron column is suppressed.\n showChevron: boolean;\n}\n\nfunction useResolvedActivation(props: {\n rowActivation?: RowActivation;\n showChevron?: boolean;\n}): ResolvedActivation {\n const resolved = useComponentDefaults<Record<string, unknown>>(\n \"EntityTable\",\n ENTITY_TABLE_BUILTIN as unknown as Record<string, unknown>,\n {\n rowActivation: props.rowActivation,\n showChevron: props.showChevron,\n } as Record<string, unknown>,\n );\n return {\n rowActivation: resolved.rowActivation as RowActivation,\n showChevron: resolved.showChevron as boolean,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Column builders (unchanged)\n// ---------------------------------------------------------------------------\n\n/** Build TanStack ColumnDef[] from resolved column descriptors. */\nfunction buildColumnDefs<TRow extends RowData>(\n resolved: ResolvedColumn[],\n localRenderers?: Record<string, CellRenderer>,\n): ColumnDef<TRow>[] {\n return resolved.map((col) => {\n const Renderer = resolveCellRenderer(col.cellRenderer, localRenderers);\n const options = col.cellOptions;\n const colDef: ColumnDef<TRow> = {\n id: col.key,\n accessorKey: col.key,\n header: col.label,\n cell: ({\n getValue,\n row,\n }: {\n getValue: () => unknown;\n row: Row<TRow>;\n }) => (\n <Renderer\n value={getValue()}\n row={row.original as Record<string, unknown>}\n options={options}\n />\n ),\n };\n if (col.width !== undefined) colDef.size = col.width;\n if (col.minWidth !== undefined) {\n colDef.minSize = col.minWidth;\n // TanStack gives every column a default minSize, so the resolved\n // columnDef cannot tell an authored floor from the framework's. Carry\n // the schema's intent separately for the header to read.\n colDef.meta = { ...colDef.meta, minWidth: col.minWidth };\n }\n return colDef;\n });\n}\n\n/** Checkbox column prepended when row selection is enabled. */\nfunction buildSelectColumn<TRow extends RowData>(): ColumnDef<TRow> {\n return {\n id: \"_select\",\n size: 40,\n header: ({ table: t }) => (\n <Checkbox\n checked={\n t.getIsAllPageRowsSelected() ||\n (t.getIsSomePageRowsSelected() ? \"indeterminate\" : false)\n }\n onCheckedChange={(value) => t.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n onClick={(e) => e.stopPropagation()}\n aria-label=\"Select row\"\n />\n ),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Build TanStack table options -- isolates the conditional spreads.\n// ---------------------------------------------------------------------------\n\nfunction buildTableOptions<TRow extends RowData>(opts: {\n dataRows: TRow[];\n columns: ColumnDef<TRow>[];\n tableState: Record<string, unknown>;\n selectionMode: boolean;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n onPaginationChange: OnChangeFn<PaginationState> | undefined;\n getRowId: ((row: TRow) => string) | undefined;\n}) {\n const base = {\n data: opts.dataRows,\n columns: opts.columns,\n getCoreRowModel: coreRowModel,\n state: opts.tableState,\n };\n\n const selectionOpts = opts.selectionMode\n ? { enableRowSelection: true, onRowSelectionChange: opts.setRowSelection }\n : {};\n\n // TanStack keys row selection by whatever getRowId returns, defaulting to the\n // row index. Supplying one makes the selection identity-based.\n const rowIdOpts = opts.getRowId\n ? { getRowId: (row: TRow) => opts.getRowId!(row) }\n : {};\n\n const paginationOpts = opts.isPaginated\n ? {\n manualPagination: true,\n rowCount: opts.data?.meta.total ?? 0,\n onPaginationChange: opts.onPaginationChange,\n }\n : {};\n\n return { ...base, ...selectionOpts, ...paginationOpts, ...rowIdOpts };\n}\n\n// ---------------------------------------------------------------------------\n// useEntityTableState -- all hooks, effects, and table instance.\n// ---------------------------------------------------------------------------\n\ninterface EntityTableState<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n dataRows: TRow[];\n isPaginated: boolean;\n rowSelection: RowSelectionState;\n setRowSelection: React.Dispatch<React.SetStateAction<RowSelectionState>>;\n activeRowIndex: number;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n columns: ColumnDef<TRow>[];\n}\n\nfunction useEntityTableState<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n selectionMode: boolean,\n): EntityTableState<TRow> {\n const {\n schema,\n uiSchema,\n renderers,\n data,\n pagination,\n onPaginationChange,\n onSelectionChange,\n getRowId,\n } = props;\n\n const isPaginated = !!(pagination && onPaginationChange);\n\n const dataRows = useMemo(() => data?.data ?? [], [data]);\n\n // Clamp pageIndex when total drops below current page after a deletion.\n const total = data?.meta.total;\n const pageIndex = pagination?.pageIndex ?? 0;\n const pageSize = pagination?.pageSize ?? 1;\n useEffect(() => {\n if (!isPaginated || total == null || !onPaginationChange) return;\n const maxPage = Math.max(0, Math.ceil(total / pageSize) - 1);\n if (pageIndex > maxPage) {\n onPaginationChange((prev) => ({ ...prev, pageIndex: maxPage }));\n }\n }, [total, isPaginated, pageIndex, pageSize, onPaginationChange]);\n\n // Row selection state. Without getRowId the selection is keyed by row\n // position, so it silently refers to different records once the rows change;\n // clearing it on every data change is what keeps that safe. With a stable id\n // the keys mean something across pages, so the selection is kept.\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const keyedById = !!getRowId;\n useEffect(() => {\n if (keyedById) return;\n setRowSelection({});\n }, [data, keyedById]);\n\n // Active row index for keyboard navigation.\n const [activeRowIndex, setActiveRowIndex] = useState<number>(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const dataColumns = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return buildColumnDefs<TRow>(resolveColumns(schema, uiSchema), renderers);\n }, [schema, uiSchema, renderers]);\n\n const selectColumn = useMemo(\n () => (selectionMode ? buildSelectColumn<TRow>() : null),\n [selectionMode],\n );\n\n const columns = useMemo<ColumnDef<TRow>[]>(\n () => (selectColumn ? [selectColumn, ...dataColumns] : dataColumns),\n [selectColumn, dataColumns],\n );\n\n // Notify parent when selection changes.\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n useEffect(() => {\n if (!selectionMode || !onSelectionChangeRef.current) return;\n const keys = Object.keys(rowSelection).filter((k) => rowSelection[k]);\n // Keys are ids when getRowId is supplied, row indices otherwise. Either\n // way only rows on the current page can be resolved to objects; a\n // selection spanning pages reports the ones currently loaded.\n const selected = getRowId\n ? dataRows.filter((row) => keys.includes(getRowId(row)))\n : keys\n .map(Number)\n .map((i) => dataRows[i])\n .filter((r): r is TRow => r !== undefined);\n onSelectionChangeRef.current(selected);\n }, [rowSelection, selectionMode, dataRows, getRowId]);\n\n // Build a single unified state object to avoid conditional spread merging.\n const tableState = useMemo(\n () => ({\n ...(isPaginated ? { pagination } : {}),\n ...(selectionMode ? { rowSelection } : {}),\n }),\n [isPaginated, pagination, selectionMode, rowSelection],\n );\n\n const tableOptions = buildTableOptions({\n dataRows,\n columns,\n tableState,\n selectionMode,\n setRowSelection,\n isPaginated,\n data,\n onPaginationChange,\n getRowId,\n });\n\n const table = useReactTable<TRow>(tableOptions);\n\n // Scroll active row into view.\n useEffect(() => {\n if (activeRowIndex < 0 || !containerRef.current) return;\n const rows = containerRef.current.querySelectorAll(\"tbody tr\");\n rows[activeRowIndex]?.scrollIntoView({ block: \"nearest\" });\n }, [activeRowIndex]);\n\n return {\n table,\n dataRows,\n isPaginated,\n rowSelection,\n setRowSelection,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n };\n}\n\n// ---------------------------------------------------------------------------\n// useActiveRowEvent -- single-active-row activation + neutral change event.\n// ---------------------------------------------------------------------------\n\n/**\n * In single-active-row mode (rowActivation \"double-click\", not selectionMode),\n * returns a handler that sets the active row, and fires the neutral\n * onActiveRowChange whenever the active row changes -- independent of whether\n * the change came from a click, keyboard, or data update. In all other modes\n * the returned handler only moves the active index and no event fires.\n */\nfunction useActiveRowEvent<TRow extends RowData>(args: {\n selectionMode: boolean;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n onActiveRowChange: ((row: TRow | null) => void) | undefined;\n activeRowIndex: number;\n dataRows: TRow[];\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n}): (index: number) => void {\n const {\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n } = args;\n\n const singleActiveMode =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n\n const onChangeRef = useRef(onActiveRowChange);\n onChangeRef.current = onActiveRowChange;\n\n useEffect(() => {\n if (!singleActiveMode) return;\n const row = activeRowIndex >= 0 ? (dataRows[activeRowIndex] ?? null) : null;\n onChangeRef.current?.(row);\n }, [singleActiveMode, activeRowIndex, dataRows]);\n\n return useCallback(\n (index: number) => setActiveRowIndex(index),\n [setActiveRowIndex],\n );\n}\n\n// ---------------------------------------------------------------------------\n// useTableKeyboard -- keyboard navigation handler.\n// ---------------------------------------------------------------------------\n\nfunction useTableKeyboard<TRow extends RowData>(\n table: ReturnType<typeof useReactTable<TRow>>,\n activeRowIndex: number,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n return useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const tableRows = table.getRowModel().rows;\n if (tableRows.length === 0) return;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.min(prev + 1, tableRows.length - 1));\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setActiveRowIndex((prev) => Math.max(prev - 1, 0));\n break;\n }\n case \"Enter\": {\n handleEnterKey(\n e,\n tableRows,\n selectionMode,\n activeRowIndex,\n onRowClick,\n );\n break;\n }\n case \" \": {\n handleSpaceKey(e, tableRows, selectionMode, activeRowIndex);\n break;\n }\n }\n },\n [activeRowIndex, onRowClick, selectionMode, table, setActiveRowIndex],\n );\n}\n\n/**\n * Width style for a header cell. `x-ui-column.width` becomes an exact width and\n * `minWidth` a floor; a column may set either, both, or neither. The floor is\n * read from `meta`, not `minSize`, because TanStack defaults `minSize` on every\n * column and the two are indistinguishable there.\n */\nfunction headerWidthStyle(columnDef: {\n size?: number;\n meta?: { minWidth?: number };\n}): React.CSSProperties | undefined {\n const size = columnDef.size;\n const minWidth = columnDef.meta?.minWidth;\n if (size === undefined && minWidth === undefined) return undefined;\n return {\n ...(size !== undefined && { width: size }),\n ...(minWidth !== undefined && { minWidth }),\n };\n}\n\nfunction handleEnterKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n onRowClick: ((row: TRow) => void) | undefined,\n) {\n e.preventDefault();\n if (selectionMode || activeRowIndex < 0 || !onRowClick) return;\n const activeRow = tableRows[activeRowIndex];\n if (activeRow) onRowClick(activeRow.original);\n}\n\nfunction handleSpaceKey<TRow extends RowData>(\n e: React.KeyboardEvent<HTMLDivElement>,\n tableRows: Row<TRow>[],\n selectionMode: boolean,\n activeRowIndex: number,\n) {\n if (!selectionMode || activeRowIndex < 0) return;\n e.preventDefault();\n tableRows[activeRowIndex]?.toggleSelected();\n}\n\n// ---------------------------------------------------------------------------\n// Trailing-column flags\n// ---------------------------------------------------------------------------\n\ninterface TrailingColFlags {\n hasRowActions: boolean;\n hasChevron: boolean;\n hasTrailingCol: boolean;\n}\n\n/**\n * Whether the table is keyboard-operable, and so needs a tab stop and a key\n * handler. Selection mode uses Space to select; a row-click table uses Enter to\n * open. Gating on selection mode alone left every browse-mode table unreachable\n * by keyboard -- not even focusable -- although the Enter handler exists for it.\n * A table with neither is a static grid and stays out of the tab order.\n */\nfunction isKeyboardOperable<TRow>(\n selectionMode: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): boolean {\n return selectionMode || !!onRowClick;\n}\n\nfunction resolveTrailingCols<TRow>(\n rowActions: RowAction<TRow>[] | undefined,\n onRowClick: ((row: TRow) => void) | undefined,\n selectionMode: boolean,\n showChevron: boolean,\n): TrailingColFlags {\n const hasRowActions = !!(rowActions && rowActions.length > 0);\n const hasChevron = !!(\n onRowClick &&\n showChevron &&\n !selectionMode &&\n !hasRowActions\n );\n return {\n hasRowActions,\n hasChevron,\n hasTrailingCol: hasRowActions || hasChevron,\n };\n}\n\n// ---------------------------------------------------------------------------\n// StatusRows sub-component\n// ---------------------------------------------------------------------------\n\ninterface StatusRowsProps {\n isLoading: boolean;\n isError: boolean;\n errorMessage: string | undefined;\n entityLabel: string;\n isFiltered: boolean;\n emptyMessage: string | undefined;\n isEmpty: boolean;\n colCount: number;\n}\n\nfunction StatusRows({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n isFiltered,\n emptyMessage,\n isEmpty,\n colCount,\n}: StatusRowsProps): React.ReactElement | null {\n if (isLoading) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n Loading...\n </td>\n </tr>\n );\n }\n if (isError) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-destructive\"\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </td>\n </tr>\n );\n }\n if (isEmpty) {\n return (\n <tr>\n <td\n colSpan={colCount}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {resolveEmptyMessage(emptyMessage, isFiltered, entityLabel)}\n </td>\n </tr>\n );\n }\n return null;\n}\n\nfunction resolveEmptyMessage(\n emptyMessage: string | undefined,\n isFiltered: boolean,\n entityLabel: string,\n): string {\n if (emptyMessage) return emptyMessage;\n if (isFiltered) return `No ${entityLabel} match your search.`;\n return `No ${entityLabel} yet.`;\n}\n\n// ---------------------------------------------------------------------------\n// RowActionCell sub-component\n// ---------------------------------------------------------------------------\n\ninterface RowActionCellProps<TRow> {\n actions: RowAction<TRow>[];\n rowOriginal: TRow;\n}\n\nfunction RowActionCell<TRow>({\n actions,\n rowOriginal,\n}: RowActionCellProps<TRow>): React.ReactElement {\n return (\n <td className=\"px-4 py-3 w-24 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n {actions.map((action) => (\n <ActionButton\n key={action.label}\n action={action}\n rowOriginal={rowOriginal}\n />\n ))}\n </div>\n </td>\n );\n}\n\ninterface ActionButtonProps<TRow> {\n action: RowAction<TRow>;\n rowOriginal: TRow;\n}\n\nfunction ActionButton<TRow>({\n action,\n rowOriginal,\n}: ActionButtonProps<TRow>): React.ReactElement | null {\n const isHidden = action.hidden?.(rowOriginal);\n if (isHidden) return null;\n const isDisabled = action.disabled?.(rowOriginal);\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n title={action.label}\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick(rowOriginal);\n }}\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n action.variant === \"destructive\"\n ? \"text-destructive hover:bg-destructive/10\"\n : \"text-muted-foreground hover:bg-accent\",\n isDisabled\n ? \"opacity-30 cursor-not-allowed group-hover/row:opacity-30\"\n : \"opacity-0 group-hover/row:opacity-100 focus:opacity-100\",\n )}\n >\n {Icon ? (\n <Icon className=\"h-3.5 w-3.5\" />\n ) : (\n <span className=\"text-xs\">{action.label}</span>\n )}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DataRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface DataRowProps<TRow extends RowData> {\n row: Row<TRow>;\n index: number;\n selectionMode: boolean;\n rowActivation: RowActivation;\n activeRowIndex: number;\n onRowClick: ((row: TRow) => void) | undefined;\n onActivateRow: (index: number) => void;\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>;\n containerRef: React.RefObject<HTMLDivElement | null>;\n hasRowActions: boolean;\n hasChevron: boolean;\n rowActions: RowAction<TRow>[] | undefined;\n}\n\n// Trailing chevron cell. Decorative in \"click\" mode; an interactive\n// \"open detail\" button in \"double-click\" mode (single-click selects instead).\nfunction ChevronCell<TRow>({\n rowOriginal,\n rowActivation,\n onRowClick,\n}: {\n rowOriginal: TRow;\n rowActivation: RowActivation;\n onRowClick: ((row: TRow) => void) | undefined;\n}): React.ReactElement {\n const asButton = rowActivation === \"double-click\" && !!onRowClick;\n return (\n <td className=\"px-4 py-3 w-10\">\n {asButton ? (\n <button\n type=\"button\"\n title=\"Open\"\n onClick={(e) => {\n e.stopPropagation();\n onRowClick!(rowOriginal);\n }}\n className=\"inline-flex items-center justify-center h-7 w-7 rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </td>\n );\n}\n\nfunction rowClassName<TRow extends RowData>(\n row: Row<TRow>,\n isActive: boolean,\n selectionMode: boolean,\n singleClickSelects: boolean,\n onRowClick: ((row: TRow) => void) | undefined,\n): string {\n return cn(\n \"border-b last:border-b-0 transition-colors group/row\",\n onRowClick && !selectionMode && \"hover:bg-accent/50 cursor-pointer\",\n selectionMode && \"cursor-default\",\n row.getIsSelected() && \"bg-primary/10\",\n isActive && selectionMode && \"bg-accent\",\n isActive && singleClickSelects && \"bg-primary/10\",\n );\n}\n\nfunction DataRow<TRow extends RowData>({\n row,\n index,\n selectionMode,\n rowActivation,\n activeRowIndex,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n hasRowActions,\n hasChevron,\n rowActions,\n}: DataRowProps<TRow>): React.ReactElement {\n // In double-click mode a single click selects (sets active row); detail is\n // opened by double-click or the chevron button. In click mode a single click\n // opens detail directly (existing behavior).\n const singleClickSelects =\n !selectionMode && rowActivation === \"double-click\" && !!onRowClick;\n const isActive = index === activeRowIndex;\n return (\n <tr\n key={row.id}\n onClick={() => {\n handleRowClick(\n row,\n index,\n selectionMode,\n rowActivation,\n onRowClick,\n onActivateRow,\n setActiveRowIndex,\n containerRef,\n );\n }}\n onDoubleClick={() => {\n if (singleClickSelects && onRowClick) onRowClick(row.original);\n }}\n className={rowClassName(\n row,\n isActive,\n selectionMode,\n singleClickSelects,\n onRowClick,\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n {hasRowActions && (\n <RowActionCell actions={rowActions!} rowOriginal={row.original} />\n )}\n {hasChevron && (\n <ChevronCell\n rowOriginal={row.original}\n rowActivation={rowActivation}\n onRowClick={onRowClick}\n />\n )}\n </tr>\n );\n}\n\nfunction handleRowClick<TRow extends RowData>(\n row: Row<TRow>,\n index: number,\n selectionMode: boolean,\n rowActivation: RowActivation,\n onRowClick: ((row: TRow) => void) | undefined,\n onActivateRow: (index: number) => void,\n setActiveRowIndex: React.Dispatch<React.SetStateAction<number>>,\n containerRef: React.RefObject<HTMLDivElement | null>,\n): void {\n if (selectionMode) {\n row.toggleSelected();\n setActiveRowIndex(index);\n containerRef.current?.focus();\n return;\n }\n if (rowActivation === \"double-click\" && onRowClick) {\n // Single click selects the active row; detail opens on double-click.\n onActivateRow(index);\n return;\n }\n if (onRowClick) onRowClick(row.original);\n}\n\n// ---------------------------------------------------------------------------\n// TableFooter sub-component\n// ---------------------------------------------------------------------------\n\ninterface TableFooterProps<TRow extends RowData> {\n isPaginated: boolean;\n data: PageResult<TRow> | undefined;\n dataRows: TRow[];\n entityLabel: string;\n table: ReturnType<typeof useReactTable<TRow>>;\n}\n\nfunction TableFooter<TRow extends RowData>({\n isPaginated,\n data,\n dataRows,\n entityLabel,\n table,\n}: TableFooterProps<TRow>): React.ReactElement | null {\n if (!data?.meta) return null;\n if (isPaginated) {\n return <PaginationFooter table={table} entityLabel={entityLabel} />;\n }\n return (\n <p className=\"text-xs text-muted-foreground mt-3\">\n Showing {dataRows.length} of {data.meta.total} {entityLabel}\n </p>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EntityTable -- main component\n// ---------------------------------------------------------------------------\n\nexport function EntityTable<TRow extends RowData>(\n props: EntityTableProps<TRow>,\n): React.ReactElement {\n const {\n data,\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n onRowClick,\n onActiveRowChange,\n rowActions,\n } = props;\n\n const { isFiltered, selectionMode } = resolveTableDefaults(props);\n const { rowActivation, showChevron } = useResolvedActivation(props);\n\n const {\n table,\n dataRows,\n isPaginated,\n activeRowIndex,\n setActiveRowIndex,\n containerRef,\n columns,\n } = useEntityTableState(props, selectionMode);\n\n const handleKeyDown = useTableKeyboard(\n table,\n activeRowIndex,\n setActiveRowIndex,\n selectionMode,\n onRowClick,\n );\n\n const handleActivateRow = useActiveRowEvent({\n selectionMode,\n rowActivation,\n onRowClick,\n onActiveRowChange,\n activeRowIndex,\n dataRows,\n setActiveRowIndex,\n });\n\n const { hasRowActions, hasChevron, hasTrailingCol } = resolveTrailingCols(\n rowActions,\n onRowClick,\n selectionMode,\n showChevron,\n );\n\n const colCount = columns.length + (hasTrailingCol ? 1 : 0);\n\n const isInteractive = isKeyboardOperable(selectionMode, onRowClick);\n\n return (\n <div>\n <div\n ref={isInteractive ? containerRef : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n onKeyDown={isInteractive ? handleKeyDown : undefined}\n className={cn(\"rounded-lg border\", isInteractive && \"outline-none\")}\n >\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/40\">\n {table.getFlatHeaders().map((header) => (\n <th\n key={header.id}\n className=\"text-left text-xs font-medium text-muted-foreground px-4 py-2.5\"\n style={headerWidthStyle(header.column.columnDef)}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </th>\n ))}\n {hasRowActions && (\n <th\n aria-label=\"Actions\"\n scope=\"col\"\n className=\"w-24 text-right text-xs font-medium text-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 rowActivation={rowActivation}\n activeRowIndex={activeRowIndex}\n onRowClick={onRowClick}\n onActivateRow={handleActivateRow}\n setActiveRowIndex={setActiveRowIndex}\n containerRef={containerRef}\n hasRowActions={hasRowActions}\n hasChevron={hasChevron}\n rowActions={rowActions}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n <TableFooter\n isPaginated={isPaginated}\n data={data}\n dataRows={dataRows}\n entityLabel={entityLabel}\n table={table}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PaginationFooter (unchanged)\n// ---------------------------------------------------------------------------\n\ninterface PaginationFooterProps<TRow extends RowData> {\n table: ReturnType<typeof useReactTable<TRow>>;\n entityLabel: string;\n}\n\nfunction PaginationFooter<TRow extends RowData>({\n table,\n entityLabel,\n}: PaginationFooterProps<TRow>): React.ReactElement {\n const { pageIndex, pageSize } = table.getState().pagination;\n const rowCount = table.getRowCount();\n const pageCount = table.getPageCount();\n const from = rowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const to = Math.min((pageIndex + 1) * pageSize, rowCount);\n\n return (\n <div className=\"flex items-center justify-between mt-3\">\n <p className=\"text-xs text-muted-foreground\">\n {rowCount === 0\n ? `No ${entityLabel}`\n : `Showing ${from}\\u2013${to} of ${rowCount} ${entityLabel}`}\n </p>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Previous\n </button>\n <span className=\"text-xs text-muted-foreground px-2\">\n {pageCount > 0 ? `${pageIndex + 1} / ${pageCount}` : \"--\"}\n </span>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"px-2 py-1 text-xs rounded border border-border text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n","/**\n * Merge base schema x-ui-column/x-ui-cell annotations with UI schema overrides.\n *\n * UI schema wins on all conflicts. x-ui-column and x-ui-cell-options are\n * shallow-merged so the UI schema can override individual keys (e.g. just width)\n * without repeating the full config.\n *\n * The merge is add-and-replace only: an overlay may set a key or change its\n * value, but cannot REMOVE a key the base schema set. Writing `null`\n * (e.g. `x-ui-cell-options: { colors: null }`) does not clear an inherited\n * option -- it stores `null`. Clearing an inherited option is deliberately not a\n * capability; if a renderer needs an explicit \"off\", model it as a real value\n * that renderer understands, not as a delete sentinel.\n *\n * Extractable to @petrarca/sonnet-core -- no React, no DOM.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { TableUiSchema } from \"./types\";\n\nexport interface MergedColumnConfig {\n order?: number;\n hidden: boolean;\n width?: number;\n minWidth?: number;\n label?: string;\n cellRenderer?: string;\n cellOptions: Record<string, unknown>;\n}\n\n/**\n * Merge x-ui-column, x-ui-cell, and x-ui-cell-options from the base property\n * and the UI schema entry for a single field. UI schema wins on all conflicts.\n */\n// Resolve the cell renderer name from schema and UI schema (UI wins).\nfunction resolveCellRenderer(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): string | undefined {\n return uiEntry?.[\"x-ui-cell\"] ?? property[\"x-ui-cell\"];\n}\n\n// Merge cell options from schema and UI schema (UI wins on conflicts). Add and\n// replace only -- see the module docblock; `null` does not clear a base key.\nfunction resolveCellOptions(\n property: JsonSchemaProperty,\n uiEntry?: TableUiSchema[string],\n): Record<string, unknown> {\n return {\n ...(property[\"x-ui-cell-options\"] ?? {}),\n ...(uiEntry?.[\"x-ui-cell-options\"] ?? {}),\n };\n}\n\nexport function mergeColumnConfig(\n key: string,\n property: JsonSchemaProperty,\n uiSchema?: TableUiSchema,\n): MergedColumnConfig {\n const uiEntry = uiSchema?.[key];\n const merged = {\n ...(property[\"x-ui-column\"] ?? {}),\n ...(uiEntry?.[\"x-ui-column\"] ?? {}),\n };\n\n return {\n order: merged.order,\n hidden: merged.hidden ?? false,\n width: merged.width,\n minWidth: merged.minWidth,\n label: merged.label,\n cellRenderer: resolveCellRenderer(property, uiEntry),\n cellOptions: resolveCellOptions(property, uiEntry),\n };\n}\n","/**\n * Cell renderer registry, resolution helpers, and the createRenderer factory.\n *\n * Separate from cellRenderers.tsx so that non-component exports\n * (registry object, pure functions, factory) do not violate react-refresh\n * rules.\n *\n * Extractable to @petrarca/sonnet-core (pure logic) /\n * @petrarca/sonnet-ui (registry with React components).\n */\n\nimport React from \"react\";\nimport { warnLog } from \"@petrarca/sonnet-core\";\nimport {\n TextCell,\n MutedCell,\n BoldCell,\n CodeCell,\n BadgeCell,\n ConditionalBadgeCell,\n DateCell,\n DateTimeCell,\n BooleanCell,\n NumberCell,\n TruncateCell,\n OverflowListCell,\n JoinCell,\n type CellRenderer,\n type CellRendererProps,\n} from \"./cellRenderers\";\n\nexport type { CellRenderer };\n\n/** Registry mapping renderer names to components. */\nexport const CELL_RENDERERS: Record<string, CellRenderer> = {\n text: TextCell,\n muted: MutedCell,\n bold: BoldCell,\n code: CodeCell,\n badge: BadgeCell,\n \"badge-when\": ConditionalBadgeCell,\n date: DateCell,\n datetime: DateTimeCell,\n boolean: BooleanCell,\n number: NumberCell,\n truncate: TruncateCell,\n \"overflow-list\": OverflowListCell,\n join: JoinCell,\n};\n\n/**\n * Infer a default renderer name from a property's type and format.\n * Used when no explicit x-ui-cell is set.\n */\nexport function inferCellRenderer(\n type: string | undefined,\n format: string | undefined,\n): string {\n if (type === \"boolean\") return \"boolean\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"string\") {\n if (format === \"date-time\") return \"datetime\";\n if (format === \"date\") return \"date\";\n }\n return \"text\";\n}\n\n/**\n * Resolve a cell renderer by name.\n * Checks the optional local registry first, then the global registry,\n * then falls back to TextCell.\n */\nexport function resolveCellRenderer(\n name: string,\n localRenderers?: Record<string, CellRenderer>,\n): CellRenderer {\n return localRenderers?.[name] ?? CELL_RENDERERS[name] ?? TextCell;\n}\n\n/**\n * Factory for creating typed local cell renderers.\n *\n * Local renderer names must start with `x-` to distinguish them from\n * built-in renderers (e.g. `x-audit-actors`, `x-trade-risk`). This\n * follows the same convention as the `x-ui-*` schema extensions.\n * Built-in names like `badge`, `datetime`, `muted` stay clean and\n * unprefixed. A dev-mode warning is logged if the convention is violated.\n *\n * The render function receives the full typed row and the x-ui-cell-options\n * from the schema. This keeps the schema purely declarative (no functions)\n * while giving domain-specific renderers full type safety.\n *\n * For generic table viewers where the row type is not known, omit the\n * type parameter -- TRow defaults to Record<string, unknown> and you\n * inspect the row dynamically using options as hints.\n *\n * @example\n * ```ts\n * import { createRenderer } from \"@petrarca/sonnet-ui\";\n * import type { AuditLogEntry } from \"../schemas\";\n *\n * const RENDERERS = {\n * \"x-audit-actors\": createRenderer<AuditLogEntry>((row, options) => {\n * // row is fully typed, options from x-ui-cell-options in the schema.\n * return <span>{row.actors[0]?.name ?? \"--\"}</span>;\n * }),\n * };\n *\n * // Schema stays pure data:\n * // actors: { \"x-ui-cell\": \"x-audit-actors\" }\n *\n * <EntityTable schema={SCHEMA} renderers={RENDERERS} ... />\n * ```\n */\nexport function createRenderer<TRow = Record<string, unknown>>(\n render: (row: TRow, options: Record<string, unknown>) => React.ReactNode,\n): CellRenderer {\n return ({ row, options }: CellRendererProps) =>\n React.createElement(React.Fragment, null, render(row as TRow, options));\n}\n\n/**\n * Validate that all keys in a local renderer registry follow the x- prefix\n * convention. Logs a warning in dev mode for each violation.\n */\nexport function validateRendererNames(\n renderers: Record<string, CellRenderer>,\n): void {\n for (const name of Object.keys(renderers)) {\n if (!name.startsWith(\"x-\")) {\n warnLog(\n `[EntityTable] Local renderer \"${name}\" should use the x- prefix ` +\n `(e.g. \"x-${name}\"). Built-in renderer names are unprefixed.`,\n );\n }\n }\n}\n","/**\n * Built-in cell renderer components for schema-driven EntityTable.\n *\n * Each renderer is a React component that receives the raw cell value and\n * the merged cell options from x-ui-cell-options. All renderers are\n * display-only -- stateless, no side effects.\n *\n * Cross-cutting options supported by all built-in renderers:\n * valueKey -- extract a sub-field from an object value before rendering\n * nowrap -- apply whitespace-nowrap to the output element\n *\n * Registry, resolution helpers, and the createRenderer factory live in\n * cellRegistry.ts so this file exports only components (react-refresh\n * requirement).\n */\n\nimport React from \"react\";\nimport { Badge, type BadgeProps } from \"../../badge\";\nimport { formatDate, formatDateTime } from \"@petrarca/sonnet-core\";\n\n/** Extract a sub-field when options.valueKey is set, otherwise return value as-is. */\nfunction resolveValue(\n value: unknown,\n options: Record<string, unknown>,\n): unknown {\n const key = options.valueKey as string | undefined;\n if (key && value != null && typeof value === \"object\") {\n return (value as Record<string, unknown>)[key];\n }\n return value;\n}\n\n/** Build a className string, appending whitespace-nowrap when options.nowrap is true. */\nfunction cx(base: string, options: Record<string, unknown>): string {\n return options.nowrap\n ? [base, \"whitespace-nowrap\"].filter(Boolean).join(\" \")\n : base;\n}\n\ntype BadgeColor = NonNullable<BadgeProps[\"badgeColor\"]>;\n\nexport interface CellRendererProps {\n value: unknown;\n /** Full row record -- available for renderers that need sibling fields. */\n row: Record<string, unknown>;\n options: Record<string, unknown>;\n}\n\nexport type CellRenderer = (props: CellRendererProps) => React.ReactElement;\n\nexport function TextCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function MutedCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BoldCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-medium\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function CodeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const text = resolveValue(value, options);\n return (\n <span className={cx(\"font-mono text-xs\", options)}>\n {text == null ? \"\\u2014\" : String(text)}\n </span>\n );\n}\n\nexport function BadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n if (value == null)\n return <span className=\"text-muted-foreground\">—</span>;\n const key = String(value);\n const colors = options.colors as Record<string, BadgeColor> | undefined;\n const labels = options.labels as Record<string, string> | undefined;\n const color = colors?.[key];\n const label = labels?.[key] ?? key;\n return <Badge badgeColor={color}>{label}</Badge>;\n}\n\ntype BadgeVariant = NonNullable<BadgeProps[\"variant\"]>;\ntype ConditionalBadgeWhen = \"empty\" | \"present\" | \"truthy\" | \"falsy\";\ntype ConditionalBadgeFallback = \"dash\" | \"value\" | \"muted-value\";\n\nfunction conditionHolds(value: unknown, when: ConditionalBadgeWhen): boolean {\n const isEmpty = value == null || value === \"\";\n switch (when) {\n case \"empty\":\n return isEmpty;\n case \"present\":\n return !isEmpty;\n case \"truthy\":\n return Boolean(value);\n case \"falsy\":\n return !value;\n }\n}\n\nfunction renderConditionalFallback(\n value: unknown,\n fallback: ConditionalBadgeFallback,\n): React.ReactElement {\n if (fallback === \"dash\" || value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n if (fallback === \"muted-value\") {\n return <span className=\"text-muted-foreground\">{String(value)}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\n/**\n * Renders a badge when a condition on the cell value holds, and a configurable\n * fallback otherwise. A generic \"flag/marker\" cell -- e.g. a \"Default\" badge\n * when a boolean is true, or a \"Root\" badge when a parent id is empty.\n *\n * x-ui-cell-options:\n * when: \"empty\" | \"present\" | \"truthy\" | \"falsy\" (default \"truthy\")\n * label: badge text (default: the cell value)\n * variant: Badge variant, e.g. \"outline\" | \"secondary\" (default \"secondary\")\n * fallback: \"dash\" (em dash) | \"value\" | \"muted-value\" (default \"dash\")\n *\n * Carries no domain knowledge -- the condition, label, and styling all come\n * from the schema.\n */\nexport function ConditionalBadgeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const when = (options.when as ConditionalBadgeWhen | undefined) ?? \"truthy\";\n const variant = (options.variant as BadgeVariant | undefined) ?? \"secondary\";\n const fallback =\n (options.fallback as ConditionalBadgeFallback | undefined) ?? \"dash\";\n\n if (conditionHolds(value, when)) {\n const label =\n options.label != null ? String(options.label) : String(value ?? \"\");\n return <Badge variant={variant}>{label}</Badge>;\n }\n\n return renderConditionalFallback(value, fallback);\n}\n\nexport function DateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDate(value as string | null)}\n </span>\n );\n}\n\nexport function DateTimeCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n return (\n <span className={cx(\"text-muted-foreground\", options)}>\n {formatDateTime(value as string | null)}\n </span>\n );\n}\n\nexport function BooleanCell({ value }: CellRendererProps): React.ReactElement {\n return (\n <span className={value ? \"text-green-600\" : \"text-muted-foreground\"}>\n {value ? \"Yes\" : \"No\"}\n </span>\n );\n}\n\nexport function NumberCell({ value }: CellRendererProps): React.ReactElement {\n const text = value == null ? \"\\u2014\" : String(value);\n return <span className=\"tabular-nums\">{text}</span>;\n}\n\nexport function TruncateCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const resolved = resolveValue(value, options);\n const text = resolved == null ? \"\\u2014\" : String(resolved);\n return (\n <span className=\"block truncate max-w-xs\" title={text}>\n {text}\n </span>\n );\n}\n\n/**\n * Renders the first item of an array with a \"+N\" overflow count.\n *\n * Options:\n * displayKey -- object field to use as the display label\n * fallbackKey -- object field to use when displayKey is null/undefined\n * prefixKey -- object field to render as a muted prefix before the label (e.g. \"type: name\")\n */\nexport function OverflowListCell({\n value,\n options,\n}: CellRendererProps): React.ReactElement {\n const items = Array.isArray(value)\n ? (value as Record<string, unknown>[])\n : [];\n if (items.length === 0)\n return <span className=\"text-muted-foreground\">—</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 in schema declaration order. Declaration order (not\n * alphabetical) matches the form renderer and what authors expect; columns\n * that need a specific position set x-ui-column.order.\n * 4. Build ResolvedColumn for each.\n */\nexport function resolveColumns(\n schema: JsonSchema,\n uiSchema?: TableUiSchema,\n): ResolvedColumn[] {\n const properties = schema.properties ?? {};\n\n const entries = Object.entries(properties)\n .map(([key, property], index) => {\n const config = mergeColumnConfig(key, property, uiSchema);\n return { key, property, config, index };\n })\n .filter(({ config }) => !config.hidden);\n\n // Split into ordered and unordered buckets.\n const ordered = entries\n .filter(({ config }) => config.order !== undefined)\n .sort((a, b) => a.config.order! - b.config.order!);\n\n // Unordered columns keep their schema declaration order.\n const unordered = entries\n .filter(({ config }) => config.order === undefined)\n .sort((a, b) => a.index - b.index);\n\n const sorted = [...ordered, ...unordered];\n\n return sorted.map(({ key, property, config }) => {\n const cellRenderer =\n config.cellRenderer ?? inferCellRenderer(property.type, property.format);\n\n // Label priority: UI schema label > x-ui-column.label > property title > key\n const label = config.label ?? property.title ?? keyToLabel(key);\n\n return {\n key,\n label,\n property,\n cellRenderer,\n cellOptions: config.cellOptions,\n width: config.width,\n minWidth: config.minWidth,\n };\n });\n}\n\n/** Convert a snake_case key to a Title Case label as a last-resort fallback. */\nfunction keyToLabel(key: string): string {\n return key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","/**\n * PropertyList — read-only display of a record's properties.\n *\n * Two layout modes:\n * - `\"inline\"` (default) — horizontal two-column grid, key left / value right.\n * - `\"stacked\"` — key label above each value.\n *\n * Values rendered by {@link PropertyValue}. Optional per-property schema\n * refines value rendering (schema is NOT required).\n *\n * Shared by the graph view's node/edge cards and the table inspector so all\n * property displays look identical.\n */\n\nimport React from \"react\";\nimport { copyTextToClipboard } from \"@petrarca/sonnet-core\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { PropertyValue } from \"./PropertyValue\";\n\n/** Layout mode for the property list. */\nexport type PropertyListLayout = \"inline\" | \"stacked\";\n\nexport interface PropertyListProps {\n /** Property name -> value. */\n properties: Record<string, unknown>;\n /** Optional property name -> schema, to refine value rendering. */\n propertySchemas?: Record<string, JsonSchemaProperty>;\n /** Layout mode. Default \"inline\" (horizontal key-value grid). */\n layout?: PropertyListLayout;\n /** Show a \"Properties\" section header. Default false. */\n showHeader?: boolean;\n /** Click value to copy it to the clipboard. Default true. */\n copyable?: boolean;\n /** Message when there are no properties. Default \"No properties\". */\n emptyLabel?: string;\n className?: string;\n}\n\nexport function PropertyList({\n properties,\n propertySchemas,\n layout = \"inline\",\n showHeader = false,\n copyable = true,\n emptyLabel = \"No properties\",\n className,\n}: PropertyListProps): React.ReactElement {\n const entries = Object.entries(properties ?? {});\n\n if (entries.length === 0) {\n return <p className=\"text-sm text-muted-foreground italic\">{emptyLabel}</p>;\n }\n\n const header = showHeader && (\n <p className=\"text-[11px] text-muted-foreground mb-1.5\">Properties</p>\n );\n\n const dtClass = `text-[11px] text-muted-foreground ${copyable ? \"cursor-pointer hover:text-foreground\" : \"\"}`;\n\n const dtProps = (value: unknown) =>\n copyable\n ? {\n onClick: () => copyTextToClipboard(stringForCopy(value)),\n title: \"Click to copy value\",\n }\n : {};\n\n if (layout === \"stacked\") {\n return (\n <div className={className}>\n {header}\n <dl className=\"space-y-1\">\n {entries.map(([key, value]) => (\n <div key={key}>\n <dt className={dtClass} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground font-medium break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n }\n\n // inline (default): horizontal two-column grid\n return (\n <div className={className}>\n {header}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 items-baseline\">\n {entries.map(([key, value]) => (\n <React.Fragment key={key}>\n <dt className={`${dtClass} whitespace-nowrap`} {...dtProps(value)}>\n {key}\n </dt>\n <dd className=\"text-sm text-foreground min-w-0 break-words\">\n <PropertyValue value={value} schema={propertySchemas?.[key]} />\n </dd>\n </React.Fragment>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction stringForCopy(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n","/**\n * PropertyValue — read-only, type-aware rendering of a single property value.\n *\n * Reliable model (matches graph-explorer best practice): render by the actual\n * VALUE TYPE, never by guessing string contents.\n * - object / array -> collapsed summary that expands to a JSON tree (bounded box)\n * - long string -> clamped to a few lines with a \"Show more\" toggle\n * - scalar -> inline text\n * - boolean -> true/false (or schema boolean cell)\n * - array of scalars-> comma list\n *\n * Schema is OPTIONAL and only REFINES rendering when present:\n * - x-ui-cell / inferred type/format (date, datetime, boolean, number)\n * - x-ui-cell: \"json\" forces a JSON tree even for a string value\n * A plain string is treated as text by default — it is NOT auto-parsed as\n * JSON (avoids fragile, surprising behaviour). Schema is the only signal that\n * turns a JSON-looking string into a tree.\n */\n\nimport React, { useState } from \"react\";\nimport { JSONTree } from \"react-json-tree\";\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport { CELL_RENDERERS } from \"../EntityTable/tableSchema\";\nimport { inferCellRenderer } from \"../EntityTable/tableSchema/cellRegistry\";\n\nexport interface PropertyValueProps {\n value: unknown;\n /** Optional schema for this property; refines rendering when present. */\n schema?: JsonSchemaProperty;\n className?: string;\n /** Strings longer than this clamp with a \"Show more\" toggle. */\n clampChars?: number;\n}\n\nconst DEFAULT_CLAMP_CHARS = 180;\n\n// JSON tree theme driven by semantic tokens (dark-mode aware via CSS vars).\nconst tokenTheme = {\n scheme: \"sonnet\",\n base00: \"transparent\",\n base01: \"hsl(var(--muted))\",\n base02: \"hsl(var(--border))\",\n base03: \"hsl(var(--muted-foreground))\",\n base04: \"hsl(var(--muted-foreground))\",\n base05: \"hsl(var(--foreground))\",\n base06: \"hsl(var(--foreground))\",\n base07: \"hsl(var(--foreground))\",\n base08: \"hsl(var(--destructive))\",\n base09: \"hsl(var(--primary))\",\n base0A: \"hsl(var(--primary))\",\n base0B: \"hsl(var(--primary))\",\n base0C: \"hsl(var(--primary))\",\n base0D: \"hsl(var(--primary))\",\n base0E: \"hsl(var(--primary))\",\n base0F: \"hsl(var(--muted-foreground))\",\n} as const;\n\nfunction isObjectLike(v: unknown): v is object {\n return typeof v === \"object\" && v !== null;\n}\n\n/** Object / array value -> collapsed summary that expands to a JSON tree. */\nfunction JsonValue({ value }: { value: object }): React.ReactElement {\n const [open, setOpen] = useState(false);\n const summary = Array.isArray(value)\n ? `[${value.length} item${value.length === 1 ? \"\" : \"s\"}]`\n : `{${Object.keys(value).length} key${Object.keys(value).length === 1 ? \"\" : \"s\"}}`;\n\n if (!open) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-sm font-mono text-muted-foreground hover:text-foreground\"\n >\n {summary} <span className=\"text-xs\">— show</span>\n </button>\n );\n }\n\n return (\n <div className=\"text-xs font-mono\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"mb-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n hide\n </button>\n <div className=\"max-h-64 overflow-auto rounded border border-border bg-muted/30 px-2 py-1\">\n <JSONTree\n data={value}\n theme={tokenTheme}\n invertTheme={false}\n shouldExpandNodeInitially={() => true}\n hideRoot\n />\n </div>\n </div>\n );\n}\n\n/** Long string -> clamped with a \"Show more\" toggle and bounded scroll on expand. */\nfunction LongTextValue({ text }: { text: string }): React.ReactElement {\n const [open, setOpen] = useState(false);\n if (!open) {\n return (\n <span className=\"break-words\">\n <span className=\"line-clamp-3 align-bottom\">{text}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show more\n </button>\n </span>\n );\n }\n return (\n <span className=\"break-words\">\n <span className=\"block max-h-64 overflow-auto whitespace-pre-wrap rounded border border-border bg-muted/30 px-2 py-1\">\n {text}\n </span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Show less\n </button>\n </span>\n );\n}\n\n/** Schema-driven rendering; returns null to fall through to value-shape. */\nfunction renderFromSchema(\n value: unknown,\n schema: JsonSchemaProperty,\n className?: string,\n): React.ReactElement | null {\n const cellName =\n schema[\"x-ui-cell\"] ?? inferCellRenderer(schema.type, schema.format);\n // \"json\" forces a tree even for string-typed values.\n if (cellName === \"json\") {\n const parsed = typeof value === \"string\" ? safeParse(value) : value;\n return isObjectLike(parsed) ? <JsonValue value={parsed} /> : null;\n }\n if (cellName && cellName !== \"text\") {\n const Renderer = CELL_RENDERERS[cellName];\n if (Renderer) {\n return (\n <span className={className}>\n <Renderer\n value={value}\n row={{}}\n options={\n (schema[\"x-ui-cell-options\"] as Record<string, unknown>) ?? {}\n }\n />\n </span>\n );\n }\n }\n return null;\n}\n\n/** Object/array value: scalar arrays -> comma list; structured -> JSON tree. */\nfunction renderObjectLike(\n value: object,\n className?: string,\n): React.ReactElement {\n if (Array.isArray(value) && value.every((v) => !isObjectLike(v))) {\n return (\n <span className={`break-words ${className ?? \"\"}`}>\n {value.map(String).join(\", \")}\n </span>\n );\n }\n return <JsonValue value={value} />;\n}\n\n/** String value: text by default; long strings clamp with a \"Show more\" toggle. */\nfunction renderString(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (typeof value === \"boolean\") {\n return <span className={className}>{value ? \"true\" : \"false\"}</span>;\n }\n const str = String(value);\n if (str.length > clampChars || str.includes(\"\\n\")) {\n return (\n <span className={className}>\n <LongTextValue text={str} />\n </span>\n );\n }\n return <span className={`break-words ${className ?? \"\"}`}>{str}</span>;\n}\n\n/** Value-shape rendering (reliable: by type, not by guessing string contents). */\nfunction renderFromValue(\n value: unknown,\n className: string | undefined,\n clampChars: number,\n): React.ReactElement {\n if (value == null) {\n return (\n <span className={`text-muted-foreground ${className ?? \"\"}`}>—</span>\n );\n }\n if (isObjectLike(value)) return renderObjectLike(value, className);\n return renderString(value, className, clampChars);\n}\n\nexport function PropertyValue({\n value,\n schema,\n className,\n clampChars = DEFAULT_CLAMP_CHARS,\n}: PropertyValueProps): React.ReactElement {\n const fromSchema = schema ? renderFromSchema(value, schema, className) : null;\n return fromSchema ?? renderFromValue(value, className, clampChars);\n}\n\nfunction safeParse(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return undefined;\n }\n}\n","/**\n * EntitySelect -- async searchable single-select for entity references.\n *\n * Fetches options via a pluggable EntityOptionFetcher. The combobox search\n * input drives server-side filtering through the useEntityOptions hook.\n *\n * Extractable to @petrarca/sonnet-ui -- no app-specific imports.\n */\n\nimport * as React from \"react\";\nimport { Check, ChevronsUpDown, Loader2, X } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Button } from \"../button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport {\n useEntityOptions,\n type EntitySelectMode,\n type UseEntityOptionsReturn,\n} from \"@petrarca/sonnet-core/hooks\";\nimport type {\n EntityOptionFetcher,\n EntityOption,\n} from \"@petrarca/sonnet-core/entityOptions\";\n\nfunction emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n}: {\n mode: EntitySelectMode;\n search: string;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n}): string {\n if (isLoading) return \"Loading...\";\n if (mode === \"eager\") return emptyMessage;\n if (search.length === 0) return \"Start typing to search...\";\n if (mode === \"typeahead\" && search.length < minChars)\n return `Type at least ${minChars} character${minChars > 1 ? \"s\" : \"\"} to search...`;\n if (mode === \"explicit\" && !hasSearched) return \"Press Enter to search...\";\n return emptyMessage;\n}\n\n// Explicit mode tracks whether submit() has ever been called.\nfunction useHasSearched(\n submit: UseEntityOptionsReturn[\"submit\"],\n): [boolean, UseEntityOptionsReturn[\"submit\"]] {\n const [hasSearched, setHasSearched] = React.useState(false);\n const wrappedSubmit = React.useCallback(() => {\n setHasSearched(true);\n submit();\n }, [submit]);\n return [hasSearched, wrappedSubmit];\n}\n\nexport interface EntitySelectProps {\n /** The fetcher that provides options from the backend. */\n fetcher: EntityOptionFetcher;\n /**\n * Stable cache key for TanStack Query. Must be unique per fetcher/endpoint\n * combination -- two components using the same key share the same cache entry.\n */\n queryKey: string;\n /**\n * Search mode. Default: \"eager\".\n * eager -- fetch on mount, refetch as user types (small collections)\n * typeahead -- fetch only after minChars are typed (large collections)\n * explicit -- fetch only when user presses Enter\n */\n mode?: EntitySelectMode;\n /** Minimum characters before typeahead mode fires (default 1). */\n minChars?: number;\n /** Currently selected value (controlled). */\n value?: string | null;\n /**\n * The option for the current value, supplying its label. Use when the\n * selected value is set before any options have loaded (e.g. an edit form\n * in typeahead/explicit mode) so the trigger can render the label without\n * fetching the full list. Must match `value`; ignored otherwise.\n */\n selectedOption?: EntityOption | null;\n /** Called when the selection changes. */\n onChange?: (value: string | null) => void;\n /** Called when the selection changes, passing the full option (value + label). */\n onChangeOption?: (option: EntityOption | null) => void;\n /** Called when the dropdown closes (for form blur tracking). */\n onBlur?: () => void;\n /** Label displayed above the select. Pass false to hide. */\n label?: string | false;\n /** Placeholder when nothing is selected. */\n placeholder?: string;\n /** Placeholder for the search input inside the dropdown. */\n searchPlaceholder?: string;\n /** Message when no options match the search. */\n emptyMessage?: string;\n /** Whether the field is required (shows asterisk). */\n required?: boolean;\n /**\n * Show a clear (X) affordance that resets the selection to null when a value\n * is set. Use for optional entity references (e.g. an assignment that can be\n * removed). Ignored when required or disabled.\n */\n clearable?: boolean;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Description text below the label. */\n description?: string;\n /** Error message. */\n error?: string;\n /** Additional className for the wrapper. */\n className?: string;\n /** HTML id for the trigger button. */\n id?: string;\n}\n\nfunction resolveEntitySelectDefaults(props: EntitySelectProps) {\n return {\n mode: props.mode ?? \"eager\",\n minChars: props.minChars ?? 1,\n placeholder: props.placeholder ?? \"Select...\",\n searchPlaceholder: props.searchPlaceholder ?? \"Search...\",\n emptyMessage: props.emptyMessage ?? \"No results found\",\n disabled: props.disabled ?? false,\n } as const;\n}\n\nfunction EntitySelectLabel({\n id,\n label,\n required,\n description,\n}: {\n id?: string;\n label?: string | false;\n required?: boolean;\n description?: string;\n}): React.ReactElement | null {\n const hasLabel = label !== undefined && label !== false;\n return (\n <>\n {hasLabel && (\n <label\n htmlFor={id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"ml-1 text-destructive\">*</span>}\n </label>\n )}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </>\n );\n}\n\nfunction EntitySelectDropdown({\n searchPlaceholder,\n search,\n setSearch,\n mode,\n submit,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n options,\n value,\n handleSelect,\n}: {\n searchPlaceholder: string;\n search: string;\n setSearch: (v: string) => void;\n mode: EntitySelectMode;\n submit: () => void;\n minChars: number;\n isLoading: boolean;\n hasSearched: boolean;\n emptyMessage: string;\n options: EntityOption[];\n value?: string | null;\n handleSelect: (v: string) => void;\n}): React.ReactElement {\n return (\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={searchPlaceholder}\n value={search}\n onValueChange={setSearch}\n onKeyDown={\n mode === \"explicit\"\n ? (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n submit();\n }\n }\n : undefined\n }\n />\n <CommandList>\n <CommandEmpty>\n {emptyStateMessage({\n mode,\n search,\n minChars,\n isLoading,\n hasSearched,\n emptyMessage,\n })}\n </CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={handleSelect}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === option.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {option.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n}\n\nexport function EntitySelect(props: EntitySelectProps): React.ReactElement {\n const {\n fetcher,\n queryKey,\n value,\n selectedOption,\n onChange,\n onChangeOption,\n onBlur,\n label,\n required,\n clearable,\n description,\n error,\n className,\n id,\n } = props;\n const {\n mode,\n minChars,\n placeholder,\n searchPlaceholder,\n emptyMessage,\n disabled,\n } = resolveEntitySelectDefaults(props);\n\n const [open, setOpen] = React.useState(false);\n\n // Retain the label of the selected option independently of whether it\n // appears in the current search results. Without this, clearing the search\n // input after a selection causes the trigger to revert to the placeholder.\n const [selectedLabel, setSelectedLabel] = React.useState<string | null>(null);\n\n const {\n options,\n isLoading,\n search,\n setSearch,\n submit: rawSubmit,\n } = useEntityOptions({ fetcher, queryKey, mode, minChars });\n\n const [hasSearched, submit] = useHasSearched(rawSubmit);\n\n // Sync selectedLabel when value changes externally or when options arrive\n // that contain the current value (e.g. initial load).\n React.useEffect(() => {\n if (!value) {\n setSelectedLabel(null);\n return;\n }\n const found = options.find((opt) => opt.value === value);\n if (found) {\n setSelectedLabel(found.label);\n } else if (selectedOption && selectedOption.value === value) {\n // Seed the label for a pre-selected value before options have loaded\n // (e.g. an edit form in typeahead/explicit mode).\n setSelectedLabel(selectedOption.label);\n }\n }, [value, options, selectedOption]);\n\n const handleClear = React.useCallback(\n (e: React.MouseEvent): void => {\n // Reset to null without opening the dropdown.\n e.preventDefault();\n e.stopPropagation();\n setSelectedLabel(null);\n onChange?.(null);\n onChangeOption?.(null);\n },\n [onChange, onChangeOption],\n );\n\n const showClear = Boolean(clearable && value && !required && !disabled);\n\n const handleSelect = React.useCallback(\n (selectedValue: string) => {\n const opt = options.find((o) => o.value === selectedValue);\n if (opt) setSelectedLabel(opt.label);\n const newValue = selectedValue === value ? null : selectedValue;\n if (newValue === null) setSelectedLabel(null);\n onChange?.(newValue);\n onChangeOption?.(newValue === null ? null : (opt ?? null));\n setOpen(false);\n setSearch(\"\");\n },\n [options, value, onChange, onChangeOption, setSearch],\n );\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n setOpen(newOpen);\n if (!newOpen) {\n setSearch(\"\");\n onBlur?.();\n }\n },\n [onBlur, setSearch],\n );\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <EntitySelectLabel\n id={id}\n label={label}\n required={required}\n description={description}\n />\n\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n \"w-full justify-between\",\n !selectedLabel && \"text-muted-foreground\",\n error && \"border-destructive\",\n )}\n disabled={disabled}\n >\n <span className=\"truncate\">{selectedLabel ?? placeholder}</span>\n <div className=\"flex items-center gap-1\">\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin opacity-50\" />\n )}\n {showClear && (\n <span\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={-1}\n className=\"rounded-sm opacity-50 hover:opacity-100\"\n onPointerDown={handleClear}\n >\n <X className=\"h-4 w-4 shrink-0\" />\n </span>\n )}\n <ChevronsUpDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[--radix-popover-trigger-width] p-0\"\n align=\"start\"\n >\n <EntitySelectDropdown\n searchPlaceholder={searchPlaceholder}\n search={search}\n setSearch={setSearch}\n mode={mode}\n submit={submit}\n minChars={minChars}\n isLoading={isLoading}\n hasSearched={hasSearched}\n emptyMessage={emptyMessage}\n options={options}\n value={value}\n handleSelect={handleSelect}\n />\n </PopoverContent>\n </Popover>\n\n {error && <p className=\"text-sm font-medium text-destructive\">{error}</p>}\n </div>\n );\n}\n","/**\n * EntityTree -- schema-driven tree component.\n *\n * Wraps TreeView and drives column rendering from a JSON Schema +\n * optional UI Schema, using the same resolveColumns / resolveCellRenderer\n * pipeline as EntityTable. Each visible tree node row renders as a set\n * of schema-derived cells.\n *\n * Row interaction has two modes controlled by selectionMode:\n *\n * Normal (selectionMode=false, default): click sets active row, pencil\n * icon visible on active/hover rows, Enter/Space triggers onNodeEdit.\n *\n * Selection (selectionMode=true): checkboxes appear, click toggles\n * selection, pencil icon is hidden, onNodeEdit is suppressed.\n *\n * Loading, error, and empty states are communicated via node flags and\n * the top-level isLoading / isError / isEmpty props.\n *\n * Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type MutableRefObject,\n} from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { TreeView } from \"../TreeView\";\nimport {\n resolveColumns,\n resolveCellRenderer,\n validateRendererNames,\n type CellRenderer,\n type TableUiSchema,\n type ResolvedColumn,\n} from \"../EntityTable/tableSchema\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { TreeNode, TreeViewHandle, TreeViewProps } from \"../TreeView\";\n\nexport type { CellRenderer, TableUiSchema, TreeNode };\n\n/** Imperative handle for programmatic focus. */\nexport interface EntityTreeHandle {\n focus(): void;\n}\n\nexport interface EntityTreeProps<TData extends Record<string, unknown>> {\n // Column definition\n schema: JsonSchema;\n uiSchema?: TableUiSchema;\n renderers?: Record<string, CellRenderer>;\n\n // Tree structure (passed through to TreeView)\n nodes: TreeNode<TData>[];\n expandedIds: Set<string>;\n onExpand: TreeViewProps<TData>[\"onExpand\"];\n onCollapse: TreeViewProps<TData>[\"onCollapse\"];\n\n // Top-level states (for when no nodes are loaded yet)\n isLoading?: boolean;\n isError?: boolean;\n errorMessage?: string;\n entityLabel?: string;\n\n // Interaction\n /** Called on row click -- sets the active row without opening edit. */\n onNodeSelect?: (node: TreeNode<TData>) => void;\n /** Called when the pencil icon is clicked -- opens the edit panel. */\n onNodeEdit?: (node: TreeNode<TData>) => void;\n /** Id of the currently active node. Controls pencil-icon visibility only\n * (always shown on the active node, hover-only on others). Row highlight\n * is managed by TreeView via focus state. */\n activeNodeId?: string;\n\n // Selection mode (opt-in). When true: checkboxes appear, pencil icon\n // is hidden, onNodeEdit is suppressed. When false (default): normal\n // browse/edit behavior.\n selectionMode?: boolean;\n selectedIds?: Set<string>;\n onSelectionChange?: TreeViewProps<TData>[\"onSelectionChange\"];\n /** When true, the first selected node locks subsequent selections to its\n * siblings (nodes at the same depth sharing the same parent). Clearing\n * all selections resets the constraint. Managed internally by TreeView. */\n constrainSelectionToSiblings?: boolean;\n\n /**\n * Optional override for specific node rendering. When provided, called\n * before the default schema-driven renderer. Return a React node to\n * replace the default, or null to fall through to the default.\n */\n renderNodeOverride?: (\n node: TreeNode<TData>,\n depth: number,\n ) => React.ReactNode | null;\n\n indentPx?: number;\n className?: string;\n}\n\nfunction buildCellRow<TData extends Record<string, unknown>>(\n resolved: ResolvedColumn[],\n activeNodeIdRef: MutableRefObject<string | undefined>,\n onNodeEdit: ((node: TreeNode<TData>) => void) | undefined,\n localRenderers?: Record<string, CellRenderer>,\n) {\n return function renderCells(node: TreeNode<TData>): React.ReactElement {\n const isActive = node.id === activeNodeIdRef.current;\n return (\n <span className=\"flex items-center gap-4 min-w-0 w-full group/row\">\n {resolved.map((col) => {\n const Renderer = resolveCellRenderer(\n col.cellRenderer,\n localRenderers,\n );\n const value = node.data[col.key];\n return (\n <span\n key={col.key}\n className=\"shrink-0\"\n style={col.width !== undefined ? { width: col.width } : undefined}\n >\n <Renderer\n value={value}\n row={node.data as Record<string, unknown>}\n options={col.cellOptions}\n />\n </span>\n );\n })}\n {onNodeEdit && (\n <span className=\"ml-auto shrink-0\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onNodeEdit(node);\n }}\n aria-label=\"Edit\"\n className={cn(\n \"p-1 rounded hover:bg-background text-muted-foreground hover:text-foreground transition-colors\",\n isActive\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100\",\n )}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </button>\n </span>\n )}\n </span>\n );\n };\n}\n\nfunction resolveEntityTreeDefaults(props: {\n isLoading?: boolean;\n isError?: boolean;\n entityLabel?: string;\n selectionMode?: boolean;\n}) {\n return {\n isLoading: props.isLoading ?? false,\n isError: props.isError ?? false,\n entityLabel: props.entityLabel ?? \"items\",\n selectionMode: props.selectionMode ?? false,\n } as const;\n}\n\n/**\n * Render the appropriate status view for loading/error/empty states.\n * Not a React component -- no hooks. Called as a plain function.\n * Returns null when none of the status conditions apply.\n */\nfunction renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n}: {\n isLoading: boolean;\n isError: boolean;\n errorMessage?: string;\n entityLabel: string;\n nodes: unknown[];\n className?: string;\n}): React.ReactElement | null {\n if (isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n Loading\\u2026\n </div>\n );\n }\n\n if (isError) {\n return (\n <div\n className={cn(\"py-8 text-center text-sm text-destructive\", className)}\n >\n {errorMessage ?? `Failed to load ${entityLabel}.`}\n </div>\n );\n }\n\n if (!isLoading && nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No {entityLabel} yet.\n </div>\n );\n }\n\n return null;\n}\n\nfunction resolveRenderNode<TData extends Record<string, unknown>>(\n renderNodeOverride: EntityTreeProps<TData>[\"renderNodeOverride\"],\n defaultRenderNode: (node: TreeNode<TData>) => React.ReactElement,\n): (node: TreeNode<TData>, depth: number) => React.ReactNode {\n if (!renderNodeOverride) return defaultRenderNode;\n return (node: TreeNode<TData>, depth: number): React.ReactNode => {\n const override = renderNodeOverride(node, depth);\n if (override !== null) return override;\n return defaultRenderNode(node);\n };\n}\n\nfunction resolveSelectionProps<TData extends Record<string, unknown>>(\n selectionMode: boolean,\n props: Pick<\n EntityTreeProps<TData>,\n | \"onNodeEdit\"\n | \"selectedIds\"\n | \"onSelectionChange\"\n | \"constrainSelectionToSiblings\"\n >,\n) {\n return {\n effectiveOnNodeEdit: selectionMode ? undefined : props.onNodeEdit,\n onNodeActivate: selectionMode ? undefined : props.onNodeEdit,\n selectedIds: selectionMode ? props.selectedIds : undefined,\n onSelectionChange: selectionMode ? props.onSelectionChange : undefined,\n constrainSelectionToSiblings: selectionMode\n ? props.constrainSelectionToSiblings\n : undefined,\n };\n}\n\n/**\n * EntityTree renders a tree hierarchy where each node row is driven by a\n * JSON Schema column definition, using the same cell renderer pipeline as\n * EntityTable. Row click selects the active node; the pencil icon or Enter\n * triggers edit.\n */\nfunction EntityTreeInner<TData extends Record<string, unknown>>(\n props: EntityTreeProps<TData>,\n ref: React.Ref<EntityTreeHandle>,\n): React.ReactElement {\n const {\n schema,\n uiSchema,\n renderers,\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n errorMessage,\n onNodeSelect,\n onNodeEdit,\n activeNodeId,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n renderNodeOverride,\n indentPx,\n className,\n } = props;\n const { isLoading, isError, entityLabel, selectionMode } =\n resolveEntityTreeDefaults(props);\n\n const treeRef = useRef<TreeViewHandle>(null);\n\n useImperativeHandle(ref, () => ({\n focus() {\n treeRef.current?.focus();\n },\n }));\n\n const resolved = useMemo(() => {\n if (renderers) validateRendererNames(renderers);\n return resolveColumns(schema, uiSchema);\n }, [schema, uiSchema, renderers]);\n\n // Ref so renderNode reads the current value at call time without\n // recreating the function on every active node change.\n const activeNodeIdRef = useRef(activeNodeId);\n activeNodeIdRef.current = activeNodeId;\n\n const selection = resolveSelectionProps(selectionMode, {\n onNodeEdit,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n });\n\n const defaultRenderNode = useMemo(\n () =>\n buildCellRow<TData>(\n resolved,\n activeNodeIdRef,\n selection.effectiveOnNodeEdit,\n renderers,\n ),\n [resolved, selection.effectiveOnNodeEdit, renderers],\n );\n\n const renderNode = useMemo(\n () => resolveRenderNode(renderNodeOverride, defaultRenderNode),\n [renderNodeOverride, defaultRenderNode],\n );\n\n const statusView = renderTreeStatus({\n isLoading,\n isError,\n errorMessage,\n entityLabel,\n nodes,\n className,\n });\n if (statusView) return statusView;\n\n return (\n <div className={cn(\"rounded-lg border\", className)}>\n <TreeView<TData>\n ref={treeRef}\n nodes={nodes}\n expandedIds={expandedIds}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeSelect}\n onNodeActivate={selection.onNodeActivate}\n renderNode={renderNode}\n selectedIds={selection.selectedIds}\n onSelectionChange={selection.onSelectionChange}\n constrainSelectionToSiblings={selection.constrainSelectionToSiblings}\n indentPx={indentPx}\n className=\"p-1\"\n />\n </div>\n );\n}\n\nexport const EntityTree = forwardRef(EntityTreeInner) as <\n TData extends Record<string, unknown>,\n>(\n props: EntityTreeProps<TData> & { ref?: React.Ref<EntityTreeHandle> },\n) => React.ReactElement;\n","/**\n * TreeView -- generic, accessible tree component.\n *\n * Renders a hierarchy of nodes with expand/collapse, keyboard navigation,\n * and optional row selection. Node content is fully delegated to the\n * caller via a renderNode render prop -- this component owns structure\n * and interaction only.\n *\n * Accessibility: implements WAI-ARIA Tree View pattern with\n * role=\"tree\", role=\"treeitem\", aria-expanded, aria-selected.\n * Keyboard: ArrowDown/Up move focus, ArrowRight expands / moves into\n * first child, ArrowLeft collapses / moves to parent, Enter/Space\n * activate the focused node.\n *\n * Loading and error states per node are communicated via the node data\n * itself (isLoading, isError flags). The caller controls data fetching.\n *\n * Extractable to @petrarca/sonnet-ui. Contains no app-specific imports.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single node in the tree. TData carries the domain payload. */\nexport interface TreeNode<TData = Record<string, unknown>> {\n /** Stable unique identifier for this node. */\n id: string;\n /** Domain payload, passed through to renderNode. */\n data: TData;\n /** Whether this node can have children (controls expand affordance). */\n hasChildren: boolean;\n /** Children that have already been loaded. undefined = not yet fetched. */\n children?: TreeNode<TData>[];\n /** True while children are being fetched. */\n isLoading?: boolean;\n /** True when the child fetch failed. */\n isError?: boolean;\n}\n\nexport interface TreeViewProps<TData = Record<string, unknown>> {\n /** Root-level nodes. */\n nodes: TreeNode<TData>[];\n /** Set of node ids that are currently expanded. Controlled. */\n expandedIds: Set<string>;\n /** Called when the user requests to expand a node. */\n onExpand: (nodeId: string) => void;\n /** Called when the user requests to collapse a node. */\n onCollapse: (nodeId: string) => void;\n /** Called when the user clicks a node row. */\n onNodeClick?: (node: TreeNode<TData>) => void;\n /** Called when the user activates a node via keyboard (Enter or Space). */\n onNodeActivate?: (node: TreeNode<TData>) => void;\n /**\n * Render the visible content of a single node row.\n * depth starts at 0 for root nodes.\n */\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n /** Row selection -- set of selected node ids. Controlled, opt-in. */\n selectedIds?: Set<string>;\n /** Called when the user toggles selection on a node. */\n onSelectionChange?: (nodeId: string, selected: boolean) => void;\n /** When true, the first selected node locks checkboxes to its siblings\n * (nodes sharing the same parent). Clearing all selections resets the\n * constraint so a different sibling group can be selected next. */\n constrainSelectionToSiblings?: boolean;\n /** Pixels of indentation per depth level. Default 20. */\n indentPx?: number;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Flat ordered list of visible nodes for keyboard navigation. */\ninterface FlatNode<TData> {\n node: TreeNode<TData>;\n depth: number;\n parentId: string | null;\n}\n\nfunction flatten<TData>(\n nodes: TreeNode<TData>[],\n expandedIds: Set<string>,\n depth = 0,\n parentId: string | null = null,\n result: FlatNode<TData>[] = [],\n): FlatNode<TData>[] {\n for (const node of nodes) {\n result.push({ node, depth, parentId });\n if (expandedIds.has(node.id) && node.children) {\n flatten(node.children, expandedIds, depth + 1, node.id, result);\n }\n }\n return result;\n}\n\n// Sentinel value for \"no sibling constraint active\". A Symbol avoids\n// collision with real parentId values (string | null).\nconst UNCONSTRAINED = Symbol.for(\"tree-view:unconstrained\");\n\n// ---------------------------------------------------------------------------\n// ToggleIcon -- expand/collapse/leaf icon for a tree node.\n// ---------------------------------------------------------------------------\n\ninterface ToggleIconProps {\n hasChildren: boolean;\n isLoading?: boolean;\n isExpanded: boolean;\n}\n\nfunction ToggleIcon({\n hasChildren,\n isLoading,\n isExpanded,\n}: ToggleIconProps): React.ReactElement {\n if (!hasChildren) {\n return (\n <span className=\"block w-1.5 h-1.5 rounded-full bg-border mx-auto\" />\n );\n }\n if (isLoading) {\n return (\n <span className=\"block w-3 h-3 rounded-full border-2 border-muted-foreground/40 border-t-foreground animate-spin\" />\n );\n }\n return (\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// NodeRow\n// ---------------------------------------------------------------------------\n\ninterface NodeRowProps<TData> {\n flat: FlatNode<TData>;\n expandedIds: Set<string>;\n selectedIds: Set<string>;\n isSelectable: boolean;\n isFocused: boolean;\n indentPx: number;\n treeId: string;\n onExpand: (id: string) => void;\n onCollapse: (id: string) => void;\n onNodeClick?: (node: TreeNode<TData>) => void;\n onSelectionChange?: (id: string, selected: boolean) => void;\n onFocus: (id: string) => void;\n renderNode: (node: TreeNode<TData>, depth: number) => React.ReactNode;\n}\n\nfunction NodeRow<TData>({\n flat,\n expandedIds,\n selectedIds,\n isSelectable,\n isFocused,\n indentPx,\n treeId,\n onExpand,\n onCollapse,\n onNodeClick,\n onSelectionChange,\n onFocus,\n renderNode,\n}: NodeRowProps<TData>): React.ReactElement {\n const { node, depth } = flat;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = selectedIds.has(node.id);\n\n const handleToggle = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isExpanded) {\n onCollapse(node.id);\n } else if (node.hasChildren) {\n onExpand(node.id);\n }\n },\n [isExpanded, node.id, node.hasChildren, onExpand, onCollapse],\n );\n\n const handleClick = useCallback(() => {\n onFocus(node.id);\n onNodeClick?.(node);\n }, [node, onFocus, onNodeClick]);\n\n const handleCheckChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onSelectionChange?.(node.id, e.target.checked);\n },\n [node.id, onSelectionChange],\n );\n\n return (\n <li\n id={`${treeId}-node-${node.id}`}\n role=\"treeitem\"\n aria-expanded={node.hasChildren ? isExpanded : undefined}\n aria-selected={onSelectionChange ? isSelected : undefined}\n aria-busy={node.isLoading}\n tabIndex={isFocused ? 0 : -1}\n className={cn(\n \"flex items-center gap-1 px-2 py-1.5 rounded-sm text-sm select-none\",\n \"cursor-pointer transition-colors\",\n \"hover:bg-accent/60\",\n isFocused && \"bg-accent ring-1 ring-ring ring-inset outline-none\",\n isSelected && \"bg-primary/10\",\n )}\n style={{ paddingLeft: depth * indentPx + 8 }}\n onClick={handleClick}\n >\n {/* Expand / collapse toggle */}\n <span\n className=\"shrink-0 flex items-center justify-center w-4 h-4\"\n onClick={handleToggle}\n aria-hidden\n >\n <ToggleIcon\n hasChildren={node.hasChildren}\n isLoading={node.isLoading}\n isExpanded={isExpanded}\n />\n </span>\n\n {/* Optional checkbox for row selection */}\n {onSelectionChange && isSelectable && (\n <input\n type=\"checkbox\"\n className=\"shrink-0 h-3.5 w-3.5 rounded\"\n checked={isSelected}\n onChange={handleCheckChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select ${node.id}`}\n tabIndex={-1}\n />\n )}\n\n {/* Caller-provided node content */}\n <span className=\"flex-1 min-w-0\">{renderNode(node, depth)}</span>\n\n {/* Error indicator */}\n {node.isError && (\n <span className=\"shrink-0 text-xs text-destructive\" aria-live=\"polite\">\n Failed to load\n </span>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TreeView\n// ---------------------------------------------------------------------------\n\n/** Imperative handle exposed via ref for programmatic focus. */\nexport interface TreeViewHandle {\n /** Focus the tree so keyboard navigation is active. */\n focus(): void;\n}\n\n/**\n * TreeView renders a hierarchy of nodes with expand/collapse, keyboard\n * navigation, and optional row selection. Fully controlled.\n */\nfunction TreeViewInner<TData = Record<string, unknown>>(\n {\n nodes,\n expandedIds,\n onExpand,\n onCollapse,\n onNodeClick,\n onNodeActivate,\n renderNode,\n selectedIds,\n onSelectionChange,\n constrainSelectionToSiblings,\n indentPx = 20,\n className,\n }: TreeViewProps<TData>,\n ref: React.Ref<TreeViewHandle>,\n): React.ReactElement {\n const treeId = useId();\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n // Sibling selection constraint: tracks the parentId of the first selected\n // node. UNCONSTRAINED distinguishes \"no constraint\" from \"root level\"\n // (parentId === null). Reset when selection is cleared externally.\n const [constrainedParent, setConstrainedParent] = useState<\n string | null | typeof UNCONSTRAINED\n >(UNCONSTRAINED);\n\n // Reset constraint when controlled selectedIds becomes empty.\n const selectionSize = selectedIds?.size ?? 0;\n useEffect(() => {\n if (selectionSize === 0) setConstrainedParent(UNCONSTRAINED);\n }, [selectionSize]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n // Focus the currently focused node if one exists, otherwise the first\n // treeitem. Events bubble up to the <ul> onKeyDown from the focused <li>.\n const ul = listRef.current;\n if (!ul) return;\n const target = focusedId\n ? ul.querySelector<HTMLElement>(\n `[id$=\"-node-${CSS.escape(focusedId)}\"]`,\n )\n : ul.querySelector<HTMLElement>('[role=\"treeitem\"]');\n target?.focus();\n },\n }),\n [focusedId],\n );\n\n const flatNodes = useMemo(\n () => flatten(nodes, expandedIds),\n [nodes, expandedIds],\n );\n\n // Build a lookup from node id to its parentId in the flat list.\n const parentById = useMemo(() => {\n const map = new Map<string, string | null>();\n for (const f of flatNodes) map.set(f.node.id, f.parentId);\n return map;\n }, [flatNodes]);\n\n // Derive which nodes are selectable under the sibling constraint.\n const selectableSet = useMemo<Set<string> | undefined>(() => {\n if (!constrainSelectionToSiblings || constrainedParent === UNCONSTRAINED) {\n return undefined;\n }\n const ids = new Set<string>();\n for (const f of flatNodes) {\n if (f.parentId === constrainedParent) ids.add(f.node.id);\n }\n return ids;\n }, [constrainSelectionToSiblings, constrainedParent, flatNodes]);\n\n // Wrap onSelectionChange to lock the constraint on first selection.\n const handleSelectionChange = useCallback(\n (nodeId: string, selected: boolean) => {\n if (\n constrainSelectionToSiblings &&\n selected &&\n constrainedParent === UNCONSTRAINED\n ) {\n setConstrainedParent(parentById.get(nodeId) ?? null);\n }\n onSelectionChange?.(nodeId, selected);\n },\n [\n constrainSelectionToSiblings,\n constrainedParent,\n parentById,\n onSelectionChange,\n ],\n );\n\n const focusedIndex = flatNodes.findIndex((f) => f.node.id === focusedId);\n\n const moveFocus = useCallback(\n (delta: number) => {\n if (flatNodes.length === 0) return;\n const next = Math.max(\n 0,\n Math.min(flatNodes.length - 1, focusedIndex + delta),\n );\n const target = flatNodes[next];\n if (target) {\n setFocusedId(target.node.id);\n // Scroll focused item into view\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${target.node.id}`)}`,\n );\n el?.scrollIntoView({ block: \"nearest\" });\n el?.focus();\n }\n },\n [flatNodes, focusedIndex, treeId],\n );\n\n const handleArrowRight = useCallback(\n (current: FlatNode<TData>) => {\n if (current.node.hasChildren && !expandedIds.has(current.node.id)) {\n onExpand(current.node.id);\n } else if (current.node.children && current.node.children.length > 0) {\n moveFocus(1);\n }\n },\n [expandedIds, onExpand, moveFocus],\n );\n\n const handleArrowLeft = useCallback(\n (current: FlatNode<TData>) => {\n if (expandedIds.has(current.node.id)) {\n onCollapse(current.node.id);\n return;\n }\n if (current.parentId === null) return;\n const parentIdx = flatNodes.findIndex(\n (f) => f.node.id === current.parentId,\n );\n if (parentIdx < 0) return;\n const parentFlat = flatNodes[parentIdx];\n if (!parentFlat) return;\n setFocusedId(parentFlat.node.id);\n const el = listRef.current?.querySelector<HTMLElement>(\n `#${CSS.escape(`${treeId}-node-${parentFlat.node.id}`)}`,\n );\n el?.focus();\n },\n [expandedIds, onCollapse, flatNodes, treeId],\n );\n\n const getFocusedNode = useCallback((): FlatNode<TData> | null => {\n if (focusedIndex < 0) return null;\n return flatNodes[focusedIndex] ?? null;\n }, [flatNodes, focusedIndex]);\n\n const activateNode = useCallback(\n (flat: FlatNode<TData> | null) => {\n if (flat) onNodeActivate?.(flat.node);\n },\n [onNodeActivate],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveFocus(1);\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n moveFocus(-1);\n break;\n\n case \"ArrowRight\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowRight(current);\n break;\n }\n\n case \"ArrowLeft\": {\n e.preventDefault();\n const current = getFocusedNode();\n if (current) handleArrowLeft(current);\n break;\n }\n\n case \"Enter\":\n case \" \":\n e.preventDefault();\n activateNode(getFocusedNode());\n break;\n\n default:\n break;\n }\n },\n [\n moveFocus,\n handleArrowRight,\n handleArrowLeft,\n getFocusedNode,\n activateNode,\n ],\n );\n\n if (nodes.length === 0) {\n return (\n <div\n className={cn(\n \"py-8 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No items.\n </div>\n );\n }\n\n return (\n <ul\n ref={listRef}\n role=\"tree\"\n aria-label=\"Tree\"\n className={cn(\"outline-none\", className)}\n onKeyDown={handleKeyDown}\n >\n {flatNodes.map((flat) => (\n <NodeRow\n key={flat.node.id}\n flat={flat}\n expandedIds={expandedIds}\n selectedIds={selectedIds ?? new Set()}\n isSelectable={!selectableSet || selectableSet.has(flat.node.id)}\n isFocused={flat.node.id === focusedId}\n indentPx={indentPx}\n treeId={treeId}\n onExpand={onExpand}\n onCollapse={onCollapse}\n onNodeClick={onNodeClick}\n onSelectionChange={\n onSelectionChange ? handleSelectionChange : undefined\n }\n onFocus={setFocusedId}\n renderNode={renderNode}\n />\n ))}\n </ul>\n );\n}\n\nexport const TreeView = forwardRef(TreeViewInner) as <\n TData = Record<string, unknown>,\n>(\n props: TreeViewProps<TData> & { ref?: React.Ref<TreeViewHandle> },\n) => React.ReactElement;\n","/**\n * SearchInput -- controlled search and filter input with chip display.\n *\n * Supports two modes:\n * \"explicit\" -- fires only on Enter or the search button (default)\n * \"debounce\" -- fires automatically after the user stops typing\n *\n * Supports two search styles:\n * Simple -- no schema prop; produces a single search term\n * Faceted -- schema prop provided; facets derived from schema properties,\n * value entry delegates to search widgets\n *\n * Faceted field picker:\n * - Opens on ArrowDown or chevron button click\n * - Filters to prefix-matching facets as the user types\n * - ArrowDown/ArrowUp navigate the list; Enter selects when navigated or typed\n * - Click on an item accepts that facet\n * - Closes when a facet is selected, input is submitted, or focus leaves\n *\n * Always emits a FilterExpr. Use flattenFilterExpr() from @/lib/search to\n * convert to flat key/value params for server APIs that do not yet accept AST.\n *\n * Extractable to @petrarca/sonnet-ui: no imports from api/, services/,\n * store/, contexts/, or modules/.\n */\n\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\nimport { Search, X, ChevronDown } from \"lucide-react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Input } from \"../input\";\nimport { Badge } from \"../badge\";\nimport { Button } from \"../button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport { getFieldTitle } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { isEmptyFilterExpr } from \"@petrarca/sonnet-core/search\";\nimport { useSearchInput, type SearchMode } from \"./useSearchInput\";\nimport type { FacetDescriptor } from \"./schemaAdapter\";\nimport {\n DEFAULT_SEARCH_WIDGETS,\n resolveSearchWidget,\n type SearchWidgetRegistry,\n} from \"./widgets\";\n\nexport interface SearchInputProps {\n // Controlled filter state\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n\n /** JSON Schema defining available facets. Providing this activates\n * faceted mode. Each schema property becomes an available facet.\n * Omit for simple single-term search. */\n schema?: JsonSchema;\n\n /** Custom search widgets merged with defaults. Keys are widget names\n * referenced by x-ui-widget in schema properties. */\n widgets?: SearchWidgetRegistry;\n\n // Interaction mode\n mode?: SearchMode;\n debounceMs?: number;\n /** Minimum characters before onChange fires. Simple mode only --\n * has no effect in faceted mode. */\n minChars?: number;\n /** Show an explicit Search button. Only rendered in explicit mode --\n * has no effect when mode is \"debounce\". */\n showSearchButton?: boolean;\n\n /**\n * Simple mode only. When provided, the search text is expanded into a\n * FilterOr with one LIKE term per field instead of the default single\n * { key: \"search\" } term. Enables cross-field search (e.g. match on\n * code OR display). Ignored in faceted mode.\n */\n searchFields?: string[];\n\n placeholder?: string;\n className?: string;\n /** Disable all interaction (e.g. when a prerequisite is not met). */\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults helper -- moves default-parameter branches out of the component.\n// ---------------------------------------------------------------------------\n\ninterface ResolvedSearchDefaults {\n mode: SearchMode;\n debounceMs: number;\n minChars: number;\n showSearchButton: boolean;\n disabled: boolean;\n}\n\nfunction resolveSearchDefaults(\n props: SearchInputProps,\n): ResolvedSearchDefaults {\n return {\n mode: props.mode ?? \"explicit\",\n debounceMs: props.debounceMs ?? 300,\n minChars: props.minChars ?? 0,\n showSearchButton: props.showSearchButton ?? false,\n disabled: props.disabled ?? false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// FacetPicker -- the popover that lists available facets.\n// ---------------------------------------------------------------------------\n\ninterface FacetPickerProps {\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nfunction FacetPicker({\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n inputRef,\n}: FacetPickerProps): React.ReactElement {\n return (\n <Popover open={pickerVisible} onOpenChange={setPickerOpen} modal={false}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-0.5 text-xs text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((o) => !o);\n inputRef.current?.focus();\n }}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"w-44 p-1\", !hasFacetsToShow && \"hidden\")}\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n onFocusOutside={(e) => e.preventDefault()}\n >\n {filteredFacets.map((facet, i) => (\n <button\n key={facet.key}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n acceptFacet(facet);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {facet.label}\n </button>\n ))}\n </PopoverContent>\n </Popover>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ValueEntry -- widget for pending facet, or plain text input.\n// ---------------------------------------------------------------------------\n\ninterface ValueEntryProps {\n pendingFacet: FacetDescriptor | null;\n PendingWidget: ReturnType<typeof resolveSearchWidget> | null;\n pendingWidgetOptions: Record<string, unknown>;\n inputValue: string;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n commitFacetValue: (v: string) => void;\n cancelPendingFacet: () => void;\n resolvedPlaceholder: string;\n disabled: boolean;\n inputRef: React.RefObject<HTMLInputElement | null>;\n onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onInputFocus: () => void;\n}\n\nfunction ValueEntry({\n pendingFacet,\n PendingWidget,\n pendingWidgetOptions,\n inputValue,\n handleInputChange,\n commitFacetValue,\n cancelPendingFacet,\n resolvedPlaceholder,\n disabled,\n inputRef,\n onInputKeyDown,\n onInputChange,\n onInputFocus,\n}: ValueEntryProps): React.ReactElement {\n if (pendingFacet && PendingWidget) {\n return (\n <PendingWidget\n property={pendingFacet.property}\n options={pendingWidgetOptions}\n value={inputValue}\n onChange={(v) =>\n handleInputChange({\n target: { value: v },\n } as React.ChangeEvent<HTMLInputElement>)\n }\n onCommit={(v) => {\n commitFacetValue(v);\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n onCancel={() => {\n cancelPendingFacet();\n requestAnimationFrame(() => inputRef.current?.focus());\n }}\n placeholder={pendingFacet.placeholder ?? resolvedPlaceholder}\n autoFocus\n />\n );\n }\n\n return (\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={onInputChange}\n onKeyDown={onInputKeyDown}\n onFocus={onInputFocus}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n autoComplete=\"off\"\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Input onKeyDown handler -- extracted to keep the component body lean.\n// ---------------------------------------------------------------------------\n\ninterface InputKeyDownContext {\n isFaceted: boolean;\n pendingFacet: FacetDescriptor | null;\n pickerVisible: boolean;\n hasFacetsToShow: boolean;\n filteredFacets: FacetDescriptor[];\n highlightedIndex: number;\n inputValue: string;\n pickerNavigated: boolean;\n setPickerNavigated: React.Dispatch<React.SetStateAction<boolean>>;\n setPickerOpen: React.Dispatch<React.SetStateAction<boolean>>;\n setHighlightedIndex: React.Dispatch<React.SetStateAction<number>>;\n acceptFacet: (facet: FacetDescriptor) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n}\n\n/** ArrowDown in the picker: open it or move highlight. Returns true if handled. */\nfunction handlePickerArrowDown(ctx: InputKeyDownContext): boolean {\n if (!ctx.isFaceted || ctx.pendingFacet) return false;\n ctx.setPickerNavigated(true);\n if (!ctx.pickerVisible) {\n ctx.setPickerOpen(true);\n } else {\n ctx.setHighlightedIndex((i) =>\n Math.min(i + 1, ctx.filteredFacets.length - 1),\n );\n }\n return true;\n}\n\n/** Enter while picker shows facets: select the highlighted facet. Returns true if handled. */\nfunction handlePickerEnterSelect(ctx: InputKeyDownContext): boolean {\n if (!ctx.hasFacetsToShow) return false;\n if (!ctx.pickerNavigated && !ctx.inputValue.trim()) return false;\n const clamped = Math.min(ctx.highlightedIndex, ctx.filteredFacets.length - 1);\n if (clamped >= 0 && ctx.filteredFacets[clamped]) {\n ctx.setPickerNavigated(false);\n ctx.acceptFacet(ctx.filteredFacets[clamped]);\n return true;\n }\n return false;\n}\n\nfunction handleInputKeyDown(\n e: React.KeyboardEvent<HTMLInputElement>,\n ctx: InputKeyDownContext,\n): void {\n if (e.key === \"ArrowDown\" && handlePickerArrowDown(ctx)) {\n e.preventDefault();\n return;\n }\n if (e.key === \"ArrowUp\" && ctx.hasFacetsToShow) {\n e.preventDefault();\n ctx.setPickerNavigated(true);\n ctx.setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" && handlePickerEnterSelect(ctx)) {\n e.preventDefault();\n return;\n }\n const reopenPicker = ctx.handleKeyDown(e);\n if (e.key === \"Enter\") {\n ctx.setPickerNavigated(false);\n ctx.setPickerOpen(!!reopenPicker);\n }\n}\n\n// ---------------------------------------------------------------------------\n// resolvePlaceholder -- extract conditional placeholder logic.\n// ---------------------------------------------------------------------------\n\nfunction resolvePlaceholder(\n isFaceted: boolean,\n hasActiveTerms: boolean,\n hasPendingFacet: boolean,\n placeholder: string | undefined,\n): string {\n const defaultPlaceholder = isFaceted ? \"Add filter...\" : \"Search...\";\n if (isFaceted && (hasActiveTerms || hasPendingFacet)) return \"Add filter...\";\n return placeholder ?? defaultPlaceholder;\n}\n\n// ---------------------------------------------------------------------------\n// ActiveChips -- renders filter chips in faceted mode.\n// ---------------------------------------------------------------------------\n\ninterface ActiveChipsProps {\n terms: Array<{ key: string; value: string }>;\n schema?: JsonSchema;\n onRemove: (index: number) => void;\n}\n\nfunction ActiveChips({\n terms,\n schema,\n onRemove,\n}: ActiveChipsProps): React.ReactElement {\n return (\n <>\n {terms.map((term, i) => {\n const property = schema?.properties?.[term.key];\n const label = property ? getFieldTitle(term.key, property) : term.key;\n return (\n <FilterChip\n key={`${term.key}:${term.value}`}\n label={`${label}: ${term.value}`}\n onRemove={() => onRemove(i)}\n />\n );\n })}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// resolveWidgetForFacet -- extract widget resolution branches.\n// ---------------------------------------------------------------------------\n\nfunction resolveWidgetForFacet(\n pendingFacet: FacetDescriptor | null,\n registry: SearchWidgetRegistry,\n): {\n Widget: ReturnType<typeof resolveSearchWidget> | null;\n options: Record<string, unknown>;\n} {\n if (!pendingFacet) return { Widget: null, options: {} };\n return {\n Widget: resolveSearchWidget(pendingFacet.property, registry),\n options:\n (pendingFacet.property[\"x-ui-options\"] as Record<string, unknown>) ?? {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// SearchActions -- clear and search buttons, extracted to reduce parent complexity.\n// ---------------------------------------------------------------------------\n\ninterface SearchActionsProps {\n isEmpty: boolean;\n showSearchButton: boolean;\n mode: SearchMode;\n onClear: () => void;\n onCommit: () => void;\n}\n\nfunction SearchActions({\n isEmpty,\n showSearchButton,\n mode,\n onClear,\n onCommit,\n}: SearchActionsProps): React.ReactElement {\n return (\n <>\n {!isEmpty && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onClear();\n }}\n className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\"\n aria-label=\"Clear search\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n {showSearchButton && mode === \"explicit\" && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 shrink-0\"\n onClick={(e) => {\n e.stopPropagation();\n onCommit();\n }}\n >\n Search\n </Button>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// mergeWidgetRegistry -- extracted to reduce parent branches.\n// ---------------------------------------------------------------------------\n\nfunction mergeWidgetRegistry(\n custom: SearchWidgetRegistry | undefined,\n): SearchWidgetRegistry {\n return custom\n ? { ...DEFAULT_SEARCH_WIDGETS, ...custom }\n : DEFAULT_SEARCH_WIDGETS;\n}\n\n// ---------------------------------------------------------------------------\n// SearchInput\n// ---------------------------------------------------------------------------\n\nexport function SearchInput(props: SearchInputProps): React.ReactElement {\n const {\n value,\n onChange,\n schema,\n widgets: customWidgets,\n searchFields,\n placeholder,\n className,\n } = props;\n const { mode, debounceMs, minChars, showSearchButton, disabled } =\n resolveSearchDefaults(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [pickerNavigated, setPickerNavigated] = useState(false);\n\n // Close picker on clicks outside the component.\n useEffect(() => {\n if (!pickerOpen) return;\n function handleMouseDown(e: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setPickerOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [pickerOpen]);\n\n const widgetRegistry = useMemo<SearchWidgetRegistry>(\n () => mergeWidgetRegistry(customWidgets),\n [customWidgets],\n );\n\n const {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n } = useSearchInput({\n value,\n onChange,\n mode,\n debounceMs,\n minChars,\n schema,\n searchFields,\n });\n const isEmpty = isEmptyFilterExpr(value) && inputValue === \"\";\n\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredFacets, pickerOpen]);\n\n const resolvedPlaceholder = resolvePlaceholder(\n isFaceted,\n activeTerms.length > 0,\n pendingFacet !== null,\n placeholder,\n );\n\n const showFacetControls = isFaceted && !pendingFacet;\n const pickerVisible = showFacetControls && pickerOpen;\n const hasFacetsToShow = pickerVisible && filteredFacets.length > 0;\n\n const acceptFacet = React.useCallback(\n (facet: FacetDescriptor) => {\n selectFacet(facet);\n setPickerOpen(false);\n inputRef.current?.focus();\n },\n [selectFacet],\n );\n\n const { Widget: PendingWidget, options: pendingWidgetOptions } =\n resolveWidgetForFacet(pendingFacet, widgetRegistry);\n\n const keyDownCtx: InputKeyDownContext = {\n isFaceted,\n pendingFacet,\n pickerVisible,\n hasFacetsToShow,\n filteredFacets,\n highlightedIndex,\n inputValue,\n pickerNavigated,\n setPickerNavigated,\n setPickerOpen,\n setHighlightedIndex,\n acceptFacet,\n handleKeyDown,\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 text-sm min-h-9\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-text\",\n className,\n )}\n onClick={() => !disabled && inputRef.current?.focus()}\n onBlur={(e) => {\n const relatedTarget = e.relatedTarget as Node | null;\n if (relatedTarget && !e.currentTarget.contains(relatedTarget)) {\n setPickerOpen(false);\n }\n }}\n >\n <Search className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n\n {/* Active filter chips -- faceted mode only */}\n {isFaceted && (\n <ActiveChips\n terms={activeTerms}\n schema={schema}\n onRemove={handleRemoveTerm}\n />\n )}\n\n {/* Pending facet chip */}\n {pendingFacet && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {pendingFacet.label}:\n </span>\n )}\n\n {/* Facet picker + text input / widget row */}\n <div className=\"flex items-center gap-1 flex-1 min-w-[120px]\">\n {showFacetControls && (\n <FacetPicker\n pickerVisible={pickerVisible}\n hasFacetsToShow={hasFacetsToShow}\n filteredFacets={filteredFacets}\n highlightedIndex={highlightedIndex}\n setPickerOpen={setPickerOpen}\n setHighlightedIndex={setHighlightedIndex}\n acceptFacet={acceptFacet}\n inputRef={inputRef}\n />\n )}\n\n <ValueEntry\n pendingFacet={pendingFacet}\n PendingWidget={PendingWidget}\n pendingWidgetOptions={pendingWidgetOptions}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n commitFacetValue={commitFacetValue}\n cancelPendingFacet={cancelPendingFacet}\n resolvedPlaceholder={resolvedPlaceholder}\n disabled={disabled}\n inputRef={inputRef}\n onInputKeyDown={(e) => handleInputKeyDown(e, keyDownCtx)}\n onInputChange={(e) => {\n handleInputChange(e);\n setPickerNavigated(false);\n }}\n onInputFocus={() => {\n if (isFaceted && !pendingFacet) setPickerNavigated(false);\n }}\n />\n </div>\n\n <SearchActions\n isEmpty={isEmpty}\n showSearchButton={showSearchButton}\n mode={mode}\n onClear={handleClear}\n onCommit={() => {\n // Missing required facets reopen the picker, exactly as Enter does,\n // instead of the button appearing to do nothing.\n if (handleCommit()) {\n setPickerNavigated(false);\n setPickerOpen(true);\n inputRef.current?.focus();\n }\n }}\n />\n </div>\n );\n}\n\ninterface FilterChipProps {\n label: string;\n onRemove: () => void;\n}\n\nfunction FilterChip({ label, onRemove }: FilterChipProps): React.ReactElement {\n return (\n <Badge\n variant=\"secondary\"\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full\"\n >\n {label}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ml-0.5 hover:text-destructive transition-colors\"\n aria-label={`Remove filter ${label}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n}\n","/**\n * useSearchInput -- internal state machine for SearchInput.\n *\n * Two code paths:\n * Simple (no schema) -- manages a single input string, commits it as\n * a one-term FilterExpr on Enter or debounce.\n * Faceted (schema) -- manages chip accumulation plus a pending\n * facet/value input. Facets are derived from the\n * schema properties via buildFacetDescriptors().\n *\n * Event contract:\n * onChange is the single output event. It fires:\n * Simple mode, explicit -- on Enter\n * Simple mode, debounce -- after the user stops typing\n * Faceted mode -- on submit only (Enter on empty input after\n * chips are composed). Chip accumulation is\n * internal state; the caller never sees it.\n * Remove chip / Clear -- immediately (destructive ops need instant feedback)\n *\n * Faceted field selection:\n * While no facet is pending and the input does NOT end with a space,\n * filteredFacets contains the subset of facets whose labels start with\n * the current input (case-insensitive). Selecting one sets it as the\n * pending facet and clears the input.\n *\n * If the input ends with a space, facet matching is suppressed --\n * the value is committed against facets[0] (implicit default).\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { JsonSchema } from \"@petrarca/sonnet-core/schema\";\nimport type { FilterExpr, FilterTerm } from \"@petrarca/sonnet-core/search\";\nimport { collectTerms } from \"@petrarca/sonnet-core/search\";\nimport { buildFacetDescriptors, type FacetDescriptor } from \"./schemaAdapter\";\n\nexport type SearchMode = \"debounce\" | \"explicit\";\n\ninterface UseSearchInputOptions {\n value: FilterExpr;\n onChange: (expr: FilterExpr) => void;\n mode?: SearchMode;\n debounceMs?: number;\n schema?: JsonSchema;\n minChars?: number;\n /**\n * When provided (simple mode only), the search text is expanded into\n * a FilterOr with one LIKE term per field instead of the single\n * { key: \"search\" } term. Ignored in faceted mode.\n *\n * Example: searchFields = [\"code\", \"display\"] with text \"aspirin\"\n * produces { type: \"or\", children: [\n * { type: \"term\", key: \"code\", value: \"aspirin\" },\n * { type: \"term\", key: \"display\", value: \"aspirin\" },\n * ]}\n */\n searchFields?: string[];\n}\n\ninterface UseSearchInputReturn {\n inputValue: string;\n pendingFacet: FacetDescriptor | null;\n isFaceted: boolean;\n filteredFacets: FacetDescriptor[];\n allFacets: FacetDescriptor[];\n selectFacet: (f: FacetDescriptor | null) => void;\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** Returns true when the picker should (re)open (required facets missing). */\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;\n /** Commit the current entry. Returns true when required facets are missing\n * and the caller should reopen the picker. */\n handleCommit: () => boolean;\n handleRemoveTerm: (index: number) => void;\n handleClear: () => void;\n activeTerms: FilterTerm[];\n commitFacetValue: (value: string) => void;\n cancelPendingFacet: () => void;\n}\n\nfunction buildSimpleExpr(text: string, searchFields?: string[]): FilterExpr {\n const trimmed = text.trim();\n if (!trimmed) return { type: \"and\", children: [] };\n\n // Multi-field OR: one LIKE term per field, wrapped in an OR node.\n if (searchFields && searchFields.length > 0) {\n const terms: FilterTerm[] = searchFields.map((key) => ({\n type: \"term\",\n key,\n value: trimmed,\n }));\n if (terms.length === 1) {\n return { type: \"and\", children: terms };\n }\n return { type: \"and\", children: [{ type: \"or\", children: terms }] };\n }\n\n return {\n type: \"and\",\n children: [{ type: \"term\", key: \"search\", value: trimmed }],\n };\n}\n\nexport function useSearchInput({\n value,\n onChange,\n mode = \"explicit\",\n debounceMs = 300,\n schema,\n minChars = 0,\n searchFields,\n}: UseSearchInputOptions): UseSearchInputReturn {\n const allFacets = useMemo(\n () => (schema ? buildFacetDescriptors(schema) : []),\n [schema],\n );\n\n const isFaceted = allFacets.length > 0;\n\n const initialInput = !isFaceted\n ? (() => {\n const terms = collectTerms(value);\n return terms.length === 1 && terms[0].key === \"search\"\n ? terms[0].value\n : \"\";\n })()\n : \"\";\n\n const [inputValue, setInputValue] = useState(initialInput);\n const [pendingFacet, setPendingFacet] = useState<FacetDescriptor | null>(\n null,\n );\n\n // In faceted mode, chip accumulation lives in draftTerms (local state).\n // onChange is only called on submit or on destructive ops (remove/clear).\n const [draftTerms, setDraftTerms] = useState<FilterTerm[]>(() =>\n isFaceted ? collectTerms(value) : [],\n );\n\n const valueTerms = useMemo(\n () => (!isFaceted ? collectTerms(value) : []),\n [value, isFaceted],\n );\n const activeTerms = isFaceted ? draftTerms : valueTerms;\n\n const activeFieldKeys = useMemo(\n () => new Set(activeTerms.map((t) => t.key)),\n [activeTerms],\n );\n\n const filteredFacets = useMemo<FacetDescriptor[]>(() => {\n if (!isFaceted || pendingFacet || inputValue.endsWith(\" \")) return [];\n const available = allFacets.filter((f) => !activeFieldKeys.has(f.key));\n if (!inputValue.trim()) return available;\n const lower = inputValue.toLowerCase();\n return available.filter((f) => f.label.toLowerCase().startsWith(lower));\n }, [inputValue, pendingFacet, isFaceted, allFacets, activeFieldKeys]);\n\n // Stable refs\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const draftTermsRef = useRef(draftTerms);\n draftTermsRef.current = draftTerms;\n const pendingFacetRef = useRef(pendingFacet);\n pendingFacetRef.current = pendingFacet;\n const inputValueRef = useRef(inputValue);\n inputValueRef.current = inputValue;\n const isFacetedRef = useRef(isFaceted);\n isFacetedRef.current = isFaceted;\n const allFacetsRef = useRef(allFacets);\n allFacetsRef.current = allFacets;\n const filteredFacetsRef = useRef(filteredFacets);\n filteredFacetsRef.current = filteredFacets;\n const minCharsRef = useRef(minChars);\n minCharsRef.current = minChars;\n\n // When the controlled value is reset to empty externally (e.g. after a\n // search result is selected), clear internal draft state to match.\n useEffect(() => {\n if (!isFaceted) return;\n const terms = collectTerms(value);\n if (terms.length === 0) {\n setDraftTerms([]);\n setInputValue(\"\");\n setPendingFacet(null);\n }\n }, [value, isFaceted]);\n\n // Debounce effect (simple mode only)\n const searchFieldsRef = useRef(searchFields);\n searchFieldsRef.current = searchFields;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return;\n }\n if (mode !== \"debounce\" || isFaceted) return;\n if (inputValue.trim().length < minCharsRef.current) return;\n const timer = setTimeout(() => {\n onChangeRef.current(buildSimpleExpr(inputValue, searchFieldsRef.current));\n }, debounceMs);\n return () => clearTimeout(timer);\n }, [inputValue, mode, debounceMs, isFaceted]);\n\n // Flush terms to onChange.\n const submitDraft = useCallback((terms: FilterTerm[]) => {\n onChangeRef.current({ type: \"and\", children: terms });\n }, []);\n\n // Check whether all required facets have a chip in the given terms list.\n // Returns true when all are present, or when no facets are required.\n const allRequiredSatisfied = useCallback((terms: FilterTerm[]) => {\n const requiredKeys = allFacetsRef.current\n .filter((f) => f.required)\n .map((f) => f.key);\n if (requiredKeys.length === 0) return true;\n const presentKeys = new Set(terms.map((t) => t.key));\n return requiredKeys.every((k) => presentKeys.has(k));\n }, []);\n\n // Add a chip to draftTerms. Never calls onChange.\n const addChip = useCallback((text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const facet = pendingFacetRef.current ?? allFacetsRef.current[0] ?? null;\n if (!facet) return;\n const newTerm: FilterTerm = {\n type: \"term\",\n key: facet.key,\n value: trimmed,\n };\n const nextTerms = [...draftTermsRef.current, newTerm];\n setDraftTerms(nextTerms);\n setInputValue(\"\");\n setPendingFacet(null);\n }, []);\n\n const commitFacetValue = addChip;\n const cancelPendingFacet = useCallback(() => {\n setInputValue(\"\");\n setPendingFacet(null);\n }, []);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n },\n [],\n );\n\n // -- Key-down helpers (extracted to reduce cyclomatic complexity) --------\n\n /** Tab/Enter with exactly one filtered match: accept the facet. */\n const tryAcceptSingleMatch = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if (\n !isFacetedRef.current ||\n pendingFacetRef.current ||\n filteredFacetsRef.current.length !== 1 ||\n !inputValueRef.current.trim()\n ) {\n return false;\n }\n e.preventDefault();\n setPendingFacet(filteredFacetsRef.current[0]);\n setInputValue(\"\");\n return true;\n },\n [],\n );\n\n /** Enter in faceted mode: add chip or submit draft. Returns true when\n * required facets are missing and the picker should reopen. */\n const handleEnterFaceted = useCallback((): boolean => {\n const trimmed = inputValueRef.current.trim();\n if (trimmed) {\n addChip(trimmed);\n return false;\n }\n if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n /** Enter in simple mode: commit search text. */\n const handleEnterSimple = useCallback(() => {\n if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n buildSimpleExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n }, []);\n\n /** Backspace on empty input: clear pending facet, last chip, or reset. */\n const handleBackspaceEmpty = useCallback(() => {\n if (isFacetedRef.current) {\n if (pendingFacetRef.current) {\n setPendingFacet(null);\n } else if (draftTermsRef.current.length > 0) {\n setDraftTerms((prev) => prev.slice(0, -1));\n }\n } else {\n onChangeRef.current({ type: \"and\", children: [] });\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): boolean => {\n if ((e.key === \"Tab\" || e.key === \"Enter\") && tryAcceptSingleMatch(e)) {\n return false;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (isFacetedRef.current) {\n return handleEnterFaceted();\n }\n handleEnterSimple();\n return false;\n }\n\n if (e.key === \"Backspace\" && inputValueRef.current === \"\") {\n handleBackspaceEmpty();\n }\n return false;\n },\n [\n tryAcceptSingleMatch,\n handleEnterFaceted,\n handleEnterSimple,\n handleBackspaceEmpty,\n ],\n );\n\n /** Commit the current entry. Returns true when required facets are missing\n * and the picker should reopen -- the same signal Enter produces, so the\n * search button and the keyboard behave alike rather than the button\n * silently doing nothing. */\n const handleCommit = useCallback((): boolean => {\n if (isFacetedRef.current) {\n const trimmed = inputValueRef.current.trim();\n if (trimmed) {\n addChip(trimmed);\n } else if (!pendingFacetRef.current) {\n if (allRequiredSatisfied(draftTermsRef.current)) {\n submitDraft(draftTermsRef.current);\n } else {\n return true;\n }\n }\n } else if (inputValueRef.current.trim().length >= minCharsRef.current) {\n onChangeRef.current(\n buildSimpleExpr(inputValueRef.current, searchFieldsRef.current),\n );\n }\n return false;\n }, [addChip, submitDraft, allRequiredSatisfied]);\n\n // Remove chip -- immediate onChange (destructive op).\n const handleRemoveTerm = useCallback((index: number) => {\n const next = draftTermsRef.current.filter((_, i) => i !== index);\n setDraftTerms(next);\n onChangeRef.current({ type: \"and\", children: next });\n }, []);\n\n const handleClear = useCallback(() => {\n setInputValue(\"\");\n setPendingFacet(null);\n setDraftTerms([]);\n onChangeRef.current({ type: \"and\", children: [] });\n }, []);\n\n const selectFacet = useCallback(\n (f: FacetDescriptor | null) => setPendingFacet(f),\n [],\n );\n\n return {\n inputValue,\n pendingFacet,\n isFaceted,\n filteredFacets,\n allFacets,\n selectFacet,\n handleInputChange,\n handleKeyDown,\n handleCommit,\n handleRemoveTerm,\n handleClear,\n activeTerms,\n commitFacetValue,\n cancelPendingFacet,\n };\n}\n","/**\n * Schema adapter -- reads a JsonSchema and produces internal FacetDescriptor\n * objects for the faceted search mode.\n *\n * This is the bridge between the public schema-based API and the internal\n * representation used by the search hook and widget system.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type {\n JsonSchema,\n JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport {\n getFieldTitle,\n getFieldHelpText,\n getFieldPlaceholder,\n} from \"@petrarca/sonnet-core/schema\";\n\n/** Internal facet descriptor derived from a schema property. */\nexport interface FacetDescriptor {\n /** Property key from the schema -- used as the facet key in FilterExpr. */\n key: string;\n /** Display label for the picker and chips. */\n label: string;\n /** Whether this facet is required (listed in schema.required). */\n required: boolean;\n /** Optional description for tooltip or help text. */\n description?: string;\n /** Placeholder text for the value input. */\n placeholder?: string;\n /** The original schema property -- passed to the search widget. */\n property: JsonSchemaProperty;\n}\n\n/**\n * Derive an ordered list of facet descriptors from a JSON Schema.\n *\n * Respects x-ui-order for display ordering. Properties not listed in\n * x-ui-order are appended in their natural (insertion) order.\n */\nexport function buildFacetDescriptors(schema: JsonSchema): FacetDescriptor[] {\n const properties = schema.properties ?? {};\n const keys = Object.keys(properties);\n if (keys.length === 0) return [];\n\n const requiredSet = new Set((schema.required as string[] | undefined) ?? []);\n\n // Apply x-ui-order: listed keys first, unlisted keys appended\n const order = schema[\"x-ui-order\"] as string[] | undefined;\n const ordered = applyOrder(keys, order);\n\n return ordered.map((key) => {\n const property = properties[key];\n return {\n key,\n label: getFieldTitle(key, property),\n required: requiredSet.has(key),\n description: getFieldHelpText(property),\n placeholder: getFieldPlaceholder(property),\n property,\n };\n });\n}\n\n/**\n * Apply x-ui-order to a list of keys.\n * Keys listed in order come first (in order), unlisted keys are appended\n * in their original order.\n */\nfunction applyOrder(keys: string[], order?: string[]): string[] {\n if (!order || order.length === 0) return keys;\n const keySet = new Set(keys);\n const ordered: string[] = [];\n for (const key of order) {\n if (keySet.has(key)) {\n ordered.push(key);\n keySet.delete(key);\n }\n }\n // Append remaining keys in original order\n for (const key of keys) {\n if (keySet.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n","/**\n * TextSearchWidget -- default search widget for plain text facet values.\n *\n * Renders a borderless inline input. Commits on Enter, cancels on Escape.\n * This is the baseline behavior that all faceted text inputs had before\n * the widget system was introduced.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useRef, useEffect } from \"react\";\nimport { Input } from \"../../input\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function TextSearchWidget({\n value,\n onChange,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <Input\n ref={inputRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const trimmed = value.trim();\n if (trimmed) onCommit(trimmed);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n } else if (e.key === \"Backspace\" && value === \"\") {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={placeholder}\n className=\"border-0 shadow-none focus-visible:ring-0 h-auto p-0 text-sm bg-transparent\"\n />\n );\n}\n","/**\n * EnumSearchWidget -- search widget for facets with a fixed set of values.\n *\n * Renders an inline dropdown populated from the schema property's enum\n * values. Reads x-ui-options.enumNames for display labels. Commits on\n * item selection, cancels on Escape.\n *\n * Triggered automatically when the schema property has an enum array.\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from \"@petrarca/sonnet-core\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../popover\";\nimport type { SearchWidgetProps } from \"./types\";\n\nexport function EnumSearchWidget({\n property,\n options: widgetOptions,\n onCommit,\n onCancel,\n placeholder,\n autoFocus,\n}: SearchWidgetProps): React.ReactElement {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n const enumValues: string[] = (property.enum as string[]) ?? [];\n const enumNames =\n (widgetOptions.enumNames as Record<string, string> | undefined) ?? {};\n\n const items = enumValues.map((val) => ({\n value: val,\n label: enumNames[val] ?? val,\n }));\n\n const filtered = search\n ? items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase()),\n )\n : items;\n\n // Reset highlight when filtered list changes\n useEffect(() => {\n setHighlightedIndex(0);\n }, [filtered.length, search]);\n\n // Auto-open on mount when autoFocus is set\n useEffect(() => {\n if (autoFocus) {\n requestAnimationFrame(() => setOpen(true));\n }\n }, [autoFocus]);\n\n function handleCommit(val: string) {\n onCommit(val);\n setOpen(false);\n setSearch(\"\");\n }\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) setSearch(\"\");\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n onCancel();\n return;\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.min(i + 1, filtered.length - 1));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n const item = filtered[highlightedIndex];\n if (item) handleCommit(item.value);\n return;\n }\n }\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors truncate text-left\"\n onClick={() => setOpen(true)}\n >\n {placeholder ?? \"Select...\"}\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-48 p-1\"\n align=\"start\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <input\n autoFocus\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search...\"\n className=\"w-full px-2 py-1.5 text-sm bg-transparent outline-none border-b border-border mb-1 placeholder:text-muted-foreground\"\n />\n <div>\n {filtered.length === 0 && (\n <p className=\"px-2 py-1.5 text-sm text-muted-foreground\">\n No matches\n </p>\n )}\n {filtered.map((item, i) => (\n <button\n key={item.value}\n type=\"button\"\n className={cn(\n \"w-full text-left px-2 py-1.5 text-sm rounded transition-colors\",\n i === highlightedIndex\n ? \"bg-accent text-accent-foreground\"\n : \"hover:bg-accent hover:text-accent-foreground\",\n )}\n onMouseDown={(e) => {\n e.preventDefault();\n handleCommit(item.value);\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n >\n {item.label}\n </button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","/**\n * Search widget resolution.\n *\n * Determines which search widget to render for a given facet based on\n * its JSON Schema property definition:\n *\n * 1. Explicit: x-ui-widget on the property -> look up in registry.\n * 2. Enum: enum present on the property -> \"enum\" widget.\n * 3. Type fallback -> \"text\" widget (default).\n *\n * Extractable to @petrarca/sonnet-ui: no app-specific imports.\n */\n\nimport type { JsonSchemaProperty } from \"@petrarca/sonnet-core/schema\";\nimport type { SearchWidget, SearchWidgetRegistry } from \"./types\";\n\n/** Resolve the search widget for a facet's schema property. */\nexport function resolveSearchWidget(\n property: JsonSchemaProperty,\n registry: SearchWidgetRegistry,\n): SearchWidget {\n // 1. Explicit widget override via x-ui-widget\n const widgetName = property[\"x-ui-widget\"];\n if (widgetName && registry[widgetName]) {\n return registry[widgetName];\n }\n\n // 2. Enum present -> enum widget\n if (property.enum && property.enum.length > 0 && registry[\"enum\"]) {\n return registry[\"enum\"];\n }\n\n // 3. Type-based fallback -> text widget\n return registry[\"text\"];\n}\n","import type { SearchWidgetRegistry } from \"./types\";\nimport { TextSearchWidget } from \"./TextSearchWidget\";\nimport { EnumSearchWidget } from \"./EnumSearchWidget\";\n\nexport type {\n SearchWidgetProps,\n SearchWidget,\n SearchWidgetRegistry,\n} from \"./types\";\nexport { resolveSearchWidget } from \"./resolveSearchWidget\";\nexport { TextSearchWidget } from \"./TextSearchWidget\";\nexport { EnumSearchWidget } from \"./EnumSearchWidget\";\n\n/** Default search widget registry. Consumers extend this via the widgets prop. */\nexport const DEFAULT_SEARCH_WIDGETS: SearchWidgetRegistry = {\n text: TextSearchWidget,\n enum: EnumSearchWidget,\n};\n","import { Copy } from \"lucide-react\";\nimport { Button } from \"../button\";\n\ntype Props = {\n hasItems: boolean;\n onClick: () => void;\n};\n\n/**\n * ClipboardButton - Toolbar button that opens the clipboard menu.\n *\n * Displayed in CytoscapeControls toolbar with enabled/disabled state.\n */\nfunction ClipboardButton({ hasItems, onClick }: Props) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClick}\n disabled={!hasItems}\n style={{\n opacity: hasItems ? 1 : 0.4,\n cursor: hasItems ? \"pointer\" : \"not-allowed\",\n }}\n >\n <Copy size={16} />\n </Button>\n );\n}\n\nexport default ClipboardButton;\n","import { X, Plus } from \"lucide-react\";\nimport { ClipboardItem } from \"./clipboardStore\";\nimport { Button } from \"../button\";\nimport { SimpleGroup } from \"../simple-group\";\n\ntype Props = {\n item: ClipboardItem;\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n onRemove: (itemId: string) => void;\n};\n\n/**\n * ClipboardItem - Individual clipboard item display.\n *\n * Shows item info with color indicator and action buttons.\n * Compact design for dropdown menu.\n */\nfunction ClipboardItemComponent({ item, onAddItem, onRemove }: Props) {\n const handleAddClick = (e: React.MouseEvent) => {\n const keepInClipboard = e.shiftKey;\n onAddItem(item, keepInClipboard);\n };\n\n return (\n <div\n className=\"p-3 rounded mb-2\"\n style={{\n borderLeft: `4px solid ${item.color}`,\n backgroundColor: \"#f8f9fa\",\n }}\n >\n <SimpleGroup justify=\"space-between\" wrap=\"nowrap\" align=\"flex-start\">\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <p className=\"text-sm font-semibold truncate\">{item.label}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {item.displayName}\n </p>\n <p className=\"text-xs text-muted-foreground font-mono\">\n #{item.entityId}\n </p>\n </div>\n <SimpleGroup gap={4} wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={handleAddClick}\n title=\"Click to add and remove from clipboard, Shift+Click to keep in clipboard\"\n >\n <Plus size={16} />\n Add\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onRemove(item.id)}\n title=\"Remove from clipboard\"\n >\n <X size={16} />\n </Button>\n </SimpleGroup>\n </SimpleGroup>\n </div>\n );\n}\n\nexport default ClipboardItemComponent;\n","import { Trash2 } from \"lucide-react\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { Separator } from \"../separator\";\nimport useClipboard, { ClipboardItem } from \"./clipboardStore\";\nimport ClipboardItemComponent from \"./ClipboardItem\";\nimport { Button } from \"../button\";\nimport { SimpleStack } from \"../simple-stack\";\n\ntype Props = {\n onAddItem: (item: ClipboardItem, keepInClipboard: boolean) => void;\n};\n\n/**\n * ClipboardMenu - Dropdown menu content for clipboard management.\n *\n * Displays clipboard items with add and clear all functionality.\n */\nfunction ClipboardMenu({ onAddItem }: Props) {\n const { items, removeItem, clear } = useClipboard();\n\n // Empty state\n if (items.length === 0) {\n return (\n <div style={{ padding: \"16px\", textAlign: \"center\", width: \"300px\" }}>\n <p className=\"text-sm text-muted-foreground\">No items in clipboard</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Right-click a node and select \"Copy\"\n </p>\n </div>\n );\n }\n\n return (\n <div\n style={{\n width: \"380px\",\n maxWidth: \"90vw\",\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"500px\",\n }}\n >\n {/* Items list with flexible height */}\n <ScrollArea className=\"flex-1 p-3 min-h-0\">\n <SimpleStack gap={0}>\n {items.map((item) => (\n <ClipboardItemComponent\n key={item.id}\n item={item}\n onAddItem={onAddItem}\n onRemove={removeItem}\n />\n ))}\n </SimpleStack>\n </ScrollArea>\n\n <Separator />\n\n {/* Footer with clear all - fixed at bottom */}\n <div style={{ padding: \"8px 12px\", flexShrink: 0 }}>\n <Button\n className=\"w-full\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={clear}\n >\n <Trash2 size={16} />\n Clear All ({items.length})\n </Button>\n </div>\n </div>\n );\n}\n\nexport default ClipboardMenu;\n","import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { devLog } from \"@petrarca/sonnet-core\";\n\n/**\n * ClipboardItem - Lightweight representation of an item in the clipboard.\n */\nexport interface ClipboardItem {\n id: string; // unique clipboard item ID (UUID)\n type: string; // item type (e.g. 'node', 'entity', etc.)\n entityId: string; // external entity identifier\n label: string; // entity label/type\n displayName: string; // visual display name\n color: string; // color for UI indicator\n}\n\n/**\n * Input for adding items to clipboard.\n */\nexport interface ClipboardItemInput {\n entityId: string;\n type: string;\n label: string;\n displayName: string;\n color: string;\n}\n\n/**\n * ClipboardItemKey - Unique identifier for deduplication.\n */\ntype ClipboardItemKey = string;\n\nfunction getItemKey(item: ClipboardItem): ClipboardItemKey {\n return `${item.type}:${item.entityId}:${item.label}`;\n}\n\nfunction getInputKey(input: ClipboardItemInput): ClipboardItemKey {\n return `${input.type}:${input.entityId}:${input.label}`;\n}\n\nfunction uuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\ninterface ClipboardStore {\n items: ClipboardItem[];\n\n /**\n * Add items to clipboard with deduplication.\n */\n addItems: (inputs: ClipboardItemInput[]) => void;\n\n /**\n * Remove a single item from clipboard by its unique ID.\n */\n removeItem: (itemId: string) => void;\n\n /**\n * Clear all items from clipboard.\n */\n clear: () => void;\n}\n\nconst MAX_CLIPBOARD_SIZE = 100;\n\nconst useClipboard = create<ClipboardStore>()(\n persist(\n (set, get) => ({\n items: [],\n\n addItems: (inputs) => {\n const currentItems = get().items;\n const existingKeys = new Set(currentItems.map(getItemKey));\n\n const newItems = inputs\n .map(\n (input): ClipboardItem => ({\n id: uuid(),\n type: input.type,\n entityId: input.entityId,\n label: input.label,\n displayName: input.displayName,\n color: input.color,\n }),\n )\n .filter((item) => !existingKeys.has(getInputKey(item)));\n\n if (newItems.length === 0) {\n devLog(\n \"[ClipboardStore] addItems - all items were duplicates, skipped\",\n );\n return;\n }\n\n let updatedItems = [...currentItems, ...newItems];\n\n if (updatedItems.length > MAX_CLIPBOARD_SIZE) {\n const overflow = updatedItems.length - MAX_CLIPBOARD_SIZE;\n updatedItems = updatedItems.slice(overflow);\n devLog(\n \"[ClipboardStore] addItems - size limit exceeded, removed oldest\",\n { overflow },\n );\n }\n\n devLog(\"[ClipboardStore] addItems\", {\n added: newItems.length,\n total: updatedItems.length,\n skippedDuplicates: inputs.length - newItems.length,\n });\n\n set({ items: updatedItems });\n },\n\n removeItem: (itemId) => {\n const currentItems = get().items;\n const updatedItems = currentItems.filter((item) => item.id !== itemId);\n\n if (updatedItems.length === currentItems.length) {\n devLog(\"[ClipboardStore] removeItem - item not found\", { itemId });\n return;\n }\n\n devLog(\"[ClipboardStore] removeItem\", {\n itemId,\n remainingCount: updatedItems.length,\n });\n set({ items: updatedItems });\n },\n\n clear: () => {\n const currentCount = get().items.length;\n devLog(\"[ClipboardStore] clear\", { clearedCount: currentCount });\n set({ items: [] });\n },\n }),\n {\n name: \"clipboard-items\",\n version: 2,\n },\n ),\n);\n\nexport default useClipboard;\n"],"mappings":";AAAA,YAAY,WAAW;AACvB,SAAS,WAA8B;AAEvC,SAAS,UAAU;AAsBjB;AApBF,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,IAAM,QAAc,iBAGlB,CAAC,EAAE,WAAW,SAAS,GAAG,MAAM,GAAG,QACnC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,IAClD,GAAG;AAAA;AACN,CACD;AACD,MAAM,cAAc;AAEpB,IAAM,aAAmB,iBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;AAEzB,IAAM,mBAAyB,iBAG7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,iBAAiB,cAAc;;;ACxD/B,YAAYA,YAAW;AACvB,YAAY,qBAAqB;AAEjC,SAAS,MAAAC,WAAU;AAMjB,gBAAAC,YAAA;AAJF,IAAM,SAAe,kBAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,OAAO,cAA8B,qBAAK;AAC1C,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,IAAG,+BAA+B,SAAS;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,iBAAuB,kBAG3B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA8B,yBAAS;;;AC3CtD,SAAS,OAAAE,YAA8B;AAEvC,SAAS,MAAAC,WAAU;AA+Cf,gBAAAC,YAAA;AA7CJ,IAAM,gBAAgBF;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SAAS;AAAA,MACX;AAAA,MACA,YAAY;AAAA,QACV,OACE;AAAA,QACF,MAAM;AAAA,QACN,OACE;AAAA,QACF,KAAK;AAAA,QACL,QACE;AAAA,QACF,QACE;AAAA,QACF,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QACE;AAAA,QACF,QACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAMA,SAAS,MAAM,EAAE,WAAW,SAAS,YAAY,GAAG,MAAM,GAAe;AACvE,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD,IAAG,cAAc,EAAE,SAAS,WAAW,CAAC,GAAG,SAAS;AAAA,MAC9D,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACvDA,YAAYE,YAAW;AACvB,SAAS,YAAY;AACrB,SAAS,OAAAC,YAA8B;AAEvC,SAAS,MAAAC,WAAU;AA0Cb,gBAAAC,YAAA;AAxCN,IAAM,iBAAiBF;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAChE,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD,IAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ACtDrB,YAAYE,YAAW;AACvB,SAAS,MAAAC,WAAU;;;ACCnB,YAAYC,YAAW;AACvB,YAAY,sBAAsB;AAElC,SAAS,MAAAC,WAAU;AAYjB,gBAAAC,YAAA;AAVF,IAAM,kBAAmC;AAEzC,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,kBAG3B,CAAC,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,QAC1C,gBAAAA;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA+B,yBAAQ;;;ACIhD,SACE,OAAAE,MADF;AAVC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AACF,GAAuB;AACrB,SACE,gBAAAA,KAAC,mBAAgB,eACf,+BAAC,WACC;AAAA,oBAAAA,KAAC,kBAAe,SAAO,MAAE,UAAS;AAAA,IAClC,gBAAAA,KAAC,kBAAe,MAAY,OAAc,YACvC,iBACH;AAAA,KACF,GACF;AAEJ;;;AF6CQ,gBAAAC,YAAA;AA/BR,SAAS,YAAY,UAAuC;AAC1D,SAAO,WACH,4DACA;AACN;AAEO,IAAM,aAAmB;AAAA,EAC9B,SAASC,YACP;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,YACJ,YAAY,UACR,SAAS,gBACP,iDACA,gDACF,SAAS,gBACP,2BACA;AACR,WACE,gBAAAD,KAAC,iBAAc,OAAc,MAAM,aACjC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL;AAAA,QACA,cAAY;AAAA,QACZ;AAAA,QACA,WAAWE;AAAA,UACT;AAAA,UACA,iBAAiB,YAAY,QAAQ;AAAA,UACrC;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;;;AGvGA,YAAYC,YAAW;AAEvB,SAAS,MAAAC,WAAU;AAMjB,gBAAAC,YAAA;AAJF,IAAM,OAAa,kBAGjB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,KAAK,cAAc;AAEnB,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWD,IAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;AAEzB,IAAM,YAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,kBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWD,IAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC,KAAC,SAAI,KAAU,WAAWD,IAAG,YAAY,SAAS,GAAI,GAAG,OAAO,CACjE;AACD,YAAY,cAAc;AAE1B,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWD,IAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;;;AC5EzB,YAAYE,YAAW;AACvB,YAAY,uBAAuB;AACnC,SAAS,aAAa;AAEtB,SAAS,MAAAC,WAAU;AAiBb,gBAAAC,YAAA;AAfN,IAAM,WAAiB,kBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAmB;AAAA,EAAlB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAC;AAAA,MAAmB;AAAA,MAAlB;AAAA,QACC,WAAWD,IAAG,wCAAwC;AAAA,QAEtD,0BAAAC,KAAC,SAAM,WAAU,WAAU;AAAA;AAAA,IAC7B;AAAA;AACF,CACD;AACD,SAAS,cAAgC,uBAAK;;;ACzB9C,YAAY,0BAA0B;AAEtC,IAAM,cAAmC;AAEzC,IAAMC,sBAA0C;AAEhD,IAAMC,sBAA0C;;;ACNhD,YAAYC,YAAW;AAEvB,SAAS,WAAW,wBAAwB;AAC5C,SAAS,cAAc;AAEvB,SAAS,MAAAC,YAAU;;;ACLnB,YAAYC,YAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAS;AAElB,SAAS,MAAAC,WAAU;AAcjB,gBAAAC,OA0BI,QAAAC,aA1BJ;AAZF,IAAM,SAAyB;AAE/B,IAAM,gBAAgC;AAEtC,IAAM,eAA+B;AAErC,IAAM,cAA8B;AAEpC,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAD;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAE,MAAC,gBACC;AAAA,kBAAAD,MAAC,iBAAc;AAAA,EACf,gBAAAC;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACC;AAAA,MACA,WAAWF;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAE,MAAiB,uBAAhB,EAAsB,WAAU,iRAC/B;AAAA,0BAAAD,MAAC,KAAE,WAAU,WAAU;AAAA,UACvB,gBAAAA,MAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,WACjC;AAAA;AAAA;AAAA,EACF;AAAA,GACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA,GAAG;AACL,MACE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAEF,aAAa,cAAc;AAE3B,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA,GAAG;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAEF,aAAa,cAAc;AAE3B,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,oBAA0B,kBAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,IAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,kBAAkB,cAA8B,4BAAY;;;AD9F1D,gBAAAG,OA2BA,QAAAC,aA3BA;AAJF,IAAM,UAAgB,kBAGpB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,QAAQ,cAAc,iBAAiB;AAEvC,IAAM,gBAAgB,CAAC,EAAE,UAAU,GAAG,MAAM,MAAmB;AAC7D,SACE,gBAAAF,MAAC,UAAQ,GAAG,OACV,0BAAAA,MAAC,iBAAc,WAAU,iCACvB,0BAAAA,MAAC,WAAQ,WAAU,+WAChB,UACH,GACF,GACF;AAEJ;AAEA,IAAM,eAAqB,kBAGzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC,MAAC,SAAI,WAAU,mCAAkC,sBAAmB,IAClE;AAAA,kBAAAD,MAAC,UAAO,WAAU,oCAAmC;AAAA,EACrD,gBAAAA;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAAA,GACF,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAF;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAWE,KAAG,mDAAmD,SAAS;AAAA,IACzE,GAAG;AAAA;AACN,CACD;AAED,YAAY,cAAc,iBAAiB,KAAK;AAEhD,IAAM,eAAqB,kBAGzB,CAAC,OAAO,QACR,gBAAAF;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAU;AAAA,IACT,GAAG;AAAA;AACN,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,eAAqB,kBAGzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,mBAAyB,kBAG7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAF;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAWE,KAAG,wBAAwB,SAAS;AAAA,IAC9C,GAAG;AAAA;AACN,CACD;AACD,iBAAiB,cAAc,iBAAiB,UAAU;AAE1D,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAF;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AAED,YAAY,cAAc,iBAAiB,KAAK;AAEhD,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA,GAAG;AACL,MAA6C;AAC3C,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,WAAWE;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,gBAAgB,cAAc;;;AE1I9B,YAAYC,aAAW;AACvB,YAAY,2BAA2B;AACvC,SAAS,SAAAC,QAAO,cAAc,cAAc;AAE5C,SAAS,MAAAC,YAAU;AAoBjB,SAUE,OAAAC,OAVF,QAAAC,aAAA;AAlBF,IAAM,eAAqC;AAE3C,IAAM,sBAA4C;AAElD,IAAM,oBAA0C;AAEhD,IAAM,qBAA2C;AAEjD,IAAM,kBAAwC;AAE9C,IAAM,yBAA+C;AAErD,IAAM,yBAA+B,mBAKnC,CAAC,EAAE,WAAW,OAAO,UAAU,GAAG,MAAM,GAAG,QAC3C,gBAAAA;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEH;AAAA;AAAA,MACD,gBAAAC,MAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AACpC,CACD;AACD,uBAAuB,cACC,iCAAW;AAEnC,IAAM,yBAA+B,mBAGnC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,uBAAuB,cACC,iCAAW;AAEnC,IAAM,sBAA4B,mBAGhC,CAAC,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,QAC1C,gBAAAC,MAAuB,8BAAtB,EACC,0BAAAA;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,GACF,CACD;AACD,oBAAoB,cAAoC,8BAAQ;AAEhE,IAAM,mBAAyB,mBAK7B,CAAC,EAAE,WAAW,OAAO,GAAG,MAAM,GAAG,QACjC,gBAAAC;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,iBAAiB,cAAoC,2BAAK;AAE1D,IAAM,2BAAiC,mBAGrC,CAAC,EAAE,WAAW,UAAU,SAAS,GAAG,MAAM,GAAG,QAC7C,gBAAAE;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,MAAC,UAAK,WAAU,gEACd,0BAAAA,MAAuB,qCAAtB,EACC,0BAAAA,MAACF,QAAA,EAAM,WAAU,WAAU,GAC7B,GACF;AAAA,MACC;AAAA;AAAA;AACH,CACD;AACD,yBAAyB,cACD,mCAAa;AAErC,IAAM,wBAA8B,mBAGlC,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAG;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,MAAC,UAAK,WAAU,gEACd,0BAAAA,MAAuB,qCAAtB,EACC,0BAAAA,MAAC,UAAO,WAAU,wBAAuB,GAC3C,GACF;AAAA,MACC;AAAA;AAAA;AACH,CACD;AACD,sBAAsB,cAAoC,gCAAU;AAEpE,IAAM,oBAA0B,mBAK9B,CAAC,EAAE,WAAW,OAAO,GAAG,MAAM,GAAG,QACjC,gBAAAA;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,kBAAkB,cAAoC,4BAAM;AAE5D,IAAM,wBAA8B,mBAGlC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAuB;AAAA,EAAtB;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA;AACN,CACD;AACD,sBAAsB,cAAoC,gCAAU;AAEpE,IAAM,uBAAuB,CAAC;AAAA,EAC5B;AAAA,EACA,GAAG;AACL,MAA6C;AAC3C,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD,KAAG,8CAA8C,SAAS;AAAA,MACpE,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,qBAAqB,cAAc;;;ACnLnC,YAAYG,aAAW;AAEvB,SAAS,MAAAC,YAAU;AAKb,gBAAAC,aAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACtC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAWD;AAAA;AAAA;AAAA;AAAA,UAIT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;AAKb,SAAS,WAAW;AAAA,EACzB;AACF,GAE8B;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,gBAAAE,MAAC,OAAE,WAAU,iCAAiC,iBAAM;AAC7D;;;ACzBA,YAAYC,aAAW;AACvB,SAAS,YAAY,oBAAoB;AACzC;AAAA,EACE,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,aAAAC,kBAAiB;;;ACrB1B,YAAYC,aAAW;AACvB,YAAY,sBAAsB;AAElC,SAAS,MAAAC,YAAU;AAWf,gBAAAC,aAAA;AATJ,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,mBAG3B,CAAC,EAAE,WAAW,QAAQ,UAAU,aAAa,GAAG,GAAG,MAAM,GAAG,QAC5D,gBAAAA,MAAkB,yBAAjB,EACC,0BAAAA;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,GACF,CACD;AACD,eAAe,cAA+B,yBAAQ;;;AClBtD,YAAYE,aAAW;AACvB,SAAS,aAAa,gBAAAC,qBAAoB;AAC1C;AAAA,EACE,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,iBAAiB;AA6EtB,mBAGM,OAAAC,OAHN,QAAAC,aAAA;AAxEJ,IAAM,gBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AACP;AAkBA,SAAS,QAAQ,GAAS,GAAkB;AAC1C,SACE,EAAE,QAAQ,MAAM,EAAE,QAAQ,KAC1B,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,YAAY,MAAM,EAAE,YAAY;AAEtC;AAEA,SAAS,UAAU,OAAe,QAAwB;AAExD,SAAO,IAAI,KAAK,KAAM,OAAO,CAAC,EAAE,mBAAmB,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC9E;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KAAK,MAAM,OAAO,EAAE,IAAI;AACjC;AAIA,SAAS,cAAc,UAAgB,UAAsC;AAC3E,QAAM,OAAO,SAAS,YAAY;AAClC,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,UAAU,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO;AAChD,QAAM,iBAAiB,UAAU,WAAW,KAAK;AACjD,QAAM,cAAc,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AAEzD,QAAM,QAA4B,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,eAAe,IAAK,OAAM,KAAK,IAAI;AACvD,WAAS,MAAM,GAAG,OAAO,aAAa;AACpC,UAAM,KAAK,IAAI,KAAK,MAAM,OAAO,GAAG,CAAC;AACvC,SAAO;AACT;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKuB;AACrB,QAAM,WAAW,kBAAkB,MAAM;AACzC,QAAM,QAAQ,cAAc,UAAU,QAAQ;AAC9C,QAAM,gBAAgB,iBAAiB,MAAM;AAC7C,QAAM,QAAQ,oBAAI,KAAK;AAEvB,SACE,gBAAAA,MAAA,YACE;AAAA,oBAAAD,MAAC,SAAI,WAAU,+BACZ,wBAAc,IAAI,CAAC,UAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAET;AAAA;AAAA,MAHI;AAAA,IAIP,CACD,GACH;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,0BACZ,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAI,CAAC,KAAM,QAAO,gBAAAA,MAAC,SAA2B,WAAU,aAA5B,SAAS,KAAK,EAAwB;AAClE,YAAM,aAAa,QAAQ,QAAQ,MAAM,KAAK,IAAI;AAClD,YAAM,UAAU,QAAQ,MAAM,KAAK;AACnC,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAAS,MAAM,SAAS,IAAI;AAAA,UAC5B,WAAWD;AAAA,YACT;AAAA,YACA,WAAW,CAAC,cAAc;AAAA,YAC1B,aACI,uCACA;AAAA,UACN;AAAA,UAEC,eAAK,QAAQ;AAAA;AAAA,QAXT,KAAK,YAAY;AAAA,MAYxB;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKuB;AACrB,QAAM,MAAM,oBAAI,KAAK;AACrB,SACE,gBAAAC,MAAC,SAAI,WAAU,0BACZ,gBAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,UAAU;AACxC,UAAM,YACJ,UAAU,IAAI,SAAS,KACvB,SAAS,YAAY,MAAM,IAAI,YAAY;AAC7C,UAAM,aACJ,CAAC,CAAC,SACF,UAAU,MAAM,SAAS,KACzB,SAAS,YAAY,MAAM,MAAM,YAAY;AAC/C,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAM,OAAO,KAAK;AAAA,QAC3B,WAAWD;AAAA,UACT;AAAA,UACA,aAAa,CAAC,cAAc;AAAA,UAC5B,aACI,uCACA;AAAA,QACN;AAAA,QAEC,oBAAU,OAAO,MAAM;AAAA;AAAA,MAXnB;AAAA,IAYP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,QAAQ,YAAY,SAAS,YAAY,CAAC;AAChD,SACE,gBAAAC,MAAC,SAAI,WAAU,0BACZ,gBAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AACpC,UAAM,OAAO,QAAQ;AACrB,UAAM,aAAa,CAAC,CAAC,SAAS,SAAS,MAAM,YAAY;AACzD,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAM,OAAO,IAAI;AAAA,QAC1B,WAAWD;AAAA,UACT;AAAA,UACA,SAAS,OAAO,CAAC,cAAc;AAAA,UAC/B,aACI,uCACA;AAAA,QACN;AAAA,QAEC;AAAA;AAAA,MAXI;AAAA,IAYP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,WACP,MACA,UACA,QACQ;AACR,MAAI,SAAS,SAAU,QAAO,SAAS,YAAY,EAAE,SAAS;AAC9D,MAAI,SAAS,SAAS;AACpB,UAAM,QAAQ,YAAY,SAAS,YAAY,CAAC;AAChD,WAAO,GAAG,KAAK,MAAM,QAAQ,CAAC;AAAA,EAChC;AACA,SAAO,GAAG,UAAU,SAAS,SAAS,GAAG,MAAM,CAAC,IAAI,SAAS,YAAY,CAAC;AAC5E;AAGA,SAAS,cACP,MACA,UACA,WACM;AACN,MAAI,SAAS,UAAU;AACrB,WAAO,IAAI,KAAK,SAAS,YAAY,IAAI,WAAW,SAAS,SAAS,GAAG,CAAC;AAAA,EAC5E;AACA,MAAI,SAAS,SAAS;AACpB,WAAO,IAAI,KAAK,YAAY,SAAS,YAAY,CAAC,IAAI,YAAY,IAAI,GAAG,CAAC;AAAA,EAC5E;AACA,SAAO,IAAI,KAAK,SAAS,YAAY,GAAG,SAAS,SAAS,IAAI,WAAW,CAAC;AAC5E;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAsC;AACpC,QAAM,iBAAiB,UAAU,MAAM;AACvC,QAAM,eAAe,cAAc,SAAS;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAuB,YAAY;AACjE,QAAM,CAAC,UAAU,WAAW,IAAU;AAAA,IACpC,SAAS,mBAAmB,oBAAI,KAAK;AAAA,EACvC;AAEA,EAAM,kBAAU,MAAM;AACpB,QAAI,MAAO,aAAY,KAAK;AAAA,EAC9B,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,kBAAkB,CAAC,UAAwB;AAC/C,UAAM,OAAO,IAAI,KAAK,SAAS,YAAY,GAAG,OAAO,CAAC;AACtD,QAAI,cAAc,SAAS;AACzB,eAAS,IAAI;AACb;AAAA,IACF;AACA,gBAAY,IAAI;AAChB,YAAQ,MAAM;AAAA,EAChB;AAEA,QAAM,iBAAiB,CAAC,SAAuB;AAC7C,UAAM,OAAO,IAAI,KAAK,MAAM,SAAS,SAAS,GAAG,CAAC;AAClD,QAAI,cAAc,QAAQ;AACxB,eAAS,IAAI;AACb;AAAA,IACF;AACA,gBAAY,IAAI;AAChB,YAAQ,QAAQ;AAAA,EAClB;AAKA,QAAM,aAAa,SAAS;AAC5B,QAAM,UAAU,MAAY,QAAQ,SAAS,SAAS,WAAW,OAAO;AAExE,SACE,gBAAAE,MAAC,SAAI,WAAU,QACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,YAAY,cAAc,MAAM,UAAU,EAAE,CAAC;AAAA,UAC5D,WAAU;AAAA,UACV,cAAW;AAAA,UAEX,0BAAAA,MAAC,eAAY,MAAM,IAAI;AAAA;AAAA,MACzB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,aAAa,UAAU;AAAA,UAChC,UAAU,CAAC;AAAA,UACX,WAAWD;AAAA,YACT;AAAA,YACA,cAAc;AAAA,UAChB;AAAA,UAEC,qBAAW,MAAM,UAAU,cAAc;AAAA;AAAA,MAC5C;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,YAAY,cAAc,MAAM,UAAU,CAAC,CAAC;AAAA,UAC3D,WAAU;AAAA,UACV,cAAW;AAAA,UAEX,0BAAAA,MAACF,eAAA,EAAa,MAAM,IAAI;AAAA;AAAA,MAC1B;AAAA,OACF;AAAA,IAEC,SAAS,UACR,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA;AAAA,IACV;AAAA,IAED,SAAS,YACR,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA;AAAA,IACV;AAAA,IAED,SAAS,WACR,gBAAAA,MAAC,aAAU,UAAoB,OAAc,QAAQ,gBAAgB;AAAA,KAEzE;AAEJ;;;AF9NQ,gBAAAE,OAyBA,QAAAC,aAzBA;AArED,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,iBAAiBC,WAAU,MAAM;AACvC,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,EAAE;AACrD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,EAAE;AAErD,QAAM,MAAY;AAAA,IAChB,MACE,kBAAkB;AAAA,MAChB,QAAQ,oBAAoB,gBAAgB,SAAS;AAAA,IACvD,CAAC;AAAA,IACH,CAAC,gBAAgB,SAAS;AAAA,EAC5B;AAEA,QAAM,eAAqB,gBAAQ,MAAM,aAAa,KAAK,GAAG,CAAC,KAAK,CAAC;AAGrE,EAAM,kBAAU,MAAM;AACpB,kBAAc,eAAe,gBAAgB,cAAc,GAAG,IAAI,EAAE;AACpE,kBAAc,EAAE;AAAA,EAClB,GAAG,CAAC,cAAc,GAAG,CAAC;AAEtB,QAAM,SAAS,CAAC,SAA4B;AAC1C,aAAS,OAAO,cAAc,MAAM,SAAS,IAAI,EAAE;AAAA,EACrD;AAEA,QAAM,aAAa,MAAY;AAC7B,QAAI,CAAC,WAAW,KAAK,GAAG;AACtB,oBAAc,EAAE;AAChB,aAAO,IAAI;AACX,eAAS;AACT;AAAA,IACF;AACA,UAAM,SAAS,UAAU,YAAY,GAAG;AACxC,QAAI,OAAO,MAAM;AACf,oBAAc,OAAO,KAAK;AAC1B,oBAAc,EAAE;AAChB,aAAO,OAAO,IAAI;AAAA,IACpB,OAAO;AACL,oBAAc,OAAO,SAAS,cAAc;AAAA,IAC9C;AACA,aAAS;AAAA,EACX;AAEA,QAAM,uBAAuB,CAAC,SAAqB;AACjD,kBAAc,gBAAgB,MAAM,GAAG,CAAC;AACxC,kBAAc,EAAE;AAChB,WAAO,IAAI;AACX,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,aAAa,SAAS;AAE5B,SACE,gBAAAD,MAAC,SAAI,WAAWE,KAAG,YAAY,SAAS,GACtC;AAAA,oBAAAF,MAAC,SAAI,WAAU,YACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,UAAU;AACnB,0BAAc,MAAM,cAAc,KAAK;AACvC,0BAAc,EAAE;AAAA,UAClB;AAAA,UACA,QAAQ;AAAA,UACR,WAAW,CAAC,UAAU;AACpB,gBAAI,MAAM,QAAQ,SAAS;AACzB,yBAAW;AACX,sBAAQ,KAAK;AAAA,YACf,WAAW,MAAM,QAAQ,UAAU;AACjC,sBAAQ,KAAK;AAAA,YACf;AAAA,UACF;AAAA,UACA,aAAa,eAAe,IAAI;AAAA,UAChC;AAAA,UACA;AAAA,UACA,cAAa;AAAA,UACb,gBAAc,aAAa,OAAO;AAAA,UAClC,WAAWG,KAAG,SAAS,cAAc,oBAAoB;AAAA;AAAA,MAC3D;AAAA,MACA,gBAAAF,MAAC,WAAQ,MAAY,cAAc,SACjC;AAAA,wBAAAD,MAAC,kBAAe,SAAO,MACrB,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,0BAAAA,MAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,QAC1B,GACF;AAAA,QACA,gBAAAA,MAAC,kBAAe,OAAM,OAAM,WAAU,cACpC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV;AAAA,YACA,QAAQ;AAAA;AAAA,QACV,GACF;AAAA,SACF;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,cAAW,OAAO,YAAY;AAAA,KACjC;AAEJ;;;AGxJA,YAAYI,aAAW;AACvB,SAAS,aAAa;AACtB;AAAA,EACE,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAuED,SACE,OAAAC,OADF,QAAAC,aAAA;AAnDC,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,EAAE;AACrD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,EAAE;AAErD,QAAM,aAAmB;AAAA,IACvB,MAAM,cAAc,OAAO,WAAW;AAAA,IACtC,CAAC,OAAO,WAAW;AAAA,EACrB;AAGA,EAAM,kBAAU,MAAM;AACpB,kBAAc,UAAU;AACxB,kBAAc,EAAE;AAAA,EAClB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,aAAa,MAAY;AAC7B,QAAI,CAAC,WAAW,KAAK,GAAG;AACtB,oBAAc,EAAE;AAChB,eAAS,EAAE;AACX,eAAS;AACT;AAAA,IACF;AACA,UAAM,SAAS,UAAU,YAAY,WAAW;AAChD,QAAI,OAAO,OAAO;AAChB,oBAAc,OAAO,KAAK;AAC1B,oBAAc,EAAE;AAChB,eAAS,OAAO,KAAK;AAAA,IACvB,OAAO;AACL,oBAAc,OAAO,SAAS,cAAc;AAAA,IAC9C;AACA,aAAS;AAAA,EACX;AAEA,QAAM,aAAa,SAAS;AAC5B,QAAM,kBACJ,gBAAgB,gBAAgB,WAAW,aAAa;AAE1D,SACE,gBAAAA,MAAC,SAAI,WAAWC,KAAG,YAAY,SAAS,GACtC;AAAA,oBAAAD,MAAC,SAAI,WAAU,YACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU,CAAC,UAAU;AACnB,0BAAc,MAAM,cAAc,KAAK;AACvC,0BAAc,EAAE;AAAA,UAClB;AAAA,UACA,QAAQ;AAAA,UACR,WAAW,CAAC,UAAU;AACpB,gBAAI,MAAM,QAAQ,QAAS,YAAW;AAAA,UACxC;AAAA,UACA,aAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA,cAAa;AAAA,UACb,gBAAc,aAAa,OAAO;AAAA,UAClC,WAAWE,KAAG,SAAS,cAAc,oBAAoB;AAAA;AAAA,MAC3D;AAAA,MACA,gBAAAF,MAAC,UAAK,WAAU,+FACd,0BAAAA,MAAC,SAAM,MAAM,IAAI,GACnB;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,cAAW,OAAO,YAAY;AAAA,KACjC;AAEJ;;;ACtGA,YAAYG,aAAW;AACvB;AAAA,EACE,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,OAEK;AAyDD,SAEI,OAAAC,OAFJ,QAAAC,aAAA;AA/BC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AACzC,QAAM,EAAE,MAAM,KAAK,IAAU,gBAAQ,MAAM,cAAc,KAAK,GAAG,CAAC,KAAK,CAAC;AAExE,QAAM,mBAAmB,CAAC,aAA2B;AACnD,aAAS,aAAa,UAAU,IAAI,CAAC;AAAA,EACvC;AAEA,QAAM,mBAAmB,CAAC,aAA2B;AACnD,QAAI,CAAC,UAAU;AACb,eAAS,OAAO,aAAa,MAAM,EAAE,IAAI,EAAE;AAC3C;AAAA,IACF;AAGA,aAAS,aAAa,QAAQC,eAAc,oBAAI,KAAK,CAAC,GAAG,QAAQ,CAAC;AAAA,EACpE;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAWE,KAAG,aAAa,SAAS,GACvC;AAAA,oBAAAF,MAAC,SAAI,WAAU,cACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,UACb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,WAAW,GAAG,QAAQ,UAAU;AAAA,UACpC,OAAO;AAAA,UACP,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF,GACF;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,QACb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,WAAW,GAAG,QAAQ,UAAU;AAAA,UACpC,OAAO;AAAA,UACP,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,IACC,YACC,gBAAAC,MAAC,OAAE,WAAU,oCAAmC;AAAA;AAAA,MAAU;AAAA,OAAS;AAAA,KAEvE;AAEJ;;;AC7GA,YAAYG,aAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAAC,QAAO,aAAa,iBAAiB;AAE9C,SAAS,MAAAC,YAAU;AAUjB,SAUI,OAAAC,OAVJ,QAAAC,aAAA;AARF,IAAM,SAAyB;AAC/B,IAAM,cAA8B;AACpC,IAAM,cAA8B;AAEpC,IAAM,gBAAsB,mBAG1B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEH;AAAA;AAAA,MACD,gBAAAC,MAAiB,sBAAhB,EAAqB,SAAO,MAC3B,0BAAAA,MAAC,eAAY,WAAU,sBAAqB,GAC9C;AAAA;AAAA;AACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,uBAA6B,mBAGjC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAC,MAAC,aAAU,WAAU,WAAU;AAAA;AACjC,CACD;AACD,qBAAqB,cAA8B,+BAAe;AAElE,IAAM,yBAA+B,mBAGnC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAC,MAAC,eAAY,WAAU,WAAU;AAAA;AACnC,CACD;AACD,uBAAuB,cACL,iCAAiB;AAEnC,IAAM,gBAAsB,mBAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,MAAM,GAAG,QACzD,gBAAAA,MAAiB,wBAAhB,EACC,0BAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA,aAAa,YACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,MAAC,wBAAqB;AAAA,MACtB,gBAAAA;AAAA,QAAiB;AAAA,QAAhB;AAAA,UACC,WAAWD;AAAA,YACT;AAAA,YACA,aAAa,YACX;AAAA,UACJ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA,gBAAAC,MAAC,0BAAuB;AAAA;AAAA;AAC1B,GACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,cAAoB,mBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,aAAmB,mBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAE;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWF;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,MAAC,UAAK,WAAU,gEACd,0BAAAA,MAAiB,+BAAhB,EACC,0BAAAA,MAACF,QAAA,EAAM,WAAU,WAAU,GAC7B,GACF;AAAA,MACA,gBAAAE,MAAiB,0BAAhB,EAA0B,UAAS;AAAA;AAAA;AACtC,CACD;AACD,WAAW,cAA8B,qBAAK;AAE9C,IAAM,kBAAwB,mBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAA8B,0BAAU;;;AC5IxD,SAAS,OAAAG,YAA8B;AAEvC,SAAS,MAAAC,YAAU;;;ACHnB,YAAYC,aAAW;AAEvB,SAAS,MAAAC,YAAU;AAOf,gBAAAC,aAAA;AALJ,IAAM,WAAiB,mBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA;AAAA,QAET;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AACD,SAAS,cAAc;;;ADVnB,gBAAAE,aAAA;AAFJ,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAWC;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAGA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAGA;AAAA;AAAA,QAGA;AAAA,QAEA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,0BAA0BC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,gBACE;AAAA,QACF,cACE;AAAA,QACF,eACE;AAAA,QACF,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACL,GAA+E;AAC7E,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAWC,KAAG,wBAAwB,EAAE,MAAM,CAAC,GAAG,SAAS;AAAA,MAC3D,SAAS,CAAC,MAAM;AACd,YAAK,EAAE,OAAuB,QAAQ,QAAQ,GAAG;AAC/C;AAAA,QACF;AACA,UAAE,cAAc,eAAe,cAAc,OAAO,GAAG,MAAM;AAAA,MAC/D;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,2BAA2BC;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,WACE;AAAA,QACF,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,GAAG;AACL,GACiD;AAC/C,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAW;AAAA,MACX;AAAA,MACA,WAAWC,KAAG,yBAAyB,EAAE,KAAK,CAAC,GAAG,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC7E,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,GAAG;AACL,GAAkC;AAChC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAAqC;AACnC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AE9JA,YAAYE,aAAW;AACvB,YAAY,oBAAoB;AAChC,SAAS,OAAAC,YAA8B;AAEvC,SAAS,MAAAC,YAAU;AAWjB,gBAAAC,aAAA;AATF,IAAM,gBAAgBF;AAAA,EACpB;AACF;AAEA,IAAMG,SAAc,mBAIlB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAD;AAAA,EAAgB;AAAA,EAAf;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,cAAc,GAAG,SAAS;AAAA,IACvC,GAAG;AAAA;AACN,CACD;AACDE,OAAM,cAA6B,oBAAK;;;ACrBxC,YAAYC,aAAW;AACvB,YAAY,yBAAyB;AAErC,SAAS,MAAAC,YAAU;AAMjB,SAKE,OAAAC,OALF,QAAAC,cAAA;AAJF,IAAM,aAAmB,mBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAA;AAAA,EAAqB;AAAA,EAApB;AAAA,IACC;AAAA,IACA,WAAWF,KAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA,IAEJ;AAAA,sBAAAC,MAAqB,8BAApB,EAA6B,WAAU,mCACrC,UACH;AAAA,MACA,gBAAAA,MAAC,aAAU;AAAA,MACX,gBAAAA,MAAqB,4BAApB,EAA2B;AAAA;AAAA;AAC9B,CACD;AACD,WAAW,cAAkC,yBAAK;AAElD,IAAM,YAAkB,mBAGtB,CAAC,EAAE,WAAW,cAAc,YAAY,GAAG,MAAM,GAAG,QACpD,gBAAAA;AAAA,EAAqB;AAAA,EAApB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA,gBAAgB,cACd;AAAA,MACF,gBAAgB,gBACd;AAAA,MACF;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAC,MAAqB,qCAApB,EAAoC,WAAU,0CAAyC;AAAA;AAC1F,CACD;AACD,UAAU,cAAkC,wCAAoB;;;AC3ChE,YAAYE,aAAW;AACvB,YAAY,wBAAwB;AAEpC,SAAS,MAAAC,YAAU;AAUf,gBAAAC,aAAA;AARJ,IAAMC,aAAkB;AAAA,EAItB,CACE,EAAE,WAAW,cAAc,cAAc,aAAa,MAAM,GAAG,MAAM,GACrE,QAEA,gBAAAD;AAAA,IAAoB;AAAA,IAAnB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAWD;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,mBAAmB;AAAA,QAClD;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACAE,WAAU,cAAiC,wBAAK;;;AC1BhD,YAAYC,aAAW;AAEvB,SAAS,MAAAC,YAAU;AA4DX,gBAAAC,aAAA;AAvBD,IAAM,eAAqB;AAAA,EAChC,CACE,EAAE,cAAc,YAAY,aAAa,IAAI,WAAW,OAAO,GAAG,MAAM,GACxE,QACG;AACH,UAAM,aAAa,gBAAgB;AACnC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,oBAAkB;AAAA,QAClB,WAAWD;AAAA,UACT;AAAA,UACA;AAAA,UACA,aACI,+BACA;AAAA,UACJ;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QAGJ,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OACE,aACI,EAAE,OAAO,GAAG,QAAQ,WAAW,IAC/B,EAAE,QAAQ,GAAG,OAAO,WAAW;AAAA;AAAA,QAEvC;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,aAAa,cAAc;;;AClE3B,YAAYC,aAAW;AACvB,YAAYC,sBAAqB;AACjC,SAAS,KAAAC,UAAS;AAClB,SAAS,MAAAC,YAAU;AAWjB,gBAAAC,OAwCM,QAAAC,cAxCN;AATF,IAAM,QAAwB;AAC9B,IAAM,eAA+B;AACrC,IAAM,aAA6B;AACnC,IAAM,cAA8B;AAEpC,IAAM,eAAqB,mBAGzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAD;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,aAAa,cAAc;AAE3B,IAAM,eAAqB;AAAA,EAQzB,CACE,EAAE,WAAW,UAAU,OAAO,SAAS,YAAY,OAAO,OAAO,GAAG,MAAM,GAC1E,QAEA,gBAAAE,OAAC,eACC;AAAA,oBAAAD,MAAC,gBAAa;AAAA,IACd,gBAAAC;AAAA,MAAiB;AAAA,MAAhB;AAAA,QACC;AAAA,QACA,WAAWF;AAAA,UACT;AAAA,UACA;AAAA,UACA,SAAS,WACP;AAAA,UACF,SAAS,UACP;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO,EAAE,KAAK,WAAW,GAAG,MAAM;AAAA,QACjC,GAAG;AAAA,QAEH;AAAA;AAAA,UACD,gBAAAE,OAAiB,wBAAhB,EAAsB,WAAU,gLAC/B;AAAA,4BAAAD,MAACF,IAAA,EAAE,WAAU,WAAU;AAAA,YACvB,gBAAAE,MAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACjC;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AACA,aAAa,cAAc;AAE3B,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,GAAG;AACL,MACE,gBAAAA,MAAC,SAAI,WAAWD,KAAG,+BAA+B,SAAS,GAAI,GAAG,OAAO;AAG3E,IAAM,aAAmB,mBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,yBAAyB,SAAS;AAAA,IAC/C,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;AAEzB,IAAM,mBAAyB,mBAG7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAWD,KAAG,sCAAsC,SAAS;AAAA,IAC5D,GAAG;AAAA;AACN,CACD;AACD,iBAAiB,cAAc;AAE/B,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA,GAAG;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC,WAAWD,KAAG,oCAAoC,SAAS;AAAA,IAC1D,GAAG;AAAA;AACN;AAGF,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,GAAG;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;;;AC1HF,SAAS,MAAAG,YAAU;AA+Ff,gBAAAC,aAAA;AA7FJ,IAAM,SAAS;AAAA,EACb,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AACN;AAEA,IAAM,WAAW;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,aAAa;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,UAAU;AAAA,EACd,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAClB;AAEA,IAAM,QAAgC;AAAA,EACpC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AA2BO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,WAAW,OAAO,GAAG,KAAK,OAAO;AACvC,QAAM,aAAa,QAAQ,SAAS,KAAK,IAAI;AAC7C,QAAM,eAAe,UAAU,WAAW,OAAO,IAAI;AACrD,QAAM,YAAY,OAAO,QAAQ,IAAI,IAAI;AACzC,QAAM,YAAY,OAAO,iBAAiB;AAC1C,QAAM,UAAU,KAAK,MAAM,EAAE,IAAI;AAEjC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AChHA,SAAS,MAAAE,YAAU;AAwEf,gBAAAC,aAAA;AAtEJ,IAAMC,UAAS;AAAA,EACb,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AACN;AAEA,IAAMC,YAAW;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AACX;AAEA,IAAMC,cAAa;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AACV;AAwBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,WAAWF,QAAO,GAAG,KAAKA,QAAO;AACvC,QAAM,aAAa,QAAQC,UAAS,KAAK,IAAI;AAC7C,QAAM,eAAe,UAAUC,YAAW,OAAO,IAAI;AAErD,QAAM,cACJ,MAAM,SACF,EAAE,QAAQ,OAAO,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,IAC/C;AAEN,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,GAAG,aAAa,GAAG,MAAM;AAAA,MAEjC;AAAA;AAAA,EACH;AAEJ;;;ACtFA,SAAS,MAAAK,YAAU;AAOf,gBAAAC,aAAA;AALJ,SAAS,SAAS;AAAA,EAChB;AAAA,EACA,GAAG;AACL,GAAyC;AACvC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD,KAAG,qCAAqC,SAAS;AAAA,MAC3D,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACZA,SAAS,MAAAE,YAAU;AAmCb,gBAAAC,aAAA;AA5BN,IAAM,cAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAcO,SAAS,QAAQ,EAAE,WAAW,OAAO,KAAK,GAAiB;AAChE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD;AAAA,QACT;AAAA,QACA,YAAY,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MAEL,0BAAAC,MAAC,UAAK,WAAU,yGAAwG,wBAExH;AAAA;AAAA,EACF;AAEJ;;;ACxCA,YAAYC,aAAW;AACvB,YAAY,mBAAmB;AAE/B,SAAS,MAAAC,YAAU;AAsBf,gBAAAC,aAAA;AApBJ,IAAM,OAAqB;AAQ3B,IAAM,WAAiB,mBAGrB,CAAC,EAAE,WAAW,QAAQ,SAAS,GAAG,MAAM,GAAG,QAAQ;AACnD,QAAM,aACJ,UAAU,WACN,mBACA,UAAU,QACR,gBACA;AAER,SACE,gBAAAA;AAAA,IAAe;AAAA,IAAd;AAAA,MACC;AAAA,MACA,WAAWD;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AACD,SAAS,cAA4B,mBAAK;AAE1C,IAAM,cAAoB,mBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAe;AAAA,EAAd;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA4B,sBAAQ;AAEhD,IAAM,cAAoB,mBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAe;AAAA,EAAd;AAAA,IACC;AAAA,IACA,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA4B,sBAAQ;AAOhD,IAAM,gBAAsB,mBAG1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,oBAAiB;AAAA,IACjB,WAAWD;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAc,cAAc;;;ACvF5B,SAAS,SAAAE,cAAa;AACtB;AAAA,EACE,aAAa;AAAA,EACb,QAAQ;AAAA,OACH;AACP,YAAYC,aAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,MAAAC,YAAU;;;ACTnB,YAAYC,aAAW;;;ACAvB,YAAYC,aAAW;AAEvB,IAAM,4BACJ,OAAO,WAAW,cAAoB,0BAAwB;;;ADChE,SAAS,SAAY,OAAU;AAC7B,QAAM,MAAY,eAAU,KAAK;AAEjC,4BAA0B,MAAM;AAC9B,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AACT;;;AEZA,YAAYC,aAAW;AAEvB,SAAS,WAAc,IAAa;AAClC,QAAM,MAAY,eAAiB,IAAI;AAEvC,MAAI,IAAI,YAAY,MAAM;AACxB,QAAI,UAAU,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;;;AHwcQ,gBAAAC,aAAA;AApcR,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,IAAM,cAAc;AACpB,IAAM,gBAAgB,EAAE,SAAS,OAAO,YAAY,KAAK;AACzD,IAAM,aAAa,CAAC,WAAW,aAAa,aAAa,YAAY;AAkBrE,SAAS,MACP,IACA,SACA,OACA;AACA,SAAO,GAAG,EAAE,IAAI,OAAO,IAAI,KAAK;AAClC;AAIA,IAAM,0BAAuD;AAAA,EAC3D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AACP;AAEA,SAAS,qBAAqB,KAAa,KAAiB;AAC1D,MAAI,QAAQ,MAAO,QAAO;AAC1B,SAAO,QAAQ,cACX,eACA,QAAQ,eACN,cACA;AACR;AAEA,SAAS,eACP,OACA,KACA,aACA;AACA,QAAM,MAAM,qBAAqB,MAAM,KAAK,GAAG;AAC/C,MAAI,gBAAgB,gBAAgB,CAAC,WAAW,WAAW,EAAE,SAAS,GAAG;AACvE,WAAO;AACT,MAAI,gBAAgB,cAAc,CAAC,aAAa,YAAY,EAAE,SAAS,GAAG;AACxE,WAAO;AACT,SAAO,wBAAwB,GAAG;AACpC;AAEA,SAAS,WACP,YACA,gBAAgB,OAChB;AACA,QAAM,6BAA6B,SAAS;AAC5C,aAAW,gBAAgB,YAAY;AACrC,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAChB,QAAI,cAAc,2BAA4B;AAC9C,cAAU,MAAM,EAAE,cAAc,CAAC;AACjC,QAAI,SAAS,kBAAkB,2BAA4B;AAAA,EAC7D;AACF;AAEA,SAAS,UAAa,OAAY,YAAoB;AACpD,SAAO,MAAM;AAAA,IACX,CAAC,GAAG,UAAU,OAAO,aAAa,SAAS,MAAM,MAAM;AAAA,EACzD;AACF;AAMA,SAAS,qBACP,OACA,gBACA,gBACA,YACA,YACS;AACT,MAAI,MAAM,QAAQ,WAAW,gBAAgB;AAC3C,UAAM,eAAe;AACrB,WAAO;AAAA,EACT;AAEA,OACG,MAAM,QAAQ,WAAW,MAAM,QAAQ,QACxC,mBAAmB,YACnB,CAAC,gBACD;AACA,UAAM,eAAe;AACrB,QAAI,CAAC,cAAc,WAAW,SAAS;AACrC,iBAAW,QAAQ,MAAM;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAqC;AAC3D,SAAO,MAAM,WAAW,MAAM,WAAW,MAAM,UAAU,MAAM;AACjE;AAKA,SAAS,uBACP,OACA,aACA,eACA,MAC0C;AAC1C,MAAI,gBAAgB,MAAM,IAAI,CAAC,SAAS,KAAK,GAAG;AAEhD,MAAI,gBAAgB,QAAQ;AAC1B,kBAAc,QAAQ;AAAA,EACxB,WAAW,gBAAgB,UAAU,gBAAgB,QAAQ;AAC3D,QAAI,gBAAgB,OAAQ,eAAc,QAAQ;AAClD,UAAM,eAAe,cAAc;AAAA,MACjC,CAAC,QAAQ,IAAI,YAAY;AAAA,IAC3B;AACA,oBAAgB,OACZ,UAAU,eAAe,eAAe,CAAC,IACzC,cAAc,MAAM,eAAe,CAAC;AAAA,EAC1C;AAEA,SAAO;AACT;AAMA,eAAe,0BACb,OACA,eACA,OACA,WACA,OACA,OACkB;AAClB,MAAI,CAAC,MAAM,cAAc,KAAK,cAAc,WAAW,EAAG,QAAO;AAEjE,QAAM,UAAU,cAAc,CAAC;AAC/B,QAAM,cAAc,SAAS;AAC7B,QAAM,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,IAAI,YAAY,WAAW;AAEtE,MAAI,CAAC,YAAY,SAAS,UAAU,UAAW,QAAO;AAEtD,QAAM,mBAAmB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS,EAAE;AACrE,QAAM,kBAAkB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS,KAAK;AACvE,QAAM,YACJ,kBAAkB,mBAAmB,SAAS;AAEhD,MAAI,cAAc,QAAQ;AACxB,UAAM,UAAU,MAAM,MAAM;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,IACF;AACA,QAAI,CAAC,QAAS,QAAO;AAAA,EACvB,OAAO;AACL,UAAM,SAAS,SAAS,SAAS,KAAK;AAAA,EACxC;AAEA,iBAAe,MAAM,aAAa,MAAM,CAAC;AACzC,SAAO;AACT;AAEA,SAAS,aACP,OACA,WACA,WACA,OACA,UAAgC,QACrB;AACX,QAAM,WAAW,MAAM,KAAK,MAAM,KAAK,CAAC;AACxC,QAAM,eAAe,SAAS,QAAQ,SAAS;AAE/C,MAAI,WAAW,UAAW,QAAO;AAEjC,MAAI,UAAU,WAAW;AACvB,WAAO,YAAY,cAAc,aAAa;AAAA,EAChD;AAEA,MAAI,OAAO;AACT,UAAM,cAAc,SAAS,QAAQ,KAAK;AAE1C,QAAI,cAAc,aAAc,QAAO;AAAA,EACzC;AAEA,SAAO;AACT;AA4BA,IAAM,eAAqB,sBAA4B,IAAI;AAE3D,SAAS,gBAAgB,cAAsB;AAC7C,QAAM,UAAgB,mBAAW,YAAY;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,KAAK,YAAY,4BAA4B,SAAS,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,SAAY,UAAuC;AAC1D,QAAM,QAAQ,gBAAgB,UAAU;AAExC,QAAM,cAAoB;AAAA,IACxB,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,IAC/B,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,SAAa,6BAAqB,MAAM,WAAW,aAAa,WAAW;AAC7E;AAoBA,IAAM,iBAAuB,sBAA0C,IAAI;AAE3E,SAAS,kBAAkB,cAAsB;AAC/C,QAAM,UAAgB,mBAAW,cAAc;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,KAAK,YAAY,4BAA4B,SAAS,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAqBA,SAAS,QAAQ,OAAqB;AACpC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,eAAe,WAAW,MAAM,oBAAI,IAAgB,CAAC;AAC3D,QAAM,WAAW,WAAuB,OAAO;AAAA,IAC7C,OAAO,oBAAI,IAAI;AAAA,IACf,OAAO,SAAS,gBAAgB;AAAA,EAClC,EAAE;AAEF,QAAM,WAAW,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAc,gBAAe,MAAM;AACvC,WAAO;AAAA,MACL,WAAW,CAAC,OAAO;AACjB,qBAAa,QAAQ,IAAI,EAAE;AAC3B,eAAO,MAAM,aAAa,QAAQ,OAAO,EAAE;AAAA,MAC7C;AAAA,MACA,UAAU,MAAM,SAAS;AAAA,MACzB,UAAU,CAAC,KAAKC,WAAU;AACxB,YAAI,OAAO,GAAG,SAAS,QAAQ,GAAG,GAAGA,MAAK,EAAG;AAE7C,YAAI,QAAQ,WAAW,OAAOA,WAAU,UAAU;AAChD,mBAAS,QAAQ,QAAQA;AACzB,mBAAS,QAAQ,gBAAgBA,MAAK;AAAA,QACxC,OAAO;AACL,mBAAS,QAAQ,GAAG,IAAIA;AAAA,QAC1B;AAEA,cAAM,OAAO;AAAA,MACf;AAAA,MACA,wBAAwB,OAAOA,QAAO,cAAc;AAClD,YAAI,CAAC,SAAS,QAAQ,YAAY;AAChC,gBAAM,SAAS,SAASA,MAAK;AAC7B,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,UAAU,MAAM,SAAS,QAAQ,WAAWA,QAAO,SAAS;AAClE,cAAI,SAAS;AACX,kBAAM,SAAS,SAASA,MAAK;AAAA,UAC/B;AACA,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,eAAe,MAAM,CAAC,CAAC,SAAS,QAAQ;AAAA,MACxC,SAAS,CAACA,QAAO,WAAWC,cAAa;AACvC,cAAM,UAAqB,EAAE,OAAAD,QAAO,WAAW,UAAAC,UAAS;AACxD,cAAM,OAAO,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC3C,aAAK,IAAID,QAAO,OAAO;AACvB,iBAAS,QAAQ,QAAQ;AACzB,iBAAS,QAAQ,aAAaA,MAAK;AACnC,cAAM,OAAO;AAAA,MACf;AAAA,MACA,YAAY,CAACA,WAAU;AACrB,cAAM,OAAO,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC3C,aAAK,OAAOA,MAAK;AACjB,iBAAS,QAAQ,QAAQ;AACzB,iBAAS,QAAQ,gBAAgBA,MAAK;AACtC,cAAM,OAAO;AAAA,MACf;AAAA,MACA,SAAS,CAACA,QAAO,WAAWC,cAAa;AACvC,cAAM,OAAO,SAAS,QAAQ,MAAM,IAAID,MAAK;AAC7C,YAAI,MAAM;AACR,gBAAM,cAAyB,EAAE,GAAG,MAAM,WAAW,UAAAC,UAAS;AAC9D,gBAAM,OAAO,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC3C,eAAK,IAAID,QAAO,WAAW;AAC3B,mBAAS,QAAQ,QAAQ;AAEzB,cAAI,cAAc,KAAK,WAAW;AAChC,qBAAS,QAAQ,kBAAkBA,QAAO,SAAS;AAAA,UACrD;AAEA,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,MACA,QAAQ,MAAM;AACZ,mBAAW,MAAM,aAAa,SAAS;AACrC,aAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,QAAQ,CAAC;AAErC,4BAA0B,MAAM;AAC9B,QAAI,UAAU,QAAW;AACvB,YAAM,SAAS,SAAS,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,MAAM,mBAAmB,aAAa,OAAO;AAEnD,QAAM,aAAmB,cAAM;AAC/B,QAAM,SAAS,MAAM;AAErB,QAAM,eAAqB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,KAAK,aAAa,gBAAgB,UAAU,gBAAgB,IAAI;AAAA,EAC3E;AAEA,QAAM,gBAAgB,UAAU,cAAc,OAAO;AAErD,SACE,gBAAAD,MAAC,aAAa,UAAb,EAAsB,OAAO,OAC5B,0BAAAA,MAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,iBAAe,WAAW,KAAK;AAAA,MAC/B,oBAAkB;AAAA,MAClB,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA,MACJ,WAAWG;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,oBAAoB;AAAA,QACnD;AAAA,MACF;AAAA;AAAA,EACF,GACF,GACF;AAEJ;AAaA,IAAM,eAAqB,sBAAwC,IAAI;AAEvE,SAAS,gBAAgB,cAAsB;AAC7C,QAAM,UAAgB,mBAAW,YAAY;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,KAAK,YAAY;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAiB;AACpC,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAU,kBAAkB,SAAS;AAC3C,QAAM,cAAc,QAAQ;AAC5B,QAAM,eAAe,SAAS,CAAC,UAAU,MAAM,KAAK;AAEpD,QAAM,WAAW,SAAS;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AAED,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAwB,IAAI;AACpE,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,iBAAS,KAAK;AACpE,QAAM,CAAC,oBAAoB,qBAAqB,IAAU,iBAAS,CAAC;AACpE,QAAM,kBAAwB,eAAO,KAAK;AAC1C,QAAM,WAAiB,eAA8B,oBAAI,IAAI,CAAC;AAC9D,QAAM,UAAgB,eAAoB,IAAI;AAC9C,QAAM,cAAc,gBAAgB,KAAK,OAAO;AAEhD,QAAM,cAAoB,oBAAY,CAACC,eAAsB;AAC3D,iBAAaA,UAAS;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAuB,oBAAY,MAAM;AAC7C,wBAAoB,IAAI;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,QAAM,qBAA2B,oBAAY,MAAM;AACjD,0BAAsB,CAAC,cAAc,YAAY,CAAC;AAAA,EACpD,GAAG,CAAC,CAAC;AAEL,QAAM,wBAA8B,oBAAY,MAAM;AACpD,0BAAsB,CAAC,cAAc,YAAY,CAAC;AAAA,EACpD,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAuB,oBAAY,CAAC,SAAmB;AAC3D,aAAS,QAAQ,IAAI,KAAK,IAAI,IAAI;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAyB,oBAAY,CAAC,OAAe;AACzD,aAAS,QAAQ,OAAO,EAAE;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,WAAiB,oBAAY,MAAM;AACvC,WAAO,MAAM,KAAK,SAAS,QAAQ,OAAO,CAAC,EACxC,OAAO,CAAC,SAAS,KAAK,IAAI,OAAO,EACjC,KAAK,CAAC,GAAG,MAAM;AACd,YAAM,WAAW,EAAE,IAAI;AACvB,YAAM,WAAW,EAAE,IAAI;AACvB,UAAI,CAAC,YAAY,CAAC,SAAU,QAAO;AACnC,YAAM,WAAW,SAAS,wBAAwB,QAAQ;AAC1D,UAAI,WAAW,KAAK,6BAA6B;AAC/C,eAAO;AAAA,MACT;AACA,UAAI,WAAW,KAAK,6BAA6B;AAC/C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACL,GAAG,CAAC,CAAC;AAEL,QAAM,SAAe;AAAA,IACnB,CAAC,UAAyC;AACxC,eAAS,QAAQ,SAAS,KAAK;AAC/B,UAAI,MAAM,iBAAkB;AAE5B,0BAAoB,KAAK;AAAA,IAC3B;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,UAAgB;AAAA,IACpB,CAAC,UAAyC;AACxC,eAAS,QAAQ,UAAU,KAAK;AAChC,UAAI,MAAM,iBAAkB;AAE5B,YAAM,kBAAkB,CAAC,gBAAgB;AACzC,UACE,MAAM,WAAW,MAAM,iBACvB,mBACA,CAAC,kBACD;AACA,cAAM,kBAAkB,IAAI,YAAY,aAAa,aAAa;AAClE,cAAM,cAAc,cAAc,eAAe;AAEjD,YAAI,CAAC,gBAAgB,kBAAkB;AACrC,gBAAM,QAAQ,MAAM,KAAK,SAAS,QAAQ,OAAO,CAAC,EAAE;AAAA,YAClD,CAAC,SAAS,CAAC,KAAK;AAAA,UAClB;AACA,gBAAM,eAAe,eACjB,MAAM,KAAK,CAAC,SAAS,KAAK,UAAU,YAAY,IAChD;AACJ,gBAAM,aAAa,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM;AACnD,gBAAM,cAAc,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS;AAE9D,gBAAM,iBAAiB;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,EAAE,OAAO,OAAO;AAChB,gBAAM,gBAAgB,eAAe,IAAI,CAAC,SAAS,KAAK,GAAG;AAC3D,qBAAW,eAAe,KAAK;AAAA,QACjC;AAAA,MACF;AACA,sBAAgB,UAAU;AAAA,IAC5B;AAAA,IACA,CAAC,UAAU,kBAAkB,cAAc,SAAS;AAAA,EACtD;AAEA,QAAM,cAAoB;AAAA,IACxB,CAAC,UAAyC;AACxC,eAAS,QAAQ,cAAc,KAAK;AAEpC,UAAI,MAAM,iBAAkB;AAE5B,sBAAgB,UAAU;AAAA,IAC5B;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,oBAA0B;AAAA,IAC9B,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,cAAc,OAAO;AAErD,SACE,gBAAAJ,MAAC,aAAa,UAAb,EAAsB,OAAO,mBAC5B,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,oBAAkB;AAAA,MAClB,oBAAkB;AAAA,MAClB,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACb,UAAU,oBAAoB,uBAAuB,IAAI,KAAK;AAAA,MAC7D,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,WAAWG;AAAA,QACT;AAAA,QACA,gBAAgB,eACZ,0BACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;AAOA,IAAM,qBAA2B;AAAA,EAC/B;AACF;AAEA,SAAS,sBAAsB,cAAsB;AACnD,QAAM,UAAgB,mBAAW,kBAAkB;AACnD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,KAAK,YAAY,4BAA4B,SAAS,IAAI;AAAA,EAC5E;AACA,SAAO;AACT;AAQA,SAAS,YAAY,OAAyB;AAC5C,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAU,kBAAkB,SAAS;AAC3C,QAAM,QAAQ,gBAAgB,SAAS;AACvC,QAAM,cAAc,QAAQ;AAC5B,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,4BAA0B,MAAM;AAC9B,UAAM,QAAQ,WAAW,WAAW,QAAQ;AAE5C,WAAO,MAAM;AACX,YAAM,WAAW,SAAS;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,QAAQ,CAAC;AAEnC,4BAA0B,MAAM;AAC9B,UAAM,QAAQ,WAAW,WAAW,QAAQ;AAAA,EAC9C,GAAG,CAAC,WAAW,WAAW,QAAQ,CAAC;AAEnC,QAAM,YAAY,SAAS,CAAC,UAAU,MAAM,MAAM,IAAI,SAAS,CAAC;AAChE,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,YAAY,aAAa,OAAO,WAAW,WAAW,KAAK;AAEjE,QAAM,mBAAyB;AAAA,IAC7B,OAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,CAAC,WAAW,SAAS;AAAA,EACvB;AAEA,QAAM,gBAAgB,UAAU,cAAc,OAAO;AAErD,SACE,gBAAAH,MAAC,mBAAmB,UAAnB,EAA4B,OAAO,kBAClC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe,WAAW,WAAW,KAAK;AAAA,MAC1C,oBAAkB;AAAA,MAClB,cAAY;AAAA,MACZ,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,aAAa;AAAA,QAC5C;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;AAEA,SAAS,eAAe,OAAoB;AAC1C,QAAM;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAU,kBAAkB,YAAY;AAC9C,QAAM,cAAc,sBAAsB,YAAY;AACtD,QAAM,YAAY,YAAY;AAE9B,QAAM,QAAQ,gBAAgB,YAAY;AAC1C,QAAM,eAAe,gBAAgB,YAAY;AACjD,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,YAAY,SAAS,CAAC,UAAU,MAAM,MAAM,IAAI,SAAS,CAAC;AAEhE,QAAM,WAAW,SAAS;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,EACf,CAAC;AAED,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,cAAc,QAAQ;AAC5B,QAAM,OAAO,QAAQ;AAErB,QAAM,YAAY,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS;AAE5D,QAAM,eAAe,YAAY;AACjC,QAAM,YAAY,MAAM;AAExB,QAAM,YAAY,MAAM,QAAQ,QAAQ,WAAW,SAAS;AAC5D,QAAM,YAAY,MAAM,QAAQ,QAAQ,WAAW,SAAS;AAC5D,QAAM,UAAU,MAAM,QAAQ,QAAQ,SAAS,SAAS;AACxD,QAAM,gBAAgB,MAAM,QAAQ,QAAQ,eAAe,SAAS;AAEpE,QAAM,aAAa,YAAY,WAAW,YAAY,QAAQ;AAC9D,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAY,aAAa,cAAc;AAC7C,QAAM,YAAY,aAAa,OAAO,WAAW,WAAW,KAAK;AAEjE,QAAM,aAAmB,eAAuB,IAAI;AACpD,QAAM,cAAc,gBAAgB,KAAK,UAAU;AACnD,QAAM,uBAA6B,eAAO,KAAK;AAC/C,QAAM,kBAAwB,eAAO,KAAK;AAE1C,EAAM,kBAAU,MAAM;AACpB,aAASE,WAAU,OAAsB;AACvC,UAAI,WAAW,SAAS,MAAM,GAAG,GAAG;AAClC,6BAAqB,UAAU;AAAA,MACjC;AAAA,IACF;AACA,aAAS,UAAU;AACjB,2BAAqB,UAAU;AAAA,IACjC;AACA,aAAS,iBAAiB,WAAWA,UAAS;AAC9C,aAAS,iBAAiB,SAAS,OAAO;AAC1C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAWA,UAAS;AACjD,eAAS,oBAAoB,SAAS,OAAO;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,4BAA0B,MAAM;AAC9B,iBAAa,eAAe;AAAA,MAC1B,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU,CAAC,CAAC;AAAA,IACd,CAAC;AAED,QAAI,CAAC,YAAY;AACf,mBAAa,mBAAmB;AAAA,IAClC;AAEA,WAAO,MAAM;AACX,mBAAa,iBAAiB,SAAS;AACvC,UAAI,CAAC,YAAY;AACf,qBAAa,sBAAsB;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,WAAW,WAAW,WAAW,UAAU,CAAC;AAE9D,QAAM,UAAgB;AAAA,IACpB,OAAO,UAA4C;AACjD,eAAS,QAAQ,UAAU,KAAK;AAChC,UAAI,MAAM,iBAAkB;AAE5B,UAAI,CAAC,cAAc,CAAC,QAAQ,gBAAgB;AAC1C,cAAM,mBAAmB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS,EAAE;AACrE,cAAM,kBAAkB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS;AAClE,cAAM,YAAY,kBAAkB,mBAAmB,SAAS;AAEhE,cAAM,MAAM,uBAAuB,WAAW,SAAS;AAAA,MACzD;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAgB;AAAA,IACpB,OAAO,UAA4C;AACjD,eAAS,QAAQ,UAAU,KAAK;AAChC,UAAI,MAAM,iBAAkB;AAE5B,mBAAa,YAAY,SAAS;AAElC,YAAM,kBAAkB,CAAC,gBAAgB;AAEzC,UACE,CAAC,YACD,CAAC,cACD,mBAAmB,YACnB,CAAC,QAAQ,kBACT,iBACA;AACA,cAAM,mBAAmB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS,EAAE;AACrE,cAAM,kBAAkB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS;AAClE,cAAM,YAAY,kBAAkB,mBAAmB,SAAS;AAEhE,cAAM,MAAM,uBAAuB,WAAW,SAAS;AAAA,MACzD;AAEA,sBAAgB,UAAU;AAAA,IAC5B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAkB;AAAA,IACtB,OAAO,UAA+C;AACpD,eAAS,QAAQ,YAAY,KAAK;AAClC,UAAI,MAAM,iBAAkB;AAE5B,UACE;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA;AAEF,UAAI,MAAM,QAAQ,SAAS,MAAM,UAAU;AACzC,qBAAa,eAAe;AAC5B;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,MAAM,cAAe;AAE1C,YAAM,cAAc,eAAe,OAAO,QAAQ,KAAK,WAAW;AAElE,UAAI,gBAAgB,QAAW;AAC7B,YAAI,eAAe,KAAK,EAAG;AAC3B,cAAM,eAAe;AAErB,cAAM,QAAQ,aAAa,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;AACrE,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAEA,cAAM,cAAc,MAAM;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAa;AAEjB,uBAAe,MAAM,WAAW,aAAa,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAoB;AAAA,IACxB,CAAC,UAA4C;AAC3C,eAAS,QAAQ,cAAc,KAAK;AACpC,UAAI,MAAM,iBAAkB;AAE5B,sBAAgB,UAAU;AAE1B,UAAI,YAAY;AACd,cAAM,eAAe;AAAA,MACvB,OAAO;AACL,qBAAa,YAAY,SAAS;AAAA,MACpC;AAAA,IACF;AAAA,IACA,CAAC,cAAc,WAAW,YAAY,QAAQ;AAAA,EAChD;AAEA,QAAM,mBAAmB,UAAU,cAAc,OAAO;AAExD,SACE,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,gBAAc,WAAW,SAAS;AAAA,MAClC,oBAAkB,GAAG,OAAO,IAAI,aAAa;AAAA,MAC7C,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,gBAAc;AAAA,MACd,iBAAe,aAAa,KAAK;AAAA,MACjC,cAAY;AAAA,MACZ,aAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU,YAAY,IAAI;AAAA,MACzB,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,WAAWG;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAMA,SAAS,iBAAiB,OAA8B;AACtD,QAAM,EAAE,WAAW,UAAU,SAAS,KAAK,GAAG,eAAe,IAAI;AAEjE,QAAM,UAAU,kBAAkB,cAAc;AAChD,QAAM,cAAc,sBAAsB,cAAc;AAExD,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,YAAY,YAAY;AAC9B,QAAM,YAAY,SAAS,CAAC,UAAU,MAAM,MAAM,IAAI,SAAS,CAAC;AAChE,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,QAAM,eAAe,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,SAAS,IAAI;AAEnE,QAAM,YAAY,aAAa,OAAO,WAAW,WAAW,KAAK;AAEjE,QAAM,qBAAqB,UAAU,cAAc,OAAO;AAE1D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,iBAAO,aAAa,aACnB,SAAS,SAAS,IAChB,WACF,WACE,cAAc,cAChB,gBAAAH,MAACM,QAAA,EAAM,WAAU,UAAS,IAE1B;AAAA;AAAA,EAEJ;AAEJ;AAMA,SAAS,iBAAiB,OAA8B;AACtD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAU,kBAAkB,cAAc;AAChD,QAAM,cAAc,sBAAsB,cAAc;AACxD,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,QAAM,cAAc,QAAQ;AAE5B,QAAM,YAAY,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,QAAQ,YAAY,KAAK;AAEpE,QAAM,aAAa,cAAc,MAAM,OAAO;AAE9C,MAAI,cAAc,CAAC,WAAY,QAAO;AAEtC,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAEA,QAAMC,sBAAqB,UAAU,cAAc,OAAO;AAE1D,SACE,gBAAAP;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,oBAAkB;AAAA,MAClB,oBAAkB;AAAA,MAClB,cAAY;AAAA,MACZ,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWJ;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,gBAAgB;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAMA,SAAS,aAAa,OAA0B;AAC9C,QAAM,EAAE,WAAW,SAAS,KAAK,GAAG,WAAW,IAAI;AAEnD,QAAM,UAAU,kBAAkB,UAAU;AAC5C,QAAM,cAAc,sBAAsB,UAAU;AAEpD,QAAM,UAAU,MAAM,QAAQ,QAAQ,SAAS,YAAY,KAAK;AAEhE,QAAM,iBAAiB,UAAU,cAAc,OAAO;AAEtD,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWG,KAAG,uBAAuB,SAAS;AAAA;AAAA,EAChD;AAEJ;AAMA,SAAS,mBAAmB,OAAgC;AAC1D,QAAM,EAAE,WAAW,SAAS,KAAK,GAAG,iBAAiB,IAAI;AAEzD,QAAM,UAAU,kBAAkB,gBAAgB;AAClD,QAAM,cAAc,sBAAsB,gBAAgB;AAE1D,QAAM,gBAAgB,MAAM,QAAQ,QAAQ,eAAe,YAAY,KAAK;AAE5E,QAAM,uBAAuB,UAAU,cAAc,OAAO;AAE5D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWG,KAAG,iCAAiC,SAAS;AAAA;AAAA,EAC1D;AAEJ;AAOA,SAAS,eAAe,OAA4B;AAClD,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,UAAU,kBAAkB,YAAY;AAC9C,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,QAAM,YAAY,MAAM,QAAQ,QAAQ,WAAW,SAAS;AAC5D,QAAM,YAAY,MAAM,QAAQ,QAAQ,WAAW,SAAS;AAE5D,MAAI,cAAc,SAAS,CAAC,WAAY,QAAO;AAE/C,QAAM,mBAAmB,UAAU,cAAc,OAAO;AAExD,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,mBAAiB;AAAA,MACjB,aAAU;AAAA,MACV,KAAK,QAAQ;AAAA,MACZ,GAAG;AAAA,MACJ;AAAA,MACA,WAAWG,KAAG,uBAAuB,SAAS;AAAA;AAAA,EAChD;AAEJ;AAEA,SAAS,YAAY,OAAoB;AACvC,QAAM,EAAE,SAAS,SAAS,aAAa,UAAU,GAAG,UAAU,IAAI;AAElE,QAAM,QAAQ,gBAAgB,SAAS;AACvC,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,QAAM,WAAW,SAAS;AAAA,IACxB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,WAAW,MAAM,KAAK,MAAM,KAAK,CAAC;AACxC,QAAM,eAAe,SAAS,SAAS,IAAI,SAAS,QAAQ,SAAS,EAAE,IAAI;AAC3E,QAAM,aAAa,YAAY,gBAAgB;AAE/C,QAAM,UAAgB;AAAA,IACpB,OAAO,UAA+C;AACpD,eAAS,QAAQ,UAAU,KAAK;AAChC,UAAI,MAAM,oBAAoB,WAAY;AAE1C,YAAM,YAAY,KAAK,IAAI,eAAe,GAAG,CAAC;AAC9C,YAAM,gBAAgB,SAAS,SAAS;AAExC,UAAI,eAAe;AACjB,cAAM,SAAS,SAAS,aAAa;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY,cAAc,UAAU,KAAK;AAAA,EACtD;AAEA,QAAM,gBAAgB,UAAU,cAAc,OAAO;AAErD,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,UAAU;AAAA,MACT,GAAG;AAAA,MACJ;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,YAAY,OAAoB;AACvC,QAAM,EAAE,SAAS,SAAS,aAAa,UAAU,GAAG,UAAU,IAAI;AAElE,QAAM,QAAQ,gBAAgB,SAAS;AACvC,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAC7C,QAAM,QAAQ,SAAS,CAAC,UAAU,MAAM,KAAK;AAE7C,QAAM,WAAW,SAAS;AAAA,IACxB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,WAAW,MAAM,KAAK,MAAM,KAAK,CAAC;AACxC,QAAM,eAAe,SAAS,SAAS,IAAI,SAAS,QAAQ,SAAS,EAAE,IAAI;AAC3E,QAAM,aACJ,YAAY,SAAS,WAAW,KAAK,gBAAgB,SAAS,SAAS;AAEzE,QAAM,UAAgB;AAAA,IACpB,OAAO,UAA+C;AACpD,eAAS,QAAQ,UAAU,KAAK;AAChC,UAAI,MAAM,oBAAoB,WAAY;AAE1C,YAAM,YAAY,KAAK,IAAI,eAAe,GAAG,SAAS,SAAS,CAAC;AAChE,YAAM,gBAAgB,SAAS,SAAS;AAExC,UAAI,eAAe;AACjB,cAAM,MAAM,uBAAuB,eAAe,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY,cAAc,UAAU,KAAK;AAAA,EACtD;AAEA,QAAM,gBAAgB,UAAU,cAAc,OAAO;AAErD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,UAAU;AAAA,MACT,GAAG;AAAA,MACJ;AAAA;AAAA,EACF;AAEJ;;;AIzxCA;AAAA,EACE,eAAAQ;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AACP,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,MAAAC,YAAU;AACnB,SAAS,4BAA4B;;;ACTrC,SAAS,oBACP,UACA,SACoB;AACpB,SAAO,UAAU,WAAW,KAAK,SAAS,WAAW;AACvD;AAIA,SAAS,mBACP,UACA,SACyB;AACzB,SAAO;AAAA,IACL,GAAI,SAAS,mBAAmB,KAAK,CAAC;AAAA,IACtC,GAAI,UAAU,mBAAmB,KAAK,CAAC;AAAA,EACzC;AACF;AAEO,SAAS,kBACd,KACA,UACA,UACoB;AACpB,QAAM,UAAU,WAAW,GAAG;AAC9B,QAAM,SAAS;AAAA,IACb,GAAI,SAAS,aAAa,KAAK,CAAC;AAAA,IAChC,GAAI,UAAU,aAAa,KAAK,CAAC;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,cAAc,oBAAoB,UAAU,OAAO;AAAA,IACnD,aAAa,mBAAmB,UAAU,OAAO;AAAA,EACnD;AACF;;;AC/DA,OAAOC,aAAW;AAClB,SAAS,eAAe;;;ACMxB,SAAS,YAAY,sBAAsB;AAsCvC,SAoMA,YAAAC,WApMA,OAAAC,OAsMI,QAAAC,cAtMJ;AAnCJ,SAAS,aACP,OACA,SACS;AACT,QAAM,MAAM,QAAQ;AACpB,MAAI,OAAO,SAAS,QAAQ,OAAO,UAAU,UAAU;AACrD,WAAQ,MAAkC,GAAG;AAAA,EAC/C;AACA,SAAO;AACT;AAGA,SAAS,GAAG,MAAc,SAA0C;AAClE,SAAO,QAAQ,SACX,CAAC,MAAM,mBAAmB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,IACpD;AACN;AAaO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAO,aAAa,OAAO,OAAO;AACxC,SACE,gBAAAD,MAAC,UAAK,WAAW,GAAG,IAAI,OAAO,GAC5B,kBAAQ,OAAO,WAAW,OAAO,IAAI,GACxC;AAEJ;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAO,aAAa,OAAO,OAAO;AACxC,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,yBAAyB,OAAO,GACjD,kBAAQ,OAAO,WAAW,OAAO,IAAI,GACxC;AAEJ;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAO,aAAa,OAAO,OAAO;AACxC,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,eAAe,OAAO,GACvC,kBAAQ,OAAO,WAAW,OAAO,IAAI,GACxC;AAEJ;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAO,aAAa,OAAO,OAAO;AACxC,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,qBAAqB,OAAO,GAC7C,kBAAQ,OAAO,WAAW,OAAO,IAAI,GACxC;AAEJ;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AACF,GAA0C;AACxC,MAAI,SAAS;AACX,WAAO,gBAAAA,MAAC,UAAK,WAAU,yBAAwB,oBAAO;AACxD,QAAM,MAAM,OAAO,KAAK;AACxB,QAAM,SAAS,QAAQ;AACvB,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,SAAS,GAAG;AAC1B,QAAM,QAAQ,SAAS,GAAG,KAAK;AAC/B,SAAO,gBAAAA,MAAC,SAAM,YAAY,OAAQ,iBAAM;AAC1C;AAMA,SAAS,eAAe,OAAgB,MAAqC;AAC3E,QAAM,UAAU,SAAS,QAAQ,UAAU;AAC3C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO,QAAQ,KAAK;AAAA,IACtB,KAAK;AACH,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,0BACP,OACA,UACoB;AACpB,MAAI,aAAa,UAAU,SAAS,QAAQ,UAAU,IAAI;AACxD,WAAO,gBAAAA,MAAC,UAAK,WAAU,yBAAwB,oBAAO;AAAA,EACxD;AACA,MAAI,aAAa,eAAe;AAC9B,WAAO,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,iBAAO,KAAK,GAAE;AAAA,EAChE;AACA,SAAO,gBAAAA,MAAC,UAAM,iBAAO,KAAK,GAAE;AAC9B;AAgBO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,OAAQ,QAAQ,QAA6C;AACnE,QAAM,UAAW,QAAQ,WAAwC;AACjE,QAAM,WACH,QAAQ,YAAqD;AAEhE,MAAI,eAAe,OAAO,IAAI,GAAG;AAC/B,UAAM,QACJ,QAAQ,SAAS,OAAO,OAAO,QAAQ,KAAK,IAAI,OAAO,SAAS,EAAE;AACpE,WAAO,gBAAAA,MAAC,SAAM,SAAmB,iBAAM;AAAA,EACzC;AAEA,SAAO,0BAA0B,OAAO,QAAQ;AAClD;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AACF,GAA0C;AACxC,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,yBAAyB,OAAO,GACjD,qBAAW,KAAsB,GACpC;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAA0C;AACxC,SACE,gBAAAA,MAAC,UAAK,WAAW,GAAG,yBAAyB,OAAO,GACjD,yBAAe,KAAsB,GACxC;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,GAA0C;AAC5E,SACE,gBAAAA,MAAC,UAAK,WAAW,QAAQ,mBAAmB,yBACzC,kBAAQ,QAAQ,MACnB;AAEJ;AAEO,SAAS,WAAW,EAAE,MAAM,GAA0C;AAC3E,QAAM,OAAO,SAAS,OAAO,WAAW,OAAO,KAAK;AACpD,SAAO,gBAAAA,MAAC,UAAK,WAAU,gBAAgB,gBAAK;AAC9C;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,WAAW,aAAa,OAAO,OAAO;AAC5C,QAAM,OAAO,YAAY,OAAO,WAAW,OAAO,QAAQ;AAC1D,SACE,gBAAAA,MAAC,UAAK,WAAU,2BAA0B,OAAO,MAC9C,gBACH;AAEJ;AAUO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAC5B,QACD,CAAC;AACL,MAAI,MAAM,WAAW;AACnB,WAAO,gBAAAA,MAAC,UAAK,WAAU,yBAAwB,oBAAO;AAExD,QAAM,aAAa,QAAQ;AAC3B,QAAM,cAAc,QAAQ;AAC5B,QAAM,YAAY,QAAQ;AAE1B,QAAM,QAAQ,MAAM,CAAC;AACrB,QAAM,QACH,cAAe,MAAM,UAAU,KAC/B,eAAgB,MAAM,WAAW,KAClC;AAEF,SACE,gBAAAC,OAAAF,WAAA,EACG;AAAA,iBACC,gBAAAE,OAAC,UAAK,WAAU,yBACb;AAAA,aAAO,MAAM,SAAS,CAAC;AAAA,MAAE;AAAA,MAAE;AAAA,OAC9B;AAAA,IAED;AAAA,IACA,MAAM,SAAS,KACd,gBAAAA,OAAC,UAAK,WAAU,8BAA6B;AAAA;AAAA,MAAE,MAAM,SAAS;AAAA,OAAE;AAAA,KAEpE;AAEJ;AAGO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,MAAO,QAAQ,aAAoC;AACzD,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAC5C,WAAO,gBAAAD,MAAC,UAAK,WAAU,yBAAwB,oBAAO;AACxD,SAAO,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,gBAAM,KAAK,GAAG,GAAE;AAClE;;;ADjPO,IAAM,iBAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,cAAc;AAAA,EACd,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AACR;AAMO,SAAS,kBACd,MACA,QACQ;AACR,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,YAAY,SAAS,UAAW,QAAO;AACpD,MAAI,SAAS,UAAU;AACrB,QAAI,WAAW,YAAa,QAAO;AACnC,QAAI,WAAW,OAAQ,QAAO;AAAA,EAChC;AACA,SAAO;AACT;AAOO,SAASE,qBACd,MACA,gBACc;AACd,SAAO,iBAAiB,IAAI,KAAK,eAAe,IAAI,KAAK;AAC3D;AAqCO,SAAS,eACd,QACc;AACd,SAAO,CAAC,EAAE,KAAK,QAAQ,MACrBC,QAAM,cAAcA,QAAM,UAAU,MAAM,OAAO,KAAa,OAAO,CAAC;AAC1E;AAMO,SAAS,sBACd,WACM;AACN,aAAW,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,QAAI,CAAC,KAAK,WAAW,IAAI,GAAG;AAC1B;AAAA,QACE,iCAAiC,IAAI,uCACvB,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;;;AEhHO,SAAS,eACd,QACA,UACkB;AAClB,QAAM,aAAa,OAAO,cAAc,CAAC;AAEzC,QAAM,UAAU,OAAO,QAAQ,UAAU,EACtC,IAAI,CAAC,CAAC,KAAK,QAAQ,GAAG,UAAU;AAC/B,UAAM,SAAS,kBAAkB,KAAK,UAAU,QAAQ;AACxD,WAAO,EAAE,KAAK,UAAU,QAAQ,MAAM;AAAA,EACxC,CAAC,EACA,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,OAAO,MAAM;AAGxC,QAAM,UAAU,QACb,OAAO,CAAC,EAAE,OAAO,MAAM,OAAO,UAAU,MAAS,EACjD,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,QAAS,EAAE,OAAO,KAAM;AAGnD,QAAM,YAAY,QACf,OAAO,CAAC,EAAE,OAAO,MAAM,OAAO,UAAU,MAAS,EACjD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,QAAM,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS;AAExC,SAAO,OAAO,IAAI,CAAC,EAAE,KAAK,UAAU,OAAO,MAAM;AAC/C,UAAM,eACJ,OAAO,gBAAgB,kBAAkB,SAAS,MAAM,SAAS,MAAM;AAGzE,UAAM,QAAQ,OAAO,SAAS,SAAS,SAAS,WAAW,GAAG;AAE9D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAGA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,QAAQ,MAAM,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AACvE;;;AJwKQ,gBAAAC,OAioBJ,QAAAC,cAjoBI;AAvJR,IAAM,eAAe,gBAAgB;AAsFrC,SAAS,qBAAqB,OAGT;AACnB,SAAO;AAAA,IACL,YAAY,MAAM,cAAc;AAAA,IAChC,eAAe,MAAM,iBAAiB;AAAA,EACxC;AACF;AAIA,IAAM,uBAAgD;AAAA,EACpD,eAAe;AAAA,EACf,aAAa;AACf;AASA,SAAS,sBAAsB,OAGR;AACrB,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,MAAM;AAAA,MACrB,aAAa,MAAM;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,aAAa,SAAS;AAAA,EACxB;AACF;AAOA,SAAS,gBACP,UACA,gBACmB;AACnB,SAAO,SAAS,IAAI,CAAC,QAAQ;AAC3B,UAAM,WAAWC,qBAAoB,IAAI,cAAc,cAAc;AACrE,UAAM,UAAU,IAAI;AACpB,UAAM,SAA0B;AAAA,MAC9B,IAAI,IAAI;AAAA,MACR,aAAa,IAAI;AAAA,MACjB,QAAQ,IAAI;AAAA,MACZ,MAAM,CAAC;AAAA,QACL;AAAA,QACA;AAAA,MACF,MAIE,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,KAAK,IAAI;AAAA,UACT;AAAA;AAAA,MACF;AAAA,IAEJ;AACA,QAAI,IAAI,UAAU,OAAW,QAAO,OAAO,IAAI;AAC/C,QAAI,IAAI,aAAa,QAAW;AAC9B,aAAO,UAAU,IAAI;AAIrB,aAAO,OAAO,EAAE,GAAG,OAAO,MAAM,UAAU,IAAI,SAAS;AAAA,IACzD;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAGA,SAAS,oBAA2D;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,OAAO,EAAE,MAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SACE,EAAE,yBAAyB,MAC1B,EAAE,0BAA0B,IAAI,kBAAkB;AAAA,QAErD,iBAAiB,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC,KAAK;AAAA,QAC/D,cAAW;AAAA;AAAA,IACb;AAAA,IAEF,MAAM,CAAC,EAAE,IAAI,MACX,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,IAAI,cAAc;AAAA,QAC3B,iBAAiB,CAAC,UAAU,IAAI,eAAe,CAAC,CAAC,KAAK;AAAA,QACtD,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,cAAW;AAAA;AAAA,IACb;AAAA,EAEJ;AACF;AAMA,SAAS,kBAAwC,MAU9C;AACD,QAAM,OAAO;AAAA,IACX,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,iBAAiB;AAAA,IACjB,OAAO,KAAK;AAAA,EACd;AAEA,QAAM,gBAAgB,KAAK,gBACvB,EAAE,oBAAoB,MAAM,sBAAsB,KAAK,gBAAgB,IACvE,CAAC;AAIL,QAAM,YAAY,KAAK,WACnB,EAAE,UAAU,CAAC,QAAc,KAAK,SAAU,GAAG,EAAE,IAC/C,CAAC;AAEL,QAAM,iBAAiB,KAAK,cACxB;AAAA,IACE,kBAAkB;AAAA,IAClB,UAAU,KAAK,MAAM,KAAK,SAAS;AAAA,IACnC,oBAAoB,KAAK;AAAA,EAC3B,IACA,CAAC;AAEL,SAAO,EAAE,GAAG,MAAM,GAAG,eAAe,GAAG,gBAAgB,GAAG,UAAU;AACtE;AAkBA,SAAS,oBACP,OACA,eACwB;AACxB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,cAAc,CAAC,EAAE,cAAc;AAErC,QAAM,WAAWG,SAAQ,MAAM,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAGvD,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,YAAY,YAAY,aAAa;AAC3C,QAAM,WAAW,YAAY,YAAY;AACzC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,eAAe,SAAS,QAAQ,CAAC,mBAAoB;AAC1D,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,QAAQ,IAAI,CAAC;AAC3D,QAAI,YAAY,SAAS;AACvB,yBAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,QAAQ,EAAE;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,WAAW,UAAU,kBAAkB,CAAC;AAMhE,QAAM,CAAC,cAAc,eAAe,IAAIC,UAA4B,CAAC,CAAC;AACtE,QAAM,YAAY,CAAC,CAAC;AACpB,EAAAD,WAAU,MAAM;AACd,QAAI,UAAW;AACf,oBAAgB,CAAC,CAAC;AAAA,EACpB,GAAG,CAAC,MAAM,SAAS,CAAC;AAGpB,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAiB,EAAE;AAC/D,QAAM,eAAeC,QAAuB,IAAI;AAEhD,QAAM,cAAcH,SAAQ,MAAM;AAChC,QAAI,UAAW,uBAAsB,SAAS;AAC9C,WAAO,gBAAsB,eAAe,QAAQ,QAAQ,GAAG,SAAS;AAAA,EAC1E,GAAG,CAAC,QAAQ,UAAU,SAAS,CAAC;AAEhC,QAAM,eAAeA;AAAA,IACnB,MAAO,gBAAgB,kBAAwB,IAAI;AAAA,IACnD,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,UAAUA;AAAA,IACd,MAAO,eAAe,CAAC,cAAc,GAAG,WAAW,IAAI;AAAA,IACvD,CAAC,cAAc,WAAW;AAAA,EAC5B;AAGA,QAAM,uBAAuBG,QAAO,iBAAiB;AACrD,uBAAqB,UAAU;AAC/B,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,qBAAqB,QAAS;AACrD,UAAM,OAAO,OAAO,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;AAIpE,UAAM,WAAW,WACb,SAAS,OAAO,CAAC,QAAQ,KAAK,SAAS,SAAS,GAAG,CAAC,CAAC,IACrD,KACG,IAAI,MAAM,EACV,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,EACtB,OAAO,CAAC,MAAiB,MAAM,MAAS;AAC/C,yBAAqB,QAAQ,QAAQ;AAAA,EACvC,GAAG,CAAC,cAAc,eAAe,UAAU,QAAQ,CAAC;AAGpD,QAAM,aAAaD;AAAA,IACjB,OAAO;AAAA,MACL,GAAI,cAAc,EAAE,WAAW,IAAI,CAAC;AAAA,MACpC,GAAI,gBAAgB,EAAE,aAAa,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA,CAAC,aAAa,YAAY,eAAe,YAAY;AAAA,EACvD;AAEA,QAAM,eAAe,kBAAkB;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,cAAoB,YAAY;AAG9C,EAAAC,WAAU,MAAM;AACd,QAAI,iBAAiB,KAAK,CAAC,aAAa,QAAS;AACjD,UAAM,OAAO,aAAa,QAAQ,iBAAiB,UAAU;AAC7D,SAAK,cAAc,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAC3D,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAaA,SAAS,kBAAwC,MAQrB;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,mBACJ,CAAC,iBAAiB,kBAAkB,kBAAkB,CAAC,CAAC;AAE1D,QAAM,cAAcE,QAAO,iBAAiB;AAC5C,cAAY,UAAU;AAEtB,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,iBAAkB;AACvB,UAAM,MAAM,kBAAkB,IAAK,SAAS,cAAc,KAAK,OAAQ;AACvE,gBAAY,UAAU,GAAG;AAAA,EAC3B,GAAG,CAAC,kBAAkB,gBAAgB,QAAQ,CAAC;AAE/C,SAAOG;AAAA,IACL,CAAC,UAAkB,kBAAkB,KAAK;AAAA,IAC1C,CAAC,iBAAiB;AAAA,EACpB;AACF;AAMA,SAAS,iBACP,OACA,gBACA,mBACA,eACA,YACA;AACA,SAAOA;AAAA,IACL,CAAC,MAA2C;AAC1C,YAAM,YAAY,MAAM,YAAY,EAAE;AACtC,UAAI,UAAU,WAAW,EAAG;AAE5B,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,4BAAkB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,UAAU,SAAS,CAAC,CAAC;AACpE;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,YAAE,eAAe;AACjB,4BAAkB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AACjD;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,KAAK;AACR,yBAAe,GAAG,WAAW,eAAe,cAAc;AAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,YAAY,eAAe,OAAO,iBAAiB;AAAA,EACtE;AACF;AAQA,SAAS,iBAAiB,WAGU;AAClC,QAAM,OAAO,UAAU;AACvB,QAAM,WAAW,UAAU,MAAM;AACjC,MAAI,SAAS,UAAa,aAAa,OAAW,QAAO;AACzD,SAAO;AAAA,IACL,GAAI,SAAS,UAAa,EAAE,OAAO,KAAK;AAAA,IACxC,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,EAC3C;AACF;AAEA,SAAS,eACP,GACA,WACA,eACA,gBACA,YACA;AACA,IAAE,eAAe;AACjB,MAAI,iBAAiB,iBAAiB,KAAK,CAAC,WAAY;AACxD,QAAM,YAAY,UAAU,cAAc;AAC1C,MAAI,UAAW,YAAW,UAAU,QAAQ;AAC9C;AAEA,SAAS,eACP,GACA,WACA,eACA,gBACA;AACA,MAAI,CAAC,iBAAiB,iBAAiB,EAAG;AAC1C,IAAE,eAAe;AACjB,YAAU,cAAc,GAAG,eAAe;AAC5C;AAmBA,SAAS,mBACP,eACA,YACS;AACT,SAAO,iBAAiB,CAAC,CAAC;AAC5B;AAEA,SAAS,oBACP,YACA,YACA,eACA,aACkB;AAClB,QAAM,gBAAgB,CAAC,EAAE,cAAc,WAAW,SAAS;AAC3D,QAAM,aAAa,CAAC,EAClB,cACA,eACA,CAAC,iBACD,CAAC;AAEH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,iBAAiB;AAAA,EACnC;AACF;AAiBA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,MAAI,WAAW;AACb,WACE,gBAAAP,MAAC,QACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QACX;AAAA;AAAA,IAED,GACF;AAAA,EAEJ;AACA,MAAI,SAAS;AACX,WACE,gBAAAA,MAAC,QACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET,0BAAgB,kBAAkB,WAAW;AAAA;AAAA,IAChD,GACF;AAAA,EAEJ;AACA,MAAI,SAAS;AACX,WACE,gBAAAA,MAAC,QACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET,8BAAoB,cAAc,YAAY,WAAW;AAAA;AAAA,IAC5D,GACF;AAAA,EAEJ;AACA,SAAO;AACT;AAEA,SAAS,oBACP,cACA,YACA,aACQ;AACR,MAAI,aAAc,QAAO;AACzB,MAAI,WAAY,QAAO,MAAM,WAAW;AACxC,SAAO,MAAM,WAAW;AAC1B;AAWA,SAAS,cAAoB;AAAA,EAC3B;AAAA,EACA;AACF,GAAiD;AAC/C,SACE,gBAAAA,MAAC,QAAG,WAAU,6BACZ,0BAAAA,MAAC,SAAI,WAAU,uCACZ,kBAAQ,IAAI,CAAC,WACZ,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA;AAAA,IAFK,OAAO;AAAA,EAGd,CACD,GACH,GACF;AAEJ;AAOA,SAAS,aAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAAuD;AACrD,QAAM,WAAW,OAAO,SAAS,WAAW;AAC5C,MAAI,SAAU,QAAO;AACrB,QAAM,aAAa,OAAO,WAAW,WAAW;AAChD,QAAMQ,QAAO,OAAO;AACpB,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO,OAAO;AAAA,MACd,UAAU;AAAA,MACV,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,eAAO,QAAQ,WAAW;AAAA,MAC5B;AAAA,MACA,WAAWS;AAAA,QACT;AAAA,QACA,OAAO,YAAY,gBACf,6CACA;AAAA,QACJ,aACI,6DACA;AAAA,MACN;AAAA,MAEC,UAAAD,QACC,gBAAAR,MAACQ,OAAA,EAAK,WAAU,eAAc,IAE9B,gBAAAR,MAAC,UAAK,WAAU,WAAW,iBAAO,OAAM;AAAA;AAAA,IApBrC,OAAO;AAAA,EAsBd;AAEJ;AAuBA,SAAS,YAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,QAAM,WAAW,kBAAkB,kBAAkB,CAAC,CAAC;AACvD,SACE,gBAAAA,MAAC,QAAG,WAAU,kBACX,qBACC,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAM;AAAA,MACN,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,mBAAY,WAAW;AAAA,MACzB;AAAA,MACA,WAAU;AAAA,MAEV,0BAAAA,MAACU,eAAA,EAAa,WAAU,WAAU;AAAA;AAAA,EACpC,IAEA,gBAAAV,MAACU,eAAA,EAAa,WAAU,iCAAgC,GAE5D;AAEJ;AAEA,SAAS,aACP,KACA,UACA,eACA,oBACA,YACQ;AACR,SAAOD;AAAA,IACL;AAAA,IACA,cAAc,CAAC,iBAAiB;AAAA,IAChC,iBAAiB;AAAA,IACjB,IAAI,cAAc,KAAK;AAAA,IACvB,YAAY,iBAAiB;AAAA,IAC7B,YAAY,sBAAsB;AAAA,EACpC;AACF;AAEA,SAAS,QAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AAIzC,QAAM,qBACJ,CAAC,iBAAiB,kBAAkB,kBAAkB,CAAC,CAAC;AAC1D,QAAM,WAAW,UAAU;AAC3B,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MAEC,SAAS,MAAM;AACb;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe,MAAM;AACnB,YAAI,sBAAsB,WAAY,YAAW,IAAI,QAAQ;AAAA,MAC/D;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,YAAI,gBAAgB,EAAE,IAAI,CAAC,SAC1B,gBAAAD,MAAC,QAAiB,WAAU,aACzB,qBAAW,KAAK,OAAO,UAAU,MAAM,KAAK,WAAW,CAAC,KADlD,KAAK,EAEd,CACD;AAAA,QACA,iBACC,gBAAAA,MAAC,iBAAc,SAAS,YAAa,aAAa,IAAI,UAAU;AAAA,QAEjE,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,IAAI;AAAA,YACjB;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,IArCG,IAAI;AAAA,EAuCX;AAEJ;AAEA,SAAS,eACP,KACA,OACA,eACA,eACA,YACA,eACA,mBACA,cACM;AACN,MAAI,eAAe;AACjB,QAAI,eAAe;AACnB,sBAAkB,KAAK;AACvB,iBAAa,SAAS,MAAM;AAC5B;AAAA,EACF;AACA,MAAI,kBAAkB,kBAAkB,YAAY;AAElD,kBAAc,KAAK;AACnB;AAAA,EACF;AACA,MAAI,WAAY,YAAW,IAAI,QAAQ;AACzC;AAcA,SAAS,YAAkC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsD;AACpD,MAAI,CAAC,MAAM,KAAM,QAAO;AACxB,MAAI,aAAa;AACf,WAAO,gBAAAA,MAAC,oBAAiB,OAAc,aAA0B;AAAA,EACnE;AACA,SACE,gBAAAC,OAAC,OAAE,WAAU,sCAAqC;AAAA;AAAA,IACvC,SAAS;AAAA,IAAO;AAAA,IAAK,KAAK,KAAK;AAAA,IAAM;AAAA,IAAE;AAAA,KAClD;AAEJ;AAMO,SAAS,YACd,OACoB;AACpB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,EAAE,YAAY,cAAc,IAAI,qBAAqB,KAAK;AAChE,QAAM,EAAE,eAAe,YAAY,IAAI,sBAAsB,KAAK;AAElE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,oBAAoB,OAAO,aAAa;AAE5C,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,oBAAoB,kBAAkB;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,EAAE,eAAe,YAAY,eAAe,IAAI;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,UAAU,iBAAiB,IAAI;AAExD,QAAM,gBAAgB,mBAAmB,eAAe,UAAU;AAElE,SACE,gBAAAA,OAAC,SACC;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,gBAAgB,eAAe;AAAA,QACpC,UAAU,gBAAgB,IAAI;AAAA,QAC9B,WAAW,gBAAgB,gBAAgB;AAAA,QAC3C,WAAWS,KAAG,qBAAqB,iBAAiB,cAAc;AAAA,QAElE,0BAAAR,OAAC,WAAM,WAAU,kBACf;AAAA,0BAAAD,MAAC,WACC,0BAAAC,OAAC,QAAG,WAAU,wBACX;AAAA,kBAAM,eAAe,EAAE,IAAI,CAAC,WAC3B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,OAAO,iBAAiB,OAAO,OAAO,SAAS;AAAA,gBAE9C,iBAAO,gBACJ,OACA;AAAA,kBACE,OAAO,OAAO,UAAU;AAAA,kBACxB,OAAO,WAAW;AAAA,gBACpB;AAAA;AAAA,cATC,OAAO;AAAA,YAUd,CACD;AAAA,YACA,iBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,cAAW;AAAA,gBACX,OAAM;AAAA,gBACN,WAAU;AAAA;AAAA,YACZ;AAAA,YAED,cACC,gBAAAA,MAAC,QAAG,cAAW,QAAO,OAAM,OAAM,WAAU,QAAO;AAAA,aAEvD,GACF;AAAA,UACA,gBAAAC,OAAC,WACC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,cAAc,MAAM;AAAA,gBACpB,SAAS,CAAC,aAAa,CAAC,WAAW,SAAS,WAAW;AAAA,gBACvD;AAAA;AAAA,YACF;AAAA,YACC,MAAM,YAAY,EAAE,KAAK,IAAI,CAAC,KAAK,UAClC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,eAAe;AAAA,gBACf;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,cAZK,IAAI;AAAA,YAaX,CACD;AAAA,aACH;AAAA,WACF;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAWA,SAAS,iBAAuC;AAAA,EAC9C;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,EAAE,WAAW,SAAS,IAAI,MAAM,SAAS,EAAE;AACjD,QAAM,WAAW,MAAM,YAAY;AACnC,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,OAAO,aAAa,IAAI,IAAI,YAAY,WAAW;AACzD,QAAM,KAAK,KAAK,KAAK,YAAY,KAAK,UAAU,QAAQ;AAExD,SACE,gBAAAC,OAAC,SAAI,WAAU,0CACb;AAAA,oBAAAD,MAAC,OAAE,WAAU,iCACV,uBAAa,IACV,MAAM,WAAW,KACjB,WAAW,IAAI,SAAS,EAAE,OAAO,QAAQ,IAAI,WAAW,IAC9D;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,MAAM,aAAa;AAAA,UAClC,UAAU,CAAC,MAAM,mBAAmB;AAAA,UACpC,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA,MAAC,UAAK,WAAU,sCACb,sBAAY,IAAI,GAAG,YAAY,CAAC,MAAM,SAAS,KAAK,MACvD;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,MAAM,SAAS;AAAA,UAC9B,UAAU,CAAC,MAAM,eAAe;AAAA,UAChC,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF;AAEJ;;;AKjoCA,OAAOW,aAAW;AAClB,SAAS,2BAA2B;;;ACIpC,SAAgB,YAAAC,iBAAgB;AAChC,SAAS,gBAAgB;AAkDnB,SAQY,OAAAC,OARZ,QAAAC,cAAA;AApCN,IAAM,sBAAsB;AAG5B,IAAM,aAAa;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,SAAS,aAAa,GAAyB;AAC7C,SAAO,OAAO,MAAM,YAAY,MAAM;AACxC;AAGA,SAAS,UAAU,EAAE,MAAM,GAA0C;AACnE,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,KAAK;AACtC,QAAM,UAAU,MAAM,QAAQ,KAAK,IAC/B,IAAI,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG,MACrD,IAAI,OAAO,KAAK,KAAK,EAAE,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE,WAAW,IAAI,KAAK,GAAG;AAElF,MAAI,CAAC,MAAM;AACT,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,kBAAQ,IAAI;AAAA,QACd;AAAA,QACA,WAAU;AAAA,QAET;AAAA;AAAA,UAAQ;AAAA,UAAC,gBAAAD,MAAC,UAAK,WAAU,WAAU,yBAAM;AAAA;AAAA;AAAA,IAC5C;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,qBACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,6EACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,2BAA2B,MAAM;AAAA,QACjC,UAAQ;AAAA;AAAA,IACV,GACF;AAAA,KACF;AAEJ;AAGA,SAAS,cAAc,EAAE,KAAK,GAAyC;AACrE,QAAM,CAAC,MAAM,OAAO,IAAIE,UAAS,KAAK;AACtC,MAAI,CAAC,MAAM;AACT,WACE,gBAAAD,OAAC,UAAK,WAAU,eACd;AAAA,sBAAAD,MAAC,UAAK,WAAU,6BAA6B,gBAAK;AAAA,MAClD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,oBAAQ,IAAI;AAAA,UACd;AAAA,UACA,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,EAEJ;AACA,SACE,gBAAAC,OAAC,UAAK,WAAU,eACd;AAAA,oBAAAD,MAAC,UAAK,WAAU,uGACb,gBACH;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;AAGA,SAAS,iBACP,OACA,QACA,WAC2B;AAC3B,QAAM,WACJ,OAAO,WAAW,KAAK,kBAAkB,OAAO,MAAM,OAAO,MAAM;AAErE,MAAI,aAAa,QAAQ;AACvB,UAAM,SAAS,OAAO,UAAU,WAAW,UAAU,KAAK,IAAI;AAC9D,WAAO,aAAa,MAAM,IAAI,gBAAAA,MAAC,aAAU,OAAO,QAAQ,IAAK;AAAA,EAC/D;AACA,MAAI,YAAY,aAAa,QAAQ;AACnC,UAAM,WAAW,eAAe,QAAQ;AACxC,QAAI,UAAU;AACZ,aACE,gBAAAA,MAAC,UAAK,WACJ,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,KAAK,CAAC;AAAA,UACN,SACG,OAAO,mBAAmB,KAAiC,CAAC;AAAA;AAAA,MAEjE,GACF;AAAA,IAEJ;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBACP,OACA,WACoB;AACpB,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG;AAChE,WACE,gBAAAA,MAAC,UAAK,WAAW,eAAe,aAAa,EAAE,IAC5C,gBAAM,IAAI,MAAM,EAAE,KAAK,IAAI,GAC9B;AAAA,EAEJ;AACA,SAAO,gBAAAA,MAAC,aAAU,OAAc;AAClC;AAGA,SAAS,aACP,OACA,WACA,YACoB;AACpB,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,gBAAAA,MAAC,UAAK,WAAuB,kBAAQ,SAAS,SAAQ;AAAA,EAC/D;AACA,QAAM,MAAM,OAAO,KAAK;AACxB,MAAI,IAAI,SAAS,cAAc,IAAI,SAAS,IAAI,GAAG;AACjD,WACE,gBAAAA,MAAC,UAAK,WACJ,0BAAAA,MAAC,iBAAc,MAAM,KAAK,GAC5B;AAAA,EAEJ;AACA,SAAO,gBAAAA,MAAC,UAAK,WAAW,eAAe,aAAa,EAAE,IAAK,eAAI;AACjE;AAGA,SAAS,gBACP,OACA,WACA,YACoB;AACpB,MAAI,SAAS,MAAM;AACjB,WACE,gBAAAA,MAAC,UAAK,WAAW,yBAAyB,aAAa,EAAE,IAAI,oBAAC;AAAA,EAElE;AACA,MAAI,aAAa,KAAK,EAAG,QAAO,iBAAiB,OAAO,SAAS;AACjE,SAAO,aAAa,OAAO,WAAW,UAAU;AAClD;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAA2C;AACzC,QAAM,aAAa,SAAS,iBAAiB,OAAO,QAAQ,SAAS,IAAI;AACzE,SAAO,cAAc,gBAAgB,OAAO,WAAW,UAAU;AACnE;AAEA,SAAS,UAAU,GAAoB;AACrC,MAAI;AACF,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADnMW,gBAAAG,OAuBC,QAAAC,cAvBD;AAZJ,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF,GAA0C;AACxC,QAAM,UAAU,OAAO,QAAQ,cAAc,CAAC,CAAC;AAE/C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,gBAAAD,MAAC,OAAE,WAAU,wCAAwC,sBAAW;AAAA,EACzE;AAEA,QAAM,SAAS,cACb,gBAAAA,MAAC,OAAE,WAAU,4CAA2C,wBAAU;AAGpE,QAAM,UAAU,qCAAqC,WAAW,yCAAyC,EAAE;AAE3G,QAAM,UAAU,CAAC,UACf,WACI;AAAA,IACE,SAAS,MAAM,oBAAoB,cAAc,KAAK,CAAC;AAAA,IACvD,OAAO;AAAA,EACT,IACA,CAAC;AAEP,MAAI,WAAW,WAAW;AACxB,WACE,gBAAAC,OAAC,SAAI,WACF;AAAA;AAAA,MACD,gBAAAD,MAAC,QAAG,WAAU,aACX,kBAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MACvB,gBAAAC,OAAC,SACC;AAAA,wBAAAD,MAAC,QAAG,WAAW,SAAU,GAAG,QAAQ,KAAK,GACtC,eACH;AAAA,QACA,gBAAAA,MAAC,QAAG,WAAU,mDACZ,0BAAAA,MAAC,iBAAc,OAAc,QAAQ,kBAAkB,GAAG,GAAG,GAC/D;AAAA,WANQ,GAOV,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,gBAAAC,OAAC,SAAI,WACF;AAAA;AAAA,IACD,gBAAAD,MAAC,QAAG,WAAU,4DACX,kBAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MACvB,gBAAAC,OAACC,QAAM,UAAN,EACC;AAAA,sBAAAF,MAAC,QAAG,WAAW,GAAG,OAAO,sBAAuB,GAAG,QAAQ,KAAK,GAC7D,eACH;AAAA,MACA,gBAAAA,MAAC,QAAG,WAAU,+CACZ,0BAAAA,MAAC,iBAAc,OAAc,QAAQ,kBAAkB,GAAG,GAAG,GAC/D;AAAA,SANmB,GAOrB,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;;;AEtGA,YAAYG,aAAW;AACvB,SAAS,SAAAC,QAAO,gBAAgB,SAAS,KAAAC,UAAS;AAClD,SAAS,MAAAC,YAAU;AAWnB;AAAA,EACE;AAAA,OAGK;AA8HH,qBAAAC,WAOmB,OAAAC,OALf,QAAAC,cAFJ;AAxHJ,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOW;AACT,MAAI,UAAW,QAAO;AACtB,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,SAAS,eAAe,OAAO,SAAS;AAC1C,WAAO,iBAAiB,QAAQ,aAAa,WAAW,IAAI,MAAM,EAAE;AACtE,MAAI,SAAS,cAAc,CAAC,YAAa,QAAO;AAChD,SAAO;AACT;AAGA,SAAS,eACP,QAC6C;AAC7C,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,KAAK;AAC1D,QAAM,gBAAsB,oBAAY,MAAM;AAC5C,mBAAe,IAAI;AACnB,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AACX,SAAO,CAAC,aAAa,aAAa;AACpC;AA8DA,SAAS,4BAA4B,OAA0B;AAC7D,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,UAAU,MAAM,YAAY;AAAA,IAC5B,aAAa,MAAM,eAAe;AAAA,IAClC,mBAAmB,MAAM,qBAAqB;AAAA,IAC9C,cAAc,MAAM,gBAAgB;AAAA,IACpC,UAAU,MAAM,YAAY;AAAA,EAC9B;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK8B;AAC5B,QAAM,WAAW,UAAU,UAAa,UAAU;AAClD,SACE,gBAAAA,OAAAF,WAAA,EACG;AAAA,gBACC,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET;AAAA;AAAA,UACA,YAAY,gBAAAD,MAAC,UAAK,WAAU,yBAAwB,eAAC;AAAA;AAAA;AAAA,IACxD;AAAA,IAED,eACC,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,uBAAY;AAAA,KAE9D;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAauB;AACrB,SACE,gBAAAC,OAAC,WAAQ,cAAc,OACrB;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,QACb,OAAO;AAAA,QACP,eAAe;AAAA,QACf,WACE,SAAS,aACL,CAAC,MAA2B;AAC1B,cAAI,EAAE,QAAQ,SAAS;AACrB,cAAE,eAAe;AACjB,mBAAO;AAAA,UACT;AAAA,QACF,IACA;AAAA;AAAA,IAER;AAAA,IACA,gBAAAC,OAAC,eACC;AAAA,sBAAAD,MAAC,gBACE,4BAAkB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,GACH;AAAA,MACA,gBAAAA,MAAC,gBACE,kBAAQ,IAAI,CAAC,WACZ,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,OAAO;AAAA,UACd,UAAU;AAAA,UAEV;AAAA,4BAAAD;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,WAAWC;AAAA,kBACT;AAAA,kBACA,UAAU,OAAO,QAAQ,gBAAgB;AAAA,gBAC3C;AAAA;AAAA,YACF;AAAA,YACC,OAAO;AAAA;AAAA;AAAA,QAVH,OAAO;AAAA,MAWd,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,SAAS,aAAa,OAA8C;AACzE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,4BAA4B,KAAK;AAErC,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAK5C,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAwB,IAAI;AAE5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI,iBAAiB,EAAE,SAAS,UAAU,MAAM,SAAS,CAAC;AAE1D,QAAM,CAAC,aAAa,MAAM,IAAI,eAAe,SAAS;AAItD,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,OAAO;AACV,uBAAiB,IAAI;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK;AACvD,QAAI,OAAO;AACT,uBAAiB,MAAM,KAAK;AAAA,IAC9B,WAAW,kBAAkB,eAAe,UAAU,OAAO;AAG3D,uBAAiB,eAAe,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,cAAc,CAAC;AAEnC,QAAM,cAAoB;AAAA,IACxB,CAAC,MAA8B;AAE7B,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,uBAAiB,IAAI;AACrB,iBAAW,IAAI;AACf,uBAAiB,IAAI;AAAA,IACvB;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,EAC3B;AAEA,QAAM,YAAY,QAAQ,aAAa,SAAS,CAAC,YAAY,CAAC,QAAQ;AAEtE,QAAM,eAAqB;AAAA,IACzB,CAAC,kBAA0B;AACzB,YAAM,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,aAAa;AACzD,UAAI,IAAK,kBAAiB,IAAI,KAAK;AACnC,YAAM,WAAW,kBAAkB,QAAQ,OAAO;AAClD,UAAI,aAAa,KAAM,kBAAiB,IAAI;AAC5C,iBAAW,QAAQ;AACnB,uBAAiB,aAAa,OAAO,OAAQ,OAAO,IAAK;AACzD,cAAQ,KAAK;AACb,gBAAU,EAAE;AAAA,IACd;AAAA,IACA,CAAC,SAAS,OAAO,UAAU,gBAAgB,SAAS;AAAA,EACtD;AAEA,QAAM,mBAAyB;AAAA,IAC7B,CAAC,YAAqB;AACpB,cAAQ,OAAO;AACf,UAAI,CAAC,SAAS;AACZ,kBAAU,EAAE;AACZ,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,EACpB;AAEA,SACE,gBAAAF,OAAC,SAAI,WAAWE,KAAG,aAAa,SAAS,GACvC;AAAA,oBAAAH;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAC,OAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,sBAAAD,MAAC,kBAAe,SAAO,MACrB,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,WAAWE;AAAA,YACT;AAAA,YACA,CAAC,iBAAiB;AAAA,YAClB,SAAS;AAAA,UACX;AAAA,UACA;AAAA,UAEA;AAAA,4BAAAH,MAAC,UAAK,WAAU,YAAY,2BAAiB,aAAY;AAAA,YACzD,gBAAAC,OAAC,SAAI,WAAU,2BACZ;AAAA,2BACC,gBAAAD,MAAC,WAAQ,WAAU,mCAAkC;AAAA,cAEtD,aACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,UAAU;AAAA,kBACV,WAAU;AAAA,kBACV,eAAe;AAAA,kBAEf,0BAAAA,MAACI,IAAA,EAAE,WAAU,oBAAmB;AAAA;AAAA,cAClC;AAAA,cAEF,gBAAAJ,MAAC,kBAAe,WAAU,+BAA8B;AAAA,eAC1D;AAAA;AAAA;AAAA,MACF,GACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAM;AAAA,UAEN,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAEC,SAAS,gBAAAA,MAAC,OAAE,WAAU,wCAAwC,iBAAM;AAAA,KACvE;AAEJ;;;ACtYA;AAAA,EACE,cAAAK;AAAA,EACA,uBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,OAEK;AACP,SAAS,cAAc;AACvB,SAAS,MAAAC,YAAU;;;ACVnB;AAAA,EACE,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,MAAAC,YAAU;AAqGb,gBAAAC,OAkFF,QAAAC,cAlFE;AArCN,SAAS,QACP,OACA,aACA,QAAQ,GACR,WAA0B,MAC1B,SAA4B,CAAC,GACV;AACnB,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,EAAE,MAAM,OAAO,SAAS,CAAC;AACrC,QAAI,YAAY,IAAI,KAAK,EAAE,KAAK,KAAK,UAAU;AAC7C,cAAQ,KAAK,UAAU,aAAa,QAAQ,GAAG,KAAK,IAAI,MAAM;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAIA,IAAM,gBAAgB,uBAAO,IAAI,yBAAyB;AAY1D,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,MAAI,CAAC,aAAa;AAChB,WACE,gBAAAD,MAAC,UAAK,WAAU,oDAAmD;AAAA,EAEvE;AACA,MAAI,WAAW;AACb,WACE,gBAAAA,MAAC,UAAK,WAAU,mGAAkG;AAAA,EAEtH;AACA,SACE,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA,cAAc;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ;AAsBA,SAAS,QAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,EAAE,MAAM,MAAM,IAAI;AACxB,QAAM,aAAa,YAAY,IAAI,KAAK,EAAE;AAC1C,QAAM,aAAa,YAAY,IAAI,KAAK,EAAE;AAE1C,QAAM,eAAeP;AAAA,IACnB,CAAC,MAAwB;AACvB,QAAE,gBAAgB;AAClB,UAAI,YAAY;AACd,mBAAW,KAAK,EAAE;AAAA,MACpB,WAAW,KAAK,aAAa;AAC3B,iBAAS,KAAK,EAAE;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,IAAI,KAAK,aAAa,UAAU,UAAU;AAAA,EAC9D;AAEA,QAAM,cAAcA,aAAY,MAAM;AACpC,YAAQ,KAAK,EAAE;AACf,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,MAAM,SAAS,WAAW,CAAC;AAE/B,QAAM,oBAAoBA;AAAA,IACxB,CAAC,MAA2C;AAC1C,0BAAoB,KAAK,IAAI,EAAE,OAAO,OAAO;AAAA,IAC/C;AAAA,IACA,CAAC,KAAK,IAAI,iBAAiB;AAAA,EAC7B;AAEA,SACE,gBAAAS;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,GAAG,MAAM,SAAS,KAAK,EAAE;AAAA,MAC7B,MAAK;AAAA,MACL,iBAAe,KAAK,cAAc,aAAa;AAAA,MAC/C,iBAAe,oBAAoB,aAAa;AAAA,MAChD,aAAW,KAAK;AAAA,MAChB,UAAU,YAAY,IAAI;AAAA,MAC1B,WAAWF;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,cAAc;AAAA,MAChB;AAAA,MACA,OAAO,EAAE,aAAa,QAAQ,WAAW,EAAE;AAAA,MAC3C,SAAS;AAAA,MAGT;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS;AAAA,YACT,eAAW;AAAA,YAEX,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAa,KAAK;AAAA,gBAClB,WAAW,KAAK;AAAA,gBAChB;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAGC,qBAAqB,gBACpB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU;AAAA,YACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,cAAY,UAAU,KAAK,EAAE;AAAA,YAC7B,UAAU;AAAA;AAAA,QACZ;AAAA,QAIF,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,qBAAW,MAAM,KAAK,GAAE;AAAA,QAGzD,KAAK,WACJ,gBAAAA,MAAC,UAAK,WAAU,qCAAoC,aAAU,UAAS,4BAEvE;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAgBA,SAAS,cACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GACA,KACoB;AACpB,QAAM,SAASN,OAAM;AACrB,QAAM,CAAC,WAAW,YAAY,IAAIG,UAAwB,IAAI;AAC9D,QAAM,UAAUD,QAAyB,IAAI;AAK7C,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,UAEhD,aAAa;AAGf,QAAM,gBAAgB,aAAa,QAAQ;AAC3C,EAAAJ,WAAU,MAAM;AACd,QAAI,kBAAkB,EAAG,sBAAqB,aAAa;AAAA,EAC7D,GAAG,CAAC,aAAa,CAAC;AAElB;AAAA,IACE;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAGN,cAAM,KAAK,QAAQ;AACnB,YAAI,CAAC,GAAI;AACT,cAAM,SAAS,YACX,GAAG;AAAA,UACD,eAAe,IAAI,OAAO,SAAS,CAAC;AAAA,QACtC,IACA,GAAG,cAA2B,mBAAmB;AACrD,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,YAAYE;AAAA,IAChB,MAAM,QAAQ,OAAO,WAAW;AAAA,IAChC,CAAC,OAAO,WAAW;AAAA,EACrB;AAGA,QAAM,aAAaA,SAAQ,MAAM;AAC/B,UAAM,MAAM,oBAAI,IAA2B;AAC3C,eAAW,KAAK,UAAW,KAAI,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ;AACxD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,gBAAgBA,SAAiC,MAAM;AAC3D,QAAI,CAAC,gCAAgC,sBAAsB,eAAe;AACxE,aAAO;AAAA,IACT;AACA,UAAM,MAAM,oBAAI,IAAY;AAC5B,eAAW,KAAK,WAAW;AACzB,UAAI,EAAE,aAAa,kBAAmB,KAAI,IAAI,EAAE,KAAK,EAAE;AAAA,IACzD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,8BAA8B,mBAAmB,SAAS,CAAC;AAG/D,QAAM,wBAAwBH;AAAA,IAC5B,CAAC,QAAgB,aAAsB;AACrC,UACE,gCACA,YACA,sBAAsB,eACtB;AACA,6BAAqB,WAAW,IAAI,MAAM,KAAK,IAAI;AAAA,MACrD;AACA,0BAAoB,QAAQ,QAAQ;AAAA,IACtC;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,UAAU,UAAU,CAAC,MAAM,EAAE,KAAK,OAAO,SAAS;AAEvE,QAAM,YAAYA;AAAA,IAChB,CAAC,UAAkB;AACjB,UAAI,UAAU,WAAW,EAAG;AAC5B,YAAM,OAAO,KAAK;AAAA,QAChB;AAAA,QACA,KAAK,IAAI,UAAU,SAAS,GAAG,eAAe,KAAK;AAAA,MACrD;AACA,YAAM,SAAS,UAAU,IAAI;AAC7B,UAAI,QAAQ;AACV,qBAAa,OAAO,KAAK,EAAE;AAE3B,cAAM,KAAK,QAAQ,SAAS;AAAA,UAC1B,IAAI,IAAI,OAAO,GAAG,MAAM,SAAS,OAAO,KAAK,EAAE,EAAE,CAAC;AAAA,QACpD;AACA,YAAI,eAAe,EAAE,OAAO,UAAU,CAAC;AACvC,YAAI,MAAM;AAAA,MACZ;AAAA,IACF;AAAA,IACA,CAAC,WAAW,cAAc,MAAM;AAAA,EAClC;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CAAC,YAA6B;AAC5B,UAAI,QAAQ,KAAK,eAAe,CAAC,YAAY,IAAI,QAAQ,KAAK,EAAE,GAAG;AACjE,iBAAS,QAAQ,KAAK,EAAE;AAAA,MAC1B,WAAW,QAAQ,KAAK,YAAY,QAAQ,KAAK,SAAS,SAAS,GAAG;AACpE,kBAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,CAAC,aAAa,UAAU,SAAS;AAAA,EACnC;AAEA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,YAA6B;AAC5B,UAAI,YAAY,IAAI,QAAQ,KAAK,EAAE,GAAG;AACpC,mBAAW,QAAQ,KAAK,EAAE;AAC1B;AAAA,MACF;AACA,UAAI,QAAQ,aAAa,KAAM;AAC/B,YAAM,YAAY,UAAU;AAAA,QAC1B,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ;AAAA,MAC/B;AACA,UAAI,YAAY,EAAG;AACnB,YAAM,aAAa,UAAU,SAAS;AACtC,UAAI,CAAC,WAAY;AACjB,mBAAa,WAAW,KAAK,EAAE;AAC/B,YAAM,KAAK,QAAQ,SAAS;AAAA,QAC1B,IAAI,IAAI,OAAO,GAAG,MAAM,SAAS,WAAW,KAAK,EAAE,EAAE,CAAC;AAAA,MACxD;AACA,UAAI,MAAM;AAAA,IACZ;AAAA,IACA,CAAC,aAAa,YAAY,WAAW,MAAM;AAAA,EAC7C;AAEA,QAAM,iBAAiBA,aAAY,MAA8B;AAC/D,QAAI,eAAe,EAAG,QAAO;AAC7B,WAAO,UAAU,YAAY,KAAK;AAAA,EACpC,GAAG,CAAC,WAAW,YAAY,CAAC;AAE5B,QAAM,eAAeA;AAAA,IACnB,CAAC,SAAiC;AAChC,UAAI,KAAM,kBAAiB,KAAK,IAAI;AAAA,IACtC;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAA2B;AAC1B,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,oBAAU,CAAC;AACX;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,oBAAU,EAAE;AACZ;AAAA,QAEF,KAAK,cAAc;AACjB,YAAE,eAAe;AACjB,gBAAM,UAAU,eAAe;AAC/B,cAAI,QAAS,kBAAiB,OAAO;AACrC;AAAA,QACF;AAAA,QAEA,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,UAAU,eAAe;AAC/B,cAAI,QAAS,iBAAgB,OAAO;AACpC;AAAA,QACF;AAAA,QAEA,KAAK;AAAA,QACL,KAAK;AACH,YAAE,eAAe;AACjB,uBAAa,eAAe,CAAC;AAC7B;AAAA,QAEF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,gBAAAQ;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAWD,KAAG,gBAAgB,SAAS;AAAA,MACvC,WAAW;AAAA,MAEV,oBAAU,IAAI,CAAC,SACd,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA,aAAa,eAAe,oBAAI,IAAI;AAAA,UACpC,cAAc,CAAC,iBAAiB,cAAc,IAAI,KAAK,KAAK,EAAE;AAAA,UAC9D,WAAW,KAAK,KAAK,OAAO;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,mBACE,oBAAoB,wBAAwB;AAAA,UAE9C,SAAS;AAAA,UACT;AAAA;AAAA,QAfK,KAAK,KAAK;AAAA,MAgBjB,CACD;AAAA;AAAA,EACH;AAEJ;AAEO,IAAM,WAAWT,aAAW,aAAa;;;AD5a1C,SAaQ,OAAAW,OAbR,QAAAC,cAAA;AATN,SAAS,aACP,UACA,iBACA,YACA,gBACA;AACA,SAAO,SAAS,YAAY,MAA2C;AACrE,UAAM,WAAW,KAAK,OAAO,gBAAgB;AAC7C,WACE,gBAAAA,OAAC,UAAK,WAAU,oDACb;AAAA,eAAS,IAAI,CAAC,QAAQ;AACrB,cAAM,WAAWC;AAAA,UACf,IAAI;AAAA,UACJ;AAAA,QACF;AACA,cAAM,QAAQ,KAAK,KAAK,IAAI,GAAG;AAC/B,eACE,gBAAAF;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,OAAO,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI;AAAA,YAExD,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,KAAK,KAAK;AAAA,gBACV,SAAS,IAAI;AAAA;AAAA,YACf;AAAA;AAAA,UARK,IAAI;AAAA,QASX;AAAA,MAEJ,CAAC;AAAA,MACA,cACC,gBAAAA,MAAC,UAAK,WAAU,oBACd,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,uBAAW,IAAI;AAAA,UACjB;AAAA,UACA,cAAW;AAAA,UACX,WAAWG;AAAA,YACT;AAAA,YACA,WACI,gBACA;AAAA,UACN;AAAA,UAEA,0BAAAH,MAAC,UAAO,WAAU,eAAc;AAAA;AAAA,MAClC,GACF;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,0BAA0B,OAKhC;AACD,SAAO;AAAA,IACL,WAAW,MAAM,aAAa;AAAA,IAC9B,SAAS,MAAM,WAAW;AAAA,IAC1B,aAAa,MAAM,eAAe;AAAA,IAClC,eAAe,MAAM,iBAAiB;AAAA,EACxC;AACF;AAOA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAO8B;AAC5B,MAAI,aAAa,MAAM,WAAW,GAAG;AACnC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAWG;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACD;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,WAAWG,KAAG,6CAA6C,SAAS;AAAA,QAEnE,0BAAgB,kBAAkB,WAAW;AAAA;AAAA,IAChD;AAAA,EAEJ;AAEA,MAAI,CAAC,aAAa,MAAM,WAAW,GAAG;AACpC,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACD;AAAA;AAAA,UACK;AAAA,UAAY;AAAA;AAAA;AAAA,IAClB;AAAA,EAEJ;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,oBACA,mBAC2D;AAC3D,MAAI,CAAC,mBAAoB,QAAO;AAChC,SAAO,CAAC,MAAuB,UAAmC;AAChE,UAAM,WAAW,mBAAmB,MAAM,KAAK;AAC/C,QAAI,aAAa,KAAM,QAAO;AAC9B,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,sBACP,eACA,OAOA;AACA,SAAO;AAAA,IACL,qBAAqB,gBAAgB,SAAY,MAAM;AAAA,IACvD,gBAAgB,gBAAgB,SAAY,MAAM;AAAA,IAClD,aAAa,gBAAgB,MAAM,cAAc;AAAA,IACjD,mBAAmB,gBAAgB,MAAM,oBAAoB;AAAA,IAC7D,8BAA8B,gBAC1B,MAAM,+BACN;AAAA,EACN;AACF;AAQA,SAAS,gBACP,OACA,KACoB;AACpB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,WAAW,SAAS,aAAa,cAAc,IACrD,0BAA0B,KAAK;AAEjC,QAAM,UAAUC,QAAuB,IAAI;AAE3C,EAAAC,qBAAoB,KAAK,OAAO;AAAA,IAC9B,QAAQ;AACN,cAAQ,SAAS,MAAM;AAAA,IACzB;AAAA,EACF,EAAE;AAEF,QAAM,WAAWC,SAAQ,MAAM;AAC7B,QAAI,UAAW,uBAAsB,SAAS;AAC9C,WAAO,eAAe,QAAQ,QAAQ;AAAA,EACxC,GAAG,CAAC,QAAQ,UAAU,SAAS,CAAC;AAIhC,QAAM,kBAAkBF,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAE1B,QAAM,YAAY,sBAAsB,eAAe;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,oBAAoBE;AAAA,IACxB,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF;AAAA,IACF,CAAC,UAAU,UAAU,qBAAqB,SAAS;AAAA,EACrD;AAEA,QAAM,aAAaA;AAAA,IACjB,MAAM,kBAAkB,oBAAoB,iBAAiB;AAAA,IAC7D,CAAC,oBAAoB,iBAAiB;AAAA,EACxC;AAEA,QAAM,aAAa,iBAAiB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,WAAY,QAAO;AAEvB,SACE,gBAAAN,MAAC,SAAI,WAAWG,KAAG,qBAAqB,SAAS,GAC/C,0BAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB,UAAU;AAAA,MAC1B;AAAA,MACA,aAAa,UAAU;AAAA,MACvB,mBAAmB,UAAU;AAAA,MAC7B,8BAA8B,UAAU;AAAA,MACxC;AAAA,MACA,WAAU;AAAA;AAAA,EACZ,GACF;AAEJ;AAEO,IAAM,aAAaO,aAAW,eAAe;;;AEtVpD,OAAOC,WAAS,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,YAAU,aAAAC,mBAAiB;AAC5D,SAAS,UAAAC,SAAQ,KAAAC,IAAG,eAAAC,oBAAmB;AACvC,SAAS,MAAAC,YAAU;AAMnB,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,yBAAyB;;;ACLlC,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAGlE,SAAS,oBAAoB;;;ACpB7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwBA,SAAS,sBAAsB,QAAuC;AAC3E,QAAM,aAAa,OAAO,cAAc,CAAC;AACzC,QAAM,OAAO,OAAO,KAAK,UAAU;AACnC,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC;AAE/B,QAAM,cAAc,IAAI,IAAK,OAAO,YAAqC,CAAC,CAAC;AAG3E,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,UAAU,WAAW,MAAM,KAAK;AAEtC,SAAO,QAAQ,IAAI,CAAC,QAAQ;AAC1B,UAAM,WAAW,WAAW,GAAG;AAC/B,WAAO;AAAA,MACL;AAAA,MACA,OAAO,cAAc,KAAK,QAAQ;AAAA,MAClC,UAAU,YAAY,IAAI,GAAG;AAAA,MAC7B,aAAa,iBAAiB,QAAQ;AAAA,MACtC,aAAa,oBAAoB,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAOA,SAAS,WAAW,MAAgB,OAA4B;AAC9D,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,QAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,OAAO;AACvB,QAAI,OAAO,IAAI,GAAG,GAAG;AACnB,cAAQ,KAAK,GAAG;AAChB,aAAO,OAAO,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,IAAI,GAAG,GAAG;AACnB,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;;;ADRA,SAAS,gBAAgB,MAAc,cAAqC;AAC1E,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO,EAAE,MAAM,OAAO,UAAU,CAAC,EAAE;AAGjD,MAAI,gBAAgB,aAAa,SAAS,GAAG;AAC3C,UAAM,QAAsB,aAAa,IAAI,CAAC,SAAS;AAAA,MACrD,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,IACT,EAAE;AACF,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,EAAE,MAAM,OAAO,UAAU,MAAM;AAAA,IACxC;AACA,WAAO,EAAE,MAAM,OAAO,UAAU,CAAC,EAAE,MAAM,MAAM,UAAU,MAAM,CAAC,EAAE;AAAA,EACpE;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,EAAE,MAAM,QAAQ,KAAK,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,aAAa;AAAA,EACb;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAgD;AAC9C,QAAM,YAAYC;AAAA,IAChB,MAAO,SAAS,sBAAsB,MAAM,IAAI,CAAC;AAAA,IACjD,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,SAAS;AAErC,QAAM,eAAe,CAAC,aACjB,MAAM;AACL,UAAM,QAAQ,aAAa,KAAK;AAChC,WAAO,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,QAAQ,WAC1C,MAAM,CAAC,EAAE,QACT;AAAA,EACN,GAAG,IACH;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,YAAY;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA;AAAA,IACtC;AAAA,EACF;AAIA,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAAuB,MACzD,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,EACrC;AAEA,QAAM,aAAaD;AAAA,IACjB,MAAO,CAAC,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,IAC3C,CAAC,OAAO,SAAS;AAAA,EACnB;AACA,QAAM,cAAc,YAAY,aAAa;AAE7C,QAAM,kBAAkBA;AAAA,IACtB,MAAM,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAAA,IAC3C,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,iBAAiBA,SAA2B,MAAM;AACtD,QAAI,CAAC,aAAa,gBAAgB,WAAW,SAAS,GAAG,EAAG,QAAO,CAAC;AACpE,UAAM,YAAY,UAAU,OAAO,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,GAAG,CAAC;AACrE,QAAI,CAAC,WAAW,KAAK,EAAG,QAAO;AAC/B,UAAM,QAAQ,WAAW,YAAY;AACrC,WAAO,UAAU,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EACxE,GAAG,CAAC,YAAY,cAAc,WAAW,WAAW,eAAe,CAAC;AAGpE,QAAM,cAAcE,QAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,gBAAgBA,QAAO,UAAU;AACvC,gBAAc,UAAU;AACxB,QAAM,kBAAkBA,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAC1B,QAAM,gBAAgBA,QAAO,UAAU;AACvC,gBAAc,UAAU;AACxB,QAAM,eAAeA,QAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,eAAeA,QAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,oBAAoBA,QAAO,cAAc;AAC/C,oBAAkB,UAAU;AAC5B,QAAM,cAAcA,QAAO,QAAQ;AACnC,cAAY,UAAU;AAItB,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,QAAQ,aAAa,KAAK;AAChC,QAAI,MAAM,WAAW,GAAG;AACtB,oBAAc,CAAC,CAAC;AAChB,oBAAc,EAAE;AAChB,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,CAAC;AAGrB,QAAM,kBAAkBD,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAE1B,QAAM,eAAeA,QAAO,KAAK;AACjC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,aAAa,SAAS;AACzB,mBAAa,UAAU;AACvB;AAAA,IACF;AACA,QAAI,SAAS,cAAc,UAAW;AACtC,QAAI,WAAW,KAAK,EAAE,SAAS,YAAY,QAAS;AACpD,UAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAY,QAAQ,gBAAgB,YAAY,gBAAgB,OAAO,CAAC;AAAA,IAC1E,GAAG,UAAU;AACb,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,YAAY,MAAM,YAAY,SAAS,CAAC;AAG5C,QAAM,cAAcC,aAAY,CAAC,UAAwB;AACvD,gBAAY,QAAQ,EAAE,MAAM,OAAO,UAAU,MAAM,CAAC;AAAA,EACtD,GAAG,CAAC,CAAC;AAIL,QAAM,uBAAuBA,aAAY,CAAC,UAAwB;AAChE,UAAM,eAAe,aAAa,QAC/B,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,GAAG;AACnB,QAAI,aAAa,WAAW,EAAG,QAAO;AACtC,UAAM,cAAc,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACnD,WAAO,aAAa,MAAM,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAGL,QAAM,UAAUA,aAAY,CAAC,SAAiB;AAC5C,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,gBAAgB,WAAW,aAAa,QAAQ,CAAC,KAAK;AACpE,QAAI,CAAC,MAAO;AACZ,UAAM,UAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,KAAK,MAAM;AAAA,MACX,OAAO;AAAA,IACT;AACA,UAAM,YAAY,CAAC,GAAG,cAAc,SAAS,OAAO;AACpD,kBAAc,SAAS;AACvB,kBAAc,EAAE;AAChB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB;AACzB,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,kBAAc,EAAE;AAChB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA;AAAA,IACxB,CAAC,MAA2C;AAC1C,oBAAc,EAAE,OAAO,KAAK;AAAA,IAC9B;AAAA,IACA,CAAC;AAAA,EACH;AAKA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,MAAsD;AACrD,UACE,CAAC,aAAa,WACd,gBAAgB,WAChB,kBAAkB,QAAQ,WAAW,KACrC,CAAC,cAAc,QAAQ,KAAK,GAC5B;AACA,eAAO;AAAA,MACT;AACA,QAAE,eAAe;AACjB,sBAAgB,kBAAkB,QAAQ,CAAC,CAAC;AAC5C,oBAAc,EAAE;AAChB,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAIA,QAAM,qBAAqBA,aAAY,MAAe;AACpD,UAAM,UAAU,cAAc,QAAQ,KAAK;AAC3C,QAAI,SAAS;AACX,cAAQ,OAAO;AACf,aAAO;AAAA,IACT;AACA,QAAI,CAAC,gBAAgB,SAAS;AAC5B,UAAI,qBAAqB,cAAc,OAAO,GAAG;AAC/C,oBAAY,cAAc,OAAO;AAAA,MACnC,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,aAAa,oBAAoB,CAAC;AAG/C,QAAM,oBAAoBA,aAAY,MAAM;AAC1C,QAAI,cAAc,QAAQ,KAAK,EAAE,UAAU,YAAY,SAAS;AAC9D,kBAAY;AAAA,QACV,gBAAgB,cAAc,SAAS,gBAAgB,OAAO;AAAA,MAChE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,QAAI,aAAa,SAAS;AACxB,UAAI,gBAAgB,SAAS;AAC3B,wBAAgB,IAAI;AAAA,MACtB,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC3C,sBAAc,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,kBAAY,QAAQ,EAAE,MAAM,OAAO,UAAU,CAAC,EAAE,CAAC;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA;AAAA,IACpB,CAAC,MAAsD;AACrD,WAAK,EAAE,QAAQ,SAAS,EAAE,QAAQ,YAAY,qBAAqB,CAAC,GAAG;AACrE,eAAO;AAAA,MACT;AAEA,UAAI,EAAE,QAAQ,SAAS;AACrB,UAAE,eAAe;AACjB,YAAI,aAAa,SAAS;AACxB,iBAAO,mBAAmB;AAAA,QAC5B;AACA,0BAAkB;AAClB,eAAO;AAAA,MACT;AAEA,UAAI,EAAE,QAAQ,eAAe,cAAc,YAAY,IAAI;AACzD,6BAAqB;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAMA,QAAM,eAAeA,aAAY,MAAe;AAC9C,QAAI,aAAa,SAAS;AACxB,YAAM,UAAU,cAAc,QAAQ,KAAK;AAC3C,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,MACjB,WAAW,CAAC,gBAAgB,SAAS;AACnC,YAAI,qBAAqB,cAAc,OAAO,GAAG;AAC/C,sBAAY,cAAc,OAAO;AAAA,QACnC,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,WAAW,cAAc,QAAQ,KAAK,EAAE,UAAU,YAAY,SAAS;AACrE,kBAAY;AAAA,QACV,gBAAgB,cAAc,SAAS,gBAAgB,OAAO;AAAA,MAChE;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,aAAa,oBAAoB,CAAC;AAG/C,QAAM,mBAAmBA,aAAY,CAAC,UAAkB;AACtD,UAAM,OAAO,cAAc,QAAQ,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAC/D,kBAAc,IAAI;AAClB,gBAAY,QAAQ,EAAE,MAAM,OAAO,UAAU,KAAK,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,kBAAc,EAAE;AAChB,oBAAgB,IAAI;AACpB,kBAAc,CAAC,CAAC;AAChB,gBAAY,QAAQ,EAAE,MAAM,OAAO,UAAU,CAAC,EAAE,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA;AAAA,IAClB,CAAC,MAA8B,gBAAgB,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEtYA,SAAgB,UAAAC,SAAQ,aAAAC,mBAAiB;AAmBrC,gBAAAC,aAAA;AAfG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,WAAWC,QAAyB,IAAI;AAE9C,EAAAC,YAAU,MAAM;AACd,QAAI,UAAW,UAAS,SAAS,MAAM;AAAA,EACzC,GAAG,CAAC,SAAS,CAAC;AAEd,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,SAAS;AACrB,YAAE,eAAe;AACjB,gBAAM,UAAU,MAAM,KAAK;AAC3B,cAAI,QAAS,UAAS,OAAO;AAAA,QAC/B,WAAW,EAAE,QAAQ,UAAU;AAC7B,YAAE,eAAe;AACjB,mBAAS;AAAA,QACX,WAAW,EAAE,QAAQ,eAAe,UAAU,IAAI;AAChD,YAAE,eAAe;AACjB,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA;AAAA,MACA,WAAU;AAAA;AAAA,EACZ;AAEJ;;;ACtCA,SAAgB,aAAAG,aAAW,YAAAC,kBAAgB;AAC3C,SAAS,MAAAC,YAAU;AAoFX,gBAAAC,OAqBA,QAAAC,cArBA;AAhFD,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AACvC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,CAAC;AAE1D,QAAM,aAAwB,SAAS,QAAqB,CAAC;AAC7D,QAAM,YACH,cAAc,aAAoD,CAAC;AAEtE,QAAM,QAAQ,WAAW,IAAI,CAAC,SAAS;AAAA,IACrC,OAAO;AAAA,IACP,OAAO,UAAU,GAAG,KAAK;AAAA,EAC3B,EAAE;AAEF,QAAM,WAAW,SACb,MAAM;AAAA,IAAO,CAAC,SACZ,KAAK,MAAM,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC;AAAA,EACxD,IACA;AAGJ,EAAAC,YAAU,MAAM;AACd,wBAAoB,CAAC;AAAA,EACvB,GAAG,CAAC,SAAS,QAAQ,MAAM,CAAC;AAG5B,EAAAA,YAAU,MAAM;AACd,QAAI,WAAW;AACb,4BAAsB,MAAM,QAAQ,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,WAAS,aAAa,KAAa;AACjC,aAAS,GAAG;AACZ,YAAQ,KAAK;AACb,cAAU,EAAE;AAAA,EACd;AAEA,WAAS,iBAAiB,MAAe;AACvC,YAAQ,IAAI;AACZ,QAAI,CAAC,KAAM,WAAU,EAAE;AAAA,EACzB;AAEA,WAAS,cAAc,GAAwB;AAC7C,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,cAAQ,KAAK;AACb,eAAS;AACT;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAe;AACjB,0BAAoB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC;AAC/D;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,WAAW;AACvB,QAAE,eAAe;AACjB,0BAAoB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,SAAS;AACrB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,YAAM,OAAO,SAAS,gBAAgB;AACtC,UAAI,KAAM,cAAa,KAAK,KAAK;AACjC;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAF,OAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,oBAAAD,MAAC,kBAAe,SAAO,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,IAAI;AAAA,QAE1B,yBAAe;AAAA;AAAA,IAClB,GACF;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,QAEzC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,WAAS;AAAA,cACT,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,cACzC,WAAW;AAAA,cACX,aAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,gBAAAC,OAAC,SACE;AAAA,qBAAS,WAAW,KACnB,gBAAAD,MAAC,OAAE,WAAU,6CAA4C,wBAEzD;AAAA,YAED,SAAS,IAAI,CAAC,MAAM,MACnB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAWI;AAAA,kBACT;AAAA,kBACA,MAAM,mBACF,qCACA;AAAA,gBACN;AAAA,gBACA,aAAa,CAAC,MAAM;AAClB,oBAAE,eAAe;AACjB,+BAAa,KAAK,KAAK;AAAA,gBACzB;AAAA,gBACA,cAAc,MAAM,oBAAoB,CAAC;AAAA,gBAExC,eAAK;AAAA;AAAA,cAdD,KAAK;AAAA,YAeZ,CACD;AAAA,aACH;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AClIO,SAAS,oBACd,UACA,UACc;AAEd,QAAM,aAAa,SAAS,aAAa;AACzC,MAAI,cAAc,SAAS,UAAU,GAAG;AACtC,WAAO,SAAS,UAAU;AAAA,EAC5B;AAGA,MAAI,SAAS,QAAQ,SAAS,KAAK,SAAS,KAAK,SAAS,MAAM,GAAG;AACjE,WAAO,SAAS,MAAM;AAAA,EACxB;AAGA,SAAO,SAAS,MAAM;AACxB;;;ACpBO,IAAM,yBAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,MAAM;AACR;;;ANoHI,SAgOA,YAAAC,WApNM,OAAAC,OAZN,QAAAC,cAAA;AAtCJ,SAAS,sBACP,OACwB;AACxB,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,YAAY,MAAM,cAAc;AAAA,IAChC,UAAU,MAAM,YAAY;AAAA,IAC5B,kBAAkB,MAAM,oBAAoB;AAAA,IAC5C,UAAU,MAAM,YAAY;AAAA,EAC9B;AACF;AAiBA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,SACE,gBAAAA,OAAC,WAAQ,MAAM,eAAe,cAAc,eAAe,OAAO,OAChE;AAAA,oBAAAD,MAAC,kBAAe,SAAO,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,wBAAc,CAAC,MAAM,CAAC,CAAC;AACvB,mBAAS,SAAS,MAAM;AAAA,QAC1B;AAAA,QAEA,0BAAAA,MAACE,cAAA,EAAY,WAAU,WAAU;AAAA;AAAA,IACnC,GACF;AAAA,IACA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,WAAWG,KAAG,YAAY,CAAC,mBAAmB,QAAQ;AAAA,QACtD,OAAM;AAAA,QACN,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,QACzC,gBAAgB,CAAC,MAAM,EAAE,eAAe;AAAA,QAEvC,yBAAe,IAAI,CAAC,OAAO,MAC1B,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAWG;AAAA,cACT;AAAA,cACA,MAAM,mBACF,qCACA;AAAA,YACN;AAAA,YACA,aAAa,CAAC,MAAM;AAClB,gBAAE,eAAe;AACjB,gBAAE,gBAAgB;AAClB,0BAAY,KAAK;AAAA,YACnB;AAAA,YACA,cAAc,MAAM,oBAAoB,CAAC;AAAA,YAExC,gBAAM;AAAA;AAAA,UAfF,MAAM;AAAA,QAgBb,CACD;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAsBA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,MAAI,gBAAgB,eAAe;AACjC,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,aAAa;AAAA,QACvB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU,CAAC,MACT,kBAAkB;AAAA,UAChB,QAAQ,EAAE,OAAO,EAAE;AAAA,QACrB,CAAwC;AAAA,QAE1C,UAAU,CAAC,MAAM;AACf,2BAAiB,CAAC;AAClB,gCAAsB,MAAM,SAAS,SAAS,MAAM,CAAC;AAAA,QACvD;AAAA,QACA,UAAU,MAAM;AACd,6BAAmB;AACnB,gCAAsB,MAAM,SAAS,SAAS,MAAM,CAAC;AAAA,QACvD;AAAA,QACA,aAAa,aAAa,eAAe;AAAA,QACzC,WAAS;AAAA;AAAA,IACX;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb;AAAA,MACA,cAAa;AAAA,MACb,WAAU;AAAA;AAAA,EACZ;AAEJ;AAuBA,SAAS,sBAAsB,KAAmC;AAChE,MAAI,CAAC,IAAI,aAAa,IAAI,aAAc,QAAO;AAC/C,MAAI,mBAAmB,IAAI;AAC3B,MAAI,CAAC,IAAI,eAAe;AACtB,QAAI,cAAc,IAAI;AAAA,EACxB,OAAO;AACL,QAAI;AAAA,MAAoB,CAAC,MACvB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SAAS,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAmC;AAClE,MAAI,CAAC,IAAI,gBAAiB,QAAO;AACjC,MAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,WAAW,KAAK,EAAG,QAAO;AAC3D,QAAM,UAAU,KAAK,IAAI,IAAI,kBAAkB,IAAI,eAAe,SAAS,CAAC;AAC5E,MAAI,WAAW,KAAK,IAAI,eAAe,OAAO,GAAG;AAC/C,QAAI,mBAAmB,KAAK;AAC5B,QAAI,YAAY,IAAI,eAAe,OAAO,CAAC;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBACP,GACA,KACM;AACN,MAAI,EAAE,QAAQ,eAAe,sBAAsB,GAAG,GAAG;AACvD,MAAE,eAAe;AACjB;AAAA,EACF;AACA,MAAI,EAAE,QAAQ,aAAa,IAAI,iBAAiB;AAC9C,MAAE,eAAe;AACjB,QAAI,mBAAmB,IAAI;AAC3B,QAAI,oBAAoB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AACjD;AAAA,EACF;AACA,MAAI,EAAE,QAAQ,WAAW,wBAAwB,GAAG,GAAG;AACrD,MAAE,eAAe;AACjB;AAAA,EACF;AACA,QAAM,eAAe,IAAI,cAAc,CAAC;AACxC,MAAI,EAAE,QAAQ,SAAS;AACrB,QAAI,mBAAmB,KAAK;AAC5B,QAAI,cAAc,CAAC,CAAC,YAAY;AAAA,EAClC;AACF;AAMA,SAAS,mBACP,WACA,gBACA,iBACA,aACQ;AACR,QAAM,qBAAqB,YAAY,kBAAkB;AACzD,MAAI,cAAc,kBAAkB,iBAAkB,QAAO;AAC7D,SAAO,eAAe;AACxB;AAYA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,SACE,gBAAAA,MAAAD,WAAA,EACG,gBAAM,IAAI,CAAC,MAAM,MAAM;AACtB,UAAM,WAAW,QAAQ,aAAa,KAAK,GAAG;AAC9C,UAAM,QAAQ,WAAWK,eAAc,KAAK,KAAK,QAAQ,IAAI,KAAK;AAClE,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK;AAAA,QAC9B,UAAU,MAAM,SAAS,CAAC;AAAA;AAAA,MAFrB,GAAG,KAAK,GAAG,IAAI,KAAK,KAAK;AAAA,IAGhC;AAAA,EAEJ,CAAC,GACH;AAEJ;AAMA,SAAS,sBACP,cACA,UAIA;AACA,MAAI,CAAC,aAAc,QAAO,EAAE,QAAQ,MAAM,SAAS,CAAC,EAAE;AACtD,SAAO;AAAA,IACL,QAAQ,oBAAoB,aAAa,UAAU,QAAQ;AAAA,IAC3D,SACG,aAAa,SAAS,cAAc,KAAiC,CAAC;AAAA,EAC3E;AACF;AAcA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AACzC,SACE,gBAAAC,OAAAF,WAAA,EACG;AAAA,KAAC,WACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,kBAAQ;AAAA,QACV;AAAA,QACA,WAAU;AAAA,QACV,cAAW;AAAA,QAEX,0BAAAA,MAACK,IAAA,EAAE,WAAU,WAAU;AAAA;AAAA,IACzB;AAAA,IAED,oBAAoB,SAAS,cAC5B,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,mBAAS;AAAA,QACX;AAAA,QACD;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ;AAMA,SAAS,oBACP,QACsB;AACtB,SAAO,SACH,EAAE,GAAG,wBAAwB,GAAG,OAAO,IACvC;AACN;AAMO,SAAS,YAAY,OAA6C;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,MAAM,YAAY,UAAU,kBAAkB,SAAS,IAC7D,sBAAsB,KAAK;AAE7B,QAAM,WAAWM,QAAyB,IAAI;AAC9C,QAAM,eAAeA,QAAuB,IAAI;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIC,WAAS,KAAK;AAClD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,EAAE;AAC3D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,KAAK;AAG5D,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,aAAS,gBAAgB,GAAe;AACtC,UACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,EAAE,MAAc,GAC/C;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,eAAe;AACtD,WAAO,MAAM,SAAS,oBAAoB,aAAa,eAAe;AAAA,EACxE,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,iBAAiBC;AAAA,IACrB,MAAM,oBAAoB,aAAa;AAAA,IACvC,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,UAAU,kBAAkB,KAAK,KAAK,eAAe;AAE3D,EAAAD,YAAU,MAAM;AACd,wBAAoB,EAAE;AAAA,EACxB,GAAG,CAAC,gBAAgB,UAAU,CAAC;AAE/B,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA,YAAY,SAAS;AAAA,IACrB,iBAAiB;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,oBAAoB,aAAa,CAAC;AACxC,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,kBAAkB,iBAAiB,eAAe,SAAS;AAEjE,QAAM,cAAcE,QAAM;AAAA,IACxB,CAAC,UAA2B;AAC1B,kBAAY,KAAK;AACjB,oBAAc,KAAK;AACnB,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,EAAE,QAAQ,eAAe,SAAS,qBAAqB,IAC3D,sBAAsB,cAAc,cAAc;AAEpD,QAAM,aAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,gBAAAT;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAWE;AAAA,QACT;AAAA,QACA,WAAW,kCAAkC;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,SAAS,MAAM,CAAC,YAAY,SAAS,SAAS,MAAM;AAAA,MACpD,QAAQ,CAAC,MAAM;AACb,cAAM,gBAAgB,EAAE;AACxB,YAAI,iBAAiB,CAAC,EAAE,cAAc,SAAS,aAAa,GAAG;AAC7D,wBAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAH,MAACW,SAAA,EAAO,WAAU,0CAAyC;AAAA,QAG1D,aACC,gBAAAX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA,QAID,gBACC,gBAAAC,OAAC,UAAK,WAAU,8GACb;AAAA,uBAAa;AAAA,UAAM;AAAA,WACtB;AAAA,QAIF,gBAAAA,OAAC,SAAI,WAAU,gDACZ;AAAA,+BACC,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UAGF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,UAAU;AAAA,cACvD,eAAe,CAAC,MAAM;AACpB,kCAAkB,CAAC;AACnB,mCAAmB,KAAK;AAAA,cAC1B;AAAA,cACA,cAAc,MAAM;AAClB,oBAAI,aAAa,CAAC,aAAc,oBAAmB,KAAK;AAAA,cAC1D;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT,UAAU,MAAM;AAGd,kBAAI,aAAa,GAAG;AAClB,mCAAmB,KAAK;AACxB,8BAAc,IAAI;AAClB,yBAAS,SAAS,MAAM;AAAA,cAC1B;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAOA,SAAS,WAAW,EAAE,OAAO,SAAS,GAAwC;AAC5E,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MAET;AAAA;AAAA,QACD,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,uBAAS;AAAA,YACX;AAAA,YACA,WAAU;AAAA,YACV,cAAY,iBAAiB,KAAK;AAAA,YAElC,0BAAAA,MAACK,IAAA,EAAE,WAAU,WAAU;AAAA;AAAA,QACzB;AAAA;AAAA;AAAA,EACF;AAEJ;;;AO1qBA,SAAS,YAAY;AAyBf,gBAAAO,aAAA;AAZN,SAAS,gBAAgB,EAAE,UAAU,QAAQ,GAAU;AACrD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACA,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,SAAS,WAAW,IAAI;AAAA,QACxB,QAAQ,WAAW,YAAY;AAAA,MACjC;AAAA,MAEA,0BAAAA,MAAC,QAAK,MAAM,IAAI;AAAA;AAAA,EAClB;AAEJ;AAEA,IAAO,0BAAQ;;;AC9Bf,SAAS,KAAAC,IAAG,YAAY;AAiCd,gBAAAC,OAIA,QAAAC,cAJA;AAhBV,SAAS,uBAAuB,EAAE,MAAM,WAAW,SAAS,GAAU;AACpE,QAAM,iBAAiB,CAAC,MAAwB;AAC9C,UAAM,kBAAkB,EAAE;AAC1B,cAAU,MAAM,eAAe;AAAA,EACjC;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,YAAY,aAAa,KAAK,KAAK;AAAA,QACnC,iBAAiB;AAAA,MACnB;AAAA,MAEA,0BAAAC,OAAC,eAAY,SAAQ,iBAAgB,MAAK,UAAS,OAAM,cACvD;AAAA,wBAAAA,OAAC,SAAI,WAAU,kCACb;AAAA,0BAAAD,MAAC,OAAE,WAAU,kCAAkC,eAAK,OAAM;AAAA,UAC1D,gBAAAA,MAAC,OAAE,WAAU,0CACV,eAAK,aACR;AAAA,UACA,gBAAAC,OAAC,OAAE,WAAU,2CAA0C;AAAA;AAAA,YACnD,KAAK;AAAA,aACT;AAAA,WACF;AAAA,QACA,gBAAAA,OAAC,eAAY,KAAK,GAAG,MAAK,UAAS,OAAO,EAAE,YAAY,EAAE,GACxD;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAM;AAAA,cAEN;AAAA,gCAAAD,MAAC,QAAK,MAAM,IAAI;AAAA,gBAAE;AAAA;AAAA;AAAA,UAEpB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,cAC/B,OAAM;AAAA,cAEN,0BAAAA,MAACE,IAAA,EAAE,MAAM,IAAI;AAAA;AAAA,UACf;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;;;ACjEf,SAAS,cAAc;;;ACAvB,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,cAAc;AA8BvB,SAAS,WAAW,MAAuC;AACzD,SAAO,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK;AACpD;AAEA,SAAS,YAAY,OAA6C;AAChE,SAAO,GAAG,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK;AACvD;AAEA,SAAS,OAAe;AACtB,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAqBA,IAAM,qBAAqB;AAE3B,IAAM,eAAe,OAAuB;AAAA,EAC1C;AAAA,IACE,CAAC,KAAK,SAAS;AAAA,MACb,OAAO,CAAC;AAAA,MAER,UAAU,CAAC,WAAW;AACpB,cAAM,eAAe,IAAI,EAAE;AAC3B,cAAM,eAAe,IAAI,IAAI,aAAa,IAAI,UAAU,CAAC;AAEzD,cAAM,WAAW,OACd;AAAA,UACC,CAAC,WAA0B;AAAA,YACzB,IAAI,KAAK;AAAA,YACT,MAAM,MAAM;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,OAAO,MAAM;AAAA,YACb,aAAa,MAAM;AAAA,YACnB,OAAO,MAAM;AAAA,UACf;AAAA,QACF,EACC,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,YAAY,IAAI,CAAC,CAAC;AAExD,YAAI,SAAS,WAAW,GAAG;AACzB;AAAA,YACE;AAAA,UACF;AACA;AAAA,QACF;AAEA,YAAI,eAAe,CAAC,GAAG,cAAc,GAAG,QAAQ;AAEhD,YAAI,aAAa,SAAS,oBAAoB;AAC5C,gBAAM,WAAW,aAAa,SAAS;AACvC,yBAAe,aAAa,MAAM,QAAQ;AAC1C;AAAA,YACE;AAAA,YACA,EAAE,SAAS;AAAA,UACb;AAAA,QACF;AAEA,eAAO,6BAA6B;AAAA,UAClC,OAAO,SAAS;AAAA,UAChB,OAAO,aAAa;AAAA,UACpB,mBAAmB,OAAO,SAAS,SAAS;AAAA,QAC9C,CAAC;AAED,YAAI,EAAE,OAAO,aAAa,CAAC;AAAA,MAC7B;AAAA,MAEA,YAAY,CAAC,WAAW;AACtB,cAAM,eAAe,IAAI,EAAE;AAC3B,cAAM,eAAe,aAAa,OAAO,CAAC,SAAS,KAAK,OAAO,MAAM;AAErE,YAAI,aAAa,WAAW,aAAa,QAAQ;AAC/C,iBAAO,gDAAgD,EAAE,OAAO,CAAC;AACjE;AAAA,QACF;AAEA,eAAO,+BAA+B;AAAA,UACpC;AAAA,UACA,gBAAgB,aAAa;AAAA,QAC/B,CAAC;AACD,YAAI,EAAE,OAAO,aAAa,CAAC;AAAA,MAC7B;AAAA,MAEA,OAAO,MAAM;AACX,cAAM,eAAe,IAAI,EAAE,MAAM;AACjC,eAAO,0BAA0B,EAAE,cAAc,aAAa,CAAC;AAC/D,YAAI,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,IAAO,yBAAQ;;;AD5HT,SACE,OAAAC,OADF,QAAAC,cAAA;AANN,SAAS,cAAc,EAAE,UAAU,GAAU;AAC3C,QAAM,EAAE,OAAO,YAAY,MAAM,IAAI,uBAAa;AAGlD,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,gBAAAA,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,UAAU,OAAO,QAAQ,GACjE;AAAA,sBAAAD,MAAC,OAAE,WAAU,iCAAgC,mCAAqB;AAAA,MAClE,gBAAAA,MAAC,OAAE,WAAU,sCAAqC,kDAElD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,WAAW;AAAA,MACb;AAAA,MAGA;AAAA,wBAAAD,MAAC,cAAW,WAAU,sBACpB,0BAAAA,MAAC,eAAY,KAAK,GACf,gBAAM,IAAI,CAAC,SACV,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA,UAAU;AAAA;AAAA,UAHL,KAAK;AAAA,QAIZ,CACD,GACH,GACF;AAAA,QAEA,gBAAAA,MAACE,YAAA,EAAU;AAAA,QAGX,gBAAAF,MAAC,SAAI,OAAO,EAAE,SAAS,YAAY,YAAY,EAAE,GAC/C,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YAET;AAAA,8BAAAD,MAAC,UAAO,MAAM,IAAI;AAAA,cAAE;AAAA,cACR,MAAM;AAAA,cAAO;AAAA;AAAA;AAAA,QAC3B,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;","names":["React","cn","jsx","cva","cn","jsx","React","cva","cn","jsx","React","cn","React","cn","jsx","jsx","jsx","IconButton","cn","React","cn","jsx","React","cn","jsx","CollapsibleTrigger","CollapsibleContent","React","cn","React","cn","jsx","jsxs","jsx","jsxs","cn","React","Check","cn","jsx","jsxs","React","cn","jsx","jsx","React","cn","useLocale","React","cn","jsx","React","ChevronRight","cn","jsx","jsxs","jsx","jsxs","useLocale","cn","React","cn","jsx","jsxs","cn","React","cn","formatIsoDate","jsx","jsxs","formatIsoDate","cn","React","Check","cn","jsx","jsxs","cva","cn","React","cn","jsx","jsx","cn","cva","React","cva","cn","jsx","Label","React","cn","jsx","jsxs","React","cn","jsx","Separator","React","cn","jsx","React","DialogPrimitive","X","cn","jsx","jsxs","cn","jsx","cn","jsx","gapMap","alignMap","justifyMap","cn","jsx","cn","jsx","React","cn","jsx","Check","React","cn","React","React","React","jsx","value","disabled","cn","tabStopId","onKeyDown","Check","SeparatorPrimitive","useCallback","useEffect","useMemo","useRef","useState","ChevronRight","cn","React","Fragment","jsx","jsxs","resolveCellRenderer","React","jsx","jsxs","resolveCellRenderer","useMemo","useEffect","useState","useRef","useCallback","Icon","cn","ChevronRight","React","useState","jsx","jsxs","useState","jsx","jsxs","React","React","Check","X","cn","Fragment","jsx","jsxs","Check","cn","X","forwardRef","useImperativeHandle","useMemo","useRef","cn","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","ChevronRight","cn","jsx","jsxs","jsx","jsxs","resolveCellRenderer","cn","useRef","useImperativeHandle","useMemo","forwardRef","React","useMemo","useRef","useState","useEffect","Search","X","ChevronDown","cn","getFieldTitle","useCallback","useEffect","useMemo","useRef","useState","useMemo","useState","useRef","useEffect","useCallback","useRef","useEffect","jsx","useRef","useEffect","useEffect","useState","cn","jsx","jsxs","useState","useEffect","cn","Fragment","jsx","jsxs","ChevronDown","cn","getFieldTitle","X","useRef","useState","useEffect","useMemo","React","Search","jsx","X","jsx","jsxs","X","jsx","jsxs","Separator"]}
|