Textarea

Multiline text entry. Same contract as the input field — the deltas are multiline metrics: relaxed line height, a three-control minimum height, and native vertical resizing. Width remains owned by the container, so resizing cannot pull the control out of its inline layout.

States

The state vocabulary is Input's; only the content wraps.

ExampleStateDriverRolesUsage
Rest—border.defaulttext.mutedPlaceholder is never essential content
Rest, filled—text.primaryContent wraps; the user may increase the height
Hover:hoverborder.hoverThe border answers the pointer
Focus:focus-visiblefocus.ringThe engaged control — the border takes the focus color, no offset ring
Invalid[aria-invalid]status.error.border.fgPair with an error message via aria-describedby
Read-only[readonly]surface.canvasGenerated content: copyable, not editable
Disabled:disabledaction.disabled.bg.textExcluded from interaction and the tab order
Textarea · Resize and scroll

Drag the native handle to resize vertically. Content past the current height still scrolls inside the box; size.control.md × 3 is only the floor.

Usage notes

A textarea is Input, given room — the deltas are metric, not behavioral.

VerdictRule
DoApply Input's rules unchanged — the label via FormField, the placeholder as a hint, aria-invalid paired with a message via aria-describedby.
DoReserve textarea for genuinely multiline content — a generous-feeling single-line answer belongs in an input.
DoSize the control for the content you expect — min-height (size.control.md × 3) is a floor, not a ceiling, and keep the vertical resize handle available.
Don’tEnable horizontal resizing or disable resizing per instance — width belongs to the layout, while height remains adjustable by the user.