Skip to content
Esc
navigateopen⌘Jpreview
On this page

Textarea

Displays a multi-line text input.

import * as stylex from '@stylexjs/stylex';

import { container } from '@/lib/constants.stylex';

import { Textarea } from '@/components/ui/textarea';

export default function TextareaDemo() {
  return (
    <div {...stylex.props(styles.wrap)}>
      <Textarea placeholder="Type your message here." />
    </div>
  );
}

const styles = stylex.create({
  wrap: {
    width: container.lg,
  },
});

Install

npx shadcn@latest add @madeui/textarea

Usage

import { Textarea } from '@/components/ui/textarea';

<Textarea placeholder="Type your message here." />

With field

Use Field, FieldLabel, and FieldDescription to create a textarea with a label and description.

You can @mention other users and organizations.

import * as stylex from '@stylexjs/stylex';

import { Field, FieldDescription, FieldLabel } from '@/components/ui/field';
import { Textarea } from '@/components/ui/textarea';
import { container } from '@/lib/constants.stylex';

export default function TextareaWithField() {
  return (
    <Field style={styles.root}>
      <FieldLabel htmlFor="textarea-with-field-bio">Bio</FieldLabel>
      <Textarea
        id="textarea-with-field-bio"
        placeholder="Tell us a little about yourself"
      />
      <FieldDescription>
        You can @mention other users and organizations.
      </FieldDescription>
    </Field>
  );
}

const styles = stylex.create({
  root: {
    width: container.lg,
  },
});

Disabled

import * as stylex from '@stylexjs/stylex';

import { container } from '@/lib/constants.stylex';

import { Textarea } from '@/components/ui/textarea';

export default function TextareaDisabled() {
  return (
    <div {...stylex.props(styles.wrap)}>
      <Textarea placeholder="Disabled" disabled />
    </div>
  );
}

const styles = stylex.create({
  wrap: {
    width: container.lg,
  },
});

Invalid

Set invalid on Field to show validation errors — the label and error message pick up the invalid styling, and aria-invalid is applied to the textarea automatically.

import * as stylex from '@stylexjs/stylex';

import { Field, FieldError, FieldLabel } from '@/components/ui/field';
import { Textarea } from '@/components/ui/textarea';
import { container } from '@/lib/constants.stylex';

export default function TextareaInvalid() {
  return (
    <Field invalid style={styles.root}>
      <FieldLabel htmlFor="textarea-invalid-bio">Bio</FieldLabel>
      <Textarea id="textarea-invalid-bio" defaultValue="Hi" />
      <FieldError>Bio must be at least 10 characters.</FieldError>
    </Field>
  );
}

const styles = stylex.create({
  root: {
    width: container.lg,
  },
});

API reference

Textarea

Prop Type Default Description
disabled boolean false
style StyleXStyles StyleX styles merged last — always win over the component’s own styles.

All native <textarea> props are forwarded.

Was this page helpful?