Form Components
Form Components
Input Field Variants
interface InputProps {
type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url';
size?: 'sm' | 'md' | 'lg';
variant?: 'default' | 'error' | 'success';
disabled?: boolean;
required?: boolean;
placeholder?: string;
label?: string;
helperText?: string;
errorMessage?: string;
leftIcon?: React.ComponentType;
rightIcon?: React.ComponentType;
onChange: (value: string) => void;
onBlur?: () => void;
onFocus?: () => void;
}
// Usage with validation
const [email, setEmail] = useState('');
const [emailError, setEmailError] = useState('');
<Input
type="email"
label="Email Address"
placeholder="Enter your email"
value={email}
onChange={setEmail}
onBlur={() => validateEmail(email, setEmailError)}
errorMessage={emailError}
required
/>
Select Components
interface SelectOption {
value: string | number;
label: string;
disabled?: boolean;
group?: string;
}
interface SelectProps {
options: SelectOption[];
value?: string | number;
placeholder?: string;
multiple?: boolean;
searchable?: boolean;
clearable?: boolean;
loading?: boolean;
disabled?: boolean;
size?: 'sm' | 'md' | 'lg';
onChange: (value: string | number | (string | number)[]) => void;
}
// Usage
<Select
options={[
{ value: 'us', label: 'United States' },
{ value: 'ca', label: 'Canada' },
{ value: 'uk', label: 'United Kingdom' }
]}
placeholder="Select country"
onChange={(value) => setCountry(value)}
/>
Form Validation Patterns
interface ValidationRule {
type: 'required' | 'email' | 'minLength' | 'maxLength' | 'pattern';
value?: any;
message: string;
}
interface FormFieldProps {
name: string;
rules?: ValidationRule[];
children: (field: FieldProps) => React.ReactNode;
}
interface FieldProps {
value: any;
error?: string;
touched: boolean;
onChange: (value: any) => void;
onBlur: () => void;
}
// Form field wrapper
const FormField = ({ name, rules, children }: FormFieldProps) => {
const { register, errors, touchedFields } = useFormContext();
const field = register(name, { rules });
const error = errors[name]?.message;
const touched = touchedFields[name];
return children({
...field,
error,
touched: !!touched
});
};