UI

Form

Agrupa os campos e cuida da validação — nativa, customizada ou vinda do servidor — no envio.

Instalação

npx shadcn@latest add @lenstech/form

Uso

import { Form, FormActions } from "@/components/ui/form"
<Form
  onSubmit={(e) => {
    e.preventDefault()
    const dados = Object.fromEntries(new FormData(e.currentTarget))
    enviar(dados)
  }}
>
  <TextField name="nome" label="Nome" isRequired />
  <FormActions>
    <Button type="submit">Enviar</Button>
  </FormActions>
</Form>

O Form é um <form> HTML real: não precisa de biblioteca de formulário. Todo campo com name entra no FormData.

Três formas de validar

  1. Nativa — props nos campos: isRequired, type="email", minLength, maxLength, pattern… Personalize a mensagem com errorMessage.
  2. Customizada — validate={(valor) => "mensagem" | null} em cada campo.
  3. Servidor — validationErrors={{ email: "E-mail já cadastrado." }} no Form, indexado pelo name.

Quando os erros aparecem

Com validationBehavior="native" (padrão), os erros só aparecem ao enviar: o envio é bloqueado e o foco vai para o primeiro campo inválido. Com validationBehavior="aria", os erros aparecem enquanto o usuário digita e o envio não é bloqueado — valide de novo no onSubmit.

Exemplos

Formulário de contato completo

Composição típica de site: TextField, Select, Textarea, Checkbox de consentimento LGPD e Button com isPending. Tente enviar vazio ou com um WhatsApp sem DDD.

Agende sua avaliação

Preencha os dados abaixo e a Clínica Sorriso Feliz entra em contato para confirmar o horário.

Serviço de interesse
Opcional — conte o que precisa ou sua preferência de horário.
Usaremos seus dados apenas para responder este contato, conforme a LGPD (Lei 13.709/2018).

Validação customizada

validate pode devolver uma lista de mensagens — todas são exibidas.

Letras minúsculas, números e ponto.

Erros do servidor

O erro de validationErrors some quando o usuário edita o campo.

Validação em tempo real

Será usado em suaempresa.lenstech.com.br

Quando usar

  • Use sempre que houver campos enviados juntos: contato, orçamento, cadastro, login.
  • Para filtros com efeito imediato (busca, ordenação), não é preciso Form — use os campos soltos, como SearchField e Select.
  • Coloque os botões em FormActions para alinhá-los à direita no desktop e empilhá-los no celular.

API

Form

Aceita todas as props do Form do React Aria (e do <form> HTML). As mais importantes:

Prop

Type

FormActions

<div> com as props HTML comuns. Linha de botões ao final do formulário.

On this page