import { ReactNode, ComponentType } from 'react'; import { ZodType, ZodSchema } from 'zod'; export type FormFieldType = | 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'file'; export type RenderContext = { path: string[]; value: unknown; setValue: (value: unknown) => void; error?: string; disabled?: boolean; required?: boolean; }; export type RenderFunction = ( schema: ZodType, context: RenderContext ) => ReactNode; export type FormFieldConfig = { fieldType: FormFieldType; component?: ComponentType; props?: Record; wrapper?: ComponentType<{ children: ReactNode }>; validation?: { customMessages?: Record; }; }; export type FormGenerationOptions = { fieldOrder?: string[]; fieldConfigs?: Record; onSubmit?: (values: Record) => void | Promise; onValueChange?: (path: string[], value: unknown) => void; className?: string; disabled?: boolean; showSubmitButton?: boolean; submitButtonText?: string; resetButtonText?: string; showResetButton?: boolean; }; export interface ZodSchemaWithRender extends ZodSchema { _renderConfig?: FormFieldConfig; withRender: (config: FormFieldConfig) => ZodSchemaWithRender; } export type ValidationError = { path: string[]; message: string; code: string; }; export type FormState> = { values: T; errors: ValidationError[]; isValidating: boolean; isSubmitting: boolean; isDirty: boolean; touchedFields: Set; }; export type FormActions> = { setValue: (path: string[], value: unknown) => void; setValues: (values: Partial) => void; setError: (path: string[], error: string) => void; clearError: (path: string[]) => void; clearErrors: () => void; reset: () => void; submit: () => Promise; validate: () => Promise; touchField: (path: string[]) => void; }; export type UseFormReturn> = { state: FormState; actions: FormActions; }; export type ComponentRegistry = Record>; export type FormFieldValue = string | number | boolean | File | FileList | null | undefined; export type FieldComponentProps = { value: FormFieldValue; onChange: (value: FormFieldValue) => void; error?: string; disabled?: boolean; required?: boolean; placeholder?: string; options?: Array<{ value: FormFieldValue; label: string; disabled?: boolean }>; multiple?: boolean; accept?: string; rows?: number; min?: number; max?: number; step?: number; className?: string; }; export type SelectOption = { value: FormFieldValue; label: string; disabled?: boolean; }; export type FileUploadResult = { name: string; data: string; type: string; size: number; };