Input
Um 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/input.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 class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Tamanhos
sm, default e lg correspondem às alturas dos botões, então um input e um botão do mesmo tamanho se alinham em uma linha.
Com uma descrição
Aponte aria-describedby para o texto de ajuda para que os leitores de tela o leiam depois do rótulo.
Inválido
aria-invalid deixa a borda e o anel de foco vermelhos. Vincule a mensagem com aria-describedby para que seja anunciada, e não apenas colorida.
Validação nativa
Campos com required, type="email" ou pattern só ficam vermelhos depois que alguém digitou neles ou tentou enviar, nunca na primeira renderização. Um envio que encontra um campo inválido o balança uma vez, para que o olhar caia no que precisa de correção. Ele nunca balança enquanto você digita ou navega com Tab. Envie o formulário vazio para ver.
Desabilitado
Um input desativado não pode receber foco, ser editado nem ser enviado com o formulário.
Somente leitura
readOnly mantém o valor focável, selecionável e enviado, com uma superfície atenuada para que não pareça editável. Prefira-o a disabled para valores que as pessoas precisam copiar.
Arquivo
type="file" recebe a mesma moldura, com o botão do navegador reestilizado como texto simples.
Tipos de input
Password, number, search, date e time compartilham a mesma altura e moldura. No modo escuro, os seletores e spinners do navegador também ficam escuros.
Controlado
onValueChange entrega a string diretamente, então não há event.target.value para desembrulhar. onChange também continua funcionando.
Com um botão
Lado a lado com um espaço, ou unidos em um único controle dentro de um <ButtonGroup />, onde o input ocupa a largura restante.
Grid
Os inputs preenchem seu contêiner, então coloque-os em um grid. Dê às células do grid min-w-0 para que valores longos não estiquem uma coluna.
Conteúdo longo
Valores longos rolam dentro do campo e placeholders longos são cortados, sem alargar o layout.
Da direita para a esquerda
O texto, o cursor e o padding seguem a direção. Use dir="auto" em campos que guardam valores da esquerda para a direita, como um endereço de e-mail em um formulário em árabe.
- Todo input precisa de um nome. Use um
<label>comhtmlFor, ouaria-labelquando não houver rótulo visível. Um placeholder não é um rótulo. - Conecte o texto de ajuda e de erro com
aria-describedby, e definaaria-invalidsomente quando houver um erro para mostrar. - Em telas sensíveis ao toque, o texto tem pelo menos 16px, para que o Safari do iOS não aplique zoom na página quando o input recebe foco.
- Dentro de um
Fielddo Base UI, o rótulo, a descrição, o erro e a validade são ligados para você.
Construído sobre o input do Base UI. Aceita todos os atributos nativos de input.
| Prop | Tipo | Padrão |
|---|---|---|
sizeAltura e padding, alinhados aos botões. | "sm" | "default" | "lg" | "default" |
htmlSizeO atributo nativo size, renomeado porque size é a variant. | number | – |
value | string | number | string[] | – |
defaultValue | string | number | string[] | – |
onValueChangeChamado com o novo valor a cada mudança. | (value: string, details) => void | – |
type | string | "text" |
disabled | boolean | false |
readOnly | boolean | false |
aria-invalidMostra a borda de inválido e o anel de foco. | boolean | – |
className | string | (state) => string | – |
shakeBalança uma vez quando o envio de um formulário encontra este input inválido. Funciona com validação nativa, o Field do Base UI e bibliotecas que definem aria-invalid. Ignorado com movimento reduzido. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <input> |
| Atributo | Descrição |
|---|---|
data-slot="input" | Seleciona o input no CSS. |
data-size | O tamanho atual. |
data-shake | Presente enquanto o input balança após um envio malsucedido. |
data-disabled | Presente quando o input está desativado. |
data-invalid | Presente quando o Field ao redor é inválido. Estilizado como aria-invalid. |
data-valid | Presente quando o Field ao redor é válido. |
data-touched | Presente depois que o input perdeu o foco uma vez, dentro de um Field. |
data-dirty | Presente depois que o valor mudou, dentro de um Field. |
data-filled | Presente quando o input tem um valor, dentro de um Field. |
data-focused | Presente enquanto tem foco, dentro de um Field. |
Os nomes de classe por trás do input, para estilizar outro elemento de forma equivalente, como um <select> ou <textarea> nativo. Chame com { size }.
A contagem de caracteres por trás de <InputGroupCount /> e <FieldCounter />. Use essas partes, que leem o campo para você. Recorra a esta apenas quando você mesmo acompanhar o tamanho.
| Prop | Tipo | Padrão |
|---|---|---|
lengthObrigatório. | number | – |
maxLength | number | null | – |
threshold | number | 10% of maxLength, at most 20 |
announcement | (remaining: number) => string | – |
| Atributo | Descrição |
|---|---|
data-slot="input-count" | Selecione a contagem no CSS. |
data-state="near" | "limit" | Presente dentro do limite e no máximo. |
- 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.
- Number flowNúmeros animados em que só os dígitos alterados giram, com qualquer formato Intl e locale.
- useAutosizeFaz um textarea crescer conforme o que você escreve entre a altura mínima e a máxima, animando cada mudança sem nunca tocar no texto.
- useComposedRefMantém uma ref para o seu próprio elemento e, ao mesmo tempo, a encaminha para qualquer ref que o pai tenha passado.
- useInvalidShakeSacode um controle de formulário quando uma tentativa de envio o encontra inválido, e nunca enquanto alguém ainda está digitando.
- 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.
Usado em blocos
Blocos que se baseiam em Input.
- 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.