@formatica/react 0.1.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +264 -25
- package/dist/components/BaseField.d.ts +17 -0
- package/dist/components/BaseField.d.ts.map +1 -0
- package/dist/components/FormBuilder.d.ts +22 -0
- package/dist/components/FormBuilder.d.ts.map +1 -0
- package/dist/components/FormaticaProvider.d.ts +15 -0
- package/dist/components/FormaticaProvider.d.ts.map +1 -0
- package/dist/components/fields/CheckboxField.d.ts +10 -0
- package/dist/components/fields/CheckboxField.d.ts.map +1 -0
- package/dist/components/fields/NumberField.d.ts +17 -0
- package/dist/components/fields/NumberField.d.ts.map +1 -0
- package/dist/components/fields/RadioField.d.ts +17 -0
- package/dist/components/fields/RadioField.d.ts.map +1 -0
- package/dist/components/fields/SelectField.d.ts +19 -0
- package/dist/components/fields/SelectField.d.ts.map +1 -0
- package/dist/components/fields/SliderField.d.ts +13 -0
- package/dist/components/fields/SliderField.d.ts.map +1 -0
- package/dist/components/fields/SwitchField.d.ts +11 -0
- package/dist/components/fields/SwitchField.d.ts.map +1 -0
- package/dist/components/fields/TextField.d.ts +15 -0
- package/dist/components/fields/TextField.d.ts.map +1 -0
- package/dist/components/fields/TextareaField.d.ts +14 -0
- package/dist/components/fields/TextareaField.d.ts.map +1 -0
- package/dist/formatica-react.es.js +630 -616
- package/dist/formatica-react.es.js.map +1 -1
- package/dist/formatica-react.umd.cjs +1 -1
- package/dist/formatica-react.umd.cjs.map +1 -1
- package/dist/hooks/useForm.d.ts +26 -0
- package/dist/hooks/useForm.d.ts.map +1 -0
- package/dist/hooks/useFormContext.d.ts +4 -0
- package/dist/hooks/useFormContext.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatica-react.es.js","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 ×\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 ×\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.es.js","sources":["../src/components/FormaticaProvider.tsx","../src/hooks/useForm.ts","../src/hooks/useFormContext.ts","../src/components/BaseField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/NumberField.tsx","../src/components/fields/RadioField.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/SliderField.tsx","../src/components/fields/SwitchField.tsx","../src/components/fields/TextareaField.tsx","../src/components/fields/TextField.tsx","../src/components/FormBuilder.tsx"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Formatica React – Global configuration provider\n// ---------------------------------------------------------------------------\n\nimport type { ThemeConfig } from \"@formatica/core\";\nimport type { ComponentType } from \"react\";\nimport { createContext, type ReactNode, useContext } 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}>{children}</FormaticaConfigContext.Provider>\n );\n}\n\nexport function useFormaticaConfig(): FormaticaConfig {\n return useContext(FormaticaConfigContext);\n}\n","// ---------------------------------------------------------------------------\n// Formatica React – useForm hook\n// ---------------------------------------------------------------------------\n\nimport type { FieldSchema, FormSchema } from \"@formatica/core\";\nimport { evaluateCondition, extractFields, getRule } from \"@formatica/core\";\nimport { useCallback, useRef, useState } from \"react\";\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, 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 – 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 – 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 – 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 – 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 ×\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 ×\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 – 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 – 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 – 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 }, [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 – 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 – FormBuilder component (matches Vue FormBuilder styling)\n// ---------------------------------------------------------------------------\n\nimport type {\n FormContext as CoreFormContext,\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 type { ComponentType, FormEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport type { FormInstance } from \"../hooks/useForm\";\nimport { useForm } from \"../hooks/useForm\";\nimport { FormContext } from \"../hooks/useFormContext\";\nimport { BaseField } from \"./BaseField\";\nimport { useFormaticaConfig } from \"./FormaticaProvider\";\nimport { CheckboxField } from \"./fields/CheckboxField\";\nimport { NumberField } from \"./fields/NumberField\";\nimport { RadioField } from \"./fields/RadioField\";\nimport { SelectField } from \"./fields/SelectField\";\nimport { SliderField } from \"./fields/SliderField\";\nimport { SwitchField } from \"./fields/SwitchField\";\nimport { TextareaField } from \"./fields/TextareaField\";\nimport { TextField } from \"./fields/TextField\";\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 | ((ctx: CoreFormContext) => OptionItem[] | Promise<OptionItem[]>)\n | ((...args: unknown[]) => OptionItem[] | Promise<OptionItem[]>)\n | undefined,\n): OptionItem[] {\n if (Array.isArray(options)) return options;\n return [];\n}\n\nfunction resolveDisabled(\n disabled: boolean | ((ctx: CoreFormContext) => boolean) | undefined,\n): boolean {\n if (typeof disabled === \"function\") return false;\n return disabled ?? false;\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={resolveDisabled(field.disabled)}\n readOnly={field.readOnly === true}\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 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":["FormaticaConfigContext","createContext","FormaticaProvider","config","children","useFormaticaConfig","useContext","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","useFormContext","BaseField","label","required","helpText","tooltip","disabled","readOnly","fieldName","className","style","showTooltip","setShowTooltip","hasErrors","fieldId","errorId","jsxs","jsx","error","idx","CheckboxField","onChange","onBlur","toggle","onKeydown","baseInputClasses","NumberField","placeholder","min","max","step","precision","prefix","suffix","inputClassName","handleChange","raw","num","inputEl","RadioField","options","inline","isSelected","isOptionDisabled","option","selectOption","SelectField","multiple","searchable","clearable","isOpen","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","containerRef","searchInputRef","selectedValues","displayLabel","opt","o","filteredOptions","tagLabel","open","_a","close","arr","removeTag","sv","clearSelection","useEffect","handleClickOutside","event","val","SliderField","isActive","setIsActive","currentValue","range","percentage","_e","SwitchField","activeLabel","inactiveLabel","baseClasses","TextareaField","rows","autoResize","maxLength","textareaRef","adjustHeight","el","textareaClassName","TextField","inputType","camelToKebab","str","m","buildCssVars","theme","vars","key","getTranslation","locale","fallbackLocale","fallback","translations","loc","fb","_b","getActionLabel","resolveOptions","resolveDisabled","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":"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"}
|