TrademarkTrademark
Docs
Ctrl k
Search docs...
Form Controls

Textarea

Updated: September 14, 2026
View on GitHub

The Textarea component provides a multi-line text input field for collecting longer form text content from users. It grows with its content by default; pass lines a number to fix it at that many rows instead.

Description

Add a description to provide additional context or instructions for the textarea.

Error state

Display error messages by setting the error and errorMessage props.

Resize

Control how the textarea can be resized using the resize prop. It applies only to a fixed height — a textarea left on the default lines="auto" sizes itself, so it has no resize handle to give you.

Fixed height

A textarea resizes itself to fit its content. Pass lines a number to fix it at that many rows instead, which is also what gives it a resize handle.

Height

Use the size prop to set the height of the input.

Radius

You can use the corners prop to apply custom radius to sides or corners. It works well with the Column component's -1 gap to create a seamless connection between textareas.

State

Manage the Textarea state with React's useState hook.

Sizes

The Textarea component supports five sizes: extra small, small, medium, large, and extra large.

On touch devices

The same 16px font and 1.3 line-height clamps that Input applies on touch pointers apply here, for the same reason: below 16px, iOS Safari zooms on focus and does not reliably zoom back. A textarea grows with its content, so it anchors its floating label to a fixed top inset rather than centring the pair, but the gap between label and text is the one Input uses.

See Input for the full table.

Validation

Use the validate prop to add custom validation to the Textarea.

Character count

Display a character counter with color-coded feedback based on remaining characters. The counter changes color when approaching the limit.

Focus ring

Like Input, a textarea draws no focus ring by default. Set focusRing to outline the field on focus — see Input for the whole story.

API reference

Type
Default
idrequired
string—
label
string—
placeholder
string—
lines
numberauto
auto
size
xllmsxs
—
error
booleanfalse
errorMessage
ReactNode—
description
ReactNode—
corners
Round only some corners. Inside a [Form](/form-controls/form) with density="stacked" this is worked out for you.
nonetoprightbottomlefttop-lefttop-rightbottom-rightbottom-left
—
className
string—
prefix
ReactNode—
suffix
ReactNode—
variant
Ghost drops the border and background.
defaultghost
default
focusRing
booleanfalse
characterCount
boolean—
resize
horizontalverticalbothnone
vertical
validate
(value: ReactNode) => ReactNode | null—
disabled
booleanfalse
span
How many columns to occupy inside a [Form](/form-controls/form) grid. Ignored outside one.
number—
style
React.CSSProperties—
…and every React.TextareaHTMLAttributes propinherited—
Edit this page on GitHub
TrademarkTrademark
Built with curiosity by Lorant One and the Design Engineers Club