TextField
Campo de texto com rótulo, ajuda e validação, em uma ou várias linhas.
O TextField junta rótulo, campo, descrição e erro em um único componente acessível. Dentro dele ficam Input (uma linha), TextArea (várias), InputGroup (com prefixo ou sufixo) e, para busca, o SearchField. Campos do Admin não têm borda: o limite vem do fundo tonalizado e do anel de foco azul.
import { Description, FieldError, Input, Label, TextField } from "@rastreio-x/ui";
Padrão
O Label fica sempre visível. Placeholder é só exemplo de preenchimento, nunca o rótulo.
Playground
Ligue estados como obrigatório, desabilitado e inválido; o campo reage ao vivo.
Com descrição
Description explica onde o dado aparece ou o formato esperado.
Validação
isInvalid com FieldError troca a descrição pela mensagem do erro. A mensagem diz o que fazer, não só que há erro.
Várias linhas
Troque o Input por TextArea e defina rows.
Estados
Desabilitado e somente leitura mantêm o rótulo visível.
Prefixo e sufixo
InputGroup com InputGroup.Prefix, InputGroup.Input e InputGroup.Suffix mostra contexto fixo em volta do valor.
Busca
O SearchField traz o ícone de busca e o botão de limpar. Sem rótulo visível, passe aria-label.
Anatomia
A raiz é um contêiner; as peças são componentes soltos da fachada: Label, Input ou TextArea, Description e FieldError.
Propriedades
Raiz (TextField):
Campo (Input):
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
children | React.ReactNode | - | Conteúdo do componente. |
className | ClassNameOrFunction<InputRenderProps> | 'react-aria-Input' | Classes CSS aplicadas ao elemento. |
fullWidth | boolean | - | Ocupa toda a largura disponível. |
placeholder | string | - | Texto de apoio exibido quando o campo está vazio. |
render | DOMRenderFunction<'input', InputRenderProps> | - | Troca o elemento DOM padrão por outro, mantendo o comportamento e as props do componente. |
style | StyleOrFunction<InputRenderProps> | - | Estilos em linha aplicados ao elemento. |
variant | 'primary' | 'secondary' | - | Estilo: `primary` (com sombra suave) ou `secondary` (sem sombra, para uso dentro de cartões). |
Várias linhas (TextArea):
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
children | React.ReactNode | - | Conteúdo do componente. |
className | ClassNameOrFunction<InputRenderProps> | 'react-aria-TextArea' | Classes CSS aplicadas ao elemento. |
fullWidth | boolean | - | Ocupa toda a largura disponível. |
render | DOMRenderFunction<'textarea', InputRenderProps> | - | Troca o elemento DOM padrão por outro, mantendo o comportamento e as props do componente. |
style | StyleOrFunction<InputRenderProps> | - | Estilos em linha aplicados ao elemento. |
variant | 'primary' | 'secondary' | - | Estilo: `primary` (com sombra suave) ou `secondary` (sem sombra, para uso dentro de cartões). |
Grupo (InputGroup):
Animações
O campo não anima. O anel de foco azul aparece sem transição longa, e o fundo troca de tom no hover. O Input tem transição curta de cor; com prefers-reduced-motion, a folha global a reduz a 0,01 ms.
Acessibilidade
- O
Labelé ligado ao campo (for/id);DescriptioneFieldErrorentram emaria-describedby. isRequiredexpõearia-required;isInvalidexpõearia-invalid.- O anel de foco azul mantém 3:1 contra a superfície; o limite do campo (sem borda) é um desvio aceito pelo design, e o texto segue em 4,5:1.
- Use o
typecerto (email,tel,url) para o teclado do celular. - O botão de limpar do
SearchFieldé focável e tem nome.
Boas práticas
Faça
Evite
- Valide ao sair do campo ou ao enviar, não a cada tecla.
- Marque obrigatórios com
isRequirede diga no texto quando necessário. - Não use
disabledpara esconder um dado; use somente leitura quando a pessoa precisa copiar. - Dentro de cartões, use
variant="secondary"para o campo contrastar com a superfície.
Relacionados
- NumberField para valores numéricos.
- Select para escolher entre opções conhecidas.
- Checkbox para escolhas binárias de formulário.