{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "textarea",
  "type": "registry:ui",
  "title": "Textarea",
  "description": "Native-first multiline textarea primitive with token-backed focus, invalid, disabled, read-only, density, resize, dark mode, and FormField-compatible styling.",
  "dependencies": [],
  "devDependencies": [],
  "registryDependencies": [
    "https://components.dethink.co.uk/r/dethink-base.json"
  ],
  "files": [
    {
      "path": "packages/components/src/components/textarea/textarea.tsx",
      "type": "registry:file",
      "target": "~/components/dethink/components/textarea/textarea.tsx",
      "content": "import { forwardRef, type TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TextareaControlSize = \"sm\" | \"md\" | \"lg\";\nexport type TextareaResize = \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n  controlSize?: TextareaControlSize;\n  invalid?: boolean;\n  resize?: TextareaResize;\n}\n\nconst textareaBaseClasses =\n  \"w-full min-w-0 rounded-md border border-input bg-background text-foreground shadow-sm outline-none motion-safe:transition-[border-color,box-shadow,background-color] motion-safe:duration-[var(--dt-motion-fast)] motion-safe:ease-control placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-60 read-only:bg-muted/40 read-only:text-muted-foreground aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-2 aria-[invalid=true]:ring-destructive/15 data-[invalid=true]:border-destructive data-[invalid=true]:ring-2 data-[invalid=true]:ring-destructive/15\";\n\nconst textareaControlSizeClasses: Record<TextareaControlSize, string> = {\n  sm: \"min-h-20 px-[var(--dt-space-2-5)] py-[var(--dt-space-2)] text-base sm:text-sm\",\n  md: \"min-h-28 px-[var(--dt-space-3)] py-[var(--dt-space-2)] text-base sm:text-sm\",\n  lg: \"min-h-36 px-[var(--dt-space-4)] py-[var(--dt-space-3)] text-base\",\n};\n\nconst textareaResizeClasses: Record<TextareaResize, string> = {\n  none: \"resize-none\",\n  vertical: \"resize-y\",\n  horizontal: \"resize-x\",\n  both: \"resize\",\n};\n\nfunction isAriaInvalid(value: TextareaProps[\"aria-invalid\"]) {\n  return (\n    value === true ||\n    value === \"true\" ||\n    value === \"grammar\" ||\n    value === \"spelling\"\n  );\n}\n\nexport function textareaClassNames({\n  className,\n  controlSize = \"md\",\n  resize = \"vertical\",\n}: Pick<TextareaProps, \"className\" | \"controlSize\" | \"resize\"> = {}) {\n  return cn(\n    textareaBaseClasses,\n    textareaControlSizeClasses[controlSize],\n    textareaResizeClasses[resize],\n    className,\n  );\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n  (\n    {\n      \"aria-invalid\": ariaInvalid,\n      className,\n      controlSize = \"md\",\n      disabled,\n      invalid = false,\n      readOnly,\n      required,\n      resize = \"vertical\",\n      ...props\n    },\n    ref,\n  ) => {\n    const resolvedInvalid = invalid || isAriaInvalid(ariaInvalid);\n\n    return (\n      <textarea\n        data-slot=\"textarea\"\n        data-size={controlSize}\n        data-resize={resize}\n        data-disabled={disabled ? \"true\" : undefined}\n        data-invalid={resolvedInvalid ? \"true\" : undefined}\n        data-readonly={readOnly ? \"true\" : undefined}\n        data-required={required ? \"true\" : undefined}\n        {...props}\n        ref={ref}\n        aria-invalid={invalid ? true : ariaInvalid}\n        disabled={disabled}\n        readOnly={readOnly}\n        required={required}\n        className={textareaClassNames({ className, controlSize, resize })}\n      />\n    );\n  },\n);\n\nTextarea.displayName = \"Textarea\";\n"
    },
    {
      "path": "packages/components/src/components/textarea/index.ts",
      "type": "registry:file",
      "target": "~/components/dethink/components/textarea/index.ts",
      "content": "export {\n  Textarea,\n  textareaClassNames,\n  type TextareaControlSize,\n  type TextareaProps,\n  type TextareaResize,\n} from \"./textarea\";\n"
    },
    {
      "path": "packages/components/src/utils/cn.ts",
      "type": "registry:file",
      "target": "~/components/dethink/utils/cn.ts",
      "content": "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n"
    }
  ]
}
