{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "iban-input",
  "type": "registry:ui",
  "title": "IbanInput",
  "description": "فیلد شماره شبا: IR خودکار، گروه‌بندی، تشخیص بانک با لوگو و بررسی رقم‌های کنترل",
  "dependencies": [
    "@kashi-ui/persian@^1.8.0"
  ],
  "registryDependencies": [
    "https://kashi.sepantapouya.com/r/bank-badge.json",
    "https://kashi.sepantapouya.com/r/cx.json",
    "https://kashi.sepantapouya.com/r/input.json",
    "https://kashi.sepantapouya.com/r/kashi-provider.json",
    "https://kashi.sepantapouya.com/r/use-digits-input.json",
    "https://kashi.sepantapouya.com/r/utils.json"
  ],
  "files": [
    {
      "path": "registry/kashi/IbanInput.tsx",
      "type": "registry:ui",
      "target": "components/kashi/IbanInput.tsx",
      "content": "\"use client\";\n\nimport { forwardRef, useId, useState, type ReactNode } from \"react\";\nimport { formatIban, getBankByIban, isValidIban } from \"@kashi-ui/persian\";\nimport { BankBadge } from \"./BankBadge\";\nimport { Input, type InputProps } from \"./Input\";\nimport { useDigitsInput } from \"./useDigitsInput\";\nimport { mergeRefs } from \"./utils\";\nimport { useKashi } from \"./KashiProvider\";\n\ntype Base = Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"inputMode\" | \"addonEnd\">;\n\nexport interface IbanInputProps extends Base {\n  /** مقدار کنترل‌شده: «IR» + ۲۴ رقم یا فقط ۲۴ رقم */\n  value?: string;\n  defaultValue?: string;\n  /** با هر تغییر: شبای کامل «IR…» بدون فاصله، معتبر بودن و نام بانک */\n  onValueChange?: (value: string, valid: boolean, bank: string | null) => void;\n  /** شبا معمولاً با ارقام لاتین نوشته می‌شود @default \"latin\" */\n  digits?: \"fa\" | \"latin\";\n  /** @default true */\n  showBank?: boolean;\n  /** @default true */\n  showBankLogo?: boolean;\n  /** @default \"شماره شبا معتبر نیست.\" */\n  invalidMessage?: ReactNode;\n}\n\nconst ibanOf = (d: string) => (d ? `IR${d}` : \"\");\n\n/** فیلد شماره شبا: IR خودکار، گروه‌بندی، تشخیص بانک با لوگو و بررسی رقم‌های کنترل */\nexport const IbanInput = forwardRef<HTMLInputElement, IbanInputProps>(function IbanInput(\n  { value, defaultValue, onValueChange, digits = \"latin\", showBank = true, showBankLogo = true, invalidMessage, error, name, id, onBlur, placeholder, ...rest },\n  ref,\n) {\n  const { messages: M } = useKashi();\n  invalidMessage ??= M.invalid.iban;\n  const autoId = useId();\n  const inputId = id ?? autoId;\n  const [touched, setTouched] = useState(false);\n  const strip = (v?: string) => v?.replace(/^\\s*IR/i, \"\");\n  const { raw, shown, inputRef, handleChange } = useDigitsInput({\n    value: strip(value),\n    defaultValue: strip(defaultValue),\n    maxDigits: 24,\n    format: (d) => formatIban(d),\n    digits,\n  });\n  const bank = showBank ? getBankByIban(raw) : null;\n  const showInvalid = raw.length > 0 && (touched || raw.length === 24) && !isValidIban(raw);\n  const bankId = `${inputId}-bank`;\n\n  return (\n    <>\n      <Input\n        ref={mergeRefs(ref, inputRef)}\n        id={inputId}\n        type=\"text\"\n        inputMode=\"numeric\"\n        autoComplete=\"off\"\n        spellCheck={false}\n        dir=\"ltr\"\n        placeholder={placeholder ?? \"IR00 0000 0000 0000 0000 0000 00\"}\n        value={shown}\n        onChange={(e) => {\n          // «IR» تایپ‌شده یا چسبانده‌شده حذف می‌شود و فقط ارقام می‌مانند\n          const next = handleChange(e);\n          onValueChange?.(ibanOf(next), isValidIban(next), getBankByIban(next)?.name ?? null);\n        }}\n        onBlur={(e) => {\n          setTouched(true);\n          onBlur?.(e);\n        }}\n        addonEnd={bank ? <BankBadge bank={bank} id={bankId} showLogo={showBankLogo} /> : undefined}\n        aria-describedby={bank ? bankId : undefined}\n        error={error ?? (showInvalid ? invalidMessage : undefined)}\n        {...rest}\n      />\n      {name && <input type=\"hidden\" name={name} value={ibanOf(raw)} />}\n    </>\n  );\n});\n"
    }
  ]
}