useAutosize
Agrandit un textarea selon ce que vous écrivez, entre sa hauteur minimale et maximale, en animant chaque changement sans jamais toucher au texte.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-autosize.jsonAjoute le hook et tout ce dont il dépend à votre projet.
Copiez et collez le code suivant dans votre projet.
hooks/use-autosize.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
<Textarea autoResize> utilise déjà ce hook. Appelez-le vous-même quand vous rendez votre propre <textarea>, comme un compositeur de chat ou un éditeur en ligne.
À chaque changement, le hook définit la hauteur à auto, lit le scrollHeight naturel et le borne au min-height et au max-height CSS de l'élément. Tout cela se passe avant le rendu, vous ne voyez donc jamais l'image réduite. Les bornes restent dans votre CSS : elles peuvent être responsives ou utiliser lh pour compter des lignes.
- Les changements de hauteur s'animent sur 180ms, et un changement qui survient en pleine animation repart de la hauteur actuelle, si bien qu'une frappe rapide ne saute jamais. Avec la réduction des animations, la hauteur change d'un coup.
- Au-delà de
max-height, le textarea défile. Sinon sa barre de défilement reste masquée, pour ne pas clignoter à chaque nouvelle ligne. - Il se réajuste quand la largeur change, car un texte qui passe à la ligne autrement change la hauteur.
- Il écoute
inputsurwindowet ne fait que mesurer. Il ne lit ni n'écrit jamais la valeur : les frappes ne sont donc jamais retardées ni perdues.
Valeurs contrôlées
Taper déclenche input, mais définir value depuis le code, non. Passez la valeur en troisième argument et le textarea se réajuste quand vous insérez un modèle ou le videz.
- Définissez
rows={1}etresize-none. Une poignée de redimensionnement manuel lutte contre la hauteur automatique. - Désactiver
enabledou démonter retire la hauteur et l'overflow en ligne, et rend la taille à votre CSS. - Sur écran tactile, utilisez un texte d'au moins 16px dans le textarea, sinon iOS zoome au focus.
| Prop | Type | Par défaut |
|---|---|---|
refLe textarea à dimensionner. | RefObject<HTMLTextAreaElement | null> | – |
enabledIndique s'il faut dimensionner automatiquement. | boolean | – |
valueLa valeur contrôlée. Passez undefined pour les textareas non contrôlés. | unknown | – |
Textarea et InputGroupTextarea.
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- InputUn champ de saisie texte en trois tailles, avec états invalide et lecture seule, style de validation natif et police tactile de 16px pour que les téléphones ne zooment jamais.
- Input groupUn champ de saisie avec icônes, texte, boutons ou indice clavier attachés, partageant une même bordure et un même anneau de focus.
- TextareaUn texte multiligne qui grandit en douceur selon ce que vous écrivez, entre un nombre minimal et maximal de lignes, avec compteurs, validation et raccourci d’envoi.