@character-foundry/character-foundry 0.4.3-dev.1766103111 → 0.4.3-dev.1767230557
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../app-framework/src/types/context.ts","../../app-framework/src/registry/base-registry.ts","../../app-framework/src/registry/settings-registry.ts","../../app-framework/src/registry/provider-registry.ts","../../app-framework/src/registry/widget-registry.ts","../../app-framework/src/autoform/AutoForm.tsx","../../app-framework/src/autoform/introspection.ts","../../app-framework/src/autoform/hooks/useWidgetRegistry.ts","../../app-framework/src/autoform/widgets/TextInput.tsx","../../app-framework/src/autoform/widgets/Textarea.tsx","../../app-framework/src/autoform/widgets/NumberInput.tsx","../../app-framework/src/autoform/widgets/Switch.tsx","../../app-framework/src/autoform/widgets/Select.tsx","../../app-framework/src/autoform/widgets/SearchableSelect.tsx","../../app-framework/src/autoform/widgets/RadioGroup.tsx","../../app-framework/src/autoform/widgets/Slider.tsx","../../app-framework/src/autoform/widgets/ColorPicker.tsx","../../app-framework/src/autoform/widgets/TagInput.tsx","../../app-framework/src/autoform/widgets/SecretInput.tsx","../../app-framework/src/autoform/widgets/FileUpload.tsx","../../app-framework/src/autoform/field-renderer.tsx","../../app-framework/src/autoform/FieldGroup.tsx"],"sourcesContent":["/**\n * Restricted context object passed to extensions during activation.\n * Provides access to configuration and core services.\n */\nexport interface ExtensionContext<TConfig> {\n /** Current configuration (validated) */\n readonly config: TConfig;\n\n /** Update configuration (triggers re-validation) */\n setConfig: (update: Partial<TConfig>) => void;\n\n /** Core services available to extensions */\n services: ExtensionServices;\n}\n\n/**\n * Core services available to all extensions\n */\nexport interface ExtensionServices {\n /** Toast notification service */\n toast: ToastService;\n\n /** Modal dialog service */\n dialog: DialogService;\n\n /** Event bus for cross-extension communication */\n events: EventBus;\n}\n\n/**\n * Toast notification service interface\n */\nexport interface ToastService {\n /** Show success message */\n success(message: string): void;\n\n /** Show error message */\n error(message: string): void;\n\n /** Show info message */\n info(message: string): void;\n\n /** Show warning message */\n warning(message: string): void;\n}\n\n/**\n * Modal dialog service interface\n */\nexport interface DialogService {\n /** Show confirmation dialog, returns true if confirmed */\n confirm(message: string, title?: string): Promise<boolean>;\n\n /** Show alert dialog */\n alert(message: string, title?: string): Promise<void>;\n\n /** Show prompt dialog, returns input value or null if cancelled */\n prompt(message: string, defaultValue?: string): Promise<string | null>;\n}\n\n/**\n * Event bus for cross-extension communication\n */\nexport interface EventBus {\n /** Emit an event with optional payload */\n emit(event: string, payload?: unknown): void;\n\n /** Subscribe to an event, returns unsubscribe function */\n on(event: string, handler: (payload: unknown) => void): () => void;\n\n /** Subscribe to an event once */\n once(event: string, handler: (payload: unknown) => void): () => void;\n}\n\n/**\n * No-op implementations of services for testing or standalone usage\n */\nexport const noopServices: ExtensionServices = {\n toast: {\n success: () => {},\n error: () => {},\n info: () => {},\n warning: () => {},\n },\n dialog: {\n confirm: async () => false,\n alert: async () => {},\n prompt: async () => null,\n },\n events: {\n emit: () => {},\n on: () => () => {},\n once: () => () => {},\n },\n};\n","import type { RegistryListener } from '../types/registry';\n\n/**\n * Generic registry pattern for managing registered items.\n * Provides registration, lookup, and subscription capabilities.\n *\n * @template TId - Type of the item identifier (usually string)\n * @template TItem - Type of the registered item\n */\nexport class Registry<TId extends string = string, TItem = unknown> {\n private items = new Map<TId, TItem>();\n private listeners = new Set<RegistryListener<TId, TItem>>();\n\n /**\n * Register an item with the given ID.\n * Overwrites existing item with same ID (with warning).\n */\n register(id: TId, item: TItem): void {\n if (this.items.has(id)) {\n console.warn(`Registry: Overwriting existing item with id \"${id}\"`);\n }\n this.items.set(id, item);\n this.notify(id, item, 'register');\n }\n\n /**\n * Unregister an item by ID.\n * @returns true if item existed and was removed\n */\n unregister(id: TId): boolean {\n const existed = this.items.delete(id);\n if (existed) {\n this.notify(id, null, 'unregister');\n }\n return existed;\n }\n\n /**\n * Get an item by ID.\n * @returns The item or undefined if not found\n */\n get(id: TId): TItem | undefined {\n return this.items.get(id);\n }\n\n /**\n * Check if an item with the given ID exists.\n */\n has(id: TId): boolean {\n return this.items.has(id);\n }\n\n /**\n * Get all registered items as a Map.\n * Returns a copy to prevent external modification.\n */\n getAll(): Map<TId, TItem> {\n return new Map(this.items);\n }\n\n /**\n * Get all registered item IDs.\n */\n getAllIds(): TId[] {\n return Array.from(this.items.keys());\n }\n\n /**\n * Get the number of registered items.\n */\n get size(): number {\n return this.items.size;\n }\n\n /**\n * Subscribe to registry changes.\n * @returns Unsubscribe function\n */\n subscribe(listener: RegistryListener<TId, TItem>): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Clear all registered items.\n * Notifies listeners for each removed item.\n */\n clear(): void {\n const ids = this.getAllIds();\n this.items.clear();\n ids.forEach((id) => this.notify(id, null, 'unregister'));\n }\n\n /**\n * Iterate over all items.\n */\n forEach(callback: (item: TItem, id: TId) => void): void {\n this.items.forEach((item, id) => callback(item, id));\n }\n\n /**\n * Find items matching a predicate.\n */\n filter(predicate: (item: TItem, id: TId) => boolean): TItem[] {\n const results: TItem[] = [];\n this.items.forEach((item, id) => {\n if (predicate(item, id)) {\n results.push(item);\n }\n });\n return results;\n }\n\n private notify(\n id: TId,\n item: TItem | null,\n action: 'register' | 'unregister'\n ): void {\n this.listeners.forEach((listener) => listener(id, item, action));\n }\n}\n","import type { z } from 'zod';\nimport { Registry } from './base-registry';\nimport type { UIHints } from '../types/ui-hints';\n\n/**\n * A settings panel definition that can be registered.\n * Settings panels appear in the application settings UI.\n *\n * @template TSchema - Zod object schema type for the settings\n */\nexport interface SettingsPanel<\n TSchema extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> {\n /** Unique identifier for the panel */\n id: string;\n\n /** Display title for the panel */\n title: string;\n\n /** Optional description */\n description?: string;\n\n /** Icon identifier or URL */\n icon?: string;\n\n /** Zod schema defining the settings shape */\n schema: TSchema;\n\n /** Default values for settings */\n defaultValues?: z.infer<TSchema>;\n\n /** UI hints for customizing field rendering */\n uiHints?: UIHints<z.infer<TSchema>>;\n\n /** Order priority (lower = earlier in list) */\n order?: number;\n\n /** Whether this panel is hidden from the UI */\n hidden?: boolean;\n}\n\n/**\n * Registry for settings panels.\n * Allows extensions to inject settings panels into the app settings UI.\n */\nexport class SettingsRegistry extends Registry<string, SettingsPanel> {\n /**\n * Register a settings panel.\n */\n registerPanel<T extends z.ZodObject<z.ZodRawShape>>(\n panel: SettingsPanel<T>\n ): void {\n super.register(panel.id, panel as SettingsPanel);\n }\n\n /**\n * Get all panels sorted by order (lower order = earlier).\n * Hidden panels are excluded.\n */\n getSortedPanels(): SettingsPanel[] {\n return Array.from(this.getAll().values())\n .filter((panel) => !panel.hidden)\n .sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n }\n\n /**\n * Get a panel by ID with proper typing.\n */\n getPanel<T extends z.ZodObject<z.ZodRawShape>>(\n id: string\n ): SettingsPanel<T> | undefined {\n return this.get(id) as SettingsPanel<T> | undefined;\n }\n}\n\n/**\n * Default settings registry instance.\n * Can be used directly or replaced with a custom instance.\n */\nexport const settingsRegistry = new SettingsRegistry();\n","import type { z } from 'zod';\nimport { Registry } from './base-registry';\nimport type { UIHints } from '../types/ui-hints';\n\n/**\n * A provider definition that can be registered.\n * Providers are services like LLM backends, storage adapters, etc.\n *\n * @template TConfig - Zod object schema type for the provider config\n * @template TClient - Type of the client/service instance created by the provider\n */\nexport interface Provider<\n TConfig extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n TClient = unknown,\n> {\n /** Unique identifier for the provider */\n id: string;\n\n /** Display name for the provider */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /** Icon identifier or URL */\n icon?: string;\n\n /** Zod schema defining the configuration shape */\n configSchema: TConfig;\n\n /** Default configuration values */\n defaultConfig?: z.infer<TConfig>;\n\n /** UI hints for customizing config form rendering */\n uiHints?: UIHints<z.infer<TConfig>>;\n\n /** Factory function to create the client/service instance */\n createClient: (config: z.infer<TConfig>) => TClient | Promise<TClient>;\n\n /** Optional validation beyond Zod schema (e.g., API key verification) */\n validateConfig?: (\n config: z.infer<TConfig>\n ) => Promise<{ valid: boolean; error?: string }>;\n}\n\n/**\n * Registry for providers of a specific type.\n * Use separate instances for different provider types (LLM, Storage, etc.).\n *\n * @template TClient - Common client interface type for this registry\n */\nexport class ProviderRegistry<TClient = unknown> extends Registry<\n string,\n Provider<z.ZodObject<z.ZodRawShape>, TClient>\n> {\n constructor(private readonly providerType?: string) {\n super();\n }\n\n /**\n * Register a provider.\n */\n registerProvider<T extends z.ZodObject<z.ZodRawShape>>(\n provider: Provider<T, TClient>\n ): void {\n // Cast through unknown to handle generic type variance\n super.register(\n provider.id,\n provider as unknown as Provider<z.ZodObject<z.ZodRawShape>, TClient>\n );\n }\n\n /**\n * Get a provider by ID with proper typing.\n */\n getProvider<T extends z.ZodObject<z.ZodRawShape>>(\n id: string\n ): Provider<T, TClient> | undefined {\n return this.get(id) as Provider<T, TClient> | undefined;\n }\n\n /**\n * Create a client instance for a provider.\n * Validates config against schema and runs custom validation if provided.\n *\n * @throws Error if provider not found, config invalid, or custom validation fails\n */\n async createClient<T extends z.ZodObject<z.ZodRawShape>>(\n providerId: string,\n config: z.infer<T>\n ): Promise<TClient> {\n const provider = this.get(providerId);\n if (!provider) {\n throw new Error(\n `Provider \"${providerId}\" not found${this.providerType ? ` in ${this.providerType} registry` : ''}`\n );\n }\n\n // Validate config against schema\n const result = provider.configSchema.safeParse(config);\n if (!result.success) {\n throw new Error(`Invalid provider config: ${result.error.message}`);\n }\n\n // Run custom validation if provided\n if (provider.validateConfig) {\n const validation = await provider.validateConfig(result.data);\n if (!validation.valid) {\n throw new Error(validation.error ?? 'Provider config validation failed');\n }\n }\n\n return provider.createClient(result.data);\n }\n\n /**\n * Get all providers as an array.\n */\n getAllProviders(): Provider<z.ZodObject<z.ZodRawShape>, TClient>[] {\n return Array.from(this.getAll().values());\n }\n}\n\n/**\n * Create a typed provider registry for a specific client type.\n */\nexport function createProviderRegistry<TClient>(\n providerType?: string\n): ProviderRegistry<TClient> {\n return new ProviderRegistry<TClient>(providerType);\n}\n","import type { ComponentType } from 'react';\nimport { Registry } from './base-registry';\nimport type { BuiltinWidget, FieldWidgetProps } from '../types/ui-hints';\n\n/**\n * Widget component type for the registry.\n */\nexport type WidgetComponent = ComponentType<FieldWidgetProps<unknown>>;\n\n/**\n * Widget definition for registration.\n */\nexport interface WidgetDefinition {\n /** Unique identifier for the widget */\n id: string;\n\n /** Display name */\n name?: string;\n\n /** The React component to render */\n component: WidgetComponent;\n\n /** Description of when to use this widget */\n description?: string;\n}\n\n/**\n * Registry for custom form widgets.\n * Allows extensions to add custom field rendering components.\n */\nexport class WidgetRegistry extends Registry<string, WidgetDefinition> {\n /**\n * Register a custom widget.\n */\n registerWidget(definition: WidgetDefinition): void {\n super.register(definition.id, definition);\n }\n\n /**\n * Register a widget component directly with just an ID.\n */\n registerComponent(id: string, component: WidgetComponent): void {\n super.register(id, { id, component });\n }\n\n /**\n * Get a widget component by ID.\n * Returns the component directly, not the definition.\n */\n getComponent(id: string): WidgetComponent | undefined {\n return this.get(id)?.component;\n }\n\n /**\n * Check if a widget ID is a built-in widget type.\n * This list must stay in sync with the BuiltinWidget type in ui-hints.ts.\n */\n isBuiltinWidget(id: string): id is BuiltinWidget {\n const builtins: string[] = [\n 'text',\n 'number',\n 'password',\n 'textarea',\n 'switch',\n 'checkbox',\n 'select',\n 'radio',\n 'slider',\n 'color-picker',\n 'tag-input',\n 'searchable-select',\n 'file-upload',\n ];\n return builtins.includes(id);\n }\n}\n\n/**\n * Default widget registry instance.\n */\nexport const widgetRegistry = new WidgetRegistry();\n","import { useMemo, useEffect, useCallback, useRef, useState, type ReactNode } from 'react';\nimport { z } from 'zod';\nimport { useForm, Controller, FormProvider, type DefaultValues, type Path } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { analyzeSchema, flattenSchema, getValueAtPath, type FieldInfo } from './introspection';\nimport { FieldRenderer } from './field-renderer';\nimport type { UIHints, FieldUIHint, FieldCondition } from '../types/ui-hints';\nimport { WidgetRegistry } from '../registry/widget-registry';\nimport { WidgetRegistryContext } from './hooks/useWidgetRegistry';\n\n// Known FieldUIHint keys for detection (module-level constant for hoisting)\nconst HINT_KEYS = new Set([\n 'widget', 'label', 'placeholder', 'helperText', 'hidden', 'readOnly',\n 'className', 'condition', 'group', 'rows', 'accept', 'multiple', 'maxSize',\n 'options', 'searchable', 'searchPlaceholder', 'noResultsText',\n]);\n\n/**\n * Props for the AutoForm component.\n *\n * @template T - Zod object schema type\n */\nexport interface AutoFormProps<T extends z.ZodObject<z.ZodRawShape>> {\n /** Zod object schema defining the form shape */\n schema: T;\n\n /** Current values (for controlled mode) */\n values?: z.infer<T>;\n\n /** Default values for the form */\n defaultValues?: Partial<z.infer<T>>;\n\n /** Called when values change (controlled mode) */\n onChange?: (values: z.infer<T>) => void;\n\n /** Called on form submit with validated data */\n onSubmit?: (values: z.infer<T>) => void | Promise<void>;\n\n /** UI hints for customizing field rendering */\n uiHints?: UIHints<z.infer<T>>;\n\n /** Custom field order (array of field names) */\n fieldOrder?: Array<keyof z.infer<T>>;\n\n /** Disable all fields */\n disabled?: boolean;\n\n /** Show submit button */\n withSubmit?: boolean;\n\n /** Submit button text */\n submitText?: string;\n\n /** Custom className for form container */\n className?: string;\n\n /** Custom widget registry */\n widgetRegistry?: WidgetRegistry;\n\n /**\n * Render prop for custom form layout.\n * If provided, you control how fields and submit button are rendered.\n */\n children?: (props: {\n /** Array of rendered field elements */\n fields: ReactNode[];\n /** Submit button element (null if withSubmit=false) */\n submit: ReactNode;\n /** Form state from react-hook-form */\n formState: { isSubmitting: boolean; isValid: boolean; isDirty: boolean };\n /**\n * Get a specific field by name.\n * Supports dot notation for nested fields: getField('profile.name')\n */\n getField: (name: string) => ReactNode | null;\n /**\n * Get fields belonging to a group (from uiHints.group).\n */\n getFieldsByGroup: (group: string) => ReactNode[];\n }) => ReactNode;\n}\n\n/**\n * Schema-driven form component that automatically renders fields\n * based on a Zod object schema.\n *\n * Features:\n * - Nested object support\n * - Conditional field visibility\n * - Custom widget integration\n * - Full react-hook-form integration\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * name: z.string().describe('Your name'),\n * profile: z.object({\n * bio: z.string(),\n * website: z.string().url().optional(),\n * }),\n * kind: z.enum(['basic', 'advanced']),\n * advancedOption: z.string().optional(),\n * });\n *\n * <AutoForm\n * schema={schema}\n * uiHints={{\n * advancedOption: {\n * condition: { field: 'kind', equals: 'advanced' }\n * }\n * }}\n * onSubmit={(data) => console.log(data)}\n * withSubmit\n * />\n * ```\n */\nexport function AutoForm<T extends z.ZodObject<z.ZodRawShape>>({\n schema,\n values,\n defaultValues,\n onChange,\n onSubmit,\n uiHints = {} as UIHints<z.infer<T>>,\n fieldOrder,\n disabled = false,\n withSubmit = false,\n submitText = 'Submit',\n className,\n widgetRegistry,\n children,\n}: AutoFormProps<T>) {\n // Analyze schema - get top-level fields\n const fieldInfoMap = useMemo(() => analyzeSchema(schema), [schema]);\n\n // Also flatten for nested field access\n const flatFieldInfoMap = useMemo(() => flattenSchema(schema), [schema]);\n\n // Extract default values from schema (including nested)\n const schemaDefaults = useMemo(() => {\n const defaults: Record<string, unknown> = {};\n\n function extractDefaults(fields: Map<string, FieldInfo>, prefix = '') {\n fields.forEach((info, key) => {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (info.defaultValue !== undefined) {\n setNestedValue(defaults, fullKey, info.defaultValue);\n }\n if (info.nestedFields) {\n extractDefaults(info.nestedFields, fullKey);\n }\n });\n }\n\n extractDefaults(fieldInfoMap);\n return defaults;\n }, [fieldInfoMap]);\n\n // Properly merge nested defaults using deep merge\n const mergedDefaults = useMemo(() => {\n return deepMerge(\n deepMerge(schemaDefaults, defaultValues as Record<string, unknown> ?? {}),\n values as Record<string, unknown> ?? {}\n );\n }, [schemaDefaults, defaultValues, values]);\n\n // Setup react-hook-form\n // shouldUnregister ensures hidden/conditional fields don't leak stale values\n const methods = useForm<z.infer<T>>({\n resolver: zodResolver(schema),\n defaultValues: mergedDefaults as DefaultValues<z.infer<T>>,\n mode: 'onChange',\n shouldUnregister: true,\n });\n\n const { control, handleSubmit, watch, formState, reset, getValues } = methods;\n\n // Track previous values to avoid unnecessary resets in controlled mode\n const prevValuesRef = useRef<z.infer<T> | undefined>(values);\n\n // PERFORMANCE: Extract condition fields from uiHints to watch only those\n // This avoids re-rendering on every keystroke for non-conditional forms\n const conditionFields = useMemo(() => {\n const fields = new Set<string>();\n const extractConditionFields = (hints: Record<string, unknown>, prefix = '') => {\n for (const [key, value] of Object.entries(hints)) {\n if (!value || typeof value !== 'object') continue;\n const hint = value as Record<string, unknown>;\n\n // Check for condition.field\n if (hint.condition && typeof hint.condition === 'object') {\n const condition = hint.condition as { field?: string };\n if (condition.field) {\n fields.add(condition.field);\n }\n }\n\n // Recurse into nested hints (but not into FieldUIHint objects)\n const hintKeys = Object.keys(hint);\n const isHintObject = hintKeys.length > 0 && hintKeys.every((k) => HINT_KEYS.has(k));\n if (!isHintObject) {\n extractConditionFields(hint as Record<string, unknown>, prefix ? `${prefix}.${key}` : key);\n }\n }\n };\n extractConditionFields(uiHints as Record<string, unknown>);\n return Array.from(fields);\n }, [uiHints]);\n\n // PERFORMANCE: Only watch fields used in conditions (not all fields)\n // This prevents re-renders on every keystroke for forms without conditions\n // Using a state + subscription approach instead of watch() to minimize re-renders\n const [conditionValues, setConditionValues] = useState<Record<string, unknown>>({});\n\n useEffect(() => {\n if (conditionFields.length === 0) return;\n\n // Initialize with current values\n const initial: Record<string, unknown> = {};\n const currentValues = getValues();\n for (const field of conditionFields) {\n initial[field] = getValueAtPath(currentValues as Record<string, unknown>, field);\n }\n setConditionValues(initial);\n\n // Subscribe to changes in condition fields only\n const subscription = watch((formValues, { name }) => {\n // Only update if a condition field changed\n if (name && conditionFields.includes(name)) {\n setConditionValues((prev) => ({\n ...prev,\n [name]: getValueAtPath(formValues as Record<string, unknown>, name),\n }));\n }\n });\n\n return () => subscription.unsubscribe();\n }, [conditionFields, watch, getValues]);\n\n // Sync external values in controlled mode (with deep comparison)\n useEffect(() => {\n if (values && !shallowEqual(values, prevValuesRef.current)) {\n prevValuesRef.current = values;\n // Use deep merge to properly handle nested values\n const resetValues = deepMerge(\n deepMerge(schemaDefaults, defaultValues as Record<string, unknown> ?? {}),\n values as Record<string, unknown> ?? {}\n );\n reset(resetValues as z.infer<T>);\n }\n }, [values, reset, schemaDefaults, defaultValues]);\n\n // PERFORMANCE: Use subscription for onChange instead of watch() + useEffect\n // This avoids re-rendering the entire form on every change\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const schemaRef = useRef(schema);\n schemaRef.current = schema;\n\n useEffect(() => {\n if (!onChangeRef.current) return;\n\n // Subscribe to form value changes (doesn't cause re-renders)\n const subscription = watch((formValues, { type }) => {\n // Only fire onChange for actual value changes, not focus/blur\n if (type !== 'change') return;\n\n // Validate with schema and call onChange if valid\n const result = schemaRef.current.safeParse(formValues);\n if (result.success && onChangeRef.current) {\n onChangeRef.current(result.data);\n }\n });\n\n return () => subscription.unsubscribe();\n }, [watch]);\n\n // Check if an object is a FieldUIHint (ALL keys must be known hint keys AND at least one exists)\n const isFieldUIHint = useCallback((obj: unknown): obj is FieldUIHint => {\n if (!obj || typeof obj !== 'object') return false;\n const keys = Object.keys(obj);\n return keys.length > 0 && keys.every((key) => HINT_KEYS.has(key));\n }, []);\n\n // Get hint for a field (supports dot notation and nested syntax)\n const getHint = useCallback(\n (fieldName: string): FieldUIHint | undefined => {\n // First try direct dot-notation key (e.g., 'profile.name')\n if (fieldName in uiHints) {\n const hint = uiHints[fieldName];\n if (isFieldUIHint(hint)) return hint;\n }\n\n // Then try nested object access (e.g., uiHints.profile.name)\n const parts = fieldName.split('.');\n let current: unknown = uiHints;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n // Check if we found a valid FieldUIHint\n if (isFieldUIHint(current)) {\n return current;\n }\n\n return undefined;\n },\n [uiHints, isFieldUIHint]\n );\n\n // Evaluate if a field's condition is met\n const isConditionMet = useCallback(\n (condition: FieldCondition | undefined): boolean => {\n if (!condition) return true;\n\n // Use the watched condition values for evaluation (only updates when condition fields change)\n const fieldValue = conditionFields.length > 0\n ? conditionValues[condition.field]\n : getValueAtPath(getValues() as Record<string, unknown>, condition.field);\n\n // Custom predicate - pass full values for complex conditions\n if (condition.when) {\n return condition.when(fieldValue, getValues() as Record<string, unknown>);\n }\n\n // Equals check\n if ('equals' in condition && condition.equals !== undefined) {\n return fieldValue === condition.equals;\n }\n\n // Not equals check\n if ('notEquals' in condition && condition.notEquals !== undefined) {\n return fieldValue !== condition.notEquals;\n }\n\n // One of check\n if (condition.oneOf) {\n return condition.oneOf.includes(fieldValue);\n }\n\n // Not one of check\n if (condition.notOneOf) {\n return !condition.notOneOf.includes(fieldValue);\n }\n\n return true;\n },\n [conditionFields, conditionValues, getValues]\n );\n\n // Determine field order (top-level only)\n const orderedFields = useMemo(() => {\n if (fieldOrder) {\n return fieldOrder.map((f) => String(f));\n }\n return Array.from(fieldInfoMap.keys());\n }, [fieldOrder, fieldInfoMap]);\n\n // Handle form submission\n const onFormSubmit = handleSubmit(async (data) => {\n await onSubmit?.(data);\n });\n\n // Recursive field renderer\n const renderField = useCallback(\n (fieldInfo: FieldInfo): ReactNode => {\n const hint = getHint(fieldInfo.name);\n\n // Check hidden hint\n if (hint?.hidden) return null;\n\n // Check condition\n if (!isConditionMet(hint?.condition)) return null;\n\n return (\n <Controller\n key={fieldInfo.name}\n name={fieldInfo.name as Path<z.infer<T>>}\n control={control}\n render={({ field, fieldState }) => (\n <FieldRenderer\n fieldInfo={fieldInfo}\n hint={hint}\n value={field.value}\n onChange={field.onChange}\n error={fieldState.error?.message}\n disabled={disabled}\n renderNestedField={renderField}\n />\n )}\n />\n );\n },\n [control, disabled, getHint, isConditionMet]\n );\n\n // Render all top-level fields\n const renderedFields = orderedFields\n .map((fieldName) => {\n const fieldInfo = fieldInfoMap.get(fieldName);\n if (!fieldInfo) return null;\n return renderField(fieldInfo);\n })\n .filter(Boolean) as ReactNode[];\n\n // Get a specific field by name (including nested)\n const getField = useCallback(\n (name: string): ReactNode | null => {\n const fieldInfo = flatFieldInfoMap.get(name);\n if (!fieldInfo) return null;\n return renderField(fieldInfo);\n },\n [flatFieldInfoMap, renderField]\n );\n\n // Get fields by group\n const getFieldsByGroup = useCallback(\n (group: string): ReactNode[] => {\n const fields: ReactNode[] = [];\n for (const [name] of flatFieldInfoMap) {\n const hint = getHint(name);\n if (hint?.group === group) {\n const rendered = getField(name);\n if (rendered) fields.push(rendered);\n }\n }\n return fields;\n },\n [flatFieldInfoMap, getField, getHint]\n );\n\n // Submit button\n const submitButton = withSubmit ? (\n <button\n type=\"submit\"\n disabled={disabled || formState.isSubmitting}\n data-autoform-submit\n >\n {formState.isSubmitting ? 'Submitting...' : submitText}\n </button>\n ) : null;\n\n // Wrap with widget registry context if provided\n const formContent = (\n <FormProvider {...methods}>\n <form onSubmit={onFormSubmit} className={className} data-autoform>\n {children ? (\n children({\n fields: renderedFields,\n submit: submitButton,\n formState: {\n isSubmitting: formState.isSubmitting,\n isValid: formState.isValid,\n isDirty: formState.isDirty,\n },\n getField,\n getFieldsByGroup,\n })\n ) : (\n <>\n {renderedFields}\n {submitButton}\n </>\n )}\n </form>\n </FormProvider>\n );\n\n if (widgetRegistry) {\n return (\n <WidgetRegistryContext.Provider value={widgetRegistry}>\n {formContent}\n </WidgetRegistryContext.Provider>\n );\n }\n\n return formContent;\n}\n\n/**\n * Deep merge two objects, with target values taking precedence.\n * Arrays are replaced, not merged.\n * SECURITY: Rejects dangerous keys to prevent prototype pollution.\n */\nfunction deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n\n for (const key of Object.keys(override)) {\n // SECURITY: Skip dangerous keys\n if (!isSafeKey(key)) continue;\n\n const baseVal = base[key];\n const overrideVal = override[key];\n\n // If both are plain objects, recurse\n if (\n isPlainObject(baseVal) &&\n isPlainObject(overrideVal)\n ) {\n result[key] = deepMerge(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>\n );\n } else if (overrideVal !== undefined) {\n // Override wins for non-objects or arrays\n result[key] = overrideVal;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is a plain object (not null, array, or other types).\n */\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return (\n val !== null &&\n typeof val === 'object' &&\n !Array.isArray(val) &&\n Object.getPrototypeOf(val) === Object.prototype\n );\n}\n\n/**\n * Dangerous property names that should never be accessed/set via path traversal.\n * These are JavaScript prototype chain keys that could enable prototype pollution attacks.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a property key is safe to access/set.\n */\nfunction isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Helper to set a value at a nested path in an object (mutating).\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(part)) {\n console.warn(`Rejected dangerous property key in path: ${part}`);\n return;\n }\n\n if (!Object.hasOwn(current, part) || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(lastPart)) {\n console.warn(`Rejected dangerous property key in path: ${lastPart}`);\n return;\n }\n current[lastPart] = value;\n }\n}\n\n/**\n * Shallow equality check for objects.\n * Prevents unnecessary reset() calls in controlled mode.\n */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return a === b;\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const valA = (a as Record<string, unknown>)[key];\n const valB = (b as Record<string, unknown>)[key];\n\n // For nested objects, do recursive shallow check (one level deep)\n if (typeof valA === 'object' && typeof valB === 'object' && valA !== null && valB !== null) {\n if (!shallowEqual(valA, valB)) return false;\n } else if (valA !== valB) {\n return false;\n }\n }\n\n return true;\n}\n","import { z } from 'zod';\n\n/**\n * Analyzed field information extracted from a Zod schema.\n */\nexport interface FieldInfo {\n /** Field name in the schema */\n name: string;\n\n /** The Zod type (unwrapped from optional/nullable/default) */\n zodType: z.ZodTypeAny;\n\n /** Zod type constructor name (e.g., 'ZodString', 'ZodNumber', 'ZodObject') */\n typeName: string;\n\n /** Whether the field is optional */\n isOptional: boolean;\n\n /** Whether the field is nullable */\n isNullable: boolean;\n\n /** Default value if specified */\n defaultValue?: unknown;\n\n /** Description from .describe() */\n description?: string;\n\n /** Enum values for z.enum() or z.nativeEnum() */\n enumValues?: string[];\n\n /** Inner type info for arrays, optionals, etc. */\n innerType?: FieldInfo;\n\n /**\n * For nested objects: Map of child field names to their FieldInfo.\n * Only populated when typeName === 'ZodObject'.\n */\n nestedFields?: Map<string, FieldInfo>;\n\n /**\n * For nested objects: The inner ZodObject schema.\n * Useful for recursive AutoForm rendering.\n */\n innerSchema?: z.ZodObject<z.ZodRawShape>;\n\n /** Validation constraints extracted from the schema */\n constraints?: FieldConstraints;\n}\n\n/**\n * Validation constraints extracted from Zod checks.\n */\nexport interface FieldConstraints {\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n regex?: RegExp;\n email?: boolean;\n url?: boolean;\n uuid?: boolean;\n int?: boolean;\n positive?: boolean;\n negative?: boolean;\n multipleOf?: number;\n}\n\n/**\n * Extract field information from a ZodObject schema.\n *\n * @param schema - Zod object schema to analyze\n * @param prefix - Optional prefix for nested field names (e.g., \"parent.\")\n * @returns Map of field names to their analyzed information\n */\nexport function analyzeSchema<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n prefix = ''\n): Map<string, FieldInfo> {\n const shape = schema.shape;\n const fields = new Map<string, FieldInfo>();\n\n for (const [name, zodType] of Object.entries(shape)) {\n const fullName = prefix ? `${prefix}.${name}` : name;\n fields.set(fullName, analyzeField(fullName, zodType as z.ZodTypeAny));\n }\n\n return fields;\n}\n\n/**\n * Flatten a nested schema into a single Map with dot-notation keys.\n * Useful for forms that need flat access to all fields.\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string(),\n * profile: z.object({\n * bio: z.string(),\n * }),\n * });\n *\n * const flat = flattenSchema(schema);\n * // Map { 'name' => ..., 'profile' => ..., 'profile.bio' => ... }\n * ```\n */\nexport function flattenSchema<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n prefix = ''\n): Map<string, FieldInfo> {\n const fields = new Map<string, FieldInfo>();\n const shape = schema.shape;\n\n for (const [name, zodType] of Object.entries(shape)) {\n const fullName = prefix ? `${prefix}.${name}` : name;\n const fieldInfo = analyzeField(fullName, zodType as z.ZodTypeAny);\n fields.set(fullName, fieldInfo);\n\n // Recursively flatten nested objects\n if (fieldInfo.typeName === 'ZodObject' && fieldInfo.innerSchema) {\n const nestedFields = flattenSchema(fieldInfo.innerSchema, fullName);\n for (const [nestedName, nestedInfo] of nestedFields) {\n fields.set(nestedName, nestedInfo);\n }\n }\n }\n\n return fields;\n}\n\n/**\n * Analyze a single Zod field to extract its type information.\n *\n * @param name - Field name (can include dots for nested paths)\n * @param zodType - Zod type to analyze\n * @returns Analyzed field information\n */\nexport function analyzeField(name: string, zodType: z.ZodTypeAny): FieldInfo {\n let currentType = zodType;\n let isOptional = false;\n let isNullable = false;\n let defaultValue: unknown;\n\n // Store the original description before unwrapping\n const description = getDescription(zodType);\n\n // Unwrap all wrapper types (optional, nullable, default, effects) in any order\n let unwrapping = true;\n while (unwrapping) {\n unwrapping = false;\n\n if (currentType instanceof z.ZodOptional) {\n isOptional = true;\n currentType = currentType.unwrap();\n unwrapping = true;\n } else if (currentType instanceof z.ZodNullable) {\n isNullable = true;\n currentType = currentType.unwrap();\n unwrapping = true;\n } else if (currentType instanceof z.ZodDefault) {\n defaultValue = currentType._def.defaultValue();\n currentType = currentType._def.innerType;\n unwrapping = true;\n } else if (currentType instanceof z.ZodEffects) {\n currentType = currentType._def.schema;\n unwrapping = true;\n }\n }\n\n // Handle ZodUnion - pick the first option for rendering\n if (currentType instanceof z.ZodUnion) {\n const options = currentType._def.options as z.ZodTypeAny[];\n if (options.length > 0 && options[0]) {\n // Use first option as representative type\n currentType = options[0];\n }\n }\n\n // Handle ZodDiscriminatedUnion - analyze the discriminator\n if (currentType instanceof z.ZodDiscriminatedUnion) {\n // For discriminated unions, we can't easily pick a single type\n // Return as 'ZodDiscriminatedUnion' and let widgets handle it\n // Consumers can use the discriminator to conditionally render\n }\n\n // Handle ZodRecord - treat as a special case (key-value pairs)\n // Records are rendered as text by default, custom widgets can handle them\n if (currentType instanceof z.ZodRecord) {\n // Leave as ZodRecord - widgets can check typeName\n }\n\n // Handle ZodSet - treat like an array\n if (currentType instanceof z.ZodSet) {\n // Leave as ZodSet - similar to array handling\n }\n\n const typeName = currentType.constructor.name;\n\n // Extract nested fields for ZodObject\n let nestedFields: Map<string, FieldInfo> | undefined;\n let innerSchema: z.ZodObject<z.ZodRawShape> | undefined;\n\n if (currentType instanceof z.ZodObject) {\n innerSchema = currentType as z.ZodObject<z.ZodRawShape>;\n nestedFields = new Map();\n const shape = currentType.shape;\n for (const [childName, childType] of Object.entries(shape)) {\n nestedFields.set(\n childName,\n analyzeField(`${name}.${childName}`, childType as z.ZodTypeAny)\n );\n }\n }\n\n return {\n name,\n zodType: currentType,\n typeName,\n isOptional,\n isNullable,\n defaultValue,\n description,\n enumValues: extractEnumValues(currentType),\n innerType: extractInnerType(name, currentType),\n nestedFields,\n innerSchema,\n constraints: extractConstraints(currentType),\n };\n}\n\n/**\n * Dangerous property names that should never be accessed via path traversal.\n * These are JavaScript prototype chain keys that could enable prototype pollution attacks.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a property key is safe to access.\n */\nfunction isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Get the value at a dot-notation path from an object.\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n *\n * @example\n * ```ts\n * getValueAtPath({ profile: { name: 'John' } }, 'profile.name') // 'John'\n * ```\n */\nexport function getValueAtPath(\n obj: Record<string, unknown>,\n path: string\n): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(part)) {\n return undefined;\n }\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n // Use Object.hasOwn to avoid prototype chain lookup\n if (!Object.hasOwn(current as object, part)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Set a value at a dot-notation path in an object (immutably).\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n *\n * @example\n * ```ts\n * setValueAtPath({ profile: { name: 'John' } }, 'profile.name', 'Jane')\n * // { profile: { name: 'Jane' } }\n * ```\n */\nexport function setValueAtPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const parts = path.split('.');\n if (parts.length === 0 || parts[0] === undefined) {\n return obj;\n }\n\n const first = parts[0];\n\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(first)) {\n console.warn(`Rejected dangerous property key in path: ${first}`);\n return obj;\n }\n\n if (parts.length === 1) {\n return { ...obj, [first]: value };\n }\n\n const rest = parts.slice(1);\n const nested = (Object.hasOwn(obj, first) ? obj[first] : {}) as Record<string, unknown> ?? {};\n\n return {\n ...obj,\n [first]: setValueAtPath(nested, rest.join('.'), value),\n };\n}\n\n/**\n * Extract description from a Zod type's definition.\n */\nfunction getDescription(zodType: z.ZodTypeAny): string | undefined {\n \n return (zodType as any)._def?.description;\n}\n\n/**\n * Extract enum values from ZodEnum or ZodNativeEnum.\n */\nfunction extractEnumValues(zodType: z.ZodTypeAny): string[] | undefined {\n if (zodType instanceof z.ZodEnum) {\n return zodType._def.values as string[];\n }\n\n if (zodType instanceof z.ZodNativeEnum) {\n const values = zodType._def.values;\n // Handle numeric enums (filter out reverse mappings)\n return Object.values(values).filter(\n (v) => typeof v === 'string'\n ) as string[];\n }\n\n return undefined;\n}\n\n/**\n * Extract inner type for compound types (arrays, sets, etc.).\n */\nfunction extractInnerType(\n name: string,\n zodType: z.ZodTypeAny\n): FieldInfo | undefined {\n if (zodType instanceof z.ZodArray) {\n return analyzeField(`${name}[]`, zodType._def.type);\n }\n\n if (zodType instanceof z.ZodSet) {\n return analyzeField(`${name}[]`, zodType._def.valueType);\n }\n\n return undefined;\n}\n\n/**\n * Extract validation constraints from Zod checks.\n */\nfunction extractConstraints(zodType: z.ZodTypeAny): FieldConstraints | undefined {\n const constraints: FieldConstraints = {};\n \n const checks = (zodType as any)._def?.checks as Array<{ kind: string; value?: unknown }> | undefined;\n\n if (!Array.isArray(checks)) {\n return undefined;\n }\n\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n if (zodType instanceof z.ZodString) {\n constraints.minLength = check.value as number;\n } else {\n constraints.min = check.value as number;\n }\n break;\n case 'max':\n if (zodType instanceof z.ZodString) {\n constraints.maxLength = check.value as number;\n } else {\n constraints.max = check.value as number;\n }\n break;\n case 'length':\n constraints.minLength = check.value as number;\n constraints.maxLength = check.value as number;\n break;\n case 'email':\n constraints.email = true;\n break;\n case 'url':\n constraints.url = true;\n break;\n case 'uuid':\n constraints.uuid = true;\n break;\n case 'regex':\n constraints.regex = check.value as RegExp;\n break;\n case 'int':\n constraints.int = true;\n break;\n case 'multipleOf':\n constraints.multipleOf = check.value as number;\n break;\n }\n }\n\n // Check for positive/negative via refinements on number\n if (zodType instanceof z.ZodNumber) {\n \n const minCheck = checks.find((c) => c.kind === 'min');\n if (minCheck && (minCheck as any).inclusive === false && minCheck.value === 0) {\n constraints.positive = true;\n }\n \n const maxCheck = checks.find((c) => c.kind === 'max');\n if (maxCheck && (maxCheck as any).inclusive === false && maxCheck.value === 0) {\n constraints.negative = true;\n }\n }\n\n return Object.keys(constraints).length > 0 ? constraints : undefined;\n}\n\n/**\n * Determine the default widget type for a Zod field.\n */\nexport function getDefaultWidgetType(fieldInfo: FieldInfo): string {\n const { typeName, description, enumValues, innerType, constraints } =\n fieldInfo;\n\n // Check for secret/password patterns in description\n if (description) {\n const lowerDesc = description.toLowerCase();\n if (\n lowerDesc.includes('password') ||\n lowerDesc.includes('secret') ||\n lowerDesc.includes('api key') ||\n lowerDesc.includes('apikey') ||\n lowerDesc.includes('token')\n ) {\n return 'password';\n }\n }\n\n // Check for email/url constraints\n if (constraints?.email) return 'text'; // Could be 'email' widget\n if (constraints?.url) return 'text'; // Could be 'url' widget\n\n // Map Zod types to widgets\n switch (typeName) {\n case 'ZodString':\n return 'text';\n case 'ZodNumber':\n return 'number';\n case 'ZodBoolean':\n return 'switch';\n case 'ZodEnum':\n case 'ZodNativeEnum':\n // Use radio for small enums, searchable-select for large\n if (enumValues) {\n if (enumValues.length <= 4) return 'radio';\n if (enumValues.length > 10) return 'searchable-select';\n }\n return 'select';\n case 'ZodArray':\n // String arrays become tag inputs\n if (innerType?.typeName === 'ZodString') {\n return 'tag-input';\n }\n return 'text'; // Fallback\n case 'ZodSet':\n // Sets are similar to arrays - string sets become tag inputs\n if (innerType?.typeName === 'ZodString') {\n return 'tag-input';\n }\n return 'text'; // Fallback\n case 'ZodObject':\n return 'nested'; // Special marker for nested objects\n case 'ZodRecord':\n return 'text'; // Records need custom widgets or JSON editor\n case 'ZodDiscriminatedUnion':\n return 'select'; // Use discriminator field to select variant\n case 'ZodDate':\n return 'text'; // Could be 'date' widget\n default:\n return 'text';\n }\n}\n\n/**\n * Check if a field should be treated as a secret/password field.\n */\nexport function isSecretField(fieldInfo: FieldInfo): boolean {\n if (!fieldInfo.description) return false;\n\n const lowerDesc = fieldInfo.description.toLowerCase();\n return (\n lowerDesc.includes('password') ||\n lowerDesc.includes('secret') ||\n lowerDesc.includes('api key') ||\n lowerDesc.includes('apikey') ||\n lowerDesc.includes('token') ||\n lowerDesc.includes('credential')\n );\n}\n\n/**\n * Check if a field is a nested object type.\n */\nexport function isNestedObject(fieldInfo: FieldInfo): boolean {\n return fieldInfo.typeName === 'ZodObject' && fieldInfo.nestedFields != null;\n}\n","import { createContext, useContext } from 'react';\nimport { WidgetRegistry, widgetRegistry } from '../../registry/widget-registry';\n\n/**\n * Context for providing a custom WidgetRegistry to AutoForm.\n */\nexport const WidgetRegistryContext = createContext<WidgetRegistry>(widgetRegistry);\n\n/**\n * Hook to access the current WidgetRegistry.\n * Returns the default registry if not wrapped in a provider.\n */\nexport function useWidgetRegistry(): WidgetRegistry {\n return useContext(WidgetRegistryContext);\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless text input widget.\n * Renders a basic text input with label, error display, and helper text.\n */\nexport function TextInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <input\n id={id}\n type=\"text\"\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n minLength={hint?.min}\n maxLength={hint?.max}\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless multi-line text input widget.\n * Renders a textarea with configurable rows.\n *\n * @example\n * ```tsx\n * // Via uiHints\n * <AutoForm\n * schema={schema}\n * uiHints={{ bio: { widget: 'textarea', rows: 5 } }}\n * />\n * ```\n */\nexport function Textarea({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const rows = hint?.rows ?? 4;\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <textarea\n id={id}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value)}\n disabled={disabled}\n readOnly={hint?.readOnly}\n placeholder={hint?.placeholder}\n rows={rows}\n minLength={hint?.min}\n maxLength={hint?.max}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n data-textarea\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Props for NumberInput - allows number | undefined since empty inputs are undefined\n */\nexport type NumberInputProps = Omit<FieldWidgetProps<number | undefined>, 'onChange'> & {\n /** Value can be number or undefined (empty) */\n value: number | undefined;\n /** onChange receives number or undefined (empty) */\n onChange: (value: number | undefined) => void;\n};\n\n/**\n * Headless number input widget.\n * Renders a number input with min/max/step support.\n *\n * Note: This widget properly handles empty inputs as `undefined`,\n * not as a type-cast lie. The form resolver handles validation\n * for required fields.\n */\nexport function NumberInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: NumberInputProps) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n if (val === '') {\n // Empty input is properly typed as undefined\n onChange(undefined);\n } else {\n const num = parseFloat(val);\n if (!isNaN(num)) {\n onChange(num);\n }\n }\n };\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <input\n id={id}\n type=\"number\"\n name={name}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n min={hint?.min}\n max={hint?.max}\n step={hint?.step}\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless switch/toggle widget.\n * Renders a checkbox with switch semantics (role=\"switch\").\n */\nexport function Switch({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n hint,\n}: FieldWidgetProps<boolean>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n <label htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n name={name}\n checked={value ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.checked)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n />\n <span data-switch-label>{label}</span>\n </label>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless select dropdown widget.\n * Renders a native select element with options from hint or enum values.\n */\nexport function Select({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const options = hint?.options ?? [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <select\n id={id}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n >\n {!required && <option value=\"\">-- Select --</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect, useMemo, type ChangeEvent, type KeyboardEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\ninterface Option {\n value: string;\n label: string;\n}\n\n/**\n * Pre-indexed option for efficient filtering.\n * Stores lowercase versions to avoid repeated lowercasing.\n */\ninterface IndexedOption {\n option: Option;\n labelLower: string;\n valueLower: string;\n}\n\n/**\n * Headless searchable select widget.\n * Renders a select with search/filter functionality for large option lists.\n *\n * @example\n * ```tsx\n * // Via uiHints\n * <AutoForm\n * schema={z.object({ country: z.enum([...countries]) })}\n * uiHints={{\n * country: {\n * widget: 'searchable-select',\n * searchPlaceholder: 'Search countries...',\n * noResultsText: 'No countries found',\n * }\n * }}\n * />\n * ```\n */\nexport function SearchableSelect({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const listboxId = `${id}-listbox`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n\n const rawOptions: Option[] = hint?.options ?? [];\n\n // PERFORMANCE: Pre-index options with lowercase strings to avoid repeated toLowerCase() calls\n // This only recalculates when options change\n const indexedOptions = useMemo((): IndexedOption[] => {\n return rawOptions.map((opt) => ({\n option: opt,\n labelLower: opt.label.toLowerCase(),\n valueLower: opt.value.toLowerCase(),\n }));\n }, [rawOptions]);\n\n // PERFORMANCE: Build a Map for O(1) value lookup\n const optionsByValue = useMemo(() => {\n const map = new Map<string, Option>();\n for (const opt of rawOptions) {\n map.set(opt.value, opt);\n }\n return map;\n }, [rawOptions]);\n\n // PERFORMANCE: Filter using pre-indexed lowercase strings\n const filteredOptions = useMemo(() => {\n if (!searchTerm) {\n return rawOptions;\n }\n const searchLower = searchTerm.toLowerCase();\n return indexedOptions\n .filter(\n (indexed) =>\n indexed.labelLower.includes(searchLower) ||\n indexed.valueLower.includes(searchLower)\n )\n .map((indexed) => indexed.option);\n }, [searchTerm, indexedOptions, rawOptions]);\n\n // Get display label for current value using O(1) Map lookup\n const selectedOption = optionsByValue.get(value ?? '');\n const displayValue = selectedOption?.label ?? value ?? '';\n\n // Handle click outside to close\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n setSearchTerm('');\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (isOpen && highlightedIndex >= 0 && listRef.current) {\n const item = listRef.current.children[highlightedIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: 'nearest' });\n }\n }, [highlightedIndex, isOpen]);\n\n const handleOpen = useCallback(() => {\n if (!disabled && !hint?.readOnly) {\n setIsOpen(true);\n setSearchTerm('');\n setHighlightedIndex(-1);\n // Focus search input after opening\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }, [disabled, hint?.readOnly]);\n\n const handleSelect = useCallback(\n (optionValue: string) => {\n onChange(optionValue);\n setIsOpen(false);\n setSearchTerm('');\n },\n [onChange]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled || hint?.readOnly) return;\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n if (!isOpen) {\n handleOpen();\n } else if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleSelect(filteredOptions[highlightedIndex].value);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSearchTerm('');\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n handleOpen();\n } else {\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen) {\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1\n );\n }\n break;\n case 'Home':\n if (isOpen) {\n e.preventDefault();\n setHighlightedIndex(0);\n }\n break;\n case 'End':\n if (isOpen) {\n e.preventDefault();\n setHighlightedIndex(filteredOptions.length - 1);\n }\n break;\n }\n },\n [disabled, filteredOptions, handleOpen, handleSelect, highlightedIndex, hint?.readOnly, isOpen]\n );\n\n const handleSearchChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value);\n setHighlightedIndex(-1);\n }, []);\n\n const noResultsText = hint?.noResultsText ?? 'No results found';\n const searchPlaceholder = hint?.searchPlaceholder ?? 'Search...';\n\n return (\n <div\n ref={containerRef}\n className={hint?.className}\n data-field={name}\n data-error={hasError}\n onKeyDown={handleKeyDown}\n >\n {label && (\n <label id={`${id}-label`}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n\n <div data-searchable-select data-open={isOpen} data-disabled={disabled || hint?.readOnly}>\n {/* Trigger button */}\n <button\n type=\"button\"\n id={id}\n onClick={handleOpen}\n disabled={disabled || hint?.readOnly}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-labelledby={`${id}-label`}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') || undefined\n }\n aria-invalid={hasError}\n data-searchable-select-trigger\n >\n <span data-searchable-select-value>\n {displayValue || hint?.placeholder || 'Select...'}\n </span>\n <span data-searchable-select-arrow aria-hidden=\"true\">\n {isOpen ? '\\u25B2' : '\\u25BC'}\n </span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div data-searchable-select-dropdown>\n {/* Search input */}\n <input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={handleSearchChange}\n placeholder={searchPlaceholder}\n aria-label=\"Search options\"\n data-searchable-select-input\n />\n\n {/* Options list */}\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={`${id}-label`}\n data-searchable-select-list\n >\n {filteredOptions.length === 0 ? (\n <li data-searchable-select-no-results>{noResultsText}</li>\n ) : (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={option.value === value}\n data-searchable-select-option\n data-selected={option.value === value}\n data-highlighted={index === highlightedIndex}\n onClick={() => handleSelect(option.value)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n {option.label}\n </li>\n ))\n )}\n </ul>\n </div>\n )}\n </div>\n\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless radio button group widget.\n * Renders a group of radio buttons for single selection from options.\n */\nexport function RadioGroup({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const options = hint?.options ?? [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n <fieldset data-radio-group>\n {label && (\n <legend data-radio-legend>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </legend>\n )}\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n <div data-radio-options role=\"radiogroup\" aria-required={required}>\n {options.map((opt, index) => {\n const optionId = `${id}-${index}`;\n const isChecked = value === opt.value;\n\n return (\n <label\n key={opt.value}\n htmlFor={optionId}\n data-radio-option\n data-checked={isChecked}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={isChecked}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n />\n <span data-radio-label>{opt.label}</span>\n </label>\n );\n })}\n </div>\n </fieldset>\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless slider/range widget.\n * Renders a range input for numeric values with optional min/max/step.\n */\nexport function Slider({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<number>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const valueId = `${id}-value`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n // Extract constraints from hint\n const min = hint?.min ?? 0;\n const max = hint?.max ?? 100;\n const step = hint?.step ?? 1;\n\n // Current value or default to min\n const currentValue = value ?? min;\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id} data-slider-label>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-slider-container>\n <input\n id={id}\n type=\"range\"\n name={name}\n value={currentValue}\n min={min}\n max={max}\n step={step}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(Number(e.target.value))}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-describedby={\n [valueId, hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n />\n <output id={valueId} htmlFor={id} data-slider-value>\n {currentValue}\n </output>\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless color picker widget.\n * Renders a native color input with optional text input for hex values.\n */\nexport function ColorPicker({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const textId = `${id}-text`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n // Default to black if no value\n const currentValue = value || '#000000';\n\n // Normalize hex color (ensure 6 digits)\n const normalizeHex = (hex: string): string => {\n // Remove # if present\n let clean = hex.replace(/^#/, '');\n\n // Expand shorthand (e.g., \"fff\" -> \"ffffff\")\n if (clean.length === 3) {\n clean = clean.split('').map(c => c + c).join('');\n }\n\n // Validate hex\n if (/^[0-9a-fA-F]{6}$/.test(clean)) {\n return `#${clean.toLowerCase()}`;\n }\n\n return currentValue; // Return current if invalid\n };\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id} data-color-label>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-color-container>\n <input\n id={id}\n type=\"color\"\n name={name}\n value={currentValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n />\n <input\n id={textId}\n type=\"text\"\n value={currentValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const normalized = normalizeHex(e.target.value);\n onChange(normalized);\n }}\n onBlur={(e) => {\n // Normalize on blur\n const normalized = normalizeHex(e.target.value);\n if (normalized !== e.target.value) {\n onChange(normalized);\n }\n }}\n disabled={disabled || hint?.readOnly}\n placeholder=\"#000000\"\n pattern=\"^#[0-9a-fA-F]{6}$\"\n maxLength={7}\n data-color-text\n aria-label={`${label} hex value`}\n />\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, type KeyboardEvent, type ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless tag/chip input widget.\n * Renders an input that converts text into tags on Enter/comma.\n */\nexport function TagInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string[]>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const tags = value ?? [];\n const [inputValue, setInputValue] = useState('');\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmed = tag.trim();\n if (trimmed && !tags.includes(trimmed)) {\n onChange([...tags, trimmed]);\n }\n setInputValue('');\n },\n [tags, onChange]\n );\n\n const removeTag = useCallback(\n (index: number) => {\n onChange(tags.filter((_, i) => i !== index));\n },\n [tags, onChange]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(inputValue);\n } else if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n },\n [inputValue, tags, addTag, removeTag]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue.trim()) {\n addTag(inputValue);\n }\n }, [inputValue, addTag]);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-tag-container>\n {tags.map((tag, index) => (\n <span key={`${tag}-${index}`} data-tag>\n {tag}\n {!disabled && !hint?.readOnly && (\n <button\n type=\"button\"\n onClick={() => removeTag(index)}\n aria-label={`Remove ${tag}`}\n data-tag-remove\n >\n ×\n </button>\n )}\n </span>\n ))}\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={hint?.readOnly}\n placeholder={hint?.placeholder ?? 'Add tag...'}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n data-tag-input\n />\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, type ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless password/secret input widget.\n * Renders a password input with toggle visibility button.\n */\nexport function SecretInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const [showValue, setShowValue] = useState(false);\n\n const toggleVisibility = useCallback(() => {\n setShowValue((prev) => !prev);\n }, []);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-secret-container>\n <input\n id={id}\n type={showValue ? 'text' : 'password'}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n autoComplete=\"off\"\n data-secret-input\n />\n <button\n type=\"button\"\n onClick={toggleVisibility}\n disabled={disabled}\n aria-label={showValue ? 'Hide value' : 'Show value'}\n data-secret-toggle\n >\n {showValue ? 'Hide' : 'Show'}\n </button>\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, type ChangeEvent, type DragEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * File or array of files depending on `multiple` hint.\n */\nexport type FileUploadValue = File | File[] | null;\n\n/**\n * Headless file upload widget with drag-and-drop support.\n *\n * @example\n * ```tsx\n * // Single file\n * <AutoForm\n * schema={z.object({ avatar: z.instanceof(File).optional() })}\n * uiHints={{ avatar: { widget: 'file-upload', accept: 'image/*' } }}\n * />\n *\n * // Multiple files\n * <AutoForm\n * schema={z.object({ attachments: z.array(z.instanceof(File)) })}\n * uiHints={{ attachments: { widget: 'file-upload', multiple: true, accept: '.pdf,.doc' } }}\n * />\n * ```\n */\nexport function FileUpload({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<FileUploadValue>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const _hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n\n const accept = hint?.accept;\n const multiple = hint?.multiple ?? false;\n const maxSize = hint?.maxSize;\n\n const validateFiles = useCallback(\n (files: File[]): { valid: File[]; errors: string[] } => {\n const valid: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n // Check file size\n if (maxSize && file.size > maxSize) {\n const maxMB = (maxSize / 1024 / 1024).toFixed(1);\n errors.push(`${file.name} exceeds ${maxMB}MB limit`);\n continue;\n }\n\n // Check file type (basic validation)\n if (accept) {\n const acceptedTypes = accept.split(',').map((t) => t.trim());\n const fileExt = `.${file.name.split('.').pop()?.toLowerCase()}`;\n const fileMime = file.type;\n\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return fileExt === type.toLowerCase();\n }\n if (type.endsWith('/*')) {\n return fileMime.startsWith(type.replace('/*', '/'));\n }\n return fileMime === type;\n });\n\n if (!isAccepted) {\n errors.push(`${file.name} is not an accepted file type`);\n continue;\n }\n }\n\n valid.push(file);\n }\n\n return { valid, errors };\n },\n [accept, maxSize]\n );\n\n const handleFiles = useCallback(\n (files: FileList | null) => {\n if (!files || files.length === 0) {\n onChange(multiple ? [] : null);\n setLocalError(null);\n return;\n }\n\n const fileArray = Array.from(files);\n const { valid, errors } = validateFiles(fileArray);\n\n if (errors.length > 0) {\n setLocalError(errors.join(', '));\n } else {\n setLocalError(null);\n }\n\n if (valid.length === 0) {\n onChange(multiple ? [] : null);\n return;\n }\n\n if (multiple) {\n onChange(valid);\n } else {\n const firstFile = valid[0];\n onChange(firstFile ?? null);\n }\n },\n [multiple, onChange, validateFiles]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files);\n },\n [handleFiles]\n );\n\n const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n if (disabled || hint?.readOnly) return;\n\n handleFiles(e.dataTransfer.files);\n },\n [disabled, handleFiles, hint?.readOnly]\n );\n\n const handleClick = useCallback(() => {\n if (!disabled && !hint?.readOnly) {\n inputRef.current?.click();\n }\n }, [disabled, hint?.readOnly]);\n\n const handleRemove = useCallback(\n (index?: number) => {\n if (multiple && Array.isArray(value)) {\n if (index !== undefined) {\n const newFiles = value.filter((_, i) => i !== index);\n onChange(newFiles);\n } else {\n onChange([]);\n }\n } else {\n onChange(null);\n }\n setLocalError(null);\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [multiple, onChange, value]\n );\n\n const displayError = error ?? localError;\n\n // Get display value\n const files = multiple\n ? Array.isArray(value)\n ? value\n : []\n : value instanceof File\n ? [value]\n : [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={Boolean(displayError)}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n\n <div\n data-file-dropzone\n data-dragging={isDragging}\n data-disabled={disabled || hint?.readOnly}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n role=\"button\"\n tabIndex={disabled || hint?.readOnly ? -1 : 0}\n aria-describedby={\n [Boolean(displayError) && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n >\n <input\n ref={inputRef}\n id={id}\n type=\"file\"\n name={name}\n accept={accept}\n multiple={multiple}\n disabled={disabled || hint?.readOnly}\n onChange={handleChange}\n aria-invalid={Boolean(displayError)}\n aria-required={required}\n data-file-input\n />\n\n {files.length === 0 ? (\n <p data-file-placeholder>\n {hint?.placeholder ?? (isDragging ? 'Drop files here...' : 'Click or drag files to upload')}\n </p>\n ) : (\n <ul data-file-list>\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} data-file-item>\n <span data-file-name>{file.name}</span>\n <span data-file-size>({formatFileSize(file.size)})</span>\n {!disabled && !hint?.readOnly && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(multiple ? index : undefined);\n }}\n aria-label={`Remove ${file.name}`}\n data-file-remove\n >\n ×\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {displayError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {displayError}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n","import type { ComponentType } from 'react';\nimport type { FieldInfo } from './introspection';\nimport { getDefaultWidgetType, isSecretField } from './introspection';\nimport type { FieldUIHint, FieldWidgetProps } from '../types/ui-hints';\nimport { useWidgetRegistry } from './hooks/useWidgetRegistry';\nimport {\n TextInput,\n Textarea,\n NumberInput,\n Switch,\n Select,\n SearchableSelect,\n RadioGroup,\n Slider,\n ColorPicker,\n TagInput,\n SecretInput,\n FileUpload,\n} from './widgets';\n\n/**\n * Props for the FieldRenderer component.\n */\nexport interface FieldRendererProps {\n /** Analyzed field information from Zod schema */\n fieldInfo: FieldInfo;\n\n /** UI hints for this field */\n hint?: FieldUIHint;\n\n /** Current field value */\n value: unknown;\n\n /** Callback to update the value */\n onChange: (value: unknown) => void;\n\n /** Validation error message */\n error?: string;\n\n /** Whether the field is disabled */\n disabled?: boolean;\n\n /**\n * For nested objects: render function for nested fields.\n * Called with the nested field info to recursively render.\n */\n renderNestedField?: (fieldInfo: FieldInfo) => React.ReactNode;\n}\n\n/**\n * Map of built-in widget names to their components.\n */\nconst BUILTIN_WIDGETS: Record<string, ComponentType<FieldWidgetProps<unknown>>> = {\n text: TextInput as ComponentType<FieldWidgetProps<unknown>>,\n textarea: Textarea as ComponentType<FieldWidgetProps<unknown>>,\n number: NumberInput as ComponentType<FieldWidgetProps<unknown>>,\n switch: Switch as ComponentType<FieldWidgetProps<unknown>>,\n checkbox: Switch as ComponentType<FieldWidgetProps<unknown>>,\n select: Select as ComponentType<FieldWidgetProps<unknown>>,\n 'searchable-select': SearchableSelect as ComponentType<FieldWidgetProps<unknown>>,\n radio: RadioGroup as ComponentType<FieldWidgetProps<unknown>>,\n 'radio-group': RadioGroup as ComponentType<FieldWidgetProps<unknown>>,\n password: SecretInput as ComponentType<FieldWidgetProps<unknown>>,\n 'tag-input': TagInput as ComponentType<FieldWidgetProps<unknown>>,\n 'file-upload': FileUpload as ComponentType<FieldWidgetProps<unknown>>,\n slider: Slider as ComponentType<FieldWidgetProps<unknown>>,\n range: Slider as ComponentType<FieldWidgetProps<unknown>>,\n 'color-picker': ColorPicker as ComponentType<FieldWidgetProps<unknown>>,\n color: ColorPicker as ComponentType<FieldWidgetProps<unknown>>,\n};\n\n/**\n * Map Zod type names to default widget components.\n */\nconst TYPE_TO_WIDGET: Record<string, ComponentType<FieldWidgetProps<unknown>>> = {\n ZodString: TextInput as ComponentType<FieldWidgetProps<unknown>>,\n ZodNumber: NumberInput as ComponentType<FieldWidgetProps<unknown>>,\n ZodBoolean: Switch as ComponentType<FieldWidgetProps<unknown>>,\n ZodEnum: Select as ComponentType<FieldWidgetProps<unknown>>,\n ZodNativeEnum: Select as ComponentType<FieldWidgetProps<unknown>>,\n ZodArray: TagInput as ComponentType<FieldWidgetProps<unknown>>,\n};\n\n/**\n * Renders a single field based on its Zod type and UI hints.\n * Automatically selects the appropriate widget component.\n */\nexport function FieldRenderer({\n fieldInfo,\n hint,\n value,\n onChange,\n error,\n disabled,\n renderNestedField,\n}: FieldRendererProps) {\n const widgetRegistry = useWidgetRegistry();\n\n // Handle nested objects\n if (fieldInfo.typeName === 'ZodObject' && fieldInfo.nestedFields && renderNestedField) {\n const nestedFields = Array.from(fieldInfo.nestedFields.values());\n const fieldBaseName = fieldInfo.name.split('.').pop() ?? fieldInfo.name;\n\n return (\n <div data-nested-object data-field={fieldInfo.name}>\n <fieldset data-nested-fieldset>\n <legend data-nested-legend>\n {hint?.label ?? fieldInfo.description ?? formatLabel(fieldBaseName)}\n </legend>\n {hint?.helperText && <p data-helper>{hint.helperText}</p>}\n <div data-nested-fields>\n {nestedFields.map((nestedInfo) => renderNestedField(nestedInfo))}\n </div>\n </fieldset>\n </div>\n );\n }\n\n // Determine which widget to use\n let Widget: ComponentType<FieldWidgetProps<unknown>>;\n\n if (hint?.widget) {\n if (typeof hint.widget === 'string') {\n // Check custom widgets first, then built-in widgets\n Widget =\n widgetRegistry.getComponent(hint.widget) ??\n BUILTIN_WIDGETS[hint.widget] ??\n (TextInput as ComponentType<FieldWidgetProps<unknown>>);\n } else {\n // Custom component passed directly\n Widget = hint.widget;\n }\n } else {\n // Auto-detect from Zod type\n const defaultType = getDefaultWidgetType(fieldInfo);\n\n // Check for textarea hint (rows > 1)\n if (fieldInfo.typeName === 'ZodString' && hint?.rows && hint.rows > 1) {\n Widget = Textarea as ComponentType<FieldWidgetProps<unknown>>;\n }\n // Check for searchable-select\n else if (defaultType === 'searchable-select') {\n Widget = SearchableSelect as ComponentType<FieldWidgetProps<unknown>>;\n } else {\n Widget =\n BUILTIN_WIDGETS[defaultType] ??\n TYPE_TO_WIDGET[fieldInfo.typeName] ??\n (TextInput as ComponentType<FieldWidgetProps<unknown>>);\n }\n\n // Override to SecretInput if field looks like a secret\n if (fieldInfo.typeName === 'ZodString' && isSecretField(fieldInfo)) {\n Widget = SecretInput as ComponentType<FieldWidgetProps<unknown>>;\n }\n }\n\n // Build options from enum values if not provided in hints\n const options =\n hint?.options ??\n (fieldInfo.enumValues\n ? fieldInfo.enumValues.map((v) => ({ value: v, label: v }))\n : undefined);\n\n // Extract field base name (last segment of dot-notation path)\n const fieldBaseName = fieldInfo.name.split('.').pop() ?? fieldInfo.name;\n\n // Build the props for the widget\n const props: FieldWidgetProps<unknown> = {\n value,\n onChange,\n name: fieldInfo.name, // Full path for form registration\n label: hint?.label ?? fieldInfo.description ?? formatLabel(fieldBaseName),\n error,\n disabled: disabled || hint?.readOnly,\n required: !fieldInfo.isOptional,\n hint: {\n ...hint,\n options,\n min: hint?.min ?? fieldInfo.constraints?.min ?? fieldInfo.constraints?.minLength,\n max: hint?.max ?? fieldInfo.constraints?.max ?? fieldInfo.constraints?.maxLength,\n },\n };\n\n return <Widget {...props} />;\n}\n\n/**\n * Convert a camelCase or snake_case field name to a human-readable label.\n */\nfunction formatLabel(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1') // camelCase -> Camel Case\n .replace(/_/g, ' ') // snake_case -> snake case\n .replace(/^\\w/, (c) => c.toUpperCase()) // Capitalize first letter\n .trim();\n}\n","import { useState, useCallback } from 'react';\nimport type { FieldGroupProps } from '../types/ui-hints';\n\n/**\n * Headless field group component for organizing form sections.\n * Can be used standalone or with AutoForm's render prop.\n *\n * @example\n * ```tsx\n * // Standalone usage\n * <FieldGroup title=\"Basic Settings\">\n * <TextInput ... />\n * <NumberInput ... />\n * </FieldGroup>\n *\n * // Collapsible group\n * <FieldGroup title=\"Advanced\" collapsible defaultCollapsed>\n * <Switch ... />\n * </FieldGroup>\n *\n * // With AutoForm render prop\n * <AutoForm schema={schema}>\n * {({ getField }) => (\n * <>\n * <FieldGroup title=\"Profile\">\n * {getField('name')}\n * {getField('email')}\n * </FieldGroup>\n * <FieldGroup title=\"Preferences\" collapsible>\n * {getField('theme')}\n * {getField('notifications')}\n * </FieldGroup>\n * </>\n * )}\n * </AutoForm>\n * ```\n */\nexport function FieldGroup({\n title,\n description,\n collapsible = false,\n defaultCollapsed = false,\n className,\n children,\n}: FieldGroupProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const toggleCollapsed = useCallback(() => {\n if (collapsible) {\n setIsCollapsed((prev) => !prev);\n }\n }, [collapsible]);\n\n const headerId = `fieldgroup-${title.toLowerCase().replace(/\\s+/g, '-')}`;\n const contentId = `${headerId}-content`;\n\n return (\n <fieldset\n className={className}\n data-fieldgroup\n data-collapsible={collapsible}\n data-collapsed={isCollapsed}\n >\n {collapsible ? (\n <legend>\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n aria-expanded={!isCollapsed}\n aria-controls={contentId}\n data-fieldgroup-toggle\n >\n <span data-fieldgroup-arrow aria-hidden=\"true\">\n {isCollapsed ? '\\u25B6' : '\\u25BC'}\n </span>\n <span id={headerId} data-fieldgroup-title>\n {title}\n </span>\n </button>\n </legend>\n ) : (\n <legend id={headerId} data-fieldgroup-title>\n {title}\n </legend>\n )}\n\n {description && (\n <p data-fieldgroup-description>{description}</p>\n )}\n\n <div\n id={contentId}\n role=\"group\"\n aria-labelledby={headerId}\n data-fieldgroup-content\n hidden={collapsible && isCollapsed}\n >\n {children}\n </div>\n </fieldset>\n );\n}\n\n/**\n * Props for the FieldSection component (alias for FieldGroup).\n */\nexport type FieldSectionProps = FieldGroupProps;\n\n/**\n * Alias for FieldGroup with semantic naming.\n * Use when you prefer \"section\" terminology over \"group\".\n */\nexport const FieldSection = FieldGroup;\n"],"mappings":";AKAA,SAAS,WAAAA,UAAS,aAAAC,YAAW,eAAAC,cAAa,UAAAC,SAAQ,YAAAC,iBAAgC;AAClF,OAAkB;AAClB,SAAS,SAAS,YAAY,oBAAmD;AACjF,SAAS,mBAAmB;ACH5B,SAAS,SAAS;ACAlB,SAAS,eAAe,kBAAkB;AC0BlC,SAGI,KAHJ,YAAA;ACWA,SAGI,OAAAC,MAHJ,QAAAC,aAAA;ACgBA,SAGI,OAAAD,MAHJ,QAAAC,aAAA;AC7BF,SACE,OAAAD,MADF,QAAAC,aAAA;ACIE,SAGI,OAAAD,MAHJ,QAAAC,aAAA;AC5BR,SAAS,UAAU,aAAa,QAAQ,WAAW,eAAqD;AAoNhG,SAGI,OAAAD,MAHJ,QAAAC,aAAA;ACvLE,SAGI,OAAAD,MAHJ,QAAAC,aAAA;ACMF,SAGI,OAAAD,MAHJ,QAAAC,aAAA;ACaA,SAGI,OAAAD,MAHJ,QAAAC,aAAA;AChDR,SAAS,YAAAF,WAAU,eAAAF,oBAAyD;AAiEpE,SAGI,OAAAG,OAHJ,QAAAC,cAAA;ACjER,SAAS,YAAAF,WAAU,eAAAF,oBAAqC;AAgChD,SAGI,OAAAG,OAHJ,QAAAC,cAAA;AChCR,SAAS,YAAAF,WAAU,eAAAF,cAAa,UAAAC,eAAgD;AAuMxE,SAGI,OAAAE,OAHJ,QAAAC,cAAA;AC9FA,SACE,OAAAD,OADF,QAAAC,cAAA;AfmRI,SA+EF,UA/EE,OAAAD,OA+EF,QAAAC,cA/EE;AgB5XZ,SAAS,YAAAF,WAAU,eAAAF,oBAAmB;AAiE5B,SAOE,OAAAG,OAPF,QAAAC,cAAA;ArBYH,IAAM,eAAkC;EAC7C,OAAO;IACL,SAAS,MAAM;IAAC;IAChB,OAAO,MAAM;IAAC;IACd,MAAM,MAAM;IAAC;IACb,SAAS,MAAM;IAAC;EAClB;EACA,QAAQ;IACN,SAAS,YAAY;IACrB,OAAO,YAAY;IAAC;IACpB,QAAQ,YAAY;EACtB;EACA,QAAQ;IACN,MAAM,MAAM;IAAC;IACb,IAAI,MAAM,MAAM;IAAC;IACjB,MAAM,MAAM,MAAM;IAAC;EACrB;AACF;ACrFO,IAAM,WAAN,MAA6D;EAC1D,QAAQ,oBAAI,IAAgB;EAC5B,YAAY,oBAAI,IAAkC;;;;;EAM1D,SAAS,IAAS,MAAmB;AACnC,QAAI,KAAK,MAAM,IAAI,EAAE,GAAG;AACtB,cAAQ,KAAK,gDAAgD,EAAE,GAAG;IACpE;AACA,SAAK,MAAM,IAAI,IAAI,IAAI;AACvB,SAAK,OAAO,IAAI,MAAM,UAAU;EAClC;;;;;EAMA,WAAW,IAAkB;AAC3B,UAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,QAAI,SAAS;AACX,WAAK,OAAO,IAAI,MAAM,YAAY;IACpC;AACA,WAAO;EACT;;;;;EAMA,IAAI,IAA4B;AAC9B,WAAO,KAAK,MAAM,IAAI,EAAE;EAC1B;;;;EAKA,IAAI,IAAkB;AACpB,WAAO,KAAK,MAAM,IAAI,EAAE;EAC1B;;;;;EAMA,SAA0B;AACxB,WAAO,IAAI,IAAI,KAAK,KAAK;EAC3B;;;;EAKA,YAAmB;AACjB,WAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;EACrC;;;;EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;EACpB;;;;;EAMA,UAAU,UAAoD;AAC5D,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;EAC7C;;;;;EAMA,QAAc;AACZ,UAAM,MAAM,KAAK,UAAU;AAC3B,SAAK,MAAM,MAAM;AACjB,QAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,YAAY,CAAC;EACzD;;;;EAKA,QAAQ,UAAgD;AACtD,SAAK,MAAM,QAAQ,CAAC,MAAM,OAAO,SAAS,MAAM,EAAE,CAAC;EACrD;;;;EAKA,OAAO,WAAuD;AAC5D,UAAM,UAAmB,CAAC;AAC1B,SAAK,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC/B,UAAI,UAAU,MAAM,EAAE,GAAG;AACvB,gBAAQ,KAAK,IAAI;MACnB;IACF,CAAC;AACD,WAAO;EACT;EAEQ,OACN,IACA,MACA,QACM;AACN,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,IAAI,MAAM,MAAM,CAAC;EACjE;AACF;AC3EO,IAAM,mBAAN,cAA+B,SAAgC;;;;EAIpE,cACE,OACM;AACN,UAAM,SAAS,MAAM,IAAI,KAAsB;EACjD;;;;;EAMA,kBAAmC;AACjC,WAAO,MAAM,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC,EACrC,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,EAC/B,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,QAAQ,EAAE,SAAS,IAAI;EACvD;;;;EAKA,SACE,IAC8B;AAC9B,WAAO,KAAK,IAAI,EAAE;EACpB;AACF;AAMO,IAAM,mBAAmB,IAAI,iBAAiB;AC5B9C,IAAM,mBAAN,cAAkD,SAGvD;EACA,YAA6B,cAAuB;AAClD,UAAM;AADqB,SAAA,eAAA;EAE7B;;;;EAKA,iBACE,UACM;AAEN,UAAM;MACJ,SAAS;MACT;IACF;EACF;;;;EAKA,YACE,IACkC;AAClC,WAAO,KAAK,IAAI,EAAE;EACpB;;;;;;;EAQA,MAAM,aACJ,YACA,QACkB;AAClB,UAAM,WAAW,KAAK,IAAI,UAAU;AACpC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;QACR,aAAa,UAAU,cAAc,KAAK,eAAe,OAAO,KAAK,YAAY,cAAc,EAAE;MACnG;IACF;AAGA,UAAM,SAAS,SAAS,aAAa,UAAU,MAAM;AACrD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,OAAO,EAAE;IACpE;AAGA,QAAI,SAAS,gBAAgB;AAC3B,YAAM,aAAa,MAAM,SAAS,eAAe,OAAO,IAAI;AAC5D,UAAI,CAAC,WAAW,OAAO;AACrB,cAAM,IAAI,MAAM,WAAW,SAAS,mCAAmC;MACzE;IACF;AAEA,WAAO,SAAS,aAAa,OAAO,IAAI;EAC1C;;;;EAKA,kBAAmE;AACjE,WAAO,MAAM,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC;EAC1C;AACF;AAKO,SAAS,uBACd,cAC2B;AAC3B,SAAO,IAAI,iBAA0B,YAAY;AACnD;ACpGO,IAAM,iBAAN,cAA6B,SAAmC;;;;EAIrE,eAAe,YAAoC;AACjD,UAAM,SAAS,WAAW,IAAI,UAAU;EAC1C;;;;EAKA,kBAAkB,IAAY,WAAkC;AAC9D,UAAM,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC;EACtC;;;;;EAMA,aAAa,IAAyC;AACpD,WAAO,KAAK,IAAI,EAAE,GAAG;EACvB;;;;;EAMA,gBAAgB,IAAiC;AAC/C,UAAM,WAAqB;MACzB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF;AACA,WAAO,SAAS,SAAS,EAAE;EAC7B;AACF;AAKO,IAAM,iBAAiB,IAAI,eAAe;AEN1C,SAAS,cACd,QACA,SAAS,IACe;AACxB,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,oBAAI,IAAuB;AAE1C,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACnD,UAAM,WAAW,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAChD,WAAO,IAAI,UAAU,aAAa,UAAU,OAAuB,CAAC;EACtE;AAEA,SAAO;AACT;AAmBO,SAAS,cACd,QACA,SAAS,IACe;AACxB,QAAM,SAAS,oBAAI,IAAuB;AAC1C,QAAM,QAAQ,OAAO;AAErB,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACnD,UAAM,WAAW,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAChD,UAAM,YAAY,aAAa,UAAU,OAAuB;AAChE,WAAO,IAAI,UAAU,SAAS;AAG9B,QAAI,UAAU,aAAa,eAAe,UAAU,aAAa;AAC/D,YAAM,eAAe,cAAc,UAAU,aAAa,QAAQ;AAClE,iBAAW,CAAC,YAAY,UAAU,KAAK,cAAc;AACnD,eAAO,IAAI,YAAY,UAAU;MACnC;IACF;EACF;AAEA,SAAO;AACT;AASO,SAAS,aAAa,MAAc,SAAkC;AAC3E,MAAI,cAAc;AAClB,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI;AAGJ,QAAM,cAAc,eAAe,OAAO;AAG1C,MAAI,aAAa;AACjB,SAAO,YAAY;AACjB,iBAAa;AAEb,QAAI,uBAAuB,EAAE,aAAa;AACxC,mBAAa;AACb,oBAAc,YAAY,OAAO;AACjC,mBAAa;IACf,WAAW,uBAAuB,EAAE,aAAa;AAC/C,mBAAa;AACb,oBAAc,YAAY,OAAO;AACjC,mBAAa;IACf,WAAW,uBAAuB,EAAE,YAAY;AAC9C,qBAAe,YAAY,KAAK,aAAa;AAC7C,oBAAc,YAAY,KAAK;AAC/B,mBAAa;IACf,WAAW,uBAAuB,EAAE,YAAY;AAC9C,oBAAc,YAAY,KAAK;AAC/B,mBAAa;IACf;EACF;AAGA,MAAI,uBAAuB,EAAE,UAAU;AACrC,UAAM,UAAU,YAAY,KAAK;AACjC,QAAI,QAAQ,SAAS,KAAK,QAAQ,CAAC,GAAG;AAEpC,oBAAc,QAAQ,CAAC;IACzB;EACF;AAGA,MAAI,uBAAuB,EAAE,uBAAuB;EAIpD;AAIA,MAAI,uBAAuB,EAAE,WAAW;EAExC;AAGA,MAAI,uBAAuB,EAAE,QAAQ;EAErC;AAEA,QAAM,WAAW,YAAY,YAAY;AAGzC,MAAI;AACJ,MAAI;AAEJ,MAAI,uBAAuB,EAAE,WAAW;AACtC,kBAAc;AACd,mBAAe,oBAAI,IAAI;AACvB,UAAM,QAAQ,YAAY;AAC1B,eAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1D,mBAAa;QACX;QACA,aAAa,GAAG,IAAI,IAAI,SAAS,IAAI,SAAyB;MAChE;IACF;EACF;AAEA,SAAO;IACL;IACA,SAAS;IACT;IACA;IACA;IACA;IACA;IACA,YAAY,kBAAkB,WAAW;IACzC,WAAW,iBAAiB,MAAM,WAAW;IAC7C;IACA;IACA,aAAa,mBAAmB,WAAW;EAC7C;AACF;AAMA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAKxE,SAAS,UAAU,KAAsB;AACvC,SAAO,CAAC,eAAe,IAAI,GAAG;AAChC;AAWO,SAAS,eACd,KACA,MACS;AACT,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAmB;AAEvB,aAAW,QAAQ,OAAO;AAExB,QAAI,CAAC,UAAU,IAAI,GAAG;AACpB,aAAO;IACT;AACA,QAAI,WAAW,QAAQ,OAAO,YAAY,UAAU;AAClD,aAAO;IACT;AAEA,QAAI,CAAC,OAAO,OAAO,SAAmB,IAAI,GAAG;AAC3C,aAAO;IACT;AACA,cAAW,QAAoC,IAAI;EACrD;AAEA,SAAO;AACT;AAYO,SAAS,eACd,KACA,MACA,OACyB;AACzB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,QAAW;AAChD,WAAO;EACT;AAEA,QAAM,QAAQ,MAAM,CAAC;AAGrB,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB,YAAQ,KAAK,4CAA4C,KAAK,EAAE;AAChE,WAAO;EACT;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM;EAClC;AAEA,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,QAAM,UAAU,OAAO,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,MAAiC,CAAC;AAE5F,SAAO;IACL,GAAG;IACH,CAAC,KAAK,GAAG,eAAe,QAAQ,KAAK,KAAK,GAAG,GAAG,KAAK;EACvD;AACF;AAKA,SAAS,eAAe,SAA2C;AAEjE,SAAQ,QAAgB,MAAM;AAChC;AAKA,SAAS,kBAAkB,SAA6C;AACtE,MAAI,mBAAmB,EAAE,SAAS;AAChC,WAAO,QAAQ,KAAK;EACtB;AAEA,MAAI,mBAAmB,EAAE,eAAe;AACtC,UAAM,SAAS,QAAQ,KAAK;AAE5B,WAAO,OAAO,OAAO,MAAM,EAAE;MAC3B,CAAC,MAAM,OAAO,MAAM;IACtB;EACF;AAEA,SAAO;AACT;AAKA,SAAS,iBACP,MACA,SACuB;AACvB,MAAI,mBAAmB,EAAE,UAAU;AACjC,WAAO,aAAa,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI;EACpD;AAEA,MAAI,mBAAmB,EAAE,QAAQ;AAC/B,WAAO,aAAa,GAAG,IAAI,MAAM,QAAQ,KAAK,SAAS;EACzD;AAEA,SAAO;AACT;AAKA,SAAS,mBAAmB,SAAqD;AAC/E,QAAM,cAAgC,CAAC;AAEvC,QAAM,SAAU,QAAgB,MAAM;AAEtC,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO;EACT;AAEA,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM;MAClB,KAAK;AACH,YAAI,mBAAmB,EAAE,WAAW;AAClC,sBAAY,YAAY,MAAM;QAChC,OAAO;AACL,sBAAY,MAAM,MAAM;QAC1B;AACA;MACF,KAAK;AACH,YAAI,mBAAmB,EAAE,WAAW;AAClC,sBAAY,YAAY,MAAM;QAChC,OAAO;AACL,sBAAY,MAAM,MAAM;QAC1B;AACA;MACF,KAAK;AACH,oBAAY,YAAY,MAAM;AAC9B,oBAAY,YAAY,MAAM;AAC9B;MACF,KAAK;AACH,oBAAY,QAAQ;AACpB;MACF,KAAK;AACH,oBAAY,MAAM;AAClB;MACF,KAAK;AACH,oBAAY,OAAO;AACnB;MACF,KAAK;AACH,oBAAY,QAAQ,MAAM;AAC1B;MACF,KAAK;AACH,oBAAY,MAAM;AAClB;MACF,KAAK;AACH,oBAAY,aAAa,MAAM;AAC/B;IACJ;EACF;AAGA,MAAI,mBAAmB,EAAE,WAAW;AAElC,UAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AACpD,QAAI,YAAa,SAAiB,cAAc,SAAS,SAAS,UAAU,GAAG;AAC7E,kBAAY,WAAW;IACzB;AAEA,UAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AACpD,QAAI,YAAa,SAAiB,cAAc,SAAS,SAAS,UAAU,GAAG;AAC7E,kBAAY,WAAW;IACzB;EACF;AAEA,SAAO,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,cAAc;AAC7D;AAKO,SAAS,qBAAqB,WAA8B;AACjE,QAAM,EAAE,UAAU,aAAa,YAAY,WAAW,YAAY,IAChE;AAGF,MAAI,aAAa;AACf,UAAM,YAAY,YAAY,YAAY;AAC1C,QACE,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,QAAQ,KAC3B,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,QAAQ,KAC3B,UAAU,SAAS,OAAO,GAC1B;AACA,aAAO;IACT;EACF;AAGA,MAAI,aAAa,MAAO,QAAO;AAC/B,MAAI,aAAa,IAAK,QAAO;AAG7B,UAAQ,UAAU;IAChB,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;IACL,KAAK;AAEH,UAAI,YAAY;AACd,YAAI,WAAW,UAAU,EAAG,QAAO;AACnC,YAAI,WAAW,SAAS,GAAI,QAAO;MACrC;AACA,aAAO;IACT,KAAK;AAEH,UAAI,WAAW,aAAa,aAAa;AACvC,eAAO;MACT;AACA,aAAO;;IACT,KAAK;AAEH,UAAI,WAAW,aAAa,aAAa;AACvC,eAAO;MACT;AACA,aAAO;;IACT,KAAK;AACH,aAAO;;IACT,KAAK;AACH,aAAO;;IACT,KAAK;AACH,aAAO;;IACT,KAAK;AACH,aAAO;;IACT;AACE,aAAO;EACX;AACF;AAKO,SAAS,cAAc,WAA+B;AAC3D,MAAI,CAAC,UAAU,YAAa,QAAO;AAEnC,QAAM,YAAY,UAAU,YAAY,YAAY;AACpD,SACE,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,QAAQ,KAC3B,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,QAAQ,KAC3B,UAAU,SAAS,OAAO,KAC1B,UAAU,SAAS,YAAY;AAEnC;AAKO,SAAS,eAAe,WAA+B;AAC5D,SAAO,UAAU,aAAa,eAAe,UAAU,gBAAgB;AACzE;ACngBO,IAAM,wBAAwB,cAA8B,cAAc;AAM1E,SAAS,oBAAoC;AAClD,SAAO,WAAW,qBAAqB;AACzC;ACPO,SAAS,UAAU;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,SACE,qBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACC,qBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACC,oBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEF;MAAC;MAAA;QACC;QACA,MAAK;QACL;QACA,OAAO,SAAS;QAChB,UAAU,CAAC,MAAqC,SAAS,EAAE,OAAO,KAAK;QACvE;QACA,aAAa,MAAM;QACnB,gBAAc;QACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;QAEF,iBAAe;QACf,UAAU,MAAM;QAChB,WAAW,MAAM;QACjB,WAAW,MAAM;MAAA;IACnB;IACC,aACC,oBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACC,oBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACjDO,SAAS,SAAS;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,OAAO,MAAM,QAAQ;AAE3B,SACEA,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,sBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFA;MAAC;MAAA;QACC;QACA;QACA,OAAO,SAAS;QAChB,UAAU,CAAC,MAAwC,SAAS,EAAE,OAAO,KAAK;QAC1E;QACA,UAAU,MAAM;QAChB,aAAa,MAAM;QACnB;QACA,WAAW,MAAM;QACjB,WAAW,MAAM;QACjB,gBAAc;QACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;QAEF,iBAAe;QACf,iBAAa;MAAA;IACf;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACxDO,SAAS,YAAY;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAAqB;AACnB,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,eAAe,CAAC,MAAqC;AACzD,UAAM,MAAM,EAAE,OAAO;AACrB,QAAI,QAAQ,IAAI;AAEd,eAAS,MAAS;IACpB,OAAO;AACL,YAAM,MAAM,WAAW,GAAG;AAC1B,UAAI,CAAC,MAAM,GAAG,GAAG;AACf,iBAAS,GAAG;MACd;IACF;EACF;AAEA,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,sBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFA;MAAC;MAAA;QACC;QACA,MAAK;QACL;QACA,OAAO,SAAS;QAChB,UAAU;QACV;QACA,aAAa,MAAM;QACnB,gBAAc;QACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;QAEF,iBAAe;QACf,UAAU,MAAM;QAChB,KAAK,MAAM;QACX,KAAK,MAAM;QACX,MAAM,MAAM;MAAA;IACd;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACtFO,SAAS,OAAO;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA8B;AAC5B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC7D,UAAA;IAAAA,sBAAC,SAAA,EAAM,SAAS,IACd,UAAA;MAAAD;QAAC;QAAA;UACC;UACA,MAAK;UACL,MAAK;UACL;UACA,SAAS,SAAS;UAClB,UAAU,CAAC,MAAqC,SAAS,EAAE,OAAO,OAAO;UACzE,UAAU,YAAY,MAAM;UAC5B,gBAAc;UACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;QAAA;MAEJ;MACAA,qBAAC,QAAA,EAAK,qBAAiB,MAAE,UAAA,MAAA,CAAM;IAAA,EAAA,CACjC;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;AC9CO,SAAS,OAAO;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,UAAU,MAAM,WAAW,CAAC;AAElC,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,sBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFC;MAAC;MAAA;QACC;QACA;QACA,OAAO,SAAS;QAChB,UAAU,CAAC,MAAsC,SAAS,EAAE,OAAO,KAAK;QACxE,UAAU,YAAY,MAAM;QAC5B,gBAAc;QACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;QAEF,iBAAe;QAEd,UAAA;UAAA,CAAC,YAAYD,qBAAC,UAAA,EAAO,OAAM,IAAG,UAAA,eAAA,CAAY;UAC1C,QAAQ,IAAI,CAAC,QACZA,qBAAC,UAAA,EAAuB,OAAO,IAAI,OAChC,UAAA,IAAI,MAAA,GADM,IAAI,KAEjB,CACD;QAAA;MAAA;IACH;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;AChCO,SAAS,iBAAiB;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,YAAY,GAAG,EAAE;AACvB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,UAAU,OAAyB,IAAI;AAE7C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAC/C,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,EAAE;AAE3D,QAAM,aAAuB,MAAM,WAAW,CAAC;AAI/C,QAAM,iBAAiB,QAAQ,MAAuB;AACpD,WAAO,WAAW,IAAI,CAAC,SAAS;MAC9B,QAAQ;MACR,YAAY,IAAI,MAAM,YAAY;MAClC,YAAY,IAAI,MAAM,YAAY;IACpC,EAAE;EACJ,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,iBAAiB,QAAQ,MAAM;AACnC,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,OAAO,YAAY;AAC5B,UAAI,IAAI,IAAI,OAAO,GAAG;IACxB;AACA,WAAO;EACT,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI,CAAC,YAAY;AACf,aAAO;IACT;AACA,UAAM,cAAc,WAAW,YAAY;AAC3C,WAAO,eACJ;MACC,CAAC,YACC,QAAQ,WAAW,SAAS,WAAW,KACvC,QAAQ,WAAW,SAAS,WAAW;IAC3C,EACC,IAAI,CAAC,YAAY,QAAQ,MAAM;EACpC,GAAG,CAAC,YAAY,gBAAgB,UAAU,CAAC;AAG3C,QAAM,iBAAiB,eAAe,IAAI,SAAS,EAAE;AACrD,QAAM,eAAe,gBAAgB,SAAS,SAAS;AAGvD,YAAU,MAAM;AACd,aAAS,mBAAmB,GAAe;AACzC,UAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC5E,kBAAU,KAAK;AACf,sBAAc,EAAE;MAClB;IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;EAC3E,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,QAAI,UAAU,oBAAoB,KAAK,QAAQ,SAAS;AACtD,YAAM,OAAO,QAAQ,QAAQ,SAAS,gBAAgB;AACtD,YAAM,eAAe,EAAE,OAAO,UAAU,CAAC;IAC3C;EACF,GAAG,CAAC,kBAAkB,MAAM,CAAC;AAE7B,QAAM,aAAa,YAAY,MAAM;AACnC,QAAI,CAAC,YAAY,CAAC,MAAM,UAAU;AAChC,gBAAU,IAAI;AACd,oBAAc,EAAE;AAChB,0BAAoB,EAAE;AAEtB,iBAAW,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC;IAC/C;EACF,GAAG,CAAC,UAAU,MAAM,QAAQ,CAAC;AAE7B,QAAM,eAAe;IACnB,CAAC,gBAAwB;AACvB,eAAS,WAAW;AACpB,gBAAU,KAAK;AACf,oBAAc,EAAE;IAClB;IACA,CAAC,QAAQ;EACX;AAEA,QAAM,gBAAgB;IACpB,CAAC,MAAqC;AACpC,UAAI,YAAY,MAAM,SAAU;AAEhC,cAAQ,EAAE,KAAK;QACb,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,CAAC,QAAQ;AACX,uBAAW;UACb,WAAW,oBAAoB,KAAK,gBAAgB,gBAAgB,GAAG;AACrE,yBAAa,gBAAgB,gBAAgB,EAAE,KAAK;UACtD;AACA;QACF,KAAK;AACH,YAAE,eAAe;AACjB,oBAAU,KAAK;AACf,wBAAc,EAAE;AAChB;QACF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,CAAC,QAAQ;AACX,uBAAW;UACb,OAAO;AACL;cAAoB,CAAC,SACnB,OAAO,gBAAgB,SAAS,IAAI,OAAO,IAAI;YACjD;UACF;AACA;QACF,KAAK;AACH,YAAE,eAAe;AACjB,cAAI,QAAQ;AACV;cAAoB,CAAC,SACnB,OAAO,IAAI,OAAO,IAAI,gBAAgB,SAAS;YACjD;UACF;AACA;QACF,KAAK;AACH,cAAI,QAAQ;AACV,cAAE,eAAe;AACjB,gCAAoB,CAAC;UACvB;AACA;QACF,KAAK;AACH,cAAI,QAAQ;AACV,cAAE,eAAe;AACjB,gCAAoB,gBAAgB,SAAS,CAAC;UAChD;AACA;MACJ;IACF;IACA,CAAC,UAAU,iBAAiB,YAAY,cAAc,kBAAkB,MAAM,UAAU,MAAM;EAChG;AAEA,QAAM,qBAAqB,YAAY,CAAC,MAAqC;AAC3E,kBAAc,EAAE,OAAO,KAAK;AAC5B,wBAAoB,EAAE;EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,QAAM,oBAAoB,MAAM,qBAAqB;AAErD,SACEC;IAAC;IAAA;MACC,KAAK;MACL,WAAW,MAAM;MACjB,cAAY;MACZ,cAAY;MACZ,WAAW;MAEV,UAAA;QAAA,SACCA,sBAAC,SAAA,EAAM,IAAI,GAAG,EAAE,UACb,UAAA;UAAA;UACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;QAAA,EAAA,CAEJ;QAGFC,sBAAC,OAAA,EAAI,0BAAsB,MAAC,aAAW,QAAQ,iBAAe,YAAY,MAAM,UAE9E,UAAA;UAAAA;YAAC;YAAA;cACC,MAAK;cACL;cACA,SAAS;cACT,UAAU,YAAY,MAAM;cAC5B,iBAAc;cACd,iBAAe;cACf,mBAAiB,GAAG,EAAE;cACtB,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;cAE5E,gBAAc;cACd,kCAA8B;cAE9B,UAAA;gBAAAD,qBAAC,QAAA,EAAK,gCAA4B,MAC/B,UAAA,gBAAgB,MAAM,eAAe,YAAA,CACxC;gBACAA,qBAAC,QAAA,EAAK,gCAA4B,MAAC,eAAY,QAC5C,UAAA,SAAS,WAAW,SAAA,CACvB;cAAA;YAAA;UACF;UAGC,UACCC,sBAAC,OAAA,EAAI,mCAA+B,MAElC,UAAA;YAAAD;cAAC;cAAA;gBACC,KAAK;gBACL,MAAK;gBACL,OAAO;gBACP,UAAU;gBACV,aAAa;gBACb,cAAW;gBACX,gCAA4B;cAAA;YAC9B;YAGAA;cAAC;cAAA;gBACC,KAAK;gBACL,IAAI;gBACJ,MAAK;gBACL,mBAAiB,GAAG,EAAE;gBACtB,+BAA2B;gBAE1B,UAAA,gBAAgB,WAAW,IAC1BA,qBAAC,MAAA,EAAG,qCAAiC,MAAE,UAAA,cAAA,CAAc,IAErD,gBAAgB,IAAI,CAAC,QAAQ,UAC3BA;kBAAC;kBAAA;oBAEC,MAAK;oBACL,iBAAe,OAAO,UAAU;oBAChC,iCAA6B;oBAC7B,iBAAe,OAAO,UAAU;oBAChC,oBAAkB,UAAU;oBAC5B,SAAS,MAAM,aAAa,OAAO,KAAK;oBACxC,cAAc,MAAM,oBAAoB,KAAK;oBAE5C,UAAA,OAAO;kBAAA;kBATH,OAAO;gBAUd,CACD;cAAA;YAEL;UAAA,EAAA,CACF;QAAA,EAAA,CAEJ;QAEC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;QAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;MAAA;IAAA;EAEJ;AAEJ;ACxSO,SAAS,WAAW;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,UAAU,MAAM,WAAW,CAAC;AAElC,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC7D,UAAA;IAAAA,sBAAC,YAAA,EAAS,oBAAgB,MACvB,UAAA;MAAA,SACCA,sBAAC,UAAA,EAAO,qBAAiB,MACtB,UAAA;QAAA;QACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;MAAA,EAAA,CAEJ;MAED,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;MAEFA,qBAAC,OAAA,EAAI,sBAAkB,MAAC,MAAK,cAAa,iBAAe,UACtD,UAAA,QAAQ,IAAI,CAAC,KAAK,UAAU;AAC3B,cAAM,WAAW,GAAG,EAAE,IAAI,KAAK;AAC/B,cAAM,YAAY,UAAU,IAAI;AAEhC,eACEC;UAAC;UAAA;YAEC,SAAS;YACT,qBAAiB;YACjB,gBAAc;YAEd,UAAA;cAAAD;gBAAC;gBAAA;kBACC,IAAI;kBACJ,MAAK;kBACL;kBACA,OAAO,IAAI;kBACX,SAAS;kBACT,UAAU,CAAC,MAAqC,SAAS,EAAE,OAAO,KAAK;kBACvE,UAAU,YAAY,MAAM;kBAC5B,gBAAc;kBACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;gBAAA;cAEJ;cACAA,qBAAC,QAAA,EAAK,oBAAgB,MAAE,UAAA,IAAI,MAAA,CAAM;YAAA;UAAA;UAnB7B,IAAI;QAoBX;MAEJ,CAAC,EAAA,CACH;IAAA,EAAA,CACF;IACC,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;AC3EO,SAAS,OAAO;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAG1C,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,OAAO,MAAM,QAAQ;AAG3B,QAAM,eAAe,SAAS;AAE9B,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,sBAAC,SAAA,EAAM,SAAS,IAAI,qBAAiB,MAClC,UAAA;MAAA;MACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFC,sBAAC,OAAA,EAAI,yBAAqB,MACxB,UAAA;MAAAD;QAAC;QAAA;UACC;UACA,MAAK;UACL;UACA,OAAO;UACP;UACA;UACA;UACA,UAAU,CAAC,MAAqC,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;UAC/E,UAAU,YAAY,MAAM;UAC5B,gBAAc;UACd,iBAAe;UACf,iBAAe;UACf,iBAAe;UACf,oBACE,CAAC,SAAS,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAC9E;UAEF,iBAAe;QAAA;MACjB;MACAA,qBAAC,UAAA,EAAO,IAAI,SAAS,SAAS,IAAI,qBAAiB,MAChD,UAAA,aAAA,CACH;IAAA,EAAA,CACF;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;AC1EO,SAAS,YAAY;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,SAAS,GAAG,EAAE;AACpB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAG1C,QAAM,eAAe,SAAS;AAG9B,QAAM,eAAe,CAAC,QAAwB;AAE5C,QAAI,QAAQ,IAAI,QAAQ,MAAM,EAAE;AAGhC,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,MAAM,MAAM,EAAE,EAAE,IAAI,CAAA,MAAK,IAAI,CAAC,EAAE,KAAK,EAAE;IACjD;AAGA,QAAI,mBAAmB,KAAK,KAAK,GAAG;AAClC,aAAO,IAAI,MAAM,YAAY,CAAC;IAChC;AAEA,WAAO;EACT;AAEA,SACEC,sBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,sBAAC,SAAA,EAAM,SAAS,IAAI,oBAAgB,MACjC,UAAA;MAAA;MACA,YACCD,qBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFC,sBAAC,OAAA,EAAI,wBAAoB,MACvB,UAAA;MAAAD;QAAC;QAAA;UACC;UACA,MAAK;UACL;UACA,OAAO;UACP,UAAU,CAAC,MAAqC,SAAS,EAAE,OAAO,KAAK;UACvE,UAAU,YAAY,MAAM;UAC5B,gBAAc;UACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;UAEF,iBAAe;QAAA;MACjB;MACAA;QAAC;QAAA;UACC,IAAI;UACJ,MAAK;UACL,OAAO;UACP,UAAU,CAAC,MAAqC;AAC9C,kBAAM,aAAa,aAAa,EAAE,OAAO,KAAK;AAC9C,qBAAS,UAAU;UACrB;UACA,QAAQ,CAAC,MAAM;AAEb,kBAAM,aAAa,aAAa,EAAE,OAAO,KAAK;AAC9C,gBAAI,eAAe,EAAE,OAAO,OAAO;AACjC,uBAAS,UAAU;YACrB;UACF;UACA,UAAU,YAAY,MAAM;UAC5B,aAAY;UACZ,SAAQ;UACR,WAAW;UACX,mBAAe;UACf,cAAY,GAAG,KAAK;QAAA;MACtB;IAAA,EAAA,CACF;IACC,aACCA,qBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,qBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACpGO,SAAS,SAAS;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA+B;AAC7B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,OAAO,SAAS,CAAC;AACvB,QAAM,CAAC,YAAY,aAAa,IAAID,UAAS,EAAE;AAE/C,QAAM,SAASF;IACb,CAAC,QAAgB;AACf,YAAM,UAAU,IAAI,KAAK;AACzB,UAAI,WAAW,CAAC,KAAK,SAAS,OAAO,GAAG;AACtC,iBAAS,CAAC,GAAG,MAAM,OAAO,CAAC;MAC7B;AACA,oBAAc,EAAE;IAClB;IACA,CAAC,MAAM,QAAQ;EACjB;AAEA,QAAM,YAAYA;IAChB,CAAC,UAAkB;AACjB,eAAS,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;IAC7C;IACA,CAAC,MAAM,QAAQ;EACjB;AAEA,QAAM,gBAAgBA;IACpB,CAAC,MAAuC;AACtC,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,UAAE,eAAe;AACjB,eAAO,UAAU;MACnB,WAAW,EAAE,QAAQ,eAAe,eAAe,MAAM,KAAK,SAAS,GAAG;AACxE,kBAAU,KAAK,SAAS,CAAC;MAC3B;IACF;IACA,CAAC,YAAY,MAAM,QAAQ,SAAS;EACtC;AAEA,QAAM,aAAaA,aAAY,MAAM;AACnC,QAAI,WAAW,KAAK,GAAG;AACrB,aAAO,UAAU;IACnB;EACF,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,SACEI,uBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,uBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,sBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFC,uBAAC,OAAA,EAAI,sBAAkB,MACpB,UAAA;MAAA,KAAK,IAAI,CAAC,KAAK,UACdA,uBAAC,QAAA,EAA6B,YAAQ,MACnC,UAAA;QAAA;QACA,CAAC,YAAY,CAAC,MAAM,YACnBD;UAAC;UAAA;YACC,MAAK;YACL,SAAS,MAAM,UAAU,KAAK;YAC9B,cAAY,UAAU,GAAG;YACzB,mBAAe;YAChB,UAAA;UAAA;QAED;MAAA,EAAA,GAVO,GAAG,GAAG,IAAI,KAAK,EAY1B,CACD;MACDA;QAAC;QAAA;UACC;UACA,MAAK;UACL,OAAO;UACP,UAAU,CAAC,MAAqC,cAAc,EAAE,OAAO,KAAK;UAC5E,WAAW;UACX,QAAQ;UACR;UACA,UAAU,MAAM;UAChB,aAAa,MAAM,eAAe;UAClC,gBAAc;UACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;UAEF,kBAAc;QAAA;MAChB;IAAA,EAAA,CACF;IACC,aACCA,sBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,sBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACjHO,SAAS,YAAY;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAEhD,QAAM,mBAAmBF,aAAY,MAAM;AACzC,iBAAa,CAAC,SAAS,CAAC,IAAI;EAC9B,GAAG,CAAC,CAAC;AAEL,SACEI,uBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,UAC5D,UAAA;IAAA,SACCA,uBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,sBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAEFC,uBAAC,OAAA,EAAI,yBAAqB,MACxB,UAAA;MAAAD;QAAC;QAAA;UACC;UACA,MAAM,YAAY,SAAS;UAC3B;UACA,OAAO,SAAS;UAChB,UAAU,CAAC,MAAqC,SAAS,EAAE,OAAO,KAAK;UACvE;UACA,aAAa,MAAM;UACnB,gBAAc;UACd,oBACE,CAAC,YAAY,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KACrE;UAEF,iBAAe;UACf,UAAU,MAAM;UAChB,cAAa;UACb,qBAAiB;QAAA;MACnB;MACAA;QAAC;QAAA;UACC,MAAK;UACL,SAAS;UACT;UACA,cAAY,YAAY,eAAe;UACvC,sBAAkB;UAEjB,UAAA,YAAY,SAAS;QAAA;MACxB;IAAA,EAAA,CACF;IACC,aACCA,sBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,YACCA,sBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,MAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;ACxDO,SAAS,WAAW;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAAsC;AACpC,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,WAAW,GAAG,EAAE;AACtB,QAAM,YAAY,QAAQ,KAAK;AAC/B,QAAM,YAAY,QAAQ,MAAM,UAAU;AAE1C,QAAM,WAAWF,QAAyB,IAAI;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAEhE,QAAM,SAAS,MAAM;AACrB,QAAM,WAAW,MAAM,YAAY;AACnC,QAAM,UAAU,MAAM;AAEtB,QAAM,gBAAgBF;IACpB,CAACK,WAAuD;AACtD,YAAM,QAAgB,CAAC;AACvB,YAAM,SAAmB,CAAC;AAE1B,iBAAW,QAAQA,QAAO;AAExB,YAAI,WAAW,KAAK,OAAO,SAAS;AAClC,gBAAM,SAAS,UAAU,OAAO,MAAM,QAAQ,CAAC;AAC/C,iBAAO,KAAK,GAAG,KAAK,IAAI,YAAY,KAAK,UAAU;AACnD;QACF;AAGA,YAAI,QAAQ;AACV,gBAAM,gBAAgB,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC3D,gBAAM,UAAU,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,CAAC;AAC7D,gBAAM,WAAW,KAAK;AAEtB,gBAAM,aAAa,cAAc,KAAK,CAAC,SAAS;AAC9C,gBAAI,KAAK,WAAW,GAAG,GAAG;AACxB,qBAAO,YAAY,KAAK,YAAY;YACtC;AACA,gBAAI,KAAK,SAAS,IAAI,GAAG;AACvB,qBAAO,SAAS,WAAW,KAAK,QAAQ,MAAM,GAAG,CAAC;YACpD;AACA,mBAAO,aAAa;UACtB,CAAC;AAED,cAAI,CAAC,YAAY;AACf,mBAAO,KAAK,GAAG,KAAK,IAAI,+BAA+B;AACvD;UACF;QACF;AAEA,cAAM,KAAK,IAAI;MACjB;AAEA,aAAO,EAAE,OAAO,OAAO;IACzB;IACA,CAAC,QAAQ,OAAO;EAClB;AAEA,QAAM,cAAcL;IAClB,CAACK,WAA2B;AAC1B,UAAI,CAACA,UAASA,OAAM,WAAW,GAAG;AAChC,iBAAS,WAAW,CAAC,IAAI,IAAI;AAC7B,sBAAc,IAAI;AAClB;MACF;AAEA,YAAM,YAAY,MAAM,KAAKA,MAAK;AAClC,YAAM,EAAE,OAAO,OAAO,IAAI,cAAc,SAAS;AAEjD,UAAI,OAAO,SAAS,GAAG;AACrB,sBAAc,OAAO,KAAK,IAAI,CAAC;MACjC,OAAO;AACL,sBAAc,IAAI;MACpB;AAEA,UAAI,MAAM,WAAW,GAAG;AACtB,iBAAS,WAAW,CAAC,IAAI,IAAI;AAC7B;MACF;AAEA,UAAI,UAAU;AACZ,iBAAS,KAAK;MAChB,OAAO;AACL,cAAM,YAAY,MAAM,CAAC;AACzB,iBAAS,aAAa,IAAI;MAC5B;IACF;IACA,CAAC,UAAU,UAAU,aAAa;EACpC;AAEA,QAAM,eAAeL;IACnB,CAAC,MAAqC;AACpC,kBAAY,EAAE,OAAO,KAAK;IAC5B;IACA,CAAC,WAAW;EACd;AAEA,QAAM,iBAAiBA,aAAY,CAAC,MAAiC;AACnE,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,kBAAc,IAAI;EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,CAAC,MAAiC;AACpE,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,kBAAc,KAAK;EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA;IACjB,CAAC,MAAiC;AAChC,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,oBAAc,KAAK;AAEnB,UAAI,YAAY,MAAM,SAAU;AAEhC,kBAAY,EAAE,aAAa,KAAK;IAClC;IACA,CAAC,UAAU,aAAa,MAAM,QAAQ;EACxC;AAEA,QAAM,cAAcA,aAAY,MAAM;AACpC,QAAI,CAAC,YAAY,CAAC,MAAM,UAAU;AAChC,eAAS,SAAS,MAAM;IAC1B;EACF,GAAG,CAAC,UAAU,MAAM,QAAQ,CAAC;AAE7B,QAAM,eAAeA;IACnB,CAAC,UAAmB;AAClB,UAAI,YAAY,MAAM,QAAQ,KAAK,GAAG;AACpC,YAAI,UAAU,QAAW;AACvB,gBAAM,WAAW,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AACnD,mBAAS,QAAQ;QACnB,OAAO;AACL,mBAAS,CAAC,CAAC;QACb;MACF,OAAO;AACL,iBAAS,IAAI;MACf;AACA,oBAAc,IAAI;AAGlB,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,QAAQ;MAC3B;IACF;IACA,CAAC,UAAU,UAAU,KAAK;EAC5B;AAEA,QAAM,eAAe,SAAS;AAG9B,QAAM,QAAQ,WACV,MAAM,QAAQ,KAAK,IACjB,QACA,CAAC,IACH,iBAAiB,OACf,CAAC,KAAK,IACN,CAAC;AAEP,SACEI,uBAAC,OAAA,EAAI,WAAW,MAAM,WAAW,cAAY,MAAM,cAAY,QAAQ,YAAY,GAChF,UAAA;IAAA,SACCA,uBAAC,SAAA,EAAM,SAAS,IACb,UAAA;MAAA;MACA,YACCD,sBAAC,QAAA,EAAK,eAAY,QAAO,iBAAa,MAAC,UAAA,IAAA,CAEvC;IAAA,EAAA,CAEJ;IAGFC;MAAC;MAAA;QACC,sBAAkB;QAClB,iBAAe;QACf,iBAAe,YAAY,MAAM;QACjC,YAAY;QACZ,aAAa;QACb,QAAQ;QACR,SAAS;QACT,MAAK;QACL,UAAU,YAAY,MAAM,WAAW,KAAK;QAC5C,oBACE,CAAC,QAAQ,YAAY,KAAK,SAAS,aAAa,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAClF;QAGF,UAAA;UAAAD;YAAC;YAAA;cACC,KAAK;cACL;cACA,MAAK;cACL;cACA;cACA;cACA,UAAU,YAAY,MAAM;cAC5B,UAAU;cACV,gBAAc,QAAQ,YAAY;cAClC,iBAAe;cACf,mBAAe;YAAA;UACjB;UAEC,MAAM,WAAW,IAChBA,sBAAC,KAAA,EAAE,yBAAqB,MACrB,UAAA,MAAM,gBAAgB,aAAa,uBAAuB,iCAAA,CAC7D,IAEAA,sBAAC,MAAA,EAAG,kBAAc,MACf,UAAA,MAAM,IAAI,CAAC,MAAM,UAChBC,uBAAC,MAAA,EAAiC,kBAAc,MAC9C,UAAA;YAAAD,sBAAC,QAAA,EAAK,kBAAc,MAAE,UAAA,KAAK,KAAA,CAAK;YAChCC,uBAAC,QAAA,EAAK,kBAAc,MAAC,UAAA;cAAA;cAAE,eAAe,KAAK,IAAI;cAAE;YAAA,EAAA,CAAC;YACjD,CAAC,YAAY,CAAC,MAAM,YACnBD;cAAC;cAAA;gBACC,MAAK;gBACL,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,+BAAa,WAAW,QAAQ,MAAS;gBAC3C;gBACA,cAAY,UAAU,KAAK,IAAI;gBAC/B,oBAAgB;gBACjB,UAAA;cAAA;YAED;UAAA,EAAA,GAdK,GAAG,KAAK,IAAI,IAAI,KAAK,EAgB9B,CACD,EAAA,CACH;QAAA;MAAA;IAEJ;IAEC,aACCA,sBAAC,KAAA,EAAE,IAAI,UAAU,eAAW,MACzB,UAAA,MAAM,WAAA,CACT;IAED,gBACCA,sBAAC,KAAA,EAAE,IAAI,SAAS,MAAK,SAAQ,sBAAkB,MAC5C,UAAA,aAAA,CACH;EAAA,EAAA,CAEJ;AAEJ;AAKA,SAAS,eAAe,OAAuB;AAC7C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AC5OA,IAAM,kBAA4E;EAChF,MAAM;EACN,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,qBAAqB;EACrB,OAAO;EACP,eAAe;EACf,UAAU;EACV,aAAa;EACb,eAAe;EACf,QAAQ;EACR,OAAO;EACP,gBAAgB;EAChB,OAAO;AACT;AAKA,IAAM,iBAA2E;EAC/E,WAAW;EACX,WAAW;EACX,YAAY;EACZ,SAAS;EACT,eAAe;EACf,UAAU;AACZ;AAMO,SAAS,cAAc;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;AACF,GAAuB;AACrB,QAAMG,kBAAiB,kBAAkB;AAGzC,MAAI,UAAU,aAAa,eAAe,UAAU,gBAAgB,mBAAmB;AACrF,UAAM,eAAe,MAAM,KAAK,UAAU,aAAa,OAAO,CAAC;AAC/D,UAAMC,iBAAgB,UAAU,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,UAAU;AAEnE,WACEJ,sBAAC,OAAA,EAAI,sBAAkB,MAAC,cAAY,UAAU,MAC5C,UAAAC,uBAAC,YAAA,EAAS,wBAAoB,MAC5B,UAAA;MAAAD,sBAAC,UAAA,EAAO,sBAAkB,MACvB,UAAA,MAAM,SAAS,UAAU,eAAe,YAAYI,cAAa,EAAA,CACpE;MACC,MAAM,cAAcJ,sBAAC,KAAA,EAAE,eAAW,MAAE,UAAA,KAAK,WAAA,CAAW;MACrDA,sBAAC,OAAA,EAAI,sBAAkB,MACpB,UAAA,aAAa,IAAI,CAAC,eAAe,kBAAkB,UAAU,CAAC,EAAA,CACjE;IAAA,EAAA,CACF,EAAA,CACF;EAEJ;AAGA,MAAI;AAEJ,MAAI,MAAM,QAAQ;AAChB,QAAI,OAAO,KAAK,WAAW,UAAU;AAEnC,eACEG,gBAAe,aAAa,KAAK,MAAM,KACvC,gBAAgB,KAAK,MAAM,KAC1B;IACL,OAAO;AAEL,eAAS,KAAK;IAChB;EACF,OAAO;AAEL,UAAM,cAAc,qBAAqB,SAAS;AAGlD,QAAI,UAAU,aAAa,eAAe,MAAM,QAAQ,KAAK,OAAO,GAAG;AACrE,eAAS;IACX,WAES,gBAAgB,qBAAqB;AAC5C,eAAS;IACX,OAAO;AACL,eACE,gBAAgB,WAAW,KAC3B,eAAe,UAAU,QAAQ,KAChC;IACL;AAGA,QAAI,UAAU,aAAa,eAAe,cAAc,SAAS,GAAG;AAClE,eAAS;IACX;EACF;AAGA,QAAM,UACJ,MAAM,YACL,UAAU,aACP,UAAU,WAAW,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,EAAE,IACxD;AAGN,QAAM,gBAAgB,UAAU,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,UAAU;AAGnE,QAAM,QAAmC;IACvC;IACA;IACA,MAAM,UAAU;;IAChB,OAAO,MAAM,SAAS,UAAU,eAAe,YAAY,aAAa;IACxE;IACA,UAAU,YAAY,MAAM;IAC5B,UAAU,CAAC,UAAU;IACrB,MAAM;MACJ,GAAG;MACH;MACA,KAAK,MAAM,OAAO,UAAU,aAAa,OAAO,UAAU,aAAa;MACvE,KAAK,MAAM,OAAO,UAAU,aAAa,OAAO,UAAU,aAAa;IACzE;EACF;AAEA,SAAOH,sBAAC,QAAA,EAAQ,GAAG,MAAA,CAAO;AAC5B;AAKA,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,GAAG,EACjB,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,KAAK;AACV;AfxLA,IAAM,YAAY,oBAAI,IAAI;EACxB;EAAU;EAAS;EAAe;EAAc;EAAU;EAC1D;EAAa;EAAa;EAAS;EAAQ;EAAU;EAAY;EACjE;EAAW;EAAc;EAAqB;AAChD,CAAC;AAqGM,SAAS,SAA+C;EAC7D;EACA;EACA;EACA;EACA;EACA,UAAU,CAAC;EACX;EACA,WAAW;EACX,aAAa;EACb,aAAa;EACb;EACA,gBAAAG;EACA;AACF,GAAqB;AAEnB,QAAM,eAAeR,SAAQ,MAAM,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC;AAGlE,QAAM,mBAAmBA,SAAQ,MAAM,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC;AAGtE,QAAM,iBAAiBA,SAAQ,MAAM;AACnC,UAAM,WAAoC,CAAC;AAE3C,aAAS,gBAAgB,QAAgC,SAAS,IAAI;AACpE,aAAO,QAAQ,CAAC,MAAM,QAAQ;AAC5B,cAAM,UAAU,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAC9C,YAAI,KAAK,iBAAiB,QAAW;AACnC,yBAAe,UAAU,SAAS,KAAK,YAAY;QACrD;AACA,YAAI,KAAK,cAAc;AACrB,0BAAgB,KAAK,cAAc,OAAO;QAC5C;MACF,CAAC;IACH;AAEA,oBAAgB,YAAY;AAC5B,WAAO;EACT,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,iBAAiBA,SAAQ,MAAM;AACnC,WAAO;MACL,UAAU,gBAAgB,iBAA4C,CAAC,CAAC;MACxE,UAAqC,CAAC;IACxC;EACF,GAAG,CAAC,gBAAgB,eAAe,MAAM,CAAC;AAI1C,QAAM,UAAU,QAAoB;IAClC,UAAU,YAAY,MAAM;IAC5B,eAAe;IACf,MAAM;IACN,kBAAkB;EACpB,CAAC;AAED,QAAM,EAAE,SAAS,cAAc,OAAO,WAAW,OAAO,UAAU,IAAI;AAGtE,QAAM,gBAAgBG,QAA+B,MAAM;AAI3D,QAAM,kBAAkBH,SAAQ,MAAM;AACpC,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,yBAAyB,CAAC,OAAgC,SAAS,OAAO;AAC9E,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,cAAM,OAAO;AAGb,YAAI,KAAK,aAAa,OAAO,KAAK,cAAc,UAAU;AACxD,gBAAM,YAAY,KAAK;AACvB,cAAI,UAAU,OAAO;AACnB,mBAAO,IAAI,UAAU,KAAK;UAC5B;QACF;AAGA,cAAM,WAAW,OAAO,KAAK,IAAI;AACjC,cAAM,eAAe,SAAS,SAAS,KAAK,SAAS,MAAM,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC;AAClF,YAAI,CAAC,cAAc;AACjB,iCAAuB,MAAiC,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK,GAAG;QAC3F;MACF;IACF;AACA,2BAAuB,OAAkC;AACzD,WAAO,MAAM,KAAK,MAAM;EAC1B,GAAG,CAAC,OAAO,CAAC;AAKZ,QAAM,CAAC,iBAAiB,kBAAkB,IAAII,UAAkC,CAAC,CAAC;AAElFH,aAAU,MAAM;AACd,QAAI,gBAAgB,WAAW,EAAG;AAGlC,UAAM,UAAmC,CAAC;AAC1C,UAAM,gBAAgB,UAAU;AAChC,eAAW,SAAS,iBAAiB;AACnC,cAAQ,KAAK,IAAI,eAAe,eAA0C,KAAK;IACjF;AACA,uBAAmB,OAAO;AAG1B,UAAM,eAAe,MAAM,CAAC,YAAY,EAAE,KAAK,MAAM;AAEnD,UAAI,QAAQ,gBAAgB,SAAS,IAAI,GAAG;AAC1C,2BAAmB,CAAC,UAAU;UAC5B,GAAG;UACH,CAAC,IAAI,GAAG,eAAe,YAAuC,IAAI;QACpE,EAAE;MACJ;IACF,CAAC;AAED,WAAO,MAAM,aAAa,YAAY;EACxC,GAAG,CAAC,iBAAiB,OAAO,SAAS,CAAC;AAGtCA,aAAU,MAAM;AACd,QAAI,UAAU,CAAC,aAAa,QAAQ,cAAc,OAAO,GAAG;AAC1D,oBAAc,UAAU;AAExB,YAAM,cAAc;QAClB,UAAU,gBAAgB,iBAA4C,CAAC,CAAC;QACxE,UAAqC,CAAC;MACxC;AACA,YAAM,WAAyB;IACjC;EACF,GAAG,CAAC,QAAQ,OAAO,gBAAgB,aAAa,CAAC;AAIjD,QAAM,cAAcE,QAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,YAAYA,QAAO,MAAM;AAC/B,YAAU,UAAU;AAEpBF,aAAU,MAAM;AACd,QAAI,CAAC,YAAY,QAAS;AAG1B,UAAM,eAAe,MAAM,CAAC,YAAY,EAAE,KAAK,MAAM;AAEnD,UAAI,SAAS,SAAU;AAGvB,YAAM,SAAS,UAAU,QAAQ,UAAU,UAAU;AACrD,UAAI,OAAO,WAAW,YAAY,SAAS;AACzC,oBAAY,QAAQ,OAAO,IAAI;MACjC;IACF,CAAC;AAED,WAAO,MAAM,aAAa,YAAY;EACxC,GAAG,CAAC,KAAK,CAAC;AAGV,QAAM,gBAAgBC,aAAY,CAAC,QAAqC;AACtE,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,UAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,WAAO,KAAK,SAAS,KAAK,KAAK,MAAM,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC;EAClE,GAAG,CAAC,CAAC;AAGL,QAAM,UAAUA;IACd,CAAC,cAA+C;AAE9C,UAAI,aAAa,SAAS;AACxB,cAAM,OAAO,QAAQ,SAAS;AAC9B,YAAI,cAAc,IAAI,EAAG,QAAO;MAClC;AAGA,YAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,UAAI,UAAmB;AACvB,iBAAW,QAAQ,OAAO;AACxB,YAAI,WAAW,QAAQ,OAAO,YAAY,SAAU,QAAO;AAC3D,kBAAW,QAAoC,IAAI;MACrD;AAGA,UAAI,cAAc,OAAO,GAAG;AAC1B,eAAO;MACT;AAEA,aAAO;IACT;IACA,CAAC,SAAS,aAAa;EACzB;AAGA,QAAM,iBAAiBA;IACrB,CAAC,cAAmD;AAClD,UAAI,CAAC,UAAW,QAAO;AAGvB,YAAM,aAAa,gBAAgB,SAAS,IACxC,gBAAgB,UAAU,KAAK,IAC/B,eAAe,UAAU,GAA8B,UAAU,KAAK;AAG1E,UAAI,UAAU,MAAM;AAClB,eAAO,UAAU,KAAK,YAAY,UAAU,CAA4B;MAC1E;AAGA,UAAI,YAAY,aAAa,UAAU,WAAW,QAAW;AAC3D,eAAO,eAAe,UAAU;MAClC;AAGA,UAAI,eAAe,aAAa,UAAU,cAAc,QAAW;AACjE,eAAO,eAAe,UAAU;MAClC;AAGA,UAAI,UAAU,OAAO;AACnB,eAAO,UAAU,MAAM,SAAS,UAAU;MAC5C;AAGA,UAAI,UAAU,UAAU;AACtB,eAAO,CAAC,UAAU,SAAS,SAAS,UAAU;MAChD;AAEA,aAAO;IACT;IACA,CAAC,iBAAiB,iBAAiB,SAAS;EAC9C;AAGA,QAAM,gBAAgBF,SAAQ,MAAM;AAClC,QAAI,YAAY;AACd,aAAO,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;IACxC;AACA,WAAO,MAAM,KAAK,aAAa,KAAK,CAAC;EACvC,GAAG,CAAC,YAAY,YAAY,CAAC;AAG7B,QAAM,eAAe,aAAa,OAAO,SAAS;AAChD,UAAM,WAAW,IAAI;EACvB,CAAC;AAGD,QAAM,cAAcE;IAClB,CAAC,cAAoC;AACnC,YAAM,OAAO,QAAQ,UAAU,IAAI;AAGnC,UAAI,MAAM,OAAQ,QAAO;AAGzB,UAAI,CAAC,eAAe,MAAM,SAAS,EAAG,QAAO;AAE7C,aACEG;QAAC;QAAA;UAEC,MAAM,UAAU;UAChB;UACA,QAAQ,CAAC,EAAE,OAAO,WAAW,MAC3BA;YAAC;YAAA;cACC;cACA;cACA,OAAO,MAAM;cACb,UAAU,MAAM;cAChB,OAAO,WAAW,OAAO;cACzB;cACA,mBAAmB;YAAA;UACrB;QAAA;QAZG,UAAU;MAcjB;IAEJ;IACA,CAAC,SAAS,UAAU,SAAS,cAAc;EAC7C;AAGA,QAAM,iBAAiB,cACpB,IAAI,CAAC,cAAc;AAClB,UAAM,YAAY,aAAa,IAAI,SAAS;AAC5C,QAAI,CAAC,UAAW,QAAO;AACvB,WAAO,YAAY,SAAS;EAC9B,CAAC,EACA,OAAO,OAAO;AAGjB,QAAM,WAAWH;IACf,CAAC,SAAmC;AAClC,YAAM,YAAY,iBAAiB,IAAI,IAAI;AAC3C,UAAI,CAAC,UAAW,QAAO;AACvB,aAAO,YAAY,SAAS;IAC9B;IACA,CAAC,kBAAkB,WAAW;EAChC;AAGA,QAAM,mBAAmBA;IACvB,CAAC,UAA+B;AAC9B,YAAM,SAAsB,CAAC;AAC7B,iBAAW,CAAC,IAAI,KAAK,kBAAkB;AACrC,cAAM,OAAO,QAAQ,IAAI;AACzB,YAAI,MAAM,UAAU,OAAO;AACzB,gBAAM,WAAW,SAAS,IAAI;AAC9B,cAAI,SAAU,QAAO,KAAK,QAAQ;QACpC;MACF;AACA,aAAO;IACT;IACA,CAAC,kBAAkB,UAAU,OAAO;EACtC;AAGA,QAAM,eAAe,aACnBG;IAAC;IAAA;MACC,MAAK;MACL,UAAU,YAAY,UAAU;MAChC,wBAAoB;MAEnB,UAAA,UAAU,eAAe,kBAAkB;IAAA;EAC9C,IACE;AAGJ,QAAM,cACJA,sBAAC,cAAA,EAAc,GAAG,SAChB,UAAAA,sBAAC,QAAA,EAAK,UAAU,cAAc,WAAsB,iBAAa,MAC9D,UAAA,WACC,SAAS;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;MACT,cAAc,UAAU;MACxB,SAAS,UAAU;MACnB,SAAS,UAAU;IACrB;IACA;IACA;EACF,CAAC,IAEDC,uBAAA,UAAA,EACG,UAAA;IAAA;IACA;EAAA,EAAA,CACH,EAAA,CAEJ,EAAA,CACF;AAGF,MAAIE,iBAAgB;AAClB,WACEH,sBAAC,sBAAsB,UAAtB,EAA+B,OAAOG,iBACpC,UAAA,YAAA,CACH;EAEJ;AAEA,SAAO;AACT;AAOA,SAAS,UACP,MACA,UACyB;AACzB,QAAM,SAAkC,EAAE,GAAG,KAAK;AAElD,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AAEvC,QAAI,CAACE,WAAU,GAAG,EAAG;AAErB,UAAM,UAAU,KAAK,GAAG;AACxB,UAAM,cAAc,SAAS,GAAG;AAGhC,QACE,cAAc,OAAO,KACrB,cAAc,WAAW,GACzB;AACA,aAAO,GAAG,IAAI;QACZ;QACA;MACF;IACF,WAAW,gBAAgB,QAAW;AAEpC,aAAO,GAAG,IAAI;IAChB;EACF;AAEA,SAAO;AACT;AAKA,SAAS,cAAc,KAA8C;AACnE,SACE,QAAQ,QACR,OAAO,QAAQ,YACf,CAAC,MAAM,QAAQ,GAAG,KAClB,OAAO,eAAe,GAAG,MAAM,OAAO;AAE1C;AAMA,IAAMC,kBAAiB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAKxE,SAASD,WAAU,KAAsB;AACvC,SAAO,CAACC,gBAAe,IAAI,GAAG;AAChC;AAMA,SAAS,eAAe,KAA8B,MAAc,OAAsB;AACxF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,SAAS,OAAW;AAGxB,QAAI,CAACD,WAAU,IAAI,GAAG;AACpB,cAAQ,KAAK,4CAA4C,IAAI,EAAE;AAC/D;IACF;AAEA,QAAI,CAAC,OAAO,OAAO,SAAS,IAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,UAAU;AACtE,cAAQ,IAAI,IAAI,CAAC;IACnB;AACA,cAAU,QAAQ,IAAI;EACxB;AAEA,QAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,MAAI,aAAa,QAAW;AAE1B,QAAI,CAACA,WAAU,QAAQ,GAAG;AACxB,cAAQ,KAAK,4CAA4C,QAAQ,EAAE;AACnE;IACF;AACA,YAAQ,QAAQ,IAAI;EACtB;AACF;AAMA,SAAS,aAAa,GAAY,GAAqB;AACrD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,MAAM;AAEjE,QAAM,QAAQ,OAAO,KAAK,CAAW;AACrC,QAAM,QAAQ,OAAO,KAAK,CAAW;AAErC,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,aAAW,OAAO,OAAO;AACvB,UAAM,OAAQ,EAA8B,GAAG;AAC/C,UAAM,OAAQ,EAA8B,GAAG;AAG/C,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY,SAAS,QAAQ,SAAS,MAAM;AAC1F,UAAI,CAAC,aAAa,MAAM,IAAI,EAAG,QAAO;IACxC,WAAW,SAAS,MAAM;AACxB,aAAO;IACT;EACF;AAEA,SAAO;AACT;AgBrjBO,SAAS,WAAW;EACzB;EACA;EACA,cAAc;EACd,mBAAmB;EACnB;EACA;AACF,GAAoB;AAClB,QAAM,CAAC,aAAa,cAAc,IAAIN,UAAS,gBAAgB;AAE/D,QAAM,kBAAkBF,aAAY,MAAM;AACxC,QAAI,aAAa;AACf,qBAAe,CAAC,SAAS,CAAC,IAAI;IAChC;EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAAW,cAAc,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC;AACvE,QAAM,YAAY,GAAG,QAAQ;AAE7B,SACEI;IAAC;IAAA;MACC;MACA,mBAAe;MACf,oBAAkB;MAClB,kBAAgB;MAEf,UAAA;QAAA,cACCD,sBAAC,UAAA,EACC,UAAAC;UAAC;UAAA;YACC,MAAK;YACL,SAAS;YACT,iBAAe,CAAC;YAChB,iBAAe;YACf,0BAAsB;YAEtB,UAAA;cAAAD,sBAAC,QAAA,EAAK,yBAAqB,MAAC,eAAY,QACrC,UAAA,cAAc,WAAW,SAAA,CAC5B;cACAA,sBAAC,QAAA,EAAK,IAAI,UAAU,yBAAqB,MACtC,UAAA,MAAA,CACH;YAAA;UAAA;QACF,EAAA,CACF,IAEAA,sBAAC,UAAA,EAAO,IAAI,UAAU,yBAAqB,MACxC,UAAA,MAAA,CACH;QAGD,eACCA,sBAAC,KAAA,EAAE,+BAA2B,MAAE,UAAA,YAAA,CAAY;QAG9CA;UAAC;UAAA;YACC,IAAI;YACJ,MAAK;YACL,mBAAiB;YACjB,2BAAuB;YACvB,QAAQ,eAAe;YAEtB;UAAA;QACH;MAAA;IAAA;EACF;AAEJ;AAWO,IAAM,eAAe;","names":["useMemo","useEffect","useCallback","useRef","useState","jsx","jsxs","files","widgetRegistry","fieldBaseName","isSafeKey","DANGEROUS_KEYS"]}
|
|
1
|
+
{"version":3,"sources":["../../app-framework/src/types/context.ts","../../app-framework/src/registry/base-registry.ts","../../app-framework/src/registry/settings-registry.ts","../../app-framework/src/registry/provider-registry.ts","../../app-framework/src/registry/widget-registry.ts","../../app-framework/src/autoform/AutoForm.tsx","../../app-framework/src/autoform/introspection.ts","../../app-framework/src/autoform/hooks/useWidgetRegistry.ts","../../app-framework/src/autoform/widgets/TextInput.tsx","../../app-framework/src/autoform/widgets/Textarea.tsx","../../app-framework/src/autoform/widgets/NumberInput.tsx","../../app-framework/src/autoform/widgets/Switch.tsx","../../app-framework/src/autoform/widgets/Select.tsx","../../app-framework/src/autoform/widgets/SearchableSelect.tsx","../../app-framework/src/autoform/widgets/RadioGroup.tsx","../../app-framework/src/autoform/widgets/Slider.tsx","../../app-framework/src/autoform/widgets/ColorPicker.tsx","../../app-framework/src/autoform/widgets/TagInput.tsx","../../app-framework/src/autoform/widgets/SecretInput.tsx","../../app-framework/src/autoform/widgets/FileUpload.tsx","../../app-framework/src/autoform/field-renderer.tsx","../../app-framework/src/autoform/FieldGroup.tsx"],"sourcesContent":["/**\n * Restricted context object passed to extensions during activation.\n * Provides access to configuration and core services.\n */\nexport interface ExtensionContext<TConfig> {\n /** Current configuration (validated) */\n readonly config: TConfig;\n\n /** Update configuration (triggers re-validation) */\n setConfig: (update: Partial<TConfig>) => void;\n\n /** Core services available to extensions */\n services: ExtensionServices;\n}\n\n/**\n * Core services available to all extensions\n */\nexport interface ExtensionServices {\n /** Toast notification service */\n toast: ToastService;\n\n /** Modal dialog service */\n dialog: DialogService;\n\n /** Event bus for cross-extension communication */\n events: EventBus;\n}\n\n/**\n * Toast notification service interface\n */\nexport interface ToastService {\n /** Show success message */\n success(message: string): void;\n\n /** Show error message */\n error(message: string): void;\n\n /** Show info message */\n info(message: string): void;\n\n /** Show warning message */\n warning(message: string): void;\n}\n\n/**\n * Modal dialog service interface\n */\nexport interface DialogService {\n /** Show confirmation dialog, returns true if confirmed */\n confirm(message: string, title?: string): Promise<boolean>;\n\n /** Show alert dialog */\n alert(message: string, title?: string): Promise<void>;\n\n /** Show prompt dialog, returns input value or null if cancelled */\n prompt(message: string, defaultValue?: string): Promise<string | null>;\n}\n\n/**\n * Event bus for cross-extension communication\n */\nexport interface EventBus {\n /** Emit an event with optional payload */\n emit(event: string, payload?: unknown): void;\n\n /** Subscribe to an event, returns unsubscribe function */\n on(event: string, handler: (payload: unknown) => void): () => void;\n\n /** Subscribe to an event once */\n once(event: string, handler: (payload: unknown) => void): () => void;\n}\n\n/**\n * No-op implementations of services for testing or standalone usage\n */\nexport const noopServices: ExtensionServices = {\n toast: {\n success: () => {},\n error: () => {},\n info: () => {},\n warning: () => {},\n },\n dialog: {\n confirm: async () => false,\n alert: async () => {},\n prompt: async () => null,\n },\n events: {\n emit: () => {},\n on: () => () => {},\n once: () => () => {},\n },\n};\n","import type { RegistryListener } from '../types/registry';\n\n/**\n * Generic registry pattern for managing registered items.\n * Provides registration, lookup, and subscription capabilities.\n *\n * @template TId - Type of the item identifier (usually string)\n * @template TItem - Type of the registered item\n */\nexport class Registry<TId extends string = string, TItem = unknown> {\n private items = new Map<TId, TItem>();\n private listeners = new Set<RegistryListener<TId, TItem>>();\n\n /**\n * Register an item with the given ID.\n * Overwrites existing item with same ID (with warning).\n */\n register(id: TId, item: TItem): void {\n if (this.items.has(id)) {\n console.warn(`Registry: Overwriting existing item with id \"${id}\"`);\n }\n this.items.set(id, item);\n this.notify(id, item, 'register');\n }\n\n /**\n * Unregister an item by ID.\n * @returns true if item existed and was removed\n */\n unregister(id: TId): boolean {\n const existed = this.items.delete(id);\n if (existed) {\n this.notify(id, null, 'unregister');\n }\n return existed;\n }\n\n /**\n * Get an item by ID.\n * @returns The item or undefined if not found\n */\n get(id: TId): TItem | undefined {\n return this.items.get(id);\n }\n\n /**\n * Check if an item with the given ID exists.\n */\n has(id: TId): boolean {\n return this.items.has(id);\n }\n\n /**\n * Get all registered items as a Map.\n * Returns a copy to prevent external modification.\n */\n getAll(): Map<TId, TItem> {\n return new Map(this.items);\n }\n\n /**\n * Get all registered item IDs.\n */\n getAllIds(): TId[] {\n return Array.from(this.items.keys());\n }\n\n /**\n * Get the number of registered items.\n */\n get size(): number {\n return this.items.size;\n }\n\n /**\n * Subscribe to registry changes.\n * @returns Unsubscribe function\n */\n subscribe(listener: RegistryListener<TId, TItem>): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Clear all registered items.\n * Notifies listeners for each removed item.\n */\n clear(): void {\n const ids = this.getAllIds();\n this.items.clear();\n ids.forEach((id) => this.notify(id, null, 'unregister'));\n }\n\n /**\n * Iterate over all items.\n */\n forEach(callback: (item: TItem, id: TId) => void): void {\n this.items.forEach((item, id) => callback(item, id));\n }\n\n /**\n * Find items matching a predicate.\n */\n filter(predicate: (item: TItem, id: TId) => boolean): TItem[] {\n const results: TItem[] = [];\n this.items.forEach((item, id) => {\n if (predicate(item, id)) {\n results.push(item);\n }\n });\n return results;\n }\n\n private notify(\n id: TId,\n item: TItem | null,\n action: 'register' | 'unregister'\n ): void {\n this.listeners.forEach((listener) => listener(id, item, action));\n }\n}\n","import type { z } from 'zod';\nimport { Registry } from './base-registry';\nimport type { UIHints } from '../types/ui-hints';\n\n/**\n * A settings panel definition that can be registered.\n * Settings panels appear in the application settings UI.\n *\n * @template TSchema - Zod object schema type for the settings\n */\nexport interface SettingsPanel<\n TSchema extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> {\n /** Unique identifier for the panel */\n id: string;\n\n /** Display title for the panel */\n title: string;\n\n /** Optional description */\n description?: string;\n\n /** Icon identifier or URL */\n icon?: string;\n\n /** Zod schema defining the settings shape */\n schema: TSchema;\n\n /** Default values for settings */\n defaultValues?: z.infer<TSchema>;\n\n /** UI hints for customizing field rendering */\n uiHints?: UIHints<z.infer<TSchema>>;\n\n /** Order priority (lower = earlier in list) */\n order?: number;\n\n /** Whether this panel is hidden from the UI */\n hidden?: boolean;\n}\n\n/**\n * Registry for settings panels.\n * Allows extensions to inject settings panels into the app settings UI.\n */\nexport class SettingsRegistry extends Registry<string, SettingsPanel> {\n /**\n * Register a settings panel.\n */\n registerPanel<T extends z.ZodObject<z.ZodRawShape>>(\n panel: SettingsPanel<T>\n ): void {\n super.register(panel.id, panel as SettingsPanel);\n }\n\n /**\n * Get all panels sorted by order (lower order = earlier).\n * Hidden panels are excluded.\n */\n getSortedPanels(): SettingsPanel[] {\n return Array.from(this.getAll().values())\n .filter((panel) => !panel.hidden)\n .sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n }\n\n /**\n * Get a panel by ID with proper typing.\n */\n getPanel<T extends z.ZodObject<z.ZodRawShape>>(\n id: string\n ): SettingsPanel<T> | undefined {\n return this.get(id) as SettingsPanel<T> | undefined;\n }\n}\n\n/**\n * Default settings registry instance.\n * Can be used directly or replaced with a custom instance.\n */\nexport const settingsRegistry = new SettingsRegistry();\n","import type { z } from 'zod';\nimport { Registry } from './base-registry';\nimport type { UIHints } from '../types/ui-hints';\n\n/**\n * A provider definition that can be registered.\n * Providers are services like LLM backends, storage adapters, etc.\n *\n * @template TConfig - Zod object schema type for the provider config\n * @template TClient - Type of the client/service instance created by the provider\n */\nexport interface Provider<\n TConfig extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n TClient = unknown,\n> {\n /** Unique identifier for the provider */\n id: string;\n\n /** Display name for the provider */\n name: string;\n\n /** Optional description */\n description?: string;\n\n /** Icon identifier or URL */\n icon?: string;\n\n /** Zod schema defining the configuration shape */\n configSchema: TConfig;\n\n /** Default configuration values */\n defaultConfig?: z.infer<TConfig>;\n\n /** UI hints for customizing config form rendering */\n uiHints?: UIHints<z.infer<TConfig>>;\n\n /** Factory function to create the client/service instance */\n createClient: (config: z.infer<TConfig>) => TClient | Promise<TClient>;\n\n /** Optional validation beyond Zod schema (e.g., API key verification) */\n validateConfig?: (\n config: z.infer<TConfig>\n ) => Promise<{ valid: boolean; error?: string }>;\n}\n\n/**\n * Registry for providers of a specific type.\n * Use separate instances for different provider types (LLM, Storage, etc.).\n *\n * @template TClient - Common client interface type for this registry\n */\nexport class ProviderRegistry<TClient = unknown> extends Registry<\n string,\n Provider<z.ZodObject<z.ZodRawShape>, TClient>\n> {\n constructor(private readonly providerType?: string) {\n super();\n }\n\n /**\n * Register a provider.\n */\n registerProvider<T extends z.ZodObject<z.ZodRawShape>>(\n provider: Provider<T, TClient>\n ): void {\n // Cast through unknown to handle generic type variance\n super.register(\n provider.id,\n provider as unknown as Provider<z.ZodObject<z.ZodRawShape>, TClient>\n );\n }\n\n /**\n * Get a provider by ID with proper typing.\n */\n getProvider<T extends z.ZodObject<z.ZodRawShape>>(\n id: string\n ): Provider<T, TClient> | undefined {\n return this.get(id) as Provider<T, TClient> | undefined;\n }\n\n /**\n * Create a client instance for a provider.\n * Validates config against schema and runs custom validation if provided.\n *\n * @throws Error if provider not found, config invalid, or custom validation fails\n */\n async createClient<T extends z.ZodObject<z.ZodRawShape>>(\n providerId: string,\n config: z.infer<T>\n ): Promise<TClient> {\n const provider = this.get(providerId);\n if (!provider) {\n throw new Error(\n `Provider \"${providerId}\" not found${this.providerType ? ` in ${this.providerType} registry` : ''}`\n );\n }\n\n // Validate config against schema\n const result = provider.configSchema.safeParse(config);\n if (!result.success) {\n throw new Error(`Invalid provider config: ${result.error.message}`);\n }\n\n // Run custom validation if provided\n if (provider.validateConfig) {\n const validation = await provider.validateConfig(result.data);\n if (!validation.valid) {\n throw new Error(validation.error ?? 'Provider config validation failed');\n }\n }\n\n return provider.createClient(result.data);\n }\n\n /**\n * Get all providers as an array.\n */\n getAllProviders(): Provider<z.ZodObject<z.ZodRawShape>, TClient>[] {\n return Array.from(this.getAll().values());\n }\n}\n\n/**\n * Create a typed provider registry for a specific client type.\n */\nexport function createProviderRegistry<TClient>(\n providerType?: string\n): ProviderRegistry<TClient> {\n return new ProviderRegistry<TClient>(providerType);\n}\n","import type { ComponentType } from 'react';\nimport { Registry } from './base-registry';\nimport type { BuiltinWidget, FieldWidgetProps } from '../types/ui-hints';\n\n/**\n * Widget component type for the registry.\n */\nexport type WidgetComponent = ComponentType<FieldWidgetProps<unknown>>;\n\n/**\n * Widget definition for registration.\n */\nexport interface WidgetDefinition {\n /** Unique identifier for the widget */\n id: string;\n\n /** Display name */\n name?: string;\n\n /** The React component to render */\n component: WidgetComponent;\n\n /** Description of when to use this widget */\n description?: string;\n}\n\n/**\n * Registry for custom form widgets.\n * Allows extensions to add custom field rendering components.\n */\nexport class WidgetRegistry extends Registry<string, WidgetDefinition> {\n /**\n * Register a custom widget.\n */\n registerWidget(definition: WidgetDefinition): void {\n super.register(definition.id, definition);\n }\n\n /**\n * Register a widget component directly with just an ID.\n */\n registerComponent(id: string, component: WidgetComponent): void {\n super.register(id, { id, component });\n }\n\n /**\n * Get a widget component by ID.\n * Returns the component directly, not the definition.\n */\n getComponent(id: string): WidgetComponent | undefined {\n return this.get(id)?.component;\n }\n\n /**\n * Check if a widget ID is a built-in widget type.\n * This list must stay in sync with the BuiltinWidget type in ui-hints.ts.\n */\n isBuiltinWidget(id: string): id is BuiltinWidget {\n const builtins: string[] = [\n 'text',\n 'number',\n 'password',\n 'textarea',\n 'switch',\n 'checkbox',\n 'select',\n 'radio',\n 'slider',\n 'color-picker',\n 'tag-input',\n 'searchable-select',\n 'file-upload',\n ];\n return builtins.includes(id);\n }\n}\n\n/**\n * Default widget registry instance.\n */\nexport const widgetRegistry = new WidgetRegistry();\n","import { useMemo, useEffect, useCallback, useRef, useState, type ReactNode } from 'react';\nimport { z } from 'zod';\nimport { useForm, Controller, FormProvider, type DefaultValues, type Path } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { analyzeSchema, flattenSchema, getValueAtPath, type FieldInfo } from './introspection';\nimport { FieldRenderer } from './field-renderer';\nimport type { UIHints, FieldUIHint, FieldCondition } from '../types/ui-hints';\nimport { WidgetRegistry } from '../registry/widget-registry';\nimport { WidgetRegistryContext } from './hooks/useWidgetRegistry';\n\n// Known FieldUIHint keys for detection (module-level constant for hoisting)\nconst HINT_KEYS = new Set([\n 'widget', 'label', 'placeholder', 'helperText', 'hidden', 'readOnly',\n 'className', 'condition', 'group', 'rows', 'accept', 'multiple', 'maxSize',\n 'options', 'searchable', 'searchPlaceholder', 'noResultsText',\n]);\n\n/**\n * Props for the AutoForm component.\n *\n * @template T - Zod object schema type\n */\nexport interface AutoFormProps<T extends z.ZodObject<z.ZodRawShape>> {\n /** Zod object schema defining the form shape */\n schema: T;\n\n /** Current values (for controlled mode) */\n values?: z.infer<T>;\n\n /** Default values for the form */\n defaultValues?: Partial<z.infer<T>>;\n\n /** Called when values change (controlled mode) */\n onChange?: (values: z.infer<T>) => void;\n\n /** Called on form submit with validated data */\n onSubmit?: (values: z.infer<T>) => void | Promise<void>;\n\n /** Called when validation fails during onChange */\n onValidationError?: (error: z.ZodError) => void;\n\n /**\n * Called on every value change, regardless of validation status.\n * Useful when you need to track raw user input before validation.\n * The values may not conform to the schema type.\n */\n onRawChange?: (values: unknown) => void;\n\n /** UI hints for customizing field rendering */\n uiHints?: UIHints<z.infer<T>>;\n\n /** Custom field order (array of field names) */\n fieldOrder?: Array<keyof z.infer<T>>;\n\n /** Disable all fields */\n disabled?: boolean;\n\n /** Show submit button */\n withSubmit?: boolean;\n\n /** Submit button text */\n submitText?: string;\n\n /** Custom className for form container */\n className?: string;\n\n /** Custom widget registry */\n widgetRegistry?: WidgetRegistry;\n\n /**\n * Render prop for custom form layout.\n * If provided, you control how fields and submit button are rendered.\n */\n children?: (props: {\n /** Array of rendered field elements */\n fields: ReactNode[];\n /** Submit button element (null if withSubmit=false) */\n submit: ReactNode;\n /** Form state from react-hook-form */\n formState: { isSubmitting: boolean; isValid: boolean; isDirty: boolean };\n /**\n * Get a specific field by name.\n * Supports dot notation for nested fields: getField('profile.name')\n */\n getField: (name: string) => ReactNode | null;\n /**\n * Get fields belonging to a group (from uiHints.group).\n */\n getFieldsByGroup: (group: string) => ReactNode[];\n }) => ReactNode;\n}\n\n/**\n * Schema-driven form component that automatically renders fields\n * based on a Zod object schema.\n *\n * Features:\n * - Nested object support\n * - Conditional field visibility\n * - Custom widget integration\n * - Full react-hook-form integration\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * name: z.string().describe('Your name'),\n * profile: z.object({\n * bio: z.string(),\n * website: z.string().url().optional(),\n * }),\n * kind: z.enum(['basic', 'advanced']),\n * advancedOption: z.string().optional(),\n * });\n *\n * <AutoForm\n * schema={schema}\n * uiHints={{\n * advancedOption: {\n * condition: { field: 'kind', equals: 'advanced' }\n * }\n * }}\n * onSubmit={(data) => console.log(data)}\n * withSubmit\n * />\n * ```\n */\nexport function AutoForm<T extends z.ZodObject<z.ZodRawShape>>({\n schema,\n values,\n defaultValues,\n onChange,\n onSubmit,\n onValidationError,\n onRawChange,\n uiHints = {} as UIHints<z.infer<T>>,\n fieldOrder,\n disabled = false,\n withSubmit = false,\n submitText = 'Submit',\n className,\n widgetRegistry,\n children,\n}: AutoFormProps<T>) {\n // Analyze schema - get top-level fields\n const fieldInfoMap = useMemo(() => analyzeSchema(schema), [schema]);\n\n // Also flatten for nested field access\n const flatFieldInfoMap = useMemo(() => flattenSchema(schema), [schema]);\n\n // Extract default values from schema (including nested)\n const schemaDefaults = useMemo(() => {\n const defaults: Record<string, unknown> = {};\n\n function extractDefaults(fields: Map<string, FieldInfo>, prefix = '') {\n fields.forEach((info, key) => {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (info.defaultValue !== undefined) {\n setNestedValue(defaults, fullKey, info.defaultValue);\n }\n if (info.nestedFields) {\n extractDefaults(info.nestedFields, fullKey);\n }\n });\n }\n\n extractDefaults(fieldInfoMap);\n return defaults;\n }, [fieldInfoMap]);\n\n // Properly merge nested defaults using deep merge\n const mergedDefaults = useMemo(() => {\n return deepMerge(\n deepMerge(schemaDefaults, defaultValues as Record<string, unknown> ?? {}),\n values as Record<string, unknown> ?? {}\n );\n }, [schemaDefaults, defaultValues, values]);\n\n // Setup react-hook-form\n // shouldUnregister ensures hidden/conditional fields don't leak stale values\n const methods = useForm<z.infer<T>>({\n resolver: zodResolver(schema),\n defaultValues: mergedDefaults as DefaultValues<z.infer<T>>,\n mode: 'onChange',\n shouldUnregister: true,\n });\n\n const { control, handleSubmit, watch, formState, reset, getValues } = methods;\n\n // Track previous values to avoid unnecessary resets in controlled mode\n const prevValuesRef = useRef<z.infer<T> | undefined>(values);\n\n // PERFORMANCE: Extract condition fields from uiHints to watch only those\n // This avoids re-rendering on every keystroke for non-conditional forms\n const conditionFields = useMemo(() => {\n const fields = new Set<string>();\n const extractConditionFields = (hints: Record<string, unknown>, prefix = '') => {\n for (const [key, value] of Object.entries(hints)) {\n if (!value || typeof value !== 'object') continue;\n const hint = value as Record<string, unknown>;\n\n // Check for condition.field\n if (hint.condition && typeof hint.condition === 'object') {\n const condition = hint.condition as { field?: string };\n if (condition.field) {\n fields.add(condition.field);\n }\n }\n\n // Recurse into nested hints (but not into FieldUIHint objects)\n const hintKeys = Object.keys(hint);\n const isHintObject = hintKeys.length > 0 && hintKeys.every((k) => HINT_KEYS.has(k));\n if (!isHintObject) {\n extractConditionFields(hint as Record<string, unknown>, prefix ? `${prefix}.${key}` : key);\n }\n }\n };\n extractConditionFields(uiHints as Record<string, unknown>);\n return Array.from(fields);\n }, [uiHints]);\n\n // PERFORMANCE: Only watch fields used in conditions (not all fields)\n // This prevents re-renders on every keystroke for forms without conditions\n // Using a state + subscription approach instead of watch() to minimize re-renders\n const [conditionValues, setConditionValues] = useState<Record<string, unknown>>({});\n\n useEffect(() => {\n if (conditionFields.length === 0) return;\n\n // Initialize with current values\n const initial: Record<string, unknown> = {};\n const currentValues = getValues();\n for (const field of conditionFields) {\n initial[field] = getValueAtPath(currentValues as Record<string, unknown>, field);\n }\n setConditionValues(initial);\n\n // Subscribe to changes in condition fields only\n const subscription = watch((formValues, { name }) => {\n // Only update if a condition field changed\n if (name && conditionFields.includes(name)) {\n setConditionValues((prev) => ({\n ...prev,\n [name]: getValueAtPath(formValues as Record<string, unknown>, name),\n }));\n }\n });\n\n return () => subscription.unsubscribe();\n }, [conditionFields, watch, getValues]);\n\n // Sync external values in controlled mode (with deep comparison)\n useEffect(() => {\n if (values && !shallowEqual(values, prevValuesRef.current)) {\n prevValuesRef.current = values;\n // Use deep merge to properly handle nested values\n const resetValues = deepMerge(\n deepMerge(schemaDefaults, defaultValues as Record<string, unknown> ?? {}),\n values as Record<string, unknown> ?? {}\n );\n reset(resetValues as z.infer<T>);\n }\n }, [values, reset, schemaDefaults, defaultValues]);\n\n // PERFORMANCE: Use subscription for onChange instead of watch() + useEffect\n // This avoids re-rendering the entire form on every change\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const onValidationErrorRef = useRef(onValidationError);\n onValidationErrorRef.current = onValidationError;\n const onRawChangeRef = useRef(onRawChange);\n onRawChangeRef.current = onRawChange;\n const schemaRef = useRef(schema);\n schemaRef.current = schema;\n\n useEffect(() => {\n if (!onChangeRef.current && !onValidationErrorRef.current && !onRawChangeRef.current) return;\n\n // Subscribe to form value changes (doesn't cause re-renders)\n const subscription = watch((formValues, { type }) => {\n // Only fire callbacks for actual value changes, not focus/blur\n if (type !== 'change') return;\n\n // Always fire onRawChange first (before validation)\n onRawChangeRef.current?.(formValues);\n\n // Validate with schema and call appropriate callback\n const result = schemaRef.current.safeParse(formValues);\n if (result.success) {\n onChangeRef.current?.(result.data);\n } else {\n onValidationErrorRef.current?.(result.error);\n }\n });\n\n return () => subscription.unsubscribe();\n }, [watch]);\n\n // Check if an object is a FieldUIHint (ALL keys must be known hint keys AND at least one exists)\n const isFieldUIHint = useCallback((obj: unknown): obj is FieldUIHint => {\n if (!obj || typeof obj !== 'object') return false;\n const keys = Object.keys(obj);\n return keys.length > 0 && keys.every((key) => HINT_KEYS.has(key));\n }, []);\n\n // Get hint for a field (supports dot notation and nested syntax)\n const getHint = useCallback(\n (fieldName: string): FieldUIHint | undefined => {\n // First try direct dot-notation key (e.g., 'profile.name')\n if (fieldName in uiHints) {\n const hint = uiHints[fieldName];\n if (isFieldUIHint(hint)) return hint;\n }\n\n // Then try nested object access (e.g., uiHints.profile.name)\n const parts = fieldName.split('.');\n let current: unknown = uiHints;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n // Check if we found a valid FieldUIHint\n if (isFieldUIHint(current)) {\n return current;\n }\n\n return undefined;\n },\n [uiHints, isFieldUIHint]\n );\n\n // Evaluate if a field's condition is met\n const isConditionMet = useCallback(\n (condition: FieldCondition | undefined): boolean => {\n if (!condition) return true;\n\n // Use the watched condition values for evaluation (only updates when condition fields change)\n const fieldValue = conditionFields.length > 0\n ? conditionValues[condition.field]\n : getValueAtPath(getValues() as Record<string, unknown>, condition.field);\n\n // Custom predicate - pass full values for complex conditions\n if (condition.when) {\n return condition.when(fieldValue, getValues() as Record<string, unknown>);\n }\n\n // Equals check\n if ('equals' in condition && condition.equals !== undefined) {\n return fieldValue === condition.equals;\n }\n\n // Not equals check\n if ('notEquals' in condition && condition.notEquals !== undefined) {\n return fieldValue !== condition.notEquals;\n }\n\n // One of check\n if (condition.oneOf) {\n return condition.oneOf.includes(fieldValue);\n }\n\n // Not one of check\n if (condition.notOneOf) {\n return !condition.notOneOf.includes(fieldValue);\n }\n\n return true;\n },\n [conditionFields, conditionValues, getValues]\n );\n\n // Determine field order (top-level only)\n const orderedFields = useMemo(() => {\n if (fieldOrder) {\n return fieldOrder.map((f) => String(f));\n }\n return Array.from(fieldInfoMap.keys());\n }, [fieldOrder, fieldInfoMap]);\n\n // Handle form submission\n const onFormSubmit = handleSubmit(async (data) => {\n await onSubmit?.(data);\n });\n\n // Recursive field renderer\n const renderField = useCallback(\n (fieldInfo: FieldInfo): ReactNode => {\n const hint = getHint(fieldInfo.name);\n\n // Check hidden hint\n if (hint?.hidden) return null;\n\n // Check condition\n if (!isConditionMet(hint?.condition)) return null;\n\n return (\n <Controller\n key={fieldInfo.name}\n name={fieldInfo.name as Path<z.infer<T>>}\n control={control}\n render={({ field, fieldState }) => (\n <FieldRenderer\n fieldInfo={fieldInfo}\n hint={hint}\n value={field.value}\n onChange={field.onChange}\n error={fieldState.error?.message}\n disabled={disabled}\n renderNestedField={renderField}\n />\n )}\n />\n );\n },\n [control, disabled, getHint, isConditionMet]\n );\n\n // Render all top-level fields\n const renderedFields = orderedFields\n .map((fieldName) => {\n const fieldInfo = fieldInfoMap.get(fieldName);\n if (!fieldInfo) return null;\n return renderField(fieldInfo);\n })\n .filter(Boolean) as ReactNode[];\n\n // Get a specific field by name (including nested)\n const getField = useCallback(\n (name: string): ReactNode | null => {\n const fieldInfo = flatFieldInfoMap.get(name);\n if (!fieldInfo) return null;\n return renderField(fieldInfo);\n },\n [flatFieldInfoMap, renderField]\n );\n\n // Get fields by group\n const getFieldsByGroup = useCallback(\n (group: string): ReactNode[] => {\n const fields: ReactNode[] = [];\n for (const [name] of flatFieldInfoMap) {\n const hint = getHint(name);\n if (hint?.group === group) {\n const rendered = getField(name);\n if (rendered) fields.push(rendered);\n }\n }\n return fields;\n },\n [flatFieldInfoMap, getField, getHint]\n );\n\n // Submit button\n const submitButton = withSubmit ? (\n <button\n type=\"submit\"\n disabled={disabled || formState.isSubmitting}\n data-autoform-submit\n >\n {formState.isSubmitting ? 'Submitting...' : submitText}\n </button>\n ) : null;\n\n // Wrap with widget registry context if provided\n const formContent = (\n <FormProvider {...methods}>\n <form onSubmit={onFormSubmit} className={className} data-autoform>\n {children ? (\n children({\n fields: renderedFields,\n submit: submitButton,\n formState: {\n isSubmitting: formState.isSubmitting,\n isValid: formState.isValid,\n isDirty: formState.isDirty,\n },\n getField,\n getFieldsByGroup,\n })\n ) : (\n <>\n {renderedFields}\n {submitButton}\n </>\n )}\n </form>\n </FormProvider>\n );\n\n if (widgetRegistry) {\n return (\n <WidgetRegistryContext.Provider value={widgetRegistry}>\n {formContent}\n </WidgetRegistryContext.Provider>\n );\n }\n\n return formContent;\n}\n\n/**\n * Deep merge two objects, with target values taking precedence.\n * Arrays are replaced, not merged.\n * SECURITY: Rejects dangerous keys to prevent prototype pollution.\n */\nfunction deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n\n for (const key of Object.keys(override)) {\n // SECURITY: Skip dangerous keys\n if (!isSafeKey(key)) continue;\n\n const baseVal = base[key];\n const overrideVal = override[key];\n\n // If both are plain objects, recurse\n if (\n isPlainObject(baseVal) &&\n isPlainObject(overrideVal)\n ) {\n result[key] = deepMerge(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>\n );\n } else if (overrideVal !== undefined) {\n // Override wins for non-objects or arrays\n result[key] = overrideVal;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is a plain object (not null, array, or other types).\n */\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return (\n val !== null &&\n typeof val === 'object' &&\n !Array.isArray(val) &&\n Object.getPrototypeOf(val) === Object.prototype\n );\n}\n\n/**\n * Dangerous property names that should never be accessed/set via path traversal.\n * These are JavaScript prototype chain keys that could enable prototype pollution attacks.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a property key is safe to access/set.\n */\nfunction isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Helper to set a value at a nested path in an object (mutating).\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(part)) {\n console.warn(`Rejected dangerous property key in path: ${part}`);\n return;\n }\n\n if (!Object.hasOwn(current, part) || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined) {\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(lastPart)) {\n console.warn(`Rejected dangerous property key in path: ${lastPart}`);\n return;\n }\n current[lastPart] = value;\n }\n}\n\n/**\n * Shallow equality check for objects.\n * Prevents unnecessary reset() calls in controlled mode.\n */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return a === b;\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n const valA = (a as Record<string, unknown>)[key];\n const valB = (b as Record<string, unknown>)[key];\n\n // For nested objects, do recursive shallow check (one level deep)\n if (typeof valA === 'object' && typeof valB === 'object' && valA !== null && valB !== null) {\n if (!shallowEqual(valA, valB)) return false;\n } else if (valA !== valB) {\n return false;\n }\n }\n\n return true;\n}\n","import { z } from 'zod';\n\n/**\n * Analyzed field information extracted from a Zod schema.\n */\nexport interface FieldInfo {\n /** Field name in the schema */\n name: string;\n\n /** The Zod type (unwrapped from optional/nullable/default) */\n zodType: z.ZodTypeAny;\n\n /** Zod type constructor name (e.g., 'ZodString', 'ZodNumber', 'ZodObject') */\n typeName: string;\n\n /** Whether the field is optional */\n isOptional: boolean;\n\n /** Whether the field is nullable */\n isNullable: boolean;\n\n /** Default value if specified */\n defaultValue?: unknown;\n\n /** Description from .describe() */\n description?: string;\n\n /** Enum values for z.enum() or z.nativeEnum() */\n enumValues?: string[];\n\n /** Inner type info for arrays, optionals, etc. */\n innerType?: FieldInfo;\n\n /**\n * For nested objects: Map of child field names to their FieldInfo.\n * Only populated when typeName === 'ZodObject'.\n */\n nestedFields?: Map<string, FieldInfo>;\n\n /**\n * For nested objects: The inner ZodObject schema.\n * Useful for recursive AutoForm rendering.\n */\n innerSchema?: z.ZodObject<z.ZodRawShape>;\n\n /** Validation constraints extracted from the schema */\n constraints?: FieldConstraints;\n}\n\n/**\n * Validation constraints extracted from Zod checks.\n */\nexport interface FieldConstraints {\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n regex?: RegExp;\n email?: boolean;\n url?: boolean;\n uuid?: boolean;\n int?: boolean;\n positive?: boolean;\n negative?: boolean;\n multipleOf?: number;\n}\n\n/**\n * Extract field information from a ZodObject schema.\n *\n * @param schema - Zod object schema to analyze\n * @param prefix - Optional prefix for nested field names (e.g., \"parent.\")\n * @returns Map of field names to their analyzed information\n */\nexport function analyzeSchema<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n prefix = ''\n): Map<string, FieldInfo> {\n const shape = schema.shape;\n const fields = new Map<string, FieldInfo>();\n\n for (const [name, zodType] of Object.entries(shape)) {\n const fullName = prefix ? `${prefix}.${name}` : name;\n fields.set(fullName, analyzeField(fullName, zodType as z.ZodTypeAny));\n }\n\n return fields;\n}\n\n/**\n * Flatten a nested schema into a single Map with dot-notation keys.\n * Useful for forms that need flat access to all fields.\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string(),\n * profile: z.object({\n * bio: z.string(),\n * }),\n * });\n *\n * const flat = flattenSchema(schema);\n * // Map { 'name' => ..., 'profile' => ..., 'profile.bio' => ... }\n * ```\n */\nexport function flattenSchema<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n prefix = ''\n): Map<string, FieldInfo> {\n const fields = new Map<string, FieldInfo>();\n const shape = schema.shape;\n\n for (const [name, zodType] of Object.entries(shape)) {\n const fullName = prefix ? `${prefix}.${name}` : name;\n const fieldInfo = analyzeField(fullName, zodType as z.ZodTypeAny);\n fields.set(fullName, fieldInfo);\n\n // Recursively flatten nested objects\n if (fieldInfo.typeName === 'ZodObject' && fieldInfo.innerSchema) {\n const nestedFields = flattenSchema(fieldInfo.innerSchema, fullName);\n for (const [nestedName, nestedInfo] of nestedFields) {\n fields.set(nestedName, nestedInfo);\n }\n }\n }\n\n return fields;\n}\n\n/**\n * Analyze a single Zod field to extract its type information.\n *\n * @param name - Field name (can include dots for nested paths)\n * @param zodType - Zod type to analyze\n * @returns Analyzed field information\n */\nexport function analyzeField(name: string, zodType: z.ZodTypeAny): FieldInfo {\n let currentType = zodType;\n let isOptional = false;\n let isNullable = false;\n let defaultValue: unknown;\n\n // Store the original description before unwrapping\n const description = getDescription(zodType);\n\n // Unwrap all wrapper types (optional, nullable, default, effects) in any order\n let unwrapping = true;\n while (unwrapping) {\n unwrapping = false;\n\n if (currentType instanceof z.ZodOptional) {\n isOptional = true;\n currentType = currentType.unwrap();\n unwrapping = true;\n } else if (currentType instanceof z.ZodNullable) {\n isNullable = true;\n currentType = currentType.unwrap();\n unwrapping = true;\n } else if (currentType instanceof z.ZodDefault) {\n defaultValue = currentType._def.defaultValue();\n currentType = currentType._def.innerType;\n unwrapping = true;\n } else if (currentType instanceof z.ZodEffects) {\n currentType = currentType._def.schema;\n unwrapping = true;\n }\n }\n\n // Handle ZodUnion - pick the first option for rendering\n if (currentType instanceof z.ZodUnion) {\n const options = currentType._def.options as z.ZodTypeAny[];\n if (options.length > 0 && options[0]) {\n // Use first option as representative type\n currentType = options[0];\n }\n }\n\n // Handle ZodDiscriminatedUnion - analyze the discriminator\n if (currentType instanceof z.ZodDiscriminatedUnion) {\n // For discriminated unions, we can't easily pick a single type\n // Return as 'ZodDiscriminatedUnion' and let widgets handle it\n // Consumers can use the discriminator to conditionally render\n }\n\n // Handle ZodRecord - treat as a special case (key-value pairs)\n // Records are rendered as text by default, custom widgets can handle them\n if (currentType instanceof z.ZodRecord) {\n // Leave as ZodRecord - widgets can check typeName\n }\n\n // Handle ZodSet - treat like an array\n if (currentType instanceof z.ZodSet) {\n // Leave as ZodSet - similar to array handling\n }\n\n const typeName = currentType.constructor.name;\n\n // Extract nested fields for ZodObject\n let nestedFields: Map<string, FieldInfo> | undefined;\n let innerSchema: z.ZodObject<z.ZodRawShape> | undefined;\n\n if (currentType instanceof z.ZodObject) {\n innerSchema = currentType as z.ZodObject<z.ZodRawShape>;\n nestedFields = new Map();\n const shape = currentType.shape;\n for (const [childName, childType] of Object.entries(shape)) {\n nestedFields.set(\n childName,\n analyzeField(`${name}.${childName}`, childType as z.ZodTypeAny)\n );\n }\n }\n\n return {\n name,\n zodType: currentType,\n typeName,\n isOptional,\n isNullable,\n defaultValue,\n description,\n enumValues: extractEnumValues(currentType),\n innerType: extractInnerType(name, currentType),\n nestedFields,\n innerSchema,\n constraints: extractConstraints(currentType),\n };\n}\n\n/**\n * Dangerous property names that should never be accessed via path traversal.\n * These are JavaScript prototype chain keys that could enable prototype pollution attacks.\n */\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Check if a property key is safe to access.\n */\nfunction isSafeKey(key: string): boolean {\n return !DANGEROUS_KEYS.has(key);\n}\n\n/**\n * Get the value at a dot-notation path from an object.\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n *\n * @example\n * ```ts\n * getValueAtPath({ profile: { name: 'John' } }, 'profile.name') // 'John'\n * ```\n */\nexport function getValueAtPath(\n obj: Record<string, unknown>,\n path: string\n): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(part)) {\n return undefined;\n }\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n // Use Object.hasOwn to avoid prototype chain lookup\n if (!Object.hasOwn(current as object, part)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Set a value at a dot-notation path in an object (immutably).\n * SECURITY: Rejects dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution.\n *\n * @example\n * ```ts\n * setValueAtPath({ profile: { name: 'John' } }, 'profile.name', 'Jane')\n * // { profile: { name: 'Jane' } }\n * ```\n */\nexport function setValueAtPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): Record<string, unknown> {\n const parts = path.split('.');\n if (parts.length === 0 || parts[0] === undefined) {\n return obj;\n }\n\n const first = parts[0];\n\n // SECURITY: Reject dangerous property names\n if (!isSafeKey(first)) {\n console.warn(`Rejected dangerous property key in path: ${first}`);\n return obj;\n }\n\n if (parts.length === 1) {\n return { ...obj, [first]: value };\n }\n\n const rest = parts.slice(1);\n const nested = (Object.hasOwn(obj, first) ? obj[first] : {}) as Record<string, unknown> ?? {};\n\n return {\n ...obj,\n [first]: setValueAtPath(nested, rest.join('.'), value),\n };\n}\n\n/**\n * Extract description from a Zod type's definition.\n */\nfunction getDescription(zodType: z.ZodTypeAny): string | undefined {\n \n return (zodType as any)._def?.description;\n}\n\n/**\n * Extract enum values from ZodEnum or ZodNativeEnum.\n */\nfunction extractEnumValues(zodType: z.ZodTypeAny): string[] | undefined {\n if (zodType instanceof z.ZodEnum) {\n return zodType._def.values as string[];\n }\n\n if (zodType instanceof z.ZodNativeEnum) {\n const values = zodType._def.values;\n // Handle numeric enums (filter out reverse mappings)\n return Object.values(values).filter(\n (v) => typeof v === 'string'\n ) as string[];\n }\n\n return undefined;\n}\n\n/**\n * Extract inner type for compound types (arrays, sets, etc.).\n */\nfunction extractInnerType(\n name: string,\n zodType: z.ZodTypeAny\n): FieldInfo | undefined {\n if (zodType instanceof z.ZodArray) {\n return analyzeField(`${name}[]`, zodType._def.type);\n }\n\n if (zodType instanceof z.ZodSet) {\n return analyzeField(`${name}[]`, zodType._def.valueType);\n }\n\n return undefined;\n}\n\n/**\n * Extract validation constraints from Zod checks.\n */\nfunction extractConstraints(zodType: z.ZodTypeAny): FieldConstraints | undefined {\n const constraints: FieldConstraints = {};\n \n const checks = (zodType as any)._def?.checks as Array<{ kind: string; value?: unknown }> | undefined;\n\n if (!Array.isArray(checks)) {\n return undefined;\n }\n\n for (const check of checks) {\n switch (check.kind) {\n case 'min':\n if (zodType instanceof z.ZodString) {\n constraints.minLength = check.value as number;\n } else {\n constraints.min = check.value as number;\n }\n break;\n case 'max':\n if (zodType instanceof z.ZodString) {\n constraints.maxLength = check.value as number;\n } else {\n constraints.max = check.value as number;\n }\n break;\n case 'length':\n constraints.minLength = check.value as number;\n constraints.maxLength = check.value as number;\n break;\n case 'email':\n constraints.email = true;\n break;\n case 'url':\n constraints.url = true;\n break;\n case 'uuid':\n constraints.uuid = true;\n break;\n case 'regex':\n constraints.regex = check.value as RegExp;\n break;\n case 'int':\n constraints.int = true;\n break;\n case 'multipleOf':\n constraints.multipleOf = check.value as number;\n break;\n }\n }\n\n // Check for positive/negative via refinements on number\n if (zodType instanceof z.ZodNumber) {\n \n const minCheck = checks.find((c) => c.kind === 'min');\n if (minCheck && (minCheck as any).inclusive === false && minCheck.value === 0) {\n constraints.positive = true;\n }\n \n const maxCheck = checks.find((c) => c.kind === 'max');\n if (maxCheck && (maxCheck as any).inclusive === false && maxCheck.value === 0) {\n constraints.negative = true;\n }\n }\n\n return Object.keys(constraints).length > 0 ? constraints : undefined;\n}\n\n/**\n * Determine the default widget type for a Zod field.\n */\nexport function getDefaultWidgetType(fieldInfo: FieldInfo): string {\n const { typeName, description, enumValues, innerType, constraints } =\n fieldInfo;\n\n // Check for secret/password patterns in description\n if (description) {\n const lowerDesc = description.toLowerCase();\n if (\n lowerDesc.includes('password') ||\n lowerDesc.includes('secret') ||\n lowerDesc.includes('api key') ||\n lowerDesc.includes('apikey') ||\n lowerDesc.includes('token')\n ) {\n return 'password';\n }\n }\n\n // Check for email/url constraints\n if (constraints?.email) return 'text'; // Could be 'email' widget\n if (constraints?.url) return 'text'; // Could be 'url' widget\n\n // Map Zod types to widgets\n switch (typeName) {\n case 'ZodString':\n return 'text';\n case 'ZodNumber':\n return 'number';\n case 'ZodBoolean':\n return 'switch';\n case 'ZodEnum':\n case 'ZodNativeEnum':\n // Use radio for small enums, searchable-select for large\n if (enumValues) {\n if (enumValues.length <= 4) return 'radio';\n if (enumValues.length > 10) return 'searchable-select';\n }\n return 'select';\n case 'ZodArray':\n // String arrays become tag inputs\n if (innerType?.typeName === 'ZodString') {\n return 'tag-input';\n }\n return 'text'; // Fallback\n case 'ZodSet':\n // Sets are similar to arrays - string sets become tag inputs\n if (innerType?.typeName === 'ZodString') {\n return 'tag-input';\n }\n return 'text'; // Fallback\n case 'ZodObject':\n return 'nested'; // Special marker for nested objects\n case 'ZodRecord':\n return 'text'; // Records need custom widgets or JSON editor\n case 'ZodDiscriminatedUnion':\n return 'select'; // Use discriminator field to select variant\n case 'ZodDate':\n return 'text'; // Could be 'date' widget\n default:\n return 'text';\n }\n}\n\n/**\n * Check if a field should be treated as a secret/password field.\n */\nexport function isSecretField(fieldInfo: FieldInfo): boolean {\n if (!fieldInfo.description) return false;\n\n const lowerDesc = fieldInfo.description.toLowerCase();\n return (\n lowerDesc.includes('password') ||\n lowerDesc.includes('secret') ||\n lowerDesc.includes('api key') ||\n lowerDesc.includes('apikey') ||\n lowerDesc.includes('token') ||\n lowerDesc.includes('credential')\n );\n}\n\n/**\n * Check if a field is a nested object type.\n */\nexport function isNestedObject(fieldInfo: FieldInfo): boolean {\n return fieldInfo.typeName === 'ZodObject' && fieldInfo.nestedFields != null;\n}\n","import { createContext, useContext } from 'react';\nimport { WidgetRegistry, widgetRegistry } from '../../registry/widget-registry';\n\n/**\n * Context for providing a custom WidgetRegistry to AutoForm.\n */\nexport const WidgetRegistryContext = createContext<WidgetRegistry>(widgetRegistry);\n\n/**\n * Hook to access the current WidgetRegistry.\n * Returns the default registry if not wrapped in a provider.\n */\nexport function useWidgetRegistry(): WidgetRegistry {\n return useContext(WidgetRegistryContext);\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless text input widget.\n * Renders a basic text input with label, error display, and helper text.\n */\nexport function TextInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <input\n id={id}\n type=\"text\"\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n minLength={hint?.min}\n maxLength={hint?.max}\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless multi-line text input widget.\n * Renders a textarea with configurable rows.\n *\n * @example\n * ```tsx\n * // Via uiHints\n * <AutoForm\n * schema={schema}\n * uiHints={{ bio: { widget: 'textarea', rows: 5 } }}\n * />\n * ```\n */\nexport function Textarea({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const rows = hint?.rows ?? 4;\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <textarea\n id={id}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value)}\n disabled={disabled}\n readOnly={hint?.readOnly}\n placeholder={hint?.placeholder}\n rows={rows}\n minLength={hint?.min}\n maxLength={hint?.max}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n data-textarea\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Props for NumberInput - allows number | undefined since empty inputs are undefined\n */\nexport type NumberInputProps = Omit<FieldWidgetProps<number | undefined>, 'onChange'> & {\n /** Value can be number or undefined (empty) */\n value: number | undefined;\n /** onChange receives number or undefined (empty) */\n onChange: (value: number | undefined) => void;\n};\n\n/**\n * Headless number input widget.\n * Renders a number input with min/max/step support.\n *\n * Note: This widget properly handles empty inputs as `undefined`,\n * not as a type-cast lie. The form resolver handles validation\n * for required fields.\n */\nexport function NumberInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: NumberInputProps) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n if (val === '') {\n // Empty input is properly typed as undefined\n onChange(undefined);\n } else {\n const num = parseFloat(val);\n if (!isNaN(num)) {\n onChange(num);\n }\n }\n };\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <input\n id={id}\n type=\"number\"\n name={name}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n min={hint?.min}\n max={hint?.max}\n step={hint?.step}\n />\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless switch/toggle widget.\n * Renders a checkbox with switch semantics (role=\"switch\").\n */\nexport function Switch({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n hint,\n}: FieldWidgetProps<boolean>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n <label htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n name={name}\n checked={value ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.checked)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n />\n <span data-switch-label>{label}</span>\n </label>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless select dropdown widget.\n * Renders a native select element with options from hint or enum values.\n */\nexport function Select({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const options = hint?.options ?? [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <select\n id={id}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n >\n {!required && <option value=\"\">-- Select --</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect, useMemo, type ChangeEvent, type KeyboardEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\ninterface Option {\n value: string;\n label: string;\n}\n\n/**\n * Pre-indexed option for efficient filtering.\n * Stores lowercase versions to avoid repeated lowercasing.\n */\ninterface IndexedOption {\n option: Option;\n labelLower: string;\n valueLower: string;\n}\n\n/**\n * Headless searchable select widget.\n * Renders a select with search/filter functionality for large option lists.\n *\n * @example\n * ```tsx\n * // Via uiHints\n * <AutoForm\n * schema={z.object({ country: z.enum([...countries]) })}\n * uiHints={{\n * country: {\n * widget: 'searchable-select',\n * searchPlaceholder: 'Search countries...',\n * noResultsText: 'No countries found',\n * }\n * }}\n * />\n * ```\n */\nexport function SearchableSelect({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const listboxId = `${id}-listbox`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n\n const rawOptions: Option[] = hint?.options ?? [];\n\n // PERFORMANCE: Pre-index options with lowercase strings to avoid repeated toLowerCase() calls\n // This only recalculates when options change\n const indexedOptions = useMemo((): IndexedOption[] => {\n return rawOptions.map((opt) => ({\n option: opt,\n labelLower: opt.label.toLowerCase(),\n valueLower: opt.value.toLowerCase(),\n }));\n }, [rawOptions]);\n\n // PERFORMANCE: Build a Map for O(1) value lookup\n const optionsByValue = useMemo(() => {\n const map = new Map<string, Option>();\n for (const opt of rawOptions) {\n map.set(opt.value, opt);\n }\n return map;\n }, [rawOptions]);\n\n // PERFORMANCE: Filter using pre-indexed lowercase strings\n const filteredOptions = useMemo(() => {\n if (!searchTerm) {\n return rawOptions;\n }\n const searchLower = searchTerm.toLowerCase();\n return indexedOptions\n .filter(\n (indexed) =>\n indexed.labelLower.includes(searchLower) ||\n indexed.valueLower.includes(searchLower)\n )\n .map((indexed) => indexed.option);\n }, [searchTerm, indexedOptions, rawOptions]);\n\n // Get display label for current value using O(1) Map lookup\n const selectedOption = optionsByValue.get(value ?? '');\n const displayValue = selectedOption?.label ?? value ?? '';\n\n // Handle click outside to close\n useEffect(() => {\n function handleClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n setSearchTerm('');\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (isOpen && highlightedIndex >= 0 && listRef.current) {\n const item = listRef.current.children[highlightedIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: 'nearest' });\n }\n }, [highlightedIndex, isOpen]);\n\n const handleOpen = useCallback(() => {\n if (!disabled && !hint?.readOnly) {\n setIsOpen(true);\n setSearchTerm('');\n setHighlightedIndex(-1);\n // Focus search input after opening\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }, [disabled, hint?.readOnly]);\n\n const handleSelect = useCallback(\n (optionValue: string) => {\n onChange(optionValue);\n setIsOpen(false);\n setSearchTerm('');\n },\n [onChange]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled || hint?.readOnly) return;\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n if (!isOpen) {\n handleOpen();\n } else if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleSelect(filteredOptions[highlightedIndex].value);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSearchTerm('');\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n handleOpen();\n } else {\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0\n );\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen) {\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1\n );\n }\n break;\n case 'Home':\n if (isOpen) {\n e.preventDefault();\n setHighlightedIndex(0);\n }\n break;\n case 'End':\n if (isOpen) {\n e.preventDefault();\n setHighlightedIndex(filteredOptions.length - 1);\n }\n break;\n }\n },\n [disabled, filteredOptions, handleOpen, handleSelect, highlightedIndex, hint?.readOnly, isOpen]\n );\n\n const handleSearchChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value);\n setHighlightedIndex(-1);\n }, []);\n\n const noResultsText = hint?.noResultsText ?? 'No results found';\n const searchPlaceholder = hint?.searchPlaceholder ?? 'Search...';\n\n return (\n <div\n ref={containerRef}\n className={hint?.className}\n data-field={name}\n data-error={hasError}\n onKeyDown={handleKeyDown}\n >\n {label && (\n <label id={`${id}-label`}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n\n <div data-searchable-select data-open={isOpen} data-disabled={disabled || hint?.readOnly}>\n {/* Trigger button */}\n <button\n type=\"button\"\n id={id}\n onClick={handleOpen}\n disabled={disabled || hint?.readOnly}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-labelledby={`${id}-label`}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') || undefined\n }\n aria-invalid={hasError}\n data-searchable-select-trigger\n >\n <span data-searchable-select-value>\n {displayValue || hint?.placeholder || 'Select...'}\n </span>\n <span data-searchable-select-arrow aria-hidden=\"true\">\n {isOpen ? '\\u25B2' : '\\u25BC'}\n </span>\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div data-searchable-select-dropdown>\n {/* Search input */}\n <input\n ref={inputRef}\n type=\"text\"\n value={searchTerm}\n onChange={handleSearchChange}\n placeholder={searchPlaceholder}\n aria-label=\"Search options\"\n data-searchable-select-input\n />\n\n {/* Options list */}\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={`${id}-label`}\n data-searchable-select-list\n >\n {filteredOptions.length === 0 ? (\n <li data-searchable-select-no-results>{noResultsText}</li>\n ) : (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={option.value === value}\n data-searchable-select-option\n data-selected={option.value === value}\n data-highlighted={index === highlightedIndex}\n onClick={() => handleSelect(option.value)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n {option.label}\n </li>\n ))\n )}\n </ul>\n </div>\n )}\n </div>\n\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless radio button group widget.\n * Renders a group of radio buttons for single selection from options.\n */\nexport function RadioGroup({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const options = hint?.options ?? [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n <fieldset data-radio-group>\n {label && (\n <legend data-radio-legend>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </legend>\n )}\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n <div data-radio-options role=\"radiogroup\" aria-required={required}>\n {options.map((opt, index) => {\n const optionId = `${id}-${index}`;\n const isChecked = value === opt.value;\n\n return (\n <label\n key={opt.value}\n htmlFor={optionId}\n data-radio-option\n data-checked={isChecked}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={isChecked}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n />\n <span data-radio-label>{opt.label}</span>\n </label>\n );\n })}\n </div>\n </fieldset>\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless slider/range widget.\n * Renders a range input for numeric values with optional min/max/step.\n */\nexport function Slider({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<number>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const valueId = `${id}-value`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n // Extract constraints from hint\n const min = hint?.min ?? 0;\n const max = hint?.max ?? 100;\n const step = hint?.step ?? 1;\n\n // Current value or default to min\n const currentValue = value ?? min;\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id} data-slider-label>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-slider-container>\n <input\n id={id}\n type=\"range\"\n name={name}\n value={currentValue}\n min={min}\n max={max}\n step={step}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(Number(e.target.value))}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-describedby={\n [valueId, hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n />\n <output id={valueId} htmlFor={id} data-slider-value>\n {currentValue}\n </output>\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless color picker widget.\n * Renders a native color input with optional text input for hex values.\n */\nexport function ColorPicker({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const textId = `${id}-text`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n // Default to black if no value\n const currentValue = value || '#000000';\n\n // Normalize hex color (ensure 6 digits)\n const normalizeHex = (hex: string): string => {\n // Remove # if present\n let clean = hex.replace(/^#/, '');\n\n // Expand shorthand (e.g., \"fff\" -> \"ffffff\")\n if (clean.length === 3) {\n clean = clean.split('').map(c => c + c).join('');\n }\n\n // Validate hex\n if (/^[0-9a-fA-F]{6}$/.test(clean)) {\n return `#${clean.toLowerCase()}`;\n }\n\n return currentValue; // Return current if invalid\n };\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id} data-color-label>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-color-container>\n <input\n id={id}\n type=\"color\"\n name={name}\n value={currentValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled || hint?.readOnly}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n />\n <input\n id={textId}\n type=\"text\"\n value={currentValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const normalized = normalizeHex(e.target.value);\n onChange(normalized);\n }}\n onBlur={(e) => {\n // Normalize on blur\n const normalized = normalizeHex(e.target.value);\n if (normalized !== e.target.value) {\n onChange(normalized);\n }\n }}\n disabled={disabled || hint?.readOnly}\n placeholder=\"#000000\"\n pattern=\"^#[0-9a-fA-F]{6}$\"\n maxLength={7}\n data-color-text\n aria-label={`${label} hex value`}\n />\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, type KeyboardEvent, type ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless tag/chip input widget.\n * Renders an input that converts text into tags on Enter/comma.\n */\nexport function TagInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string[]>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const tags = value ?? [];\n const [inputValue, setInputValue] = useState('');\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmed = tag.trim();\n if (trimmed && !tags.includes(trimmed)) {\n onChange([...tags, trimmed]);\n }\n setInputValue('');\n },\n [tags, onChange]\n );\n\n const removeTag = useCallback(\n (index: number) => {\n onChange(tags.filter((_, i) => i !== index));\n },\n [tags, onChange]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(inputValue);\n } else if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n },\n [inputValue, tags, addTag, removeTag]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue.trim()) {\n addTag(inputValue);\n }\n }, [inputValue, addTag]);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-tag-container>\n {tags.map((tag, index) => (\n <span key={`${tag}-${index}`} data-tag>\n {tag}\n {!disabled && !hint?.readOnly && (\n <button\n type=\"button\"\n onClick={() => removeTag(index)}\n aria-label={`Remove ${tag}`}\n data-tag-remove\n >\n ×\n </button>\n )}\n </span>\n ))}\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={hint?.readOnly}\n placeholder={hint?.placeholder ?? 'Add tag...'}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n data-tag-input\n />\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, type ChangeEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * Headless password/secret input widget.\n * Renders a password input with toggle visibility button.\n */\nexport function SecretInput({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<string>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const [showValue, setShowValue] = useState(false);\n\n const toggleVisibility = useCallback(() => {\n setShowValue((prev) => !prev);\n }, []);\n\n return (\n <div className={hint?.className} data-field={name} data-error={hasError}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n <div data-secret-container>\n <input\n id={id}\n type={showValue ? 'text' : 'password'}\n name={name}\n value={value ?? ''}\n onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={hint?.placeholder}\n aria-invalid={hasError}\n aria-describedby={\n [hasError && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n aria-required={required}\n readOnly={hint?.readOnly}\n autoComplete=\"off\"\n data-secret-input\n />\n <button\n type=\"button\"\n onClick={toggleVisibility}\n disabled={disabled}\n aria-label={showValue ? 'Hide value' : 'Show value'}\n data-secret-toggle\n >\n {showValue ? 'Hide' : 'Show'}\n </button>\n </div>\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {hasError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, type ChangeEvent, type DragEvent } from 'react';\nimport type { FieldWidgetProps } from '../../types/ui-hints';\n\n/**\n * File or array of files depending on `multiple` hint.\n */\nexport type FileUploadValue = File | File[] | null;\n\n/**\n * Headless file upload widget with drag-and-drop support.\n *\n * @example\n * ```tsx\n * // Single file\n * <AutoForm\n * schema={z.object({ avatar: z.instanceof(File).optional() })}\n * uiHints={{ avatar: { widget: 'file-upload', accept: 'image/*' } }}\n * />\n *\n * // Multiple files\n * <AutoForm\n * schema={z.object({ attachments: z.array(z.instanceof(File)) })}\n * uiHints={{ attachments: { widget: 'file-upload', multiple: true, accept: '.pdf,.doc' } }}\n * />\n * ```\n */\nexport function FileUpload({\n value,\n onChange,\n name,\n label,\n error,\n disabled,\n required,\n hint,\n}: FieldWidgetProps<FileUploadValue>) {\n const id = `field-${name}`;\n const errorId = `${id}-error`;\n const helperId = `${id}-helper`;\n const _hasError = Boolean(error);\n const hasHelper = Boolean(hint?.helperText);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n\n const accept = hint?.accept;\n const multiple = hint?.multiple ?? false;\n const maxSize = hint?.maxSize;\n\n const validateFiles = useCallback(\n (files: File[]): { valid: File[]; errors: string[] } => {\n const valid: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n // Check file size\n if (maxSize && file.size > maxSize) {\n const maxMB = (maxSize / 1024 / 1024).toFixed(1);\n errors.push(`${file.name} exceeds ${maxMB}MB limit`);\n continue;\n }\n\n // Check file type (basic validation)\n if (accept) {\n const acceptedTypes = accept.split(',').map((t) => t.trim());\n const fileExt = `.${file.name.split('.').pop()?.toLowerCase()}`;\n const fileMime = file.type;\n\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return fileExt === type.toLowerCase();\n }\n if (type.endsWith('/*')) {\n return fileMime.startsWith(type.replace('/*', '/'));\n }\n return fileMime === type;\n });\n\n if (!isAccepted) {\n errors.push(`${file.name} is not an accepted file type`);\n continue;\n }\n }\n\n valid.push(file);\n }\n\n return { valid, errors };\n },\n [accept, maxSize]\n );\n\n const handleFiles = useCallback(\n (files: FileList | null) => {\n if (!files || files.length === 0) {\n onChange(multiple ? [] : null);\n setLocalError(null);\n return;\n }\n\n const fileArray = Array.from(files);\n const { valid, errors } = validateFiles(fileArray);\n\n if (errors.length > 0) {\n setLocalError(errors.join(', '));\n } else {\n setLocalError(null);\n }\n\n if (valid.length === 0) {\n onChange(multiple ? [] : null);\n return;\n }\n\n if (multiple) {\n onChange(valid);\n } else {\n const firstFile = valid[0];\n onChange(firstFile ?? null);\n }\n },\n [multiple, onChange, validateFiles]\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n handleFiles(e.target.files);\n },\n [handleFiles]\n );\n\n const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n if (disabled || hint?.readOnly) return;\n\n handleFiles(e.dataTransfer.files);\n },\n [disabled, handleFiles, hint?.readOnly]\n );\n\n const handleClick = useCallback(() => {\n if (!disabled && !hint?.readOnly) {\n inputRef.current?.click();\n }\n }, [disabled, hint?.readOnly]);\n\n const handleRemove = useCallback(\n (index?: number) => {\n if (multiple && Array.isArray(value)) {\n if (index !== undefined) {\n const newFiles = value.filter((_, i) => i !== index);\n onChange(newFiles);\n } else {\n onChange([]);\n }\n } else {\n onChange(null);\n }\n setLocalError(null);\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [multiple, onChange, value]\n );\n\n const displayError = error ?? localError;\n\n // Get display value\n const files = multiple\n ? Array.isArray(value)\n ? value\n : []\n : value instanceof File\n ? [value]\n : [];\n\n return (\n <div className={hint?.className} data-field={name} data-error={Boolean(displayError)}>\n {label && (\n <label htmlFor={id}>\n {label}\n {required && (\n <span aria-hidden=\"true\" data-required>\n *\n </span>\n )}\n </label>\n )}\n\n <div\n data-file-dropzone\n data-dragging={isDragging}\n data-disabled={disabled || hint?.readOnly}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n role=\"button\"\n tabIndex={disabled || hint?.readOnly ? -1 : 0}\n aria-describedby={\n [Boolean(displayError) && errorId, hasHelper && helperId].filter(Boolean).join(' ') ||\n undefined\n }\n >\n <input\n ref={inputRef}\n id={id}\n type=\"file\"\n name={name}\n accept={accept}\n multiple={multiple}\n disabled={disabled || hint?.readOnly}\n onChange={handleChange}\n aria-invalid={Boolean(displayError)}\n aria-required={required}\n data-file-input\n />\n\n {files.length === 0 ? (\n <p data-file-placeholder>\n {hint?.placeholder ?? (isDragging ? 'Drop files here...' : 'Click or drag files to upload')}\n </p>\n ) : (\n <ul data-file-list>\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} data-file-item>\n <span data-file-name>{file.name}</span>\n <span data-file-size>({formatFileSize(file.size)})</span>\n {!disabled && !hint?.readOnly && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(multiple ? index : undefined);\n }}\n aria-label={`Remove ${file.name}`}\n data-file-remove\n >\n ×\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {hasHelper && (\n <p id={helperId} data-helper>\n {hint?.helperText}\n </p>\n )}\n {displayError && (\n <p id={errorId} role=\"alert\" data-error-message>\n {displayError}\n </p>\n )}\n </div>\n );\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n","import type { ComponentType } from 'react';\nimport type { FieldInfo } from './introspection';\nimport { getDefaultWidgetType, isSecretField } from './introspection';\nimport type { FieldUIHint, FieldWidgetProps } from '../types/ui-hints';\nimport { useWidgetRegistry } from './hooks/useWidgetRegistry';\nimport {\n TextInput,\n Textarea,\n NumberInput,\n Switch,\n Select,\n SearchableSelect,\n RadioGroup,\n Slider,\n ColorPicker,\n TagInput,\n SecretInput,\n FileUpload,\n} from './widgets';\n\n/**\n * Props for the FieldRenderer component.\n */\nexport interface FieldRendererProps {\n /** Analyzed field information from Zod schema */\n fieldInfo: FieldInfo;\n\n /** UI hints for this field */\n hint?: FieldUIHint;\n\n /** Current field value */\n value: unknown;\n\n /** Callback to update the value */\n onChange: (value: unknown) => void;\n\n /** Validation error message */\n error?: string;\n\n /** Whether the field is disabled */\n disabled?: boolean;\n\n /**\n * For nested objects: render function for nested fields.\n * Called with the nested field info to recursively render.\n */\n renderNestedField?: (fieldInfo: FieldInfo) => React.ReactNode;\n}\n\n/**\n * Map of built-in widget names to their components.\n */\nconst BUILTIN_WIDGETS: Record<string, ComponentType<FieldWidgetProps<unknown>>> = {\n text: TextInput as ComponentType<FieldWidgetProps<unknown>>,\n textarea: Textarea as ComponentType<FieldWidgetProps<unknown>>,\n number: NumberInput as ComponentType<FieldWidgetProps<unknown>>,\n switch: Switch as ComponentType<FieldWidgetProps<unknown>>,\n checkbox: Switch as ComponentType<FieldWidgetProps<unknown>>,\n select: Select as ComponentType<FieldWidgetProps<unknown>>,\n 'searchable-select': SearchableSelect as ComponentType<FieldWidgetProps<unknown>>,\n radio: RadioGroup as ComponentType<FieldWidgetProps<unknown>>,\n 'radio-group': RadioGroup as ComponentType<FieldWidgetProps<unknown>>,\n password: SecretInput as ComponentType<FieldWidgetProps<unknown>>,\n 'tag-input': TagInput as ComponentType<FieldWidgetProps<unknown>>,\n 'file-upload': FileUpload as ComponentType<FieldWidgetProps<unknown>>,\n slider: Slider as ComponentType<FieldWidgetProps<unknown>>,\n range: Slider as ComponentType<FieldWidgetProps<unknown>>,\n 'color-picker': ColorPicker as ComponentType<FieldWidgetProps<unknown>>,\n color: ColorPicker as ComponentType<FieldWidgetProps<unknown>>,\n};\n\n/**\n * Map Zod type names to default widget components.\n */\nconst TYPE_TO_WIDGET: Record<string, ComponentType<FieldWidgetProps<unknown>>> = {\n ZodString: TextInput as ComponentType<FieldWidgetProps<unknown>>,\n ZodNumber: NumberInput as ComponentType<FieldWidgetProps<unknown>>,\n ZodBoolean: Switch as ComponentType<FieldWidgetProps<unknown>>,\n ZodEnum: Select as ComponentType<FieldWidgetProps<unknown>>,\n ZodNativeEnum: Select as ComponentType<FieldWidgetProps<unknown>>,\n ZodArray: TagInput as ComponentType<FieldWidgetProps<unknown>>,\n};\n\n/**\n * Renders a single field based on its Zod type and UI hints.\n * Automatically selects the appropriate widget component.\n */\nexport function FieldRenderer({\n fieldInfo,\n hint,\n value,\n onChange,\n error,\n disabled,\n renderNestedField,\n}: FieldRendererProps) {\n const widgetRegistry = useWidgetRegistry();\n\n // Handle nested objects\n if (fieldInfo.typeName === 'ZodObject' && fieldInfo.nestedFields && renderNestedField) {\n const nestedFields = Array.from(fieldInfo.nestedFields.values());\n const fieldBaseName = fieldInfo.name.split('.').pop() ?? fieldInfo.name;\n\n return (\n <div data-nested-object data-field={fieldInfo.name}>\n <fieldset data-nested-fieldset>\n <legend data-nested-legend>\n {hint?.label ?? fieldInfo.description ?? formatLabel(fieldBaseName)}\n </legend>\n {hint?.helperText && <p data-helper>{hint.helperText}</p>}\n <div data-nested-fields>\n {nestedFields.map((nestedInfo) => renderNestedField(nestedInfo))}\n </div>\n </fieldset>\n </div>\n );\n }\n\n // Determine which widget to use\n let Widget: ComponentType<FieldWidgetProps<unknown>>;\n\n if (hint?.widget) {\n if (typeof hint.widget === 'string') {\n // Check custom widgets first, then built-in widgets\n Widget =\n widgetRegistry.getComponent(hint.widget) ??\n BUILTIN_WIDGETS[hint.widget] ??\n (TextInput as ComponentType<FieldWidgetProps<unknown>>);\n } else {\n // Custom component passed directly\n Widget = hint.widget;\n }\n } else {\n // Auto-detect from Zod type\n const defaultType = getDefaultWidgetType(fieldInfo);\n\n // Check for textarea hint (rows > 1)\n if (fieldInfo.typeName === 'ZodString' && hint?.rows && hint.rows > 1) {\n Widget = Textarea as ComponentType<FieldWidgetProps<unknown>>;\n }\n // Check for searchable-select\n else if (defaultType === 'searchable-select') {\n Widget = SearchableSelect as ComponentType<FieldWidgetProps<unknown>>;\n } else {\n Widget =\n BUILTIN_WIDGETS[defaultType] ??\n TYPE_TO_WIDGET[fieldInfo.typeName] ??\n (TextInput as ComponentType<FieldWidgetProps<unknown>>);\n }\n\n // Override to SecretInput if field looks like a secret\n if (fieldInfo.typeName === 'ZodString' && isSecretField(fieldInfo)) {\n Widget = SecretInput as ComponentType<FieldWidgetProps<unknown>>;\n }\n }\n\n // Build options from enum values if not provided in hints\n const options =\n hint?.options ??\n (fieldInfo.enumValues\n ? fieldInfo.enumValues.map((v) => ({ value: v, label: v }))\n : undefined);\n\n // Extract field base name (last segment of dot-notation path)\n const fieldBaseName = fieldInfo.name.split('.').pop() ?? fieldInfo.name;\n\n // Build the props for the widget\n const props: FieldWidgetProps<unknown> = {\n value,\n onChange,\n name: fieldInfo.name, // Full path for form registration\n label: hint?.label ?? fieldInfo.description ?? formatLabel(fieldBaseName),\n error,\n disabled: disabled || hint?.readOnly,\n required: !fieldInfo.isOptional,\n hint: {\n ...hint,\n options,\n min: hint?.min ?? fieldInfo.constraints?.min ?? fieldInfo.constraints?.minLength,\n max: hint?.max ?? fieldInfo.constraints?.max ?? fieldInfo.constraints?.maxLength,\n },\n };\n\n return <Widget {...props} />;\n}\n\n/**\n * Convert a camelCase or snake_case field name to a human-readable label.\n */\nfunction formatLabel(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1') // camelCase -> Camel Case\n .replace(/_/g, ' ') // snake_case -> snake case\n .replace(/^\\w/, (c) => c.toUpperCase()) // Capitalize first letter\n .trim();\n}\n","import { useState, useCallback } from 'react';\nimport type { FieldGroupProps } from '../types/ui-hints';\n\n/**\n * Headless field group component for organizing form sections.\n * Can be used standalone or with AutoForm's render prop.\n *\n * @example\n * ```tsx\n * // Standalone usage\n * <FieldGroup title=\"Basic Settings\">\n * <TextInput ... />\n * <NumberInput ... />\n * </FieldGroup>\n *\n * // Collapsible group\n * <FieldGroup title=\"Advanced\" collapsible defaultCollapsed>\n * <Switch ... />\n * </FieldGroup>\n *\n * // With AutoForm render prop\n * <AutoForm schema={schema}>\n * {({ getField }) => (\n * <>\n * <FieldGroup title=\"Profile\">\n * {getField('name')}\n * {getField('email')}\n * </FieldGroup>\n * <FieldGroup title=\"Preferences\" collapsible>\n * {getField('theme')}\n * {getField('notifications')}\n * </FieldGroup>\n * </>\n * )}\n * </AutoForm>\n * ```\n */\nexport function FieldGroup({\n title,\n description,\n collapsible = false,\n defaultCollapsed = false,\n className,\n children,\n}: FieldGroupProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const toggleCollapsed = useCallback(() => {\n if (collapsible) {\n setIsCollapsed((prev) => !prev);\n }\n }, [collapsible]);\n\n const headerId = `fieldgroup-${title.toLowerCase().replace(/\\s+/g, '-')}`;\n const contentId = `${headerId}-content`;\n\n return (\n <fieldset\n className={className}\n data-fieldgroup\n data-collapsible={collapsible}\n data-collapsed={isCollapsed}\n >\n {collapsible ? (\n <legend>\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n aria-expanded={!isCollapsed}\n aria-controls={contentId}\n data-fieldgroup-toggle\n >\n <span data-fieldgroup-arrow aria-hidden=\"true\">\n {isCollapsed ? '\\u25B6' : '\\u25BC'}\n </span>\n <span id={headerId} data-fieldgroup-title>\n {title}\n </span>\n </button>\n </legend>\n ) : (\n <legend id={headerId} data-fieldgroup-title>\n {title}\n </legend>\n )}\n\n {description && (\n <p data-fieldgroup-description>{description}</p>\n )}\n\n <div\n id={contentId}\n role=\"group\"\n aria-labelledby={headerId}\n data-fieldgroup-content\n hidden={collapsible && isCollapsed}\n >\n {children}\n </div>\n </fieldset>\n );\n}\n\n/**\n * Props for the FieldSection component (alias for FieldGroup).\n */\nexport type FieldSectionProps = FieldGroupProps;\n\n/**\n * Alias for FieldGroup with semantic naming.\n * Use when you prefer \"section\" terminology over \"group\".\n */\nexport const FieldSection = FieldGroup;\n"],"mappings":"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","names":["useMemo","useEffect","useCallback","useRef","useState","jsx","jsxs","files","widgetRegistry","fieldBaseName","isSafeKey","DANGEROUS_KEYS"]}
|