@formatica/react 0.1.1 → 0.2.1

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.
Files changed (33) hide show
  1. package/dist/components/BaseField.d.ts +17 -0
  2. package/dist/components/BaseField.d.ts.map +1 -0
  3. package/dist/components/FormBuilder.d.ts +22 -0
  4. package/dist/components/FormBuilder.d.ts.map +1 -0
  5. package/dist/components/FormaticaProvider.d.ts +15 -0
  6. package/dist/components/FormaticaProvider.d.ts.map +1 -0
  7. package/dist/components/fields/CheckboxField.d.ts +10 -0
  8. package/dist/components/fields/CheckboxField.d.ts.map +1 -0
  9. package/dist/components/fields/NumberField.d.ts +17 -0
  10. package/dist/components/fields/NumberField.d.ts.map +1 -0
  11. package/dist/components/fields/RadioField.d.ts +17 -0
  12. package/dist/components/fields/RadioField.d.ts.map +1 -0
  13. package/dist/components/fields/SelectField.d.ts +19 -0
  14. package/dist/components/fields/SelectField.d.ts.map +1 -0
  15. package/dist/components/fields/SliderField.d.ts +13 -0
  16. package/dist/components/fields/SliderField.d.ts.map +1 -0
  17. package/dist/components/fields/SwitchField.d.ts +11 -0
  18. package/dist/components/fields/SwitchField.d.ts.map +1 -0
  19. package/dist/components/fields/TextField.d.ts +15 -0
  20. package/dist/components/fields/TextField.d.ts.map +1 -0
  21. package/dist/components/fields/TextareaField.d.ts +14 -0
  22. package/dist/components/fields/TextareaField.d.ts.map +1 -0
  23. package/dist/formatica-react.es.js +498 -486
  24. package/dist/formatica-react.es.js.map +1 -1
  25. package/dist/formatica-react.umd.cjs +1 -1
  26. package/dist/formatica-react.umd.cjs.map +1 -1
  27. package/dist/hooks/useForm.d.ts +26 -0
  28. package/dist/hooks/useForm.d.ts.map +1 -0
  29. package/dist/hooks/useFormContext.d.ts +4 -0
  30. package/dist/hooks/useFormContext.d.ts.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"formatica-react.umd.cjs","sources":["../src/hooks/useForm.ts","../src/hooks/useFormContext.ts","../src/components/BaseField.tsx","../src/components/fields/TextField.tsx","../src/components/fields/NumberField.tsx","../src/components/fields/TextareaField.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/RadioField.tsx","../src/components/fields/SwitchField.tsx","../src/components/fields/SliderField.tsx","../src/components/FormBuilder.tsx"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Formatica React – useForm hook\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { FieldSchema, FormSchema } from \"@formatica/core\";\nimport { evaluateCondition, extractFields, getRule } from \"@formatica/core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FormInstance {\n values: Record<string, unknown>;\n errors: Record<string, string[]>;\n touched: Record<string, boolean>;\n dirty: Record<string, boolean>;\n isValid: boolean;\n isDirty: boolean;\n isSubmitting: boolean;\n submitCount: number;\n setFieldValue: (name: string, value: unknown) => void;\n validate: () => Promise<boolean>;\n validateField: (name: string) => Promise<boolean>;\n submit: (handler: (values: Record<string, unknown>) => void | Promise<void>) => Promise<void>;\n reset: () => void;\n clear: () => void;\n setError: (field: string, message: string | string[]) => void;\n clearError: (field: string) => void;\n clearErrors: () => void;\n getFieldValue: (name: string) => unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTypeDefault(field: FieldSchema): unknown {\n switch (field.type) {\n case \"tags\":\n case \"checkbox-group\":\n return [];\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"file\":\n return null;\n default:\n return \"\";\n }\n}\n\nfunction buildDefaults(fields: FieldSchema[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n values[field.name] = field.defaultValue ?? getTypeDefault(field);\n }\n return values;\n}\n\ninterface ParsedRule {\n name: string;\n params: Record<string, unknown>;\n}\n\nfunction parseRules(rules: string | string[] | Record<string, unknown> | undefined): ParsedRule[] {\n if (!rules) return [];\n\n if (typeof rules === \"string\") {\n return rules.split(\"|\").map(parseRuleString);\n }\n if (Array.isArray(rules)) {\n return rules.map(parseRuleString);\n }\n // Record form: { required: true, minLength: 3, ... }\n return Object.entries(rules)\n .filter(([, v]) => v !== false && v !== undefined)\n .map(([name, paramValue]) => ({\n name,\n params:\n typeof paramValue === \"object\" && paramValue !== null\n ? (paramValue as Record<string, unknown>)\n : { [name]: paramValue },\n }));\n}\n\nfunction parseRuleString(rule: string): ParsedRule {\n const [name = \"\", ...paramParts] = rule.split(\":\");\n const paramStr = paramParts.join(\":\");\n const params: Record<string, unknown> = {};\n if (paramStr) {\n // \"min:3\" → { min: 3 }, \"between:1,10\" → { min: 1, max: 10 }\n const values = paramStr.split(\",\");\n if (name === \"between\" && values.length === 2) {\n params.min = Number(values[0]);\n params.max = Number(values[1]);\n } else if (name === \"pattern\") {\n params.pattern = paramStr;\n } else {\n params[name!] = values.length === 1 ? values[0] : values;\n // Also set as numeric if parseable\n if (values.length === 1) {\n const n = Number(values[0]);\n if (!Number.isNaN(n)) {\n params[name!] = n;\n // Common alias: minLength:3 → params.min = 3\n if (name === \"minLength\") params.min = n;\n if (name === \"maxLength\") params.max = n;\n }\n }\n }\n }\n return { name: name!, params };\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseFormOptions {\n locale?: string;\n}\n\nexport function useForm(schema: FormSchema, _options?: UseFormOptions): FormInstance {\n const fields = extractFields(schema.fields);\n const initialValuesRef = useRef(buildDefaults(fields));\n const fieldsRef = useRef(fields);\n\n const [values, setValues] = useState<Record<string, unknown>>(() => ({\n ...initialValuesRef.current,\n }));\n const [errors, setErrors] = useState<Record<string, string[]>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [dirty, setDirty] = useState<Record<string, boolean>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitCount, setSubmitCount] = useState(0);\n\n // Keep latest values in a ref for async validation\n const valuesRef = useRef(values);\n valuesRef.current = values;\n const errorsRef = useRef(errors);\n errorsRef.current = errors;\n\n const isValid = Object.values(errors).every((e) => e.length === 0);\n const isDirty = Object.values(dirty).some(Boolean);\n\n // ---- Field value ----\n\n const setFieldValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n setDirty((prev) => ({ ...prev, [name]: true }));\n }, []);\n\n const getFieldValue = useCallback((name: string) => valuesRef.current[name], []);\n\n // ---- Validation ----\n\n const validateSingleField = useCallback(\n async (name: string, currentValues: Record<string, unknown>): Promise<string[]> => {\n const field = fieldsRef.current.find((f) => f.name === name);\n if (!field) return [];\n\n // Check condition — if field is hidden, skip validation\n if (field.condition) {\n const visible = evaluateCondition(field.condition, currentValues);\n if (!visible) return [];\n }\n\n const rules = parseRules(field.rules);\n // If field is marked required, ensure required rule is included\n if (field.required && !rules.some((r) => r.name === \"required\")) {\n rules.unshift({ name: \"required\", params: {} });\n }\n\n const fieldErrors: string[] = [];\n const ctx = {\n values: currentValues,\n getFieldValue: (n: string) => currentValues[n],\n };\n\n for (const rule of rules) {\n const ruleFn = getRule(rule.name);\n if (!ruleFn) continue;\n\n const result = await ruleFn(currentValues[name], rule.params, ctx);\n if (typeof result === \"string\") {\n fieldErrors.push(result);\n }\n }\n\n return fieldErrors;\n },\n [],\n );\n\n const validateField = useCallback(\n async (name: string): Promise<boolean> => {\n const fieldErrors = await validateSingleField(name, valuesRef.current);\n setErrors((prev) => ({ ...prev, [name]: fieldErrors }));\n setTouched((prev) => ({ ...prev, [name]: true }));\n return fieldErrors.length === 0;\n },\n [validateSingleField],\n );\n\n const validate = useCallback(async (): Promise<boolean> => {\n const currentValues = valuesRef.current;\n const allErrors: Record<string, string[]> = {};\n let allValid = true;\n\n for (const field of fieldsRef.current) {\n const fieldErrors = await validateSingleField(field.name, currentValues);\n allErrors[field.name] = fieldErrors;\n if (fieldErrors.length > 0) allValid = false;\n }\n\n setErrors(allErrors);\n return allValid;\n }, [validateSingleField]);\n\n // ---- Submit ----\n\n const submit = useCallback(\n async (\n handler: (values: Record<string, unknown>) => void | Promise<void>,\n ): Promise<void> => {\n setIsSubmitting(true);\n setSubmitCount((prev) => prev + 1);\n\n // Mark all as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of fieldsRef.current) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n try {\n const valid = await validate();\n if (!valid) return;\n await handler({ ...valuesRef.current });\n } finally {\n setIsSubmitting(false);\n }\n },\n [validate],\n );\n\n // ---- Reset / Clear ----\n\n const reset = useCallback(() => {\n setValues({ ...initialValuesRef.current });\n setErrors({});\n setTouched({});\n setDirty({});\n }, []);\n\n const clear = useCallback(() => {\n const cleared: Record<string, unknown> = {};\n for (const field of fieldsRef.current) {\n cleared[field.name] = null;\n }\n setValues(cleared);\n setErrors({});\n }, []);\n\n // ---- Error management ----\n\n const setError = useCallback((field: string, message: string | string[]) => {\n const msgs = Array.isArray(message) ? message : [message];\n setErrors((prev) => ({ ...prev, [field]: msgs }));\n }, []);\n\n const clearError = useCallback((field: string) => {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n\n return {\n values,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n submitCount,\n setFieldValue,\n validate,\n validateField,\n submit,\n reset,\n clear,\n setError,\n clearError,\n clearErrors,\n getFieldValue,\n };\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – Form context\n// ---------------------------------------------------------------------------\n\nimport { createContext, useContext } from \"react\";\nimport type { FormInstance } from \"./useForm\";\n\nexport const FormContext = createContext<FormInstance | null>(null);\n\nexport function useFormContext(): FormInstance {\n const ctx = useContext(FormContext);\n if (!ctx) throw new Error(\"useFormContext must be used within a FormProvider\");\n return ctx;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – BaseField wrapper (matches Vue BaseField styling)\n// ---------------------------------------------------------------------------\n\nimport { type ReactNode, useState } from \"react\";\n\nexport interface BaseFieldProps {\n label?: string;\n required?: boolean;\n errors?: string[];\n touched?: boolean;\n helpText?: string;\n tooltip?: string;\n disabled?: boolean;\n readOnly?: boolean;\n fieldName?: string;\n children: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function BaseField({\n label,\n required,\n errors,\n touched = true,\n helpText,\n tooltip,\n disabled,\n readOnly,\n fieldName,\n children,\n className,\n style,\n}: BaseFieldProps) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const hasErrors = touched && errors !== undefined && errors.length > 0;\n const fieldId = fieldName ? `fc-field-${fieldName}` : undefined;\n const errorId = fieldName ? `fc-error-${fieldName}` : undefined;\n\n return (\n <div\n className={`relative mb-4 ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${readOnly ? \"fc-readonly\" : \"\"} ${className ?? \"\"}`}\n style={style}\n >\n {/* Label row */}\n {label && (\n <div className=\"mb-1.5 flex items-center gap-1\">\n <label htmlFor={fieldId} className=\"block text-sm font-medium text-gray-700\">\n {label}\n {required && (\n <span className=\"text-red-500 ml-0.5\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n\n {/* Tooltip icon */}\n {tooltip && (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n onFocus={() => setShowTooltip(true)}\n onBlur={() => setShowTooltip(false)}\n >\n <button\n type=\"button\"\n className=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-gray-200 text-gray-500 text-xs hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n aria-label={`Info: ${tooltip}`}\n tabIndex={0}\n >\n i\n </button>\n {showTooltip && (\n <div\n role=\"tooltip\"\n className=\"absolute bottom-full left-1/2 z-10 mb-2 -translate-x-1/2 rounded-md bg-gray-900 px-3 py-1.5 text-xs text-white shadow-lg whitespace-nowrap\"\n >\n {tooltip}\n <div className=\"absolute left-1/2 top-full -translate-x-1/2 border-4 border-transparent border-t-gray-900\" />\n </div>\n )}\n </span>\n )}\n </div>\n )}\n\n {/* Input slot */}\n <div id={fieldId}>{children}</div>\n\n {/* Error messages */}\n {hasErrors && (\n <div>\n {errors.map((error, idx) => (\n <p\n key={`${error}-${idx}`}\n id={idx === 0 ? errorId : undefined}\n className=\"mt-1 text-xs text-red-500\"\n role=\"alert\"\n >\n {error}\n </p>\n ))}\n </div>\n )}\n\n {/* Help text */}\n {helpText && !hasErrors && <p className=\"mt-1 text-xs text-gray-400\">{helpText}</p>}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – TextField (matches Vue TextInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface TextFieldProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n inputType?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\";\n readOnly?: boolean;\n prefix?: string;\n suffix?: string;\n maxLength?: number;\n className?: string;\n}\n\nconst baseInputClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-text-input\";\n\nexport function TextField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n inputType = \"text\",\n readOnly,\n prefix,\n suffix,\n maxLength,\n className,\n}: TextFieldProps) {\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const prefixClass = prefix ? \"rounded-l-none\" : \"\";\n const suffixClass = suffix ? \"rounded-r-none\" : \"\";\n const inputClassName =\n `${baseInputClasses} ${disabledClasses} ${prefixClass} ${suffixClass} ${className ?? \"\"}`.trim();\n\n const inputEl = (\n <input\n type={inputType}\n className={inputClassName}\n style={{ borderColor: undefined }}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n readOnly={readOnly}\n maxLength={maxLength}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n\n if (prefix || suffix) {\n return (\n <div className=\"flex items-stretch\">\n {prefix && (\n <span className=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {prefix}\n </span>\n )}\n {inputEl}\n {suffix && (\n <span className=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {suffix}\n </span>\n )}\n </div>\n );\n }\n\n return inputEl;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – NumberField (matches Vue NumberInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface NumberFieldProps {\n value: number | null;\n onChange: (value: number | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n readOnly?: boolean;\n prefix?: string;\n suffix?: string;\n className?: string;\n}\n\nconst baseInputClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-number-input\";\n\nexport function NumberField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n min,\n max,\n step = 1,\n precision,\n readOnly,\n prefix,\n suffix,\n className,\n}: NumberFieldProps) {\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const prefixClass = prefix ? \"rounded-l-none\" : \"\";\n const suffixClass = suffix ? \"rounded-r-none\" : \"\";\n const inputClassName =\n `${baseInputClasses} ${disabledClasses} ${prefixClass} ${suffixClass} ${className ?? \"\"}`.trim();\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const raw = e.target.value;\n if (raw === \"\") {\n onChange(null);\n return;\n }\n let num = Number.parseFloat(raw);\n if (Number.isNaN(num)) return;\n if (precision !== undefined) {\n num = Number.parseFloat(num.toFixed(precision));\n }\n onChange(num);\n }\n\n const inputEl = (\n <input\n type=\"number\"\n className={inputClassName}\n value={value ?? \"\"}\n onChange={handleChange}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n min={min}\n max={max}\n step={step}\n readOnly={readOnly}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n\n if (prefix || suffix) {\n return (\n <div className=\"flex items-stretch\">\n {prefix && (\n <span className=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {prefix}\n </span>\n )}\n {inputEl}\n {suffix && (\n <span className=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {suffix}\n </span>\n )}\n </div>\n );\n }\n\n return inputEl;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – TextareaField (matches Vue TextareaInput styling)\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface TextareaFieldProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n rows?: number;\n readOnly?: boolean;\n autoResize?: boolean;\n maxLength?: number;\n className?: string;\n}\n\nconst baseClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 resize-y focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-textarea-input\";\n\nexport function TextareaField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n rows = 3,\n readOnly,\n autoResize,\n maxLength,\n className,\n}: TextareaFieldProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n if (!autoResize || !textareaRef.current) return;\n const el = textareaRef.current;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }, [autoResize]);\n\n useEffect(() => {\n adjustHeight();\n }, [value, adjustHeight]);\n\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const autoResizeClasses = autoResize ? \"resize-none overflow-hidden\" : \"\";\n const textareaClassName =\n `${baseClasses} ${disabledClasses} ${autoResizeClasses} ${className ?? \"\"}`.trim();\n\n return (\n <textarea\n ref={textareaRef}\n className={textareaClassName}\n value={value ?? \"\"}\n onChange={(e) => {\n onChange(e.target.value);\n }}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n rows={rows}\n readOnly={readOnly}\n maxLength={maxLength}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SelectField (custom dropdown matching Vue SelectInput)\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface SelectOption {\n label: string;\n value: string | number | boolean;\n disabled?: boolean;\n}\n\nexport interface SelectFieldProps {\n value: unknown;\n onChange: (value: unknown) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n options: SelectOption[];\n multiple?: boolean;\n searchable?: boolean;\n clearable?: boolean;\n className?: string;\n}\n\nexport function SelectField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder = \"Select...\",\n options,\n multiple = false,\n searchable = false,\n clearable = false,\n className,\n}: SelectFieldProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const selectedValues: Array<string | number | boolean> = (() => {\n if (value === null || value === undefined) return [];\n if (Array.isArray(value)) return value;\n return [value as string | number | boolean];\n })();\n\n const displayLabel = (() => {\n if (selectedValues.length === 0) return \"\";\n if (multiple) return \"\";\n const opt = options.find((o) => o.value === selectedValues[0]);\n return opt?.label ?? String(selectedValues[0]);\n })();\n\n const filteredOptions = search\n ? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\n : options;\n\n function isSelected(v: string | number | boolean): boolean {\n return selectedValues.includes(v);\n }\n\n function tagLabel(v: string | number | boolean): string {\n const opt = options.find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n\n const open = useCallback(() => {\n setIsOpen(true);\n setHighlightedIndex(-1);\n setSearch(\"\");\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch(\"\");\n onBlur?.();\n }, [onBlur]);\n\n function toggle() {\n if (disabled) return;\n if (isOpen) {\n close();\n } else {\n open();\n }\n }\n\n function selectOption(option: SelectOption) {\n if (option.disabled) return;\n if (multiple) {\n const arr = [...selectedValues];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(option.value);\n onChange(arr);\n } else {\n onChange(option.value);\n close();\n }\n }\n\n function removeTag(v: string | number | boolean) {\n if (disabled) return;\n const arr = selectedValues.filter((sv) => sv !== v);\n onChange(arr.length ? arr : multiple ? [] : null);\n }\n\n function clearSelection(e: React.MouseEvent) {\n e.stopPropagation();\n onChange(multiple ? [] : null);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (!isOpen) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n open();\n }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setHighlightedIndex((prev) => Math.min(prev + 1, filteredOptions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n selectOption(filteredOptions[highlightedIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n close();\n break;\n }\n }\n\n // Close on outside click\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n close();\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [close]);\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className ?? \"\"}`}\n >\n {/* Trigger */}\n <div\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n tabIndex={0}\n className={`flex min-h-[38px] w-full cursor-pointer items-center rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm transition-colors duration-200 ${isOpen ? \"ring-2 ring-blue-500/20\" : \"\"} ${disabled ? \"pointer-events-none bg-gray-100\" : \"\"}`}\n style={isOpen ? { borderColor: \"var(--fc-color-primary, #3b82f6)\" } : {}}\n onClick={toggle}\n onKeyDown={onKeydown}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-1\">\n {/* Multiple tags */}\n {multiple &&\n selectedValues.map((val) => (\n <span\n key={String(val)}\n className=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n style={{\n backgroundColor:\n \"color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)\",\n color: \"var(--fc-color-primary, #3b82f6)\",\n }}\n >\n {tagLabel(val)}\n <button\n type=\"button\"\n className=\"ml-0.5\"\n style={{ color: \"var(--fc-color-primary, #3b82f6)\" }}\n aria-label=\"Remove\"\n onClick={(e) => {\n e.stopPropagation();\n removeTag(val);\n }}\n >\n &times;\n </button>\n </span>\n ))}\n {/* Single display */}\n {!multiple && displayLabel && <span className=\"truncate\">{displayLabel}</span>}\n {/* Placeholder */}\n {selectedValues.length === 0 && !multiple && (\n <span className=\"text-gray-400\">{placeholder}</span>\n )}\n {multiple && selectedValues.length === 0 && (\n <span className=\"text-gray-400\">{placeholder}</span>\n )}\n </div>\n {/* Clear button */}\n {clearable && selectedValues.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"ml-1 shrink-0 text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n aria-label=\"Clear selection\"\n onClick={clearSelection}\n >\n &times;\n </button>\n )}\n {/* Chevron */}\n <svg\n className={`ml-1 h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200 ${isOpen ? \"rotate-180\" : \"\"}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white shadow-lg\">\n {/* Search */}\n {searchable && (\n <div className=\"border-b border-gray-200 p-2\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"w-full rounded border border-gray-300 px-2 py-1 text-sm focus:outline-none fc-select-search\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={onKeydown}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n }}\n />\n </div>\n )}\n {/* Options list */}\n <ul role=\"listbox\" className=\"max-h-60 overflow-auto py-1\">\n {filteredOptions.map((option, idx) => (\n <li\n key={String(option.value)}\n role=\"option\"\n aria-selected={isSelected(option.value)}\n className={`cursor-pointer px-3 py-2 text-sm transition-colors duration-200 ${\n !isSelected(option.value) ? \"text-gray-900\" : \"\"\n } ${highlightedIndex === idx ? \"bg-gray-100\" : \"\"} ${\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-gray-50\"\n }`}\n style={\n isSelected(option.value)\n ? {\n backgroundColor:\n \"color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)\",\n color: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={() => selectOption(option)}\n onMouseEnter={() => setHighlightedIndex(idx)}\n >\n {option.label}\n </li>\n ))}\n {filteredOptions.length === 0 && (\n <li className=\"px-3 py-2 text-sm text-gray-400\">No options found</li>\n )}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – CheckboxField (matches Vue CheckboxInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxFieldProps {\n value: boolean;\n onChange: (value: boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n label?: string;\n className?: string;\n}\n\nexport function CheckboxField({\n value,\n onChange,\n onBlur,\n disabled,\n label,\n className,\n}: CheckboxFieldProps) {\n function toggle() {\n if (disabled) return;\n onChange(!value);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggle();\n }\n }\n\n return (\n <label\n className={`inline-flex items-center gap-2 select-none ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"} ${className ?? \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={value ?? false}\n onChange={() => {}}\n onBlur={onBlur}\n disabled={disabled}\n className=\"sr-only\"\n />\n <div\n role=\"checkbox\"\n aria-checked={value}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200 ${\n value ? \"text-white\" : \"border-gray-300 bg-white\"\n }`}\n style={\n value\n ? {\n borderColor: \"var(--fc-color-primary, #3b82f6)\",\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={(e) => {\n e.preventDefault();\n toggle();\n }}\n onKeyDown={onKeydown}\n >\n {value && (\n <svg\n className=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n {label && <span className=\"text-sm text-gray-700\">{label}</span>}\n </label>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – RadioField (matches Vue RadioInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface RadioOption {\n label: string;\n value: string | number | boolean;\n disabled?: boolean;\n}\n\nexport interface RadioFieldProps {\n name: string;\n value: unknown;\n onChange: (value: string | number | boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n options: RadioOption[];\n inline?: boolean;\n className?: string;\n}\n\nexport function RadioField({\n name,\n value,\n onChange,\n onBlur,\n disabled,\n options,\n inline = false,\n className,\n}: RadioFieldProps) {\n function isSelected(v: string | number | boolean): boolean {\n return value === v;\n }\n\n function isOptionDisabled(option: RadioOption): boolean {\n return disabled === true || !!option.disabled;\n }\n\n function selectOption(option: RadioOption) {\n if (isOptionDisabled(option)) return;\n onChange(option.value);\n }\n\n function onKeydown(e: React.KeyboardEvent, option: RadioOption) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n selectOption(option);\n }\n }\n\n return (\n <div\n role=\"radiogroup\"\n className={`${inline ? \"flex flex-wrap gap-4\" : \"flex flex-col gap-2\"} ${className ?? \"\"}`}\n >\n {options.map((option) => (\n <label\n key={String(option.value)}\n className={`inline-flex items-center gap-2 select-none ${\n isOptionDisabled(option)\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\"\n }`}\n >\n <input\n type=\"radio\"\n checked={isSelected(option.value)}\n disabled={isOptionDisabled(option)}\n className=\"sr-only\"\n name={name}\n onChange={() => selectOption(option)}\n onBlur={onBlur}\n />\n <div\n role=\"radio\"\n aria-checked={isSelected(option.value)}\n aria-disabled={isOptionDisabled(option) || undefined}\n tabIndex={0}\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors duration-200 ${\n !isSelected(option.value) ? \"border-gray-300\" : \"\"\n }`}\n style={\n isSelected(option.value)\n ? { borderColor: \"var(--fc-color-primary, #3b82f6)\" }\n : {}\n }\n onClick={() => selectOption(option)}\n onKeyDown={(e) => onKeydown(e, option)}\n >\n {isSelected(option.value) && (\n <div\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n />\n )}\n </div>\n <span className=\"text-sm text-gray-700\">{option.label}</span>\n </label>\n ))}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SwitchField (matches Vue SwitchInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface SwitchFieldProps {\n value: boolean;\n onChange: (value: boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n activeLabel?: string;\n inactiveLabel?: string;\n className?: string;\n}\n\nexport function SwitchField({\n value,\n onChange,\n onBlur,\n disabled,\n activeLabel,\n inactiveLabel,\n className,\n}: SwitchFieldProps) {\n function toggle() {\n if (disabled) return;\n onChange(!value);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggle();\n }\n }\n\n return (\n <label\n className={`inline-flex items-center gap-2 select-none ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"} ${className ?? \"\"}`}\n >\n {inactiveLabel && <span className=\"text-sm text-gray-600\">{inactiveLabel}</span>}\n <input\n type=\"checkbox\"\n checked={value ?? false}\n onChange={toggle}\n onBlur={onBlur}\n disabled={disabled}\n className=\"sr-only\"\n />\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={value}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n className={`relative inline-flex h-6 w-11 shrink-0 rounded-full border-2 border-transparent transition-colors duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)] ${\n !value ? \"bg-gray-300\" : \"\"\n } ${disabled ? \"pointer-events-none\" : \"focus:outline-none focus:ring-2 focus:ring-blue-500/20\"}`}\n style={value ? { backgroundColor: \"var(--fc-color-primary, #3b82f6)\" } : {}}\n onClick={toggle}\n onKeyDown={onKeydown}\n >\n <span\n className={`pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)] ${\n value ? \"translate-x-5\" : \"translate-x-0\"\n }`}\n aria-hidden=\"true\"\n />\n </button>\n {activeLabel && <span className=\"text-sm text-gray-600\">{activeLabel}</span>}\n </label>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SliderField (matches Vue SliderInput styling)\n// ---------------------------------------------------------------------------\n\nimport { useState } from \"react\";\n\nexport interface SliderFieldProps {\n value: number | null;\n onChange: (value: number) => void;\n onBlur?: () => void;\n disabled?: boolean;\n min?: number;\n max?: number;\n step?: number;\n showTooltip?: boolean;\n className?: string;\n}\n\nexport function SliderField({\n value,\n onChange,\n onBlur,\n disabled,\n min = 0,\n max = 100,\n step = 1,\n showTooltip = true,\n className,\n}: SliderFieldProps) {\n const [isActive, setIsActive] = useState(false);\n\n const currentValue = value ?? min;\n const range = max - min;\n const percentage = range === 0 ? 0 : ((currentValue - min) / range) * 100;\n\n return (\n <div\n className={`relative w-full py-2 ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className ?? \"\"}`}\n >\n {/* Tooltip */}\n {showTooltip && isActive && (\n <div\n className=\"absolute -top-8 rounded bg-gray-800 px-2 py-1 text-xs text-white shadow-sm transition-opacity duration-200\"\n style={{ left: `calc(${percentage}% - 16px)` }}\n >\n {currentValue}\n </div>\n )}\n <input\n type=\"range\"\n value={currentValue}\n onChange={(e) => onChange(Number.parseFloat(e.target.value))}\n onMouseDown={() => setIsActive(true)}\n onMouseUp={() => setIsActive(false)}\n onTouchStart={() => setIsActive(true)}\n onTouchEnd={() => setIsActive(false)}\n onFocus={() => setIsActive(true)}\n onBlur={(e) => {\n setIsActive(false);\n onBlur?.();\n }}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n aria-valuenow={currentValue}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled || undefined}\n className=\"h-2 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500/20 disabled:pointer-events-none\"\n style={{ accentColor: \"var(--fc-color-primary, #3b82f6)\" }}\n />\n {/* Min/Max labels */}\n <div className=\"mt-1 flex justify-between text-xs text-gray-400\">\n <span>{min}</span>\n <span>{max}</span>\n </div>\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – FormBuilder component (matches Vue FormBuilder styling)\n// ---------------------------------------------------------------------------\n\nimport type { ComponentType, FormEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport type {\n DividerNode,\n FieldSchema,\n FormSchema,\n GroupNode,\n OptionItem,\n RowNode,\n SchemaNode,\n StepNodeItem,\n StepsNode,\n TabNodeItem,\n TabsNode,\n ThemeConfig,\n} from \"@formatica/core\";\nimport { isFieldNode } from \"@formatica/core\";\nimport { useForm } from \"../hooks/useForm\";\nimport type { FormInstance } from \"../hooks/useForm\";\nimport { FormContext } from \"../hooks/useFormContext\";\nimport { BaseField } from \"./BaseField\";\nimport { TextField } from \"./fields/TextField\";\nimport { NumberField } from \"./fields/NumberField\";\nimport { TextareaField } from \"./fields/TextareaField\";\nimport { SelectField } from \"./fields/SelectField\";\nimport { CheckboxField } from \"./fields/CheckboxField\";\nimport { RadioField } from \"./fields/RadioField\";\nimport { SwitchField } from \"./fields/SwitchField\";\nimport { SliderField } from \"./fields/SliderField\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FieldComponentProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n onBlur: () => void;\n errors: string[];\n disabled: boolean;\n}\n\nexport interface FormBuilderProps {\n schema: FormSchema;\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>;\n onError?: (errors: Record<string, string[]>) => void;\n locale?: string;\n fallbackLocale?: string;\n theme?: ThemeConfig;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Theme helpers\n// ---------------------------------------------------------------------------\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\nfunction buildCssVars(theme?: ThemeConfig): React.CSSProperties {\n if (!theme) return {};\n const vars: Record<string, string> = {};\n\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value) vars[`--fc-color-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.typography) {\n for (const [key, value] of Object.entries(theme.typography)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.borders) {\n for (const [key, value] of Object.entries(theme.borders)) {\n if (value) vars[`--fc-border-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n if (value) vars[`--fc-shadow-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.transitions) {\n for (const [key, value] of Object.entries(theme.transitions)) {\n if (value) vars[`--fc-transition-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.cssVars) {\n Object.assign(vars, theme.cssVars);\n }\n\n return vars as React.CSSProperties;\n}\n\n// ---------------------------------------------------------------------------\n// Translation helpers\n// ---------------------------------------------------------------------------\n\nfunction getTranslation(\n schema: FormSchema,\n key: string,\n locale: string,\n fallbackLocale: string,\n fallback: string,\n): string {\n const translations = schema.translations;\n if (!translations) return fallback;\n const loc = translations[locale];\n if (loc?.messages?.[key]) return loc.messages[key];\n const fb = translations[fallbackLocale];\n return fb?.messages?.[key] ?? fallback;\n}\n\nfunction getActionLabel(\n schema: FormSchema,\n key: \"submit\" | \"reset\",\n locale: string,\n fallbackLocale: string,\n fallback: string,\n): string {\n const translations = schema.translations;\n if (!translations) return fallback;\n const loc = translations[locale];\n if (loc?.[key]) return loc[key];\n const fb = translations[fallbackLocale];\n return fb?.[key] ?? fallback;\n}\n\n// ---------------------------------------------------------------------------\n// Default field registry\n// ---------------------------------------------------------------------------\n\nfunction resolveOptions(\n options:\n | OptionItem[]\n | ((...args: unknown[]) => OptionItem[] | Promise<OptionItem[]>)\n | undefined,\n): OptionItem[] {\n if (Array.isArray(options)) return options;\n return [];\n}\n\nfunction DefaultFieldRenderer({ field, value, onChange, onBlur, disabled }: FieldComponentProps) {\n switch (field.type) {\n case \"text\":\n return (\n <TextField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n inputType={field.inputType}\n readOnly={field.readOnly}\n />\n );\n case \"number\":\n return (\n <NumberField\n value={value as number | null}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n min={field.min}\n max={field.max}\n step={field.step}\n readOnly={field.readOnly}\n />\n );\n case \"textarea\":\n return (\n <TextareaField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={field.rows}\n readOnly={field.readOnly}\n />\n );\n case \"select\":\n return (\n <SelectField\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n options={resolveOptions(field.options)}\n />\n );\n case \"checkbox\":\n return (\n <CheckboxField\n value={Boolean(value)}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n />\n );\n case \"radio\":\n return (\n <RadioField\n name={field.name}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n options={resolveOptions(field.options)}\n />\n );\n case \"switch\":\n return (\n <SwitchField\n value={Boolean(value)}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n />\n );\n case \"slider\":\n return (\n <SliderField\n value={value as number | null}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n min={field.min}\n max={field.max}\n step={field.step}\n />\n );\n default:\n return (\n <TextField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n />\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node renderers\n// ---------------------------------------------------------------------------\n\nfunction getSpanStyle(span: number | string | undefined): React.CSSProperties {\n if (span === \"full\") return { gridColumn: \"1 / -1\" };\n if (span === \"auto\") return { gridColumn: \"auto\" };\n if (typeof span === \"number\") return { gridColumn: `span ${span} / span ${span}` };\n return { gridColumn: \"span 12 / span 12\" };\n}\n\nfunction renderField(\n field: FieldSchema,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n const fieldErrors = form.errors[field.name] ?? [];\n const disabled = field.disabled === true || false;\n\n const props: FieldComponentProps = {\n field,\n value: form.values[field.name],\n onChange: (v: unknown) => form.setFieldValue(field.name, v),\n onBlur: () => form.validateField(field.name),\n errors: fieldErrors,\n disabled,\n };\n\n const CustomComponent = components?.[field.type];\n const FieldComponent = CustomComponent ?? DefaultFieldRenderer;\n\n return (\n <BaseField\n key={field.name}\n label={field.label}\n required={field.required}\n errors={fieldErrors}\n touched={form.touched[field.name]}\n helpText={field.helpText}\n tooltip={field.tooltip}\n disabled={field.disabled}\n readOnly={field.readOnly}\n fieldName={field.name}\n className={field.className}\n style={field.style as React.CSSProperties}\n >\n <FieldComponent {...props} />\n </BaseField>\n );\n}\n\nfunction renderRow(\n node: RowNode,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n const alignMap: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n };\n const alignClass = alignMap[node.align ?? \"stretch\"] ?? \"items-stretch\";\n const gapStyle =\n node.gap !== undefined\n ? typeof node.gap === \"number\"\n ? `${node.gap}px`\n : node.gap\n : \"1rem\";\n\n return (\n <div\n className={`grid grid-cols-12 ${alignClass} ${node.className ?? \"\"}`}\n style={{ gap: gapStyle }}\n role=\"group\"\n >\n {node.children.map((child, i) => (\n <div\n key={isFieldNode(child) ? child.name : `row-child-${i}`}\n style={getSpanStyle(isFieldNode(child) ? child.span : undefined)}\n >\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction RenderGroup({\n node,\n form,\n components,\n}: {\n node: GroupNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [isCollapsed, setIsCollapsed] = useState(node.collapsed ?? false);\n const headerId = node.title\n ? `fc-group-${node.title.toLowerCase().replace(/\\s+/g, \"-\")}`\n : undefined;\n\n function toggle() {\n if (node.collapsible) setIsCollapsed(!isCollapsed);\n }\n\n const HeaderTag = node.collapsible ? \"button\" : \"div\";\n\n return (\n <fieldset\n className={`rounded-lg border border-gray-200 bg-white ${node.className ?? \"\"}`}\n aria-labelledby={headerId}\n >\n {/* Header */}\n {(node.title || node.description) && (\n <div className=\"border-b border-gray-100 px-4 py-3\">\n <HeaderTag\n type={node.collapsible ? \"button\" : undefined}\n className={`flex w-full items-center justify-between text-left ${node.collapsible ? \"cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-500/40 rounded\" : \"\"}`}\n aria-expanded={node.collapsible ? !isCollapsed : undefined}\n aria-controls={node.collapsible ? `fc-group-body-${headerId}` : undefined}\n onClick={toggle}\n >\n <div>\n {node.title && (\n <legend\n id={headerId}\n className=\"text-sm font-semibold text-gray-800\"\n >\n {node.title}\n </legend>\n )}\n {node.description && (\n <p className=\"mt-0.5 text-xs text-gray-500\">{node.description}</p>\n )}\n </div>\n {node.collapsible && (\n <svg\n className={`h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </HeaderTag>\n </div>\n )}\n\n {/* Body */}\n {!isCollapsed && (\n <div\n id={node.collapsible ? `fc-group-body-${headerId}` : undefined}\n className=\"p-4\"\n >\n {node.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `group-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n </fieldset>\n );\n}\n\nfunction RenderSteps({\n node,\n form,\n components,\n}: {\n node: StepsNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [currentStep, setCurrentStep] = useState(0);\n const [completedSteps, setCompletedSteps] = useState<Set<number>>(new Set());\n\n const steps = node.steps;\n const totalSteps = steps.length;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === totalSteps - 1;\n\n function goNext() {\n if (isLastStep) return;\n setCompletedSteps((prev) => {\n const next = new Set(prev);\n next.add(currentStep);\n return next;\n });\n setCurrentStep((prev) => prev + 1);\n }\n\n function goPrevious() {\n if (isFirstStep) return;\n setCurrentStep((prev) => prev - 1);\n }\n\n function goToStep(index: number) {\n if (node.linear && index > currentStep) return;\n setCurrentStep(index);\n }\n\n const currentStepData: StepNodeItem | undefined = steps[currentStep];\n\n return (\n <div className={`space-y-6 ${node.className ?? \"\"}`}>\n {/* Progress indicator */}\n <nav aria-label=\"Form steps\" className=\"flex items-center justify-center\">\n <ol className=\"flex items-center gap-0\">\n {steps.map((step, idx) => (\n <li key={step.title} className=\"flex items-center\">\n {/* Step circle */}\n <button\n type=\"button\"\n disabled={node.linear === true && idx > currentStep}\n aria-current={idx === currentStep ? \"step\" : undefined}\n aria-label={`Step ${idx + 1}: ${step.title}`}\n className={`relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40 ${\n completedSteps.has(idx) && idx !== currentStep\n ? \"border-green-500 bg-green-500 text-white\"\n : idx !== currentStep\n ? \"border-gray-300 bg-white text-gray-500\"\n : \"text-white\"\n } ${node.linear === true && idx > currentStep ? \"cursor-not-allowed\" : \"cursor-pointer hover:shadow-md\"}`}\n style={\n idx === currentStep\n ? {\n borderColor: \"var(--fc-color-primary, #3b82f6)\",\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={() => goToStep(idx)}\n >\n {completedSteps.has(idx) && idx !== currentStep ? (\n <svg\n className=\"h-4 w-4 transition-transform duration-200\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <span>{idx + 1}</span>\n )}\n </button>\n\n {/* Connector line */}\n {idx < steps.length - 1 && (\n <div\n className={`mx-1 h-0.5 w-8 transition-colors duration-300 sm:w-12 ${completedSteps.has(idx) ? \"bg-green-500\" : \"bg-gray-200\"}`}\n />\n )}\n </li>\n ))}\n </ol>\n </nav>\n\n {/* Step title */}\n {currentStepData && (\n <div className=\"text-center\">\n <h3 className=\"text-base font-semibold text-gray-800\">\n {currentStepData.title}\n </h3>\n {currentStepData.description && (\n <p className=\"mt-1 text-sm text-gray-500\">{currentStepData.description}</p>\n )}\n </div>\n )}\n\n {/* Step content */}\n {currentStepData && (\n <div>\n {currentStepData.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `step-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n\n {/* Navigation buttons */}\n <div className=\"flex items-center justify-between border-t border-gray-100 pt-4\">\n <button\n type=\"button\"\n disabled={isFirstStep}\n className=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={goPrevious}\n >\n Previous\n </button>\n <span className=\"text-xs text-gray-400\">\n {currentStep + 1} / {totalSteps}\n </span>\n {!isLastStep ? (\n <button\n type=\"button\"\n className=\"rounded-md px-4 py-2 text-sm font-medium text-white transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n onClick={goNext}\n >\n Next\n </button>\n ) : (\n <div className=\"w-[72px]\" />\n )}\n </div>\n </div>\n );\n}\n\nfunction RenderTabs({\n node,\n form,\n components,\n}: {\n node: TabsNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [activeIndex, setActiveIndex] = useState(0);\n\n const tabs = node.tabs;\n const activeTab: TabNodeItem | undefined = tabs[activeIndex];\n const tabPanelId = `fc-tabpanel-${activeIndex}`;\n\n function selectTab(index: number) {\n setActiveIndex(index);\n }\n\n return (\n <div className={node.className ?? \"\"}>\n {/* Tab bar */}\n <div\n className=\"relative flex border-b border-gray-200\"\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {tabs.map((tab, idx) => (\n <button\n key={tab.title}\n id={`fc-tab-${idx}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={idx === activeIndex}\n aria-controls={tabPanelId}\n tabIndex={idx === activeIndex ? 0 : -1}\n className={`relative px-4 py-2.5 text-sm font-medium transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500/40 ${\n idx !== activeIndex ? \"text-gray-500 hover:text-gray-700\" : \"\"\n }`}\n style={\n idx === activeIndex ? { color: \"var(--fc-color-primary, #3b82f6)\" } : {}\n }\n onClick={() => selectTab(idx)}\n >\n {tab.title}\n {/* Active underline indicator */}\n {idx === activeIndex && (\n <span\n className=\"absolute inset-x-0 -bottom-px h-0.5 transition-all duration-200\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n />\n )}\n </button>\n ))}\n </div>\n\n {/* Tab panel */}\n {activeTab && (\n <div\n id={tabPanelId}\n role=\"tabpanel\"\n aria-labelledby={`fc-tab-${activeIndex}`}\n tabIndex={0}\n className=\"pt-4\"\n >\n {activeTab.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `tab-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction renderDivider(node: DividerNode): ReactNode {\n if (node.label) {\n return (\n <div className={`relative my-4 ${node.className ?? \"\"}`}>\n <div className=\"absolute inset-0 flex items-center\" aria-hidden=\"true\">\n <div className=\"w-full border-t border-gray-200\" />\n </div>\n <div className=\"relative flex justify-center\">\n <span className=\"bg-white px-3 text-sm text-gray-500\">{node.label}</span>\n </div>\n </div>\n );\n }\n return <hr className={`my-4 border-gray-200 ${node.className ?? \"\"}`} />;\n}\n\nfunction renderNode(\n node: SchemaNode,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n if (isFieldNode(node)) {\n return renderField(node, form, components);\n }\n\n switch (node.type) {\n case \"row\":\n return renderRow(node, form, components);\n case \"group\":\n return <RenderGroup node={node} form={form} components={components} />;\n case \"steps\":\n return <RenderSteps node={node} form={form} components={components} />;\n case \"tabs\":\n return <RenderTabs node={node} form={form} components={components} />;\n case \"divider\":\n return renderDivider(node);\n case \"html\":\n return (\n <div\n className={node.className ?? \"\"}\n dangerouslySetInnerHTML={{ __html: node.content }}\n />\n );\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// FormBuilder\n// ---------------------------------------------------------------------------\n\nexport function FormBuilder({\n schema,\n onSubmit,\n onError,\n locale = \"en\",\n fallbackLocale = \"en\",\n theme,\n components,\n className,\n}: FormBuilderProps) {\n const form = useForm(schema, { locale });\n const cssVars = buildCssVars(theme);\n\n const formTitle = getTranslation(schema, \"title\", locale, fallbackLocale, \"\");\n const formDescription = getTranslation(schema, \"description\", locale, fallbackLocale, \"\");\n const submitLabel = getActionLabel(schema, \"submit\", locale, fallbackLocale, \"Submit\");\n const resetLabel = getActionLabel(schema, \"reset\", locale, fallbackLocale, \"Reset\");\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (onSubmit) {\n await form.submit(async (values) => {\n await onSubmit(values);\n });\n } else {\n await form.validate();\n }\n if (!form.isValid && onError) {\n onError(form.errors);\n }\n };\n\n const handleReset = (e: FormEvent) => {\n e.preventDefault();\n form.reset();\n };\n\n return (\n <FormContext.Provider value={form}>\n <form\n className={`fc-form-builder ${theme?.components?.form ?? \"\"} ${className ?? \"\"}`.trim()}\n style={cssVars}\n onSubmit={handleSubmit}\n onReset={handleReset}\n noValidate\n >\n {/* Form title / description */}\n {(formTitle || formDescription) && (\n <div className=\"mb-6\">\n {formTitle && (\n <h2 className=\"text-lg font-semibold text-gray-900\">{formTitle}</h2>\n )}\n {formDescription && (\n <p className=\"mt-1 text-sm text-gray-500\">{formDescription}</p>\n )}\n </div>\n )}\n\n {/* Layout */}\n {schema.fields.map((node, i) => (\n <div\n key={isFieldNode(node) ? node.name : `node-${i}`}\n style={isFieldNode(node) ? getSpanStyle(node.span) : undefined}\n >\n {renderNode(node, form, components)}\n </div>\n ))}\n\n {/* Actions */}\n <div className=\"mt-6 flex items-center gap-3\">\n <button\n type=\"submit\"\n disabled={form.isSubmitting}\n className={`fc-submit-btn rounded-md px-4 py-2 text-sm font-medium text-white transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 ${theme?.components?.button ?? \"\"}`}\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n >\n {form.isSubmitting && (\n <span\n className=\"mr-2 inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white border-t-transparent\"\n aria-hidden=\"true\"\n />\n )}\n {submitLabel}\n </button>\n <button\n type=\"reset\"\n disabled={form.isSubmitting}\n className=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {resetLabel}\n </button>\n </div>\n </form>\n </FormContext.Provider>\n );\n}\n"],"names":["getTypeDefault","field","buildDefaults","fields","values","parseRules","rules","parseRuleString","v","name","paramValue","rule","paramParts","paramStr","params","n","useForm","schema","_options","extractFields","initialValuesRef","useRef","fieldsRef","setValues","useState","errors","setErrors","touched","setTouched","dirty","setDirty","isSubmitting","setIsSubmitting","submitCount","setSubmitCount","valuesRef","errorsRef","isValid","e","isDirty","setFieldValue","useCallback","value","prev","getFieldValue","validateSingleField","currentValues","f","evaluateCondition","r","fieldErrors","ctx","ruleFn","getRule","result","validateField","validate","allErrors","allValid","submit","handler","allTouched","reset","clear","cleared","setError","message","msgs","clearError","next","clearErrors","FormContext","createContext","useFormContext","useContext","BaseField","label","required","helpText","tooltip","disabled","readOnly","fieldName","children","className","style","showTooltip","setShowTooltip","hasErrors","fieldId","errorId","jsxs","jsx","error","idx","baseInputClasses","TextField","onChange","onBlur","placeholder","inputType","prefix","suffix","maxLength","inputClassName","inputEl","NumberField","min","max","step","precision","handleChange","raw","num","baseClasses","TextareaField","rows","autoResize","textareaRef","adjustHeight","el","useEffect","textareaClassName","SelectField","options","multiple","searchable","clearable","isOpen","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","containerRef","searchInputRef","selectedValues","displayLabel","opt","o","filteredOptions","isSelected","tagLabel","open","_a","close","toggle","selectOption","option","arr","removeTag","sv","clearSelection","onKeydown","handleClickOutside","event","val","CheckboxField","RadioField","inline","isOptionDisabled","SwitchField","activeLabel","inactiveLabel","SliderField","isActive","setIsActive","currentValue","range","percentage","camelToKebab","str","m","buildCssVars","theme","vars","key","getTranslation","locale","fallbackLocale","fallback","translations","loc","fb","_b","getActionLabel","resolveOptions","DefaultFieldRenderer","getSpanStyle","span","renderField","form","components","props","FieldComponent","renderRow","node","alignClass","gapStyle","child","i","isFieldNode","renderNode","RenderGroup","isCollapsed","setIsCollapsed","headerId","HeaderTag","RenderSteps","currentStep","setCurrentStep","completedSteps","setCompletedSteps","steps","totalSteps","isFirstStep","isLastStep","goNext","goPrevious","goToStep","index","currentStepData","RenderTabs","activeIndex","setActiveIndex","tabs","activeTab","tabPanelId","selectTab","tab","renderDivider","FormBuilder","onSubmit","onError","cssVars","formTitle","formDescription","submitLabel","resetLabel","handleSubmit","handleReset"],"mappings":"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"}
