el-form-react-components
Version:
AutoForm and UI components for React - generate forms instantly from schemas (Zod, Yup, Valibot). Includes Tailwind CSS styling and customizable field components.
1 lines • 40.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/AutoForm.tsx","../src/FieldComponents.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useForm } from \"el-form-react-hooks\";\nimport type { ValidatorConfig } from \"el-form-core\";\nimport {\n AutoFormProps,\n AutoFormFieldConfig,\n AutoFormFieldProps,\n AutoFormErrorProps,\n GridColumns,\n} from \"./types\";\nimport { z } from \"zod\";\n\n// Default error component\nconst DefaultErrorComponent: React.FC<AutoFormErrorProps> = ({\n errors,\n touched,\n}: AutoFormErrorProps) => {\n const errorEntries = Object.entries(errors).filter(\n ([field]) => touched[field]\n );\n\n if (errorEntries.length === 0) return null;\n\n return (\n <div className=\"el-form-error-summary\">\n <h3>⚠️ Please fix the following errors:</h3>\n <ul>\n {errorEntries.map(([field, error]) => (\n <li key={field}>\n <span style={{ color: \"#ef4444\", marginRight: \"0.5rem\" }}>•</span>\n <span style={{ textTransform: \"capitalize\" }}>{field}:</span>\n <span style={{ marginLeft: \"0.25rem\" }}>{String(error)}</span>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\n// Default field component\nconst DefaultField: React.FC<AutoFormFieldProps> = ({\n name,\n label,\n type = \"text\",\n placeholder,\n value,\n onChange,\n onBlur,\n error,\n touched,\n options,\n className,\n inputClassName,\n labelClassName,\n errorClassName,\n}: AutoFormFieldProps) => {\n const fieldId = `field-${name}`;\n\n if (type === \"checkbox\") {\n return (\n <div className={className || \"flex items-center gap-x-2\"}>\n <input\n id={fieldId}\n name={name}\n type=\"checkbox\"\n checked={!!value}\n onChange={onChange}\n onBlur={onBlur}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <label\n htmlFor={fieldId}\n className={labelClassName || \"text-sm font-medium text-gray-900\"}\n >\n {label}\n </label>\n </div>\n );\n }\n\n const inputClasses =\n inputClassName ||\n `\n w-full px-3 py-2 border rounded-md text-sm text-gray-900 placeholder-gray-500\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\n ${\n touched && error\n ? \"border-red-500 focus:ring-red-500 focus:border-red-500\"\n : \"border-gray-300\"\n }\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n return (\n <div className={className || \"space-y-1\"}>\n {label && (\n <label\n htmlFor={fieldId}\n className={\n labelClassName || \"block text-sm font-medium text-gray-700\"\n }\n >\n {label}\n </label>\n )}\n\n {type === \"textarea\" ? (\n <textarea\n id={fieldId}\n name={name}\n value={value || \"\"}\n onChange={onChange}\n onBlur={onBlur}\n placeholder={placeholder}\n className={`${inputClasses} resize-none`}\n rows={4}\n />\n ) : type === \"select\" && options ? (\n <select\n id={fieldId}\n name={name}\n value={value || \"\"}\n onChange={onChange}\n onBlur={onBlur}\n className={inputClasses}\n >\n <option value=\"\">{placeholder || \"Select an option\"}</option>\n {options.map((option: { value: string; label: string }) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={fieldId}\n name={name}\n type={type}\n value={value || \"\"}\n onChange={onChange}\n onBlur={onBlur}\n placeholder={placeholder}\n className={inputClasses}\n />\n )}\n\n {touched && error && (\n <div className={errorClassName || \"text-red-500 text-xs mt-1\"}>\n {error}\n </div>\n )}\n </div>\n );\n};\n\n// Array Field Component for handling nested arrays\ninterface ArrayFieldProps {\n fieldConfig: AutoFormFieldConfig;\n value: any[];\n path: string;\n onAddItem: (path: string, item: any) => void;\n onRemoveItem: (path: string, index: number) => void;\n onValueChange: (path: string, value: any) => void;\n register: any;\n formState: any;\n}\n\nconst ArrayField: React.FC<ArrayFieldProps> = ({\n fieldConfig,\n value = [],\n path,\n onAddItem,\n onRemoveItem,\n onValueChange,\n register,\n formState,\n}: ArrayFieldProps) => {\n const arrayValue = Array.isArray(value) ? value : [];\n\n const createEmptyItem = () => {\n if (!fieldConfig.fields) return {};\n\n // Handle primitive arrays (like array of strings)\n if (\n fieldConfig.fields.length === 1 &&\n fieldConfig.fields[0].name === \"value\"\n ) {\n const fieldType = fieldConfig.fields[0].type;\n if (fieldType === \"number\") {\n return 0;\n } else if (fieldType === \"checkbox\") {\n return false;\n } else {\n return \"\";\n }\n }\n\n // Handle object arrays\n const emptyItem: any = {};\n fieldConfig.fields.forEach((field) => {\n if (field.type === \"array\") {\n emptyItem[field.name] = [];\n } else if (field.type === \"number\") {\n emptyItem[field.name] = 0;\n } else {\n emptyItem[field.name] = \"\";\n }\n });\n return emptyItem;\n };\n\n const handleAddItem = () => {\n onAddItem(path, createEmptyItem());\n };\n\n const handleRemoveItem = (index: number) => {\n onRemoveItem(path, index);\n };\n\n const renderNestedField = (\n nestedFieldConfig: AutoFormFieldConfig,\n itemIndex: number,\n itemPath: string\n ) => {\n // Handle primitive arrays (like array of strings)\n if (nestedFieldConfig.name === \"value\") {\n const fieldValue = arrayValue[itemIndex] || \"\";\n\n return (\n <div key={itemPath} className=\"space-y-1\">\n <input\n type={nestedFieldConfig.type || \"text\"}\n value={fieldValue}\n onChange={(e) => {\n const newValue =\n nestedFieldConfig.type === \"number\"\n ? e.target.value\n ? Number(e.target.value)\n : 0\n : e.target.value;\n onValueChange(itemPath, newValue);\n }}\n placeholder={nestedFieldConfig.placeholder || \"Enter value\"}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n );\n }\n\n // Handle object arrays\n const fieldPath = `${itemPath}.${nestedFieldConfig.name}`;\n const fieldValue = arrayValue[itemIndex]?.[nestedFieldConfig.name] || \"\";\n\n if (nestedFieldConfig.type === \"array\") {\n return (\n <ArrayField\n key={fieldPath}\n fieldConfig={nestedFieldConfig}\n value={fieldValue}\n path={fieldPath}\n onAddItem={onAddItem}\n onRemoveItem={onRemoveItem}\n onValueChange={onValueChange}\n register={register}\n formState={formState}\n />\n );\n }\n\n return (\n <div key={fieldPath} className=\"space-y-1\">\n {nestedFieldConfig.label && (\n <label className=\"block text-sm font-medium text-gray-700\">\n {nestedFieldConfig.label}\n </label>\n )}\n <input\n type={nestedFieldConfig.type || \"text\"}\n value={fieldValue}\n onChange={(e) => {\n const newValue =\n nestedFieldConfig.type === \"number\"\n ? e.target.value\n ? Number(e.target.value)\n : 0\n : e.target.value;\n onValueChange(fieldPath, newValue);\n }}\n placeholder={nestedFieldConfig.placeholder}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n );\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"block text-sm font-medium text-gray-700\">\n {fieldConfig.label || fieldConfig.name}\n </label>\n <button\n type=\"button\"\n onClick={handleAddItem}\n className=\"px-3 py-1 bg-green-600 text-white text-xs rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500\"\n >\n + Add {fieldConfig.label || fieldConfig.name}\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {arrayValue.map((_, index) => {\n const itemPath = `${path}[${index}]`;\n\n return (\n <div\n key={index}\n className=\"p-4 border border-gray-200 rounded-lg bg-gray-50\"\n >\n <div className=\"flex justify-between items-center mb-3\">\n <h4 className=\"text-sm font-medium text-gray-700\">\n {fieldConfig.label || fieldConfig.name} #{index + 1}\n </h4>\n <button\n type=\"button\"\n onClick={() => handleRemoveItem(index)}\n className=\"px-2 py-1 bg-red-600 text-white text-xs rounded hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500\"\n >\n Remove\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {fieldConfig.fields?.map((nestedField) =>\n renderNestedField(nestedField, index, itemPath)\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {arrayValue.length === 0 && (\n <div className=\"text-gray-500 text-sm italic text-center py-4\">\n No {fieldConfig.label?.toLowerCase() || fieldConfig.name} added yet.\n Click \"Add\" to create one.\n </div>\n )}\n </div>\n );\n};\n\nfunction generateFieldsFromSchema<T extends z.ZodType<any, any>>(\n schema: T\n): AutoFormFieldConfig[] {\n if (!(schema instanceof z.ZodObject)) {\n return [];\n }\n\n const shape = (schema as z.ZodObject<any, any>).shape;\n const fields: AutoFormFieldConfig[] = [];\n\n for (const key in shape) {\n if (Object.prototype.hasOwnProperty.call(shape, key)) {\n const zodType = shape[key] as z.ZodTypeAny;\n const typeName = zodType._def.typeName;\n\n const fieldConfig: AutoFormFieldConfig = {\n name: key,\n label: key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (str) => str.toUpperCase()),\n type: \"text\", // Default to text\n };\n\n if (typeName === \"ZodString\") {\n const checks = (zodType._def as any).checks || [];\n if (checks.some((c: { kind: string }) => c.kind === \"email\")) {\n fieldConfig.type = \"email\";\n } else if (checks.some((c: { kind: string }) => c.kind === \"url\")) {\n fieldConfig.type = \"url\";\n }\n } else if (typeName === \"ZodNumber\") {\n fieldConfig.type = \"number\";\n } else if (typeName === \"ZodBoolean\") {\n fieldConfig.type = \"checkbox\";\n } else if (typeName === \"ZodEnum\") {\n fieldConfig.type = \"select\";\n fieldConfig.options = (zodType._def as any).values.map((v: string) => ({\n value: v,\n label: v,\n }));\n } else if (typeName === \"ZodDate\") {\n fieldConfig.type = \"date\";\n } else if (typeName === \"ZodArray\") {\n fieldConfig.type = \"array\";\n const arrayElementType = (zodType._def as any).type;\n if (arrayElementType instanceof z.ZodObject) {\n fieldConfig.fields = generateFieldsFromSchema(arrayElementType);\n } else {\n // For primitive arrays (string, number, etc.), create a simple field config\n const elementTypeName = arrayElementType._def.typeName;\n let elementType: \"text\" | \"number\" | \"checkbox\" = \"text\";\n\n if (elementTypeName === \"ZodString\") {\n elementType = \"text\";\n } else if (elementTypeName === \"ZodNumber\") {\n elementType = \"number\";\n } else if (elementTypeName === \"ZodBoolean\") {\n elementType = \"checkbox\";\n }\n\n fieldConfig.fields = [\n {\n name: \"value\",\n type: elementType,\n label: \"Value\",\n },\n ];\n }\n }\n\n fields.push(fieldConfig);\n }\n }\n\n return fields;\n}\n\n// Merge auto-generated fields with manual field overrides\nfunction mergeFields(\n autoFields: AutoFormFieldConfig[],\n manualFields: AutoFormFieldConfig[]\n): AutoFormFieldConfig[] {\n const manualFieldsMap = new Map(\n manualFields.map((field) => [field.name, field])\n );\n\n // Start with auto-generated fields and override with manual ones\n const mergedFields = autoFields.map((autoField) => {\n const manualField = manualFieldsMap.get(autoField.name);\n if (manualField) {\n // Merge the manual field with auto-generated field (manual takes priority)\n return { ...autoField, ...manualField };\n }\n return autoField;\n });\n\n // Add any manual fields that don't exist in auto-generated fields\n manualFields.forEach((manualField) => {\n if (!autoFields.some((autoField) => autoField.name === manualField.name)) {\n mergedFields.push(manualField);\n }\n });\n\n return mergedFields;\n}\n\nexport function AutoForm<T extends Record<string, any>>({\n schema,\n fields,\n initialValues = {},\n layout = \"flex\",\n columns = 12,\n onSubmit,\n onError,\n children,\n customErrorComponent,\n componentMap,\n validators,\n fieldValidators,\n validateOn = \"onChange\",\n submitButtonProps,\n resetButtonProps,\n}: AutoFormProps<T>) {\n // Create validator config for the form\n // If custom validators are provided, use them; otherwise use the schema\n const formValidators = validators || {\n [validateOn === \"manual\" ? \"onSubmit\" : validateOn]: schema,\n };\n\n const formApi = useForm<T>({\n validators: formValidators,\n fieldValidators: fieldValidators as\n | Record<keyof T, ValidatorConfig>\n | undefined,\n defaultValues: initialValues,\n validateOn,\n });\n\n const {\n register,\n handleSubmit,\n formState,\n reset,\n setValue,\n addArrayItem,\n removeArrayItem,\n } = formApi;\n\n // Merge auto-generated fields with manual overrides\n const autoGeneratedFields = generateFieldsFromSchema(schema);\n const fieldsToRender = fields\n ? mergeFields(autoGeneratedFields, fields)\n : autoGeneratedFields;\n\n // Choose which error component to use\n const ErrorComponent = customErrorComponent || DefaultErrorComponent;\n\n const renderField = (fieldConfig: AutoFormFieldConfig) => {\n const fieldName = fieldConfig.name as keyof T;\n\n // Map colSpan to Tailwind classes\n const getColSpanClass = (colSpan?: GridColumns) => {\n const spanMap: Record<GridColumns, string> = {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n 7: \"col-span-7\",\n 8: \"col-span-8\",\n 9: \"col-span-9\",\n 10: \"col-span-10\",\n 11: \"col-span-11\",\n 12: \"col-span-12\",\n };\n return spanMap[colSpan || 1];\n };\n\n const getFlexClass = (colSpan?: GridColumns) => {\n const flexMap: Record<GridColumns, string> = {\n 1: \"w-1/12\",\n 2: \"w-2/12\",\n 3: \"w-3/12\",\n 4: \"w-4/12\",\n 5: \"w-5/12\",\n 6: \"w-6/12\",\n 7: \"w-7/12\",\n 8: \"w-8/12\",\n 9: \"w-9/12\",\n 10: \"w-10/12\",\n 11: \"w-11/12\",\n 12: \"w-full\",\n };\n return flexMap[colSpan || 12];\n };\n\n const fieldContainerClasses =\n layout === \"grid\"\n ? getColSpanClass(fieldConfig.colSpan)\n : `flex-none ${getFlexClass(fieldConfig.colSpan)}`;\n\n // Handle array fields\n if (fieldConfig.type === \"array\") {\n const fieldProps = register(String(fieldName));\n const fieldValue = \"value\" in fieldProps ? fieldProps.value : [];\n const arrayValue = Array.isArray(fieldValue) ? fieldValue : [];\n return (\n <div key={fieldConfig.name} className={fieldContainerClasses}>\n <ArrayField\n fieldConfig={fieldConfig}\n value={arrayValue}\n path={fieldConfig.name}\n onAddItem={addArrayItem}\n onRemoveItem={removeArrayItem}\n onValueChange={setValue}\n register={register}\n formState={formState}\n />\n </div>\n );\n }\n\n // Handle regular fields\n const fieldProps = register(String(fieldName));\n const error = formState.errors[fieldName];\n const touched = formState.touched[fieldName];\n\n // Get the field value, handling both checkbox (checked) and regular (value) fields\n const fieldValue =\n \"checked\" in fieldProps\n ? fieldProps.checked\n : \"value\" in fieldProps\n ? fieldProps.value\n : undefined;\n\n // Determine which component to use:\n // 1. Field-level component override (existing behavior)\n // 2. ComponentMap override based on field type\n // 3. Default field component\n const FieldComponent =\n fieldConfig.component ||\n (fieldConfig.type && componentMap?.[fieldConfig.type]) ||\n DefaultField;\n\n return (\n <div key={fieldConfig.name} className={fieldContainerClasses}>\n <FieldComponent\n name={fieldConfig.name}\n label={fieldConfig.label || fieldConfig.name}\n type={fieldConfig.type}\n placeholder={fieldConfig.placeholder}\n value={fieldValue}\n onChange={fieldProps.onChange}\n onBlur={fieldProps.onBlur}\n error={error}\n touched={touched}\n options={fieldConfig.options}\n className={fieldConfig.className}\n inputClassName={fieldConfig.inputClassName}\n labelClassName={fieldConfig.labelClassName}\n errorClassName={fieldConfig.errorClassName}\n />\n </div>\n );\n };\n\n // Map columns to Tailwind grid classes\n const getGridClass = (cols: GridColumns) => {\n const gridMap: Record<GridColumns, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-7\",\n 8: \"grid-cols-8\",\n 9: \"grid-cols-9\",\n 10: \"grid-cols-10\",\n 11: \"grid-cols-11\",\n 12: \"grid-cols-12\",\n };\n return gridMap[cols];\n };\n\n const containerClasses =\n layout === \"grid\"\n ? `grid ${getGridClass(columns)} gap-4`\n : `flex flex-wrap gap-4`;\n\n // Default form rendering\n const defaultForm = (\n <form\n onSubmit={handleSubmit(\n (data) => onSubmit(data),\n onError ||\n ((errors) => console.error(\"Form validation errors:\", errors))\n )}\n className=\"w-full\"\n >\n {/* Error Summary Component */}\n <ErrorComponent\n errors={formState.errors as Record<string, string>}\n touched={formState.touched as Record<string, boolean>}\n />\n\n <div className={containerClasses}>\n {fieldsToRender.map(renderField)}\n\n <div\n className={`\n flex gap-3 mt-6\n ${layout === \"grid\" ? \"col-span-full\" : \"w-full\"}\n `\n .trim()\n .replace(/\\s+/g, \" \")}\n >\n <button\n type=\"submit\"\n disabled={formState.isSubmitting}\n className=\"el-form-submit-button px-5 py-2.5 bg-blue-600 text-white rounded-md text-sm font-medium hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-60 disabled:cursor-not-allowed transition-colors duration-200\"\n {...submitButtonProps}\n >\n {formState.isSubmitting ? \"Submitting...\" : \"Submit\"}\n </button>\n\n <button\n type=\"button\"\n onClick={() => reset()}\n className=\"px-5 py-2.5 bg-gray-600 text-white rounded-md text-sm font-medium hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors duration-200\"\n {...resetButtonProps}\n >\n Reset\n </button>\n </div>\n </div>\n </form>\n );\n\n // If children render prop is provided, render it along with the form\n if (children) {\n return (\n <div className=\"w-full\">\n <form\n onSubmit={handleSubmit(\n (data) => onSubmit(data),\n onError ||\n ((errors) => console.error(\"Form validation errors:\", errors))\n )}\n className=\"w-full\"\n >\n {/* Error Summary Component */}\n <ErrorComponent\n errors={formState.errors as Record<string, string>}\n touched={formState.touched as Record<string, boolean>}\n />\n\n {children(formApi)}\n\n <div className={containerClasses}>\n {fieldsToRender.map(renderField)}\n </div>\n </form>\n </div>\n );\n }\n\n // Default rendering without render prop\n return defaultForm;\n}\n","import { useFormContext } from \"el-form-react-hooks\";\n\n// Base field props that all field components should extend\nexport interface BaseFieldProps<\n T extends Record<string, any>,\n K extends keyof T\n> {\n name: K;\n label?: string;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n required?: boolean;\n}\n\n// Typed field component factory\nexport function createField<T extends Record<string, any>, K extends keyof T>(\n name: K\n) {\n return {\n name,\n // Type-safe value getter\n getValue: (form: any) => form.formState.values[name] as T[K],\n // Type-safe error getter\n getError: (form: any) => form.formState.errors[name] as string | undefined,\n // Type-safe touched getter\n getTouched: (form: any) =>\n form.formState.touched[name] as boolean | undefined,\n // Register function\n register: (form: any) => form.register(String(name)),\n };\n}\n\n// Pre-built field components\nexport function TextField<T extends Record<string, any>, K extends keyof T>({\n name,\n label,\n placeholder,\n className = \"\",\n type = \"text\",\n ...props\n}: BaseFieldProps<T, K> & {\n type?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\";\n}) {\n const form = useFormContext<T>();\n const field = createField<T, K>(name);\n\n const error = field.getError(form.form);\n const touched = field.getTouched(form.form);\n const registration = field.register(form.form);\n\n const inputClasses = `\n w-full px-3 py-2 border rounded-md text-sm text-gray-900 placeholder-gray-500\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\n ${\n touched && error\n ? \"border-red-500 focus:ring-red-500 focus:border-red-500\"\n : \"border-gray-300\"\n } ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n return (\n <div className=\"space-y-1\">\n {label && (\n <label\n htmlFor={String(name)}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </label>\n )}\n <input\n {...registration}\n {...props}\n id={String(name)}\n type={type}\n placeholder={placeholder}\n className={inputClasses}\n />\n {touched && error && (\n <div className=\"text-red-500 text-xs mt-1\">{error}</div>\n )}\n </div>\n );\n}\n\nexport function TextareaField<\n T extends Record<string, any>,\n K extends keyof T\n>({\n name,\n label,\n placeholder,\n className = \"\",\n rows = 4,\n ...props\n}: BaseFieldProps<T, K> & {\n rows?: number;\n}) {\n const form = useFormContext<T>();\n const field = createField<T, K>(name);\n\n const error = field.getError(form.form);\n const touched = field.getTouched(form.form);\n const registration = field.register(form.form);\n\n const textareaClasses = `\n w-full px-3 py-2 border rounded-md text-sm text-gray-900 placeholder-gray-500\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\n ${\n touched && error\n ? \"border-red-500 focus:ring-red-500 focus:border-red-500\"\n : \"border-gray-300\"\n } ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n return (\n <div className=\"space-y-1\">\n {label && (\n <label\n htmlFor={String(name)}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </label>\n )}\n <textarea\n {...registration}\n {...props}\n id={String(name)}\n placeholder={placeholder}\n rows={rows}\n className={textareaClasses}\n />\n {touched && error && (\n <div className=\"text-red-500 text-xs mt-1\">{error}</div>\n )}\n </div>\n );\n}\n\nexport function SelectField<T extends Record<string, any>, K extends keyof T>({\n name,\n label,\n placeholder,\n className = \"\",\n options = [],\n ...props\n}: BaseFieldProps<T, K> & {\n options: Array<{ value: string; label: string }>;\n}) {\n const form = useFormContext<T>();\n const field = createField<T, K>(name);\n\n const error = field.getError(form.form);\n const touched = field.getTouched(form.form);\n const registration = field.register(form.form);\n\n const selectClasses = `\n w-full px-3 py-2 border rounded-md text-sm text-gray-900\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\n ${\n touched && error\n ? \"border-red-500 focus:ring-red-500 focus:border-red-500\"\n : \"border-gray-300\"\n } ${className}\n `\n .trim()\n .replace(/\\s+/g, \" \");\n\n return (\n <div className=\"space-y-1\">\n {label && (\n <label\n htmlFor={String(name)}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </label>\n )}\n <select\n {...registration}\n {...props}\n id={String(name)}\n className={selectClasses}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {touched && error && (\n <div className=\"text-red-500 text-xs mt-1\">{error}</div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["fieldValue","fieldProps","jsx","jsxs"]}