{"version":3,"file":"index.cjs","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 type { TypeLabels } 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 } 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 *     <PropertyEditDialog\n *       property={property}\n *       open={isOpen}\n *       onOpenChange={setIsOpen}\n *       onSave={(updated) => {\n *         setProperty(updated);\n *         setIsOpen(false);\n *       }}\n *       typeLabels={{ string: 'Text', number: 'Number' }}\n *     />\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  typeLabels?: TypeLabels;\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  typeLabels: customTypeLabels,\n}: PropertyEditDialogProps) {\n  const { typeLabels: contextTypeLabels } = useTypeLabels();\n\n  // Use custom typeLabels if provided, otherwise fall back to context\n  const typeLabels = customTypeLabels || contextTypeLabels;\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 { 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  Asterisk,\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\";\nimport { cn } from \"@/lib/utils\";\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  const typeClasses =\n    {\n      1: \"h-5 w-5\",\n      2: \"h-4 w-4\",\n      3: \"h-4 w-4\",\n      4: \"h-4 w-4\",\n      5: \"h-4 w-4\",\n      6: \"h-4 w-4\",\n    }[level] || \"h-5 w-5\";\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-[3px]\"\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                  <Asterisk className=\"w-6 h-6 text-primary\" />\n                ) : (\n                  // <span className=\"block w-4 h-4 rounded-full border border-dashed border-gray-400\"></span>\n                  <Asterisk className=\"w-6 h-6 text-border\" />\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 -mt-0.5 transition-colors\"\n                          >\n                            {property.type === \"string\" && (\n                              <Type\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"number\" && (\n                              <Hash\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"integer\" && (\n                              <Hash\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"boolean\" && (\n                              <CheckSquare\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"object\" && (\n                              <Braces\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"array\" && (\n                              <List\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\n                            )}\n                            {property.type === \"file\" && (\n                              <FileText\n                                className={cn(\n                                  typeClasses,\n                                  \"text-muted-foreground\",\n                                )}\n                              />\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=\"h-4 w-4\"\n                      onClick={childManager.addChild}\n                      data-testid={`button-add-child-${property.id}`}\n                    >\n                      <Plus />\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(\"rounded-xl border bg-card text-card-foreground\", className)}\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","Comp","Slot","jsx","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","customTypeLabels","contextTypeLabels","localProperty","setLocalProperty","useState","useEffect","handleTitleChange","handleTitleBlur","handleKeyChange","handleConstraintChange","handleSave","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","typeClasses","Asterisk","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","handleCopy","handleDownload","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","toggleTheme","newTheme","Moon","Sun","JsonSchemaBuilder","showMetadata","showImport","showClear","showOutput","showHeader","showSummary","createProperty","clearAllProperties","addPropertyDialog","handleImport","Upload"],"mappings":"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"}