{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "keyboard-fix-input",
  "type": "registry:ui",
  "title": "KeyboardFixInput",
  "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",
    "https://kashi.sepantapouya.com/r/utils.json"
  ],
  "files": [
    {
      "path": "registry/kashi/KeyboardFixInput.tsx",
      "type": "registry:ui",
      "target": "components/kashi/KeyboardFixInput.tsx",
      "content": "\"use client\";\n\nimport { forwardRef, useRef, useState, type ReactNode } from \"react\";\nimport { fixKeyboardLayout, looksLikeWrongLayout } from \"@kashi-ui/persian\";\nimport { Input, type InputProps } from \"./Input\";\nimport { mergeRefs } from \"./utils\";\nimport { useKashi } from \"./KashiProvider\";\n\ntype Base = Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\">;\n\nexport interface KeyboardFixInputProps extends Base {\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  /** \"auto\": فقط وقتی متن مشکوک است (looksLikeWrongLayout) — \"always\": برای هر متن لاتین @default \"auto\" */\n  suggest?: \"auto\" | \"always\";\n  /** متن پیشنهاد؛ fixed متن تبدیل‌شده است @default منظورتان «…» بود؟ */\n  renderSuggestion?: (fixed: string, apply: () => void) => ReactNode;\n}\n\n/**\n * فیلدی که اگر کاربر فارسی را با صفحه‌کلید انگلیسی تایپ کرده باشد («sghl»)، شکل درست («سلام») را پیشنهاد می‌دهد.\n * مناسب جستجو و فرم‌هایی که کاربر زبان صفحه‌کلید را عوض نکرده است.\n */\nexport const KeyboardFixInput = forwardRef<HTMLInputElement, KeyboardFixInputProps>(function KeyboardFixInput(\n  { value, defaultValue = \"\", onValueChange, suggest = \"auto\", renderSuggestion, hint, ...rest },\n  ref,\n) {\n  const { messages: M, locale } = useKashi();\n  const [inner, setInner] = useState(defaultValue);\n  const current = value ?? inner;\n  const el = useRef<HTMLInputElement>(null);\n  const latin = /[a-z]/i.test(current) && !/[؀-ۿ]/.test(current);\n  const show = suggest === \"always\" ? latin : looksLikeWrongLayout(current);\n  const fixed = show ? fixKeyboardLayout(current) : \"\";\n  const update = (next: string) => {\n    if (value === undefined) setInner(next);\n    onValueChange?.(next);\n  };\n  const apply = () => {\n    update(fixed);\n    el.current?.focus();\n  };\n\n  return (\n    <Input\n      ref={mergeRefs(ref, el)}\n      dir=\"auto\"\n      value={current}\n      onChange={(e) => update(e.target.value)}\n      hint={\n        show ? (\n          <span className=\"k-kbfix\" role=\"status\">\n            {renderSuggestion ? renderSuggestion(fixed, apply) : <>{M.keyboardFix.before} <button type=\"button\" className=\"k-kbfix__btn\" onClick={apply}>«{fixed}»</button>{locale === \"en\" ? \"\" : \" \"}{M.keyboardFix.after}</>}\n          </span>\n        ) : hint\n      }\n      {...rest}\n    />\n  );\n});\n"
    }
  ]
}