Label
Em andamentoRótulo de campo de formulário, em caixa alta pequena, com os estados que um rótulo precisa: obrigatório, opcional, com erro, desabilitado e com uma linha de ajuda.
- Função
- Formulário e ação
- Também chamado de
- rótulo, label, legenda do campo
- Mora em
- app/components/atoms/Label.tsx
- Última mudança
- 2026-09-29
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Para rotular um campo quando o FormField não serve — um controle composto, ou um layout que separa rótulo e campo.
Faça
- Ligue ao campo por
htmlFor— é o que faz o clique no rótulo focar o campo e o leitor ler o nome. - Use
opcionalquando quase tudo for obrigatório, erequiredquando quase tudo for opcional. - Aponte o
aria-describedbydo campo para a ajuda: passeidDaAjuda, ou use o id que o Label gera sozinho (E59). - Com asterisco, ponha uma vez a
LegendaDeObrigatorio("* indica campo obrigatório") no topo do formulário. - Use
as="legend"para o título de um grupo — é o que o FormField emfieldsete o RadioGroup fazem.
Evite
- Usar
estado="desabilitado"solto, sem campodisabledligado: o texto esmaecido fica abaixo de 4,5:1 e só é isento quando faz parte de um controle inativo. - Marcar
requiredeopcionaljuntos — o tipo não deixa (E59). - Rótulo longo: ele é caixa alta de 12px (
text-rotulo), feito para duas ou três palavras.
Quando não usar. No caso comum, use o FormField: ele já traz o Label, liga o htmlFor e passa o estado de erro. No Checkbox, no Radio e no Toggle o rótulo já vem pela prop label.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Ícone de erro — Só com `estado="erro"`, antes do texto.
- Texto — 12px (`text-rotulo`, o piso do sistema), negrito, caixa alta, espaçamento largo, entrelinha de texto.
- Marca — Asterisco vermelho (`required`) ou "(opcional)" em caixa normal.
- Ajuda — Linha embaixo, com ícone de informação, em `text-xs`.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Padrão | Texto --muted-foreground. |
| Obrigatório | Asterisco vermelho, escondido do leitor, e "(obrigatório)" só para o leitor. |
| Opcional | "(opcional)" escrito, em cinza e caixa normal. |
| Erro | estado="erro": texto vermelho de interface e ícone de alerta. |
| Desabilitado | estado="desabilitado": 70% de opacidade e cursor proibido. |
Comportamento
| Situação | O que acontece |
|---|---|
| Clique no rótulo | Foca o campo ligado por htmlFor — é um <label> nativo. |
| Com `ajuda` | O rótulo e a ajuda passam a vir num invólucro em coluna; a ajuda recebe o idDaAjuda. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Label } from '@/app/components/atoms/Label';
<Label>…</Label>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
estado | 'padrao' | 'erro' | 'desabilitado' | 'padrao' | não | Variante do cva. |
as | 'label' | 'legend' | 'label' | não | legend para servir de título de um <fieldset> (E59). |
ajuda | React.ReactNode | — | não | Texto de apoio embaixo do rótulo. |
idDaAjuda | string | — | não | id da linha de ajuda, para o aria-describedby do campo. Sem ele, é gerado. |
Aceita também: React.LabelHTMLAttributes<HTMLLabelElement>, | { required?: false; opcional?: boolean } | { required: true; opcional?: never }.
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--destructive | #BA0517 | text-destructive |
--muted-foreground | #595959 | text-muted-foreground |
Leitor de tela
O que é anunciado, e por quê.
- O asterisco é
aria-hidden; a palavra "(obrigatório)" entra no nome por um texto só para leitor de tela. A semântica de obrigatório vem doaria-requiredque o FormField põe no campo. - O rótulo não recebe foco: é lido junto com o campo que ele nomeia.
O que sustenta o estado
Esta peça usa estatico. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: estatico — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/atoms/Label.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
fdd10ff2026-09-29ESTADO: E109 concluida, roteiro final fechado; proximo o merge na main
O histórico completo está no GitHub (abre em outra aba).