1
+ {"version":3,"file":"formatica-react.umd.cjs","sources":["../src/hooks/useForm.ts","../src/hooks/useFormContext.ts","../src/components/FormaticaProvider.tsx","../src/components/BaseField.tsx","../src/components/fields/TextField.tsx","../src/components/fields/NumberField.tsx","../src/components/fields/TextareaField.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/RadioField.tsx","../src/components/fields/SwitchField.tsx","../src/components/fields/SliderField.tsx","../src/components/FormBuilder.tsx"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Formatica React – useForm hook\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { FieldSchema, FormSchema } from \"@formatica/core\";\nimport { evaluateCondition, extractFields, getRule } from \"@formatica/core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FormInstance {\n values: Record<string, unknown>;\n errors: Record<string, string[]>;\n touched: Record<string, boolean>;\n dirty: Record<string, boolean>;\n isValid: boolean;\n isDirty: boolean;\n isSubmitting: boolean;\n submitCount: number;\n setFieldValue: (name: string, value: unknown) => void;\n validate: () => Promise<boolean>;\n validateField: (name: string) => Promise<boolean>;\n submit: (handler: (values: Record<string, unknown>) => void | Promise<void>) => Promise<void>;\n reset: () => void;\n clear: () => void;\n setError: (field: string, message: string | string[]) => void;\n clearError: (field: string) => void;\n clearErrors: () => void;\n getFieldValue: (name: string) => unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTypeDefault(field: FieldSchema): unknown {\n switch (field.type) {\n case \"tags\":\n case \"checkbox-group\":\n return [];\n case \"checkbox\":\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n case \"file\":\n return null;\n default:\n return \"\";\n }\n}\n\nfunction buildDefaults(fields: FieldSchema[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n values[field.name] = field.defaultValue ?? getTypeDefault(field);\n }\n return values;\n}\n\ninterface ParsedRule {\n name: string;\n params: Record<string, unknown>;\n}\n\nfunction parseRules(rules: string | string[] | Record<string, unknown> | undefined): ParsedRule[] {\n if (!rules) return [];\n\n if (typeof rules === \"string\") {\n return rules.split(\"|\").map(parseRuleString);\n }\n if (Array.isArray(rules)) {\n return rules.map(parseRuleString);\n }\n // Record form: { required: true, minLength: 3, ... }\n return Object.entries(rules)\n .filter(([, v]) => v !== false && v !== undefined)\n .map(([name, paramValue]) => ({\n name,\n params:\n typeof paramValue === \"object\" && paramValue !== null\n ? (paramValue as Record<string, unknown>)\n : { [name]: paramValue },\n }));\n}\n\nfunction parseRuleString(rule: string): ParsedRule {\n const [name = \"\", ...paramParts] = rule.split(\":\");\n const paramStr = paramParts.join(\":\");\n const params: Record<string, unknown> = {};\n if (paramStr) {\n // \"min:3\" → { min: 3 }, \"between:1,10\" → { min: 1, max: 10 }\n const values = paramStr.split(\",\");\n if (name === \"between\" && values.length === 2) {\n params.min = Number(values[0]);\n params.max = Number(values[1]);\n } else if (name === \"pattern\") {\n params.pattern = paramStr;\n } else {\n params[name!] = values.length === 1 ? values[0] : values;\n // Also set as numeric if parseable\n if (values.length === 1) {\n const n = Number(values[0]);\n if (!Number.isNaN(n)) {\n params[name!] = n;\n // Common alias: minLength:3 → params.min = 3\n if (name === \"minLength\") params.min = n;\n if (name === \"maxLength\") params.max = n;\n }\n }\n }\n }\n return { name: name!, params };\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseFormOptions {\n locale?: string;\n}\n\nexport function useForm(schema: FormSchema, _options?: UseFormOptions): FormInstance {\n const fields = extractFields(schema.fields);\n const initialValuesRef = useRef(buildDefaults(fields));\n const fieldsRef = useRef(fields);\n\n const [values, setValues] = useState<Record<string, unknown>>(() => ({\n ...initialValuesRef.current,\n }));\n const [errors, setErrors] = useState<Record<string, string[]>>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [dirty, setDirty] = useState<Record<string, boolean>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitCount, setSubmitCount] = useState(0);\n\n // Keep latest values in a ref for async validation\n const valuesRef = useRef(values);\n valuesRef.current = values;\n const errorsRef = useRef(errors);\n errorsRef.current = errors;\n\n const isValid = Object.values(errors).every((e) => e.length === 0);\n const isDirty = Object.values(dirty).some(Boolean);\n\n // ---- Field value ----\n\n const setFieldValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n setDirty((prev) => ({ ...prev, [name]: true }));\n }, []);\n\n const getFieldValue = useCallback((name: string) => valuesRef.current[name], []);\n\n // ---- Validation ----\n\n const validateSingleField = useCallback(\n async (name: string, currentValues: Record<string, unknown>): Promise<string[]> => {\n const field = fieldsRef.current.find((f) => f.name === name);\n if (!field) return [];\n\n // Check condition — if field is hidden, skip validation\n if (field.condition) {\n const visible = evaluateCondition(field.condition, currentValues);\n if (!visible) return [];\n }\n\n const rules = parseRules(field.rules);\n // If field is marked required, ensure required rule is included\n if (field.required && !rules.some((r) => r.name === \"required\")) {\n rules.unshift({ name: \"required\", params: {} });\n }\n\n const fieldErrors: string[] = [];\n const ctx = {\n values: currentValues,\n getFieldValue: (n: string) => currentValues[n],\n };\n\n for (const rule of rules) {\n const ruleFn = getRule(rule.name);\n if (!ruleFn) continue;\n\n const result = await ruleFn(currentValues[name], rule.params, ctx);\n if (typeof result === \"string\") {\n fieldErrors.push(result);\n }\n }\n\n return fieldErrors;\n },\n [],\n );\n\n const validateField = useCallback(\n async (name: string): Promise<boolean> => {\n const fieldErrors = await validateSingleField(name, valuesRef.current);\n setErrors((prev) => ({ ...prev, [name]: fieldErrors }));\n setTouched((prev) => ({ ...prev, [name]: true }));\n return fieldErrors.length === 0;\n },\n [validateSingleField],\n );\n\n const validate = useCallback(async (): Promise<boolean> => {\n const currentValues = valuesRef.current;\n const allErrors: Record<string, string[]> = {};\n let allValid = true;\n\n for (const field of fieldsRef.current) {\n const fieldErrors = await validateSingleField(field.name, currentValues);\n allErrors[field.name] = fieldErrors;\n if (fieldErrors.length > 0) allValid = false;\n }\n\n setErrors(allErrors);\n return allValid;\n }, [validateSingleField]);\n\n // ---- Submit ----\n\n const submit = useCallback(\n async (\n handler: (values: Record<string, unknown>) => void | Promise<void>,\n ): Promise<void> => {\n setIsSubmitting(true);\n setSubmitCount((prev) => prev + 1);\n\n // Mark all as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of fieldsRef.current) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n try {\n const valid = await validate();\n if (!valid) return;\n await handler({ ...valuesRef.current });\n } finally {\n setIsSubmitting(false);\n }\n },\n [validate],\n );\n\n // ---- Reset / Clear ----\n\n const reset = useCallback(() => {\n setValues({ ...initialValuesRef.current });\n setErrors({});\n setTouched({});\n setDirty({});\n }, []);\n\n const clear = useCallback(() => {\n const cleared: Record<string, unknown> = {};\n for (const field of fieldsRef.current) {\n cleared[field.name] = null;\n }\n setValues(cleared);\n setErrors({});\n }, []);\n\n // ---- Error management ----\n\n const setError = useCallback((field: string, message: string | string[]) => {\n const msgs = Array.isArray(message) ? message : [message];\n setErrors((prev) => ({ ...prev, [field]: msgs }));\n }, []);\n\n const clearError = useCallback((field: string) => {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n\n return {\n values,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n submitCount,\n setFieldValue,\n validate,\n validateField,\n submit,\n reset,\n clear,\n setError,\n clearError,\n clearErrors,\n getFieldValue,\n };\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – Form context\n// ---------------------------------------------------------------------------\n\nimport { createContext, useContext } from \"react\";\nimport type { FormInstance } from \"./useForm\";\n\nexport const FormContext = createContext<FormInstance | null>(null);\n\nexport function useFormContext(): FormInstance {\n const ctx = useContext(FormContext);\n if (!ctx) throw new Error(\"useFormContext must be used within a FormProvider\");\n return ctx;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – Global configuration provider\n// ---------------------------------------------------------------------------\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport type { ThemeConfig } from \"@formatica/core\";\nimport type { ComponentType } from \"react\";\nimport type { FieldComponentProps } from \"./FormBuilder\";\n\nexport interface FormaticaConfig {\n theme?: ThemeConfig;\n locale?: string;\n fallbackLocale?: string;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}\n\nconst FormaticaConfigContext = createContext<FormaticaConfig>({});\n\nexport function FormaticaProvider({\n config,\n children,\n}: {\n config: FormaticaConfig;\n children: ReactNode;\n}) {\n return (\n <FormaticaConfigContext.Provider value={config}>\n {children}\n </FormaticaConfigContext.Provider>\n );\n}\n\nexport function useFormaticaConfig(): FormaticaConfig {\n return useContext(FormaticaConfigContext);\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – BaseField wrapper (matches Vue BaseField styling)\n// ---------------------------------------------------------------------------\n\nimport { type ReactNode, useState } from \"react\";\n\nexport interface BaseFieldProps {\n label?: string;\n required?: boolean;\n errors?: string[];\n touched?: boolean;\n helpText?: string;\n tooltip?: string;\n disabled?: boolean;\n readOnly?: boolean;\n fieldName?: string;\n children: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function BaseField({\n label,\n required,\n errors,\n touched = true,\n helpText,\n tooltip,\n disabled,\n readOnly,\n fieldName,\n children,\n className,\n style,\n}: BaseFieldProps) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const hasErrors = touched && errors !== undefined && errors.length > 0;\n const fieldId = fieldName ? `fc-field-${fieldName}` : undefined;\n const errorId = fieldName ? `fc-error-${fieldName}` : undefined;\n\n return (\n <div\n className={`relative mb-4 ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${readOnly ? \"fc-readonly\" : \"\"} ${className ?? \"\"}`}\n style={style}\n >\n {/* Label row */}\n {label && (\n <div className=\"mb-1.5 flex items-center gap-1\">\n <label htmlFor={fieldId} className=\"block text-sm font-medium text-gray-700\">\n {label}\n {required && (\n <span className=\"text-red-500 ml-0.5\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n\n {/* Tooltip icon */}\n {tooltip && (\n <span\n className=\"relative inline-flex\"\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n onFocus={() => setShowTooltip(true)}\n onBlur={() => setShowTooltip(false)}\n >\n <button\n type=\"button\"\n className=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-gray-200 text-gray-500 text-xs hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n aria-label={`Info: ${tooltip}`}\n tabIndex={0}\n >\n i\n </button>\n {showTooltip && (\n <div\n role=\"tooltip\"\n className=\"absolute bottom-full left-1/2 z-10 mb-2 -translate-x-1/2 rounded-md bg-gray-900 px-3 py-1.5 text-xs text-white shadow-lg whitespace-nowrap\"\n >\n {tooltip}\n <div className=\"absolute left-1/2 top-full -translate-x-1/2 border-4 border-transparent border-t-gray-900\" />\n </div>\n )}\n </span>\n )}\n </div>\n )}\n\n {/* Input slot */}\n <div id={fieldId}>{children}</div>\n\n {/* Error messages */}\n {hasErrors && (\n <div>\n {errors.map((error, idx) => (\n <p\n key={`${error}-${idx}`}\n id={idx === 0 ? errorId : undefined}\n className=\"mt-1 text-xs text-red-500\"\n role=\"alert\"\n >\n {error}\n </p>\n ))}\n </div>\n )}\n\n {/* Help text */}\n {helpText && !hasErrors && <p className=\"mt-1 text-xs text-gray-400\">{helpText}</p>}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – TextField (matches Vue TextInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface TextFieldProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n inputType?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\";\n readOnly?: boolean;\n prefix?: string;\n suffix?: string;\n maxLength?: number;\n className?: string;\n}\n\nconst baseInputClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-text-input\";\n\nexport function TextField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n inputType = \"text\",\n readOnly,\n prefix,\n suffix,\n maxLength,\n className,\n}: TextFieldProps) {\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const prefixClass = prefix ? \"rounded-l-none\" : \"\";\n const suffixClass = suffix ? \"rounded-r-none\" : \"\";\n const inputClassName =\n `${baseInputClasses} ${disabledClasses} ${prefixClass} ${suffixClass} ${className ?? \"\"}`.trim();\n\n const inputEl = (\n <input\n type={inputType}\n className={inputClassName}\n style={{ borderColor: undefined }}\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n readOnly={readOnly}\n maxLength={maxLength}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n\n if (prefix || suffix) {\n return (\n <div className=\"flex items-stretch\">\n {prefix && (\n <span className=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {prefix}\n </span>\n )}\n {inputEl}\n {suffix && (\n <span className=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {suffix}\n </span>\n )}\n </div>\n );\n }\n\n return inputEl;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – NumberField (matches Vue NumberInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface NumberFieldProps {\n value: number | null;\n onChange: (value: number | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n readOnly?: boolean;\n prefix?: string;\n suffix?: string;\n className?: string;\n}\n\nconst baseInputClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-number-input\";\n\nexport function NumberField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n min,\n max,\n step = 1,\n precision,\n readOnly,\n prefix,\n suffix,\n className,\n}: NumberFieldProps) {\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const prefixClass = prefix ? \"rounded-l-none\" : \"\";\n const suffixClass = suffix ? \"rounded-r-none\" : \"\";\n const inputClassName =\n `${baseInputClasses} ${disabledClasses} ${prefixClass} ${suffixClass} ${className ?? \"\"}`.trim();\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const raw = e.target.value;\n if (raw === \"\") {\n onChange(null);\n return;\n }\n let num = Number.parseFloat(raw);\n if (Number.isNaN(num)) return;\n if (precision !== undefined) {\n num = Number.parseFloat(num.toFixed(precision));\n }\n onChange(num);\n }\n\n const inputEl = (\n <input\n type=\"number\"\n className={inputClassName}\n value={value ?? \"\"}\n onChange={handleChange}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n min={min}\n max={max}\n step={step}\n readOnly={readOnly}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n\n if (prefix || suffix) {\n return (\n <div className=\"flex items-stretch\">\n {prefix && (\n <span className=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {prefix}\n </span>\n )}\n {inputEl}\n {suffix && (\n <span className=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\">\n {suffix}\n </span>\n )}\n </div>\n );\n }\n\n return inputEl;\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – TextareaField (matches Vue TextareaInput styling)\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface TextareaFieldProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n rows?: number;\n readOnly?: boolean;\n autoResize?: boolean;\n maxLength?: number;\n className?: string;\n}\n\nconst baseClasses =\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm placeholder:text-gray-400 resize-y focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-colors duration-200 fc-textarea-input\";\n\nexport function TextareaField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder,\n rows = 3,\n readOnly,\n autoResize,\n maxLength,\n className,\n}: TextareaFieldProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n if (!autoResize || !textareaRef.current) return;\n const el = textareaRef.current;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }, [autoResize]);\n\n useEffect(() => {\n adjustHeight();\n }, [value, adjustHeight]);\n\n const disabledClasses = disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\";\n const autoResizeClasses = autoResize ? \"resize-none overflow-hidden\" : \"\";\n const textareaClassName =\n `${baseClasses} ${disabledClasses} ${autoResizeClasses} ${className ?? \"\"}`.trim();\n\n return (\n <textarea\n ref={textareaRef}\n className={textareaClassName}\n value={value ?? \"\"}\n onChange={(e) => {\n onChange(e.target.value);\n }}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n onBlur?.();\n }}\n disabled={disabled}\n placeholder={placeholder}\n rows={rows}\n readOnly={readOnly}\n maxLength={maxLength}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n />\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SelectField (custom dropdown matching Vue SelectInput)\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface SelectOption {\n label: string;\n value: string | number | boolean;\n disabled?: boolean;\n}\n\nexport interface SelectFieldProps {\n value: unknown;\n onChange: (value: unknown) => void;\n onBlur?: () => void;\n disabled?: boolean;\n placeholder?: string;\n options: SelectOption[];\n multiple?: boolean;\n searchable?: boolean;\n clearable?: boolean;\n className?: string;\n}\n\nexport function SelectField({\n value,\n onChange,\n onBlur,\n disabled,\n placeholder = \"Select...\",\n options,\n multiple = false,\n searchable = false,\n clearable = false,\n className,\n}: SelectFieldProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const selectedValues: Array<string | number | boolean> = (() => {\n if (value === null || value === undefined) return [];\n if (Array.isArray(value)) return value;\n return [value as string | number | boolean];\n })();\n\n const displayLabel = (() => {\n if (selectedValues.length === 0) return \"\";\n if (multiple) return \"\";\n const opt = options.find((o) => o.value === selectedValues[0]);\n return opt?.label ?? String(selectedValues[0]);\n })();\n\n const filteredOptions = search\n ? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\n : options;\n\n function isSelected(v: string | number | boolean): boolean {\n return selectedValues.includes(v);\n }\n\n function tagLabel(v: string | number | boolean): string {\n const opt = options.find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n\n const open = useCallback(() => {\n setIsOpen(true);\n setHighlightedIndex(-1);\n setSearch(\"\");\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setSearch(\"\");\n onBlur?.();\n }, [onBlur]);\n\n function toggle() {\n if (disabled) return;\n if (isOpen) {\n close();\n } else {\n open();\n }\n }\n\n function selectOption(option: SelectOption) {\n if (option.disabled) return;\n if (multiple) {\n const arr = [...selectedValues];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(option.value);\n onChange(arr);\n } else {\n onChange(option.value);\n close();\n }\n }\n\n function removeTag(v: string | number | boolean) {\n if (disabled) return;\n const arr = selectedValues.filter((sv) => sv !== v);\n onChange(arr.length ? arr : multiple ? [] : null);\n }\n\n function clearSelection(e: React.MouseEvent) {\n e.stopPropagation();\n onChange(multiple ? [] : null);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (!isOpen) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n open();\n }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setHighlightedIndex((prev) => Math.min(prev + 1, filteredOptions.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n selectOption(filteredOptions[highlightedIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n close();\n break;\n }\n }\n\n // Close on outside click\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n close();\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [close]);\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className ?? \"\"}`}\n >\n {/* Trigger */}\n <div\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n tabIndex={0}\n className={`flex min-h-[38px] w-full cursor-pointer items-center rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm transition-colors duration-200 ${isOpen ? \"ring-2 ring-blue-500/20\" : \"\"} ${disabled ? \"pointer-events-none bg-gray-100\" : \"\"}`}\n style={isOpen ? { borderColor: \"var(--fc-color-primary, #3b82f6)\" } : {}}\n onClick={toggle}\n onKeyDown={onKeydown}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-1\">\n {/* Multiple tags */}\n {multiple &&\n selectedValues.map((val) => (\n <span\n key={String(val)}\n className=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n style={{\n backgroundColor:\n \"color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)\",\n color: \"var(--fc-color-primary, #3b82f6)\",\n }}\n >\n {tagLabel(val)}\n <button\n type=\"button\"\n className=\"ml-0.5\"\n style={{ color: \"var(--fc-color-primary, #3b82f6)\" }}\n aria-label=\"Remove\"\n onClick={(e) => {\n e.stopPropagation();\n removeTag(val);\n }}\n >\n &times;\n </button>\n </span>\n ))}\n {/* Single display */}\n {!multiple && displayLabel && <span className=\"truncate\">{displayLabel}</span>}\n {/* Placeholder */}\n {selectedValues.length === 0 && !multiple && (\n <span className=\"text-gray-400\">{placeholder}</span>\n )}\n {multiple && selectedValues.length === 0 && (\n <span className=\"text-gray-400\">{placeholder}</span>\n )}\n </div>\n {/* Clear button */}\n {clearable && selectedValues.length > 0 && !disabled && (\n <button\n type=\"button\"\n className=\"ml-1 shrink-0 text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n aria-label=\"Clear selection\"\n onClick={clearSelection}\n >\n &times;\n </button>\n )}\n {/* Chevron */}\n <svg\n className={`ml-1 h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200 ${isOpen ? \"rotate-180\" : \"\"}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n {/* Dropdown */}\n {isOpen && (\n <div className=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white shadow-lg\">\n {/* Search */}\n {searchable && (\n <div className=\"border-b border-gray-200 p-2\">\n <input\n ref={searchInputRef}\n type=\"text\"\n className=\"w-full rounded border border-gray-300 px-2 py-1 text-sm focus:outline-none fc-select-search\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={onKeydown}\n onFocus={(e) => {\n e.target.style.borderColor = \"var(--fc-color-primary, #3b82f6)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n }}\n />\n </div>\n )}\n {/* Options list */}\n <ul role=\"listbox\" className=\"max-h-60 overflow-auto py-1\">\n {filteredOptions.map((option, idx) => (\n <li\n key={String(option.value)}\n role=\"option\"\n aria-selected={isSelected(option.value)}\n className={`cursor-pointer px-3 py-2 text-sm transition-colors duration-200 ${\n !isSelected(option.value) ? \"text-gray-900\" : \"\"\n } ${highlightedIndex === idx ? \"bg-gray-100\" : \"\"} ${\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:bg-gray-50\"\n }`}\n style={\n isSelected(option.value)\n ? {\n backgroundColor:\n \"color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)\",\n color: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={() => selectOption(option)}\n onMouseEnter={() => setHighlightedIndex(idx)}\n >\n {option.label}\n </li>\n ))}\n {filteredOptions.length === 0 && (\n <li className=\"px-3 py-2 text-sm text-gray-400\">No options found</li>\n )}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – CheckboxField (matches Vue CheckboxInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxFieldProps {\n value: boolean;\n onChange: (value: boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n label?: string;\n className?: string;\n}\n\nexport function CheckboxField({\n value,\n onChange,\n onBlur,\n disabled,\n label,\n className,\n}: CheckboxFieldProps) {\n function toggle() {\n if (disabled) return;\n onChange(!value);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggle();\n }\n }\n\n return (\n <label\n className={`inline-flex items-center gap-2 select-none ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"} ${className ?? \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={value ?? false}\n onChange={() => {}}\n onBlur={onBlur}\n disabled={disabled}\n className=\"sr-only\"\n />\n <div\n role=\"checkbox\"\n aria-checked={value}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200 ${\n value ? \"text-white\" : \"border-gray-300 bg-white\"\n }`}\n style={\n value\n ? {\n borderColor: \"var(--fc-color-primary, #3b82f6)\",\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={(e) => {\n e.preventDefault();\n toggle();\n }}\n onKeyDown={onKeydown}\n >\n {value && (\n <svg\n className=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n {label && <span className=\"text-sm text-gray-700\">{label}</span>}\n </label>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – RadioField (matches Vue RadioInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface RadioOption {\n label: string;\n value: string | number | boolean;\n disabled?: boolean;\n}\n\nexport interface RadioFieldProps {\n name: string;\n value: unknown;\n onChange: (value: string | number | boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n options: RadioOption[];\n inline?: boolean;\n className?: string;\n}\n\nexport function RadioField({\n name,\n value,\n onChange,\n onBlur,\n disabled,\n options,\n inline = false,\n className,\n}: RadioFieldProps) {\n function isSelected(v: string | number | boolean): boolean {\n return value === v;\n }\n\n function isOptionDisabled(option: RadioOption): boolean {\n return disabled === true || !!option.disabled;\n }\n\n function selectOption(option: RadioOption) {\n if (isOptionDisabled(option)) return;\n onChange(option.value);\n }\n\n function onKeydown(e: React.KeyboardEvent, option: RadioOption) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n selectOption(option);\n }\n }\n\n return (\n <div\n role=\"radiogroup\"\n className={`${inline ? \"flex flex-wrap gap-4\" : \"flex flex-col gap-2\"} ${className ?? \"\"}`}\n >\n {options.map((option) => (\n <label\n key={String(option.value)}\n className={`inline-flex items-center gap-2 select-none ${\n isOptionDisabled(option)\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\"\n }`}\n >\n <input\n type=\"radio\"\n checked={isSelected(option.value)}\n disabled={isOptionDisabled(option)}\n className=\"sr-only\"\n name={name}\n onChange={() => selectOption(option)}\n onBlur={onBlur}\n />\n <div\n role=\"radio\"\n aria-checked={isSelected(option.value)}\n aria-disabled={isOptionDisabled(option) || undefined}\n tabIndex={0}\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors duration-200 ${\n !isSelected(option.value) ? \"border-gray-300\" : \"\"\n }`}\n style={\n isSelected(option.value)\n ? { borderColor: \"var(--fc-color-primary, #3b82f6)\" }\n : {}\n }\n onClick={() => selectOption(option)}\n onKeyDown={(e) => onKeydown(e, option)}\n >\n {isSelected(option.value) && (\n <div\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n />\n )}\n </div>\n <span className=\"text-sm text-gray-700\">{option.label}</span>\n </label>\n ))}\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SwitchField (matches Vue SwitchInput styling)\n// ---------------------------------------------------------------------------\n\nexport interface SwitchFieldProps {\n value: boolean;\n onChange: (value: boolean) => void;\n onBlur?: () => void;\n disabled?: boolean;\n activeLabel?: string;\n inactiveLabel?: string;\n className?: string;\n}\n\nexport function SwitchField({\n value,\n onChange,\n onBlur,\n disabled,\n activeLabel,\n inactiveLabel,\n className,\n}: SwitchFieldProps) {\n function toggle() {\n if (disabled) return;\n onChange(!value);\n }\n\n function onKeydown(e: React.KeyboardEvent) {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggle();\n }\n }\n\n return (\n <label\n className={`inline-flex items-center gap-2 select-none ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"} ${className ?? \"\"}`}\n >\n {inactiveLabel && <span className=\"text-sm text-gray-600\">{inactiveLabel}</span>}\n <input\n type=\"checkbox\"\n checked={value ?? false}\n onChange={toggle}\n onBlur={onBlur}\n disabled={disabled}\n className=\"sr-only\"\n />\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={value}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n className={`relative inline-flex h-6 w-11 shrink-0 rounded-full border-2 border-transparent transition-colors duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)] ${\n !value ? \"bg-gray-300\" : \"\"\n } ${disabled ? \"pointer-events-none\" : \"focus:outline-none focus:ring-2 focus:ring-blue-500/20\"}`}\n style={value ? { backgroundColor: \"var(--fc-color-primary, #3b82f6)\" } : {}}\n onClick={toggle}\n onKeyDown={onKeydown}\n >\n <span\n className={`pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)] ${\n value ? \"translate-x-5\" : \"translate-x-0\"\n }`}\n aria-hidden=\"true\"\n />\n </button>\n {activeLabel && <span className=\"text-sm text-gray-600\">{activeLabel}</span>}\n </label>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – SliderField (matches Vue SliderInput styling)\n// ---------------------------------------------------------------------------\n\nimport { useState } from \"react\";\n\nexport interface SliderFieldProps {\n value: number | null;\n onChange: (value: number) => void;\n onBlur?: () => void;\n disabled?: boolean;\n min?: number;\n max?: number;\n step?: number;\n showTooltip?: boolean;\n className?: string;\n}\n\nexport function SliderField({\n value,\n onChange,\n onBlur,\n disabled,\n min = 0,\n max = 100,\n step = 1,\n showTooltip = true,\n className,\n}: SliderFieldProps) {\n const [isActive, setIsActive] = useState(false);\n\n const currentValue = value ?? min;\n const range = max - min;\n const percentage = range === 0 ? 0 : ((currentValue - min) / range) * 100;\n\n return (\n <div\n className={`relative w-full py-2 ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"} ${className ?? \"\"}`}\n >\n {/* Tooltip */}\n {showTooltip && isActive && (\n <div\n className=\"absolute -top-8 rounded bg-gray-800 px-2 py-1 text-xs text-white shadow-sm transition-opacity duration-200\"\n style={{ left: `calc(${percentage}% - 16px)` }}\n >\n {currentValue}\n </div>\n )}\n <input\n type=\"range\"\n value={currentValue}\n onChange={(e) => onChange(Number.parseFloat(e.target.value))}\n onMouseDown={() => setIsActive(true)}\n onMouseUp={() => setIsActive(false)}\n onTouchStart={() => setIsActive(true)}\n onTouchEnd={() => setIsActive(false)}\n onFocus={() => setIsActive(true)}\n onBlur={(e) => {\n setIsActive(false);\n onBlur?.();\n }}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n aria-valuenow={currentValue}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled || undefined}\n className=\"h-2 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500/20 disabled:pointer-events-none\"\n style={{ accentColor: \"var(--fc-color-primary, #3b82f6)\" }}\n />\n {/* Min/Max labels */}\n <div className=\"mt-1 flex justify-between text-xs text-gray-400\">\n <span>{min}</span>\n <span>{max}</span>\n </div>\n </div>\n );\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – FormBuilder component (matches Vue FormBuilder styling)\n// ---------------------------------------------------------------------------\n\nimport type { ComponentType, FormEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { useFormaticaConfig } from \"./FormaticaProvider\";\nimport type {\n DividerNode,\n FieldSchema,\n FormSchema,\n GroupNode,\n OptionItem,\n RowNode,\n SchemaNode,\n StepNodeItem,\n StepsNode,\n TabNodeItem,\n TabsNode,\n ThemeConfig,\n} from \"@formatica/core\";\nimport { isFieldNode } from \"@formatica/core\";\nimport { useForm } from \"../hooks/useForm\";\nimport type { FormInstance } from \"../hooks/useForm\";\nimport { FormContext } from \"../hooks/useFormContext\";\nimport { BaseField } from \"./BaseField\";\nimport { TextField } from \"./fields/TextField\";\nimport { NumberField } from \"./fields/NumberField\";\nimport { TextareaField } from \"./fields/TextareaField\";\nimport { SelectField } from \"./fields/SelectField\";\nimport { CheckboxField } from \"./fields/CheckboxField\";\nimport { RadioField } from \"./fields/RadioField\";\nimport { SwitchField } from \"./fields/SwitchField\";\nimport { SliderField } from \"./fields/SliderField\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FieldComponentProps {\n field: FieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n onBlur: () => void;\n errors: string[];\n disabled: boolean;\n}\n\nexport interface FormBuilderProps {\n schema: FormSchema;\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>;\n onError?: (errors: Record<string, string[]>) => void;\n locale?: string;\n fallbackLocale?: string;\n theme?: ThemeConfig;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Theme helpers\n// ---------------------------------------------------------------------------\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\nfunction buildCssVars(theme?: ThemeConfig): React.CSSProperties {\n if (!theme) return {};\n const vars: Record<string, string> = {};\n\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value) vars[`--fc-color-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.typography) {\n for (const [key, value] of Object.entries(theme.typography)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.borders) {\n for (const [key, value] of Object.entries(theme.borders)) {\n if (value) vars[`--fc-border-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n if (value) vars[`--fc-shadow-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.transitions) {\n for (const [key, value] of Object.entries(theme.transitions)) {\n if (value) vars[`--fc-transition-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.cssVars) {\n Object.assign(vars, theme.cssVars);\n }\n\n return vars as React.CSSProperties;\n}\n\n// ---------------------------------------------------------------------------\n// Translation helpers\n// ---------------------------------------------------------------------------\n\nfunction getTranslation(\n schema: FormSchema,\n key: string,\n locale: string,\n fallbackLocale: string,\n fallback: string,\n): string {\n const translations = schema.translations;\n if (!translations) return fallback;\n const loc = translations[locale];\n if (loc?.messages?.[key]) return loc.messages[key];\n const fb = translations[fallbackLocale];\n return fb?.messages?.[key] ?? fallback;\n}\n\nfunction getActionLabel(\n schema: FormSchema,\n key: \"submit\" | \"reset\",\n locale: string,\n fallbackLocale: string,\n fallback: string,\n): string {\n const translations = schema.translations;\n if (!translations) return fallback;\n const loc = translations[locale];\n if (loc?.[key]) return loc[key];\n const fb = translations[fallbackLocale];\n return fb?.[key] ?? fallback;\n}\n\n// ---------------------------------------------------------------------------\n// Default field registry\n// ---------------------------------------------------------------------------\n\nfunction resolveOptions(\n options:\n | OptionItem[]\n | ((...args: unknown[]) => OptionItem[] | Promise<OptionItem[]>)\n | undefined,\n): OptionItem[] {\n if (Array.isArray(options)) return options;\n return [];\n}\n\nfunction DefaultFieldRenderer({ field, value, onChange, onBlur, disabled }: FieldComponentProps) {\n switch (field.type) {\n case \"text\":\n return (\n <TextField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n inputType={field.inputType}\n readOnly={field.readOnly}\n />\n );\n case \"number\":\n return (\n <NumberField\n value={value as number | null}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n min={field.min}\n max={field.max}\n step={field.step}\n readOnly={field.readOnly}\n />\n );\n case \"textarea\":\n return (\n <TextareaField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n rows={field.rows}\n readOnly={field.readOnly}\n />\n );\n case \"select\":\n return (\n <SelectField\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n options={resolveOptions(field.options)}\n />\n );\n case \"checkbox\":\n return (\n <CheckboxField\n value={Boolean(value)}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n />\n );\n case \"radio\":\n return (\n <RadioField\n name={field.name}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n options={resolveOptions(field.options)}\n />\n );\n case \"switch\":\n return (\n <SwitchField\n value={Boolean(value)}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n />\n );\n case \"slider\":\n return (\n <SliderField\n value={value as number | null}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n min={field.min}\n max={field.max}\n step={field.step}\n />\n );\n default:\n return (\n <TextField\n value={String(value ?? \"\")}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n placeholder={field.placeholder}\n />\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node renderers\n// ---------------------------------------------------------------------------\n\nfunction getSpanStyle(span: number | string | undefined): React.CSSProperties {\n if (span === \"full\") return { gridColumn: \"1 / -1\" };\n if (span === \"auto\") return { gridColumn: \"auto\" };\n if (typeof span === \"number\") return { gridColumn: `span ${span} / span ${span}` };\n return { gridColumn: \"span 12 / span 12\" };\n}\n\nfunction renderField(\n field: FieldSchema,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n const fieldErrors = form.errors[field.name] ?? [];\n const disabled = field.disabled === true || false;\n\n const props: FieldComponentProps = {\n field,\n value: form.values[field.name],\n onChange: (v: unknown) => form.setFieldValue(field.name, v),\n onBlur: () => form.validateField(field.name),\n errors: fieldErrors,\n disabled,\n };\n\n const CustomComponent = components?.[field.type];\n const FieldComponent = CustomComponent ?? DefaultFieldRenderer;\n\n return (\n <BaseField\n key={field.name}\n label={field.label}\n required={field.required}\n errors={fieldErrors}\n touched={form.touched[field.name]}\n helpText={field.helpText}\n tooltip={field.tooltip}\n disabled={field.disabled}\n readOnly={field.readOnly}\n fieldName={field.name}\n className={field.className}\n style={field.style as React.CSSProperties}\n >\n <FieldComponent {...props} />\n </BaseField>\n );\n}\n\nfunction renderRow(\n node: RowNode,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n const alignMap: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n };\n const alignClass = alignMap[node.align ?? \"stretch\"] ?? \"items-stretch\";\n const gapStyle =\n node.gap !== undefined\n ? typeof node.gap === \"number\"\n ? `${node.gap}px`\n : node.gap\n : \"1rem\";\n\n return (\n <div\n className={`grid grid-cols-12 ${alignClass} ${node.className ?? \"\"}`}\n style={{ gap: gapStyle }}\n role=\"group\"\n >\n {node.children.map((child, i) => (\n <div\n key={isFieldNode(child) ? child.name : `row-child-${i}`}\n style={getSpanStyle(isFieldNode(child) ? child.span : undefined)}\n >\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n );\n}\n\nfunction RenderGroup({\n node,\n form,\n components,\n}: {\n node: GroupNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [isCollapsed, setIsCollapsed] = useState(node.collapsed ?? false);\n const headerId = node.title\n ? `fc-group-${node.title.toLowerCase().replace(/\\s+/g, \"-\")}`\n : undefined;\n\n function toggle() {\n if (node.collapsible) setIsCollapsed(!isCollapsed);\n }\n\n const HeaderTag = node.collapsible ? \"button\" : \"div\";\n\n return (\n <fieldset\n className={`rounded-lg border border-gray-200 bg-white ${node.className ?? \"\"}`}\n aria-labelledby={headerId}\n >\n {/* Header */}\n {(node.title || node.description) && (\n <div className=\"border-b border-gray-100 px-4 py-3\">\n <HeaderTag\n type={node.collapsible ? \"button\" : undefined}\n className={`flex w-full items-center justify-between text-left ${node.collapsible ? \"cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-500/40 rounded\" : \"\"}`}\n aria-expanded={node.collapsible ? !isCollapsed : undefined}\n aria-controls={node.collapsible ? `fc-group-body-${headerId}` : undefined}\n onClick={toggle}\n >\n <div>\n {node.title && (\n <legend\n id={headerId}\n className=\"text-sm font-semibold text-gray-800\"\n >\n {node.title}\n </legend>\n )}\n {node.description && (\n <p className=\"mt-0.5 text-xs text-gray-500\">{node.description}</p>\n )}\n </div>\n {node.collapsible && (\n <svg\n className={`h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </HeaderTag>\n </div>\n )}\n\n {/* Body */}\n {!isCollapsed && (\n <div\n id={node.collapsible ? `fc-group-body-${headerId}` : undefined}\n className=\"p-4\"\n >\n {node.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `group-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n </fieldset>\n );\n}\n\nfunction RenderSteps({\n node,\n form,\n components,\n}: {\n node: StepsNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [currentStep, setCurrentStep] = useState(0);\n const [completedSteps, setCompletedSteps] = useState<Set<number>>(new Set());\n\n const steps = node.steps;\n const totalSteps = steps.length;\n const isFirstStep = currentStep === 0;\n const isLastStep = currentStep === totalSteps - 1;\n\n function goNext() {\n if (isLastStep) return;\n setCompletedSteps((prev) => {\n const next = new Set(prev);\n next.add(currentStep);\n return next;\n });\n setCurrentStep((prev) => prev + 1);\n }\n\n function goPrevious() {\n if (isFirstStep) return;\n setCurrentStep((prev) => prev - 1);\n }\n\n function goToStep(index: number) {\n if (node.linear && index > currentStep) return;\n setCurrentStep(index);\n }\n\n const currentStepData: StepNodeItem | undefined = steps[currentStep];\n\n return (\n <div className={`space-y-6 ${node.className ?? \"\"}`}>\n {/* Progress indicator */}\n <nav aria-label=\"Form steps\" className=\"flex items-center justify-center\">\n <ol className=\"flex items-center gap-0\">\n {steps.map((step, idx) => (\n <li key={step.title} className=\"flex items-center\">\n {/* Step circle */}\n <button\n type=\"button\"\n disabled={node.linear === true && idx > currentStep}\n aria-current={idx === currentStep ? \"step\" : undefined}\n aria-label={`Step ${idx + 1}: ${step.title}`}\n className={`relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40 ${\n completedSteps.has(idx) && idx !== currentStep\n ? \"border-green-500 bg-green-500 text-white\"\n : idx !== currentStep\n ? \"border-gray-300 bg-white text-gray-500\"\n : \"text-white\"\n } ${node.linear === true && idx > currentStep ? \"cursor-not-allowed\" : \"cursor-pointer hover:shadow-md\"}`}\n style={\n idx === currentStep\n ? {\n borderColor: \"var(--fc-color-primary, #3b82f6)\",\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }\n : {}\n }\n onClick={() => goToStep(idx)}\n >\n {completedSteps.has(idx) && idx !== currentStep ? (\n <svg\n className=\"h-4 w-4 transition-transform duration-200\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : (\n <span>{idx + 1}</span>\n )}\n </button>\n\n {/* Connector line */}\n {idx < steps.length - 1 && (\n <div\n className={`mx-1 h-0.5 w-8 transition-colors duration-300 sm:w-12 ${completedSteps.has(idx) ? \"bg-green-500\" : \"bg-gray-200\"}`}\n />\n )}\n </li>\n ))}\n </ol>\n </nav>\n\n {/* Step title */}\n {currentStepData && (\n <div className=\"text-center\">\n <h3 className=\"text-base font-semibold text-gray-800\">\n {currentStepData.title}\n </h3>\n {currentStepData.description && (\n <p className=\"mt-1 text-sm text-gray-500\">{currentStepData.description}</p>\n )}\n </div>\n )}\n\n {/* Step content */}\n {currentStepData && (\n <div>\n {currentStepData.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `step-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n\n {/* Navigation buttons */}\n <div className=\"flex items-center justify-between border-t border-gray-100 pt-4\">\n <button\n type=\"button\"\n disabled={isFirstStep}\n className=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={goPrevious}\n >\n Previous\n </button>\n <span className=\"text-xs text-gray-400\">\n {currentStep + 1} / {totalSteps}\n </span>\n {!isLastStep ? (\n <button\n type=\"button\"\n className=\"rounded-md px-4 py-2 text-sm font-medium text-white transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n onClick={goNext}\n >\n Next\n </button>\n ) : (\n <div className=\"w-[72px]\" />\n )}\n </div>\n </div>\n );\n}\n\nfunction RenderTabs({\n node,\n form,\n components,\n}: {\n node: TabsNode;\n form: FormInstance;\n components?: Record<string, ComponentType<FieldComponentProps>>;\n}): React.ReactElement {\n const [activeIndex, setActiveIndex] = useState(0);\n\n const tabs = node.tabs;\n const activeTab: TabNodeItem | undefined = tabs[activeIndex];\n const tabPanelId = `fc-tabpanel-${activeIndex}`;\n\n function selectTab(index: number) {\n setActiveIndex(index);\n }\n\n return (\n <div className={node.className ?? \"\"}>\n {/* Tab bar */}\n <div\n className=\"relative flex border-b border-gray-200\"\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {tabs.map((tab, idx) => (\n <button\n key={tab.title}\n id={`fc-tab-${idx}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={idx === activeIndex}\n aria-controls={tabPanelId}\n tabIndex={idx === activeIndex ? 0 : -1}\n className={`relative px-4 py-2.5 text-sm font-medium transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500/40 ${\n idx !== activeIndex ? \"text-gray-500 hover:text-gray-700\" : \"\"\n }`}\n style={\n idx === activeIndex ? { color: \"var(--fc-color-primary, #3b82f6)\" } : {}\n }\n onClick={() => selectTab(idx)}\n >\n {tab.title}\n {/* Active underline indicator */}\n {idx === activeIndex && (\n <span\n className=\"absolute inset-x-0 -bottom-px h-0.5 transition-all duration-200\"\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n />\n )}\n </button>\n ))}\n </div>\n\n {/* Tab panel */}\n {activeTab && (\n <div\n id={tabPanelId}\n role=\"tabpanel\"\n aria-labelledby={`fc-tab-${activeIndex}`}\n tabIndex={0}\n className=\"pt-4\"\n >\n {activeTab.children.map((child, i) => (\n <div key={isFieldNode(child) ? child.name : `tab-child-${i}`}>\n {renderNode(child, form, components)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction renderDivider(node: DividerNode): ReactNode {\n if (node.label) {\n return (\n <div className={`relative my-4 ${node.className ?? \"\"}`}>\n <div className=\"absolute inset-0 flex items-center\" aria-hidden=\"true\">\n <div className=\"w-full border-t border-gray-200\" />\n </div>\n <div className=\"relative flex justify-center\">\n <span className=\"bg-white px-3 text-sm text-gray-500\">{node.label}</span>\n </div>\n </div>\n );\n }\n return <hr className={`my-4 border-gray-200 ${node.className ?? \"\"}`} />;\n}\n\nfunction renderNode(\n node: SchemaNode,\n form: FormInstance,\n components?: Record<string, ComponentType<FieldComponentProps>>,\n): ReactNode {\n if (isFieldNode(node)) {\n return renderField(node, form, components);\n }\n\n switch (node.type) {\n case \"row\":\n return renderRow(node, form, components);\n case \"group\":\n return <RenderGroup node={node} form={form} components={components} />;\n case \"steps\":\n return <RenderSteps node={node} form={form} components={components} />;\n case \"tabs\":\n return <RenderTabs node={node} form={form} components={components} />;\n case \"divider\":\n return renderDivider(node);\n case \"html\":\n return (\n <div\n className={node.className ?? \"\"}\n dangerouslySetInnerHTML={{ __html: node.content }}\n />\n );\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// FormBuilder\n// ---------------------------------------------------------------------------\n\nexport function FormBuilder({\n schema,\n onSubmit,\n onError,\n locale: localeProp,\n fallbackLocale: fallbackLocaleProp,\n theme: themeProp,\n components: componentsProp,\n className,\n}: FormBuilderProps) {\n const globalConfig = useFormaticaConfig();\n\n // Props override globals\n const locale = localeProp ?? globalConfig.locale ?? \"en\";\n const fallbackLocale = fallbackLocaleProp ?? globalConfig.fallbackLocale ?? \"en\";\n const theme = themeProp ?? globalConfig.theme;\n const components = componentsProp ?? globalConfig.components;\n\n const form = useForm(schema, { locale });\n const cssVars = buildCssVars(theme);\n\n const formTitle = getTranslation(schema, \"title\", locale, fallbackLocale, \"\");\n const formDescription = getTranslation(schema, \"description\", locale, fallbackLocale, \"\");\n const submitLabel = getActionLabel(schema, \"submit\", locale, fallbackLocale, \"Submit\");\n const resetLabel = getActionLabel(schema, \"reset\", locale, fallbackLocale, \"Reset\");\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n if (onSubmit) {\n await form.submit(async (values) => {\n await onSubmit(values);\n });\n } else {\n await form.validate();\n }\n if (!form.isValid && onError) {\n onError(form.errors);\n }\n };\n\n const handleReset = (e: FormEvent) => {\n e.preventDefault();\n form.reset();\n };\n\n return (\n <FormContext.Provider value={form}>\n <form\n className={`fc-form-builder ${theme?.components?.form ?? \"\"} ${className ?? \"\"}`.trim()}\n style={cssVars}\n onSubmit={handleSubmit}\n onReset={handleReset}\n noValidate\n >\n {/* Form title / description */}\n {(formTitle || formDescription) && (\n <div className=\"mb-6\">\n {formTitle && (\n <h2 className=\"text-lg font-semibold text-gray-900\">{formTitle}</h2>\n )}\n {formDescription && (\n <p className=\"mt-1 text-sm text-gray-500\">{formDescription}</p>\n )}\n </div>\n )}\n\n {/* Layout */}\n {schema.fields.map((node, i) => (\n <div\n key={isFieldNode(node) ? node.name : `node-${i}`}\n style={isFieldNode(node) ? getSpanStyle(node.span) : undefined}\n >\n {renderNode(node, form, components)}\n </div>\n ))}\n\n {/* Actions */}\n <div className=\"mt-6 flex items-center gap-3\">\n <button\n type=\"submit\"\n disabled={form.isSubmitting}\n className={`fc-submit-btn rounded-md px-4 py-2 text-sm font-medium text-white transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 ${theme?.components?.button ?? \"\"}`}\n style={{\n backgroundColor: \"var(--fc-color-primary, #3b82f6)\",\n }}\n >\n {form.isSubmitting && (\n <span\n className=\"mr-2 inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white border-t-transparent\"\n aria-hidden=\"true\"\n />\n )}\n {submitLabel}\n </button>\n <button\n type=\"reset\"\n disabled={form.isSubmitting}\n className=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {resetLabel}\n </button>\n </div>\n </form>\n </FormContext.Provider>\n );\n}\n"],"names":["getTypeDefault","field","buildDefaults","fields","values","parseRules","rules","parseRuleString","v","name","paramValue","rule","paramParts","paramStr","params","n","useForm","schema","_options","extractFields","initialValuesRef","useRef","fieldsRef","setValues","useState","errors","setErrors","touched","setTouched","dirty","setDirty","isSubmitting","setIsSubmitting","submitCount","setSubmitCount","valuesRef","errorsRef","isValid","e","isDirty","setFieldValue","useCallback","value","prev","getFieldValue","validateSingleField","currentValues","f","evaluateCondition","r","fieldErrors","ctx","ruleFn","getRule","result","validateField","validate","allErrors","allValid","submit","handler","allTouched","reset","clear","cleared","setError","message","msgs","clearError","next","clearErrors","FormContext","createContext","useFormContext","useContext","FormaticaConfigContext","FormaticaProvider","config","children","useFormaticaConfig","BaseField","label","required","helpText","tooltip","disabled","readOnly","fieldName","className","style","showTooltip","setShowTooltip","hasErrors","fieldId","errorId","jsxs","jsx","error","idx","baseInputClasses","TextField","onChange","onBlur","placeholder","inputType","prefix","suffix","maxLength","inputClassName","inputEl","NumberField","min","max","step","precision","handleChange","raw","num","baseClasses","TextareaField","rows","autoResize","textareaRef","adjustHeight","el","useEffect","textareaClassName","SelectField","options","multiple","searchable","clearable","isOpen","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","containerRef","searchInputRef","selectedValues","displayLabel","opt","o","filteredOptions","isSelected","tagLabel","open","_a","close","toggle","selectOption","option","arr","removeTag","sv","clearSelection","onKeydown","handleClickOutside","event","val","CheckboxField","RadioField","inline","isOptionDisabled","SwitchField","activeLabel","inactiveLabel","SliderField","isActive","setIsActive","currentValue","range","percentage","camelToKebab","str","m","buildCssVars","theme","vars","key","getTranslation","locale","fallbackLocale","fallback","translations","loc","fb","_b","getActionLabel","resolveOptions","DefaultFieldRenderer","getSpanStyle","span","renderField","form","components","props","FieldComponent","renderRow","node","alignClass","gapStyle","child","i","isFieldNode","renderNode","RenderGroup","isCollapsed","setIsCollapsed","headerId","HeaderTag","RenderSteps","currentStep","setCurrentStep","completedSteps","setCompletedSteps","steps","totalSteps","isFirstStep","isLastStep","goNext","goPrevious","goToStep","index","currentStepData","RenderTabs","activeIndex","setActiveIndex","tabs","activeTab","tabPanelId","selectTab","tab","renderDivider","FormBuilder","onSubmit","onError","localeProp","fallbackLocaleProp","themeProp","componentsProp","globalConfig","cssVars","formTitle","formDescription","submitLabel","resetLabel","handleSubmit","handleReset"],"mappings":"wYAqCA,SAASA,GAAeC,EAA6B,CACjD,OAAQA,EAAM,KAAA,CACV,IAAK,OACL,IAAK,iBACD,MAAO,CAAA,EACX,IAAK,WACL,IAAK,SACD,MAAO,GACX,IAAK,SACL,IAAK,SACL,IAAK,OACD,OAAO,KACX,QACI,MAAO,EAAA,CAEnB,CAEA,SAASC,GAAcC,EAAgD,CACnE,MAAMC,EAAkC,CAAA,EACxC,UAAWH,KAASE,EAChBC,EAAOH,EAAM,IAAI,EAAIA,EAAM,cAAgBD,GAAeC,CAAK,EAEnE,OAAOG,CACX,CAOA,SAASC,GAAWC,EAA8E,CAC9F,OAAKA,EAED,OAAOA,GAAU,SACVA,EAAM,MAAM,GAAG,EAAE,IAAIC,CAAe,EAE3C,MAAM,QAAQD,CAAK,EACZA,EAAM,IAAIC,CAAe,EAG7B,OAAO,QAAQD,CAAK,EACtB,OAAO,CAAC,CAAA,CAAGE,CAAC,IAAMA,IAAM,IAASA,IAAM,MAAS,EAChD,IAAI,CAAC,CAACC,EAAMC,CAAU,KAAO,CAC1B,KAAAD,EACA,OACI,OAAOC,GAAe,UAAYA,IAAe,KAC1CA,EACD,CAAE,CAACD,CAAI,EAAGC,CAAA,CAAW,EACjC,EAjBa,CAAA,CAkBvB,CAEA,SAASH,EAAgBI,EAA0B,CAC/C,KAAM,CAACF,EAAO,GAAI,GAAGG,CAAU,EAAID,EAAK,MAAM,GAAG,EAC3CE,EAAWD,EAAW,KAAK,GAAG,EAC9BE,EAAkC,CAAA,EACxC,GAAID,EAAU,CAEV,MAAMT,EAASS,EAAS,MAAM,GAAG,EACjC,GAAIJ,IAAS,WAAaL,EAAO,SAAW,EACxCU,EAAO,IAAM,OAAOV,EAAO,CAAC,CAAC,EAC7BU,EAAO,IAAM,OAAOV,EAAO,CAAC,CAAC,UACtBK,IAAS,UAChBK,EAAO,QAAUD,UAEjBC,EAAOL,CAAK,EAAIL,EAAO,SAAW,EAAIA,EAAO,CAAC,EAAIA,EAE9CA,EAAO,SAAW,EAAG,CACrB,MAAMW,EAAI,OAAOX,EAAO,CAAC,CAAC,EACrB,OAAO,MAAMW,CAAC,IACfD,EAAOL,CAAK,EAAIM,EAEZN,IAAS,cAAaK,EAAO,IAAMC,GACnCN,IAAS,cAAaK,EAAO,IAAMC,GAE/C,CAER,CACA,MAAO,CAAE,KAAAN,EAAa,OAAAK,CAAA,CAC1B,CAUO,SAASE,EAAQC,EAAoBC,EAAyC,CACjF,MAAMf,EAASgB,EAAAA,cAAcF,EAAO,MAAM,EACpCG,EAAmBC,EAAAA,OAAOnB,GAAcC,CAAM,CAAC,EAC/CmB,EAAYD,EAAAA,OAAOlB,CAAM,EAEzB,CAACC,EAAQmB,CAAS,EAAIC,EAAAA,SAAkC,KAAO,CACjE,GAAGJ,EAAiB,OAAA,EACtB,EACI,CAACK,EAAQC,CAAS,EAAIF,EAAAA,SAAmC,CAAA,CAAE,EAC3D,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAkC,CAAA,CAAE,EAC5D,CAACK,EAAOC,CAAQ,EAAIN,EAAAA,SAAkC,CAAA,CAAE,EACxD,CAACO,EAAcC,CAAe,EAAIR,EAAAA,SAAS,EAAK,EAChD,CAACS,EAAaC,CAAc,EAAIV,EAAAA,SAAS,CAAC,EAG1CW,EAAYd,EAAAA,OAAOjB,CAAM,EAC/B+B,EAAU,QAAU/B,EACpB,MAAMgC,EAAYf,EAAAA,OAAOI,CAAM,EAC/BW,EAAU,QAAUX,EAEpB,MAAMY,EAAU,OAAO,OAAOZ,CAAM,EAAE,MAAOa,GAAMA,EAAE,SAAW,CAAC,EAC3DC,EAAU,OAAO,OAAOV,CAAK,EAAE,KAAK,OAAO,EAI3CW,EAAgBC,EAAAA,YAAY,CAAChC,EAAciC,IAAmB,CAChEnB,EAAWoB,IAAU,CAAE,GAAGA,EAAM,CAAClC,CAAI,EAAGiC,CAAA,EAAQ,EAChDZ,EAAUa,IAAU,CAAE,GAAGA,EAAM,CAAClC,CAAI,EAAG,EAAA,EAAO,CAClD,EAAG,CAAA,CAAE,EAECmC,EAAgBH,EAAAA,YAAahC,GAAiB0B,EAAU,QAAQ1B,CAAI,EAAG,EAAE,EAIzEoC,EAAsBJ,EAAAA,YACxB,MAAOhC,EAAcqC,IAA8D,CAC/E,MAAM7C,EAAQqB,EAAU,QAAQ,KAAMyB,GAAMA,EAAE,OAAStC,CAAI,EAC3D,GAAI,CAACR,EAAO,MAAO,CAAA,EAGnB,GAAIA,EAAM,WAEF,CADY+C,EAAAA,kBAAkB/C,EAAM,UAAW6C,CAAa,EAClD,MAAO,CAAA,EAGzB,MAAMxC,EAAQD,GAAWJ,EAAM,KAAK,EAEhCA,EAAM,UAAY,CAACK,EAAM,KAAM2C,GAAMA,EAAE,OAAS,UAAU,GAC1D3C,EAAM,QAAQ,CAAE,KAAM,WAAY,OAAQ,CAAA,EAAI,EAGlD,MAAM4C,EAAwB,CAAA,EACxBC,GAAM,CACR,OAAQL,EACR,cAAgB/B,GAAc+B,EAAc/B,CAAC,CAAA,EAGjD,UAAWJ,KAAQL,EAAO,CACtB,MAAM8C,GAASC,EAAAA,QAAQ1C,EAAK,IAAI,EAChC,GAAI,CAACyC,GAAQ,SAEb,MAAME,GAAS,MAAMF,GAAON,EAAcrC,CAAI,EAAGE,EAAK,OAAQwC,EAAG,EAC7D,OAAOG,IAAW,UAClBJ,EAAY,KAAKI,EAAM,CAE/B,CAEA,OAAOJ,CACX,EACA,CAAA,CAAC,EAGCK,EAAgBd,EAAAA,YAClB,MAAOhC,GAAmC,CACtC,MAAMyC,EAAc,MAAML,EAAoBpC,EAAM0B,EAAU,OAAO,EACrE,OAAAT,EAAWiB,IAAU,CAAE,GAAGA,EAAM,CAAClC,CAAI,EAAGyC,CAAA,EAAc,EACtDtB,EAAYe,IAAU,CAAE,GAAGA,EAAM,CAAClC,CAAI,EAAG,EAAA,EAAO,EACzCyC,EAAY,SAAW,CAClC,EACA,CAACL,CAAmB,CAAA,EAGlBW,EAAWf,EAAAA,YAAY,SAA8B,CACvD,MAAMK,EAAgBX,EAAU,QAC1BsB,EAAsC,CAAA,EAC5C,IAAIC,EAAW,GAEf,UAAWzD,KAASqB,EAAU,QAAS,CACnC,MAAM4B,EAAc,MAAML,EAAoB5C,EAAM,KAAM6C,CAAa,EACvEW,EAAUxD,EAAM,IAAI,EAAIiD,EACpBA,EAAY,OAAS,IAAGQ,EAAW,GAC3C,CAEA,OAAAhC,EAAU+B,CAAS,EACZC,CACX,EAAG,CAACb,CAAmB,CAAC,EAIlBc,EAASlB,EAAAA,YACX,MACImB,GACgB,CAChB5B,EAAgB,EAAI,EACpBE,EAAgBS,GAASA,EAAO,CAAC,EAGjC,MAAMkB,EAAsC,CAAA,EAC5C,UAAW5D,KAASqB,EAAU,QAC1BuC,EAAW5D,EAAM,IAAI,EAAI,GAE7B2B,EAAWiC,CAAU,EAErB,GAAI,CAEA,GAAI,CADU,MAAML,EAAA,EACR,OACZ,MAAMI,EAAQ,CAAE,GAAGzB,EAAU,QAAS,CAC1C,QAAA,CACIH,EAAgB,EAAK,CACzB,CACJ,EACA,CAACwB,CAAQ,CAAA,EAKPM,EAAQrB,EAAAA,YAAY,IAAM,CAC5BlB,EAAU,CAAE,GAAGH,EAAiB,QAAS,EACzCM,EAAU,CAAA,CAAE,EACZE,EAAW,CAAA,CAAE,EACbE,EAAS,CAAA,CAAE,CACf,EAAG,CAAA,CAAE,EAECiC,EAAQtB,EAAAA,YAAY,IAAM,CAC5B,MAAMuB,EAAmC,CAAA,EACzC,UAAW/D,KAASqB,EAAU,QAC1B0C,EAAQ/D,EAAM,IAAI,EAAI,KAE1BsB,EAAUyC,CAAO,EACjBtC,EAAU,CAAA,CAAE,CAChB,EAAG,CAAA,CAAE,EAICuC,EAAWxB,EAAAA,YAAY,CAACxC,EAAeiE,IAA+B,CACxE,MAAMC,EAAO,MAAM,QAAQD,CAAO,EAAIA,EAAU,CAACA,CAAO,EACxDxC,EAAWiB,IAAU,CAAE,GAAGA,EAAM,CAAC1C,CAAK,EAAGkE,CAAA,EAAO,CACpD,EAAG,CAAA,CAAE,EAECC,EAAa3B,cAAaxC,GAAkB,CAC9CyB,EAAWiB,GAAS,CAChB,MAAM0B,EAAO,CAAE,GAAG1B,CAAA,EAClB,cAAO0B,EAAKpE,CAAK,EACVoE,CACX,CAAC,CACL,EAAG,CAAA,CAAE,EAECC,EAAc7B,EAAAA,YAAY,IAAM,CAClCf,EAAU,CAAA,CAAE,CAChB,EAAG,CAAA,CAAE,EAEL,MAAO,CACH,OAAAtB,EACA,OAAAqB,EACA,QAAAE,EACA,MAAAE,EACA,QAAAQ,EACA,QAAAE,EACA,aAAAR,EACA,YAAAE,EACA,cAAAO,EACA,SAAAgB,EACA,cAAAD,EACA,OAAAI,EACA,MAAAG,EACA,MAAAC,EACA,SAAAE,EACA,WAAAG,EACA,YAAAE,EACA,cAAA1B,CAAA,CAER,CC3SO,MAAM2B,EAAcC,EAAAA,cAAmC,IAAI,EAE3D,SAASC,IAA+B,CAC3C,MAAMtB,EAAMuB,EAAAA,WAAWH,CAAW,EAClC,GAAI,CAACpB,EAAK,MAAM,IAAI,MAAM,mDAAmD,EAC7E,OAAOA,CACX,CCGA,MAAMwB,EAAyBH,EAAAA,cAA+B,EAAE,EAEzD,SAASI,GAAkB,CAC9B,OAAAC,EACA,SAAAC,CACJ,EAGG,CACC,aACKH,EAAuB,SAAvB,CAAgC,MAAOE,EACnC,SAAAC,EACL,CAER,CAEO,SAASC,GAAsC,CAClD,OAAOL,EAAAA,WAAWC,CAAsB,CAC5C,CCbO,SAASK,GAAU,CACtB,MAAAC,EACA,SAAAC,EACA,OAAAzD,EACA,QAAAE,EAAU,GACV,SAAAwD,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EACA,SAAAT,EACA,UAAAU,EACA,MAAAC,CACJ,EAAmB,CACf,KAAM,CAACC,EAAaC,CAAc,EAAInE,EAAAA,SAAS,EAAK,EAE9CoE,EAAYjE,GAAWF,IAAW,QAAaA,EAAO,OAAS,EAC/DoE,EAAUN,EAAY,YAAYA,CAAS,GAAK,OAChDO,EAAUP,EAAY,YAAYA,CAAS,GAAK,OAEtD,OACIQ,EAAAA,KAAC,MAAA,CACG,UAAW,iBAAiBV,EAAW,gCAAkC,EAAE,IAAIC,EAAW,cAAgB,EAAE,IAAIE,GAAa,EAAE,GAC/H,MAAAC,EAGC,SAAA,CAAAR,GACGc,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACX,SAAA,CAAAA,EAAAA,KAAC,QAAA,CAAM,QAASF,EAAS,UAAU,0CAC9B,SAAA,CAAAZ,EACAC,GACGc,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAsB,cAAY,OAAO,SAAA,GAAA,CAEzD,CAAA,EAER,EAGCZ,GACGW,EAAAA,KAAC,OAAA,CACG,UAAU,uBACV,aAAc,IAAMJ,EAAe,EAAI,EACvC,aAAc,IAAMA,EAAe,EAAK,EACxC,QAAS,IAAMA,EAAe,EAAI,EAClC,OAAQ,IAAMA,EAAe,EAAK,EAElC,SAAA,CAAAK,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,UAAU,0KACV,aAAY,SAASZ,CAAO,GAC5B,SAAU,EACb,SAAA,GAAA,CAAA,EAGAM,GACGK,EAAAA,KAAC,MAAA,CACG,KAAK,UACL,UAAU,6IAET,SAAA,CAAAX,EACDY,EAAAA,IAAC,MAAA,CAAI,UAAU,2FAAA,CAA4F,CAAA,CAAA,CAAA,CAC/G,CAAA,CAAA,CAER,EAER,EAIJA,EAAAA,IAAC,MAAA,CAAI,GAAIH,EAAU,SAAAf,CAAA,CAAS,EAG3Bc,GACGI,EAAAA,IAAC,MAAA,CACI,WAAO,IAAI,CAACC,EAAOC,IAChBF,EAAAA,IAAC,IAAA,CAEG,GAAIE,IAAQ,EAAIJ,EAAU,OAC1B,UAAU,4BACV,KAAK,QAEJ,SAAAG,CAAA,EALI,GAAGA,CAAK,IAAIC,CAAG,EAAA,CAO3B,EACL,EAIHf,GAAY,CAACS,SAAc,IAAA,CAAE,UAAU,6BAA8B,SAAAT,CAAA,CAAS,CAAA,CAAA,CAAA,CAG3F,CC9FA,MAAMgB,GACF,oMAEG,SAASC,EAAU,CACtB,MAAA1D,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAAkB,EACA,UAAAC,EAAY,OACZ,SAAAlB,EACA,OAAAmB,EACA,OAAAC,EACA,UAAAC,EACA,UAAAnB,CACJ,EAAmB,CAIf,MAAMoB,EACF,GAAGT,EAAgB,IAJCd,EAAW,4CAA8C,EAIvC,IAHtBoB,EAAS,iBAAmB,EAGS,IAFrCC,EAAS,iBAAmB,EAEwB,IAAIlB,GAAa,EAAE,GAAG,KAAA,EAExFqB,EACFb,EAAAA,IAAC,QAAA,CACG,KAAMQ,EACN,UAAWI,EACX,MAAO,CAAE,YAAa,MAAA,EACtB,MAAOlE,GAAS,GAChB,SAAWJ,GAAM+D,EAAS/D,EAAE,OAAO,KAAK,EACxC,QAAUA,GAAM,CACZA,EAAE,OAAO,MAAM,YAAc,kCACjC,EACA,OAASA,GAAM,CACXA,EAAE,OAAO,MAAM,YAAc,GAC7BgE,GAAA,MAAAA,GACJ,EACA,SAAAjB,EACA,YAAAkB,EACA,SAAAjB,EACA,UAAAqB,EACA,gBAAetB,GAAY,OAC3B,gBAAeC,GAAY,MAAA,CAAA,EAInC,OAAImB,GAAUC,EAENX,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACV,SAAA,CAAAU,GACGT,EAAAA,IAAC,OAAA,CAAK,UAAU,gHACX,SAAAS,EACL,EAEHI,EACAH,GACGV,EAAAA,IAAC,OAAA,CAAK,UAAU,gHACX,SAAAU,CAAA,CACL,CAAA,EAER,EAIDG,CACX,CC9DA,MAAMV,GACF,sMAEG,SAASW,GAAY,CACxB,MAAApE,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAAkB,EACA,IAAAQ,EACA,IAAAC,EACA,KAAAC,EAAO,EACP,UAAAC,EACA,SAAA5B,EACA,OAAAmB,EACA,OAAAC,EACA,UAAAlB,CACJ,EAAqB,CAIjB,MAAMoB,EACF,GAAGT,EAAgB,IAJCd,EAAW,4CAA8C,EAIvC,IAHtBoB,EAAS,iBAAmB,EAGS,IAFrCC,EAAS,iBAAmB,EAEwB,IAAIlB,GAAa,EAAE,GAAG,KAAA,EAE9F,SAAS2B,EAAa7E,EAAwC,CAC1D,MAAM8E,EAAM9E,EAAE,OAAO,MACrB,GAAI8E,IAAQ,GAAI,CACZf,EAAS,IAAI,EACb,MACJ,CACA,IAAIgB,EAAM,OAAO,WAAWD,CAAG,EAC3B,OAAO,MAAMC,CAAG,IAChBH,IAAc,SACdG,EAAM,OAAO,WAAWA,EAAI,QAAQH,CAAS,CAAC,GAElDb,EAASgB,CAAG,EAChB,CAEA,MAAMR,EACFb,EAAAA,IAAC,QAAA,CACG,KAAK,SACL,UAAWY,EACX,MAAOlE,GAAS,GAChB,SAAUyE,EACV,QAAU7E,GAAM,CACZA,EAAE,OAAO,MAAM,YAAc,kCACjC,EACA,OAASA,GAAM,CACXA,EAAE,OAAO,MAAM,YAAc,GAC7BgE,GAAA,MAAAA,GACJ,EACA,SAAAjB,EACA,YAAAkB,EACA,IAAAQ,EACA,IAAAC,EACA,KAAAC,EACA,SAAA3B,EACA,gBAAeD,GAAY,OAC3B,gBAAeC,GAAY,MAAA,CAAA,EAInC,OAAImB,GAAUC,EAENX,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACV,SAAA,CAAAU,GACGT,EAAAA,IAAC,OAAA,CAAK,UAAU,gHACX,SAAAS,EACL,EAEHI,EACAH,GACGV,EAAAA,IAAC,OAAA,CAAK,UAAU,gHACX,SAAAU,CAAA,CACL,CAAA,EAER,EAIDG,CACX,CClFA,MAAMS,GACF,iNAEG,SAASC,GAAc,CAC1B,MAAA7E,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAAkB,EACA,KAAAiB,EAAO,EACP,SAAAlC,EACA,WAAAmC,EACA,UAAAd,EACA,UAAAnB,CACJ,EAAuB,CACnB,MAAMkC,EAAcrG,EAAAA,OAA4B,IAAI,EAE9CsG,EAAelF,EAAAA,YAAY,IAAM,CACnC,GAAI,CAACgF,GAAc,CAACC,EAAY,QAAS,OACzC,MAAME,EAAKF,EAAY,QACvBE,EAAG,MAAM,OAAS,OAClBA,EAAG,MAAM,OAAS,GAAGA,EAAG,YAAY,IACxC,EAAG,CAACH,CAAU,CAAC,EAEfI,EAAAA,UAAU,IAAM,CACZF,EAAA,CACJ,EAAG,CAACjF,EAAOiF,CAAY,CAAC,EAIxB,MAAMG,EACF,GAAGR,EAAW,IAHMjC,EAAW,4CAA8C,EAG5C,IAFXoC,EAAa,8BAAgC,EAEb,IAAIjC,GAAa,EAAE,GAAG,KAAA,EAEhF,OACIQ,EAAAA,IAAC,WAAA,CACG,IAAK0B,EACL,UAAWI,EACX,MAAOpF,GAAS,GAChB,SAAWJ,GAAM,CACb+D,EAAS/D,EAAE,OAAO,KAAK,CAC3B,EACA,QAAUA,GAAM,CACZA,EAAE,OAAO,MAAM,YAAc,kCACjC,EACA,OAASA,GAAM,CACXA,EAAE,OAAO,MAAM,YAAc,GAC7BgE,GAAA,MAAAA,GACJ,EACA,SAAAjB,EACA,YAAAkB,EACA,KAAAiB,EACA,SAAAlC,EACA,UAAAqB,EACA,gBAAetB,GAAY,OAC3B,gBAAeC,GAAY,MAAA,CAAA,CAGvC,CCnDO,SAASyC,GAAY,CACxB,MAAArF,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAAkB,EAAc,YACd,QAAAyB,EACA,SAAAC,EAAW,GACX,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,UAAA3C,CACJ,EAAqB,CACjB,KAAM,CAAC4C,EAAQC,CAAS,EAAI7G,EAAAA,SAAS,EAAK,EACpC,CAAC8G,EAAQC,CAAS,EAAI/G,EAAAA,SAAS,EAAE,EACjC,CAACgH,EAAkBC,CAAmB,EAAIjH,EAAAA,SAAS,EAAE,EACrDkH,EAAerH,EAAAA,OAAuB,IAAI,EAC1CsH,EAAiBtH,EAAAA,OAAyB,IAAI,EAE9CuH,EACElG,GAAU,KAAoC,CAAA,EAC9C,MAAM,QAAQA,CAAK,EAAUA,EAC1B,CAACA,CAAkC,EAGxCmG,GAAgB,IAAM,CAExB,GADID,EAAe,SAAW,GAC1BX,EAAU,MAAO,GACrB,MAAMa,EAAMd,EAAQ,KAAMe,GAAMA,EAAE,QAAUH,EAAe,CAAC,CAAC,EAC7D,OAAOE,GAAA,YAAAA,EAAK,QAAS,OAAOF,EAAe,CAAC,CAAC,CACjD,GAAA,EAEMI,EAAkBV,EAClBN,EAAQ,OAAQe,GAAMA,EAAE,MAAM,YAAA,EAAc,SAAST,EAAO,YAAA,CAAa,CAAC,EAC1EN,EAEN,SAASiB,EAAWzI,EAAuC,CACvD,OAAOoI,EAAe,SAASpI,CAAC,CACpC,CAEA,SAAS0I,EAAS1I,EAAsC,CACpD,MAAMsI,EAAMd,EAAQ,KAAMe,GAAMA,EAAE,QAAUvI,CAAC,EAC7C,OAAOsI,GAAA,YAAAA,EAAK,QAAS,OAAOtI,CAAC,CACjC,CAEA,MAAM2I,EAAO1G,EAAAA,YAAY,IAAM,CAC3B4F,EAAU,EAAI,EACdI,EAAoB,EAAE,EACtBF,EAAU,EAAE,EACZ,WAAW,IAAA,OAAM,OAAAa,EAAAT,EAAe,UAAf,YAAAS,EAAwB,SAAS,CAAC,CACvD,EAAG,CAAA,CAAE,EAECC,EAAQ5G,EAAAA,YAAY,IAAM,CAC5B4F,EAAU,EAAK,EACfE,EAAU,EAAE,EACZjC,GAAA,MAAAA,GACJ,EAAG,CAACA,CAAM,CAAC,EAEX,SAASgD,GAAS,CACVjE,IACA+C,EACAiB,EAAA,EAEAF,EAAA,EAER,CAEA,SAASI,EAAaC,EAAsB,CACxC,GAAI,CAAAA,EAAO,SACX,GAAIvB,EAAU,CACV,MAAMwB,EAAM,CAAC,GAAGb,CAAc,EACxB1C,EAAMuD,EAAI,QAAQD,EAAO,KAAK,EAChCtD,GAAO,EAAGuD,EAAI,OAAOvD,EAAK,CAAC,EAC1BuD,EAAI,KAAKD,EAAO,KAAK,EAC1BnD,EAASoD,CAAG,CAChB,MACIpD,EAASmD,EAAO,KAAK,EACrBH,EAAA,CAER,CAEA,SAASK,EAAUlJ,EAA8B,CAC7C,GAAI6E,EAAU,OACd,MAAMoE,EAAMb,EAAe,OAAQe,GAAOA,IAAOnJ,CAAC,EAClD6F,EAASoD,EAAI,OAASA,EAAMxB,EAAW,CAAA,EAAK,IAAI,CACpD,CAEA,SAAS2B,EAAetH,EAAqB,CACzCA,EAAE,gBAAA,EACF+D,EAAS4B,EAAW,CAAA,EAAK,IAAI,CACjC,CAEA,SAAS4B,EAAUvH,EAAwB,CACvC,GAAI,CAAC8F,EAAQ,EACL9F,EAAE,MAAQ,SAAWA,EAAE,MAAQ,KAAOA,EAAE,MAAQ,eAChDA,EAAE,eAAA,EACF6G,EAAA,GAEJ,MACJ,CACA,OAAQ7G,EAAE,IAAA,CACN,IAAK,YACDA,EAAE,eAAA,EACFmG,EAAqB9F,GAAS,KAAK,IAAIA,EAAO,EAAGqG,EAAgB,OAAS,CAAC,CAAC,EAC5E,MACJ,IAAK,UACD1G,EAAE,eAAA,EACFmG,EAAqB9F,GAAS,KAAK,IAAIA,EAAO,EAAG,CAAC,CAAC,EACnD,MACJ,IAAK,QACDL,EAAE,eAAA,EACEkG,GAAoB,GAAKQ,EAAgBR,CAAgB,GACzDe,EAAaP,EAAgBR,CAAgB,CAAC,EAElD,MACJ,IAAK,SACDlG,EAAE,eAAA,EACF+G,EAAA,EACA,KAAA,CAEZ,CAGAxB,OAAAA,EAAAA,UAAU,IAAM,CACZ,SAASiC,EAAmBC,EAAmB,CACvCrB,EAAa,SAAW,CAACA,EAAa,QAAQ,SAASqB,EAAM,MAAc,GAC3EV,EAAA,CAER,CACA,gBAAS,iBAAiB,YAAaS,CAAkB,EAClD,IAAM,SAAS,oBAAoB,YAAaA,CAAkB,CAC7E,EAAG,CAACT,CAAK,CAAC,EAGNtD,EAAAA,KAAC,MAAA,CACG,IAAK2C,EACL,UAAW,mBAAmBrD,EAAW,gCAAkC,EAAE,IAAIG,GAAa,EAAE,GAGhG,SAAA,CAAAO,EAAAA,KAAC,MAAA,CACG,KAAK,WACL,gBAAeqC,EACf,gBAAc,UACd,SAAU,EACV,UAAW,sJAAsJA,EAAS,0BAA4B,EAAE,IAAI/C,EAAW,kCAAoC,EAAE,GAC7P,MAAO+C,EAAS,CAAE,YAAa,kCAAA,EAAuC,CAAA,EACtE,QAASkB,EACT,UAAWO,EAEX,SAAA,CAAA9D,EAAAA,KAAC,MAAA,CAAI,UAAU,2CAEV,SAAA,CAAAkC,GACGW,EAAe,IAAKoB,GAChBjE,EAAAA,KAAC,OAAA,CAEG,UAAU,6DACV,MAAO,CACH,gBACI,kEACJ,MAAO,kCAAA,EAGV,SAAA,CAAAmD,EAASc,CAAG,EACbhE,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,UAAU,SACV,MAAO,CAAE,MAAO,kCAAA,EAChB,aAAW,SACX,QAAU1D,GAAM,CACZA,EAAE,gBAAA,EACFoH,EAAUM,CAAG,CACjB,EACH,SAAA,GAAA,CAAA,CAED,CAAA,EApBK,OAAOA,CAAG,CAAA,CAsBtB,EAEJ,CAAC/B,GAAYY,SAAiB,OAAA,CAAK,UAAU,WAAY,SAAAA,EAAa,EAEtED,EAAe,SAAW,GAAK,CAACX,GAC7BjC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAO,CAAA,CAAY,EAEhD0B,GAAYW,EAAe,SAAW,SAClC,OAAA,CAAK,UAAU,gBAAiB,SAAArC,CAAA,CAAY,CAAA,EAErD,EAEC4B,GAAaS,EAAe,OAAS,GAAK,CAACvD,GACxCW,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,UAAU,iFACV,aAAW,kBACX,QAAS4D,EACZ,SAAA,GAAA,CAAA,EAKL5D,EAAAA,IAAC,MAAA,CACG,UAAW,yEAAyEoC,EAAS,aAAe,EAAE,GAC9G,QAAQ,YACR,KAAK,eACL,cAAY,OAEZ,SAAApC,EAAAA,IAAC,OAAA,CACG,SAAS,UACT,EAAE,sIACF,SAAS,SAAA,CAAA,CACb,CAAA,CACJ,CAAA,CAAA,EAIHoC,GACGrC,EAAAA,KAAC,MAAA,CAAI,UAAU,iFAEV,SAAA,CAAAmC,GACGlC,EAAAA,IAAC,MAAA,CAAI,UAAU,+BACX,SAAAA,EAAAA,IAAC,QAAA,CACG,IAAK2C,EACL,KAAK,OACL,UAAU,8FACV,YAAY,YACZ,MAAOL,EACP,SAAWhG,GAAMiG,EAAUjG,EAAE,OAAO,KAAK,EACzC,UAAWuH,EACX,QAAUvH,GAAM,CACZA,EAAE,OAAO,MAAM,YAAc,kCACjC,EACA,OAASA,GAAM,CACXA,EAAE,OAAO,MAAM,YAAc,EACjC,CAAA,CAAA,EAER,EAGJyD,EAAAA,KAAC,KAAA,CAAG,KAAK,UAAU,UAAU,8BACxB,SAAA,CAAAiD,EAAgB,IAAI,CAACQ,EAAQtD,IAC1BF,EAAAA,IAAC,KAAA,CAEG,KAAK,SACL,gBAAeiD,EAAWO,EAAO,KAAK,EACtC,UAAW,mEACNP,EAAWO,EAAO,KAAK,EAAsB,GAAlB,eAChC,IAAIhB,IAAqBtC,EAAM,cAAgB,EAAE,IAC7CsD,EAAO,SACD,gCACA,kBACV,GACA,MACIP,EAAWO,EAAO,KAAK,EACjB,CACI,gBACI,iEACJ,MAAO,kCAAA,EAEX,CAAA,EAEV,QAAS,IAAMD,EAAaC,CAAM,EAClC,aAAc,IAAMf,EAAoBvC,CAAG,EAE1C,SAAAsD,EAAO,KAAA,EAtBH,OAAOA,EAAO,KAAK,CAAA,CAwB/B,EACAR,EAAgB,SAAW,SACvB,KAAA,CAAG,UAAU,kCAAkC,SAAA,kBAAA,CAAgB,CAAA,CAAA,CAExE,CAAA,CAAA,CACJ,CAAA,CAAA,CAAA,CAIhB,CC5RO,SAASiB,GAAc,CAC1B,MAAAvH,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,MAAAJ,EACA,UAAAO,CACJ,EAAuB,CACnB,SAAS8D,GAAS,CACVjE,GACJgB,EAAS,CAAC3D,CAAK,CACnB,CAEA,SAASmH,EAAUvH,EAAwB,EACnCA,EAAE,MAAQ,KAAOA,EAAE,MAAQ,WAC3BA,EAAE,eAAA,EACFgH,EAAA,EAER,CAEA,OACIvD,EAAAA,KAAC,QAAA,CACG,UAAW,8CAA8CV,EAAW,gCAAkC,gBAAgB,IAAIG,GAAa,EAAE,GAEzI,SAAA,CAAAQ,EAAAA,IAAC,QAAA,CACG,KAAK,WACL,QAAStD,GAAS,GAClB,SAAU,IAAM,CAAC,EACjB,OAAA4D,EACA,SAAAjB,EACA,UAAU,SAAA,CAAA,EAEdW,EAAAA,IAAC,MAAA,CACG,KAAK,WACL,eAActD,EACd,gBAAe2C,GAAY,OAC3B,SAAU,EACV,UAAW,qGACP3C,EAAQ,aAAe,0BAC3B,GACA,MACIA,EACM,CACI,YAAa,mCACb,gBAAiB,kCAAA,EAErB,CAAA,EAEV,QAAUJ,GAAM,CACZA,EAAE,eAAA,EACFgH,EAAA,CACJ,EACA,UAAWO,EAEV,SAAAnH,GACGsD,EAAAA,IAAC,MAAA,CACG,UAAU,UACV,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAY,OAEZ,eAAC,OAAA,CAAK,EAAE,eAAe,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CAAA,CACxE,CAAA,EAGPf,GAASe,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAf,CAAA,CAAM,CAAA,CAAA,CAAA,CAGrE,CC9DO,SAASiF,GAAW,CACvB,KAAAzJ,EACA,MAAAiC,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,QAAA2C,EACA,OAAAmC,EAAS,GACT,UAAA3E,CACJ,EAAoB,CAChB,SAASyD,EAAWzI,EAAuC,CACvD,OAAOkC,IAAUlC,CACrB,CAEA,SAAS4J,EAAiBZ,EAA8B,CACpD,OAAOnE,IAAa,IAAQ,CAAC,CAACmE,EAAO,QACzC,CAEA,SAASD,EAAaC,EAAqB,CACnCY,EAAiBZ,CAAM,GAC3BnD,EAASmD,EAAO,KAAK,CACzB,CAEA,SAASK,EAAUvH,EAAwBkH,EAAqB,EACxDlH,EAAE,MAAQ,KAAOA,EAAE,MAAQ,WAC3BA,EAAE,eAAA,EACFiH,EAAaC,CAAM,EAE3B,CAEA,OACIxD,EAAAA,IAAC,MAAA,CACG,KAAK,aACL,UAAW,GAAGmE,EAAS,uBAAyB,qBAAqB,IAAI3E,GAAa,EAAE,GAEvF,SAAAwC,EAAQ,IAAKwB,GACVzD,EAAAA,KAAC,QAAA,CAEG,UAAW,8CACPqE,EAAiBZ,CAAM,EACjB,gCACA,gBACV,GAEA,SAAA,CAAAxD,EAAAA,IAAC,QAAA,CACG,KAAK,QACL,QAASiD,EAAWO,EAAO,KAAK,EAChC,SAAUY,EAAiBZ,CAAM,EACjC,UAAU,UACV,KAAA/I,EACA,SAAU,IAAM8I,EAAaC,CAAM,EACnC,OAAAlD,CAAA,CAAA,EAEJN,EAAAA,IAAC,MAAA,CACG,KAAK,QACL,eAAciD,EAAWO,EAAO,KAAK,EACrC,gBAAeY,EAAiBZ,CAAM,GAAK,OAC3C,SAAU,EACV,UAAW,0GACNP,EAAWO,EAAO,KAAK,EAAwB,GAApB,iBAChC,GACA,MACIP,EAAWO,EAAO,KAAK,EACjB,CAAE,YAAa,kCAAA,EACf,CAAA,EAEV,QAAS,IAAMD,EAAaC,CAAM,EAClC,UAAYlH,GAAMuH,EAAUvH,EAAGkH,CAAM,EAEpC,SAAAP,EAAWO,EAAO,KAAK,GACpBxD,EAAAA,IAAC,MAAA,CACG,UAAU,2BACV,MAAO,CACH,gBAAiB,kCAAA,CACrB,CAAA,CACJ,CAAA,EAGRA,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,WAAO,KAAA,CAAM,CAAA,CAAA,EAzCjD,OAAOwD,EAAO,KAAK,CAAA,CA2C/B,CAAA,CAAA,CAGb,CC1FO,SAASa,GAAY,CACxB,MAAA3H,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAAiF,EACA,cAAAC,EACA,UAAA/E,CACJ,EAAqB,CACjB,SAAS8D,GAAS,CACVjE,GACJgB,EAAS,CAAC3D,CAAK,CACnB,CAEA,SAASmH,EAAUvH,EAAwB,EACnCA,EAAE,MAAQ,KAAOA,EAAE,MAAQ,WAC3BA,EAAE,eAAA,EACFgH,EAAA,EAER,CAEA,OACIvD,EAAAA,KAAC,QAAA,CACG,UAAW,8CAA8CV,EAAW,gCAAkC,gBAAgB,IAAIG,GAAa,EAAE,GAExI,SAAA,CAAA+E,GAAiBvE,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAuE,EAAc,EACzEvE,EAAAA,IAAC,QAAA,CACG,KAAK,WACL,QAAStD,GAAS,GAClB,SAAU4G,EACV,OAAAhD,EACA,SAAAjB,EACA,UAAU,SAAA,CAAA,EAEdW,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,KAAK,SACL,eAActD,EACd,gBAAe2C,GAAY,OAC3B,SAAU,EACV,UAAW,wJACN3C,EAAwB,GAAhB,aACb,IAAI2C,EAAW,sBAAwB,wDAAwD,GAC/F,MAAO3C,EAAQ,CAAE,gBAAiB,kCAAA,EAAuC,CAAA,EACzE,QAAS4G,EACT,UAAWO,EAEX,SAAA7D,EAAAA,IAAC,OAAA,CACG,UAAW,oJACPtD,EAAQ,gBAAkB,eAC9B,GACA,cAAY,MAAA,CAAA,CAChB,CAAA,EAEH4H,GAAetE,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,SAAAsE,CAAA,CAAY,CAAA,CAAA,CAAA,CAGjF,CCrDO,SAASE,GAAY,CACxB,MAAA9H,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,IAAA0B,EAAM,EACN,IAAAC,EAAM,IACN,KAAAC,EAAO,EACP,YAAAvB,EAAc,GACd,UAAAF,CACJ,EAAqB,CACjB,KAAM,CAACiF,EAAUC,CAAW,EAAIlJ,EAAAA,SAAS,EAAK,EAExCmJ,EAAejI,GAASqE,EACxB6D,EAAQ5D,EAAMD,EACd8D,EAAaD,IAAU,EAAI,GAAMD,EAAe5D,GAAO6D,EAAS,IAEtE,OACI7E,EAAAA,KAAC,MAAA,CACG,UAAW,wBAAwBV,EAAW,gCAAkC,EAAE,IAAIG,GAAa,EAAE,GAGpG,SAAA,CAAAE,GAAe+E,GACZzE,EAAAA,IAAC,MAAA,CACG,UAAU,6GACV,MAAO,CAAE,KAAM,QAAQ6E,CAAU,WAAA,EAEhC,SAAAF,CAAA,CAAA,EAGT3E,EAAAA,IAAC,QAAA,CACG,KAAK,QACL,MAAO2E,EACP,SAAWrI,GAAM+D,EAAS,OAAO,WAAW/D,EAAE,OAAO,KAAK,CAAC,EAC3D,YAAa,IAAMoI,EAAY,EAAI,EACnC,UAAW,IAAMA,EAAY,EAAK,EAClC,aAAc,IAAMA,EAAY,EAAI,EACpC,WAAY,IAAMA,EAAY,EAAK,EACnC,QAAS,IAAMA,EAAY,EAAI,EAC/B,OAASpI,GAAM,CACXoI,EAAY,EAAK,EACjBpE,GAAA,MAAAA,GACJ,EACA,SAAAjB,EACA,IAAA0B,EACA,IAAAC,EACA,KAAAC,EACA,gBAAe0D,EACf,gBAAe5D,EACf,gBAAeC,EACf,gBAAe3B,GAAY,OAC3B,UAAU,yJACV,MAAO,CAAE,YAAa,kCAAA,CAAmC,CAAA,EAG7DU,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACX,SAAA,CAAAC,EAAAA,IAAC,QAAM,SAAAe,CAAA,CAAI,EACXf,EAAAA,IAAC,QAAM,SAAAgB,CAAA,CAAI,CAAA,CAAA,CACf,CAAA,CAAA,CAAA,CAGZ,CChBA,SAAS8D,EAAaC,EAAqB,CACvC,OAAOA,EAAI,QAAQ,SAAWC,GAAM,IAAIA,EAAE,YAAA,CAAa,EAAE,CAC7D,CAEA,SAASC,GAAaC,EAA0C,CAC5D,GAAI,CAACA,EAAO,MAAO,CAAA,EACnB,MAAMC,EAA+B,CAAA,EAErC,GAAID,EAAM,OACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,MAAM,EAC9CxI,IAAOyI,EAAK,cAAcL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAG7D,GAAIwI,EAAM,WACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,UAAU,EAClDxI,IAAOyI,EAAK,QAAQL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAGvD,GAAIwI,EAAM,QACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,OAAO,EAC/CxI,IAAOyI,EAAK,QAAQL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAGvD,GAAIwI,EAAM,QACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,OAAO,EAC/CxI,IAAOyI,EAAK,eAAeL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAG9D,GAAIwI,EAAM,QACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,OAAO,EAC/CxI,IAAOyI,EAAK,eAAeL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAG9D,GAAIwI,EAAM,YACN,SAAW,CAACE,EAAK1I,CAAK,IAAK,OAAO,QAAQwI,EAAM,WAAW,EACnDxI,IAAOyI,EAAK,mBAAmBL,EAAaM,CAAG,CAAC,EAAE,EAAI1I,GAGlE,OAAIwI,EAAM,SACN,OAAO,OAAOC,EAAMD,EAAM,OAAO,EAG9BC,CACX,CAMA,SAASE,EACLpK,EACAmK,EACAE,EACAC,EACAC,EACM,SACN,MAAMC,EAAexK,EAAO,aAC5B,GAAI,CAACwK,EAAc,OAAOD,EAC1B,MAAME,EAAMD,EAAaH,CAAM,EAC/B,IAAIlC,EAAAsC,GAAA,YAAAA,EAAK,WAAL,MAAAtC,EAAgBgC,GAAM,OAAOM,EAAI,SAASN,CAAG,EACjD,MAAMO,EAAKF,EAAaF,CAAc,EACtC,QAAOK,EAAAD,GAAA,YAAAA,EAAI,WAAJ,YAAAC,EAAeR,KAAQI,CAClC,CAEA,SAASK,EACL5K,EACAmK,EACAE,EACAC,EACAC,EACM,CACN,MAAMC,EAAexK,EAAO,aAC5B,GAAI,CAACwK,EAAc,OAAOD,EAC1B,MAAME,EAAMD,EAAaH,CAAM,EAC/B,GAAII,GAAA,MAAAA,EAAMN,GAAM,OAAOM,EAAIN,CAAG,EAC9B,MAAMO,EAAKF,EAAaF,CAAc,EACtC,OAAOI,GAAA,YAAAA,EAAKP,KAAQI,CACxB,CAMA,SAASM,EACL9D,EAIY,CACZ,OAAI,MAAM,QAAQA,CAAO,EAAUA,EAC5B,CAAA,CACX,CAEA,SAAS+D,GAAqB,CAAE,MAAA9L,EAAO,MAAAyC,EAAO,SAAA2D,EAAU,OAAAC,EAAQ,SAAAjB,GAAiC,CAC7F,OAAQpF,EAAM,KAAA,CACV,IAAK,OACD,OACI+F,EAAAA,IAACI,EAAA,CACG,MAAO,OAAO1D,GAAS,EAAE,EACzB,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAapF,EAAM,YACnB,UAAWA,EAAM,UACjB,SAAUA,EAAM,QAAA,CAAA,EAG5B,IAAK,SACD,OACI+F,EAAAA,IAACc,GAAA,CACG,MAAApE,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAapF,EAAM,YACnB,IAAKA,EAAM,IACX,IAAKA,EAAM,IACX,KAAMA,EAAM,KACZ,SAAUA,EAAM,QAAA,CAAA,EAG5B,IAAK,WACD,OACI+F,EAAAA,IAACuB,GAAA,CACG,MAAO,OAAO7E,GAAS,EAAE,EACzB,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAapF,EAAM,YACnB,KAAMA,EAAM,KACZ,SAAUA,EAAM,QAAA,CAAA,EAG5B,IAAK,SACD,OACI+F,EAAAA,IAAC+B,GAAA,CACG,MAAArF,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAapF,EAAM,YACnB,QAAS6L,EAAe7L,EAAM,OAAO,CAAA,CAAA,EAGjD,IAAK,WACD,OACI+F,EAAAA,IAACiE,GAAA,CACG,MAAO,EAAQvH,EACf,SAAA2D,EACA,OAAAC,EACA,SAAAjB,CAAA,CAAA,EAGZ,IAAK,QACD,OACIW,EAAAA,IAACkE,GAAA,CACG,KAAMjK,EAAM,KACZ,MAAAyC,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,QAASyG,EAAe7L,EAAM,OAAO,CAAA,CAAA,EAGjD,IAAK,SACD,OACI+F,EAAAA,IAACqE,GAAA,CACG,MAAO,EAAQ3H,EACf,SAAA2D,EACA,OAAAC,EACA,SAAAjB,CAAA,CAAA,EAGZ,IAAK,SACD,OACIW,EAAAA,IAACwE,GAAA,CACG,MAAA9H,EACA,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,IAAKpF,EAAM,IACX,IAAKA,EAAM,IACX,KAAMA,EAAM,IAAA,CAAA,EAGxB,QACI,OACI+F,EAAAA,IAACI,EAAA,CACG,MAAO,OAAO1D,GAAS,EAAE,EACzB,SAAA2D,EACA,OAAAC,EACA,SAAAjB,EACA,YAAapF,EAAM,WAAA,CAAA,CACvB,CAGhB,CAMA,SAAS+L,EAAaC,EAAwD,CAC1E,OAAIA,IAAS,OAAe,CAAE,WAAY,QAAA,EACtCA,IAAS,OAAe,CAAE,WAAY,MAAA,EACtC,OAAOA,GAAS,SAAiB,CAAE,WAAY,QAAQA,CAAI,WAAWA,CAAI,EAAA,EACvE,CAAE,WAAY,mBAAA,CACzB,CAEA,SAASC,GACLjM,EACAkM,EACAC,EACS,CACT,MAAMlJ,EAAciJ,EAAK,OAAOlM,EAAM,IAAI,GAAK,CAAA,EACzCoF,EAAWpF,EAAM,WAAa,IAAQ,GAEtCoM,EAA6B,CAC/B,MAAApM,EACA,MAAOkM,EAAK,OAAOlM,EAAM,IAAI,EAC7B,SAAWO,GAAe2L,EAAK,cAAclM,EAAM,KAAMO,CAAC,EAC1D,OAAQ,IAAM2L,EAAK,cAAclM,EAAM,IAAI,EAC3C,OAAQiD,EACR,SAAAmC,CAAA,EAIEiH,GADkBF,GAAA,YAAAA,EAAanM,EAAM,QACD8L,GAE1C,OACI/F,EAAAA,IAAChB,GAAA,CAEG,MAAO/E,EAAM,MACb,SAAUA,EAAM,SAChB,OAAQiD,EACR,QAASiJ,EAAK,QAAQlM,EAAM,IAAI,EAChC,SAAUA,EAAM,SAChB,QAASA,EAAM,QACf,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,UAAWA,EAAM,KACjB,UAAWA,EAAM,UACjB,MAAOA,EAAM,MAEb,SAAA+F,EAAAA,IAACsG,EAAA,CAAgB,GAAGD,CAAA,CAAO,CAAA,EAbtBpM,EAAM,IAAA,CAgBvB,CAEA,SAASsM,GACLC,EACAL,EACAC,EACS,CAOT,MAAMK,EANmC,CACrC,MAAO,cACP,OAAQ,eACR,IAAK,YACL,QAAS,eAAA,EAEeD,EAAK,OAAS,SAAS,GAAK,gBAClDE,EACFF,EAAK,MAAQ,OACP,OAAOA,EAAK,KAAQ,SAChB,GAAGA,EAAK,GAAG,KACXA,EAAK,IACT,OAEV,OACIxG,EAAAA,IAAC,MAAA,CACG,UAAW,qBAAqByG,CAAU,IAAID,EAAK,WAAa,EAAE,GAClE,MAAO,CAAE,IAAKE,CAAA,EACd,KAAK,QAEJ,SAAAF,EAAK,SAAS,IAAI,CAACG,EAAOC,IACvB5G,EAAAA,IAAC,MAAA,CAEG,MAAOgG,EAAaa,cAAYF,CAAK,EAAIA,EAAM,KAAO,MAAS,EAE9D,SAAAG,EAAWH,EAAOR,EAAMC,CAAU,CAAA,EAH9BS,EAAAA,YAAYF,CAAK,EAAIA,EAAM,KAAO,aAAaC,CAAC,EAAA,CAK5D,CAAA,CAAA,CAGb,CAEA,SAASG,GAAY,CACjB,KAAAP,EACA,KAAAL,EACA,WAAAC,CACJ,EAIuB,CACnB,KAAM,CAACY,EAAaC,CAAc,EAAIzL,EAAAA,SAASgL,EAAK,WAAa,EAAK,EAChEU,EAAWV,EAAK,MAChB,YAAYA,EAAK,MAAM,YAAA,EAAc,QAAQ,OAAQ,GAAG,CAAC,GACzD,OAEN,SAASlD,GAAS,CACVkD,EAAK,aAAaS,EAAe,CAACD,CAAW,CACrD,CAEA,MAAMG,EAAYX,EAAK,YAAc,SAAW,MAEhD,OACIzG,EAAAA,KAAC,WAAA,CACG,UAAW,8CAA8CyG,EAAK,WAAa,EAAE,GAC7E,kBAAiBU,EAGf,SAAA,EAAAV,EAAK,OAASA,EAAK,cACjBxG,EAAAA,IAAC,MAAA,CAAI,UAAU,qCACX,SAAAD,EAAAA,KAACoH,EAAA,CACG,KAAMX,EAAK,YAAc,SAAW,OACpC,UAAW,sDAAsDA,EAAK,YAAc,gFAAkF,EAAE,GACxK,gBAAeA,EAAK,YAAc,CAACQ,EAAc,OACjD,gBAAeR,EAAK,YAAc,iBAAiBU,CAAQ,GAAK,OAChE,QAAS5D,EAET,SAAA,CAAAvD,OAAC,MAAA,CACI,SAAA,CAAAyG,EAAK,OACFxG,EAAAA,IAAC,SAAA,CACG,GAAIkH,EACJ,UAAU,sCAET,SAAAV,EAAK,KAAA,CAAA,EAGbA,EAAK,aACFxG,EAAAA,IAAC,KAAE,UAAU,+BAAgC,WAAK,WAAA,CAAY,CAAA,EAEtE,EACCwG,EAAK,aACFxG,EAAAA,IAAC,MAAA,CACG,UAAW,oEAAoEgH,EAAc,GAAK,YAAY,GAC9G,MAAM,6BACN,QAAQ,YACR,KAAK,eACL,cAAY,OAEZ,SAAAhH,EAAAA,IAAC,OAAA,CACG,SAAS,UACT,EAAE,sIACF,SAAS,SAAA,CAAA,CACb,CAAA,CACJ,CAAA,CAAA,EAGZ,EAIH,CAACgH,GACEhH,EAAAA,IAAC,MAAA,CACG,GAAIwG,EAAK,YAAc,iBAAiBU,CAAQ,GAAK,OACrD,UAAU,MAET,SAAAV,EAAK,SAAS,IAAI,CAACG,EAAOC,IACvB5G,MAAC,OACI,SAAA8G,EAAWH,EAAOR,EAAMC,CAAU,GAD7BS,EAAAA,YAAYF,CAAK,EAAIA,EAAM,KAAO,eAAeC,CAAC,EAE5D,CACH,CAAA,CAAA,CACL,CAAA,CAAA,CAIhB,CAEA,SAASQ,GAAY,CACjB,KAAAZ,EACA,KAAAL,EACA,WAAAC,CACJ,EAIuB,CACnB,KAAM,CAACiB,EAAaC,CAAc,EAAI9L,EAAAA,SAAS,CAAC,EAC1C,CAAC+L,EAAgBC,CAAiB,EAAIhM,EAAAA,SAAsB,IAAI,GAAK,EAErEiM,EAAQjB,EAAK,MACbkB,EAAaD,EAAM,OACnBE,EAAcN,IAAgB,EAC9BO,EAAaP,IAAgBK,EAAa,EAEhD,SAASG,GAAS,CACVD,IACJJ,EAAmB7K,GAAS,CACxB,MAAM0B,EAAO,IAAI,IAAI1B,CAAI,EACzB,OAAA0B,EAAK,IAAIgJ,CAAW,EACbhJ,CACX,CAAC,EACDiJ,EAAgB3K,GAASA,EAAO,CAAC,EACrC,CAEA,SAASmL,GAAa,CACdH,GACJL,EAAgB3K,GAASA,EAAO,CAAC,CACrC,CAEA,SAASoL,EAASC,EAAe,CACzBxB,EAAK,QAAUwB,EAAQX,GAC3BC,EAAeU,CAAK,CACxB,CAEA,MAAMC,EAA4CR,EAAMJ,CAAW,EAEnE,cACK,MAAA,CAAI,UAAW,aAAab,EAAK,WAAa,EAAE,GAE7C,SAAA,CAAAxG,EAAAA,IAAC,OAAI,aAAW,aAAa,UAAU,mCACnC,eAAC,KAAA,CAAG,UAAU,0BACT,SAAAyH,EAAM,IAAI,CAACxG,EAAMf,IACdH,EAAAA,KAAC,KAAA,CAAoB,UAAU,oBAE3B,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,SAAUwG,EAAK,SAAW,IAAQtG,EAAMmH,EACxC,eAAcnH,IAAQmH,EAAc,OAAS,OAC7C,aAAY,QAAQnH,EAAM,CAAC,KAAKe,EAAK,KAAK,GAC1C,UAAW,6LACPsG,EAAe,IAAIrH,CAAG,GAAKA,IAAQmH,EAC7B,2CACAnH,IAAQmH,EACN,yCACA,YACZ,IAAIb,EAAK,SAAW,IAAQtG,EAAMmH,EAAc,qBAAuB,gCAAgC,GACvG,MACInH,IAAQmH,EACF,CACI,YAAa,mCACb,gBAAiB,kCAAA,EAErB,CAAA,EAEV,QAAS,IAAMU,EAAS7H,CAAG,EAE1B,SAAAqH,EAAe,IAAIrH,CAAG,GAAKA,IAAQmH,EAChCrH,EAAAA,IAAC,MAAA,CACG,UAAU,4CACV,MAAM,6BACN,QAAQ,YACR,KAAK,eACL,cAAY,OAEZ,SAAAA,EAAAA,IAAC,OAAA,CACG,SAAS,UACT,EAAE,+IACF,SAAS,SAAA,CAAA,CACb,CAAA,EAGJA,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAM,CAAA,CAAE,CAAA,CAAA,EAKtBA,EAAMuH,EAAM,OAAS,GAClBzH,EAAAA,IAAC,MAAA,CACG,UAAW,yDAAyDuH,EAAe,IAAIrH,CAAG,EAAI,eAAiB,aAAa,EAAA,CAAA,CAChI,CAAA,EA/CCe,EAAK,KAiDd,CACH,CAAA,CACL,CAAA,CACJ,EAGCgH,GACGlI,EAAAA,KAAC,MAAA,CAAI,UAAU,cACX,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCACT,SAAAiI,EAAgB,MACrB,EACCA,EAAgB,aACbjI,EAAAA,IAAC,KAAE,UAAU,6BAA8B,WAAgB,WAAA,CAAY,CAAA,EAE/E,EAIHiI,GACGjI,EAAAA,IAAC,MAAA,CACI,SAAAiI,EAAgB,SAAS,IAAI,CAACtB,EAAOC,IAClC5G,EAAAA,IAAC,MAAA,CACI,SAAA8G,EAAWH,EAAOR,EAAMC,CAAU,CAAA,EAD7BS,EAAAA,YAAYF,CAAK,EAAIA,EAAM,KAAO,cAAcC,CAAC,EAE3D,CACH,CAAA,CACL,EAIJ7G,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACX,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,SAAU2H,EACV,UAAU,gPACV,QAASG,EACZ,SAAA,UAAA,CAAA,EAGD/H,EAAAA,KAAC,OAAA,CAAK,UAAU,wBACX,SAAA,CAAAsH,EAAc,EAAE,MAAIK,CAAA,EACzB,EACEE,EAYE5H,MAAC,MAAA,CAAI,UAAU,UAAA,CAAW,EAX1BA,EAAAA,IAAC,SAAA,CACG,KAAK,SACL,UAAU,4IACV,MAAO,CACH,gBAAiB,kCAAA,EAErB,QAAS6H,EACZ,SAAA,MAAA,CAAA,CAIyB,CAAA,CAElC,CAAA,EACJ,CAER,CAEA,SAASK,GAAW,CAChB,KAAA1B,EACA,KAAAL,EACA,WAAAC,CACJ,EAIuB,CACnB,KAAM,CAAC+B,EAAaC,CAAc,EAAI5M,EAAAA,SAAS,CAAC,EAE1C6M,EAAO7B,EAAK,KACZ8B,EAAqCD,EAAKF,CAAW,EACrDI,EAAa,eAAeJ,CAAW,GAE7C,SAASK,EAAUR,EAAe,CAC9BI,EAAeJ,CAAK,CACxB,CAEA,OACIjI,EAAAA,KAAC,MAAA,CAAI,UAAWyG,EAAK,WAAa,GAE9B,SAAA,CAAAxG,EAAAA,IAAC,MAAA,CACG,UAAU,yCACV,KAAK,UACL,mBAAiB,aAEhB,SAAAqI,EAAK,IAAI,CAACI,EAAKvI,IACZH,EAAAA,KAAC,SAAA,CAEG,GAAI,UAAUG,CAAG,GACjB,KAAK,SACL,KAAK,MACL,gBAAeA,IAAQiI,EACvB,gBAAeI,EACf,SAAUrI,IAAQiI,EAAc,EAAI,GACpC,UAAW,mJACPjI,IAAQiI,EAAc,oCAAsC,EAChE,GACA,MACIjI,IAAQiI,EAAc,CAAE,MAAO,kCAAA,EAAuC,CAAA,EAE1E,QAAS,IAAMK,EAAUtI,CAAG,EAE3B,SAAA,CAAAuI,EAAI,MAEJvI,IAAQiI,GACLnI,EAAAA,IAAC,OAAA,CACG,UAAU,kEACV,MAAO,CACH,gBAAiB,kCAAA,CACrB,CAAA,CACJ,CAAA,EAvBCyI,EAAI,KAAA,CA0BhB,CAAA,CAAA,EAIJH,GACGtI,EAAAA,IAAC,MAAA,CACG,GAAIuI,EACJ,KAAK,WACL,kBAAiB,UAAUJ,CAAW,GACtC,SAAU,EACV,UAAU,OAET,SAAAG,EAAU,SAAS,IAAI,CAAC3B,EAAOC,IAC5B5G,MAAC,OACI,SAAA8G,EAAWH,EAAOR,EAAMC,CAAU,GAD7BS,EAAAA,YAAYF,CAAK,EAAIA,EAAM,KAAO,aAAaC,CAAC,EAE1D,CACH,CAAA,CAAA,CACL,EAER,CAER,CAEA,SAAS8B,GAAclC,EAA8B,CACjD,OAAIA,EAAK,aAEA,MAAA,CAAI,UAAW,iBAAiBA,EAAK,WAAa,EAAE,GACjD,SAAA,CAAAxG,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAqC,cAAY,OAC5D,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAA,CAAkC,CAAA,CACrD,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,+BACX,SAAAA,EAAAA,IAAC,QAAK,UAAU,sCAAuC,SAAAwG,EAAK,KAAA,CAAM,CAAA,CACtE,CAAA,EACJ,QAGA,KAAA,CAAG,UAAW,wBAAwBA,EAAK,WAAa,EAAE,GAAI,CAC1E,CAEA,SAASM,EACLN,EACAL,EACAC,EACS,CACT,GAAIS,EAAAA,YAAYL,CAAI,EAChB,OAAON,GAAYM,EAAML,EAAMC,CAAU,EAG7C,OAAQI,EAAK,KAAA,CACT,IAAK,MACD,OAAOD,GAAUC,EAAML,EAAMC,CAAU,EAC3C,IAAK,QACD,OAAOpG,EAAAA,IAAC+G,GAAA,CAAY,KAAAP,EAAY,KAAAL,EAAY,WAAAC,CAAA,CAAwB,EACxE,IAAK,QACD,OAAOpG,EAAAA,IAACoH,GAAA,CAAY,KAAAZ,EAAY,KAAAL,EAAY,WAAAC,CAAA,CAAwB,EACxE,IAAK,OACD,OAAOpG,EAAAA,IAACkI,GAAA,CAAW,KAAA1B,EAAY,KAAAL,EAAY,WAAAC,CAAA,CAAwB,EACvE,IAAK,UACD,OAAOsC,GAAclC,CAAI,EAC7B,IAAK,OACD,OACIxG,EAAAA,IAAC,MAAA,CACG,UAAWwG,EAAK,WAAa,GAC7B,wBAAyB,CAAE,OAAQA,EAAK,OAAA,CAAQ,CAAA,EAG5D,QACI,OAAO,IAAA,CAEnB,CAMO,SAASmC,GAAY,CACxB,OAAA1N,EACA,SAAA2N,EACA,QAAAC,EACA,OAAQC,EACR,eAAgBC,EAChB,MAAOC,EACP,WAAYC,EACZ,UAAAzJ,CACJ,EAAqB,SACjB,MAAM0J,EAAenK,EAAA,EAGfuG,EAASwD,GAAcI,EAAa,QAAU,KAC9C3D,EAAiBwD,GAAsBG,EAAa,gBAAkB,KACtEhE,EAAQ8D,GAAaE,EAAa,MAClC9C,EAAa6C,GAAkBC,EAAa,WAE5C/C,EAAOnL,EAAQC,CAAkB,EACjCkO,EAAUlE,GAAaC,CAAK,EAE5BkE,EAAY/D,EAAepK,EAAQ,QAASqK,EAAQC,EAAgB,EAAE,EACtE8D,EAAkBhE,EAAepK,EAAQ,cAAeqK,EAAQC,EAAgB,EAAE,EAClF+D,EAAczD,EAAe5K,EAAQ,SAAUqK,EAAQC,EAAgB,QAAQ,EAC/EgE,EAAa1D,EAAe5K,EAAQ,QAASqK,EAAQC,EAAgB,OAAO,EAE5EiE,EAAe,MAAOlN,GAAiB,CACzCA,EAAE,eAAA,EACEsM,EACA,MAAMzC,EAAK,OAAO,MAAO/L,GAAW,CAChC,MAAMwO,EAASxO,CAAM,CACzB,CAAC,EAED,MAAM+L,EAAK,SAAA,EAEX,CAACA,EAAK,SAAW0C,GACjBA,EAAQ1C,EAAK,MAAM,CAE3B,EAEMsD,EAAenN,GAAiB,CAClCA,EAAE,eAAA,EACF6J,EAAK,MAAA,CACT,EAEA,OACInG,EAAAA,IAACzB,EAAY,SAAZ,CAAqB,MAAO4H,EACzB,SAAApG,EAAAA,KAAC,OAAA,CACG,UAAW,qBAAmBqD,EAAA8B,GAAA,YAAAA,EAAO,aAAP,YAAA9B,EAAmB,OAAQ,EAAE,IAAI5D,GAAa,EAAE,GAAG,KAAA,EACjF,MAAO2J,EACP,SAAUK,EACV,QAASC,EACT,WAAU,GAGR,SAAA,EAAAL,GAAaC,IACXtJ,EAAAA,KAAC,MAAA,CAAI,UAAU,OACV,SAAA,CAAAqJ,GACGpJ,EAAAA,IAAC,KAAA,CAAG,UAAU,sCAAuC,SAAAoJ,EAAU,EAElEC,GACGrJ,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA8B,SAAAqJ,CAAA,CAAgB,CAAA,EAEnE,EAIHpO,EAAO,OAAO,IAAI,CAACuL,EAAMI,IACtB5G,EAAAA,IAAC,MAAA,CAEG,MAAO6G,EAAAA,YAAYL,CAAI,EAAIR,EAAaQ,EAAK,IAAI,EAAI,OAEpD,SAAAM,EAAWN,EAAML,EAAMC,CAAU,CAAA,EAH7BS,EAAAA,YAAYL,CAAI,EAAIA,EAAK,KAAO,QAAQI,CAAC,EAAA,CAKrD,EAGD7G,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACX,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACG,KAAK,SACL,SAAUoG,EAAK,aACf,UAAW,6MAA2MP,EAAAV,GAAA,YAAAA,EAAO,aAAP,YAAAU,EAAmB,SAAU,EAAE,GACrP,MAAO,CACH,gBAAiB,kCAAA,EAGpB,SAAA,CAAAO,EAAK,cACFnG,EAAAA,IAAC,OAAA,CACG,UAAU,qGACV,cAAY,MAAA,CAAA,EAGnBsJ,CAAA,CAAA,CAAA,EAELtJ,EAAAA,IAAC,SAAA,CACG,KAAK,QACL,SAAUmG,EAAK,aACf,UAAU,gPAET,SAAAoD,CAAA,CAAA,CACL,CAAA,CACJ,CAAA,CAAA,CAAA,EAER,CAER"}