{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "national-id-input",
  "type": "registry:ui",
  "title": "NationalIdInput",
  "description": "فیلد کد ملی: ارقام فارسی و لاتین را می‌پذیرد، ۱۰ رقم را محدود و رقم کنترل را بررسی می‌کند.",
  "dependencies": [
    "@kashi-ui/persian@^1.8.0"
  ],
  "registryDependencies": [
    "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/NationalIdInput.tsx",
      "type": "registry:ui",
      "target": "components/kashi/NationalIdInput.tsx",
      "content": "\"use client\";\n\nimport { forwardRef, useState, type ReactNode } from \"react\";\nimport { isValidNationalId, onlyDigits, toFaDigits } from \"@kashi-ui/persian\";\nimport { Input, type InputProps } from \"./Input\";\nimport { useKashi } from \"./KashiProvider\";\n\ntype Base = Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"inputMode\">;\n\nexport interface NationalIdInputProps extends Base {\n  /** مقدار کنترل‌شده با ارقام لاتین، مثل \"0013542419\" */\n  value?: string;\n  defaultValue?: string;\n  /** با هر تغییر: مقدار با ارقام لاتین و معتبر بودن آن */\n  onValueChange?: (value: string, valid: boolean) => void;\n  /** خط ارقام نمایشی @default \"fa\" */\n  digits?: \"fa\" | \"latin\";\n  /** @default \"کد ملی معتبر نیست.\" */\n  invalidMessage?: ReactNode;\n}\n\n/** فیلد کد ملی: ارقام فارسی و لاتین را می‌پذیرد، ۱۰ رقم را محدود و رقم کنترل را بررسی می‌کند. */\nexport const NationalIdInput = forwardRef<HTMLInputElement, NationalIdInputProps>(function NationalIdInput(\n  { value, defaultValue = \"\", onValueChange, digits, invalidMessage, error, name, onBlur, placeholder, ...rest },\n  ref,\n) {\n  const { messages: M, digits: D, locale } = useKashi();\n  digits ??= D;\n  invalidMessage ??= M.invalid.nationalId;\n  const [inner, setInner] = useState(() => onlyDigits(defaultValue).slice(0, 10));\n  const [touched, setTouched] = useState(false);\n  const raw = value !== undefined ? onlyDigits(value).slice(0, 10) : inner;\n  // خطا فقط پس از خروج از فیلد یا کامل شدن ۱۰ رقم نمایش داده می‌شود\n  const showInvalid = raw.length > 0 && (touched || raw.length === 10) && !isValidNationalId(raw);\n\n  return (\n    <>\n      <Input\n        ref={ref}\n        type=\"text\"\n        inputMode=\"numeric\"\n        autoComplete=\"off\"\n        dir=\"ltr\"\n        placeholder={placeholder ?? (digits === \"fa\" ? \"۰۰۰۰۰۰۰۰۰۰\" : \"0000000000\")}\n        value={digits === \"fa\" ? toFaDigits(raw) : raw}\n        onChange={(e) => {\n          const next = onlyDigits(e.target.value).slice(0, 10);\n          if (value === undefined) setInner(next);\n          onValueChange?.(next, isValidNationalId(next));\n        }}\n        onBlur={(e) => {\n          setTouched(true);\n          onBlur?.(e);\n        }}\n        error={error ?? (showInvalid ? invalidMessage : undefined)}\n        {...rest}\n      />\n      {name && <input type=\"hidden\" name={name} value={raw} />}\n    </>\n  );\n});\n"
    }
  ]
}