Pular para o conteúdo

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):

Input
PropTipoPadrãoDescrição
childrenReact.ReactNode-Conteúdo do componente.
classNameClassNameOrFunction<InputRenderProps>'react-aria-Input'Classes CSS aplicadas ao elemento.
fullWidthboolean-Ocupa toda a largura disponível.
placeholderstring-Texto de apoio exibido quando o campo está vazio.
renderDOMRenderFunction<'input', InputRenderProps>-Troca o elemento DOM padrão por outro, mantendo o comportamento e as props do componente.
styleStyleOrFunction<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):

TextArea
PropTipoPadrãoDescrição
childrenReact.ReactNode-Conteúdo do componente.
classNameClassNameOrFunction<InputRenderProps>'react-aria-TextArea'Classes CSS aplicadas ao elemento.
fullWidthboolean-Ocupa toda a largura disponível.
renderDOMRenderFunction<'textarea', InputRenderProps>-Troca o elemento DOM padrão por outro, mantendo o comportamento e as props do componente.
styleStyleOrFunction<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); Description e FieldError entram em aria-describedby.
  • isRequired expõe aria-required; isInvalid expõe aria-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 type certo (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

Rótulo sempre visível e mensagem de erro que diz como corrigir.

Evite

Placeholder no lugar do rótulo, ou erro genérico como Campo inválido.
  • Valide ao sair do campo ou ao enviar, não a cada tecla.
  • Marque obrigatórios com isRequired e diga no texto quando necessário.
  • Não use disabled para 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.