Multi-line text entry — Input's sibling, same border/focus/invalid grammar.
Anatomy
┌─────────────────────────────┐ ← border-outline-variant, │ placeholder / typed text │ rounded-control, px-3 py-2 │ │ ← rows controls initial height │ ↕│ ← resize-y only (never horizontal) └─────────────────────────────┘
Props
| Prop | Type | Default | Notes |
|---|---|---|---|
invalid | boolean | false | Sets aria-invalid + sell border. Pair with visible error text. |
rows | number | 3 | Initial height in text lines. |
className | string | — | cn-merged. |
| …rest | TextareaHTMLAttributes | — | value, onChange, placeholder, disabled, etc. |
Motion
150ms on border-color/background-color only. User resize (resize-y)
is native and unanimated.
A11y
Real <textarea> — native semantics, form participation, IME support.
invalid sets aria-invalid for screen readers; the visible error text
next to the field is the actual message. Don't cap length silently —
show a counter if a max matters.