Forms & Inputs

Form controls for user input with React Hook Form integration.

Form components provide validated user input with React Hook Form and Zod integration. All form components are accessible and support dark mode.

Form

The Form component wraps React Hook Form's FormProvider with integrated validation display.

import { Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage } from '@kit/ui/form';

Basic Form

'use client';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import * as z from 'zod';
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from '@kit/ui/form';
import { Input } from '@kit/ui/input';
import { Button } from '@kit/ui/button';
const schema = z.object({
email: z.string().email(),
name: z.string().min(2),
});
function MyForm() {
const form = useForm({
resolver: zodResolver(schema),
});
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl
render={
<Input placeholder="you@example.com" {...field} />
}
/>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Submit</Button>
</form>
</Form>
);
}

Input

Basic text input field.

import { Input } from '@kit/ui/input';
<Input placeholder="Enter text" />
<Input type="email" placeholder="Email address" />
<Input type="password" placeholder="Password" />
<Input disabled placeholder="Disabled input" />

Textarea

Multi-line text input.

import { Textarea } from '@kit/ui/textarea';
<Textarea placeholder="Enter description..." />
<Textarea rows={6} placeholder="Longer text area" />

Select

Dropdown select with search and keyboard navigation.

import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@kit/ui/select';
<Select onValueChange={handleChange} defaultValue="option1">
<SelectTrigger>
<SelectValue placeholder="Select option" />
</SelectTrigger>
<SelectContent>
<SelectItem value="option1">Option 1</SelectItem>
<SelectItem value="option2">Option 2</SelectItem>
<SelectItem value="option3">Option 3</SelectItem>
</SelectContent>
</Select>

With Form Field

<FormField
control={form.control}
name="category"
render={({ field }) => (
<FormItem>
<FormLabel>Category</FormLabel>
<Select onValueChange={field.onChange} defaultValue={field.value}>
<FormControl
render={
<SelectTrigger>
<SelectValue placeholder="Select category" />
</SelectTrigger>
}
/>
<SelectContent>
<SelectItem value="work">Work</SelectItem>
<SelectItem value="personal">Personal</SelectItem>
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/>

Checkbox

Boolean checkbox control.

import { Checkbox } from '@kit/ui/checkbox';
<div className="flex items-center gap-2">
<Checkbox id="terms" />
<label htmlFor="terms">Accept terms and conditions</label>
</div>

Radio Group

Single selection from multiple options.

import { RadioGroup, RadioGroupItem } from '@kit/ui/radio-group';
<RadioGroup defaultValue="option1" onValueChange={handleChange}>
<div className="flex items-center gap-2">
<RadioGroupItem value="option1" id="r1" />
<label htmlFor="r1">Option 1</label>
</div>
<div className="flex items-center gap-2">
<RadioGroupItem value="option2" id="r2" />
<label htmlFor="r2">Option 2</label>
</div>
</RadioGroup>

Switch

Toggle switch for boolean values.

import { Switch } from '@kit/ui/switch';
<div className="flex items-center gap-2">
<Switch id="notifications" />
<label htmlFor="notifications">Enable notifications</label>
</div>
{/* Small size */}
<Switch size="sm" />

Input OTP

One-time password input for verification codes.

import { InputOTP, InputOTPGroup, InputOTPSlot } from '@kit/ui/input-otp';
<InputOTP maxLength={6}>
<InputOTPGroup>
<InputOTPSlot index={0} />
<InputOTPSlot index={1} />
<InputOTPSlot index={2} />
<InputOTPSlot index={3} />
<InputOTPSlot index={4} />
<InputOTPSlot index={5} />
</InputOTPGroup>
</InputOTP>

Label

Accessible form label.

import { Label } from '@kit/ui/label';
<Label htmlFor="email">Email address</Label>
<Input id="email" type="email" />

Field

Form field wrapper with label and description.

import { Field, FieldLabel, FieldDescription, FieldError } from '@kit/ui/field';
<Field>
<FieldLabel>Username</FieldLabel>
<Input placeholder="Enter username" />
<FieldDescription>Your unique username</FieldDescription>
<FieldError>Username is required</FieldError>
</Field>

Image Uploader

Drag-and-drop image upload with preview.

import { ImageUploader } from '@kit/ui/image-uploader';
<ImageUploader
value={imageUrl}
onValueChange={(url) => setImageUrl(url)}
>
<span>Drop image here or click to upload</span>
</ImageUploader>

Supports JPEG, PNG, GIF, WebP up to 5MB.


Next: Buttons & Actions →