> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devreadykit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Textarea

> A textarea component with auto-growing support and validation states

export const TextareaWithLabelsPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaWithLabelsExample" frameBorder="0" width="100%" height="360"></iframe>;

export const TextareaReadOnlyPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaReadOnlyExample" frameBorder="0" width="100%" height="300"></iframe>;

export const TextareaFeedbackFormPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaFeedbackFormExample" frameBorder="0" width="100%" height="360"></iframe>;

export const TextareaErrorStatePreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaErrorStateExample" frameBorder="0" width="100%" height="300"></iframe>;

export const TextareaDisabledPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaDisabledExample" frameBorder="0" width="100%" height="300"></iframe>;

export const TextareaContactFormPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaContactFormExample" frameBorder="0" width="100%" height="460"></iframe>;

export const TextareaCommentSystemPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaCommentSystemExample" frameBorder="0" width="100%" height="420"></iframe>;

export const TextareaBasicPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaBasicExample" frameBorder="0" width="100%" height="300"></iframe>;

export const TextareaAutoGrowPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaAutoGrowExample" frameBorder="0" width="100%" height="300"></iframe>;

export const TextareaActionButtonPreview = () => <iframe src="https://kerny-custom.vercel.app/preview/TextareaActionButtonExample" frameBorder="0" width="100%" height="300"></iframe>;

## Overview

The Textarea component provides a multi-line text input with support for auto-growing, validation states, labels, and helper text.

## Basic Usage

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { useState } from "react";
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    export default function App() {
      const [value, setValue] = useState("");

      return (
        <div className="w-full max-w-xl space-y-4">
          <Textarea
            value={value}
            onValueChange={setValue}
            label="Message"
            placeholder="Hi! I’d like to know more about…"
            helperText="Be as specific as you can"
          />
        </div>
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaBasicPreview />
  </Tab>
</Tabs>

## Auto Growing

Enable automatic height adjustment based on content.

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    export default function AutoGrowExample() {
      return (
        <Textarea 
          label="Auto-growing textarea"
          placeholder="Type here and watch it grow..."
          autoGrow
          minRows={2}
        />
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaAutoGrowPreview />
  </Tab>
</Tabs>

## Validation States

### Error State

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    export default function ErrorExample() {
      return (
        <Textarea 
          label="Message"
          placeholder="Enter your message..."
          errorMessage="Message is required and must be at least 10 characters"
          value="Short"
        />
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaErrorStatePreview />
  </Tab>
</Tabs>

### Disabled State

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    export default function DisabledExample() {
      return (
        <Textarea 
          label="Disabled textarea"
          placeholder="Cannot edit this"
          disabled
          value="This is disabled"
        />
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaDisabledPreview />
  </Tab>
</Tabs>

### Read Only State

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    export default function ReadOnlyExample() {
      return (
        <Textarea 
          label="Read only textarea"
          placeholder="Cannot edit this"
          readOnly
          value="This is read only"
        />
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaReadOnlyPreview />
  </Tab>
</Tabs>

## With Action Button

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { Button, Textarea } from '@peppermint-design/devreadykit-custom';

    export default function ActionButtonExample() {
      return (
        <Textarea 
          label="Comment"
          placeholder="Write a comment..."
          action={
            <Button size="s" variant="plain">
              Post
            </Button>
          }
        />
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaActionButtonPreview />
  </Tab>
</Tabs>

## Props

| Prop          | Type                                          | Default | Description            |
| :------------ | :-------------------------------------------- | :------ | :--------------------- |
| value         | `string`                                      | —       | Textarea value         |
| onValueChange | `(value: string, event: ChangeEvent) => void` | —       | Change handler         |
| label         | `React.ReactNode`                             | —       | Label content          |
| helperText    | `React.ReactNode`                             | —       | Helper text            |
| errorMessage  | `React.ReactNode`                             | —       | Error message          |
| action        | `React.ReactNode`                             | —       | Action button          |
| autoGrow      | `boolean`                                     | `false` | Auto-grow height       |
| minRows       | `number`                                      | `3`     | Minimum rows           |
| required      | `boolean`                                     | `false` | Required field         |
| disabled      | `boolean`                                     | `false` | Disabled state         |
| readOnly      | `boolean`                                     | `false` | Read only state        |
| className     | `string`                                      | —       | Additional CSS classes |

## Examples

### Contact Form

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { useState, type FormEvent } from "react";
    import { Button, Textarea } from '@peppermint-design/devreadykit-custom';

    export default function ContactForm() {
      const [message, setMessage] = useState("");
      const [error, setError] = useState("");

      const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
        event.preventDefault();
        if (message.trim().length < 10) {
          setError("Message must be at least 10 characters long");
          return;
        }
        setError("");
        // Submit form
      };

      return (
        <form onSubmit={handleSubmit}>
          <Textarea
            value={message}
            onValueChange={(value) => {
              setMessage(value);
              if (error && value.trim().length >= 10) {
                setError("");
              }
            }}
            label="Your Message"
            placeholder="Tell us how we can help..."
            helperText="Please provide as much detail as possible"
            errorMessage={error}
            autoGrow
            minRows={4}
            required
          />
          
          <Button type="submit" variant="filled" className="mt-4">
            Send Message
          </Button>
        </form>
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaContactFormPreview />
  </Tab>
</Tabs>

### Comment System

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { useState } from "react";
    import { Button, Textarea } from '@peppermint-design/devreadykit-custom';

    export default function CommentInput() {
      const [comment, setComment] = useState("");
      const [comments, setComments] = useState<string[]>([]);

      const handlePost = () => {
        if (!comment.trim()) return;
        setComments((prev) => [comment.trim(), ...prev]);
        setComment("");
      };

      return (
        <div className="space-y-4">
          <Textarea
            value={comment}
            onValueChange={setComment}
            placeholder="Write a comment..."
            autoGrow
            minRows={2}
            action={
              <Button 
                size="s" 
                variant="filled"
                disabled={!comment.trim()}
                onClick={handlePost}
              >
                Post
              </Button>
            }
          />
          <div className="space-y-2">
            {comments.map((entry, index) => (
              <div key={`${entry}-${index}`} className="p-2 border rounded">
                {entry}
              </div>
            ))}
          </div>
        </div>
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaCommentSystemPreview />
  </Tab>
</Tabs>

### Feedback Form

<Tabs>
  <Tab title="Code">
    ```tsx theme={null}
    import { useState } from "react";
    import { Textarea } from '@peppermint-design/devreadykit-custom';

    const MAX_LENGTH = 500;

    export default function FeedbackForm() {
      const [feedback, setFeedback] = useState("");
      const remaining = MAX_LENGTH - feedback.length;
      const isNearLimit = remaining <= 50;

      return (
        <div>
          <Textarea
            value={feedback}
            onValueChange={setFeedback}
            label="Feedback"
            placeholder="Share your thoughts..."
            helperText={`${feedback.length}/${MAX_LENGTH} characters`}
            autoGrow
            minRows={3}
            maxLength={MAX_LENGTH}
          />
          
          <div className="mt-2 text-sm text-gray-600 font-mono">
            {isNearLimit && (
              <span className="text-orange-600 font-mono">
                {remaining} characters remaining
              </span>
            )}
          </div>
        </div>
      );
    }
    ```
  </Tab>

  <Tab title="Preview">
    <TextareaFeedbackFormPreview />
  </Tab>
</Tabs>
