Textarea

A standalone multi-line text input with focus rings, invalid state, and dark mode — built with Tailwind CSS.

Preview

Basic textarea

import { Textarea } from '@/registry/ui-kit/tailwind-textarea/react'

function Example() {
  return <Textarea placeholder="Write your message..." />
}

Custom rows

import { Textarea } from '@/registry/ui-kit/tailwind-textarea/react'

function Example() {
  return <Textarea placeholder="Larger area" rows={6} />
}

Invalid

import { Textarea } from '@/registry/ui-kit/tailwind-textarea/react'

function Example() {
  return <Textarea invalid placeholder="Required field" />
}

Component API

PropDefaultDescription
invalidfalseShow the textarea in an invalid/error state with red border.
className""Additional CSS classes to apply.

Source Code

"use client";

import { forwardRef } from "react";

interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
  invalid?: boolean;
  className?: string;
}

const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
  ({ invalid = false, className = "", ...props }, ref) => {
    return (
      <textarea
        ref={ref}
        aria-invalid={invalid || undefined}
        className={[
          "block w-full rounded-lg border bg-white px-3.5 py-2 text-sm text-zinc-900 shadow-sm outline-none transition-colors placeholder:text-zinc-400 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100 dark:placeholder:text-zinc-500 disabled:cursor-not-allowed disabled:opacity-50",
          invalid
            ? "border-red-500 focus:border-red-500 focus:ring-2 focus:ring-red-500/20"
            : "border-zinc-300 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 dark:focus:border-indigo-400 dark:focus:ring-indigo-400/20",
          className,
        ].join(" ")}
        {...props}
      />
    );
  }
);
Textarea.displayName = "Textarea";

export { Textarea };
export default Textarea;