Paste JSON. Get React Hook Form or TanStack Form + Zod code instantly.
"use client";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
const formSchema = z.object({
name: z.string().min(1, "Required"),
email: z.string().min(1, "Required").email("Invalid email"),
age: z.coerce.number(),
bio: z.string().min(1, "Required"),
newsletter: z.boolean(),
});
type FormValues = z.infer<typeof formSchema>;
export function GeneratedForm() {
const form = useForm<FormValues>({
resolver: zodResolver(formSchema),
defaultValues: {
name: "",
email: "",
age: 0,
bio: "",
newsletter: false,
},
});
function onSubmit(values: FormValues) {
console.log(values);
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
<FormField
control={form.control}
name="name"
render={({ field }) => (
<FormItem>
<FormLabel>Name</FormLabel>
<FormControl>
<Input placeholder="Name" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input type="email" placeholder="Email" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="age"
render={({ field }) => (
<FormItem>
<FormLabel>Age</FormLabel>
<FormControl>
<Input
type="number"
name={field.name}
value={field.value}
onBlur={field.onBlur}
onChange={(e) => field.onChange(e.target.value === "" ? 0 : Number(e.target.value))}
placeholder="Age"
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="bio"
render={({ field }) => (
<FormItem>
<FormLabel>Bio</FormLabel>
<FormControl>
<textarea
rows={3}
placeholder="Bio"
className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm resize-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="newsletter"
render={({ field }) => (
<FormItem className="flex flex-row items-center gap-3 rounded-lg border p-3 space-y-0">
<FormControl>
<input
type="checkbox"
checked={field.value}
onBlur={field.onBlur}
onChange={(e) => field.onChange(e.target.checked)}
className="h-4 w-4 rounded border-input accent-primary"
/>
</FormControl>
<FormLabel className="font-normal cursor-pointer">Newsletter</FormLabel>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Submit</Button>
</form>
</Form>
);
}