{
  "name": "textarea",
  "type": "registry:ui",
  "title": "Textarea",
  "description": "Multi-line free-form input for notes, comments and longer descriptions.",
  "registryDependencies": [
    "@siteplane/base"
  ],
  "dependencies": [
    "@base-ui/react@1.5.0"
  ],
  "files": [
    {
      "path": "src/components/ui/textarea.tsx",
      "type": "registry:ui",
      "content": "\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { useResolvedControlSize } from \"@/components/ui/siteplane-provider\";\nimport { surfaceClassNames } from \"@/components/ui/surface\";\n\nexport type TextareaProps = React.ComponentPropsWithoutRef<\"textarea\"> &\n  React.RefAttributes<HTMLTextAreaElement> & {\n    size?: \"sm\" | \"default\" | \"lg\" | \"xl\";\n    unstyled?: boolean;\n  };\n\nexport function Textarea({\n  className,\n  size,\n  unstyled = false,\n  ref,\n  ...props\n}: TextareaProps): React.ReactElement {\n  const resolvedSize = useResolvedControlSize(size);\n\n  return (\n    <span\n      className={\n        cn(\n          !unstyled && surfaceClassNames.formControl,\n          !unstyled && resolvedSize === \"xl\" && \"text-base sm:text-base\",\n          className,\n        ) || undefined\n      }\n      data-size={resolvedSize}\n      data-slot=\"textarea-control\"\n    >\n      <FieldPrimitive.Control\n        ref={ref}\n        value={props.value}\n        defaultValue={props.defaultValue}\n        disabled={props.disabled}\n        id={props.id}\n        name={props.name}\n        render={(defaultProps: React.ComponentProps<\"textarea\">) => (\n          <textarea\n            className={cn(\n              \"field-sizing-content min-h-20.5 w-full resize-y rounded-[inherit] px-[calc(--spacing(3)-1px)] py-[calc(--spacing(2)-1px)] outline-none disabled:cursor-not-allowed max-sm:min-h-23.5\",\n              resolvedSize === \"sm\" &&\n                \"min-h-16.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)] max-sm:min-h-19.5\",\n              resolvedSize === \"lg\" &&\n                \"min-h-24.5 py-[calc(--spacing(2.5)-1px)] max-sm:min-h-27.5\",\n              resolvedSize === \"xl\" &&\n                \"min-h-28.5 px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(3)-1px)] max-sm:min-h-31.5\",\n            )}\n            data-slot=\"textarea\"\n            {...mergeProps(defaultProps, props)}\n          />\n        )}\n      />\n    </span>\n  );\n}\n\nexport { FieldPrimitive };\n"
    }
  ],
  "categories": [
    "form-controls"
  ],
  "docs": "# Textarea\n\n> Siteplane UI release `0.1.1`.\n\n## Public Purpose\n\nUse Textarea for longer free-form input such as notes, comments and multi-line descriptions.\n\n## Import\n\n`import { Textarea } from \"@/components/ui/textarea\";`\n\n`import { Button } from \"@/components/ui/button\";`\n\n`import { Form } from \"@/components/ui/form\";`\n\n`import { Label } from \"@/components/ui/label\";`\n\n`import { InputGroup, InputGroupAddon, InputGroupText, InputGroupTextarea } from \"@/components/ui/input-group\";`\n\n`import { Field, FieldDescription, FieldError, FieldLabel } from \"@/components/ui/field\";`\n\n## Public API\n\n- `Textarea` accepts native textarea props plus `size=\"sm\" | \"default\" | \"lg\" | \"xl\"`.\n- `size=\"xl\"` keeps the multiline minimum-height contract while adopting the\n  customer-facing 16px field text. Use the surrounding provider's\n  `radius=\"sm\"` personality for the global 8px main corner.\n- The control supports native vertical resize and content-based auto sizing through the Siteplane styles.\n- Use `InputGroupTextarea` when leading, trailing or block add-ons belong directly to the same field.\n\n## Public Motion\n\n- Textarea itself does not translate or scale. Focus, invalid and disabled states update without changing layout measurements.\n- Manual resize remains native browser behavior and requires no reduced-motion override.\n\n## Public Accessibility\n\n- Provide a visible label; placeholders are examples or hints, not accessible names.\n- Pair invalid state with `FieldError` and keep required, disabled and loading form state explicit.\n- Add-ons must not block focus or hide the native vertical resize affordance.\n\n## Public Agent Guidance\n\n- Use Input for one-line values and Textarea for multi-line content.\n- Use `InputGroupTextarea` only for controls or hints directly coupled to the field.\n- Do not disable native resize or replace labels with placeholders without a product requirement.\n\n## Public Links\n\n- [Documentation and preview](https://ui.siteplane.io/docs/components/form-controls/textarea)\n\n- [Registry source](https://ui.siteplane.io/r/textarea.json)\n",
  "meta": {
    "siteplane:agentContractVersion": 1,
    "siteplane:docs": "https://ui.siteplane.io/docs/components/form-controls/textarea",
    "siteplane:releaseVersion": "0.1.1",
    "siteplane:sourceOwned": true
  },
  "devDependencies": []
}
