useAutosize
Faz 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-autosize.jsonAdiciona o hook e tudo de que ele depende ao seu projeto.
Copie e cole o código a seguir no seu projeto.
hooks/use-autosize.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
<Textarea autoResize> já usa este hook. Chame-o você mesmo ao renderizar seu próprio <textarea>, como um compositor de chat ou um editor inline.
A cada mudança o hook define a altura como auto, lê o scrollHeight natural e o limita ao min-height e max-height do próprio CSS do elemento. Tudo isso acontece antes da pintura, então você nunca vê o quadro recolhido. Os limites ficam no seu CSS, podendo ser responsivos ou usar lh para contar linhas.
- As mudanças de altura animam em 180ms, e uma mudança que chega no meio da animação parte da altura atual, então digitar rápido nunca salta. Com movimento reduzido, a altura muda de uma vez.
- Além de
max-heighto textarea rola. Caso contrário, a barra de rolagem fica oculta, para não piscar a cada nova linha. - Ele reajusta quando a largura muda, porque texto que quebra de outro jeito muda a altura.
- Ele escuta
inputemwindowe apenas mede. Nunca lê nem escreve o valor, então as teclas nunca são atrasadas nem perdidas.
Valores controlados
Digitar dispara input, mas definir value pelo código não. Passe o valor como terceiro argumento e o textarea se reajusta quando você insere um modelo ou o limpa.
- Defina
rows={1}eresize-none. Uma alça de redimensionamento manual briga com a altura automática. - Desligar
enabledou desmontar remove a altura e o overflow inline, devolvendo o tamanho ao seu CSS. - Em telas touch, use texto de pelo menos 16px no textarea, ou o iOS dá zoom ao focá-lo.
| Prop | Tipo | Padrão |
|---|---|---|
refO textarea a dimensionar. | RefObject<HTMLTextAreaElement | null> | – |
enabledSe deve dimensionar automaticamente. | boolean | – |
valueO valor controlado. Passe undefined para textareas não controlados. | unknown | – |
Textarea e InputGroupTextarea.
- 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.
- 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.
- Input groupUm input com ícones, texto, botões ou uma dica de teclado anexados, compartilhando uma única borda e um único anel de foco.
- TextareaTexto de várias linhas que cresce suavemente conforme o que você escreve, entre um número mínimo e máximo de linhas, com contadores, validação e um atalho de envio.