logo

[DOC]

Componentes base
Form

Form

Para formulários estamos utilizando React Hook Form junto com Zod para tipagem e validações.

Anatomy

import {
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from '@vert-capital/design-system-ui';

export function FormComponent() {
  return (
    <Form>
      <FormField
        control={...}
        name="..."
        render={() => (
          <FormItem>
            <FormLabel />
            <FormControl>
              { /* Your form field */}
            </FormControl>
            <FormDescription />
            <FormMessage />
          </FormItem>
        )}
      />
    </Form>
  );
}

Passo a passo

Passo 1 - Crie um esquema de formulário

Defina a forma do seu formulário usando um esquema Zod. Você pode ler mais sobre como usar o Zod na documentação do Zod.

import { z } from "zod"
 
const formSchema = z.object({
  username: z.string().min(2).max(50),
})

Passo 2 - Define a form

Use o gancho useForm do react-hook-form para criar um formulário.

import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
import { z } from "zod"
  
const formSchema = z.object({
  username: z.string().min(2, {
    message: "Username must be at least 2 characters.",
  }),
})
  
export function ProfileForm() {
  // 1. Define your form.
  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      username: "",
    },
  })
  
  // 2. Define a submit handler.
  function onSubmit(values: z.infer<typeof formSchema>) {
    // Do something with the form values.
    // ✅ This will be type-safe and validated.
    console.log(values)
  }
}

Passo 3 - Crie seu formulário

Agora podemos usar os componentes Form para construir nosso formulário.

import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
import { z } from "zod"

import {
  Button,
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
  Input,
} from '@vert-capital/design-system-ui';
  
const formSchema = z.object({
  username: z.string().min(2, {
    message: "Username must be at least 2 characters.",
  }),
})
  
export function ProfileForm() {
  // 1. Define your form.
  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      username: "",
    },
  })
  
  // 2. Define a submit handler.
  function onSubmit(values: z.infer<typeof formSchema>) {
    // Do something with the form values.
    // ✅ This will be type-safe and validated.
    console.log(values)
  }

  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
        <FormField
          control={form.control}
          name="username"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Username</FormLabel>
              <FormControl>
                <Input placeholder="shadcn" {...field} />
              </FormControl>
              <FormDescription>
                This is your public display name.
              </FormDescription>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit">Submit</Button>
      </form>
    </Form>
  )
}

Feito!

É isso. Agora você tem um formulário totalmente acessível, com tipo seguro e validação do lado do cliente.

This is your public display name.