// Example: Form Pattern with shadcn/ui components // Demonstrates: Form building, validation, and composition "use client" import { Button } from "@/components/ui/button" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { toast } from "@/components/ui/use-toast" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import * as z from "zod" // Define form schema with zod const formSchema = z.object({ username: z.string().min(2, { message: "Username must be at least 2 characters.", }), email: z.string().email({ message: "Please enter a valid email address.", }), role: z.enum(["admin", "user", "viewer"], { required_error: "Please select a role.", }), bio: z.string().max(160, { message: "Bio must not be longer than 160 characters.", }).optional(), }) type FormValues = z.infer export function UserProfileForm() { // Initialize form with react-hook-form and zod validation const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { username: "", email: "", bio: "", }, }) // Handle form submission function onSubmit(values: FormValues) { // In a real app, send to API console.log(values) toast({ title: "Profile updated", description: "Your profile has been successfully updated.", }) } return (
( Username This is your public display name. )} /> ( Email )} /> ( Role Your role determines your access level. )} /> ( Bio