{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "address-form",
  "type": "registry:ui",
  "title": "AddressForm",
  "description": "فرم نشانی",
  "dependencies": [
    "@kashi-ui/persian@^1.8.0"
  ],
  "registryDependencies": [
    "https://kashi.sepantapouya.com/r/city-select.json",
    "https://kashi.sepantapouya.com/r/cx.json",
    "https://kashi.sepantapouya.com/r/input.json",
    "https://kashi.sepantapouya.com/r/iran-map.json",
    "https://kashi.sepantapouya.com/r/kashi-provider.json",
    "https://kashi.sepantapouya.com/r/postal-code-input.json",
    "https://kashi.sepantapouya.com/r/province-select.json"
  ],
  "files": [
    {
      "path": "registry/kashi/AddressForm.tsx",
      "type": "registry:ui",
      "target": "components/kashi/AddressForm.tsx",
      "content": "\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { EMPTY_ADDRESS, getCities, type IranAddress } from \"@kashi-ui/persian\";\nimport { cx } from \"./cx\";\nimport { CitySelect } from \"./CitySelect\";\nimport { Input, Textarea } from \"./Input\";\nimport { IranMap } from \"./IranMap\";\nimport { PostalCodeInput } from \"./PostalCodeInput\";\nimport { ProvinceSelect } from \"./ProvinceSelect\";\nimport { useKashi } from \"./KashiProvider\";\n\ntype Field = keyof IranAddress;\n\nexport interface AddressFormProps {\n  value?: IranAddress;\n  defaultValue?: Partial<IranAddress>;\n  onChange?: (address: IranAddress) => void;\n  /** خطای هر فیلد، مثلاً از اعتبارسنجی سرور */\n  errors?: Partial<Record<Field, ReactNode>>;\n  /** پیشوند نام فیلدها در فرم HTML: name=\"shipping\" ← shipping[province]، shipping[city]، … */\n  name?: string;\n  /** عنوان فیلدها (legend) @default «نشانی» */\n  legend?: ReactNode;\n  /** برچسب هر فیلد */\n  labels?: Partial<Record<Field, string>>;\n  /** نقشهٔ ایران کنار فیلدها برای انتخاب استان @default false */\n  map?: boolean;\n  /** فیلد واحد اختیاری است و بقیه اجباری @default true */\n  required?: boolean;\n  disabled?: boolean;\n  className?: string;\n}\n\n\n/**\n * فرم نشانی ایرانی: استان، شهرِ همان استان، نشانی، پلاک، واحد و کد پستی ده‌رقمی.\n * با انتخاب شهر بدون استان، استان خودکار پر می‌شود؛ با عوض شدن استان، شهرِ نامربوط پاک می‌شود.\n */\nexport function AddressForm({\n  value, defaultValue, onChange, errors = {}, name, legend, labels: labelsProp, map = false, required = true, disabled, className,\n}: AddressFormProps) {\n  const [inner, setInner] = useState<IranAddress>({ ...EMPTY_ADDRESS, ...defaultValue });\n  const address = value ?? inner;\n  const { messages: M } = useKashi();\n  const A = M.address;\n  if (legend === undefined) legend = A.legend;\n  const labels: Record<Field, string> = { province: A.province, city: A.city, street: A.street, plaque: A.plaque, unit: A.unit, postalCode: A.postalCode, ...labelsProp };\n  const field = (key: Field) => (name ? `${name}[${key}]` : undefined);\n\n  const update = (patch: Partial<IranAddress>) => {\n    const next = { ...address, ...patch };\n    if (value === undefined) setInner(next);\n    onChange?.(next);\n  };\n\n  const setProvince = (province: string | null) => {\n    // شهر فقط وقتی می‌ماند که در استان تازه هم باشد (شهرهای خارج از فهرست هم پاک می‌شوند)\n    const keep = province && address.city && getCities(province).includes(address.city);\n    update({ province, city: keep ? address.city : null });\n  };\n\n  return (\n    <fieldset className={cx(\"k-address\", map && \"k-address--map\", className)} disabled={disabled}>\n      {legend && <legend className=\"k-address__legend\">{legend}</legend>}\n      <div className=\"k-address__fields\">\n        <ProvinceSelect\n          className=\"k-address__province\"\n          label={labels.province}\n          value={address.province}\n          onChange={setProvince}\n          error={errors.province}\n          required={required}\n          showCapital={false}\n          placeholder={A.provinceSearch}\n        />\n        <CitySelect\n          className=\"k-address__city\"\n          label={labels.city}\n          province={address.province}\n          value={address.city}\n          onChange={(city, province) => update({ city, ...(province && !address.province ? { province } : {}) })}\n          error={errors.city}\n          required={required}\n        />\n        <Textarea\n          fieldClassName=\"k-address__street\"\n          label={labels.street}\n          value={address.street}\n          onChange={(e) => update({ street: e.target.value })}\n          error={errors.street}\n          required={required}\n          name={field(\"street\")}\n          autoComplete=\"street-address\"\n          placeholder={A.streetHint}\n          rows={2}\n          autoResize\n        />\n        <Input\n          fieldClassName=\"k-address__plaque\"\n          label={labels.plaque}\n          value={address.plaque}\n          onChange={(e) => update({ plaque: e.target.value })}\n          error={errors.plaque}\n          required={required}\n          name={field(\"plaque\")}\n          inputMode=\"numeric\"\n          autoComplete=\"address-line2\"\n        />\n        <Input\n          fieldClassName=\"k-address__unit\"\n          label={labels.unit}\n          value={address.unit}\n          onChange={(e) => update({ unit: e.target.value })}\n          error={errors.unit}\n          optional={required}\n          name={field(\"unit\")}\n          inputMode=\"numeric\"\n          autoComplete=\"address-line3\"\n        />\n        <PostalCodeInput\n          fieldClassName=\"k-address__postal\"\n          label={labels.postalCode}\n          value={address.postalCode}\n          onValueChange={(postalCode) => update({ postalCode })}\n          error={errors.postalCode}\n          required={required}\n          name={field(\"postalCode\")}\n        />\n      </div>\n\n      {map && (\n        <IranMap\n          className=\"k-address__map\"\n          label={M.iranMap.onMap(labels.province)}\n          value={address.province}\n          onChange={setProvince}\n        />\n      )}\n\n      {name && (\n        <>\n          <input type=\"hidden\" name={field(\"province\")} value={address.province ?? \"\"} />\n          <input type=\"hidden\" name={field(\"city\")} value={address.city ?? \"\"} />\n        </>\n      )}\n    </fieldset>\n  );\n}\n"
    }
  ]
}