Textarea
For the times when you really just have a lot to say.
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
Component API
| Prop | Default | Description |
|---|---|---|
Textarea extends the Headless UI <Textarea> component | ||
disabled | false | Whether or not to disable the textarea. |
invalid | false | Whether the textarea has a validation error. |
resizable | true | Whether the textarea can be resized vertically. |
name | - | The name to use when submitting an HTML form. |
defaultValue | - | The initial value for the textarea. |
value | - | The controlled value of the textarea. |
onChange | - | Handler to call when the textarea value changes. |
rows | - | The number of visible lines in the textarea. |
Field extends the Headless UI <Field> component | ||
disabled | false | Whether or not to disable the entire field. |
Label extends the Headless UI <Label> component | ||
| This component does not expose any component-specific props. | ||
Description extends the Headless UI <Description> component | ||
| This component does not expose any component-specific props. | ||
ErrorMessage extends the Headless UI <Description> component | ||
| This component does not expose any component-specific props. | ||
Examples
Basic example
Use the Textarea component on its own to render a standalone textarea without an associated Label component:
import { Textarea } from '@/components/textarea'
function Example() {
return <Textarea aria-label="Description" name="description" />
}
import { Textarea } from '@/components/textarea'
function Example() {
return <Textarea aria-label="Description" name="description" />
}
Make sure to provide an aria-label for assistive technology, or connect the Textarea to your own <label> element
using an id.
With label
Wrap a Label and Textarea with the Field component to automatically associate them using a generated ID:
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
With description
Use the Description component to add a description above or below your Textarea:
This will be shown under the product title.
import { Description, Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Description>This will be shown under the product title.</Description>
<Textarea name="name" />
</Field>
)
}
import { Description, Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field>
<Label>Description</Label>
<Description>This will be shown under the product title.</Description>
<Textarea name="name" />
</Field>
)
}
Disabled state
Add the disabled prop to the Field component to disable an Textarea and the associated Label:
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field disabled>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example() {
return (
<Field disabled>
<Label>Description</Label>
<Textarea name="description" />
</Field>
)
}
You can also disable a textarea outside of a Field by adding the disabled prop directly to the Textarea itself.
Validation errors
Add the invalid prop to the Field component to indicate a validation error, and render the error using the
ErrorMessage component:
This field is required.
import { ErrorMessage, Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example({ errors }) {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" invalid={errors.has('description')} />
{errors.has('description') && <ErrorMessage>{errors.get('description')}</ErrorMessage>}
</Field>
)
}
import { ErrorMessage, Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
function Example({ errors }) {
return (
<Field>
<Label>Description</Label>
<Textarea name="description" invalid={errors.has('description')} />
{errors.has('description') && <ErrorMessage>{errors.get('description')}</ErrorMessage>}
</Field>
)
}
With custom layout
Use the unstyled Field component from @headlessui/react directly instead of the styled Field component to
implement a custom layout:
This will be shown under the product title.
import { Description, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
import * as Headless from '@headlessui/react'
function Example() {
return (
<Headless.Field className="grid grid-cols-12 gap-6">
<div className="col-span-5">
<Label>Description</Label>
<Description className="mt-1">This will be shown under the product title.</Description>
</div>
<div className="col-span-7">
<Textarea name="description" rows="3" />
</div>
</Headless.Field>
)
}
import { Description, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
import * as Headless from '@headlessui/react'
function Example() {
return (
<Headless.Field className="grid grid-cols-12 gap-6">
<div className="col-span-5">
<Label>Description</Label>
<Description className="mt-1">This will be shown under the product title.</Description>
</div>
<div className="col-span-7">
<Textarea name="description" rows="3" />
</div>
</Headless.Field>
)
}
Using the unstyled Field component will ensure important accessibility features are still handled for you like
generating IDs and associating elements using aria-* attributes.
Controlled component
Use the normal value and onChange props to use the Textarea component as a controlled component:
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
import { useState } from 'react'
function Example() {
let [name, setName] = useState('')
return (
<Field>
<Label>Description</Label>
<Textarea name="description" value={name} onChange={(e) => setName(e.target.value)} />
</Field>
)
}
import { Field, Label } from '@/components/fieldset'
import { Textarea } from '@/components/textarea'
import { useState } from 'react'
function Example() {
let [name, setName] = useState('')
return (
<Field>
<Label>Description</Label>
<Textarea name="description" value={name} onChange={(e) => setName(e.target.value)} />
</Field>
)
}