Textarea
Texto de varias líneas que crece con suavidad según lo que escribes entre un mínimo y un máximo de filas, con contadores, validación y un atajo para enviar.
Grows with your text, then scrolls.
pnpm dlx shadcn@latest add https://hextaui.com/r/textarea.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/textarea.tsx components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
La caja crece con tu texto, suavizándose en cada nueva línea en lugar de saltar, desde minRows hasta maxRows, y luego hace scroll. La animación nunca retrasa lo que escribes.
Enviar con un atajo
submitOnShortcut envía el formulario con ⌘ + Enter o Ctrl + Enter. Enter por sí solo sigue iniciando una nueva línea.
Contador de caracteres
Con maxLength dentro de un Field, FieldCounter cuenta mientras escribes y avisa cuando llegas al límite.
Filas
minRows y maxRows definen dónde empieza y dónde termina el crecimiento.
Tamaño fijo
autoResize={false} mantiene una altura fija con un tirador de redimensionamiento vertical.
Estados
Deshabilitado, de solo lectura y no válido. Los textareas no válidos vibran cuando falla el envío de un formulario.
De derecha a izquierda
El texto, el placeholder y el cursor siguen la dirección de lectura.
| Key | Acción |
|---|---|
| Enter | Inicia una nueva línea. |
| ⌘Enter | Envía el formulario, con submitOnShortcut. Ctrl + Enter en Windows y Linux. |
- Etiquétalo con
FieldLabeloaria-label. - En pantallas táctiles el texto es de al menos 16px, para que iOS no haga zoom al enfocarlo.
- El atajo espera mientras un método de entrada está componiendo, así que confirmar una palabra en japonés o chino nunca envía el mensaje.
- Con movimiento reducido, la caja cambia de tamaño al instante.
| Prop | Tipo | Predeterminado |
|---|---|---|
autoResizeCrece con el texto en lugar de tener una altura fija. | boolean | true |
minRows | number | 3 |
maxRows | number | 10 |
submitOnShortcutEnvía el formulario padre con ⌘/Ctrl + Enter. | boolean | false |
shakeVibra cuando el envío de un formulario lo encuentra no válido. | boolean | true |
| Atributo | Descripción |
|---|---|
data-slot="textarea" | El textarea. |
data-autoresize | Presente cuando crece con su texto. |
--textarea-min-rows / --textarea-max-rows | Se define a partir de minRows y maxRows. |
- InputUn campo de texto con tres tamaños, estados inválido y de solo lectura, estilos de validación nativos y una fuente táctil de 16px para que los móviles nunca hagan zoom.
- useAutosizeHace crecer un textarea según lo que escribes entre su altura mínima y máxima, animando cada cambio sin tocar nunca el texto.
- useComposedRefMantiene una ref a tu propio elemento y sigue reenviándola a la ref que haya pasado el padre.
- useInvalidShakeSacude un control de formulario cuando un intento de envío lo encuentra inválido, y nunca mientras alguien aún está escribiendo.
- CalendarUna cuadrícula de fechas para selección única, de rango y múltiple, con meses deslizantes, vistas previas de rango y días de tamaño táctil.
- CheckboxUna casilla de verificación cuya marca se dibuja, con padres indeterminados, grupos y etiquetas que comparten su hover.
Usado en bloques
Bloques que se construyen sobre Textarea.
- TeamMiembros del equipo e invitaciones para los ajustes del espacio de trabajo de un producto de IA. Un medidor de plazas que previsualiza las invitaciones que estás escribiendo, un cuadro de invitación que convierte una lista pegada en chips verificados, miembros con roles, búsqueda, filtros y ordenación, invitaciones pendientes con esperas para reenviar y enlaces copiables, transferencia de propiedad con confirmación escrita y eliminación con deshacer.
- Tool CallsMuestra lo que hace un agente, una línea por paso. Las lecturas y búsquedas se pliegan en un resumen breve, mientras que las ediciones, comandos, aprobaciones y errores permanecen a la vista. Cada paso se abre en una vista real: el archivo, el diff, la terminal o los resultados. Cubre todos los estados de herramienta de AI SDK, incluidas las aprobaciones con un motivo para dar otra indicación.