{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "persian-textarea",
  "type": "registry:ui",
  "title": "PersianTextarea",
  "description": "ناحیهٔ متن با ویرایش نگارشی فارسی: «ي/ك» عربی، نیم‌فاصله، ویرگول و علامت سؤال فارسی و ارقام",
  "dependencies": [
    "@kashi-ui/persian@^1.8.0"
  ],
  "registryDependencies": [
    "https://kashi.sepantapouya.com/r/button.json",
    "https://kashi.sepantapouya.com/r/cx.json",
    "https://kashi.sepantapouya.com/r/input.json",
    "https://kashi.sepantapouya.com/r/kashi-provider.json"
  ],
  "files": [
    {
      "path": "registry/kashi/PersianTextarea.tsx",
      "type": "registry:ui",
      "target": "components/kashi/PersianTextarea.tsx",
      "content": "\"use client\";\n\nimport { forwardRef, useMemo, useState } from \"react\";\nimport { fixPersianText, toFaDigits } from \"@kashi-ui/persian\";\nimport { Button } from \"./Button\";\nimport { Textarea, type TextareaProps } from \"./Input\";\nimport { useKashi } from \"./KashiProvider\";\n\ntype Base = Omit<TextareaProps, \"value\" | \"defaultValue\" | \"onChange\">;\n\nexport interface PersianTextareaProps extends Base {\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  /** تبدیل ارقام لاتین داخل متن فارسی @default true */\n  fixDigits?: boolean;\n  /** اصلاح خودکار هنگام خروج از فیلد @default false */\n  fixOnBlur?: boolean;\n  labels?: { fix?: string; clean?: string };\n}\n\nconst KINDS = [\"arabic\", \"zwnj\", \"punctuation\", \"digits\", \"spacing\"] as const;\n\n/** ناحیهٔ متن با ویرایش نگارشی فارسی: «ي/ك» عربی، نیم‌فاصله، ویرگول و علامت سؤال فارسی و ارقام */\nexport const PersianTextarea = forwardRef<HTMLTextAreaElement, PersianTextareaProps>(function PersianTextarea(\n  { value, defaultValue = \"\", onValueChange, fixDigits = true, fixOnBlur = false, labels = {}, hint, onBlur, ...rest },\n  ref,\n) {\n  const { messages: M, n } = useKashi();\n  const { fix = M.textFix.fix, clean = M.textFix.clean } = labels;\n  const [inner, setInner] = useState(defaultValue);\n  const current = value ?? inner;\n  const result = useMemo(() => fixPersianText(current, { digits: fixDigits }), [current, fixDigits]);\n  const update = (next: string) => {\n    if (value === undefined) setInner(next);\n    onValueChange?.(next);\n  };\n  const summary = KINDS\n    .filter((k) => result.fixes[k])\n    .map((k) => `${n(result.fixes[k])} ${M.textFix[k]}`)\n    .join(M.common.list);\n\n  return (\n    <Textarea\n      ref={ref}\n      value={current}\n      onChange={(e) => update(e.target.value)}\n      onBlur={(e) => {\n        if (fixOnBlur && result.count) update(result.text);\n        onBlur?.(e);\n      }}\n      hint={\n        current.trim() ? (\n          <span className=\"k-textfix\" data-state={result.count ? \"fix\" : \"clean\"}>\n            <span className=\"k-textfix__text\">{result.count ? M.textFix.count(n(result.count), summary) : clean}</span>\n            {result.count > 0 && <Button size=\"xs\" variant=\"tertiary\" onClick={() => update(result.text)}>{fix}</Button>}\n          </span>\n        ) : hint\n      }\n      {...rest}\n    />\n  );\n});\n"
    }
  ]
}