json-schema-builder-react 0.0.7 → 0.0.9

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/select.tsx","../src/components/ui/dialog.tsx","../src/components/ui/label.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/textarea.tsx","../src/lib/string-utils.ts","../src/hooks/usePropertyEditor.ts","../src/contexts/TypeLabelsContext.tsx","../src/components/PropertyEditDialog.tsx","../src/hooks/useInlineEditor.ts","../src/hooks/useTypeSelector.ts","../src/lib/id-generator.ts","../src/hooks/useDialogManager.ts","../src/hooks/useChildManager.ts","../src/components/PropertyDocument.tsx","../src/components/ui/card.tsx","../src/lib/file-utils.ts","../src/components/JsonOutput.tsx","../src/components/SchemaMetadata.tsx","../src/lib/schema-generator.ts","../src/lib/schema-parser.ts","../src/hooks/useSchemaBuilder.ts","../src/components/ThemeToggle.tsx","../src/components/JsonSchemaBuilder.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring 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-full px-3 text-xs\",\n lg: \"h-10 rounded-full px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\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-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors 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:ring-1 focus-visible:ring-ring 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 * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-popover px-3 py-1.5 text-xs text-popover-foreground 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 </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<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-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<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.ElementRef<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.ElementRef<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-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-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.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<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-2 pr-8 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 right-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.ElementRef<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","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\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.ElementRef<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.ElementRef<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.ElementRef<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.ElementRef<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 DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\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 \"@/lib/utils\";\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.ElementRef<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 CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<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 shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"grid place-content-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\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-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring 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","// String utility functions\n\n/**\n * Convert a string to snake_case format\n * Removes special characters and replaces spaces with underscores\n *\n * @example\n * toSnakeCase(\"User Name\") // \"user_name\"\n * toSnakeCase(\"First Name!\") // \"first_name\"\n */\nexport const toSnakeCase = (str: string): string => {\n return str\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\") // Remove special characters\n .replace(/\\s+/g, \"_\"); // Replace spaces with underscores\n};\n","// Custom hook for managing property editing state\nimport type { PropertyData } from \"@/types/schema\";\nimport { toSnakeCase } from \"@/lib/string-utils\";\n\nexport interface UsePropertyEditorReturn {\n handleTitleChange: (title: string) => void;\n handleTitleBlur: () => void;\n handleKeyChange: (key: string) => void;\n handleFieldChange: (field: keyof PropertyData, value: any) => void;\n handleConstraintChange: (field: string, value: any) => void;\n}\n\nexport const usePropertyEditor = (\n property: PropertyData,\n onUpdate: (property: PropertyData) => void,\n isNewProperty: boolean = false,\n keyEditable: boolean = false,\n): UsePropertyEditorReturn => {\n const handleFieldChange = (field: keyof PropertyData, value: any) => {\n onUpdate({ ...property, [field]: value });\n };\n\n const handleTitleChange = (title: string) => {\n handleFieldChange(\"title\", title);\n };\n\n const handleTitleBlur = () => {\n // Auto-generate key from title on blur only for new properties\n // or if key hasn't been manually edited\n if (isNewProperty && property.title) {\n const autoKey = toSnakeCase(property.title);\n handleFieldChange(\"key\", autoKey);\n }\n };\n\n const handleKeyChange = (key: string) => {\n // Allow key changes for new properties OR if keyEditable is true\n if (isNewProperty || keyEditable) {\n handleFieldChange(\"key\", key);\n }\n };\n\n const handleConstraintChange = (field: string, value: any) => {\n onUpdate({\n ...property,\n [field]: value,\n });\n };\n\n return {\n handleTitleChange,\n handleTitleBlur,\n handleKeyChange,\n handleFieldChange,\n handleConstraintChange,\n };\n};\n","import { createContext, useContext } from \"react\";\nimport type { PropertyType } from \"@/types/schema\";\n\nexport type TypeLabels = Partial<Record<PropertyType, string>>;\n\nconst defaultTypeLabels: Record<PropertyType, string> = {\n string: \"String\",\n number: \"Number\",\n integer: \"Integer\",\n boolean: \"Boolean\",\n object: \"Object\",\n array: \"Array\",\n null: \"Null\",\n file: \"File\",\n};\n\ninterface TypeLabelsContextValue {\n getTypeLabel: (type: PropertyType) => string;\n typeLabels: Record<PropertyType, string>;\n}\n\nconst TypeLabelsContext = createContext<TypeLabelsContextValue>({\n getTypeLabel: (type) => defaultTypeLabels[type],\n typeLabels: defaultTypeLabels,\n});\n\nexport function TypeLabelsProvider({\n children,\n customLabels = {},\n}: {\n children: React.ReactNode;\n customLabels?: TypeLabels;\n}) {\n const typeLabels = { ...defaultTypeLabels, ...customLabels };\n\n const getTypeLabel = (type: PropertyType) => {\n return typeLabels[type] || type;\n };\n\n return (\n <TypeLabelsContext.Provider value={{ getTypeLabel, typeLabels }}>\n {children}\n </TypeLabelsContext.Provider>\n );\n}\n\nexport function useTypeLabels() {\n return useContext(TypeLabelsContext);\n}\n","import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport type { PropertyData, PropertyType } from \"@/types/schema\";\nimport { usePropertyEditor } from \"@/hooks/usePropertyEditor\";\nimport { useTypeLabels } from \"@/contexts/TypeLabelsContext\";\nimport { useState, useEffect } from \"react\";\n\n/**\n * PropertyEditDialog - A standalone dialog for editing a single JSON schema property\n *\n * @example\n * ```tsx\n * import { PropertyEditDialog, TypeLabelsProvider } from 'json-schema-builder-react';\n *\n * function MyApp() {\n * const [isOpen, setIsOpen] = useState(false);\n * const [property, setProperty] = useState({\n * id: '1',\n * key: 'username',\n * title: 'Username',\n * type: 'string',\n * required: true,\n * });\n *\n * return (\n * <TypeLabelsProvider>\n * <PropertyEditDialog\n * property={property}\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * onSave={(updated) => {\n * setProperty(updated);\n * setIsOpen(false);\n * }}\n * />\n * </TypeLabelsProvider>\n * );\n * }\n * ```\n */\ninterface PropertyEditDialogProps {\n property: PropertyData;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (property: PropertyData) => void;\n isArrayItem?: boolean;\n isNewProperty?: boolean;\n propertyLabel?: { singular: string; plural: string };\n showRegex?: boolean;\n keyEditable?: boolean;\n}\n\nexport default function PropertyEditDialog({\n property,\n open,\n onOpenChange,\n onSave,\n isArrayItem = false,\n isNewProperty = false,\n propertyLabel = { singular: \"Property\", plural: \"Properties\" },\n showRegex = false,\n keyEditable = false,\n}: PropertyEditDialogProps) {\n const { typeLabels } = useTypeLabels();\n\n // Local state for editing\n const [localProperty, setLocalProperty] = useState<PropertyData>(property);\n\n // Reset local state when property or open changes\n useEffect(() => {\n if (open) {\n setLocalProperty(property);\n }\n }, [property, open]);\n\n const {\n handleTitleChange,\n handleTitleBlur,\n handleKeyChange,\n handleFieldChange,\n handleConstraintChange,\n } = usePropertyEditor(\n localProperty,\n setLocalProperty,\n isNewProperty,\n keyEditable,\n );\n\n const handleSave = () => {\n if (localProperty.title?.trim()) {\n onSave(localProperty);\n onOpenChange(false);\n }\n };\n\n const handleCancel = () => {\n setLocalProperty(property); // Reset to original\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"max-w-2xl max-h-[80vh] flex flex-col gap-0 p-0\"\n data-testid=\"dialog-edit-property\"\n >\n <DialogHeader className=\"px-6 pt-6 pb-4 shrink-0\">\n <DialogTitle>\n {isNewProperty\n ? `Add ${propertyLabel.singular}`\n : `Edit ${propertyLabel.singular}`}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-6 px-6 pb-4 overflow-y-auto flex-1 min-h-0\">\n {/* 1. Property Type */}\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-red-500\"></span>\n Type\n </Label>\n <Select\n value={localProperty.type}\n onValueChange={(value) => handleFieldChange(\"type\", value)}\n data-testid=\"select-type-dialog\"\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"string\">{typeLabels.string}</SelectItem>\n <SelectItem value=\"number\">{typeLabels.number}</SelectItem>\n <SelectItem value=\"integer\">{typeLabels.integer}</SelectItem>\n <SelectItem value=\"boolean\">{typeLabels.boolean}</SelectItem>\n <SelectItem value=\"object\">{typeLabels.object}</SelectItem>\n <SelectItem value=\"array\">{typeLabels.array}</SelectItem>\n <SelectItem value=\"file\">{typeLabels.file}</SelectItem>\n <SelectItem value=\"null\">{typeLabels.null}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* 2. Property Title */}\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-red-500\"></span>\n Title\n </Label>\n <Input\n value={localProperty.title || \"\"}\n onChange={(e) => handleTitleChange(e.target.value)}\n onBlur={handleTitleBlur}\n placeholder=\"Property Title\"\n data-testid=\"input-title-dialog\"\n required\n />\n {!isNewProperty && localProperty.key && (\n <p className=\"text-xs text-muted-foreground font-mono\">\n Key: {localProperty.key}\n </p>\n )}\n </div>\n\n {/* 3. Property Key - Shown for new properties or when keyEditable is true */}\n {(isNewProperty || keyEditable) && (\n <div className=\"space-y-2\">\n <Label>Key</Label>\n <Input\n value={localProperty.key}\n onChange={(e) => handleKeyChange(e.target.value)}\n placeholder=\"property_key\"\n data-testid=\"input-key-dialog\"\n />\n {!isNewProperty && (\n <p className=\"text-xs text-yellow-600 dark:text-yellow-500\">\n ⚠️ Changing the key may break existing references to this\n property\n </p>\n )}\n </div>\n )}\n\n {/* 4. Description */}\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Optional description\"\n value={localProperty.description || \"\"}\n onChange={(e) => handleFieldChange(\"description\", e.target.value)}\n rows={2}\n data-testid=\"input-edit-description\"\n />\n </div>\n\n {/* Recursive array item editing (inline, not modal) */}\n {localProperty.type === \"array\" && (\n <div className=\"space-y-2 border-l-2 border-border pl-4 mt-2\">\n <Label className=\"font-semibold text-xs text-muted-foreground\">\n {typeLabels.array} Items\n </Label>\n {localProperty.items ? (\n <div className=\"bg-muted/40 p-2 rounded\">\n {/* Inline editing for array item schema */}\n <div className=\"space-y-2\">\n <Label>Item Type</Label>\n <Select\n value={localProperty.items.type}\n onValueChange={(value) =>\n setLocalProperty({\n ...localProperty,\n items: {\n ...localProperty.items!,\n type: value as PropertyType,\n },\n })\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"string\">\n {typeLabels.string}\n </SelectItem>\n <SelectItem value=\"number\">\n {typeLabels.number}\n </SelectItem>\n <SelectItem value=\"integer\">\n {typeLabels.integer}\n </SelectItem>\n <SelectItem value=\"boolean\">\n {typeLabels.boolean}\n </SelectItem>\n <SelectItem value=\"object\">\n {typeLabels.object}\n </SelectItem>\n <SelectItem value=\"array\">\n {typeLabels.array}\n </SelectItem>\n <SelectItem value=\"file\">{typeLabels.file}</SelectItem>\n <SelectItem value=\"null\">{typeLabels.null}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Item Title</Label>\n <Input\n value={localProperty.items.title || \"\"}\n onChange={(e) =>\n setLocalProperty({\n ...localProperty,\n items: {\n ...localProperty.items!,\n title: e.target.value,\n },\n })\n }\n placeholder=\"Item Title\"\n />\n </div>\n {/* Item key is fixed and not editable */}\n {/* You can add more inline controls for constraints, etc. */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() =>\n setLocalProperty({ ...localProperty, items: undefined })\n }\n >\n Remove {typeLabels.array} Item Schema\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n // Default to string type for new item\n setLocalProperty({\n ...localProperty,\n items: {\n id: Date.now().toString() + Math.random(),\n key: \"item\",\n type: \"string\",\n required: false,\n },\n });\n }}\n >\n Add {typeLabels.array} Item Schema\n </Button>\n )}\n </div>\n )}\n\n {!isArrayItem && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id=\"prop-required\"\n checked={localProperty.required}\n onCheckedChange={(checked) =>\n handleFieldChange(\"required\", checked)\n }\n data-testid=\"checkbox-edit-required\"\n />\n <Label htmlFor=\"prop-required\" className=\"cursor-pointer\">\n Required field\n </Label>\n </div>\n )}\n\n {localProperty.type === \"string\" && (\n <details className=\"border rounded-md\">\n <summary className=\"p-4 cursor-pointer hover:bg-accent/50 transition-colors\">\n <h4 className=\"text-sm font-medium inline\">\n {typeLabels.string} Constraints\n </h4>\n </summary>\n <div className=\"space-y-4 p-4 pt-0\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"min-length\">Minimum Length</Label>\n <Input\n id=\"min-length\"\n type=\"number\"\n placeholder=\"0\"\n value={localProperty.minLength || \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"minLength\",\n e.target.value ? parseInt(e.target.value) : undefined,\n )\n }\n data-testid=\"input-edit-minlength\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"max-length\">Maximum Length</Label>\n <Input\n id=\"max-length\"\n type=\"number\"\n placeholder=\"∞\"\n value={localProperty.maxLength || \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"maxLength\",\n e.target.value ? parseInt(e.target.value) : undefined,\n )\n }\n data-testid=\"input-edit-maxlength\"\n />\n </div>\n </div>\n {showRegex && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"pattern\">Pattern (regex)</Label>\n <Input\n id=\"pattern\"\n placeholder=\"^[a-z]+$\"\n value={localProperty.pattern || \"\"}\n onChange={(e) =>\n handleConstraintChange(\"pattern\", e.target.value)\n }\n className=\"font-mono text-sm\"\n data-testid=\"input-edit-pattern\"\n />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label>Enum Values</Label>\n <div className=\"space-y-2\">\n {[...(localProperty.enum || []), \"\"].map((value, index) => (\n <Input\n key={index}\n placeholder={\n index === (localProperty.enum?.length || 0)\n ? \"Add new value...\"\n : \"Enum value\"\n }\n value={value}\n onChange={(e) => {\n const newValue = e.target.value;\n const currentEnum = localProperty.enum || [];\n\n if (index === currentEnum.length) {\n // Adding new value to the placeholder input\n if (newValue.trim()) {\n handleConstraintChange(\"enum\", [\n ...currentEnum,\n newValue.trim(),\n ]);\n }\n } else {\n // Updating existing value\n if (newValue.trim()) {\n const newEnum = [...currentEnum];\n newEnum[index] = newValue.trim();\n handleConstraintChange(\"enum\", newEnum);\n } else {\n // Removing empty value\n const newEnum = currentEnum.filter(\n (_, i) => i !== index,\n );\n handleConstraintChange(\n \"enum\",\n newEnum.length > 0 ? newEnum : undefined,\n );\n }\n }\n }}\n data-testid={`input-edit-enum-${index}`}\n />\n ))}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Enter allowed values (empty fields will be removed)\n </p>\n </div>\n </div>\n </details>\n )}\n\n {(localProperty.type === \"number\" ||\n localProperty.type === \"integer\") && (\n <details className=\"border rounded-md\">\n <summary className=\"p-4 cursor-pointer hover:bg-accent/50 transition-colors\">\n <h4 className=\"text-sm font-medium inline\">\n Numeric Constraints\n </h4>\n </summary>\n <div className=\"space-y-4 p-4 pt-0\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"minimum\">Minimum Value</Label>\n <Input\n id=\"minimum\"\n type=\"number\"\n placeholder=\"-∞\"\n value={localProperty.minimum ?? \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"minimum\",\n e.target.value\n ? parseFloat(e.target.value)\n : undefined,\n )\n }\n data-testid=\"input-edit-minimum\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"maximum\">Maximum Value</Label>\n <Input\n id=\"maximum\"\n type=\"number\"\n placeholder=\"∞\"\n value={localProperty.maximum ?? \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"maximum\",\n e.target.value\n ? parseFloat(e.target.value)\n : undefined,\n )\n }\n data-testid=\"input-edit-maximum\"\n />\n </div>\n </div>\n </div>\n </details>\n )}\n\n {localProperty.type === \"array\" && (\n <details className=\"border rounded-md\">\n <summary className=\"p-4 cursor-pointer hover:bg-accent/50 transition-colors\">\n <h4 className=\"text-sm font-medium inline\">\n {typeLabels.array} Constraints\n </h4>\n </summary>\n <div className=\"space-y-4 p-4 pt-0\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"min-items\">Minimum Items</Label>\n <Input\n id=\"min-items\"\n type=\"number\"\n placeholder=\"0\"\n value={localProperty.minItems || \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"minItems\",\n e.target.value ? parseInt(e.target.value) : undefined,\n )\n }\n data-testid=\"input-edit-minitems\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"max-items\">Maximum Items</Label>\n <Input\n id=\"max-items\"\n type=\"number\"\n placeholder=\"∞\"\n value={localProperty.maxItems || \"\"}\n onChange={(e) =>\n handleConstraintChange(\n \"maxItems\",\n e.target.value ? parseInt(e.target.value) : undefined,\n )\n }\n data-testid=\"input-edit-maxitems\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id=\"unique-items\"\n checked={localProperty.uniqueItems || false}\n onCheckedChange={(checked) =>\n handleConstraintChange(\"uniqueItems\", checked)\n }\n data-testid=\"checkbox-edit-unique\"\n />\n <Label htmlFor=\"unique-items\" className=\"cursor-pointer\">\n All items must be unique\n </Label>\n </div>\n </div>\n </details>\n )}\n </div>\n <DialogFooter className=\"px-6 py-4 border-t bg-background shrink-0\">\n <Button\n variant=\"outline\"\n onClick={handleCancel}\n data-testid=\"button-cancel\"\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n data-testid=\"button-save\"\n disabled={!localProperty.title?.trim()}\n >\n Save Changes\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, useEffect } from \"react\";\n\nexport interface UseInlineEditorOptions {\n /**\n * Whether to allow empty values. If false, reverts to original value on blur when empty.\n * @default false\n */\n allowEmpty?: boolean;\n\n /**\n * Callback when editing starts\n */\n onEditStart?: () => void;\n\n /**\n * Callback when editing is cancelled\n */\n onEditCancel?: () => void;\n}\n\nexport interface UseInlineEditorReturn {\n /**\n * Whether the field is currently being edited\n */\n isEditing: boolean;\n\n /**\n * The current edited value\n */\n value: string;\n\n /**\n * Start editing mode\n */\n startEdit: () => void;\n\n /**\n * Handle value changes\n */\n handleChange: (newValue: string) => void;\n\n /**\n * Handle blur event - saves or reverts changes\n */\n handleBlur: () => void;\n\n /**\n * Handle keyboard events (Enter to save, Escape to cancel)\n */\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * Hook for managing inline editing state and behavior.\n * Handles common patterns like Enter/Escape keys, blur to save, and syncing with external value changes.\n *\n * @param initialValue - The initial/current value from props\n * @param onSave - Callback when value should be saved (on blur or Enter)\n * @param options - Optional configuration\n *\n * @example\n * ```tsx\n * const titleEditor = useInlineEditor(\n * property.title || \"\",\n * (newValue) => onUpdate({ ...property, title: newValue }),\n * { allowEmpty: false }\n * );\n *\n * {titleEditor.isEditing ? (\n * <Input\n * value={titleEditor.value}\n * onChange={(e) => titleEditor.handleChange(e.target.value)}\n * onBlur={titleEditor.handleBlur}\n * onKeyDown={titleEditor.handleKeyDown}\n * autoFocus\n * />\n * ) : (\n * <span onClick={titleEditor.startEdit}>{property.title}</span>\n * )}\n * ```\n */\nexport function useInlineEditor(\n initialValue: string,\n onSave: (value: string) => void,\n options: UseInlineEditorOptions = {},\n): UseInlineEditorReturn {\n const { allowEmpty = false, onEditStart, onEditCancel } = options;\n\n const [isEditing, setIsEditing] = useState(false);\n const [value, setValue] = useState(initialValue);\n\n // Keep value in sync with initialValue when not editing\n useEffect(() => {\n if (!isEditing) {\n setValue(initialValue);\n }\n }, [initialValue, isEditing]);\n\n const startEdit = () => {\n setValue(initialValue);\n setIsEditing(true);\n onEditStart?.();\n };\n\n const handleChange = (newValue: string) => {\n setValue(newValue);\n };\n\n const handleBlur = () => {\n const trimmedValue = value.trim();\n\n // Don't allow empty if not permitted - revert to original\n if (!allowEmpty && !trimmedValue) {\n setValue(initialValue);\n setIsEditing(false);\n return;\n }\n\n // Only save if value changed\n if (trimmedValue !== initialValue) {\n onSave(trimmedValue);\n }\n\n setIsEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleBlur();\n } else if (e.key === \"Escape\") {\n setValue(initialValue);\n setIsEditing(false);\n onEditCancel?.();\n }\n };\n\n return {\n isEditing,\n value,\n startEdit,\n handleChange,\n handleBlur,\n handleKeyDown,\n };\n}\n","import { useState } from \"react\";\nimport type { PropertyData, PropertyType } from \"@/types/schema\";\n\nexport interface UseTypeSelectorReturn {\n /**\n * Whether the type selector is currently open\n */\n isChangingType: boolean;\n\n /**\n * Set whether the type selector is open\n */\n setIsChangingType: (isOpen: boolean) => void;\n\n /**\n * Handle type change with automatic cleanup of type-specific constraints\n */\n handleTypeChange: (newType: PropertyType) => void;\n\n /**\n * List of available types that can be selected\n */\n availableTypes: PropertyType[];\n}\n\n/**\n * Hook for managing property type selection with automatic constraint cleanup.\n * When changing types, automatically removes constraints that don't apply to the new type.\n *\n * @param property - The property being edited\n * @param onUpdate - Callback to update the property\n *\n * @example\n * ```tsx\n * const typeSelector = useTypeSelector(property, onUpdate);\n *\n * {typeSelector.isChangingType ? (\n * <Select\n * value={property.type}\n * onValueChange={typeSelector.handleTypeChange}\n * open={typeSelector.isChangingType}\n * onOpenChange={typeSelector.setIsChangingType}\n * >\n * {typeSelector.availableTypes.map(type => (\n * <SelectItem key={type} value={type}>{type}</SelectItem>\n * ))}\n * </Select>\n * ) : (\n * <button onClick={() => typeSelector.setIsChangingType(true)}>\n * {property.type}\n * </button>\n * )}\n * ```\n */\nexport function useTypeSelector(\n property: PropertyData,\n onUpdate: (property: PropertyData) => void,\n): UseTypeSelectorReturn {\n const [isChangingType, setIsChangingType] = useState(false);\n\n const availableTypes: PropertyType[] = [\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"object\",\n \"array\",\n \"file\",\n ];\n\n const handleTypeChange = (newType: PropertyType) => {\n const updated: PropertyData = { ...property, type: newType };\n\n // Clear type-specific fields when changing type\n if (newType !== \"string\") {\n delete updated.minLength;\n delete updated.maxLength;\n delete updated.pattern;\n delete updated.enum;\n }\n if (newType !== \"number\" && newType !== \"integer\") {\n delete updated.minimum;\n delete updated.maximum;\n }\n if (newType !== \"array\") {\n delete updated.minItems;\n delete updated.maxItems;\n delete updated.uniqueItems;\n delete updated.items;\n }\n if (newType !== \"object\") {\n delete updated.children;\n }\n\n onUpdate(updated);\n setIsChangingType(false);\n };\n\n return {\n isChangingType,\n setIsChangingType,\n handleTypeChange,\n availableTypes,\n };\n}\n","// ID generation utilities\n\n/**\n * Generate a unique ID for properties\n * Uses timestamp and random number for uniqueness\n *\n * @example\n * generatePropertyId() // \"1699632000000-0.123456789\"\n */\nexport const generatePropertyId = (): string => {\n return `${Date.now()}-${Math.random()}`;\n};\n","import { useState } from \"react\";\n\nexport interface UseDialogManagerReturn<T> {\n /**\n * Whether the dialog is currently open\n */\n isOpen: boolean;\n\n /**\n * The data associated with the dialog (e.g., the item being edited/created)\n */\n data: T | null;\n\n /**\n * Open the dialog with optional data\n */\n open: (data?: T) => void;\n\n /**\n * Close the dialog without saving\n */\n close: () => void;\n\n /**\n * Confirm and close the dialog (typically calls the onConfirm callback)\n */\n confirm: (data: T) => void;\n\n /**\n * Set the dialog open state directly\n */\n setIsOpen: (isOpen: boolean) => void;\n}\n\nexport interface UseDialogManagerOptions<T> {\n /**\n * Callback when dialog is confirmed/saved\n */\n onConfirm?: (data: T) => void;\n\n /**\n * Callback when dialog is cancelled/closed without saving\n */\n onCancel?: () => void;\n\n /**\n * Factory function to create initial data when opening dialog\n */\n createInitialData?: () => T;\n}\n\n/**\n * Generic hook for managing dialog state with associated data.\n * Useful for dialogs that create/edit items with temporary state.\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * // For adding a new property\n * const addDialog = useDialogManager<PropertyData>({\n * createInitialData: () => ({\n * id: generateId(),\n * key: \"\",\n * type: \"string\",\n * required: false\n * }),\n * onConfirm: (property) => {\n * updateProperty(property.id, property);\n * }\n * });\n *\n * // Usage in JSX\n * <Button onClick={() => addDialog.open()}>Add Property</Button>\n *\n * {addDialog.isOpen && addDialog.data && (\n * <PropertyEditDialog\n * property={addDialog.data}\n * open={addDialog.isOpen}\n * onOpenChange={addDialog.setIsOpen}\n * onSave={addDialog.confirm}\n * />\n * )}\n * ```\n */\nexport function useDialogManager<T>(\n options: UseDialogManagerOptions<T> = {},\n): UseDialogManagerReturn<T> {\n const { onConfirm, onCancel, createInitialData } = options;\n\n const [isOpen, setIsOpen] = useState(false);\n const [data, setData] = useState<T | null>(null);\n\n const open = (initialData?: T) => {\n const dataToUse =\n initialData ?? (createInitialData ? createInitialData() : null);\n setData(dataToUse);\n setIsOpen(true);\n };\n\n const close = () => {\n setIsOpen(false);\n setData(null);\n onCancel?.();\n };\n\n const confirm = (confirmedData: T) => {\n onConfirm?.(confirmedData);\n setIsOpen(false);\n setData(null);\n };\n\n const handleSetIsOpen = (newIsOpen: boolean) => {\n if (!newIsOpen) {\n close();\n } else {\n setIsOpen(true);\n }\n };\n\n return {\n isOpen,\n data,\n open,\n close,\n confirm,\n setIsOpen: handleSetIsOpen,\n };\n}\n","import type { PropertyData } from \"@/types/schema\";\nimport { generatePropertyId } from \"@/lib/id-generator\";\nimport { useDialogManager } from \"./useDialogManager\";\n\nexport interface UseChildManagerReturn {\n /**\n * Add a new child property (opens dialog)\n */\n addChild: () => void;\n\n /**\n * Update an existing child property\n */\n updateChild: (childId: string, updated: PropertyData) => void;\n\n /**\n * Delete a child property\n */\n deleteChild: (childId: string) => void;\n\n /**\n * Dialog manager for adding new children\n */\n addChildDialog: {\n isOpen: boolean;\n data: PropertyData | null;\n setIsOpen: (isOpen: boolean) => void;\n confirm: (data: PropertyData) => void;\n };\n}\n\n/**\n * Hook for managing child properties (nested properties within an object).\n * Handles adding, updating, and deleting children with dialog state management.\n *\n * @param property - The parent property that contains children\n * @param onUpdate - Callback to update the parent property\n *\n * @example\n * ```tsx\n * const childManager = useChildManager(property, onUpdate);\n *\n * // Add child button\n * <Button onClick={childManager.addChild}>Add Child</Button>\n *\n * // Render children\n * {property.children?.map((child) => (\n * <PropertyDocument\n * key={child.id}\n * property={child}\n * onUpdate={(updated) => childManager.updateChild(child.id, updated)}\n * onDelete={() => childManager.deleteChild(child.id)}\n * />\n * ))}\n *\n * // Add child dialog\n * {childManager.addChildDialog.isOpen && childManager.addChildDialog.data && (\n * <PropertyEditDialog\n * property={childManager.addChildDialog.data}\n * open={childManager.addChildDialog.isOpen}\n * onOpenChange={childManager.addChildDialog.setIsOpen}\n * onUpdate={childManager.addChildDialog.confirm}\n * />\n * )}\n * ```\n */\nexport function useChildManager(\n property: PropertyData,\n onUpdate: (property: PropertyData) => void,\n): UseChildManagerReturn {\n const addChildDialog = useDialogManager<PropertyData>({\n createInitialData: () => ({\n id: generatePropertyId(),\n key: \"\",\n type: \"string\",\n required: false,\n }),\n onConfirm: (child) => {\n onUpdate({\n ...property,\n children: [...(property.children || []), child],\n });\n },\n });\n\n const updateChild = (childId: string, updated: PropertyData) => {\n const newChildren = property.children!.map((c) =>\n c.id === childId ? updated : c,\n );\n onUpdate({ ...property, children: newChildren });\n };\n\n const deleteChild = (childId: string) => {\n const newChildren = property.children!.filter((c) => c.id !== childId);\n onUpdate({ ...property, children: newChildren });\n };\n\n return {\n addChild: () => addChildDialog.open(),\n updateChild,\n deleteChild,\n addChildDialog: {\n isOpen: addChildDialog.isOpen,\n data: addChildDialog.data,\n setIsOpen: addChildDialog.setIsOpen,\n confirm: addChildDialog.confirm,\n },\n };\n}\n","import { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Pencil,\n Trash2,\n Plus,\n Type,\n List,\n Hash,\n Braces,\n CheckSquare,\n FileText,\n} from \"lucide-react\";\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n} from \"@/components/ui/tooltip\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport PropertyEditDialog from \"./PropertyEditDialog\";\nimport type { PropertyData, PropertyType } from \"@/types/schema\";\nimport { useTypeLabels } from \"@/contexts/TypeLabelsContext\";\nimport { useInlineEditor } from \"@/hooks/useInlineEditor\";\nimport { useTypeSelector } from \"@/hooks/useTypeSelector\";\nimport { useChildManager } from \"@/hooks/useChildManager\";\nimport { useDialogManager } from \"@/hooks/useDialogManager\";\n\ninterface PropertyDocumentProps {\n property: PropertyData;\n onUpdate: (property: PropertyData) => void;\n onDelete: () => void;\n level?: number;\n isArrayItem?: boolean;\n showRegex?: boolean;\n keyEditable?: boolean;\n}\n\nexport default function PropertyDocument({\n property,\n onUpdate,\n onDelete,\n level = 1,\n isArrayItem = false,\n showRegex = false,\n keyEditable = false,\n}: PropertyDocumentProps) {\n const { getTypeLabel, typeLabels } = useTypeLabels();\n\n // Dialog for editing this property\n const editDialog = useDialogManager<PropertyData>();\n\n // Inline editing for title\n const titleEditor = useInlineEditor(\n property.title || property.key || \"\",\n (newValue) => onUpdate({ ...property, title: newValue }),\n { allowEmpty: false },\n );\n\n // Inline editing for description\n const descriptionEditor = useInlineEditor(\n property.description || \"\",\n (newValue) => onUpdate({ ...property, description: newValue || undefined }),\n { allowEmpty: true },\n );\n\n // Type selection with constraint cleanup\n const typeSelector = useTypeSelector(property, onUpdate);\n\n // Child property management\n const childManager = useChildManager(property, onUpdate);\n\n const HeadingTag = `h${Math.min(level, 6)}` as keyof JSX.IntrinsicElements;\n const canHaveChildren = property.type === \"object\";\n const hasChildren =\n canHaveChildren && property.children && property.children.length > 0;\n\n const headingClasses =\n {\n 1: \"text-lg font-semibold\",\n 2: \"text-base\",\n 3: \"text-base\",\n 4: \"text-base\",\n 5: \"text-sm\",\n 6: \"text-sm\",\n }[level] || \"text-sm\";\n\n return (\n <div className=\"group\">\n <div className=\"flex gap-4 items-center rounded-md -mx-2 px-2 py-1 transition-colors hover:bg-accent/50\">\n {/* Left side - Main content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start gap-3\">\n {!isArrayItem && (\n <button\n onClick={() =>\n onUpdate({ ...property, required: !property.required })\n }\n className=\"shrink-0 transition-all hover:scale-110 mt-0.5\"\n title={\n property.required\n ? \"Required field - click to make optional\"\n : \"Optional field - click to make required\"\n }\n >\n {property.required ? (\n <span className=\"block w-4 h-4 rounded-full bg-primary\"></span>\n ) : (\n <span className=\"block w-4 h-4 rounded-full border border-dashed border-gray-400\"></span>\n )}\n </button>\n )}\n\n {titleEditor.isEditing ? (\n <Input\n value={titleEditor.value}\n onChange={(e) => titleEditor.handleChange(e.target.value)}\n onBlur={titleEditor.handleBlur}\n onKeyDown={titleEditor.handleKeyDown}\n autoFocus\n className={headingClasses}\n placeholder=\"Enter title\"\n />\n ) : (\n <div className=\"flex gap-2 flex-wrap flex-1\">\n <div className=\"flex items-start gap-2\">\n <HeadingTag\n className={`${headingClasses} cursor-pointer hover:text-primary transition-colors leading-none`}\n onClick={titleEditor.startEdit}\n >\n {property.title || property.key || (\n <span className=\"text-muted-foreground italic\">\n unnamed\n </span>\n )}\n </HeadingTag>\n {typeSelector.isChangingType ? (\n <Select\n value={property.type}\n onValueChange={(value) =>\n typeSelector.handleTypeChange(value as PropertyType)\n }\n open={typeSelector.isChangingType}\n onOpenChange={typeSelector.setIsChangingType}\n >\n <SelectTrigger className=\"w-[140px] h-7\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {typeSelector.availableTypes.map((type) => (\n <SelectItem key={type} value={type}>\n {typeLabels[type]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => typeSelector.setIsChangingType(true)}\n className=\"cursor-pointer hover:bg-accent rounded p-0.5 transition-colors\"\n >\n {property.type === \"string\" && (\n <Type className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"number\" && (\n <Hash className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"integer\" && (\n <Hash className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"boolean\" && (\n <CheckSquare className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"object\" && (\n <Braces className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"array\" && (\n <List className=\"w-5 h-5 text-muted-foreground\" />\n )}\n {property.type === \"file\" && (\n <FileText className=\"w-5 h-5 text-muted-foreground\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {getTypeLabel(property.type)}\n {property.type === \"array\" && property.items\n ? ` of ${getTypeLabel(property.items.type)}`\n : \"\"}\n <div className=\"text-xs text-muted-foreground mt-1\">\n Click to change type\n </div>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n {property.type === \"object\" && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"opacity-0 group-hover:opacity-100 h-6 w-6\"\n onClick={childManager.addChild}\n data-testid={`button-add-child-${property.id}`}\n >\n <Plus className=\"!w-5 !h-5\" />\n </Button>\n )}\n </div>\n <div className=\"flex-1\">\n {descriptionEditor.isEditing ? (\n <Input\n value={descriptionEditor.value}\n onChange={(e) =>\n descriptionEditor.handleChange(e.target.value)\n }\n onBlur={descriptionEditor.handleBlur}\n onKeyDown={descriptionEditor.handleKeyDown}\n autoFocus\n className=\"text-sm flex-1\"\n placeholder=\"Enter description\"\n />\n ) : (\n <>\n {property.description ? (\n <p\n className=\"text-sm text-muted-foreground flex-1 min-w-[200px] cursor-pointer hover:text-foreground transition-colors\"\n data-testid={`text-description-${property.id}`}\n onClick={descriptionEditor.startEdit}\n >\n {property.description}\n </p>\n ) : (\n <p\n className=\"text-sm text-muted-foreground/50 flex-1 min-w-[200px] cursor-pointer hover:text-muted-foreground italic transition-colors\"\n onClick={descriptionEditor.startEdit}\n >\n Add description...\n </p>\n )}\n </>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Right side - Action buttons */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity shrink-0\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => editDialog.open(property)}\n data-testid={`button-edit-${property.id}`}\n >\n <Pencil className=\"w-3 h-3\" />\n </Button>\n {/* Only show add-child button on right for non-object types (shouldn't happen, but for safety) */}\n {canHaveChildren && property.type !== \"object\" && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={childManager.addChild}\n data-testid={`button-add-child-${property.id}`}\n >\n <Plus className=\"w-3 h-3\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-muted-foreground hover:text-destructive\"\n onClick={onDelete}\n data-testid={`button-delete-${property.id}`}\n >\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n\n {/* Render children for objects */}\n {hasChildren && (\n <div\n className={\n level === 1\n ? \"ml-6 mt-1 border-l-2 border-border pl-6\"\n : \"ml-4 mt-1 border-l border-border pl-4\"\n }\n >\n {property.children!.map((child) => (\n <PropertyDocument\n key={child.id}\n property={child}\n onUpdate={(updated) =>\n childManager.updateChild(child.id, updated)\n }\n onDelete={() => childManager.deleteChild(child.id)}\n level={level + 1}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n ))}\n </div>\n )}\n\n {/* Render items for arrays recursively */}\n {property.type === \"array\" && property.items && (\n <div\n className={\n level === 1\n ? \"ml-6 mt-1 border-l-2 border-border pl-6\"\n : \"ml-4 mt-1 border-l border-border pl-4\"\n }\n >\n <div className=\"mb-2 text-xs text-muted-foreground font-semibold uppercase\">\n {getTypeLabel(\"array\")} Items\n </div>\n <PropertyDocument\n property={property.items}\n onUpdate={(updated) => onUpdate({ ...property, items: updated })}\n onDelete={() => onUpdate({ ...property, items: undefined })}\n level={level + 1}\n isArrayItem={true}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n </div>\n )}\n\n <PropertyEditDialog\n property={editDialog.data || property}\n open={editDialog.isOpen}\n onOpenChange={editDialog.setIsOpen}\n onSave={(updated) => {\n onUpdate(updated);\n editDialog.close();\n }}\n isArrayItem={isArrayItem}\n isNewProperty={false}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n\n {childManager.addChildDialog.isOpen &&\n childManager.addChildDialog.data && (\n <PropertyEditDialog\n property={childManager.addChildDialog.data}\n open={childManager.addChildDialog.isOpen}\n isNewProperty={true}\n onOpenChange={childManager.addChildDialog.setIsOpen}\n onSave={childManager.addChildDialog.confirm}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n )}\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\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-xl border bg-card text-card-foreground shadow\",\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(\"font-semibold leading-none tracking-tight\", className)}\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","// File upload/download utilities\n\n/**\n * Open a file picker and read a JSON file\n */\nexport const importJsonFile = (): Promise<any> => {\n return new Promise((resolve, reject) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) {\n reject(new Error(\"No file selected\"));\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n const data = JSON.parse(event.target?.result as string);\n resolve(data);\n } catch (err) {\n reject(new Error(\"Invalid JSON file\"));\n }\n };\n reader.onerror = () => reject(new Error(\"Failed to read file\"));\n reader.readAsText(file);\n };\n\n input.click();\n });\n};\n\n/**\n * Download a JSON object as a file\n */\nexport const downloadJsonFile = (\n data: any,\n filename: string = \"schema.json\",\n): void => {\n const jsonString = JSON.stringify(data, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n};\n","import { Card } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Copy, Download, CheckCircle2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { downloadJsonFile } from \"@/lib/file-utils\";\n\ninterface JsonOutputProps {\n schema: any;\n}\n\nexport default function JsonOutput({ schema }: JsonOutputProps) {\n const [copied, setCopied] = useState(false);\n\n const jsonString = JSON.stringify(schema, null, 2);\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(jsonString);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleDownload = () => {\n downloadJsonFile(schema, \"schema.json\");\n };\n\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex items-center justify-between p-4 border-b\">\n <h2 className=\"text-sm font-medium\">JSON Schema Output</h2>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCopy}\n data-testid=\"button-copy\"\n >\n {copied ? (\n <CheckCircle2 className=\"w-4 h-4\" />\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleDownload}\n data-testid=\"button-download\"\n >\n <Download className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n <Card className=\"m-4 bg-muted/30\">\n <pre\n className=\"p-6 text-xs font-mono overflow-auto\"\n data-testid=\"text-json-output\"\n >\n <code>{jsonString}</code>\n </pre>\n </Card>\n </div>\n </div>\n );\n}\n","import { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { useState } from \"react\";\n\ninterface SchemaMetadataProps {\n title: string;\n description: string;\n version: string;\n onUpdate: (field: string, value: string) => void;\n}\n\nexport default function SchemaMetadata({\n title,\n description,\n version,\n onUpdate,\n}: SchemaMetadataProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <Card className=\"p-4\">\n <Button\n variant=\"ghost\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full justify-between px-2 h-auto hover:bg-transparent\"\n data-testid=\"button-toggle-metadata\"\n >\n <h3 className=\"text-sm font-medium\">Schema Metadata</h3>\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4\" />\n ) : (\n <ChevronRight className=\"w-4 h-4\" />\n )}\n </Button>\n\n {isExpanded && (\n <div className=\"mt-4 space-y-4\">\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"schema-title\"\n className=\"text-xs text-muted-foreground\"\n >\n Title\n </Label>\n <Input\n id=\"schema-title\"\n placeholder=\"My Schema\"\n value={title}\n onChange={(e) => onUpdate(\"title\", e.target.value)}\n data-testid=\"input-title\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"schema-description\"\n className=\"text-xs text-muted-foreground\"\n >\n Description\n </Label>\n <Textarea\n id=\"schema-description\"\n placeholder=\"Describe your schema...\"\n value={description}\n onChange={(e) => onUpdate(\"description\", e.target.value)}\n className=\"resize-none\"\n rows={3}\n data-testid=\"input-schema-description\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"schema-version\"\n className=\"text-xs text-muted-foreground\"\n >\n Version\n </Label>\n {/* TODO: Fix version */}\n <Input\n id=\"schema-version\"\n placeholder=\"1.0.0\"\n value={version}\n onChange={(e) => onUpdate(\"version\", e.target.value)}\n data-testid=\"input-version\"\n />\n </div>\n </div>\n )}\n </Card>\n );\n}\n","// JSON Schema generation utilities\n\nimport type { PropertyData, SchemaMetadata } from \"@/types/schema\";\nimport { JSONSchema7 } from \"json-schema\";\n\n/**\n * Generate a JSON Schema from property definitions\n */\nexport const generateSchema = (\n properties: PropertyData[],\n metadata?: SchemaMetadata,\n includeMetadata: boolean = true,\n): JSONSchema7 => {\n const schema: JSONSchema7 = {\n type: \"object\",\n };\n\n // Add metadata if enabled and provided\n if (includeMetadata && metadata) {\n if (metadata.title) schema.title = metadata.title;\n if (metadata.description) schema.description = metadata.description;\n }\n\n // Build properties recursively\n const props = buildProperties(properties);\n if (Object.keys(props).length > 0) {\n schema.properties = props;\n }\n\n // Add required array at root level\n const required = properties\n .filter((p) => p.required && p.key)\n .map((p) => p.key);\n if (required.length > 0) {\n schema.required = required;\n }\n\n return schema;\n};\n\n/**\n * Recursively build property schemas\n */\nconst buildProperties = (\n props: PropertyData[],\n): Record<string, JSONSchema7> => {\n const result: Record<string, JSONSchema7> = {};\n\n props.forEach((prop) => {\n if (!prop.key) return;\n\n // Convert 'file' type to string with format = filename for JSON Schema compliance\n const schemaType = prop.type === \"file\" ? \"string\" : prop.type;\n const propSchema: JSONSchema7 = { type: schemaType };\n\n // Add common fields\n if (prop.title) propSchema.title = prop.title;\n if (prop.description) propSchema.description = prop.description;\n\n // For file type, add format to indicate special content\n if (prop.type === \"file\") {\n propSchema.format = \"filename\";\n }\n\n // String constraints\n if (prop.type === \"string\") {\n if (prop.minLength !== undefined) propSchema.minLength = prop.minLength;\n if (prop.maxLength !== undefined) propSchema.maxLength = prop.maxLength;\n if (prop.pattern) propSchema.pattern = prop.pattern;\n if (prop.enum && prop.enum.length > 0) propSchema.enum = prop.enum;\n }\n\n // Numeric constraints\n if (prop.type === \"number\" || prop.type === \"integer\") {\n if (prop.minimum !== undefined) propSchema.minimum = prop.minimum;\n if (prop.maximum !== undefined) propSchema.maximum = prop.maximum;\n }\n\n // Array constraints\n if (prop.type === \"array\") {\n if (prop.minItems !== undefined) propSchema.minItems = prop.minItems;\n if (prop.maxItems !== undefined) propSchema.maxItems = prop.maxItems;\n if (prop.uniqueItems) propSchema.uniqueItems = prop.uniqueItems;\n\n // Add items schema recursively\n if (prop.items) {\n propSchema.items = buildProperties([prop.items])[prop.items.key] || {\n type: prop.items.type,\n };\n }\n }\n\n // Object properties and required fields\n if (prop.type === \"object\" && prop.children && prop.children.length > 0) {\n propSchema.properties = buildProperties(prop.children);\n const requiredChildren = prop.children\n .filter((c) => c.required && c.key)\n .map((c) => c.key);\n if (requiredChildren.length > 0) {\n propSchema.required = requiredChildren;\n }\n }\n\n result[prop.key] = propSchema;\n });\n\n return result;\n};\n","// JSON Schema parsing utilities\n\nimport { JSONSchema7 } from \"json-schema\";\nimport type { PropertyData, SchemaMetadata } from \"@/types/schema\";\nimport { generatePropertyId } from \"./id-generator\";\n\nexport interface ParsedSchema {\n properties: PropertyData[];\n metadata?: SchemaMetadata;\n}\n\n/**\n * Parse a JSON Schema into PropertyData array\n */\nexport const parseSchema = (schema: JSONSchema7): ParsedSchema => {\n const result: ParsedSchema = {\n properties: [],\n };\n\n // Extract metadata if present\n if (schema.title || schema.description) {\n result.metadata = {\n title: typeof schema.title === \"string\" ? schema.title : \"\",\n description:\n typeof schema.description === \"string\" ? schema.description : \"\",\n version: \"1.0.0\", // Default version\n };\n }\n\n // Parse properties\n if (schema.properties && typeof schema.properties === \"object\") {\n result.properties = parseProperties(\n schema.properties,\n Array.isArray(schema.required) ? schema.required : [],\n );\n }\n\n return result;\n};\n\n/**\n * Recursively parse properties from a JSON Schema\n */\nexport const parseProperties = (\n props: Record<string, JSONSchema7 | boolean>,\n requiredList: string[] = [],\n): PropertyData[] => {\n if (!props) return [];\n\n return Object.entries(props)\n .filter(([, propSchema]) => typeof propSchema === \"object\")\n .map(([key, propSchema]) => {\n const schema = propSchema as JSONSchema7;\n\n // Determine the type - check for file type indicators\n let propertyType = (\n typeof schema.type === \"string\" ? schema.type : \"string\"\n ) as PropertyData[\"type\"];\n\n // If it's a string with format filename, treat it as a file\n if (propertyType === \"string\" && schema.format === \"filename\") {\n propertyType = \"file\";\n }\n\n const property: PropertyData = {\n id: generatePropertyId(),\n key,\n title: typeof schema.title === \"string\" ? schema.title : undefined,\n type: propertyType,\n description:\n typeof schema.description === \"string\"\n ? schema.description\n : undefined,\n required: requiredList.includes(key),\n };\n\n // Parse string constraints\n if (schema.minLength !== undefined) property.minLength = schema.minLength;\n if (schema.maxLength !== undefined) property.maxLength = schema.maxLength;\n if (schema.pattern) property.pattern = schema.pattern;\n if (schema.enum && Array.isArray(schema.enum))\n property.enum = schema.enum as string[];\n\n // Parse numeric constraints\n if (schema.minimum !== undefined) property.minimum = schema.minimum;\n if (schema.maximum !== undefined) property.maximum = schema.maximum;\n\n // Parse array constraints\n if (schema.minItems !== undefined) property.minItems = schema.minItems;\n if (schema.maxItems !== undefined) property.maxItems = schema.maxItems;\n if (schema.uniqueItems) property.uniqueItems = schema.uniqueItems;\n\n // Parse array items recursively\n if (\n property.type === \"array\" &&\n schema.items &&\n typeof schema.items === \"object\" &&\n !Array.isArray(schema.items)\n ) {\n property.items = parseProperties(\n { item: schema.items as JSONSchema7 },\n [],\n ).find((p) => p.key === \"item\");\n }\n\n // Parse object children recursively\n if (schema.properties && typeof schema.properties === \"object\") {\n property.children = parseProperties(\n schema.properties,\n Array.isArray(schema.required) ? schema.required : [],\n );\n }\n\n return property;\n });\n};\n","// Custom hook for managing schema builder state and operations\n// INTERNAL USE ONLY - not exported to external users\n\nimport { useMemo, useCallback } from \"react\";\nimport type { PropertyData, SchemaMetadata } from \"@/types/schema\";\nimport { generateSchema } from \"@/lib/schema-generator\";\nimport { parseSchema } from \"@/lib/schema-parser\";\nimport { importJsonFile, downloadJsonFile } from \"@/lib/file-utils\";\nimport { generatePropertyId } from \"@/lib/id-generator\";\n\nexport interface UseSchemaBuilderReturn {\n properties: PropertyData[];\n metadata: SchemaMetadata;\n addProperty: () => PropertyData;\n updateProperty: (id: string, updated: PropertyData) => void;\n deleteProperty: (id: string) => void;\n clearAll: () => void;\n updateMetadata: (field: keyof SchemaMetadata, value: string) => void;\n importSchema: () => Promise<void>;\n downloadSchema: () => void;\n}\n\ninterface UseSchemaBuilderOptions {\n schema: any;\n onChange: (schema: any) => void;\n includeMetadata?: boolean;\n}\n\nexport const useSchemaBuilder = ({\n schema,\n onChange,\n includeMetadata = true,\n}: UseSchemaBuilderOptions): UseSchemaBuilderReturn => {\n // Parse properties and metadata from controlled schema prop\n const { properties: parsedProperties, metadata: parsedMetadata } = useMemo(\n () => parseSchema(schema),\n [schema],\n );\n\n const properties = parsedProperties;\n const metadata = parsedMetadata || {\n title: \"\",\n description: \"\",\n version: \"\",\n };\n\n // Add a new property\n const addProperty = useCallback((): PropertyData => {\n const property: PropertyData = {\n id: generatePropertyId(),\n key: \"\",\n type: \"string\",\n required: false,\n };\n return property;\n }, []);\n\n // Update an existing property or add it if it doesn't exist\n const updateProperty = useCallback(\n (id: string, updated: PropertyData) => {\n const exists = properties.some((p) => p.id === id);\n let updatedProperties: PropertyData[];\n\n if (exists) {\n updatedProperties = properties.map((p) => (p.id === id ? updated : p));\n } else {\n // If property doesn't exist, add it\n updatedProperties = [...properties, updated];\n }\n\n const newSchema = generateSchema(\n updatedProperties,\n metadata,\n includeMetadata,\n );\n onChange(newSchema);\n },\n [properties, metadata, includeMetadata, onChange],\n );\n\n // Delete a property\n const deleteProperty = useCallback(\n (id: string) => {\n const updatedProperties = properties.filter((p) => p.id !== id);\n const newSchema = generateSchema(\n updatedProperties,\n metadata,\n includeMetadata,\n );\n onChange(newSchema);\n },\n [properties, metadata, includeMetadata, onChange],\n );\n\n // Clear all properties and reset metadata\n const clearAll = useCallback(() => {\n const emptyMetadata = { title: \"\", description: \"\", version: \"\" };\n const newSchema = generateSchema([], emptyMetadata, includeMetadata);\n onChange(newSchema);\n }, [includeMetadata, onChange]);\n\n // Update metadata field\n const updateMetadata = useCallback(\n (field: keyof SchemaMetadata, value: string) => {\n const updatedMetadata = { ...metadata, [field]: value };\n const newSchema = generateSchema(\n properties,\n updatedMetadata,\n includeMetadata,\n );\n onChange(newSchema);\n },\n [properties, metadata, includeMetadata, onChange],\n );\n\n // Import schema from file\n const importSchema = useCallback(async () => {\n const data = await importJsonFile();\n onChange(data);\n }, [onChange]);\n\n // Download schema as file\n const downloadSchema = useCallback(() => {\n downloadJsonFile(schema, \"schema.json\");\n }, [schema]);\n\n return {\n properties,\n metadata,\n addProperty,\n updateProperty,\n deleteProperty,\n clearAll,\n updateMetadata,\n importSchema,\n downloadSchema,\n };\n};\n","import { Moon, Sun } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { useEffect, useState } from \"react\";\n\nexport default function ThemeToggle() {\n const [theme, setTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n const stored = localStorage.getItem(\"theme\") as \"light\" | \"dark\" | null;\n const initial =\n stored ||\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\");\n setTheme(initial);\n document.documentElement.classList.toggle(\"dark\", initial === \"dark\");\n }, []);\n\n const toggleTheme = () => {\n const newTheme = theme === \"light\" ? \"dark\" : \"light\";\n setTheme(newTheme);\n localStorage.setItem(\"theme\", newTheme);\n document.documentElement.classList.toggle(\"dark\", newTheme === \"dark\");\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggleTheme}\n data-testid=\"button-theme-toggle\"\n >\n {theme === \"light\" ? (\n <Moon className=\"w-4 h-4\" />\n ) : (\n <Sun className=\"w-4 h-4\" />\n )}\n </Button>\n );\n}\n","import { Button } from \"@/components/ui/button\";\nimport { Plus, Upload, Trash2 } from \"lucide-react\";\nimport PropertyDocument from \"@/components/PropertyDocument\";\nimport PropertyEditDialog from \"@/components/PropertyEditDialog\";\nimport JsonOutput from \"@/components/JsonOutput\";\nimport SchemaMetadata from \"@/components/SchemaMetadata\";\nimport type {\n PropertyData,\n SchemaMetadata as SchemaMetadataType,\n} from \"@/types/schema\";\nimport { useSchemaBuilder } from \"@/hooks/useSchemaBuilder\";\nimport { useDialogManager } from \"@/hooks/useDialogManager\";\nimport ThemeToggle from \"./ThemeToggle\";\nimport {\n TypeLabelsProvider,\n type TypeLabels,\n} from \"@/contexts/TypeLabelsContext\";\n\nexport interface JsonSchemaBuilderProps {\n /**\n * The JSON schema object (controlled)\n */\n schema: any;\n\n /**\n * Callback fired when the schema changes\n */\n onChange: (schema: any) => void;\n\n /**\n * Whether to show metadata fields (title, description, version)\n * @default false\n */\n showMetadata?: boolean;\n\n /**\n * Whether to show the import button\n * @default true\n */\n showImport?: boolean;\n\n /**\n * Whether to show the clear all button\n * @default true\n */\n showClear?: boolean;\n\n /**\n * Whether to show the JSON output panel\n * @default true\n */\n showOutput?: boolean;\n\n /**\n * Custom class name for the container\n */\n className?: string;\n\n showHeader?: boolean;\n\n /**\n * Custom labels for property types\n * @example { string: 'Text', boolean: 'Yes/No', object: 'Form', array: 'List' }\n */\n typeLabels?: TypeLabels;\n\n /**\n * Whether to show summary in the bottom of the document area\n * @default true\n */\n showSummary?: boolean;\n\n /**\n * Custom label for top-level properties\n * @example { singular: 'input', plural: 'inputs' }\n * @default { singular: 'property', plural: 'properties' }\n */\n propertyLabel?: {\n singular: string;\n plural: string;\n };\n\n /**\n * Whether to show the regex pattern field in string constraints\n * @default false\n */\n showRegex?: boolean;\n\n /**\n * Whether to allow editing property keys after initialization\n * @default false\n */\n keyEditable?: boolean;\n}\n\n/**\n * A visual JSON Schema builder component that allows building JSON schemas interactively\n */\nexport function JsonSchemaBuilder({\n schema,\n onChange,\n showMetadata = false,\n showImport = true,\n showClear = true,\n showOutput = true,\n showHeader = true,\n className = \"\",\n showSummary = false,\n typeLabels,\n propertyLabel = { singular: \"property\", plural: \"properties\" },\n showRegex = false,\n keyEditable = false,\n}: JsonSchemaBuilderProps) {\n const {\n properties,\n metadata,\n addProperty: createProperty,\n updateProperty,\n deleteProperty,\n clearAll: clearAllProperties,\n updateMetadata,\n importSchema,\n } = useSchemaBuilder({\n schema,\n onChange,\n includeMetadata: showMetadata,\n });\n\n const addPropertyDialog = useDialogManager<PropertyData>({\n createInitialData: () => createProperty(),\n onConfirm: (property) => {\n updateProperty(property.id, property);\n },\n });\n\n const clearAll = () => {\n clearAllProperties();\n };\n\n const handleImport = async () => {\n await importSchema();\n };\n\n return (\n <TypeLabelsProvider customLabels={typeLabels}>\n <div className={`${className} flex flex-col json-schema-builder-react`}>\n {showHeader && (\n <header className=\"h-16 border-b flex items-center justify-between px-6\">\n <div className=\"flex items-center gap-3\">\n {showImport && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleImport}\n data-testid=\"button-import\"\n >\n <Upload className=\"w-4 h-4\" />\n </Button>\n )}\n {showClear && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={clearAll}\n disabled={properties.length === 0}\n data-testid=\"button-clear\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n )}\n <ThemeToggle />\n </div>\n </header>\n )}\n\n <div className=\"flex-1 flex overflow-hidden\">\n <div className={showOutput ? \"w-3/5 border-r\" : \"w-full\"}>\n <div className=\"h-full flex flex-col\">\n <div className=\"flex-1 overflow-auto p-2 space-y-4\">\n {showMetadata && (\n <SchemaMetadata\n title={metadata.title}\n description={metadata.description}\n version={metadata.version}\n onUpdate={(field, value) =>\n updateMetadata(field as keyof SchemaMetadataType, value)\n }\n />\n )}\n\n {properties.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"w-16 h-16 rounded-full bg-muted flex items-center justify-center mb-4\">\n <Plus className=\"w-8 h-8 text-muted-foreground\" />\n </div>\n <h2 className=\"text-lg font-medium mb-2\">\n No {propertyLabel.plural} yet\n </h2>\n <p className=\"text-sm text-muted-foreground mb-6 max-w-sm\">\n Start building your JSON schema by adding your first{\" \"}\n {propertyLabel.singular}\n </p>\n <Button\n onClick={() => addPropertyDialog.open()}\n data-testid=\"button-add-first\"\n >\n <Plus className=\"w-4 h-4 mr-2\" />\n Add {propertyLabel.singular}\n </Button>\n </div>\n ) : (\n <>\n <div className=\"space-y-1\">\n {properties.map((property) => (\n <PropertyDocument\n key={property.id}\n property={property}\n onUpdate={(updated) =>\n updateProperty(property.id, updated)\n }\n onDelete={() => deleteProperty(property.id)}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n ))}\n </div>\n\n {showSummary && (\n <div className=\"pt-4 border-t flex items-center justify-between text-sm text-muted-foreground\">\n <span>\n {properties.length}{\" \"}\n {properties.length === 1\n ? propertyLabel.singular\n : propertyLabel.plural}\n </span>\n <span>\n {properties.filter((p) => p.required).length} required\n </span>\n </div>\n )}\n </>\n )}\n </div>\n\n {properties.length > 0 && (\n <div className=\"border-t p-2 pt-4 bg-background\">\n <Button\n onClick={() => addPropertyDialog.open()}\n className=\"w-full\"\n variant=\"outline\"\n data-testid=\"button-add-property\"\n >\n <Plus className=\"w-4 h-4\" />\n Add {propertyLabel.singular}\n </Button>\n </div>\n )}\n </div>\n </div>\n\n {showOutput && (\n <div className=\"w-2/5\">\n <JsonOutput schema={schema} />\n </div>\n )}\n </div>\n\n {addPropertyDialog.isOpen && addPropertyDialog.data && (\n <PropertyEditDialog\n property={addPropertyDialog.data}\n open={addPropertyDialog.isOpen}\n isNewProperty={true}\n onOpenChange={addPropertyDialog.setIsOpen}\n propertyLabel={propertyLabel}\n onSave={addPropertyDialog.confirm}\n showRegex={showRegex}\n keyEditable={keyEditable}\n />\n )}\n </div>\n </TypeLabelsProvider>\n );\n}\n"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","React","className","variant","size","asChild","props","ref","jsx","Slot","Input","type","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Select","SelectPrimitive","SelectValue","SelectTrigger","children","jsxs","ChevronDown","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","Check","SelectSeparator","Dialog","DialogPrimitive","DialogPortal","DialogOverlay","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","labelVariants","Label","LabelPrimitive","Checkbox","CheckboxPrimitive","Textarea","toSnakeCase","str","usePropertyEditor","property","onUpdate","isNewProperty","keyEditable","handleFieldChange","field","value","title","autoKey","key","defaultTypeLabels","TypeLabelsContext","createContext","TypeLabelsProvider","customLabels","typeLabels","getTypeLabel","useTypeLabels","useContext","PropertyEditDialog","open","onOpenChange","onSave","isArrayItem","propertyLabel","showRegex","localProperty","setLocalProperty","useState","useEffect","handleTitleChange","handleTitleBlur","handleKeyChange","handleConstraintChange","handleSave","_a","handleCancel","e","checked","index","newValue","currentEnum","newEnum","_","i","useInlineEditor","initialValue","options","allowEmpty","onEditStart","onEditCancel","isEditing","setIsEditing","setValue","startEdit","handleChange","handleBlur","trimmedValue","useTypeSelector","isChangingType","setIsChangingType","newType","updated","generatePropertyId","useDialogManager","onConfirm","onCancel","createInitialData","isOpen","setIsOpen","data","setData","initialData","dataToUse","close","confirmedData","newIsOpen","useChildManager","addChildDialog","child","childId","newChildren","c","PropertyDocument","onDelete","level","editDialog","titleEditor","descriptionEditor","typeSelector","childManager","HeadingTag","canHaveChildren","hasChildren","headingClasses","Type","Hash","CheckSquare","Braces","List","FileText","Plus","Fragment","Pencil","Trash2","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","importJsonFile","resolve","reject","input","file","reader","event","downloadJsonFile","filename","jsonString","blob","url","a","JsonOutput","schema","copied","setCopied","CheckCircle2","Copy","Download","SchemaMetadata","description","version","isExpanded","setIsExpanded","ChevronRight","generateSchema","properties","metadata","includeMetadata","buildProperties","required","p","result","prop","propSchema","requiredChildren","parseSchema","parseProperties","requiredList","propertyType","useSchemaBuilder","onChange","parsedProperties","parsedMetadata","useMemo","addProperty","useCallback","updateProperty","id","exists","updatedProperties","newSchema","deleteProperty","clearAll","updateMetadata","updatedMetadata","importSchema","downloadSchema","ThemeToggle","theme","setTheme","initial","newTheme","Moon","Sun","JsonSchemaBuilder","showMetadata","showImport","showClear","showOutput","showHeader","showSummary","createProperty","clearAllProperties","addPropertyDialog","handleImport","Upload"],"mappings":"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"}