Design System

Form

Sistema de formulários com validação integrada. Combina React Hook Form + Zod + componentes Form do @workspace/ui. Gerencia labels, mensagens de erro e estados de forma acessível.

import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod/v4";
import {
  Form, FormControl, FormDescription,
  FormField, FormItem, FormLabel, FormMessage,
} from "@workspace/ui/components/form";

const schema = z.object({
  name: z.string().min(2, { error: "Mínimo 2 caracteres" }),
  email: z.email({ error: "E-mail inválido" }),
});

function MyForm() {
  const form = useForm({
    resolver: zodResolver(schema),
  });

  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)}>
        <FormField
          control={form.control}
          name="name"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Nome</FormLabel>
              <FormDescription>Nome completo da consultora.</FormDescription>
              <FormControl>
                <Input {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
      </form>
    </Form>
  );
}

Anatomia

Estrutura de um campo de formulário.

Nome completoFormLabel

Nome conforme documento.

FormDescription
Ana Paula CarvalhoFormControl

Mínimo 2 caracteres.

FormMessage

Padrão de uso no SYSGO

Fluxo de formulário nos portais.

EtapaComponenteDescrição
1. Schemaz.object()Definição do schema Zod com regras
2. HookuseForm()React Hook Form com zodResolver
3. ProviderFormProvê contexto do formulário
4. CampoFormFieldConecta um campo ao controller
5. LayoutFormItemContainer do campo com gap
6. LabelFormLabelRótulo com estado de erro
7. AjudaFormDescriptionTexto auxiliar abaixo do label
8. InputFormControlWrapper que conecta aria-attributes
9. ErroFormMessageMensagem de erro de validação

API Reference

PropTypeDefaultDescrição
FormFormProviderProvider do React Hook Form (spread do useForm())
FormField.controlControlControl do useForm()
FormField.namestringNome do campo (path no schema)
FormField.render({ field }) => ReactNodeRender prop com o field controller
FormItemdivContainer do campo (grid gap-2)
FormLabelLabelLabel com estado de erro automático
FormControlSlotWrapper que conecta aria-describedby e aria-invalid
FormDescriptionpTexto auxiliar (text-muted-foreground)
FormMessagepMensagem de erro (text-destructive)