import React from 'react' import type { Meta, StoryObj } from '@storybook/react' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { Form, FormField, FormItem, FormLabel, FormControl, FormDescription, FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' const meta = { title: 'Form/Form', component: Form, tags: ['autodocs'], parameters: { layout: 'centered' }, } satisfies Meta export default meta type Story = StoryObj const profileSchema = z.object({ username: z .string() .min(2, { message: 'Username must be at least 2 characters.' }) .max(30, { message: 'Username must not be longer than 30 characters.' }), email: z.string().email({ message: 'Please enter a valid email address.' }), }) type ProfileValues = z.infer function ProfileForm() { const form = useForm({ resolver: zodResolver(profileSchema), defaultValues: { username: '', email: '', }, }) function onSubmit(data: ProfileValues) { alert(JSON.stringify(data, null, 2)) } return (
( Username This is your public display name. )} /> ( Email We will never share your email with anyone. )} /> ) } export const Default: Story = { render: () => , } const loginSchema = z.object({ email: z.string().email({ message: 'Invalid email address.' }), password: z .string() .min(8, { message: 'Password must be at least 8 characters.' }), }) type LoginValues = z.infer function LoginForm() { const form = useForm({ resolver: zodResolver(loginSchema), defaultValues: { email: '', password: '', }, }) function onSubmit(data: LoginValues) { alert(JSON.stringify(data, null, 2)) } return (
( Email )} /> ( Password )} /> ) } export const Login: Story = { render: () => , } function PrefilledErrorForm() { const form = useForm({ resolver: zodResolver(profileSchema), defaultValues: { username: 'a', email: 'not-an-email', }, }) // Trigger validation on mount React.useEffect(() => { form.trigger() }, [form]) return (
( Username )} /> ( Email )} /> ) } export const WithErrors: Story = { render: () => , }