Field
Rótulos, descrições e erros ligados ao seu controle, com estados de validação e layouts para formulários.
pnpm dlx shadcn@latest add https://hextaui.com/r/field.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/field.tsx components/ui/input.tsx components/ui/number-flow.tsx components/ui/separator.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Coloque qualquer controle do HextaUI dentro de um <Field /> e ele é rotulado, descrito e validado automaticamente. Não é preciso ligar id, htmlFor ou aria-describedby à mão.
Um controle com seu rótulo, texto de ajuda e validação.
Um switch ou checkbox com seu texto ao lado.
Um rótulo que envolve um campo inteiro, para que o card seja o alvo do clique.
Campos relacionados, com espaçamento uniforme.
Um grupo de campos com título, ou um grupo de radio ou checkbox com um item por opção.
Input
Um rótulo, um controle e uma descrição. Clicar no rótulo foca o input, e os leitores de tela leem a descrição depois do rótulo.
Validação
Restrições nativas como required e minLength são verificadas no blur. Dê a cada <FieldError /> um match para redigir a mensagem para cada problema. Um campo obrigatório vazio só é sinalizado depois de ter sido editado, então passar por ele com Tab não grita.
Validação personalizada
Passe validate para verificar qualquer coisa, inclusive consultas assíncronas. Retorne uma mensagem para falhar ou nada para passar. Com validationMode="onChange" e validationDebounceTime, roda durante a digitação sem disparar a cada tecla. Experimente “ada”.
Obrigatório e opcional
Defina indicator em um FieldGroup, FieldSet ou Field e todo rótulo dentro se marca a partir do atributo required do seu controle. "optional" marca os campos que as pessoas podem pular, o que fica mais calmo quando a maioria dos campos é obrigatória. "required" adiciona um asterisco. A marca fica oculta para leitores de tela porque o controle já a anuncia.
Status
<FieldStatus /> desenha uma marca quando um campo editado passa na validação e mostra um ícone de alerta enquanto ele falha. Segue o validationMode do campo, então nunca julga um campo antes de a validação ter rodado.
Contagem de caracteres
<FieldCounter /> encontra o controle de texto em seu campo e conta em relação ao seu maxLength. Ele apenas escuta, então a digitação nunca é retardada nem alterada.
Erros de uma biblioteca de formulários ou do servidor
Passe invalid ao campo e um array errors a <FieldError />. Ele aceita o formato { message } que o React Hook Form e a maioria das bibliotecas de schema retornam. Duplicatas são descartadas, e várias mensagens viram uma lista. Quando as mensagens mudam, as novas aparecem com fade e a altura se ajusta suavemente, então nada abaixo salta. Envie vazio e depois corrija uma regra por vez.
Checkboxes
Use orientation="horizontal" para colocar o checkbox ao lado do rótulo. Dentro de um <FieldSet />, a legend dá nome ao grupo inteiro.
Cards de escolha
Envolva um campo inteiro em <FieldLabel /> para fazer do card o alvo do clique. Use <FieldTitle /> dentro, já que labels não podem ser aninhados. O card ganha um tom quando marcado e exibe o anel de foco quando seu checkbox recebe foco.
Fieldset
<FieldSet /> agrupa campos relacionados sob um <FieldLegend />, que se torna o nome acessível do grupo. Disponha os campos lado a lado com um grid simples.
Responsivo
orientation="responsive" empilha o rótulo e o controle em espaços estreitos e os coloca lado a lado quando o <FieldGroup /> ao redor é largo o bastante. Ele responde à largura do grupo, não da janela.
Desabilitado
Desativar um <FieldSet /> desativa todos os campos e controles dentro dele. Passe disabled a um único <Field /> para desativar apenas esse.
Conteúdo longo
Rótulos, descrições e erros quebram de linha em formulários estreitos, inclusive strings sem quebra, e nunca alargam o layout.
Da direita para a esquerda
O texto, a posição do checkbox e as listas de erros seguem a direção de leitura.
- O rótulo, a descrição e os erros visíveis são vinculados ao controle para você, então os leitores de tela anunciam os três quando ele recebe foco.
- Controles inválidos recebem
aria-invalid, que também desenha o anel de erro. - Os erros não são regiões live. Eles são lidos quando o controle recebe foco, então validar a cada mudança não interrompe a digitação. No envio, mova o foco para o primeiro campo inválido.
- Os erros crescem e aparecem com fade no lugar em vez de empurrar o conteúdo para baixo. Com movimento reduzido ativado, aparecem sem animação.
Construído sobre o field e o fieldset do Base UI. Cada parte aceita as props do elemento ou da primitiva que renderiza.
| Prop | Tipo | Padrão |
|---|---|---|
orientation | "vertical" | "horizontal" | "responsive" | "vertical" |
indicatorMarca o rótulo a partir do atributo required do controle. Herdado de FieldGroup ou FieldSet. | "required" | "optional" | null | – |
nameIdentifica o campo quando o formulário é enviado. | string | – |
validateRetorne uma ou mais mensagens para falhar, ou nada para passar. Há suporte a async. | (value, formValues) => string | string[] | null | Promise<…> | – |
validationMode | "onSubmit" | "onBlur" | "onChange" | "onSubmit" |
validationDebounceTimeMilissegundos de espera entre as validações de onChange. | number | 0 |
invalidDefina a partir de uma biblioteca de formulários ou da resposta do servidor. | boolean | – |
disabled | boolean | false |
dirty | boolean | – |
touched | boolean | – |
actionsRefValida o campo de forma imperativa. | RefObject<{ validate: () => void }> | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="field" | Seleciona os campos no CSS. |
data-orientation | A orientação atual. |
data-disabled | Presente quando o campo está desativado. |
data-valid | Presente quando o campo é válido. |
data-invalid | Presente quando o campo é inválido. |
data-dirty | Presente depois que o valor mudou em relação ao inicial. |
data-touched | Presente depois que o controle recebeu foco e o perdeu. |
data-filled | Presente quando o controle tem um valor. |
data-focused | Presente enquanto o controle tem foco. |
| Prop | Tipo | Padrão |
|---|---|---|
nativeLabelDefina como false quando render troca o label por um elemento que não é label. | boolean | true |
optionalTextTexto exibido com indicator="optional". | ReactNode | "Optional" |
render | ReactElement | (props, state) => ReactElement | <label> |
| Atributo | Descrição |
|---|---|
data-slot="field-label" | Seleciona os rótulos no CSS. Fora de um campo, renderiza um label simples, que é como os cards de escolha funcionam. |
data-disabled | Presente quando o campo está desativado. |
data-valid | Presente quando o campo é válido. |
data-invalid | Presente quando o campo é inválido. |
data-dirty | Presente depois que o valor mudou em relação ao inicial. |
data-touched | Presente depois que o controle recebeu foco e o perdeu. |
data-filled | Presente quando o controle tem um valor. |
data-focused | Presente enquanto o controle tem foco. |
Um ícone que reflete a validade do campo. É decorativo, já que a mensagem de erro carrega o significado.
| Atributo | Descrição |
|---|---|
data-slot="field-status" | Seleciona o ícone de status no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
threshold | number | 10% of maxLength, at most 20 |
announcementMensagem para leitores de tela quando a contagem cruza o limite ou atinge o máximo. | (remaining: number) => string | – |
| Atributo | Descrição |
|---|---|
data-slot="field-counter" | Seleciona o contador no CSS. |
data-state="near" | "limit" | Presente dentro do limite e no máximo. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Atributo | Descrição |
|---|---|
data-slot="field-description" | Seleciona as descrições no CSS. |
data-disabled | Presente quando o campo está desativado. |
data-valid | Presente quando o campo é válido. |
data-invalid | Presente quando o campo é inválido. |
data-dirty | Presente depois que o valor mudou em relação ao inicial. |
data-touched | Presente depois que o controle recebeu foco e o perdeu. |
data-filled | Presente quando o controle tem um valor. |
data-focused | Presente enquanto o controle tem foco. |
| Prop | Tipo | Padrão |
|---|---|---|
matchExibe apenas para este problema de validade. true sempre exibe. | boolean | "valueMissing" | "typeMismatch" | "tooShort" | "tooLong" | "patternMismatch" | "rangeOverflow" | "rangeUnderflow" | "stepMismatch" | "badInput" | "customError" | "valid" | – |
errorsErros de uma biblioteca de formulários ou do servidor. Exibidos quando a lista tem uma mensagem. | Array<{ message?: string } | undefined> | – |
childrenO padrão é a mensagem de validação. | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="field-error" | Seleciona os erros no CSS. |
data-starting-style | Presente enquanto o erro cresce. |
data-ending-style | Presente enquanto o erro colapsa. |
data-disabled | Presente quando o campo está desativado. |
data-valid | Presente quando o campo é válido. |
data-invalid | Presente quando o campo é inválido. |
data-dirty | Presente depois que o valor mudou em relação ao inicial. |
data-touched | Presente depois que o controle recebeu foco e o perdeu. |
data-filled | Presente quando o controle tem um valor. |
data-focused | Presente enquanto o controle tem foco. |
Empilha um rótulo, uma descrição e um erro ao lado de um controle em um campo horizontal.
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
Um título com estilo de rótulo para conteúdo dentro de um <FieldLabel />, como cards de escolha.
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
Espaça os campos e é o contêiner que os campos responsivos medem.
| Prop | Tipo | Padrão |
|---|---|---|
indicatorAplica-se a todo campo dentro. | "required" | "optional" | null | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Prop | Tipo | Padrão |
|---|---|---|
indicatorAplica-se a todo campo dentro. | "required" | "optional" | null | – |
disabledDesativa todos os campos dentro. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <fieldset> |
| Atributo | Descrição |
|---|---|
data-slot="field-set" | Seleciona os fieldsets no CSS. |
data-disabled | Presente quando o fieldset está desativado. |
| Prop | Tipo | Padrão |
|---|---|---|
variantlabel corresponde ao tamanho de um rótulo de campo. | "legend" | "label" | "legend" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="field-legend" | Seleciona as legends no CSS. |
data-variant | A variante atual. |
Um <Separator /> com espaçamento para formulários, e aceita todas as suas props.
| Prop | Tipo | Padrão |
|---|---|---|
childrenTexto opcional exibido no meio da linha. | ReactNode | – |
alignOnde o texto fica ao longo da linha. | "start" | "center" | "end" | "center" |
decorativeOculta uma linha simples dos leitores de tela quando é apenas visual. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="field-separator" | Seleciona os separadores de campo no CSS. |
data-content | Presente quando o separador tem texto. |
data-slot="separator-label" | O elemento que envolve o texto. |
Envolve um checkbox ou radio e seu rótulo dentro de um grupo, para que cada item possa ser desativado individualmente.
| Prop | Tipo | Padrão |
|---|---|---|
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
Renderiza qualquer coisa a partir do estado de validade do campo, por exemplo um medidor de força ou um contador de caracteres.
| Prop | Tipo | Padrão |
|---|---|---|
children | (state: { validity, errors, error, value }) => ReactNode | – |
- InputUm campo de texto com três tamanhos, estados inválido e somente leitura, estilo de validação nativa e fonte de 16px no toque para que os celulares nunca façam zoom.
- MotionAs curvas de easing, as durações e a verificação de movimento reduzido com que todo componente anima, além de hooks para transformações de tamanho e destaques deslizantes.
- SeparatorUma linha fina que divide o conteúdo na horizontal ou na vertical, com rótulo opcional e um modo decorativo para linhas puramente visuais.
- useComposedRefMantém uma ref para o seu próprio elemento e, ao mesmo tempo, a encaminha para qualquer ref que o pai tenha passado.
- useMergedRefCombina qualquer número de refs de callback e de objeto em uma só, com a limpeza de ref do React 19 para cada uma delas.
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
Usado em blocos
Blocos que se baseiam em Field.
- API keysA página de chaves de API de um produto de IA, como nos consoles da OpenAI e da Anthropic. Crie chaves com permissões restritas e uma expiração, veja o segredo uma única vez com uma cópia que confirma, revogue com desfazer, renomeie no próprio lugar, faça a rotação com um período de tolerância e veja o uso por chave.
- BillingPlano e uso para um produto de IA, no estilo de Cursor, Claude e Vercel. Um medidor de uso dividido por modelo que projeta o fim do ciclo e avisa antes de os créditos acabarem, um gráfico diário que você pode percorrer, um limite de gastos com alertas que você pode pré-visualizar no medidor, mudanças de plano com proporcional exato, um formulário de cartão com validação real e faturas que baixam como PDF.
- ModelsA página Modelos das configurações de um produto de IA. Um modelo padrão com contexto, velocidade e custo à primeira vista, um esforço padrão que sabe o que cada modelo suporta, uma lista de modelos pesquisável agrupada por provedor com filtros, fixações e alternâncias em massa, servidores compatíveis com a OpenAI com um teste de conexão real e uma atualização que informa o que há de novo.
- NotificationsA seção Notificações das configurações de um produto de IA. Uma grade de canal por evento com alternadores por linha, por coluna e geral, horário de silêncio com uma linha ao vivo do próximo silêncio, um resumo por e-mail, envios de teste reais para desktop, e-mail, push e Slack, tratamento da permissão do navegador e um fluxo de conexão com o Slack. Encaixa em qualquer seção de Configurações.