@code-plate/iran-cities 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/LICENSE +21 -0
- package/MIGRATION.fa.md +277 -0
- package/MIGRATION.md +272 -0
- package/NOTICE.md +17 -0
- package/README.fa.md +528 -201
- package/README.md +524 -201
- package/dist/boundaries.cjs +9218 -0
- package/dist/boundaries.cjs.map +1 -0
- package/dist/boundaries.d.cts +30 -0
- package/dist/boundaries.d.mts +30 -0
- package/dist/boundaries.mjs +9215 -0
- package/dist/boundaries.mjs.map +1 -0
- package/dist/changes-B-wz9-Gy.cjs +841 -0
- package/dist/changes-B-wz9-Gy.cjs.map +1 -0
- package/dist/changes-CMVZbfZO.d.mts +8 -0
- package/dist/changes-DLZkHBwZ.mjs +800 -0
- package/dist/changes-DLZkHBwZ.mjs.map +1 -0
- package/dist/changes-DnnwRAKl.d.cts +8 -0
- package/dist/components-B7060em0.mjs +240 -0
- package/dist/components-B7060em0.mjs.map +1 -0
- package/dist/components-BuMUB7XT.d.cts +47 -0
- package/dist/components-DZz72pd1.d.mts +47 -0
- package/dist/components-grWmOsaV.cjs +247 -0
- package/dist/components-grWmOsaV.cjs.map +1 -0
- package/dist/components.css +251 -0
- package/dist/data/cities.csv +1253 -0
- package/dist/data/cities.json +23305 -0
- package/dist/data/iran-cities.sql +1487 -0
- package/dist/data/iran-provinces.geojson +1 -0
- package/dist/data/provinces.csv +32 -0
- package/dist/data/provinces.json +460 -0
- package/dist/hooks-C6kjWLIE.mjs +134 -0
- package/dist/hooks-C6kjWLIE.mjs.map +1 -0
- package/dist/hooks-K7pTMF2R.cjs +139 -0
- package/dist/hooks-K7pTMF2R.cjs.map +1 -0
- package/dist/index.cjs +30 -9307
- package/dist/index.d.cts +25 -0
- package/dist/index.d.mts +25 -25
- package/dist/index.mjs +3 -9264
- package/dist/lite-CtNPRhU-.mjs +1926 -0
- package/dist/lite-CtNPRhU-.mjs.map +1 -0
- package/dist/lite-CutarzAc.cjs +2051 -0
- package/dist/lite-CutarzAc.cjs.map +1 -0
- package/dist/lite-react-1HVWJOWt.cjs +55 -0
- package/dist/lite-react-1HVWJOWt.cjs.map +1 -0
- package/dist/lite-react-Ds-DNmEi.mjs +20 -0
- package/dist/lite-react-Ds-DNmEi.mjs.map +1 -0
- package/dist/lite-react-components.cjs +12 -0
- package/dist/lite-react-components.cjs.map +1 -0
- package/dist/lite-react-components.d.cts +5 -0
- package/dist/lite-react-components.d.mts +5 -0
- package/dist/lite-react-components.mjs +11 -0
- package/dist/lite-react-components.mjs.map +1 -0
- package/dist/lite-react.cjs +8 -0
- package/dist/lite-react.d.cts +7 -0
- package/dist/lite-react.d.mts +7 -0
- package/dist/lite-react.mjs +2 -0
- package/dist/lite.cjs +28 -0
- package/dist/lite.d.cts +23 -0
- package/dist/lite.d.mts +23 -0
- package/dist/lite.mjs +3 -0
- package/dist/react-BKmJ476x.mjs +20 -0
- package/dist/react-BKmJ476x.mjs.map +1 -0
- package/dist/react-BZV3TkXB.cjs +55 -0
- package/dist/react-BZV3TkXB.cjs.map +1 -0
- package/dist/react-components.cjs +12 -0
- package/dist/react-components.cjs.map +1 -0
- package/dist/react-components.d.cts +5 -0
- package/dist/react-components.d.mts +5 -0
- package/dist/react-components.mjs +11 -0
- package/dist/react-components.mjs.map +1 -0
- package/dist/react.cjs +8 -9310
- package/dist/react.d.cts +7 -0
- package/dist/react.d.mts +7 -30
- package/dist/react.mjs +2 -9281
- package/dist/rolldown-runtime-78lK1XfQ.cjs +42 -0
- package/dist/rolldown-runtime-D3KUYPsf.mjs +12 -0
- package/dist/src-DRaUVbc4.mjs +4302 -0
- package/dist/src-DRaUVbc4.mjs.map +1 -0
- package/dist/src-mqZTwJfQ.cjs +4439 -0
- package/dist/src-mqZTwJfQ.cjs.map +1 -0
- package/dist/types/boundaries.d.ts +30 -0
- package/dist/types/changes.d.ts +4 -0
- package/dist/types/components.d.ts +47 -0
- package/dist/types/core.d.ts +25 -0
- package/dist/types/geo.d.ts +2 -0
- package/dist/types/hooks.d.ts +2 -0
- package/dist/types/index.d.ts +28 -0
- package/dist/types/keyboard.d.ts +3 -0
- package/dist/types/lite-react-components.d.ts +5 -0
- package/dist/types/lite-react.d.ts +7 -0
- package/dist/types/lite.d.ts +26 -0
- package/dist/types/normalize.d.ts +1 -0
- package/dist/types/packed.d.ts +16 -0
- package/dist/types/react-components.d.ts +5 -0
- package/dist/types/react.d.ts +7 -0
- package/dist/types/types.d.ts +149 -0
- package/dist/types/valibot.d.ts +23 -0
- package/dist/types/validation-shared.d.ts +11 -0
- package/dist/types/zod.d.ts +23 -0
- package/dist/types-Ds_b0yHP.d.cts +150 -0
- package/dist/types-Ds_b0yHP.d.mts +150 -0
- package/dist/valibot.cjs +47 -0
- package/dist/valibot.cjs.map +1 -0
- package/dist/valibot.d.cts +21 -0
- package/dist/valibot.d.mts +21 -0
- package/dist/valibot.mjs +38 -0
- package/dist/valibot.mjs.map +1 -0
- package/dist/validation-shared-BFilTuY1.cjs +58 -0
- package/dist/validation-shared-BFilTuY1.cjs.map +1 -0
- package/dist/validation-shared-C7l2cv4e.d.cts +8 -0
- package/dist/validation-shared-CJjGRx8p.d.mts +7 -0
- package/dist/validation-shared-mh_saZne.mjs +29 -0
- package/dist/validation-shared-mh_saZne.mjs.map +1 -0
- package/dist/zod.cjs +49 -0
- package/dist/zod.cjs.map +1 -0
- package/dist/zod.d.cts +21 -0
- package/dist/zod.d.mts +21 -0
- package/dist/zod.mjs +42 -0
- package/dist/zod.mjs.map +1 -0
- package/package.json +167 -22
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -25
- package/dist/index.mjs.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.d.ts +0 -30
- package/dist/react.mjs.map +0 -1
- package/dist/types-DwK3g-Z0.d.mts +0 -53
- package/dist/types-DwK3g-Z0.d.ts +0 -53
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changes-DLZkHBwZ.mjs","names":[],"sources":["../src/keyboard.ts","../src/normalize.ts","../src/core.ts","../src/packed.ts","../src/changes.ts"],"sourcesContent":["const LATIN_TO_PERSIAN: Readonly<Record<string, string>> = {\r\n q: 'ض',\r\n w: 'ص',\r\n e: 'ث',\r\n r: 'ق',\r\n t: 'ف',\r\n y: 'غ',\r\n u: 'ع',\r\n i: 'ه',\r\n o: 'خ',\r\n p: 'ح',\r\n '[': 'ج',\r\n ']': 'چ',\r\n a: 'ش',\r\n s: 'س',\r\n d: 'ی',\r\n f: 'ب',\r\n g: 'ل',\r\n h: 'ا',\r\n j: 'ت',\r\n k: 'ن',\r\n l: 'م',\r\n ';': 'ک',\r\n \"'\": 'گ',\r\n z: 'ظ',\r\n x: 'ط',\r\n c: 'ز',\r\n v: 'ر',\r\n b: 'ذ',\r\n n: 'د',\r\n m: 'پ',\r\n ',': 'و',\r\n '\\\\': 'پ',\r\n '`': 'پ',\r\n C: 'ژ',\r\n H: 'آ',\r\n};\r\n\r\nconst PERSIAN_TO_LATIN: Readonly<Record<string, string>> = (() => {\r\n const map: Record<string, string> = {};\r\n for (const [latin, persian] of Object.entries(LATIN_TO_PERSIAN)) {\r\n if (!(persian in map)) map[persian] = latin.toLowerCase();\r\n }\r\n map['ي'] = 'd';\r\n map['ك'] = ';';\r\n map['ئ'] = 'm';\r\n return map;\r\n})();\r\n\r\nconst HAS_LATIN_LETTER = /[a-z]/i;\r\nconst HAS_PERSIAN_LETTER = /[-ۿ]/;\r\n\r\nexport type KeyboardTarget = 'fa' | 'en';\r\n\r\nexport function convertKeyboardLayout(text: string, to: KeyboardTarget): string {\r\n const input = typeof text === 'string' ? text : '';\r\n let out = '';\r\n for (const ch of input) {\r\n if (to === 'fa') {\r\n out += LATIN_TO_PERSIAN[ch] ?? LATIN_TO_PERSIAN[ch.toLowerCase()] ?? ch;\r\n } else {\r\n out += PERSIAN_TO_LATIN[ch] ?? ch;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport function guessKeyboardTarget(text: string): KeyboardTarget | undefined {\r\n if (typeof text !== 'string') return undefined;\r\n const latin = HAS_LATIN_LETTER.test(text);\r\n const persian = HAS_PERSIAN_LETTER.test(text);\r\n if (latin && !persian) return 'fa';\r\n if (persian && !latin) return 'en';\r\n return undefined;\r\n}\r\n","const CHAR_MAP: Readonly<Record<string, string>> = {\r\n 'ي': 'ی',\r\n 'ى': 'ی',\r\n 'ئ': 'ی',\r\n 'ك': 'ک',\r\n 'ة': 'ه',\r\n 'ۀ': 'ه',\r\n 'ؤ': 'و',\r\n 'أ': 'ا',\r\n 'إ': 'ا',\r\n 'آ': 'ا',\r\n 'ٱ': 'ا',\r\n};\r\n\r\nexport function normalize(input: string): string {\r\n return input\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[۰-۹]/g, (d) => String(d.charCodeAt(0) - 0x06f0))\r\n .replace(/[٠-٩]/g, (d) => String(d.charCodeAt(0) - 0x0660))\r\n .replace(/[ً-ٰٟـ]/g, '')\r\n .replace(/[يىئكةۀؤأإآٱ]/g, (ch) => CHAR_MAP[ch] ?? ch)\r\n .replace(/[\\s\\-_'’`]+/g, '');\r\n}\r\n","import { convertKeyboardLayout, guessKeyboardTarget } from './keyboard';\r\nimport { normalize } from './normalize';\r\nimport type {\r\n City,\r\n CityId,\r\n CityKey,\r\n FlatCity,\r\n IranCities,\r\n Province,\r\n ProvinceId,\r\n ProvinceListItem,\r\n Query,\r\n SearchOptions,\r\n Stats,\r\n} from './types';\r\n\r\nexport interface RawCity {\r\n 'city-id': number;\r\n 'city-en': string;\r\n 'city-fa': string;\r\n 'name-en'?: string;\r\n lat?: number;\r\n lng?: number;\r\n 'coord-confidence'?: 'medium' | 'low';\r\n aliases?: string[];\r\n 'legacy-slugs'?: string[];\r\n primary?: boolean;\r\n}\r\n\r\nexport interface RawProvince {\r\n 'province-id': number;\r\n 'province-en': string;\r\n 'province-fa': string;\r\n 'phone-code': string;\r\n 'capital-city-id': number;\r\n 'name-en': string;\r\n neighbors: number[];\r\n cities: RawCity[];\r\n}\r\n\r\ninterface SearchKey {\r\n value: string;\r\n locale: 'en' | 'fa';\r\n}\r\n\r\ninterface SearchEntry<T> {\r\n item: T;\r\n keys: SearchKey[];\r\n isCapital: boolean;\r\n rank: number;\r\n}\r\n\r\nconst LATIN = /[a-z]/;\r\n\r\nconst LOWERCASE_WORDS = new Set(['va', 'and', 'o']);\r\n\r\nexport function displayNameFromSlug(slug: string): string {\r\n const parts = slug.split('-').filter(Boolean);\r\n let out = '';\r\n for (const part of parts) {\r\n if ((part === 'e' || part === 'ye') && out) {\r\n out += `-${part}`;\r\n continue;\r\n }\r\n const word = LOWERCASE_WORDS.has(part) && out ? part : part.charAt(0).toUpperCase() + part.slice(1);\r\n out += out ? ` ${word}` : word;\r\n }\r\n return out;\r\n}\r\n\r\nfunction toText(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\r\n return '';\r\n}\r\n\r\nfunction isPresent(value: Query | null | undefined): value is Query {\r\n return value !== undefined && value !== null && toText(value).trim() !== '';\r\n}\r\n\r\nfunction boundedLevenshtein(a: string, b: string, max: number): number {\r\n if (a === b) return 0;\r\n if (Math.abs(a.length - b.length) > max) return max + 1;\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n let prev: number[] = [];\r\n for (let j = 0; j <= b.length; j++) prev.push(j);\r\n\r\n for (let i = 1; i <= a.length; i++) {\r\n const curr: number[] = [i];\r\n let rowMin = i;\r\n for (let j = 1; j <= b.length; j++) {\r\n const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;\r\n const value = Math.min((prev[j] as number) + 1, (curr[j - 1] as number) + 1, (prev[j - 1] as number) + cost);\r\n curr.push(value);\r\n if (value < rowMin) rowMin = value;\r\n }\r\n if (rowMin > max) return max + 1;\r\n prev = curr;\r\n }\r\n return prev[b.length] as number;\r\n}\r\n\r\nfunction matchScore(query: string, target: string, fuzzy: boolean, maxDistance: number): number {\r\n if (!target) return Infinity;\r\n if (target === query) return 0;\r\n if (target.startsWith(query)) return 1;\r\n if (target.includes(query)) return 2;\r\n if (!fuzzy) return Infinity;\r\n\r\n let best = Infinity;\r\n const full = boundedLevenshtein(query, target, maxDistance);\r\n if (full <= maxDistance) best = 3 + full;\r\n\r\n if (query.length >= 3 && target.length > query.length) {\r\n for (const len of [query.length - 1, query.length, query.length + 1]) {\r\n if (len < 1 || len >= target.length) continue;\r\n const prefix = boundedLevenshtein(query, target.slice(0, len), maxDistance);\r\n if (prefix <= maxDistance) best = Math.min(best, 3.5 + prefix);\r\n }\r\n }\r\n return best;\r\n}\r\n\r\nfunction deepFreeze<T>(value: T): T {\r\n if (value && typeof value === 'object' && !Object.isFrozen(value)) {\r\n Object.freeze(value);\r\n for (const key of Object.keys(value as object)) deepFreeze((value as Record<string, unknown>)[key]);\r\n }\r\n return value;\r\n}\r\n\r\nfunction createCollator(): (a: string, b: string) => number {\r\n try {\r\n return new Intl.Collator('fa').compare;\r\n } catch {\r\n return (a, b) => (a < b ? -1 : a > b ? 1 : 0);\r\n }\r\n}\r\n\r\nfunction pickPreferred(list: FlatCity[], primaryIds: Set<CityId>): FlatCity {\r\n return (\r\n list.find((c) => c.isCapital) ??\r\n list.find((c) => primaryIds.has(c.id)) ??\r\n list.reduce((a, b) => (b.id < a.id ? b : a))\r\n );\r\n}\r\n\r\nfunction pushTo<K, V>(map: Map<K, V[]>, key: K, value: V): void {\r\n const list = map.get(key);\r\n if (!list) map.set(key, [value]);\r\n else if (!list.includes(value)) list.push(value);\r\n}\r\n\r\nfunction cityKeys(city: City): SearchKey[] {\r\n const keys: SearchKey[] = [\r\n { value: normalize(city.en), locale: 'en' },\r\n { value: normalize(city.fa), locale: 'fa' },\r\n ];\r\n for (const alias of city.aliases) {\r\n keys.push({ value: normalize(alias), locale: LATIN.test(alias.toLowerCase()) ? 'en' : 'fa' });\r\n }\r\n return keys;\r\n}\r\n\r\nexport function createApi(rawData: readonly RawProvince[]): IranCities {\r\n const compare = createCollator();\r\n const primaryIds = new Set<CityId>();\r\n const legacySlugs: Array<[CityKey, CityId]> = [];\r\n\r\n const provinces: Province[] = rawData.map((p) => {\r\n const provinceEn = p['province-en'];\r\n return {\r\n id: p['province-id'],\r\n en: provinceEn,\r\n fa: p['province-fa'],\r\n nameEn: p['name-en'],\r\n phoneCode: p['phone-code'],\r\n capitalId: p['capital-city-id'],\r\n neighborIds: [...p.neighbors],\r\n cities: p.cities.map((c) => {\r\n if (c.primary) primaryIds.add(c['city-id']);\r\n for (const slug of c['legacy-slugs'] ?? []) legacySlugs.push([slug, c['city-id']]);\r\n const city: { -readonly [K in keyof City]: City[K] } = {\r\n id: c['city-id'],\r\n isCapital: c['city-id'] === p['capital-city-id'],\r\n en: c['city-en'],\r\n fa: c['city-fa'],\r\n nameEn: c['name-en'] ?? displayNameFromSlug(c['city-en']),\r\n slug: `${provinceEn}/${c['city-en']}`,\r\n aliases: c.aliases ? [...c.aliases] : [],\r\n };\r\n if (typeof c.lat === 'number' && typeof c.lng === 'number') {\r\n city.coordinates = { lat: c.lat, lng: c.lng, confidence: c['coord-confidence'] ?? 'high' };\r\n }\r\n return city;\r\n }),\r\n };\r\n });\r\n\r\n const flatCities: FlatCity[] = [];\r\n const cityBySlug = new Map<CityKey, FlatCity>();\r\n const cityById = new Map<CityId, FlatCity>();\r\n const provinceById = new Map<ProvinceId, Province>();\r\n const provinceByPhoneCode = new Map<string, Province>();\r\n const provinceByNormKey = new Map<string, Province>();\r\n const citiesByNormKey = new Map<string, FlatCity[]>();\r\n const searchableCities: SearchEntry<FlatCity>[] = [];\r\n const searchableProvinces: SearchEntry<Province>[] = [];\r\n\r\n for (const p of provinces) {\r\n provinceById.set(p.id, p);\r\n provinceByPhoneCode.set(p.phoneCode, p);\r\n const pKeys: SearchKey[] = [\r\n { value: normalize(p.en), locale: 'en' },\r\n { value: normalize(p.fa), locale: 'fa' },\r\n ];\r\n for (const k of pKeys) if (!provinceByNormKey.has(k.value)) provinceByNormKey.set(k.value, p);\r\n searchableProvinces.push({ item: p, keys: pKeys, isCapital: false, rank: 0 });\r\n\r\n for (const c of p.cities) {\r\n const flat: FlatCity = {\r\n ...c,\r\n provinceId: p.id,\r\n provinceEn: p.en,\r\n provinceFa: p.fa,\r\n provinceNameEn: p.nameEn,\r\n phoneCode: p.phoneCode,\r\n };\r\n flatCities.push(flat);\r\n cityBySlug.set(flat.slug, flat);\r\n cityById.set(flat.id, flat);\r\n const keys = cityKeys(flat);\r\n for (const k of keys) pushTo(citiesByNormKey, k.value, flat);\r\n searchableCities.push({ item: flat, keys, isCapital: flat.isCapital, rank: 0 });\r\n }\r\n }\r\n\r\n for (const [slug, id] of legacySlugs) {\r\n const flat = cityById.get(id);\r\n if (flat && !cityBySlug.has(slug)) cityBySlug.set(slug, flat);\r\n }\r\n\r\n const cityByNormKey = new Map<string, FlatCity>();\r\n for (const [key, list] of citiesByNormKey) {\r\n list.sort((a, b) => a.id - b.id);\r\n cityByNormKey.set(key, pickPreferred(list, primaryIds));\r\n }\r\n\r\n [...searchableCities]\r\n .sort((a, b) => compare(a.item.fa, b.item.fa) || a.item.id - b.item.id)\r\n .forEach((entry, index) => {\r\n entry.rank = index;\r\n });\r\n [...searchableProvinces]\r\n .sort((a, b) => compare(a.item.fa, b.item.fa) || a.item.id - b.item.id)\r\n .forEach((entry, index) => {\r\n entry.rank = index;\r\n });\r\n\r\n const capitals: FlatCity[] = provinces.map((p) => cityById.get(p.capitalId) as FlatCity);\r\n const stats: Stats = { provinceCount: provinces.length, cityCount: flatCities.length };\r\n\r\n deepFreeze(provinces);\r\n deepFreeze(flatCities);\r\n deepFreeze(capitals);\r\n deepFreeze(stats);\r\n for (const list of citiesByNormKey.values()) Object.freeze(list);\r\n\r\n const emptyCities: readonly FlatCity[] = Object.freeze([]);\r\n const emptyCityList: readonly City[] = Object.freeze([]);\r\n\r\n function rankedSearch<T>(pool: SearchEntry<T>[], query: unknown, options: SearchOptions | undefined): T[] {\r\n const opts = options ?? {};\r\n const text = toText(query);\r\n const q = normalize(text);\r\n const target = opts.keyboardFix === false || !q ? undefined : guessKeyboardTarget(text);\r\n const converted = target ? normalize(convertKeyboardLayout(text, target)) : '';\r\n if (!converted || converted === q) return rankedSearchOnce(pool, q, opts);\r\n\r\n const convertedOptions: SearchOptions = { ...opts, locale: target, emptyQuery: 'none' };\r\n const strictOptions: SearchOptions = { ...opts, fuzzy: false, limit: 1 };\r\n if (rankedSearchOnce(pool, q, strictOptions).length > 0) return rankedSearchOnce(pool, q, opts);\r\n if (rankedSearchOnce(pool, converted, { ...convertedOptions, fuzzy: false, limit: 1 }).length > 0) {\r\n return rankedSearchOnce(pool, converted, convertedOptions);\r\n }\r\n const fuzzyResults = rankedSearchOnce(pool, q, opts);\r\n return fuzzyResults.length > 0 ? fuzzyResults : rankedSearchOnce(pool, converted, convertedOptions);\r\n }\r\n\r\n function rankedSearchOnce<T>(pool: SearchEntry<T>[], q: string, opts: SearchOptions): T[] {\r\n const limit = typeof opts.limit === 'number' && opts.limit > 0 ? Math.floor(opts.limit) : undefined;\r\n if (!q) {\r\n if (opts.emptyQuery === 'none') return [];\r\n const all = pool.map((e) => e.item);\r\n return limit ? all.slice(0, limit) : all;\r\n }\r\n\r\n const locale = opts.locale ?? 'both';\r\n const fuzzy = opts.fuzzy ?? false;\r\n const requested =\r\n typeof opts.maxDistance === 'number' && opts.maxDistance >= 0 ? Math.floor(opts.maxDistance) : 2;\r\n const maxDistance = Math.min(requested, Math.floor(q.length / 3));\r\n\r\n const scored: { entry: SearchEntry<T>; score: number }[] = [];\r\n for (const entry of pool) {\r\n let score = Infinity;\r\n for (const key of entry.keys) {\r\n if (locale !== 'both' && key.locale !== locale) continue;\r\n score = Math.min(score, matchScore(q, key.value, fuzzy, maxDistance));\r\n if (score === 0) break;\r\n }\r\n if (score !== Infinity) scored.push({ entry, score });\r\n }\r\n\r\n scored.sort(\r\n (a, b) =>\r\n a.score - b.score ||\r\n Number(b.entry.isCapital) - Number(a.entry.isCapital) ||\r\n a.entry.rank - b.entry.rank,\r\n );\r\n const results = scored.map((s) => s.entry.item);\r\n return limit ? results.slice(0, limit) : results;\r\n }\r\n\r\n function asId(query: Query): number | undefined {\r\n if (typeof query === 'number') return Number.isInteger(query) ? query : undefined;\r\n const t = normalize(toText(query));\r\n return /^\\d+$/.test(t) ? Number(t) : undefined;\r\n }\r\n\r\n function cityMatches(city: City, key: string): boolean {\r\n return normalize(city.en) === key || normalize(city.fa) === key || city.aliases.some((a) => normalize(a) === key);\r\n }\r\n\r\n function getProvinces(): readonly Province[] {\r\n return provinces;\r\n }\r\n\r\n function getProvincesList(): ProvinceListItem[] {\r\n return provinces.map((p) => ({\r\n id: p.id,\r\n en: p.en,\r\n fa: p.fa,\r\n nameEn: p.nameEn,\r\n phoneCode: p.phoneCode,\r\n capitalId: p.capitalId,\r\n }));\r\n }\r\n\r\n function getProvinceById(id: ProvinceId): Province | undefined {\r\n return provinceById.get(Number(id));\r\n }\r\n\r\n function getProvince(query: Query): Province | undefined {\r\n if (!isPresent(query)) return undefined;\r\n const id = asId(query);\r\n if (id !== undefined) return provinceById.get(id);\r\n return provinceByNormKey.get(normalize(toText(query)));\r\n }\r\n\r\n function getCities(provinceQuery: Query): readonly City[] {\r\n return getProvince(provinceQuery)?.cities ?? emptyCityList;\r\n }\r\n\r\n function getAllCities(): readonly FlatCity[] {\r\n return flatCities;\r\n }\r\n\r\n function getCityById(id: CityId): FlatCity | undefined {\r\n return cityById.get(Number(id));\r\n }\r\n\r\n function getCityBySlug(slug: CityKey): FlatCity | undefined {\r\n return cityBySlug.get(toText(slug).trim());\r\n }\r\n\r\n function getCity(cityQuery: Query, provinceQuery?: Query): FlatCity | undefined {\r\n if (!isPresent(cityQuery)) return undefined;\r\n const cityId = asId(cityQuery);\r\n\r\n if (isPresent(provinceQuery)) {\r\n const province = getProvince(provinceQuery);\r\n if (!province) return undefined;\r\n const key = cityId === undefined ? normalize(toText(cityQuery)) : '';\r\n const city = province.cities.find((c) => (cityId !== undefined ? c.id === cityId : cityMatches(c, key)));\r\n return city ? cityById.get(city.id) : undefined;\r\n }\r\n\r\n if (cityId !== undefined) return cityById.get(cityId);\r\n return cityByNormKey.get(normalize(toText(cityQuery)));\r\n }\r\n\r\n function getCitiesByName(cityQuery: string): readonly FlatCity[] {\r\n const key = normalize(toText(cityQuery));\r\n return (key && citiesByNormKey.get(key)) || emptyCities;\r\n }\r\n\r\n function isAmbiguousCityName(cityQuery: string): boolean {\r\n return getCitiesByName(cityQuery).length > 1;\r\n }\r\n\r\n function getProvinceOfCity(cityQuery: Query): Province | undefined {\r\n const city = getCity(cityQuery);\r\n return city ? provinceById.get(city.provinceId) : undefined;\r\n }\r\n\r\n function getCapital(provinceQuery: Query): FlatCity | undefined {\r\n const p = getProvince(provinceQuery);\r\n return p ? cityById.get(p.capitalId) : undefined;\r\n }\r\n\r\n function getCapitals(): FlatCity[] {\r\n return capitals.slice();\r\n }\r\n\r\n function getProvinceByPhoneCode(code: string | number): Province | undefined {\r\n let digits = normalize(toText(code)).replace(/^\\+/, '').replace(/^0+/, '');\r\n if (digits.length > 2 && digits.startsWith('98')) digits = digits.slice(2).replace(/^0+/, '');\r\n if (!/^\\d+$/.test(digits)) return undefined;\r\n return provinceByPhoneCode.get(`0${digits}`);\r\n }\r\n\r\n function searchProvinces(query: string, options?: SearchOptions): Province[] {\r\n return rankedSearch(searchableProvinces, query, options);\r\n }\r\n\r\n function searchCities(query: string, options?: SearchOptions): FlatCity[] {\r\n return rankedSearch(searchableCities, query, options);\r\n }\r\n\r\n function getNeighborProvinces(provinceQuery: Query): Province[] {\r\n const province = getProvince(provinceQuery);\r\n if (!province) return [];\r\n return province.neighborIds.map((id) => provinceById.get(id) as Province);\r\n }\r\n\r\n function areNeighborProvinces(a: Query, b: Query): boolean {\r\n const first = getProvince(a);\r\n const second = getProvince(b);\r\n return !!first && !!second && first.neighborIds.includes(second.id);\r\n }\r\n\r\n function getStats(): Stats {\r\n return stats;\r\n }\r\n\r\n return {\r\n getProvinces,\r\n getProvincesList,\r\n getProvinceById,\r\n getProvince,\r\n getCities,\r\n getAllCities,\r\n getCityById,\r\n getCityBySlug,\r\n getCity,\r\n getCitiesByName,\r\n isAmbiguousCityName,\r\n getProvinceOfCity,\r\n getCapital,\r\n getCapitals,\r\n getProvinceByPhoneCode,\r\n searchProvinces,\r\n searchCities,\r\n getNeighborProvinces,\r\n areNeighborProvinces,\r\n getStats,\r\n };\r\n}\r\n\r\n","import type { RawCity, RawProvince } from './core';\r\n\r\ntype PackedProvince = [number, string, string, string, number, string, number[], number];\r\ntype PackedExtra = [number, string | 0, string[] | 0, 0 | 1, string[] | 0];\r\n\r\nexport interface PackedData {\r\n format: number;\r\n provinces: PackedProvince[];\r\n ids: number[];\r\n en: string;\r\n fa: string;\r\n extras: PackedExtra[];\r\n confidence?: string;\r\n lat?: number[];\r\n lng?: number[];\r\n}\r\n\r\nconst SCALE = 1e7;\r\nconst CONFIDENCE: Readonly<Record<string, RawCity['coord-confidence'] | 'high'>> = {\r\n '1': 'high',\r\n '2': 'medium',\r\n '3': 'low',\r\n};\r\n\r\nexport function unpack(packed: PackedData): RawProvince[] {\r\n if (packed.format !== 1) throw new Error(`Unsupported data format ${packed.format}`);\r\n const en = packed.en.split('|');\r\n const fa = packed.fa.split('|');\r\n const extras = new Map<number, PackedExtra>();\r\n for (const extra of packed.extras) extras.set(extra[0], extra);\r\n\r\n let id = 0;\r\n let lat = 0;\r\n let lng = 0;\r\n let coordIndex = 0;\r\n let cityIndex = 0;\r\n\r\n return packed.provinces.map(([provinceId, provinceEn, provinceFa, phoneCode, capitalId, nameEn, neighbors, count]) => {\r\n const cities: RawCity[] = [];\r\n for (let n = 0; n < count; n++, cityIndex++) {\r\n id += packed.ids[cityIndex] as number;\r\n const city: RawCity = { 'city-id': id, 'city-en': en[cityIndex] as string, 'city-fa': fa[cityIndex] as string };\r\n const code = packed.confidence?.charAt(cityIndex);\r\n if (code && code !== '0' && packed.lat && packed.lng) {\r\n lat += packed.lat[coordIndex] as number;\r\n lng += packed.lng[coordIndex] as number;\r\n coordIndex++;\r\n city.lat = lat / SCALE;\r\n city.lng = lng / SCALE;\r\n const confidence = CONFIDENCE[code];\r\n if (confidence && confidence !== 'high') city['coord-confidence'] = confidence;\r\n }\r\n const extra = extras.get(cityIndex);\r\n if (extra) {\r\n if (extra[1]) city['name-en'] = extra[1];\r\n if (extra[2]) city.aliases = extra[2];\r\n if (extra[3]) city.primary = true;\r\n if (extra[4]) city['legacy-slugs'] = extra[4];\r\n }\r\n cities.push(city);\r\n }\r\n return {\r\n 'province-id': provinceId,\r\n 'province-en': provinceEn,\r\n 'province-fa': provinceFa,\r\n 'phone-code': phoneCode,\r\n 'capital-city-id': capitalId,\r\n 'name-en': nameEn,\r\n neighbors,\r\n cities,\r\n };\r\n });\r\n}\r\n","import type { DataChange } from './types';\r\n\r\nexport const DATA_VERSION: string = '2.0.0';\r\n\r\nexport const DATA_CHANGES: readonly DataChange[] = Object.freeze([\r\n Object.freeze({\r\n version: '1.2.0',\r\n type: 'removed',\r\n provinceId: 20,\r\n before: Object.freeze({ fa: 'گلوگاه' }),\r\n note: 'Duplicate entry of Galugah in Mazandaran removed; the remaining entry keeps the city.',\r\n }),\r\n Object.freeze({\r\n version: '1.2.0',\r\n type: 'renamed',\r\n cityId: 402,\r\n before: Object.freeze({ en: \"sowme'eh-sara\", slug: \"gilan/sowme'eh-sara\" }),\r\n after: Object.freeze({ en: 'sowmeeh-sara', fa: 'صومعه سرا', slug: 'gilan/sowmeeh-sara' }),\r\n note: 'English id normalized to kebab-case; the old id still resolves.',\r\n }),\r\n Object.freeze({\r\n version: '1.2.0',\r\n type: 'renamed',\r\n cityId: 672,\r\n before: Object.freeze({ en: 'هلشی', slug: 'kermanshah/هلشی' }),\r\n after: Object.freeze({ en: 'halashi', fa: 'هلشی', slug: 'kermanshah/halashi' }),\r\n note: 'English id was a Persian string; the old id still resolves.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 145,\r\n before: Object.freeze({ fa: 'كليبر' }),\r\n after: Object.freeze({ fa: 'کلیبر' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 147,\r\n before: Object.freeze({ fa: 'صوفيان' }),\r\n after: Object.freeze({ fa: 'صوفیان' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 152,\r\n before: Object.freeze({ fa: 'كلوانق' }),\r\n after: Object.freeze({ fa: 'کلوانق' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 418,\r\n before: Object.freeze({ fa: 'لوندويل' }),\r\n after: Object.freeze({ fa: 'لوندویل' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 438,\r\n before: Object.freeze({ fa: 'ليسار' }),\r\n after: Object.freeze({ fa: 'لیسار' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 487,\r\n before: Object.freeze({ fa: 'مريانج' }),\r\n after: Object.freeze({ fa: 'مریانج' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 529,\r\n before: Object.freeze({ fa: 'تازيان پايين' }),\r\n after: Object.freeze({ fa: 'تازیان پایین' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 545,\r\n before: Object.freeze({ fa: 'كوخرد' }),\r\n after: Object.freeze({ fa: 'کوخرد' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 551,\r\n before: Object.freeze({ fa: 'اركواز' }),\r\n after: Object.freeze({ fa: 'ارکواز' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 564,\r\n before: Object.freeze({ fa: 'موسيان' }),\r\n after: Object.freeze({ fa: 'موسیان' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 714,\r\n before: Object.freeze({ fa: 'چويبده' }),\r\n after: Object.freeze({ fa: 'چویبده' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 716,\r\n before: Object.freeze({ fa: 'صيدون' }),\r\n after: Object.freeze({ fa: 'صیدون' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 749,\r\n before: Object.freeze({ fa: 'گلگير' }),\r\n after: Object.freeze({ fa: 'گلگیر' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 910,\r\n before: Object.freeze({ fa: 'پايين هولار' }),\r\n after: Object.freeze({ fa: 'پایین هولار' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 947,\r\n before: Object.freeze({ fa: 'اسفرورين' }),\r\n after: Object.freeze({ fa: 'اسفرورین' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1025,\r\n before: Object.freeze({ fa: 'كدكن' }),\r\n after: Object.freeze({ fa: 'کدکن' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1077,\r\n before: Object.freeze({ fa: 'گلمورتي' }),\r\n after: Object.freeze({ fa: 'گلمورتی' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1107,\r\n before: Object.freeze({ fa: 'آيسک' }),\r\n after: Object.freeze({ fa: 'آیسک' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1114,\r\n before: Object.freeze({ fa: 'طبس مسينا' }),\r\n after: Object.freeze({ fa: 'طبس مسینا' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1199,\r\n before: Object.freeze({ fa: 'ايواوغلی' }),\r\n after: Object.freeze({ fa: 'ایواوغلی' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1209,\r\n before: Object.freeze({ fa: 'خليفان' }),\r\n after: Object.freeze({ fa: 'خلیفان' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1225,\r\n before: Object.freeze({ fa: 'بفروييه' }),\r\n after: Object.freeze({ fa: 'بفروییه' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1235,\r\n before: Object.freeze({ fa: 'قيدار' }),\r\n after: Object.freeze({ fa: 'قیدار' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1236,\r\n before: Object.freeze({ fa: 'هيدج' }),\r\n after: Object.freeze({ fa: 'هیدج' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n Object.freeze({\r\n version: '2.0.0',\r\n type: 'spelling',\r\n cityId: 1237,\r\n before: Object.freeze({ fa: 'صائين قلعه' }),\r\n after: Object.freeze({ fa: 'صائین قلعه' }),\r\n note: 'Arabic letters replaced with Persian ی/ک.',\r\n }),\r\n] as DataChange[]);\r\n\r\nfunction compareVersions(a: string, b: string): number {\r\n const pa = a.split('.').map(Number);\r\n const pb = b.split('.').map(Number);\r\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\r\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\r\n if (diff !== 0) return diff;\r\n }\r\n return 0;\r\n}\r\n\r\nexport function getDataChanges(sinceVersion?: string): DataChange[] {\r\n if (!sinceVersion) return DATA_CHANGES.slice();\r\n return DATA_CHANGES.filter((change) => compareVersions(change.version, sinceVersion) > 0);\r\n}\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { o as DataChange } from "./types-Ds_b0yHP.cjs";
|
|
2
|
+
declare function normalize(input: string): string;
|
|
3
|
+
type KeyboardTarget = "fa" | "en";
|
|
4
|
+
declare function convertKeyboardLayout(text: string, to: KeyboardTarget): string;
|
|
5
|
+
declare const DATA_VERSION: string;
|
|
6
|
+
declare const DATA_CHANGES: readonly DataChange[];
|
|
7
|
+
declare function getDataChanges(sinceVersion?: string): DataChange[];
|
|
8
|
+
export { convertKeyboardLayout as a, KeyboardTarget as i, DATA_VERSION as n, normalize as o, getDataChanges as r, DATA_CHANGES as t };
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
// src/components.tsx
|
|
3
|
+
let idCounter = 0;
|
|
4
|
+
function useStableId(explicit) {
|
|
5
|
+
const reactUseId = React.useId;
|
|
6
|
+
const generated = reactUseId ? reactUseId() : void 0;
|
|
7
|
+
const [fallback] = React.useState(() => `ic-${++idCounter}`);
|
|
8
|
+
return explicit !== null && explicit !== void 0 ? explicit : generated ? `ic-${generated.replace(/:/g, "")}` : fallback;
|
|
9
|
+
}
|
|
10
|
+
function classNames(...names) {
|
|
11
|
+
return names.filter(Boolean).join(" ");
|
|
12
|
+
}
|
|
13
|
+
function createComponents(api, hooks) {
|
|
14
|
+
function displayName(city, locale) {
|
|
15
|
+
return locale === "en" ? city.nameEn : city.fa;
|
|
16
|
+
}
|
|
17
|
+
function CityCombobox(props) {
|
|
18
|
+
const { value, defaultValue = null, onChange, province, label, placeholder, noResultsText = "شهری پیدا نشد", limit = 8, fuzzy = true, showProvince, locale = "fa", name, id, required, disabled, invalid, dir = "rtl", className, inputProps } = props;
|
|
19
|
+
const baseId = useStableId(id);
|
|
20
|
+
const inputId = `${baseId}-input`;
|
|
21
|
+
const listId = `${baseId}-list`;
|
|
22
|
+
const labelId = `${baseId}-label`;
|
|
23
|
+
const controlled = value !== void 0;
|
|
24
|
+
const [innerId, setInnerId] = React.useState(defaultValue);
|
|
25
|
+
const selectedId = controlled ? value !== null && value !== void 0 ? value : null : innerId;
|
|
26
|
+
const selected = selectedId === null ? void 0 : api.getCityById(selectedId);
|
|
27
|
+
const scope = province === void 0 || province === null || province === "" ? void 0 : api.getProvince(province);
|
|
28
|
+
const scopeId = scope === null || scope === void 0 ? void 0 : scope.id;
|
|
29
|
+
const [text, setText] = React.useState(() => selected ? displayName(selected, locale) : "");
|
|
30
|
+
const [open, setOpen] = React.useState(false);
|
|
31
|
+
const [active, setActive] = React.useState(-1);
|
|
32
|
+
const listRef = React.useRef(null);
|
|
33
|
+
React.useEffect(() => {
|
|
34
|
+
setText(selected ? displayName(selected, locale) : "");
|
|
35
|
+
}, [selected, locale]);
|
|
36
|
+
const results = React.useMemo(() => {
|
|
37
|
+
const found = api.searchCities(text, {
|
|
38
|
+
fuzzy,
|
|
39
|
+
emptyQuery: scopeId === void 0 ? "none" : "all",
|
|
40
|
+
limit: scopeId === void 0 ? limit : void 0
|
|
41
|
+
});
|
|
42
|
+
return (scopeId === void 0 ? found : found.filter((c) => c.provinceId === scopeId)).slice(0, limit);
|
|
43
|
+
}, [
|
|
44
|
+
text,
|
|
45
|
+
fuzzy,
|
|
46
|
+
limit,
|
|
47
|
+
scopeId
|
|
48
|
+
]);
|
|
49
|
+
const withProvince = showProvince !== null && showProvince !== void 0 ? showProvince : scopeId === void 0;
|
|
50
|
+
function select(city) {
|
|
51
|
+
if (!controlled) setInnerId(city ? city.id : null);
|
|
52
|
+
setText(city ? displayName(city, locale) : "");
|
|
53
|
+
setOpen(false);
|
|
54
|
+
setActive(-1);
|
|
55
|
+
onChange === null || onChange === void 0 || onChange(city);
|
|
56
|
+
}
|
|
57
|
+
function restore() {
|
|
58
|
+
setText(selected ? displayName(selected, locale) : "");
|
|
59
|
+
setOpen(false);
|
|
60
|
+
setActive(-1);
|
|
61
|
+
}
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
if (active < 0 || !listRef.current) return;
|
|
64
|
+
const option = listRef.current.children[active];
|
|
65
|
+
if (option && typeof option.scrollIntoView === "function") option.scrollIntoView({ block: "nearest" });
|
|
66
|
+
}, [active]);
|
|
67
|
+
function onKeyDown(event) {
|
|
68
|
+
var _inputProps$onKeyDown;
|
|
69
|
+
inputProps === null || inputProps === void 0 || (_inputProps$onKeyDown = inputProps.onKeyDown) === null || _inputProps$onKeyDown === void 0 || _inputProps$onKeyDown.call(inputProps, event);
|
|
70
|
+
if (event.defaultPrevented) return;
|
|
71
|
+
switch (event.key) {
|
|
72
|
+
case "ArrowDown":
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
if (!open) setOpen(true);
|
|
75
|
+
setActive((i) => results.length === 0 ? -1 : (i + 1) % results.length);
|
|
76
|
+
break;
|
|
77
|
+
case "ArrowUp":
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
if (!open) setOpen(true);
|
|
80
|
+
setActive((i) => results.length === 0 ? -1 : i <= 0 ? results.length - 1 : i - 1);
|
|
81
|
+
break;
|
|
82
|
+
case "Home":
|
|
83
|
+
if (open && results.length > 0) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
setActive(0);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
case "End":
|
|
89
|
+
if (open && results.length > 0) {
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
setActive(results.length - 1);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case "Enter":
|
|
95
|
+
if (open && active >= 0 && results[active]) {
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
select(results[active]);
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case "Escape":
|
|
101
|
+
if (open) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
restore();
|
|
104
|
+
} else if (text) {
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
select(null);
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case "Tab": if (open) restore();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const expanded = open && !disabled;
|
|
113
|
+
const activeId = expanded && active >= 0 ? `${baseId}-option-${active}` : void 0;
|
|
114
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
115
|
+
className: classNames("ic-field", "ic-combobox", className),
|
|
116
|
+
dir,
|
|
117
|
+
"data-open": expanded ? "" : void 0,
|
|
118
|
+
"data-invalid": invalid ? "" : void 0,
|
|
119
|
+
"data-disabled": disabled ? "" : void 0
|
|
120
|
+
}, label !== void 0 ? /* @__PURE__ */ React.createElement("label", {
|
|
121
|
+
className: "ic-label",
|
|
122
|
+
id: labelId,
|
|
123
|
+
htmlFor: inputId
|
|
124
|
+
}, label) : null, /* @__PURE__ */ React.createElement("div", { className: "ic-control" }, /* @__PURE__ */ React.createElement("input", {
|
|
125
|
+
...inputProps,
|
|
126
|
+
id: inputId,
|
|
127
|
+
className: classNames("ic-input", inputProps === null || inputProps === void 0 ? void 0 : inputProps.className),
|
|
128
|
+
type: "text",
|
|
129
|
+
role: "combobox",
|
|
130
|
+
autoComplete: "off",
|
|
131
|
+
spellCheck: false,
|
|
132
|
+
"aria-autocomplete": "list",
|
|
133
|
+
"aria-expanded": expanded,
|
|
134
|
+
"aria-controls": listId,
|
|
135
|
+
"aria-activedescendant": activeId,
|
|
136
|
+
"aria-invalid": invalid || void 0,
|
|
137
|
+
"aria-required": required || void 0,
|
|
138
|
+
placeholder,
|
|
139
|
+
disabled,
|
|
140
|
+
value: text,
|
|
141
|
+
onChange: (event) => {
|
|
142
|
+
setText(event.target.value);
|
|
143
|
+
setOpen(true);
|
|
144
|
+
setActive(-1);
|
|
145
|
+
},
|
|
146
|
+
onFocus: (event) => {
|
|
147
|
+
var _inputProps$onFocus;
|
|
148
|
+
inputProps === null || inputProps === void 0 || (_inputProps$onFocus = inputProps.onFocus) === null || _inputProps$onFocus === void 0 || _inputProps$onFocus.call(inputProps, event);
|
|
149
|
+
if (scopeId !== void 0 || text) setOpen(true);
|
|
150
|
+
},
|
|
151
|
+
onBlur: (event) => {
|
|
152
|
+
var _inputProps$onBlur;
|
|
153
|
+
inputProps === null || inputProps === void 0 || (_inputProps$onBlur = inputProps.onBlur) === null || _inputProps$onBlur === void 0 || _inputProps$onBlur.call(inputProps, event);
|
|
154
|
+
restore();
|
|
155
|
+
},
|
|
156
|
+
onKeyDown
|
|
157
|
+
}), name ? /* @__PURE__ */ React.createElement("input", {
|
|
158
|
+
type: "hidden",
|
|
159
|
+
name,
|
|
160
|
+
value: selected ? String(selected.id) : ""
|
|
161
|
+
}) : null), /* @__PURE__ */ React.createElement("ul", {
|
|
162
|
+
ref: listRef,
|
|
163
|
+
id: listId,
|
|
164
|
+
className: "ic-listbox",
|
|
165
|
+
role: "listbox",
|
|
166
|
+
"aria-labelledby": label !== void 0 ? labelId : void 0,
|
|
167
|
+
hidden: !expanded
|
|
168
|
+
}, expanded && results.length === 0 ? /* @__PURE__ */ React.createElement("li", {
|
|
169
|
+
className: "ic-empty",
|
|
170
|
+
role: "presentation"
|
|
171
|
+
}, noResultsText) : null, expanded ? results.map((city, index) => /* @__PURE__ */ React.createElement("li", {
|
|
172
|
+
key: city.id,
|
|
173
|
+
id: `${baseId}-option-${index}`,
|
|
174
|
+
className: "ic-option",
|
|
175
|
+
role: "option",
|
|
176
|
+
"aria-selected": (selected === null || selected === void 0 ? void 0 : selected.id) === city.id,
|
|
177
|
+
"data-active": index === active ? "" : void 0,
|
|
178
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
179
|
+
onMouseMove: () => setActive(index),
|
|
180
|
+
onClick: () => select(city)
|
|
181
|
+
}, /* @__PURE__ */ React.createElement("span", { className: "ic-option-name" }, displayName(city, locale)), withProvince ? /* @__PURE__ */ React.createElement("span", { className: "ic-option-meta" }, locale === "en" ? city.provinceNameEn : city.provinceFa) : null)) : null));
|
|
182
|
+
}
|
|
183
|
+
function ProvinceCitySelect(props) {
|
|
184
|
+
const { value, defaultValue, onChange, provinceLabel = "استان", cityLabel = "شهر", provincePlaceholder = "انتخاب استان", cityPlaceholder = "انتخاب شهر", provinceName, cityName, locale = "fa", id, required, disabled, invalid, layout = "row", dir = "rtl", className } = props;
|
|
185
|
+
const baseId = useStableId(id);
|
|
186
|
+
const state = hooks.useProvinceCitySelect({
|
|
187
|
+
value,
|
|
188
|
+
onChange,
|
|
189
|
+
initialProvince: defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.provinceId,
|
|
190
|
+
initialCity: defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.cityId
|
|
191
|
+
});
|
|
192
|
+
const provinceList = state.provinces;
|
|
193
|
+
const sortedProvinces = React.useMemo(() => locale === "en" ? provinceList.slice().sort((a, b) => a.nameEn.localeCompare(b.nameEn, "en")) : provinceList.slice().sort((a, b) => a.fa.localeCompare(b.fa, "fa")), [provinceList, locale]);
|
|
194
|
+
const sortedCities = React.useMemo(() => locale === "en" ? state.cities.slice().sort((a, b) => a.nameEn.localeCompare(b.nameEn, "en")) : state.cities.slice().sort((a, b) => a.fa.localeCompare(b.fa, "fa")), [state.cities, locale]);
|
|
195
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
196
|
+
className: classNames("ic-group", className),
|
|
197
|
+
dir,
|
|
198
|
+
"data-layout": layout,
|
|
199
|
+
"data-invalid": invalid ? "" : void 0,
|
|
200
|
+
"data-disabled": disabled ? "" : void 0
|
|
201
|
+
}, /* @__PURE__ */ React.createElement("div", { className: "ic-field" }, /* @__PURE__ */ React.createElement("label", {
|
|
202
|
+
className: "ic-label",
|
|
203
|
+
htmlFor: `${baseId}-province`
|
|
204
|
+
}, provinceLabel), /* @__PURE__ */ React.createElement("select", {
|
|
205
|
+
id: `${baseId}-province`,
|
|
206
|
+
className: "ic-select",
|
|
207
|
+
name: provinceName,
|
|
208
|
+
value: state.provinceId === void 0 ? "" : String(state.provinceId),
|
|
209
|
+
required,
|
|
210
|
+
disabled,
|
|
211
|
+
"aria-invalid": invalid || void 0,
|
|
212
|
+
onChange: (event) => state.setProvince(event.target.value === "" ? "" : Number(event.target.value))
|
|
213
|
+
}, /* @__PURE__ */ React.createElement("option", { value: "" }, provincePlaceholder), sortedProvinces.map((p) => /* @__PURE__ */ React.createElement("option", {
|
|
214
|
+
key: p.id,
|
|
215
|
+
value: p.id
|
|
216
|
+
}, locale === "en" ? p.nameEn : p.fa)))), /* @__PURE__ */ React.createElement("div", { className: "ic-field" }, /* @__PURE__ */ React.createElement("label", {
|
|
217
|
+
className: "ic-label",
|
|
218
|
+
htmlFor: `${baseId}-city`
|
|
219
|
+
}, cityLabel), /* @__PURE__ */ React.createElement("select", {
|
|
220
|
+
id: `${baseId}-city`,
|
|
221
|
+
className: "ic-select",
|
|
222
|
+
name: cityName,
|
|
223
|
+
value: state.cityId === void 0 ? "" : String(state.cityId),
|
|
224
|
+
required,
|
|
225
|
+
disabled: disabled || state.provinceId === void 0,
|
|
226
|
+
"aria-invalid": invalid || void 0,
|
|
227
|
+
onChange: (event) => state.setCity(event.target.value === "" ? "" : Number(event.target.value))
|
|
228
|
+
}, /* @__PURE__ */ React.createElement("option", { value: "" }, cityPlaceholder), sortedCities.map((c) => /* @__PURE__ */ React.createElement("option", {
|
|
229
|
+
key: c.id,
|
|
230
|
+
value: c.id
|
|
231
|
+
}, locale === "en" ? c.nameEn : c.fa)))));
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
CityCombobox,
|
|
235
|
+
ProvinceCitySelect
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
export { createComponents as t };
|
|
239
|
+
|
|
240
|
+
//# sourceMappingURL=components-B7060em0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-B7060em0.mjs","names":[],"sources":["../src/components.tsx"],"sourcesContent":["import * as React from 'react';\r\nimport type {\r\n CityId,\r\n FlatCity,\r\n IranCities,\r\n IranCitiesHooks,\r\n ProvinceCityValue,\r\n ProvinceId,\r\n Query,\r\n} from './types';\r\n\r\nexport interface CityComboboxProps {\r\n value?: CityId | null;\r\n defaultValue?: CityId | null;\r\n onChange?: (city: FlatCity | null) => void;\r\n province?: Query | null;\r\n label?: React.ReactNode;\r\n placeholder?: string;\r\n noResultsText?: React.ReactNode;\r\n limit?: number;\r\n fuzzy?: boolean;\r\n showProvince?: boolean;\r\n locale?: 'fa' | 'en';\r\n name?: string;\r\n id?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n invalid?: boolean;\r\n dir?: 'rtl' | 'ltr' | 'auto';\r\n className?: string;\r\n inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange'>;\r\n}\r\n\r\nexport interface ProvinceCitySelectProps {\r\n value?: ProvinceCityValue;\r\n defaultValue?: ProvinceCityValue;\r\n onChange?: (value: ProvinceCityValue) => void;\r\n provinceLabel?: React.ReactNode;\r\n cityLabel?: React.ReactNode;\r\n provincePlaceholder?: string;\r\n cityPlaceholder?: string;\r\n provinceName?: string;\r\n cityName?: string;\r\n locale?: 'fa' | 'en';\r\n id?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n invalid?: boolean;\r\n layout?: 'row' | 'column';\r\n dir?: 'rtl' | 'ltr' | 'auto';\r\n className?: string;\r\n}\r\n\r\nexport interface IranCitiesComponents {\r\n CityCombobox: (props: CityComboboxProps) => React.ReactElement;\r\n ProvinceCitySelect: (props: ProvinceCitySelectProps) => React.ReactElement;\r\n}\r\n\r\nlet idCounter = 0;\r\n\r\nfunction useStableId(explicit: string | undefined): string {\r\n const reactUseId = (React as unknown as { useId?: () => string }).useId;\r\n const generated = reactUseId ? reactUseId() : undefined;\r\n const [fallback] = React.useState(() => `ic-${++idCounter}`);\r\n return explicit ?? (generated ? `ic-${generated.replace(/:/g, '')}` : fallback);\r\n}\r\n\r\nfunction classNames(...names: (string | false | null | undefined)[]): string {\r\n return names.filter(Boolean).join(' ');\r\n}\r\n\r\nexport function createComponents(api: IranCities, hooks: IranCitiesHooks): IranCitiesComponents {\r\n function displayName(city: FlatCity, locale: 'fa' | 'en'): string {\r\n return locale === 'en' ? city.nameEn : city.fa;\r\n }\r\n\r\n function CityCombobox(props: CityComboboxProps): React.ReactElement {\r\n const {\r\n value,\r\n defaultValue = null,\r\n onChange,\r\n province,\r\n label,\r\n placeholder,\r\n noResultsText = 'شهری پیدا نشد',\r\n limit = 8,\r\n fuzzy = true,\r\n showProvince,\r\n locale = 'fa',\r\n name,\r\n id,\r\n required,\r\n disabled,\r\n invalid,\r\n dir = 'rtl',\r\n className,\r\n inputProps,\r\n } = props;\r\n\r\n const baseId = useStableId(id);\r\n const inputId = `${baseId}-input`;\r\n const listId = `${baseId}-list`;\r\n const labelId = `${baseId}-label`;\r\n\r\n const controlled = value !== undefined;\r\n const [innerId, setInnerId] = React.useState<CityId | null>(defaultValue);\r\n const selectedId = controlled ? value ?? null : innerId;\r\n const selected = selectedId === null ? undefined : api.getCityById(selectedId);\r\n\r\n const scope = province === undefined || province === null || province === '' ? undefined : api.getProvince(province);\r\n const scopeId: ProvinceId | undefined = scope?.id;\r\n\r\n const [text, setText] = React.useState(() => (selected ? displayName(selected, locale) : ''));\r\n const [open, setOpen] = React.useState(false);\r\n const [active, setActive] = React.useState(-1);\r\n const listRef = React.useRef<HTMLUListElement>(null);\r\n\r\n React.useEffect(() => {\r\n setText(selected ? displayName(selected, locale) : '');\r\n }, [selected, locale]);\r\n\r\n const results = React.useMemo(() => {\r\n const found = api.searchCities(text, {\r\n fuzzy,\r\n emptyQuery: scopeId === undefined ? 'none' : 'all',\r\n limit: scopeId === undefined ? limit : undefined,\r\n });\r\n const scoped = scopeId === undefined ? found : found.filter((c) => c.provinceId === scopeId);\r\n return scoped.slice(0, limit);\r\n }, [text, fuzzy, limit, scopeId]);\r\n\r\n const withProvince = showProvince ?? scopeId === undefined;\r\n\r\n function select(city: FlatCity | null): void {\r\n if (!controlled) setInnerId(city ? city.id : null);\r\n setText(city ? displayName(city, locale) : '');\r\n setOpen(false);\r\n setActive(-1);\r\n onChange?.(city);\r\n }\r\n\r\n function restore(): void {\r\n setText(selected ? displayName(selected, locale) : '');\r\n setOpen(false);\r\n setActive(-1);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (active < 0 || !listRef.current) return;\r\n const option = listRef.current.children[active] as HTMLElement | undefined;\r\n if (option && typeof option.scrollIntoView === 'function') option.scrollIntoView({ block: 'nearest' });\r\n }, [active]);\r\n\r\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\r\n inputProps?.onKeyDown?.(event);\r\n if (event.defaultPrevented) return;\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (!open) setOpen(true);\r\n setActive((i) => (results.length === 0 ? -1 : (i + 1) % results.length));\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (!open) setOpen(true);\r\n setActive((i) => (results.length === 0 ? -1 : i <= 0 ? results.length - 1 : i - 1));\r\n break;\r\n case 'Home':\r\n if (open && results.length > 0) {\r\n event.preventDefault();\r\n setActive(0);\r\n }\r\n break;\r\n case 'End':\r\n if (open && results.length > 0) {\r\n event.preventDefault();\r\n setActive(results.length - 1);\r\n }\r\n break;\r\n case 'Enter':\r\n if (open && active >= 0 && results[active]) {\r\n event.preventDefault();\r\n select(results[active] as FlatCity);\r\n }\r\n break;\r\n case 'Escape':\r\n if (open) {\r\n event.preventDefault();\r\n restore();\r\n } else if (text) {\r\n event.preventDefault();\r\n select(null);\r\n }\r\n break;\r\n case 'Tab':\r\n if (open) restore();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const expanded = open && !disabled;\r\n const activeId = expanded && active >= 0 ? `${baseId}-option-${active}` : undefined;\r\n\r\n return (\r\n <div\r\n className={classNames('ic-field', 'ic-combobox', className)}\r\n dir={dir}\r\n data-open={expanded ? '' : undefined}\r\n data-invalid={invalid ? '' : undefined}\r\n data-disabled={disabled ? '' : undefined}\r\n >\r\n {label !== undefined ? (\r\n <label className=\"ic-label\" id={labelId} htmlFor={inputId}>\r\n {label}\r\n </label>\r\n ) : null}\r\n <div className=\"ic-control\">\r\n <input\r\n {...inputProps}\r\n id={inputId}\r\n className={classNames('ic-input', inputProps?.className)}\r\n type=\"text\"\r\n role=\"combobox\"\r\n autoComplete=\"off\"\r\n spellCheck={false}\r\n aria-autocomplete=\"list\"\r\n aria-expanded={expanded}\r\n aria-controls={listId}\r\n aria-activedescendant={activeId}\r\n aria-invalid={invalid || undefined}\r\n aria-required={required || undefined}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={text}\r\n onChange={(event) => {\r\n setText(event.target.value);\r\n setOpen(true);\r\n setActive(-1);\r\n }}\r\n onFocus={(event) => {\r\n inputProps?.onFocus?.(event);\r\n if (scopeId !== undefined || text) setOpen(true);\r\n }}\r\n onBlur={(event) => {\r\n inputProps?.onBlur?.(event);\r\n restore();\r\n }}\r\n onKeyDown={onKeyDown}\r\n />\r\n {name ? <input type=\"hidden\" name={name} value={selected ? String(selected.id) : ''} /> : null}\r\n </div>\r\n <ul\r\n ref={listRef}\r\n id={listId}\r\n className=\"ic-listbox\"\r\n role=\"listbox\"\r\n aria-labelledby={label !== undefined ? labelId : undefined}\r\n hidden={!expanded}\r\n >\r\n {expanded && results.length === 0 ? (\r\n <li className=\"ic-empty\" role=\"presentation\">\r\n {noResultsText}\r\n </li>\r\n ) : null}\r\n {expanded\r\n ? results.map((city, index) => (\r\n <li\r\n key={city.id}\r\n id={`${baseId}-option-${index}`}\r\n className=\"ic-option\"\r\n role=\"option\"\r\n aria-selected={selected?.id === city.id}\r\n data-active={index === active ? '' : undefined}\r\n onMouseDown={(event) => event.preventDefault()}\r\n onMouseMove={() => setActive(index)}\r\n onClick={() => select(city)}\r\n >\r\n <span className=\"ic-option-name\">{displayName(city, locale)}</span>\r\n {withProvince ? (\r\n <span className=\"ic-option-meta\">{locale === 'en' ? city.provinceNameEn : city.provinceFa}</span>\r\n ) : null}\r\n </li>\r\n ))\r\n : null}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n\r\n function ProvinceCitySelect(props: ProvinceCitySelectProps): React.ReactElement {\r\n const {\r\n value,\r\n defaultValue,\r\n onChange,\r\n provinceLabel = 'استان',\r\n cityLabel = 'شهر',\r\n provincePlaceholder = 'انتخاب استان',\r\n cityPlaceholder = 'انتخاب شهر',\r\n provinceName,\r\n cityName,\r\n locale = 'fa',\r\n id,\r\n required,\r\n disabled,\r\n invalid,\r\n layout = 'row',\r\n dir = 'rtl',\r\n className,\r\n } = props;\r\n\r\n const baseId = useStableId(id);\r\n const state = hooks.useProvinceCitySelect({\r\n value,\r\n onChange,\r\n initialProvince: defaultValue?.provinceId,\r\n initialCity: defaultValue?.cityId,\r\n });\r\n const provinceList = state.provinces;\r\n const sortedProvinces = React.useMemo(\r\n () =>\r\n locale === 'en'\r\n ? provinceList.slice().sort((a, b) => a.nameEn.localeCompare(b.nameEn, 'en'))\r\n : provinceList.slice().sort((a, b) => a.fa.localeCompare(b.fa, 'fa')),\r\n [provinceList, locale],\r\n );\r\n const sortedCities = React.useMemo(\r\n () =>\r\n locale === 'en'\r\n ? state.cities.slice().sort((a, b) => a.nameEn.localeCompare(b.nameEn, 'en'))\r\n : state.cities.slice().sort((a, b) => a.fa.localeCompare(b.fa, 'fa')),\r\n [state.cities, locale],\r\n );\r\n\r\n return (\r\n <div\r\n className={classNames('ic-group', className)}\r\n dir={dir}\r\n data-layout={layout}\r\n data-invalid={invalid ? '' : undefined}\r\n data-disabled={disabled ? '' : undefined}\r\n >\r\n <div className=\"ic-field\">\r\n <label className=\"ic-label\" htmlFor={`${baseId}-province`}>\r\n {provinceLabel}\r\n </label>\r\n <select\r\n id={`${baseId}-province`}\r\n className=\"ic-select\"\r\n name={provinceName}\r\n value={state.provinceId === undefined ? '' : String(state.provinceId)}\r\n required={required}\r\n disabled={disabled}\r\n aria-invalid={invalid || undefined}\r\n onChange={(event) => state.setProvince(event.target.value === '' ? '' : Number(event.target.value))}\r\n >\r\n <option value=\"\">{provincePlaceholder}</option>\r\n {sortedProvinces.map((p) => (\r\n <option key={p.id} value={p.id}>\r\n {locale === 'en' ? p.nameEn : p.fa}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div className=\"ic-field\">\r\n <label className=\"ic-label\" htmlFor={`${baseId}-city`}>\r\n {cityLabel}\r\n </label>\r\n <select\r\n id={`${baseId}-city`}\r\n className=\"ic-select\"\r\n name={cityName}\r\n value={state.cityId === undefined ? '' : String(state.cityId)}\r\n required={required}\r\n disabled={disabled || state.provinceId === undefined}\r\n aria-invalid={invalid || undefined}\r\n onChange={(event) => state.setCity(event.target.value === '' ? '' : Number(event.target.value))}\r\n >\r\n <option value=\"\">{cityPlaceholder}</option>\r\n {sortedCities.map((c) => (\r\n <option key={c.id} value={c.id}>\r\n {locale === 'en' ? c.nameEn : c.fa}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return { CityCombobox, ProvinceCitySelect };\r\n}\r\n"],"mappings":";;AA0DA,IAAI,YAAY;AAEhB,SAAS,YAAY,UAAsC;CACzD,MAAM,aAAc,MAA8C;CAClE,MAAM,YAAY,aAAa,WAAW,IAAI,KAAA;CAC9C,MAAM,CAAC,YAAY,MAAM,eAAe,MAAM,EAAE,WAAW;CAC3D,OAAO,aAAA,QAAA,aAAA,KAAA,IAAA,WAAa,YAAY,MAAM,UAAU,QAAQ,MAAM,EAAE,MAAM;AACxE;AAEA,SAAS,WAAW,GAAG,OAAsD;CAC3E,OAAO,MAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACvC;AAEA,SAAgB,iBAAiB,KAAiB,OAA8C;CAC9F,SAAS,YAAY,MAAgB,QAA6B;EAChE,OAAO,WAAW,OAAO,KAAK,SAAS,KAAK;CAC9C;CAEA,SAAS,aAAa,OAA8C;EAClE,MAAM,EACJ,OACA,eAAe,MACf,UACA,UACA,OACA,aACA,gBAAgB,iBAChB,QAAQ,GACR,QAAQ,MACR,cACA,SAAS,MACT,MACA,IACA,UACA,UACA,SACA,MAAM,OACN,WACA,eACE;EAEJ,MAAM,SAAS,YAAY,EAAE;EAC7B,MAAM,UAAU,GAAG,OAAO;EAC1B,MAAM,SAAS,GAAG,OAAO;EACzB,MAAM,UAAU,GAAG,OAAO;EAE1B,MAAM,aAAa,UAAU,KAAA;EAC7B,MAAM,CAAC,SAAS,cAAc,MAAM,SAAwB,YAAY;EACxE,MAAM,aAAa,aAAa,UAAA,QAAA,UAAA,KAAA,IAAA,QAAS,OAAO;EAChD,MAAM,WAAW,eAAe,OAAO,KAAA,IAAY,IAAI,YAAY,UAAU;EAE7E,MAAM,QAAQ,aAAa,KAAA,KAAa,aAAa,QAAQ,aAAa,KAAK,KAAA,IAAY,IAAI,YAAY,QAAQ;EACnH,MAAM,UAAA,UAAA,QAAA,UAAA,KAAA,IAAA,KAAA,IAAkC,MAAO;EAE/C,MAAM,CAAC,MAAM,WAAW,MAAM,eAAgB,WAAW,YAAY,UAAU,MAAM,IAAI,EAAG;EAC5F,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,KAAK;EAC5C,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,EAAE;EAC7C,MAAM,UAAU,MAAM,OAAyB,IAAI;EAEnD,MAAM,gBAAgB;GACpB,QAAQ,WAAW,YAAY,UAAU,MAAM,IAAI,EAAE;EACvD,GAAG,CAAC,UAAU,MAAM,CAAC;EAErB,MAAM,UAAU,MAAM,cAAc;GAClC,MAAM,QAAQ,IAAI,aAAa,MAAM;IACnC;IACA,YAAY,YAAY,KAAA,IAAY,SAAS;IAC7C,OAAO,YAAY,KAAA,IAAY,QAAQ,KAAA;GACzC,CAAC;GAED,QADe,YAAY,KAAA,IAAY,QAAQ,MAAM,QAAQ,MAAM,EAAE,eAAe,OAAO,EAAA,CAC7E,MAAM,GAAG,KAAK;EAC9B,GAAG;GAAC;GAAM;GAAO;GAAO;EAAO,CAAC;EAEhC,MAAM,eAAe,iBAAA,QAAA,iBAAA,KAAA,IAAA,eAAgB,YAAY,KAAA;EAEjD,SAAS,OAAO,MAA6B;GAC3C,IAAI,CAAC,YAAY,WAAW,OAAO,KAAK,KAAK,IAAI;GACjD,QAAQ,OAAO,YAAY,MAAM,MAAM,IAAI,EAAE;GAC7C,QAAQ,KAAK;GACb,UAAU,EAAE;GACZ,aAAA,QAAA,aAAA,KAAA,KAAA,SAAW,IAAI;EACjB;EAEA,SAAS,UAAgB;GACvB,QAAQ,WAAW,YAAY,UAAU,MAAM,IAAI,EAAE;GACrD,QAAQ,KAAK;GACb,UAAU,EAAE;EACd;EAEA,MAAM,gBAAgB;GACpB,IAAI,SAAS,KAAK,CAAC,QAAQ,SAAS;GACpC,MAAM,SAAS,QAAQ,QAAQ,SAAS;GACxC,IAAI,UAAU,OAAO,OAAO,mBAAmB,YAAY,OAAO,eAAe,EAAE,OAAO,UAAU,CAAC;EACvG,GAAG,CAAC,MAAM,CAAC;EAEX,SAAS,UAAU,OAAoD;;GACrE,eAAA,QAAA,eAAA,KAAA,MAAA,wBAAA,WAAY,eAAA,QAAA,0BAAA,KAAA,KAAA,sBAAA,KAAA,YAAY,KAAK;GAC7B,IAAI,MAAM,kBAAkB;GAC5B,QAAQ,MAAM,KAAd;IACE,KAAK;KACH,MAAM,eAAe;KACrB,IAAI,CAAC,MAAM,QAAQ,IAAI;KACvB,WAAW,MAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,KAAK,QAAQ,MAAO;KACvE;IACF,KAAK;KACH,MAAM,eAAe;KACrB,IAAI,CAAC,MAAM,QAAQ,IAAI;KACvB,WAAW,MAAO,QAAQ,WAAW,IAAI,KAAK,KAAK,IAAI,QAAQ,SAAS,IAAI,IAAI,CAAE;KAClF;IACF,KAAK;KACH,IAAI,QAAQ,QAAQ,SAAS,GAAG;MAC9B,MAAM,eAAe;MACrB,UAAU,CAAC;KACb;KACA;IACF,KAAK;KACH,IAAI,QAAQ,QAAQ,SAAS,GAAG;MAC9B,MAAM,eAAe;MACrB,UAAU,QAAQ,SAAS,CAAC;KAC9B;KACA;IACF,KAAK;KACH,IAAI,QAAQ,UAAU,KAAK,QAAQ,SAAS;MAC1C,MAAM,eAAe;MACrB,OAAO,QAAQ,OAAmB;KACpC;KACA;IACF,KAAK;KACH,IAAI,MAAM;MACR,MAAM,eAAe;MACrB,QAAQ;KACV,OAAO,IAAI,MAAM;MACf,MAAM,eAAe;MACrB,OAAO,IAAI;KACb;KACA;IACF,KAAK,OACH,IAAI,MAAM,QAAQ;GAItB;EACF;EAEA,MAAM,WAAW,QAAQ,CAAC;EAC1B,MAAM,WAAW,YAAY,UAAU,IAAI,GAAG,OAAO,UAAU,WAAW,KAAA;EAE1E,OACE,sBAAA,cAAC,OAAD;GACE,WAAW,WAAW,YAAY,eAAe,SAAS;GACrD;GACL,aAAW,WAAW,KAAK,KAAA;GAC3B,gBAAc,UAAU,KAAK,KAAA;GAC7B,iBAAe,WAAW,KAAK,KAAA;EA4E5B,GA1EF,UAAU,KAAA,IACT,sBAAA,cAAC,SAAD;GAAO,WAAU;GAAW,IAAI;GAAS,SAAS;EAE3C,GADJ,KACI,IACL,MACJ,sBAAA,cAAC,OAAD,EAAK,WAAU,aAkCV,GAjCH,sBAAA,cAAC,SAAD;GACE,GAAI;GACJ,IAAI;GACJ,WAAW,WAAW,YAAA,eAAA,QAAA,eAAA,KAAA,IAAA,KAAA,IAAY,WAAY,SAAS;GACvD,MAAK;GACL,MAAK;GACL,cAAa;GACb,YAAY;GACZ,qBAAkB;GAClB,iBAAe;GACf,iBAAe;GACf,yBAAuB;GACvB,gBAAc,WAAW,KAAA;GACzB,iBAAe,YAAY,KAAA;GACd;GACH;GACV,OAAO;GACP,WAAW,UAAU;IACnB,QAAQ,MAAM,OAAO,KAAK;IAC1B,QAAQ,IAAI;IACZ,UAAU,EAAE;GACd;GACA,UAAU,UAAU;;IAClB,eAAA,QAAA,eAAA,KAAA,MAAA,sBAAA,WAAY,aAAA,QAAA,wBAAA,KAAA,KAAA,oBAAA,KAAA,YAAU,KAAK;IAC3B,IAAI,YAAY,KAAA,KAAa,MAAM,QAAQ,IAAI;GACjD;GACA,SAAS,UAAU;;IACjB,eAAA,QAAA,eAAA,KAAA,MAAA,qBAAA,WAAY,YAAA,QAAA,uBAAA,KAAA,KAAA,mBAAA,KAAA,YAAS,KAAK;IAC1B,QAAQ;GACV;GACW;EACZ,CAAA,GACA,OAAO,sBAAA,cAAC,SAAD;GAAO,MAAK;GAAe;GAAM,OAAO,WAAW,OAAO,SAAS,EAAE,IAAI;EAAK,CAAA,IAAI,IACvF,GACL,sBAAA,cAAC,MAAD;GACE,KAAK;GACL,IAAI;GACJ,WAAU;GACV,MAAK;GACL,mBAAiB,UAAU,KAAA,IAAY,UAAU,KAAA;GACjD,QAAQ,CAAC;EA2BP,GAzBD,YAAY,QAAQ,WAAW,IAC9B,sBAAA,cAAC,MAAD;GAAI,WAAU;GAAW,MAAK;EAE1B,GADD,aACC,IACF,MACH,WACG,QAAQ,KAAK,MAAM,UACjB,sBAAA,cAAC,MAAD;GACE,KAAK,KAAK;GACV,IAAI,GAAG,OAAO,UAAU;GACxB,WAAU;GACV,MAAK;GACL,kBAAA,aAAA,QAAA,aAAA,KAAA,IAAA,KAAA,IAAe,SAAU,QAAO,KAAK;GACrC,eAAa,UAAU,SAAS,KAAK,KAAA;GACrC,cAAc,UAAU,MAAM,eAAe;GAC7C,mBAAmB,UAAU,KAAK;GAClC,eAAe,OAAO,IAAI;EAMxB,GAJF,sBAAA,cAAC,QAAD,EAAM,WAAU,iBAAkD,GAAhC,YAAY,MAAM,MAAM,CAAQ,GACjE,eACC,sBAAA,cAAC,QAAD,EAAM,WAAU,iBAAgF,GAA9D,WAAW,OAAO,KAAK,iBAAiB,KAAK,UAAiB,IAC9F,IACF,CACL,IACD,IACF,CACD;CAET;CAEA,SAAS,mBAAmB,OAAoD;EAC9E,MAAM,EACJ,OACA,cACA,UACA,gBAAgB,SAChB,YAAY,OACZ,sBAAsB,gBACtB,kBAAkB,cAClB,cACA,UACA,SAAS,MACT,IACA,UACA,UACA,SACA,SAAS,OACT,MAAM,OACN,cACE;EAEJ,MAAM,SAAS,YAAY,EAAE;EAC7B,MAAM,QAAQ,MAAM,sBAAsB;GACxC;GACA;GACA,iBAAA,iBAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAiB,aAAc;GAC/B,aAAA,iBAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAa,aAAc;EAC7B,CAAC;EACD,MAAM,eAAe,MAAM;EAC3B,MAAM,kBAAkB,MAAM,cAE1B,WAAW,OACP,aAAa,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,QAAQ,IAAI,CAAC,IAC1E,aAAa,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,IAAI,IAAI,CAAC,GACxE,CAAC,cAAc,MAAM,CACvB;EACA,MAAM,eAAe,MAAM,cAEvB,WAAW,OACP,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,QAAQ,IAAI,CAAC,IAC1E,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,IAAI,IAAI,CAAC,GACxE,CAAC,MAAM,QAAQ,MAAM,CACvB;EAEA,OACE,sBAAA,cAAC,OAAD;GACE,WAAW,WAAW,YAAY,SAAS;GACtC;GACL,eAAa;GACb,gBAAc,UAAU,KAAK,KAAA;GAC7B,iBAAe,WAAW,KAAK,KAAA;EA8C5B,GA5CH,sBAAA,cAAC,OAAD,EAAK,WAAU,WAqBV,GApBH,sBAAA,cAAC,SAAD;GAAO,WAAU;GAAW,SAAS,GAAG,OAAO;EAExC,GADJ,aACI,GACP,sBAAA,cAAC,UAAD;GACE,IAAI,GAAG,OAAO;GACd,WAAU;GACV,MAAM;GACN,OAAO,MAAM,eAAe,KAAA,IAAY,KAAK,OAAO,MAAM,UAAU;GAC1D;GACA;GACV,gBAAc,WAAW,KAAA;GACzB,WAAW,UAAU,MAAM,YAAY,MAAM,OAAO,UAAU,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;EAQ5F,GANN,sBAAA,cAAC,UAAD,EAAQ,OAAM,GAAgC,GAA5B,mBAA4B,GAC7C,gBAAgB,KAAK,MACpB,sBAAA,cAAC,UAAD;GAAQ,KAAK,EAAE;GAAI,OAAO,EAAE;EAEpB,GADL,WAAW,OAAO,EAAE,SAAS,EAAE,EAC1B,CACT,CACK,CACL,GACL,sBAAA,cAAC,OAAD,EAAK,WAAU,WAqBV,GApBH,sBAAA,cAAC,SAAD;GAAO,WAAU;GAAW,SAAS,GAAG,OAAO;EAExC,GADJ,SACI,GACP,sBAAA,cAAC,UAAD;GACE,IAAI,GAAG,OAAO;GACd,WAAU;GACV,MAAM;GACN,OAAO,MAAM,WAAW,KAAA,IAAY,KAAK,OAAO,MAAM,MAAM;GAClD;GACV,UAAU,YAAY,MAAM,eAAe,KAAA;GAC3C,gBAAc,WAAW,KAAA;GACzB,WAAW,UAAU,MAAM,QAAQ,MAAM,OAAO,UAAU,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;EAQxF,GANN,sBAAA,cAAC,UAAD,EAAQ,OAAM,GAA4B,GAAxB,eAAwB,GACzC,aAAa,KAAK,MACjB,sBAAA,cAAC,UAAD;GAAQ,KAAK,EAAE;GAAI,OAAO,EAAE;EAEpB,GADL,WAAW,OAAO,EAAE,SAAS,EAAE,EAC1B,CACT,CACK,CACL,CACF;CAET;CAEA,OAAO;EAAE;EAAc;CAAmB;AAC5C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { S as Query, c as FlatCity, n as CityId, y as ProvinceCityValue } from "./types-Ds_b0yHP.cjs";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
interface CityComboboxProps {
|
|
4
|
+
value?: CityId | null;
|
|
5
|
+
defaultValue?: CityId | null;
|
|
6
|
+
onChange?: (city: FlatCity | null) => void;
|
|
7
|
+
province?: Query | null;
|
|
8
|
+
label?: React.ReactNode;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
noResultsText?: React.ReactNode;
|
|
11
|
+
limit?: number;
|
|
12
|
+
fuzzy?: boolean;
|
|
13
|
+
showProvince?: boolean;
|
|
14
|
+
locale?: "fa" | "en";
|
|
15
|
+
name?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
invalid?: boolean;
|
|
20
|
+
dir?: "rtl" | "ltr" | "auto";
|
|
21
|
+
className?: string;
|
|
22
|
+
inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange">;
|
|
23
|
+
}
|
|
24
|
+
interface ProvinceCitySelectProps {
|
|
25
|
+
value?: ProvinceCityValue;
|
|
26
|
+
defaultValue?: ProvinceCityValue;
|
|
27
|
+
onChange?: (value: ProvinceCityValue) => void;
|
|
28
|
+
provinceLabel?: React.ReactNode;
|
|
29
|
+
cityLabel?: React.ReactNode;
|
|
30
|
+
provincePlaceholder?: string;
|
|
31
|
+
cityPlaceholder?: string;
|
|
32
|
+
provinceName?: string;
|
|
33
|
+
cityName?: string;
|
|
34
|
+
locale?: "fa" | "en";
|
|
35
|
+
id?: string;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
invalid?: boolean;
|
|
39
|
+
layout?: "row" | "column";
|
|
40
|
+
dir?: "rtl" | "ltr" | "auto";
|
|
41
|
+
className?: string;
|
|
42
|
+
}
|
|
43
|
+
interface IranCitiesComponents {
|
|
44
|
+
CityCombobox: (props: CityComboboxProps) => React.ReactElement;
|
|
45
|
+
ProvinceCitySelect: (props: ProvinceCitySelectProps) => React.ReactElement;
|
|
46
|
+
}
|
|
47
|
+
export { IranCitiesComponents as n, ProvinceCitySelectProps as r, CityComboboxProps as t };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { S as Query, c as FlatCity, n as CityId, y as ProvinceCityValue } from "./types-Ds_b0yHP.mjs";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
interface CityComboboxProps {
|
|
4
|
+
value?: CityId | null;
|
|
5
|
+
defaultValue?: CityId | null;
|
|
6
|
+
onChange?: (city: FlatCity | null) => void;
|
|
7
|
+
province?: Query | null;
|
|
8
|
+
label?: React.ReactNode;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
noResultsText?: React.ReactNode;
|
|
11
|
+
limit?: number;
|
|
12
|
+
fuzzy?: boolean;
|
|
13
|
+
showProvince?: boolean;
|
|
14
|
+
locale?: "fa" | "en";
|
|
15
|
+
name?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
invalid?: boolean;
|
|
20
|
+
dir?: "rtl" | "ltr" | "auto";
|
|
21
|
+
className?: string;
|
|
22
|
+
inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange">;
|
|
23
|
+
}
|
|
24
|
+
interface ProvinceCitySelectProps {
|
|
25
|
+
value?: ProvinceCityValue;
|
|
26
|
+
defaultValue?: ProvinceCityValue;
|
|
27
|
+
onChange?: (value: ProvinceCityValue) => void;
|
|
28
|
+
provinceLabel?: React.ReactNode;
|
|
29
|
+
cityLabel?: React.ReactNode;
|
|
30
|
+
provincePlaceholder?: string;
|
|
31
|
+
cityPlaceholder?: string;
|
|
32
|
+
provinceName?: string;
|
|
33
|
+
cityName?: string;
|
|
34
|
+
locale?: "fa" | "en";
|
|
35
|
+
id?: string;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
invalid?: boolean;
|
|
39
|
+
layout?: "row" | "column";
|
|
40
|
+
dir?: "rtl" | "ltr" | "auto";
|
|
41
|
+
className?: string;
|
|
42
|
+
}
|
|
43
|
+
interface IranCitiesComponents {
|
|
44
|
+
CityCombobox: (props: CityComboboxProps) => React.ReactElement;
|
|
45
|
+
ProvinceCitySelect: (props: ProvinceCitySelectProps) => React.ReactElement;
|
|
46
|
+
}
|
|
47
|
+
export { IranCitiesComponents as n, ProvinceCitySelectProps as r, CityComboboxProps as t };
|