@amir83nasr/map 1.0.4 → 1.1.2

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.
Files changed (281) hide show
  1. package/README.md +26 -25
  2. package/dist/core/defaults.test.d.ts +1 -0
  3. package/dist/core/format.test.d.ts +1 -0
  4. package/dist/{emitter.d.ts → engine/emitter.d.ts} +1 -1
  5. package/dist/engine/engine.test.d.ts +1 -0
  6. package/dist/{picker.d.ts → engine/picker.d.ts} +4 -1
  7. package/dist/index.cjs +88 -0
  8. package/dist/index.d.cts +4 -0
  9. package/dist/index.d.ts +4 -18
  10. package/dist/{qompick-react.js → index.js} +286 -246
  11. package/dist/react/LocationPickerView.d.ts +16 -0
  12. package/dist/react/react.test.d.ts +1 -0
  13. package/dist/style/style.test.d.ts +1 -0
  14. package/dist/{qompick-react.css → styles.css} +1 -1
  15. package/package.json +18 -10
  16. package/dist/qompick-react.cjs +0 -76
  17. /package/dist/{defaults.d.ts → core/defaults.d.ts} +0 -0
  18. /package/dist/{format.d.ts → core/format.d.ts} +0 -0
  19. /package/dist/{geocode.d.ts → core/geocode.d.ts} +0 -0
  20. /package/dist/{i18n.d.ts → core/i18n.d.ts} +0 -0
  21. /package/dist/{icons.d.ts → core/icons.d.ts} +0 -0
  22. /package/dist/{types.d.ts → core/types.d.ts} +0 -0
  23. /package/dist/{snap.d.ts → engine/snap.d.ts} +0 -0
  24. /package/dist/{colors.d.ts → style/colors.d.ts} +0 -0
  25. /package/dist/{map-style.d.ts → style/map-style.d.ts} +0 -0
  26. /package/fonts/{IRANYekanX Regular → IRANYekanX}/0-255.pbf +0 -0
  27. /package/fonts/{IRANYekanX Regular → IRANYekanX}/1024-1279.pbf +0 -0
  28. /package/fonts/{IRANYekanX Regular → IRANYekanX}/10240-10495.pbf +0 -0
  29. /package/fonts/{IRANYekanX Regular → IRANYekanX}/10496-10751.pbf +0 -0
  30. /package/fonts/{IRANYekanX Regular → IRANYekanX}/10752-11007.pbf +0 -0
  31. /package/fonts/{IRANYekanX Regular → IRANYekanX}/11008-11263.pbf +0 -0
  32. /package/fonts/{IRANYekanX Regular → IRANYekanX}/11264-11519.pbf +0 -0
  33. /package/fonts/{IRANYekanX Regular → IRANYekanX}/11520-11775.pbf +0 -0
  34. /package/fonts/{IRANYekanX Regular → IRANYekanX}/11776-12031.pbf +0 -0
  35. /package/fonts/{IRANYekanX Regular → IRANYekanX}/12032-12287.pbf +0 -0
  36. /package/fonts/{IRANYekanX Regular → IRANYekanX}/12288-12543.pbf +0 -0
  37. /package/fonts/{IRANYekanX Regular → IRANYekanX}/12544-12799.pbf +0 -0
  38. /package/fonts/{IRANYekanX Regular → IRANYekanX}/1280-1535.pbf +0 -0
  39. /package/fonts/{IRANYekanX Regular → IRANYekanX}/12800-13055.pbf +0 -0
  40. /package/fonts/{IRANYekanX Regular → IRANYekanX}/13056-13311.pbf +0 -0
  41. /package/fonts/{IRANYekanX Regular → IRANYekanX}/13312-13567.pbf +0 -0
  42. /package/fonts/{IRANYekanX Regular → IRANYekanX}/13568-13823.pbf +0 -0
  43. /package/fonts/{IRANYekanX Regular → IRANYekanX}/13824-14079.pbf +0 -0
  44. /package/fonts/{IRANYekanX Regular → IRANYekanX}/14080-14335.pbf +0 -0
  45. /package/fonts/{IRANYekanX Regular → IRANYekanX}/14336-14591.pbf +0 -0
  46. /package/fonts/{IRANYekanX Regular → IRANYekanX}/14592-14847.pbf +0 -0
  47. /package/fonts/{IRANYekanX Regular → IRANYekanX}/14848-15103.pbf +0 -0
  48. /package/fonts/{IRANYekanX Regular → IRANYekanX}/15104-15359.pbf +0 -0
  49. /package/fonts/{IRANYekanX Regular → IRANYekanX}/1536-1791.pbf +0 -0
  50. /package/fonts/{IRANYekanX Regular → IRANYekanX}/15360-15615.pbf +0 -0
  51. /package/fonts/{IRANYekanX Regular → IRANYekanX}/15616-15871.pbf +0 -0
  52. /package/fonts/{IRANYekanX Regular → IRANYekanX}/15872-16127.pbf +0 -0
  53. /package/fonts/{IRANYekanX Regular → IRANYekanX}/16128-16383.pbf +0 -0
  54. /package/fonts/{IRANYekanX Regular → IRANYekanX}/16384-16639.pbf +0 -0
  55. /package/fonts/{IRANYekanX Regular → IRANYekanX}/16640-16895.pbf +0 -0
  56. /package/fonts/{IRANYekanX Regular → IRANYekanX}/16896-17151.pbf +0 -0
  57. /package/fonts/{IRANYekanX Regular → IRANYekanX}/17152-17407.pbf +0 -0
  58. /package/fonts/{IRANYekanX Regular → IRANYekanX}/17408-17663.pbf +0 -0
  59. /package/fonts/{IRANYekanX Regular → IRANYekanX}/17664-17919.pbf +0 -0
  60. /package/fonts/{IRANYekanX Regular → IRANYekanX}/1792-2047.pbf +0 -0
  61. /package/fonts/{IRANYekanX Regular → IRANYekanX}/17920-18175.pbf +0 -0
  62. /package/fonts/{IRANYekanX Regular → IRANYekanX}/18176-18431.pbf +0 -0
  63. /package/fonts/{IRANYekanX Regular → IRANYekanX}/18432-18687.pbf +0 -0
  64. /package/fonts/{IRANYekanX Regular → IRANYekanX}/18688-18943.pbf +0 -0
  65. /package/fonts/{IRANYekanX Regular → IRANYekanX}/18944-19199.pbf +0 -0
  66. /package/fonts/{IRANYekanX Regular → IRANYekanX}/19200-19455.pbf +0 -0
  67. /package/fonts/{IRANYekanX Regular → IRANYekanX}/19456-19711.pbf +0 -0
  68. /package/fonts/{IRANYekanX Regular → IRANYekanX}/19712-19967.pbf +0 -0
  69. /package/fonts/{IRANYekanX Regular → IRANYekanX}/19968-20223.pbf +0 -0
  70. /package/fonts/{IRANYekanX Regular → IRANYekanX}/20224-20479.pbf +0 -0
  71. /package/fonts/{IRANYekanX Regular → IRANYekanX}/2048-2303.pbf +0 -0
  72. /package/fonts/{IRANYekanX Regular → IRANYekanX}/20480-20735.pbf +0 -0
  73. /package/fonts/{IRANYekanX Regular → IRANYekanX}/20736-20991.pbf +0 -0
  74. /package/fonts/{IRANYekanX Regular → IRANYekanX}/20992-21247.pbf +0 -0
  75. /package/fonts/{IRANYekanX Regular → IRANYekanX}/21248-21503.pbf +0 -0
  76. /package/fonts/{IRANYekanX Regular → IRANYekanX}/21504-21759.pbf +0 -0
  77. /package/fonts/{IRANYekanX Regular → IRANYekanX}/21760-22015.pbf +0 -0
  78. /package/fonts/{IRANYekanX Regular → IRANYekanX}/22016-22271.pbf +0 -0
  79. /package/fonts/{IRANYekanX Regular → IRANYekanX}/22272-22527.pbf +0 -0
  80. /package/fonts/{IRANYekanX Regular → IRANYekanX}/22528-22783.pbf +0 -0
  81. /package/fonts/{IRANYekanX Regular → IRANYekanX}/22784-23039.pbf +0 -0
  82. /package/fonts/{IRANYekanX Regular → IRANYekanX}/2304-2559.pbf +0 -0
  83. /package/fonts/{IRANYekanX Regular → IRANYekanX}/23040-23295.pbf +0 -0
  84. /package/fonts/{IRANYekanX Regular → IRANYekanX}/23296-23551.pbf +0 -0
  85. /package/fonts/{IRANYekanX Regular → IRANYekanX}/23552-23807.pbf +0 -0
  86. /package/fonts/{IRANYekanX Regular → IRANYekanX}/23808-24063.pbf +0 -0
  87. /package/fonts/{IRANYekanX Regular → IRANYekanX}/24064-24319.pbf +0 -0
  88. /package/fonts/{IRANYekanX Regular → IRANYekanX}/24320-24575.pbf +0 -0
  89. /package/fonts/{IRANYekanX Regular → IRANYekanX}/24576-24831.pbf +0 -0
  90. /package/fonts/{IRANYekanX Regular → IRANYekanX}/24832-25087.pbf +0 -0
  91. /package/fonts/{IRANYekanX Regular → IRANYekanX}/25088-25343.pbf +0 -0
  92. /package/fonts/{IRANYekanX Regular → IRANYekanX}/25344-25599.pbf +0 -0
  93. /package/fonts/{IRANYekanX Regular → IRANYekanX}/256-511.pbf +0 -0
  94. /package/fonts/{IRANYekanX Regular → IRANYekanX}/2560-2815.pbf +0 -0
  95. /package/fonts/{IRANYekanX Regular → IRANYekanX}/25600-25855.pbf +0 -0
  96. /package/fonts/{IRANYekanX Regular → IRANYekanX}/25856-26111.pbf +0 -0
  97. /package/fonts/{IRANYekanX Regular → IRANYekanX}/26112-26367.pbf +0 -0
  98. /package/fonts/{IRANYekanX Regular → IRANYekanX}/26368-26623.pbf +0 -0
  99. /package/fonts/{IRANYekanX Regular → IRANYekanX}/26624-26879.pbf +0 -0
  100. /package/fonts/{IRANYekanX Regular → IRANYekanX}/26880-27135.pbf +0 -0
  101. /package/fonts/{IRANYekanX Regular → IRANYekanX}/27136-27391.pbf +0 -0
  102. /package/fonts/{IRANYekanX Regular → IRANYekanX}/27392-27647.pbf +0 -0
  103. /package/fonts/{IRANYekanX Regular → IRANYekanX}/27648-27903.pbf +0 -0
  104. /package/fonts/{IRANYekanX Regular → IRANYekanX}/27904-28159.pbf +0 -0
  105. /package/fonts/{IRANYekanX Regular → IRANYekanX}/2816-3071.pbf +0 -0
  106. /package/fonts/{IRANYekanX Regular → IRANYekanX}/28160-28415.pbf +0 -0
  107. /package/fonts/{IRANYekanX Regular → IRANYekanX}/28416-28671.pbf +0 -0
  108. /package/fonts/{IRANYekanX Regular → IRANYekanX}/28672-28927.pbf +0 -0
  109. /package/fonts/{IRANYekanX Regular → IRANYekanX}/28928-29183.pbf +0 -0
  110. /package/fonts/{IRANYekanX Regular → IRANYekanX}/29184-29439.pbf +0 -0
  111. /package/fonts/{IRANYekanX Regular → IRANYekanX}/29440-29695.pbf +0 -0
  112. /package/fonts/{IRANYekanX Regular → IRANYekanX}/29696-29951.pbf +0 -0
  113. /package/fonts/{IRANYekanX Regular → IRANYekanX}/29952-30207.pbf +0 -0
  114. /package/fonts/{IRANYekanX Regular → IRANYekanX}/30208-30463.pbf +0 -0
  115. /package/fonts/{IRANYekanX Regular → IRANYekanX}/30464-30719.pbf +0 -0
  116. /package/fonts/{IRANYekanX Regular → IRANYekanX}/3072-3327.pbf +0 -0
  117. /package/fonts/{IRANYekanX Regular → IRANYekanX}/30720-30975.pbf +0 -0
  118. /package/fonts/{IRANYekanX Regular → IRANYekanX}/30976-31231.pbf +0 -0
  119. /package/fonts/{IRANYekanX Regular → IRANYekanX}/31232-31487.pbf +0 -0
  120. /package/fonts/{IRANYekanX Regular → IRANYekanX}/31488-31743.pbf +0 -0
  121. /package/fonts/{IRANYekanX Regular → IRANYekanX}/31744-31999.pbf +0 -0
  122. /package/fonts/{IRANYekanX Regular → IRANYekanX}/32000-32255.pbf +0 -0
  123. /package/fonts/{IRANYekanX Regular → IRANYekanX}/32256-32511.pbf +0 -0
  124. /package/fonts/{IRANYekanX Regular → IRANYekanX}/32512-32767.pbf +0 -0
  125. /package/fonts/{IRANYekanX Regular → IRANYekanX}/32768-33023.pbf +0 -0
  126. /package/fonts/{IRANYekanX Regular → IRANYekanX}/33024-33279.pbf +0 -0
  127. /package/fonts/{IRANYekanX Regular → IRANYekanX}/3328-3583.pbf +0 -0
  128. /package/fonts/{IRANYekanX Regular → IRANYekanX}/33280-33535.pbf +0 -0
  129. /package/fonts/{IRANYekanX Regular → IRANYekanX}/33536-33791.pbf +0 -0
  130. /package/fonts/{IRANYekanX Regular → IRANYekanX}/33792-34047.pbf +0 -0
  131. /package/fonts/{IRANYekanX Regular → IRANYekanX}/34048-34303.pbf +0 -0
  132. /package/fonts/{IRANYekanX Regular → IRANYekanX}/34304-34559.pbf +0 -0
  133. /package/fonts/{IRANYekanX Regular → IRANYekanX}/34560-34815.pbf +0 -0
  134. /package/fonts/{IRANYekanX Regular → IRANYekanX}/34816-35071.pbf +0 -0
  135. /package/fonts/{IRANYekanX Regular → IRANYekanX}/35072-35327.pbf +0 -0
  136. /package/fonts/{IRANYekanX Regular → IRANYekanX}/35328-35583.pbf +0 -0
  137. /package/fonts/{IRANYekanX Regular → IRANYekanX}/35584-35839.pbf +0 -0
  138. /package/fonts/{IRANYekanX Regular → IRANYekanX}/3584-3839.pbf +0 -0
  139. /package/fonts/{IRANYekanX Regular → IRANYekanX}/35840-36095.pbf +0 -0
  140. /package/fonts/{IRANYekanX Regular → IRANYekanX}/36096-36351.pbf +0 -0
  141. /package/fonts/{IRANYekanX Regular → IRANYekanX}/36352-36607.pbf +0 -0
  142. /package/fonts/{IRANYekanX Regular → IRANYekanX}/36608-36863.pbf +0 -0
  143. /package/fonts/{IRANYekanX Regular → IRANYekanX}/36864-37119.pbf +0 -0
  144. /package/fonts/{IRANYekanX Regular → IRANYekanX}/37120-37375.pbf +0 -0
  145. /package/fonts/{IRANYekanX Regular → IRANYekanX}/37376-37631.pbf +0 -0
  146. /package/fonts/{IRANYekanX Regular → IRANYekanX}/37632-37887.pbf +0 -0
  147. /package/fonts/{IRANYekanX Regular → IRANYekanX}/37888-38143.pbf +0 -0
  148. /package/fonts/{IRANYekanX Regular → IRANYekanX}/38144-38399.pbf +0 -0
  149. /package/fonts/{IRANYekanX Regular → IRANYekanX}/3840-4095.pbf +0 -0
  150. /package/fonts/{IRANYekanX Regular → IRANYekanX}/38400-38655.pbf +0 -0
  151. /package/fonts/{IRANYekanX Regular → IRANYekanX}/38656-38911.pbf +0 -0
  152. /package/fonts/{IRANYekanX Regular → IRANYekanX}/38912-39167.pbf +0 -0
  153. /package/fonts/{IRANYekanX Regular → IRANYekanX}/39168-39423.pbf +0 -0
  154. /package/fonts/{IRANYekanX Regular → IRANYekanX}/39424-39679.pbf +0 -0
  155. /package/fonts/{IRANYekanX Regular → IRANYekanX}/39680-39935.pbf +0 -0
  156. /package/fonts/{IRANYekanX Regular → IRANYekanX}/39936-40191.pbf +0 -0
  157. /package/fonts/{IRANYekanX Regular → IRANYekanX}/40192-40447.pbf +0 -0
  158. /package/fonts/{IRANYekanX Regular → IRANYekanX}/40448-40703.pbf +0 -0
  159. /package/fonts/{IRANYekanX Regular → IRANYekanX}/40704-40959.pbf +0 -0
  160. /package/fonts/{IRANYekanX Regular → IRANYekanX}/4096-4351.pbf +0 -0
  161. /package/fonts/{IRANYekanX Regular → IRANYekanX}/40960-41215.pbf +0 -0
  162. /package/fonts/{IRANYekanX Regular → IRANYekanX}/41216-41471.pbf +0 -0
  163. /package/fonts/{IRANYekanX Regular → IRANYekanX}/41472-41727.pbf +0 -0
  164. /package/fonts/{IRANYekanX Regular → IRANYekanX}/41728-41983.pbf +0 -0
  165. /package/fonts/{IRANYekanX Regular → IRANYekanX}/41984-42239.pbf +0 -0
  166. /package/fonts/{IRANYekanX Regular → IRANYekanX}/42240-42495.pbf +0 -0
  167. /package/fonts/{IRANYekanX Regular → IRANYekanX}/42496-42751.pbf +0 -0
  168. /package/fonts/{IRANYekanX Regular → IRANYekanX}/42752-43007.pbf +0 -0
  169. /package/fonts/{IRANYekanX Regular → IRANYekanX}/43008-43263.pbf +0 -0
  170. /package/fonts/{IRANYekanX Regular → IRANYekanX}/43264-43519.pbf +0 -0
  171. /package/fonts/{IRANYekanX Regular → IRANYekanX}/4352-4607.pbf +0 -0
  172. /package/fonts/{IRANYekanX Regular → IRANYekanX}/43520-43775.pbf +0 -0
  173. /package/fonts/{IRANYekanX Regular → IRANYekanX}/43776-44031.pbf +0 -0
  174. /package/fonts/{IRANYekanX Regular → IRANYekanX}/44032-44287.pbf +0 -0
  175. /package/fonts/{IRANYekanX Regular → IRANYekanX}/44288-44543.pbf +0 -0
  176. /package/fonts/{IRANYekanX Regular → IRANYekanX}/44544-44799.pbf +0 -0
  177. /package/fonts/{IRANYekanX Regular → IRANYekanX}/44800-45055.pbf +0 -0
  178. /package/fonts/{IRANYekanX Regular → IRANYekanX}/45056-45311.pbf +0 -0
  179. /package/fonts/{IRANYekanX Regular → IRANYekanX}/45312-45567.pbf +0 -0
  180. /package/fonts/{IRANYekanX Regular → IRANYekanX}/45568-45823.pbf +0 -0
  181. /package/fonts/{IRANYekanX Regular → IRANYekanX}/45824-46079.pbf +0 -0
  182. /package/fonts/{IRANYekanX Regular → IRANYekanX}/4608-4863.pbf +0 -0
  183. /package/fonts/{IRANYekanX Regular → IRANYekanX}/46080-46335.pbf +0 -0
  184. /package/fonts/{IRANYekanX Regular → IRANYekanX}/46336-46591.pbf +0 -0
  185. /package/fonts/{IRANYekanX Regular → IRANYekanX}/46592-46847.pbf +0 -0
  186. /package/fonts/{IRANYekanX Regular → IRANYekanX}/46848-47103.pbf +0 -0
  187. /package/fonts/{IRANYekanX Regular → IRANYekanX}/47104-47359.pbf +0 -0
  188. /package/fonts/{IRANYekanX Regular → IRANYekanX}/47360-47615.pbf +0 -0
  189. /package/fonts/{IRANYekanX Regular → IRANYekanX}/47616-47871.pbf +0 -0
  190. /package/fonts/{IRANYekanX Regular → IRANYekanX}/47872-48127.pbf +0 -0
  191. /package/fonts/{IRANYekanX Regular → IRANYekanX}/48128-48383.pbf +0 -0
  192. /package/fonts/{IRANYekanX Regular → IRANYekanX}/48384-48639.pbf +0 -0
  193. /package/fonts/{IRANYekanX Regular → IRANYekanX}/4864-5119.pbf +0 -0
  194. /package/fonts/{IRANYekanX Regular → IRANYekanX}/48640-48895.pbf +0 -0
  195. /package/fonts/{IRANYekanX Regular → IRANYekanX}/48896-49151.pbf +0 -0
  196. /package/fonts/{IRANYekanX Regular → IRANYekanX}/49152-49407.pbf +0 -0
  197. /package/fonts/{IRANYekanX Regular → IRANYekanX}/49408-49663.pbf +0 -0
  198. /package/fonts/{IRANYekanX Regular → IRANYekanX}/49664-49919.pbf +0 -0
  199. /package/fonts/{IRANYekanX Regular → IRANYekanX}/49920-50175.pbf +0 -0
  200. /package/fonts/{IRANYekanX Regular → IRANYekanX}/50176-50431.pbf +0 -0
  201. /package/fonts/{IRANYekanX Regular → IRANYekanX}/50432-50687.pbf +0 -0
  202. /package/fonts/{IRANYekanX Regular → IRANYekanX}/50688-50943.pbf +0 -0
  203. /package/fonts/{IRANYekanX Regular → IRANYekanX}/50944-51199.pbf +0 -0
  204. /package/fonts/{IRANYekanX Regular → IRANYekanX}/512-767.pbf +0 -0
  205. /package/fonts/{IRANYekanX Regular → IRANYekanX}/5120-5375.pbf +0 -0
  206. /package/fonts/{IRANYekanX Regular → IRANYekanX}/51200-51455.pbf +0 -0
  207. /package/fonts/{IRANYekanX Regular → IRANYekanX}/51456-51711.pbf +0 -0
  208. /package/fonts/{IRANYekanX Regular → IRANYekanX}/51712-51967.pbf +0 -0
  209. /package/fonts/{IRANYekanX Regular → IRANYekanX}/51968-52223.pbf +0 -0
  210. /package/fonts/{IRANYekanX Regular → IRANYekanX}/52224-52479.pbf +0 -0
  211. /package/fonts/{IRANYekanX Regular → IRANYekanX}/52480-52735.pbf +0 -0
  212. /package/fonts/{IRANYekanX Regular → IRANYekanX}/52736-52991.pbf +0 -0
  213. /package/fonts/{IRANYekanX Regular → IRANYekanX}/52992-53247.pbf +0 -0
  214. /package/fonts/{IRANYekanX Regular → IRANYekanX}/53248-53503.pbf +0 -0
  215. /package/fonts/{IRANYekanX Regular → IRANYekanX}/53504-53759.pbf +0 -0
  216. /package/fonts/{IRANYekanX Regular → IRANYekanX}/5376-5631.pbf +0 -0
  217. /package/fonts/{IRANYekanX Regular → IRANYekanX}/53760-54015.pbf +0 -0
  218. /package/fonts/{IRANYekanX Regular → IRANYekanX}/54016-54271.pbf +0 -0
  219. /package/fonts/{IRANYekanX Regular → IRANYekanX}/54272-54527.pbf +0 -0
  220. /package/fonts/{IRANYekanX Regular → IRANYekanX}/54528-54783.pbf +0 -0
  221. /package/fonts/{IRANYekanX Regular → IRANYekanX}/54784-55039.pbf +0 -0
  222. /package/fonts/{IRANYekanX Regular → IRANYekanX}/55040-55295.pbf +0 -0
  223. /package/fonts/{IRANYekanX Regular → IRANYekanX}/55296-55551.pbf +0 -0
  224. /package/fonts/{IRANYekanX Regular → IRANYekanX}/55552-55807.pbf +0 -0
  225. /package/fonts/{IRANYekanX Regular → IRANYekanX}/55808-56063.pbf +0 -0
  226. /package/fonts/{IRANYekanX Regular → IRANYekanX}/56064-56319.pbf +0 -0
  227. /package/fonts/{IRANYekanX Regular → IRANYekanX}/5632-5887.pbf +0 -0
  228. /package/fonts/{IRANYekanX Regular → IRANYekanX}/56320-56575.pbf +0 -0
  229. /package/fonts/{IRANYekanX Regular → IRANYekanX}/56576-56831.pbf +0 -0
  230. /package/fonts/{IRANYekanX Regular → IRANYekanX}/56832-57087.pbf +0 -0
  231. /package/fonts/{IRANYekanX Regular → IRANYekanX}/57088-57343.pbf +0 -0
  232. /package/fonts/{IRANYekanX Regular → IRANYekanX}/57344-57599.pbf +0 -0
  233. /package/fonts/{IRANYekanX Regular → IRANYekanX}/57600-57855.pbf +0 -0
  234. /package/fonts/{IRANYekanX Regular → IRANYekanX}/57856-58111.pbf +0 -0
  235. /package/fonts/{IRANYekanX Regular → IRANYekanX}/58112-58367.pbf +0 -0
  236. /package/fonts/{IRANYekanX Regular → IRANYekanX}/58368-58623.pbf +0 -0
  237. /package/fonts/{IRANYekanX Regular → IRANYekanX}/58624-58879.pbf +0 -0
  238. /package/fonts/{IRANYekanX Regular → IRANYekanX}/5888-6143.pbf +0 -0
  239. /package/fonts/{IRANYekanX Regular → IRANYekanX}/58880-59135.pbf +0 -0
  240. /package/fonts/{IRANYekanX Regular → IRANYekanX}/59136-59391.pbf +0 -0
  241. /package/fonts/{IRANYekanX Regular → IRANYekanX}/59392-59647.pbf +0 -0
  242. /package/fonts/{IRANYekanX Regular → IRANYekanX}/59648-59903.pbf +0 -0
  243. /package/fonts/{IRANYekanX Regular → IRANYekanX}/59904-60159.pbf +0 -0
  244. /package/fonts/{IRANYekanX Regular → IRANYekanX}/60160-60415.pbf +0 -0
  245. /package/fonts/{IRANYekanX Regular → IRANYekanX}/60416-60671.pbf +0 -0
  246. /package/fonts/{IRANYekanX Regular → IRANYekanX}/60672-60927.pbf +0 -0
  247. /package/fonts/{IRANYekanX Regular → IRANYekanX}/60928-61183.pbf +0 -0
  248. /package/fonts/{IRANYekanX Regular → IRANYekanX}/61184-61439.pbf +0 -0
  249. /package/fonts/{IRANYekanX Regular → IRANYekanX}/6144-6399.pbf +0 -0
  250. /package/fonts/{IRANYekanX Regular → IRANYekanX}/61440-61695.pbf +0 -0
  251. /package/fonts/{IRANYekanX Regular → IRANYekanX}/61696-61951.pbf +0 -0
  252. /package/fonts/{IRANYekanX Regular → IRANYekanX}/61952-62207.pbf +0 -0
  253. /package/fonts/{IRANYekanX Regular → IRANYekanX}/62208-62463.pbf +0 -0
  254. /package/fonts/{IRANYekanX Regular → IRANYekanX}/62464-62719.pbf +0 -0
  255. /package/fonts/{IRANYekanX Regular → IRANYekanX}/62720-62975.pbf +0 -0
  256. /package/fonts/{IRANYekanX Regular → IRANYekanX}/62976-63231.pbf +0 -0
  257. /package/fonts/{IRANYekanX Regular → IRANYekanX}/63232-63487.pbf +0 -0
  258. /package/fonts/{IRANYekanX Regular → IRANYekanX}/63488-63743.pbf +0 -0
  259. /package/fonts/{IRANYekanX Regular → IRANYekanX}/63744-63999.pbf +0 -0
  260. /package/fonts/{IRANYekanX Regular → IRANYekanX}/6400-6655.pbf +0 -0
  261. /package/fonts/{IRANYekanX Regular → IRANYekanX}/64000-64255.pbf +0 -0
  262. /package/fonts/{IRANYekanX Regular → IRANYekanX}/64256-64511.pbf +0 -0
  263. /package/fonts/{IRANYekanX Regular → IRANYekanX}/64512-64767.pbf +0 -0
  264. /package/fonts/{IRANYekanX Regular → IRANYekanX}/64768-65023.pbf +0 -0
  265. /package/fonts/{IRANYekanX Regular → IRANYekanX}/65024-65279.pbf +0 -0
  266. /package/fonts/{IRANYekanX Regular → IRANYekanX}/65280-65535.pbf +0 -0
  267. /package/fonts/{IRANYekanX Regular → IRANYekanX}/6656-6911.pbf +0 -0
  268. /package/fonts/{IRANYekanX Regular → IRANYekanX}/6912-7167.pbf +0 -0
  269. /package/fonts/{IRANYekanX Regular → IRANYekanX}/7168-7423.pbf +0 -0
  270. /package/fonts/{IRANYekanX Regular → IRANYekanX}/7424-7679.pbf +0 -0
  271. /package/fonts/{IRANYekanX Regular → IRANYekanX}/768-1023.pbf +0 -0
  272. /package/fonts/{IRANYekanX Regular → IRANYekanX}/7680-7935.pbf +0 -0
  273. /package/fonts/{IRANYekanX Regular → IRANYekanX}/7936-8191.pbf +0 -0
  274. /package/fonts/{IRANYekanX Regular → IRANYekanX}/8192-8447.pbf +0 -0
  275. /package/fonts/{IRANYekanX Regular → IRANYekanX}/8448-8703.pbf +0 -0
  276. /package/fonts/{IRANYekanX Regular → IRANYekanX}/8704-8959.pbf +0 -0
  277. /package/fonts/{IRANYekanX Regular → IRANYekanX}/8960-9215.pbf +0 -0
  278. /package/fonts/{IRANYekanX Regular → IRANYekanX}/9216-9471.pbf +0 -0
  279. /package/fonts/{IRANYekanX Regular → IRANYekanX}/9472-9727.pbf +0 -0
  280. /package/fonts/{IRANYekanX Regular → IRANYekanX}/9728-9983.pbf +0 -0
  281. /package/fonts/{IRANYekanX Regular → IRANYekanX}/9984-10239.pbf +0 -0
@@ -1,10 +1,10 @@
1
- var ne = Object.defineProperty;
2
- var le = (s, e, t) => e in s ? ne(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
- var d = (s, e, t) => le(s, typeof e != "symbol" ? e + "" : e, t);
4
- import { jsx as ce } from "react/jsx-runtime";
1
+ var se = Object.defineProperty;
2
+ var ne = (a, e, t) => e in a ? se(a, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[e] = t;
3
+ var d = (a, e, t) => ne(a, typeof e != "symbol" ? e + "" : e, t);
4
+ import { jsx as le } from "react/jsx-runtime";
5
5
  import { useRef as Z, useEffect as B } from "react";
6
- import { Map as de, Marker as V, Popup as pe, setWorkerUrl as he } from "maplibre-gl";
7
- const ue = {
6
+ import { Map as ce, Marker as U, Popup as de, setWorkerUrl as pe } from "maplibre-gl";
7
+ const he = {
8
8
  searchPlaceholder: "جست‌وجوی موقعیت...",
9
9
  searchTitle: "جستجوی موقعیت",
10
10
  suggestedPlaces: "مکان‌های پیشنهادی",
@@ -34,62 +34,73 @@ const ue = {
34
34
  copy: "کپی",
35
35
  copied: "کپی شد",
36
36
  submitting: "در حال ثبت..."
37
- }, me = [
38
- { name: "۱۹ دی، قم", addr: "محله ۱۹ دی، شهر قم", lat: 34.6558, lng: 50.9055 },
39
- { name: "آذر، قم", addr: "محله آذر، شهر قم", lat: 34.6492, lng: 50.8965 },
40
- { name: "امام حسین، قم", addr: "میدان امام حسین، شهر قم", lat: 34.6512, lng: 50.8932 },
41
- { name: "انسجام، قم", addr: "محله انسجام، شهر قم", lat: 34.6058, lng: 50.8752 },
42
- { name: "انقلاب، قم", addr: "خیابان انقلاب، شهر قم", lat: 34.6462, lng: 50.8915 },
43
- { name: "باجک، قم", addr: "محله باجک، شهر قم", lat: 34.6601, lng: 50.8823 },
44
- { name: "بلوار امین، قم", addr: "محله بلوار امین، شهر قم", lat: 34.6248, lng: 50.8792 },
45
- { name: "بنیاد، قم", addr: "محله بنیاد، شهر قم", lat: 34.6475, lng: 50.8985 },
46
- { name: "پردیسان، قم", addr: "شهرک پردیسان، شهر قم", lat: 34.6021, lng: 50.8412 },
47
- { name: "توحید، قم", addr: "محله توحید، شهر قم", lat: 34.6685, lng: 50.8748 },
48
- { name: "جمکران، قم", addr: "محله جمکران، شهر قم", lat: 34.5853, lng: 50.9068 },
49
- { name: "چهارمردان، قم", addr: "محله چهارمردان، شهر قم", lat: 34.6401, lng: 50.8873 },
50
- { name: "حافظ، قم", addr: "خیابان حافظ، شهر قم", lat: 34.6368, lng: 50.8785 },
51
- { name: "حرم، قم", addr: "محله حرم، شهر قم", lat: 34.6448, lng: 50.8791 },
52
- { name: "خاکفرج، قم", addr: "محله خاکفرج، شهر قم", lat: 34.6798, lng: 50.9012 },
53
- { name: "دروازه ری، قم", addr: "محله دروازه ری، شهر قم", lat: 34.6352, lng: 50.8958 },
54
- { name: "دورشهر، قم", addr: "محله دورشهر، شهر قم", lat: 34.6442, lng: 50.8744 },
55
- { name: "زاویه، قم", addr: "محله زاویه، شهر قم", lat: 34.6385, lng: 50.8682 },
56
- { name: "زنبیل‌آباد، قم", addr: "محله زنبیل‌آباد، شهر قم", lat: 34.6221, lng: 50.8912 },
57
- { name: "سالاریه، قم", addr: "محله سالاریه، شهر قم", lat: 34.6289, lng: 50.8624 },
58
- { name: "سمیه، قم", addr: "خیابان سمیه، شهر قم", lat: 34.6521, lng: 50.8842 },
59
- { name: "شهدا، قم", addr: "خیابان شهدا، شهر قم", lat: 34.6425, lng: 50.8831 },
60
- { name: "شهرقائم، قم", addr: "شهرک قائم، شهر قم", lat: 34.6158, lng: 50.8505 },
61
- { name: "شهرک امام حسن، قم", addr: "شهرک امام حسن، شهر قم", lat: 34.6358, lng: 50.8521 },
62
- { name: "شهرک مهدیه، قم", addr: "شهرک مهدیه، شهر قم", lat: 34.6258, lng: 50.8452 },
63
- { name: "شهرک ولیعصر، قم", addr: "شهرک ولیعصر، شهر قم", lat: 34.6125, lng: 50.8585 },
64
- { name: "شیخ‌آباد، قم", addr: "محله شیخ‌آباد، شهر قم", lat: 34.6582, lng: 50.8718 },
65
- { name: "صدوق، قم", addr: "خیابان صدوق، شهر قم", lat: 34.6198, lng: 50.8725 },
66
- { name: "صفائیه، قم", addr: "محله صفائیه، شهر قم", lat: 34.6327, lng: 50.8713 },
67
- { name: "عسگریه، قم", addr: "محله عسگریه، شهر قم", lat: 34.6305, lng: 50.9018 },
68
- { name: "عطاران، قم", addr: "محله عطاران، شهر قم", lat: 34.6548, lng: 50.8895 },
69
- { name: "فرهنگیان، قم", addr: "محله فرهنگیان، شهر قم", lat: 34.6105, lng: 50.8702 },
70
- { name: "کشاورز، قم", addr: "محله کشاورز، شهر قم", lat: 34.6642, lng: 50.8885 },
71
- { name: "کلهری، قم", addr: "منطقه کلهری، شهر قم", lat: 34.6211, lng: 50.9055 },
72
- { name: "کیوانفر، قم", addr: "محله کیوانفر، شهر قم", lat: 34.6172, lng: 50.8856 },
73
- { name: "مطهری، قم", addr: "خیابان مطهری، شهر قم", lat: 34.6485, lng: 50.8878 },
74
- { name: "معلم، قم", addr: "میدان معلم، شهر قم", lat: 34.6275, lng: 50.8942 },
75
- { name: "نوبهار، قم", addr: "محله نوبهار، شهر قم", lat: 34.6623, lng: 50.8952 },
76
- { name: "نیروگاه، قم", addr: "محله نیروگاه، شهر قم", lat: 34.6712, lng: 50.8851 },
77
- { name: "هفت‌تیر، قم", addr: "خیابان هفت‌تیر، شهر قم", lat: 34.6442, lng: 50.8995 },
78
- { name: "یزدانشهر، قم", addr: "محله یزدانشهر، شهر قم", lat: 34.6012, lng: 50.8628 }
79
- ], z = { lat: 34.6416, lng: 50.8764 }, ge = 14;
80
- function ye(s) {
81
- return { ...ue, ...(s == null ? void 0 : s.labels) ?? {} };
37
+ }, ue = [
38
+ { name: "۱۹ دی", addr: "شهر قم، خیابان ۱۹ دی", lat: 34.6457, lng: 50.8851 },
39
+ { name: "۷۲ تن", addr: "شهر قم، میدان ۷۲ تن", lat: 34.6753, lng: 50.8922 },
40
+ { name: "آبشار", addr: "شهر قم، بوستان آبشار", lat: 34.6869, lng: 50.8899 },
41
+ { name: "آذر", addr: "شهر قم، بوستان شهدای آذر", lat: 34.6341, lng: 50.906 },
42
+ { name: "ارم", addr: "شهر قم، محله ارم", lat: 34.6424, lng: 50.8804 },
43
+ { name: "امام حسین", addr: "شهر قم، میدان امام حسین", lat: 34.6426, lng: 50.8491 },
44
+ { name: "امام خمینی", addr: "شهر قم، خیابان امام خمینی", lat: 34.6633, lng: 50.8759 },
45
+ { name: "انسجام", addr: "شهر قم، محله انسجام", lat: 34.6081, lng: 50.8783 },
46
+ { name: "انقلاب", addr: "شهر قم، خیابان انقلاب", lat: 34.6354, lng: 50.8906 },
47
+ { name: "باجک", addr: "شهر قم، محله باجک", lat: 34.6496, lng: 50.8906 },
48
+ { name: "بلوار امین", addr: "شهر قم، بلوار امین", lat: 34.6335, lng: 50.8676 },
49
+ { name: "بلوار الغدیر", addr: "شهر قم، بلوار الغدیر", lat: 34.5956, lng: 50.8209 },
50
+ { name: "بلوار جمهوری اسلامی", addr: "شهر قم، بلوار جمهوری اسلامی", lat: 34.6056, lng: 50.8866 },
51
+ { name: "بلوار پیامبر اعظم", addr: "شهر قم، بلوار پیامبر اعظم", lat: 34.6113, lng: 50.8973 },
52
+ { name: "بنیاد", addr: "شهر قم، محله بنیاد", lat: 34.5944, lng: 50.8768 },
53
+ { name: "پردیسان", addr: "شهر قم، شهرک پردیسان", lat: 34.5588, lng: 50.8331 },
54
+ { name: "توحید", addr: "شهر قم، میدان توحید", lat: 34.6436, lng: 50.8628 },
55
+ { name: "جمکران", addr: "شهر قم، مسجد مقدس جمکران", lat: 34.5841, lng: 50.9146 },
56
+ { name: "چهارمردان", addr: "شهر قم، محله چهارمردان", lat: 34.6335, lng: 50.889 },
57
+ { name: "حافظ", addr: "شهر قم، خیابان حافظ", lat: 34.6494, lng: 50.8611 },
58
+ { name: "حرم", addr: "شهر قم، حرم حضرت معصومه", lat: 34.6419, lng: 50.8787 },
59
+ { name: "خاکفرج", addr: "شهر قم، محله خاکفرج", lat: 34.6517, lng: 50.8853 },
60
+ { name: "دروازه ری", addr: "شهر قم، محله دروازه ری", lat: 34.6446, lng: 50.9023 },
61
+ { name: "دورشهر", addr: "شهر قم، محله دورشهر", lat: 34.6296, lng: 50.8705 },
62
+ { name: "زاویه", addr: "شهر قم، محله زاویه", lat: 34.6214, lng: 50.9078 },
63
+ { name: "زنبیل‌آباد", addr: "شهر قم، محله زنبیل‌آباد", lat: 34.6075, lng: 50.862 },
64
+ { name: "سالاریه", addr: "شهر قم، محله سالاریه", lat: 34.6116, lng: 50.8471 },
65
+ { name: "سعیدی", addr: "شهر قم، میدان سعیدی", lat: 34.65, lng: 50.878 },
66
+ { name: "سمیه", addr: "شهر قم، خیابان سمیه", lat: 34.632, lng: 50.8826 },
67
+ { name: "شهدا", addr: "شهر قم، خیابان شهدا", lat: 34.6362, lng: 50.872 },
68
+ { name: "شهرک امام حسن", addr: "شهر قم، شهرک امام حسن", lat: 34.6782, lng: 50.88 },
69
+ { name: "شهرک صنعتی شکوهیه", addr: "شهر قم، شهرک صنعتی شکوهیه", lat: 34.7956, lng: 50.8177 },
70
+ { name: "شهرک فاطمیه", addr: "شهر قم، شهرک فاطمیه", lat: 34.6746, lng: 50.8521 },
71
+ { name: "شهرک قدس", addr: "شهر قم، شهرک قدس", lat: 34.5969, lng: 50.8426 },
72
+ { name: "شهرک مهدیه", addr: "شهر قم، شهرک مهدیه", lat: 34.5823, lng: 50.8238 },
73
+ { name: "شیخ‌آباد", addr: "شهر قم، محله شیخ‌آباد", lat: 34.6474, lng: 50.8344 },
74
+ { name: "صدوق", addr: "شهر قم، محله صدوق", lat: 34.6313, lng: 50.8743 },
75
+ { name: "صفائیه", addr: "شهر قم، محله صفائیه", lat: 34.6362, lng: 50.8721 },
76
+ { name: "طالقانی", addr: "شهر قم، خیابان طالقانی", lat: 34.6734, lng: 50.8704 },
77
+ { name: "عطاران", addr: "شهر قم، محله عطاران", lat: 34.624, lng: 50.8714 },
78
+ { name: "علی‌بن‌جعفر", addr: "شهر قم، آستان علی‌بن‌جعفر", lat: 34.6313, lng: 50.8973 },
79
+ { name: "فرهنگیان", addr: "شهر قم، محله فرهنگیان", lat: 34.6682, lng: 50.8984 },
80
+ { name: "کشاورز", addr: "شهر قم، خیابان کشاورز", lat: 34.656, lng: 50.8446 },
81
+ { name: "کلهری", addr: "شهر قم، منطقه کلهری", lat: 34.6257, lng: 50.9034 },
82
+ { name: "کیوانفر", addr: "شهر قم، بلوار شهید کیوانفر", lat: 34.6582, lng: 50.8821 },
83
+ { name: "مطهری", addr: "شهر قم، خیابان مطهری", lat: 34.646, lng: 50.8486 },
84
+ { name: "معلم", addr: "شهر قم، میدان معلم", lat: 34.6328, lng: 50.8848 },
85
+ { name: "نوبهار", addr: "شهر قم، محله نوبهار", lat: 34.6409, lng: 50.9053 },
86
+ { name: "نیروگاه", addr: "شهر قم، محله نیروگاه", lat: 34.6487, lng: 50.8587 },
87
+ { name: "هفت‌تیر", addr: "شهر قم، خیابان هفت‌تیر", lat: 34.6571, lng: 50.8848 },
88
+ { name: "هنرستان", addr: "شهر قم، محله هنرستان", lat: 34.628, lng: 50.8878 },
89
+ { name: "یزدانشهر", addr: "شهر قم، محله یزدانشهر", lat: 34.6154, lng: 50.8824 }
90
+ ], z = { lat: 34.6416, lng: 50.8764 }, me = 14;
91
+ function ge(a) {
92
+ return { ...he, ...(a == null ? void 0 : a.labels) ?? {} };
82
93
  }
83
- function fe() {
94
+ function ye() {
84
95
  return "rtl";
85
96
  }
86
- function be(s) {
87
- const e = s ?? {};
97
+ function fe(a) {
98
+ const e = a ?? {};
88
99
  return {
89
100
  container: e.container,
90
101
  map: {
91
102
  center: { ...z },
92
- zoom: ge,
103
+ zoom: me,
93
104
  minZoom: 11,
94
105
  maxZoom: 19,
95
106
  bounds: [
@@ -107,7 +118,7 @@ function be(s) {
107
118
  },
108
119
  search: {
109
120
  enabled: !0,
110
- suggestions: me,
121
+ suggestions: ue,
111
122
  minLength: 3,
112
123
  debounceMs: 350,
113
124
  limit: 5,
@@ -124,17 +135,17 @@ function be(s) {
124
135
  locateZoom: 18,
125
136
  ...e.behavior ?? {}
126
137
  },
127
- i18n: { labels: ye(e.i18n) },
138
+ i18n: { labels: ge(e.i18n) },
128
139
  markers: e.markers ?? []
129
140
  };
130
141
  }
131
- const ve = "#e9ebee", we = "#e9ebee", G = "#a9e29b", qe = "#9ed894", xe = "#b5e8a6", ke = "#d3ddd0", Se = "#e9dfc0", Le = "#b9d9f2", Ee = "#cfe4f7", j = "#a9cdf0", H = "#4e6e94", U = "#dfe3e9", Te = "#e9ebee", $ = "#ffffff", Me = "#d9dde2", x = "#ffffff", A = "#d5dae0", Re = "#cdbfa8", Ae = "#e9ebee", Q = "#c6ccd4", I = "#b9bdc4", Y = "#a7aab3", X = "#5b6067", _ = "#2f3338", f = "#f7f8f9", P = "#565b62", _e = [
142
+ const be = "#e9ebee", ve = "#e9ebee", V = "#a9e29b", we = "#9ed894", qe = "#b5e8a6", xe = "#d3ddd0", ke = "#e9dfc0", Se = "#b9d9f2", Le = "#cfe4f7", D = "#a9cdf0", G = "#4e6e94", H = "#dfe3e9", Ee = "#e9ebee", $ = "#ffffff", Te = "#d9dde2", x = "#ffffff", A = "#d5dae0", Me = "#cdbfa8", Re = "#e9ebee", Q = "#c6ccd4", I = "#b9bdc4", Y = "#a7aab3", X = "#5b6067", _ = "#2f3338", f = "#f7f8f9", P = "#565b62", Ae = [
132
143
  "coalesce",
133
144
  ["get", "name:fa"],
134
145
  ["get", "name:nonlatin"],
135
146
  ["get", "name"],
136
147
  ["get", "name:latin"]
137
- ], Ce = [
148
+ ], _e = [
138
149
  "0",
139
150
  "۰",
140
151
  "1",
@@ -176,17 +187,17 @@ const ve = "#e9ebee", we = "#e9ebee", G = "#a9e29b", qe = "#9ed894", xe = "#b5e8
176
187
  "٩",
177
188
  "۹"
178
189
  ];
179
- function ze(s, e = 40) {
180
- const t = ["coalesce", s, ""], o = ["split", ["to-string", t], ""], r = ["length", o], i = [];
181
- for (let a = 0; a < e; a++) {
182
- const n = ["at", a, o];
183
- i.push(["case", [">", r, a], ["match", n, ...Ce, n], ""]);
190
+ function Ce(a, e = 40) {
191
+ const t = ["coalesce", a, ""], o = ["split", ["to-string", t], ""], r = ["length", o], i = [];
192
+ for (let s = 0; s < e; s++) {
193
+ const n = ["at", s, o];
194
+ i.push(["case", [">", r, s], ["match", n, ..._e, n], ""]);
184
195
  }
185
196
  return i.push(["slice", ["to-string", t], e]), ["format", ["concat", ...i], {}];
186
197
  }
187
- const b = ze(_e), k = ["IRANYekanX Regular"], O = ["IRANYekanX Regular"], q = ["LineString", "MultiLineString"], $e = ["MultiPoint", "Point"];
188
- function y(s) {
189
- return ["interpolate", ["exponential", 1.2], ["zoom"], ...s];
198
+ const b = Ce(Ae), k = ["IRANYekanX"], O = ["IRANYekanX"], q = ["LineString", "MultiLineString"], ze = ["MultiPoint", "Point"];
199
+ function y(a) {
200
+ return ["interpolate", ["exponential", 1.2], ["zoom"], ...a];
190
201
  }
191
202
  const K = [
192
203
  "interpolate",
@@ -200,7 +211,7 @@ const K = [
200
211
  2.5,
201
212
  20,
202
213
  11.5
203
- ], Pe = [
214
+ ], $e = [
204
215
  "interpolate",
205
216
  ["exponential", 1.2],
206
217
  ["zoom"],
@@ -212,9 +223,9 @@ const K = [
212
223
  4,
213
224
  20,
214
225
  15
215
- ], Oe = [
226
+ ], Pe = [
216
227
  // ── BACKGROUND ──────────────────────────────────────────
217
- { id: "background", type: "background", paint: { "background-color": ve } },
228
+ { id: "background", type: "background", paint: { "background-color": be } },
218
229
  // ── LANDUSE / LANDCOVER ─────────────────────────────────
219
230
  {
220
231
  id: "landuse-residential",
@@ -222,7 +233,7 @@ const K = [
222
233
  source: "openmaptiles",
223
234
  "source-layer": "landuse",
224
235
  filter: ["match", ["get", "class"], ["neighbourhood", "residential"], !0, !1],
225
- paint: { "fill-color": we }
236
+ paint: { "fill-color": ve }
226
237
  },
227
238
  {
228
239
  id: "landuse-cemetery",
@@ -230,7 +241,7 @@ const K = [
230
241
  source: "openmaptiles",
231
242
  "source-layer": "landuse",
232
243
  filter: ["==", ["get", "class"], "cemetery"],
233
- paint: { "fill-color": ke }
244
+ paint: { "fill-color": xe }
234
245
  },
235
246
  {
236
247
  id: "landcover-wood",
@@ -238,7 +249,7 @@ const K = [
238
249
  source: "openmaptiles",
239
250
  "source-layer": "landcover",
240
251
  filter: ["==", ["get", "class"], "wood"],
241
- paint: { "fill-color": qe }
252
+ paint: { "fill-color": we }
242
253
  },
243
254
  {
244
255
  id: "landcover-grass",
@@ -246,14 +257,14 @@ const K = [
246
257
  source: "openmaptiles",
247
258
  "source-layer": "landcover",
248
259
  filter: ["==", ["get", "class"], "grass"],
249
- paint: { "fill-color": xe }
260
+ paint: { "fill-color": qe }
250
261
  },
251
262
  {
252
263
  id: "landcover-grass-park",
253
264
  type: "fill",
254
265
  source: "openmaptiles",
255
266
  "source-layer": "park",
256
- paint: { "fill-color": G }
267
+ paint: { "fill-color": V }
257
268
  },
258
269
  {
259
270
  id: "park",
@@ -261,7 +272,7 @@ const K = [
261
272
  source: "openmaptiles",
262
273
  "source-layer": "park",
263
274
  filter: ["match", ["geometry-type"], ["MultiPolygon", "Polygon"], !0, !1],
264
- paint: { "fill-color": G }
275
+ paint: { "fill-color": V }
265
276
  },
266
277
  {
267
278
  id: "landcover-sand",
@@ -269,7 +280,7 @@ const K = [
269
280
  source: "openmaptiles",
270
281
  "source-layer": "landcover",
271
282
  filter: ["==", ["get", "class"], "sand"],
272
- paint: { "fill-color": Se }
283
+ paint: { "fill-color": ke }
273
284
  },
274
285
  // ── WATER ───────────────────────────────────────────────
275
286
  {
@@ -278,7 +289,7 @@ const K = [
278
289
  source: "openmaptiles",
279
290
  "source-layer": "water",
280
291
  filter: ["all", ["!=", ["get", "intermittent"], 1], ["!=", ["get", "brunnel"], "tunnel"]],
281
- paint: { "fill-color": Le }
292
+ paint: { "fill-color": Se }
282
293
  },
283
294
  {
284
295
  id: "water-intermittent",
@@ -286,7 +297,7 @@ const K = [
286
297
  source: "openmaptiles",
287
298
  "source-layer": "water",
288
299
  filter: ["all", ["==", ["get", "intermittent"], 1], ["!=", ["get", "brunnel"], "tunnel"]],
289
- paint: { "fill-color": Ee, "fill-opacity": 0.8 }
300
+ paint: { "fill-color": Le, "fill-opacity": 0.8 }
290
301
  },
291
302
  {
292
303
  id: "waterway-other",
@@ -299,7 +310,7 @@ const K = [
299
310
  ["==", ["get", "intermittent"], 0]
300
311
  ],
301
312
  paint: {
302
- "line-color": j,
313
+ "line-color": D,
303
314
  "line-width": ["interpolate", ["exponential", 1.3], ["zoom"], 13, 0.5, 20, 2]
304
315
  }
305
316
  },
@@ -315,7 +326,7 @@ const K = [
315
326
  ["==", ["get", "intermittent"], 0]
316
327
  ],
317
328
  paint: {
318
- "line-color": j,
329
+ "line-color": D,
319
330
  "line-width": ["interpolate", ["exponential", 1.3], ["zoom"], 13, 0.5, 20, 6]
320
331
  }
321
332
  },
@@ -331,7 +342,7 @@ const K = [
331
342
  ["!=", ["get", "intermittent"], 1]
332
343
  ],
333
344
  paint: {
334
- "line-color": j,
345
+ "line-color": D,
335
346
  "line-width": ["interpolate", ["exponential", 1.2], ["zoom"], 10, 0.8, 20, 6]
336
347
  }
337
348
  },
@@ -341,7 +352,7 @@ const K = [
341
352
  type: "fill",
342
353
  source: "openmaptiles",
343
354
  "source-layer": "building",
344
- paint: { "fill-antialias": !0, "fill-color": U }
355
+ paint: { "fill-antialias": !0, "fill-color": H }
345
356
  },
346
357
  {
347
358
  id: "building-top",
@@ -349,9 +360,9 @@ const K = [
349
360
  source: "openmaptiles",
350
361
  "source-layer": "building",
351
362
  paint: {
352
- "fill-color": Te,
363
+ "fill-color": Ee,
353
364
  "fill-opacity": ["interpolate", ["linear"], ["zoom"], 13, 0, 16, 1],
354
- "fill-outline-color": U,
365
+ "fill-outline-color": H,
355
366
  "fill-translate": [
356
367
  "interpolate",
357
368
  ["linear"],
@@ -370,7 +381,7 @@ const K = [
370
381
  source: "openmaptiles",
371
382
  "source-layer": "aeroway",
372
383
  paint: {
373
- "fill-color": Ae,
384
+ "fill-color": Re,
374
385
  "fill-opacity": ["interpolate", ["linear"], ["zoom"], 13, 0, 14, 1]
375
386
  }
376
387
  },
@@ -436,9 +447,9 @@ const K = [
436
447
  ],
437
448
  layout: { "line-cap": "round", "line-join": "round" },
438
449
  paint: {
439
- "line-color": Me,
450
+ "line-color": Te,
440
451
  "line-opacity": ["interpolate", ["linear"], ["zoom"], 12, 0, 12.5, 1],
441
- "line-width": Pe
452
+ "line-width": $e
442
453
  }
443
454
  },
444
455
  {
@@ -543,7 +554,7 @@ const K = [
543
554
  ["==", ["get", "class"], "path"]
544
555
  ],
545
556
  paint: {
546
- "line-color": Re,
557
+ "line-color": Me,
547
558
  "line-dasharray": [1.5, 0.75],
548
559
  "line-width": y([15, 1.2, 20, 4])
549
560
  }
@@ -811,7 +822,7 @@ const K = [
811
822
  "text-font": k,
812
823
  "text-size": 13
813
824
  },
814
- paint: { "text-color": H, "text-halo-color": f, "text-halo-width": 1.5 }
825
+ paint: { "text-color": G, "text-halo-color": f, "text-halo-width": 1.5 }
815
826
  },
816
827
  {
817
828
  id: "water_name_label",
@@ -819,7 +830,7 @@ const K = [
819
830
  source: "openmaptiles",
820
831
  "source-layer": "water_name",
821
832
  layout: { "text-field": b, "text-font": k, "text-max-width": 8, "text-size": 12 },
822
- paint: { "text-color": H, "text-halo-color": f, "text-halo-width": 1.5 }
833
+ paint: { "text-color": G, "text-halo-color": f, "text-halo-width": 1.5 }
823
834
  },
824
835
  // ── POI (Snapp density: worship/education/medical/shops) ──
825
836
  {
@@ -914,7 +925,7 @@ const K = [
914
925
  minzoom: 16,
915
926
  filter: [
916
927
  "all",
917
- ["match", ["geometry-type"], $e, !0, !1],
928
+ ["match", ["geometry-type"], ze, !0, !1],
918
929
  [">=", ["get", "rank"], 1],
919
930
  ["<", ["get", "rank"], 7]
920
931
  ],
@@ -1080,7 +1091,7 @@ const K = [
1080
1091
  },
1081
1092
  paint: { "text-color": _, "text-halo-color": f, "text-halo-width": 1.5 }
1082
1093
  }
1083
- ], De = "https://tiles.openfreemap.org/planet", je = {
1094
+ ], Oe = "https://tiles.openfreemap.org/planet", De = {
1084
1095
  version: 8,
1085
1096
  name: "snapp-like",
1086
1097
  // Absolute CDN URL of the PBFs shipped in this package (files: fonts/) —
@@ -1090,9 +1101,9 @@ const K = [
1090
1101
  glyphs: "https://cdn.jsdelivr.net/npm/@amir83nasr/map@1/fonts/{fontstack}/{range}.pbf",
1091
1102
  sprite: "https://tiles.openfreemap.org/sprites/ofm_f384/ofm",
1092
1103
  sources: {
1093
- openmaptiles: { type: "vector", url: De }
1104
+ openmaptiles: { type: "vector", url: Oe }
1094
1105
  },
1095
- layers: Oe
1106
+ layers: Pe
1096
1107
  };
1097
1108
  class Ie {
1098
1109
  constructor() {
@@ -1114,8 +1125,8 @@ class Ie {
1114
1125
  }
1115
1126
  }
1116
1127
  }
1117
- function C(s) {
1118
- return `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${s}</svg>`;
1128
+ function C(a) {
1129
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${a}</svg>`;
1119
1130
  }
1120
1131
  const v = {
1121
1132
  locate: C(
@@ -1130,51 +1141,51 @@ const v = {
1130
1141
  ),
1131
1142
  x: C('<path d="M18 6 6 18"/><path d="m6 6 12 12"/>')
1132
1143
  }, J = "۰۱۲۳۴۵۶۷۸۹";
1133
- function S(s) {
1134
- return String(s).replace(/\d/g, (e) => J[Number(e)]).replace(/[٠-٩]/g, (e) => J["٠١٢٣٤٥٦٧٨٩".indexOf(e)]);
1144
+ function S(a) {
1145
+ return String(a).replace(/\d/g, (e) => J[Number(e)]).replace(/[٠-٩]/g, (e) => J["٠١٢٣٤٥٦٧٨٩".indexOf(e)]);
1135
1146
  }
1136
- function ee(s, e = 5) {
1137
- return S(Number(s).toFixed(e));
1147
+ function ee(a, e = 5) {
1148
+ return S(Number(a).toFixed(e));
1138
1149
  }
1139
- function M(s) {
1140
- return String(s).replace(/[۰-۹]/g, (e) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(e))).replace(/[٠-٩]/g, (e) => String("٠١٢٣٤٥٦٧٨٩".indexOf(e)));
1150
+ function M(a) {
1151
+ return String(a).replace(/[۰-۹]/g, (e) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(e))).replace(/[٠-٩]/g, (e) => String("٠١٢٣٤٥٦٧٨٩".indexOf(e)));
1141
1152
  }
1142
- function te(s) {
1143
- if (!s) return "";
1144
- const e = String(s).split(",").map((o) => o.trim()).filter(Boolean), t = (o) => !!(/^(ایران|Iran)$/i.test(o) || /^استان\b/.test(o) || /^شهرستان\b/.test(o) || /^بخش\b/.test(o) || /^[\d\s\-–—]+$/.test(M(o)));
1153
+ function te(a) {
1154
+ if (!a) return "";
1155
+ const e = String(a).split(",").map((o) => o.trim()).filter(Boolean), t = (o) => !!(/^(ایران|Iran)$/i.test(o) || /^استان\b/.test(o) || /^شهرستان\b/.test(o) || /^بخش\b/.test(o) || /^[\d\s\-–—]+$/.test(M(o)));
1145
1156
  return e.filter((o) => !t(o)).slice(0, 4).reverse().join(", ");
1146
1157
  }
1147
- function Ne(s, e) {
1148
- return Number.isFinite(s) && Number.isFinite(e) && s >= -90 && s <= 90 && e >= -180 && e <= 180;
1158
+ function Ne(a, e) {
1159
+ return Number.isFinite(a) && Number.isFinite(e) && a >= -90 && a <= 90 && e >= -180 && e <= 180;
1149
1160
  }
1150
- const Fe = "50.35,35.05,51.45,34.15", N = /* @__PURE__ */ new Map(), F = /* @__PURE__ */ new Map();
1151
- function se(s, e) {
1152
- s.size > e && s.delete(s.keys().next().value);
1161
+ const je = "50.35,35.05,51.45,34.15", N = /* @__PURE__ */ new Map(), j = /* @__PURE__ */ new Map();
1162
+ function ie(a, e) {
1163
+ a.size > e && a.delete(a.keys().next().value);
1153
1164
  }
1154
- async function We(s, e, t) {
1155
- const o = `${s.toFixed(4)},${e.toFixed(4)}`, r = N.get(o);
1165
+ async function We(a, e, t) {
1166
+ const o = `${a.toFixed(4)},${e.toFixed(4)}`, r = N.get(o);
1156
1167
  if (r) return r;
1157
1168
  const i = await fetch(
1158
- `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${s}&lon=${e}&accept-language=fa`,
1169
+ `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${a}&lon=${e}&accept-language=fa`,
1159
1170
  { headers: { Accept: "application/json" }, signal: t == null ? void 0 : t.signal }
1160
1171
  );
1161
1172
  if (!i.ok) throw new Error(`http ${i.status}`);
1162
- const a = await i.json();
1163
- if (!a.display_name) throw new Error("empty result");
1164
- return N.set(o, a.display_name), se(N, 200), a.display_name;
1173
+ const s = await i.json();
1174
+ if (!s.display_name) throw new Error("empty result");
1175
+ return N.set(o, s.display_name), ie(N, 200), s.display_name;
1165
1176
  }
1166
- async function Ze(s, e = 5, t) {
1167
- const o = `${M(s).trim().toLowerCase()}|${e}`, r = F.get(o);
1177
+ async function Fe(a, e = 5, t) {
1178
+ const o = `${M(a).trim().toLowerCase()}|${e}`, r = j.get(o);
1168
1179
  if (r) return r;
1169
1180
  const i = await fetch(
1170
- `https://nominatim.openstreetmap.org/search?format=jsonv2&accept-language=fa&limit=${e}&viewbox=${Fe}&bounded=1&q=${encodeURIComponent(M(s))}`,
1181
+ `https://nominatim.openstreetmap.org/search?format=jsonv2&accept-language=fa&limit=${e}&viewbox=${je}&bounded=1&q=${encodeURIComponent(M(a))}`,
1171
1182
  { headers: { Accept: "application/json" }, signal: t == null ? void 0 : t.signal }
1172
1183
  );
1173
1184
  if (!i.ok) throw new Error(`http ${i.status}`);
1174
- const a = await i.json();
1175
- return F.set(o, a), se(F, 50), a;
1185
+ const s = await i.json();
1186
+ return j.set(o, s), ie(j, 50), s;
1176
1187
  }
1177
- const Be = [
1188
+ const Ze = [
1178
1189
  "highway-minor",
1179
1190
  "highway-link",
1180
1191
  "highway-secondary-tertiary",
@@ -1186,53 +1197,53 @@ const Be = [
1186
1197
  "bridge-secondary-tertiary",
1187
1198
  "bridge-trunk-primary",
1188
1199
  "bridge-motorway"
1189
- ], T = 64, Ve = 15, oe = 2;
1190
- function Ge(s, e, t, o, r, i) {
1191
- const a = r - t, n = i - o, l = a * a + n * n, g = l === 0 ? 0 : ((s - t) * a + (e - o) * n) / l, m = Math.max(0, Math.min(1, g)), p = t + m * a, h = o + m * n;
1192
- return { x: p, y: h, d2: (s - p) * (s - p) + (e - h) * (e - h) };
1200
+ ], T = 64, Be = 15, oe = 2;
1201
+ function Ue(a, e, t, o, r, i) {
1202
+ const s = r - t, n = i - o, l = s * s + n * n, g = l === 0 ? 0 : ((a - t) * s + (e - o) * n) / l, m = Math.max(0, Math.min(1, g)), p = t + m * s, h = o + m * n;
1203
+ return { x: p, y: h, d2: (a - p) * (a - p) + (e - h) * (e - h) };
1193
1204
  }
1194
- function He(s, e, t) {
1195
- if (s.getZoom() < Ve) return null;
1196
- const o = s.project([t, e]);
1205
+ function Ve(a, e, t) {
1206
+ if (a.getZoom() < Be) return null;
1207
+ const o = a.project([t, e]);
1197
1208
  let r;
1198
1209
  try {
1199
1210
  const l = [
1200
1211
  [o.x - T, o.y - T],
1201
1212
  [o.x + T, o.y + T]
1202
1213
  ];
1203
- r = s.queryRenderedFeatures(l, { layers: Be });
1214
+ r = a.queryRenderedFeatures(l, { layers: Ze });
1204
1215
  } catch {
1205
1216
  return null;
1206
1217
  }
1207
- let i = null, a = T * T;
1218
+ let i = null, s = T * T;
1208
1219
  for (const l of r) {
1209
1220
  const g = l.geometry, m = g.type === "LineString" ? [g.coordinates] : g.type === "MultiLineString" ? g.coordinates : [];
1210
1221
  for (const p of m) {
1211
1222
  let h = null;
1212
1223
  for (const L of p) {
1213
- const c = s.project(L);
1224
+ const c = a.project(L);
1214
1225
  if (h) {
1215
- const u = Ge(o.x, o.y, h.x, h.y, c.x, c.y);
1216
- u.d2 < a && (a = u.d2, i = { x: u.x, y: u.y });
1226
+ const u = Ue(o.x, o.y, h.x, h.y, c.x, c.y);
1227
+ u.d2 < s && (s = u.d2, i = { x: u.x, y: u.y });
1217
1228
  }
1218
1229
  h = { x: c.x, y: c.y };
1219
1230
  }
1220
1231
  }
1221
1232
  }
1222
- if (!i || a < oe * oe) return null;
1223
- const n = s.unproject([i.x, i.y]);
1233
+ if (!i || s < oe * oe) return null;
1234
+ const n = a.unproject([i.x, i.y]);
1224
1235
  return { lat: n.lat, lng: n.lng };
1225
1236
  }
1226
- const re = 3, Ue = "Vite: import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url'; سپس setupQomPickWorker(workerUrl) را قبل از mount صدا بزنید. Next.js/webpack: هر دو فایل worker و shared را کپی کنید.", Qe = "qompick: MapLibre worker failed to load. Call setupQomPickWorker(workerUrl) from @amir83nasr/map before mounting LocationPickerView. Vite: use maplibre-gl-worker.mjs?worker&url. Next.js/webpack: copy maplibre-gl-worker.mjs and maplibre-gl-shared.mjs.";
1237
+ const re = 3, Ge = "Vite: import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url'; سپس setupQomPickWorker(workerUrl) را قبل از mount صدا بزنید. Next.js/webpack: هر دو فایل worker و shared را کپی کنید.", He = "qompick: MapLibre worker failed to load. Call setupQomPickWorker(workerUrl) from @amir83nasr/map before mounting LocationPickerView. Vite: use maplibre-gl-worker.mjs?worker&url. Next.js/webpack: copy maplibre-gl-worker.mjs and maplibre-gl-shared.mjs.";
1227
1238
  let W = !1;
1228
- function Ye(s) {
1239
+ function Qe(a) {
1229
1240
  const e = globalThis.Worker;
1230
1241
  if (typeof e != "function") return () => {
1231
1242
  };
1232
1243
  class t extends e {
1233
1244
  constructor(r, i) {
1234
1245
  super(r, i), W = !1, this.addEventListener("error", () => {
1235
- W = !0, s();
1246
+ W = !0, a();
1236
1247
  });
1237
1248
  }
1238
1249
  }
@@ -1240,17 +1251,17 @@ function Ye(s) {
1240
1251
  globalThis.Worker = e;
1241
1252
  };
1242
1253
  }
1243
- function Xe(s) {
1244
- const e = s, t = [e == null ? void 0 : e.message, e == null ? void 0 : e.filename, e == null ? void 0 : e.url, s].filter((o) => typeof o == "string").join(" ").toLowerCase();
1254
+ function Ye(a) {
1255
+ const e = a, t = [e == null ? void 0 : e.message, e == null ? void 0 : e.filename, e == null ? void 0 : e.url, a].filter((o) => typeof o == "string").join(" ").toLowerCase();
1245
1256
  return /maplibre-gl-(worker|shared)(?:-dev)?\.mjs/.test(t) || /failed to fetch worker script/.test(t) || /worker/.test(t) && /failed to load|cannot load|dynamically imported module/.test(t);
1246
1257
  }
1247
- const D = "من می‌خواهم با پکیج قم‌پیک (@amir83nasr/map) یک نقشه انتخاب موقعیت (LocationPickerView) از صفر در پروژه React/Next.js بسازم. این پکیج کاملاً متن‌باز و رایگان است و روی MapLibre GL ساخته شده و فقط نسخه React دارد. لطفاً قدم‌به‌قدم و به ترتیب راهنمایی‌ام کن: ۱) نصب — دستور نصب @amir83nasr/map و maplibre-gl نسخه ۶ (که peer dependency است و باید جدا نصب شود)؛ ۲) راه‌اندازی پایه — ایمپورت @amir83nasr/map/styles.css (شامل CSS مپ‌لایبر، فقط یک import CSS) و رندر کامپوننت LocationPickerView با ارتفاع مشخص (مثلاً 480px، چون بدون ارتفاع نقشه خالی دیده می‌شود) و center و zoom اولیه؛ ۳) جستجو — استفاده از پیشنهادهای پیش‌فرض محله‌های قم، یا جایگزینی آن‌ها با search.suggestions شامل name و addr و lat و lng؛۴) مارکرها — نمایش مارکر مکان‌ها با markers؛ ۵) دریافت نتیجه — گرفتن مختصات و آدرس تاییدشده کاربر با onConfirm؛ ۶) پاک‌سازی — کامپوننت LocationPickerView خودش destroy را در cleanup صدا می‌زند. کد کامل و قابل اجرا بده شامل همه importها و cssها، بگو هر بخش چه می‌کند، و در پایان خروجی مورد انتظار را توصیف کن: نقشه فارسی راست‌چین (RTL) و موبایل‌فرست با پین وسط، دکمه GPS، جستجو و دکمه تایید موقعیت. اگر چیزی از پروژه من لازم داری (نسخه React/Next.js، نسخه پکیج‌ها) اول بپرس.", ae = "پروژه React/Next.js من از قبل وجود دارد و می‌خواهم نقشه انتخاب موقعیت قم‌پیک (@amir83nasr/map) را به آن اضافه کنم بدون این‌که چیز دیگری خراب شود. این پکیج کاملاً متن‌باز و رایگان است و روی MapLibre GL ساخته شده و فقط نسخه React دارد. لطفاً قدم‌به‌قدم و به ترتیب راهنمایی‌ام کن: ۱) نصب — دستور نصب @amir83nasr/map و maplibre-gl نسخه ۶ (که peer dependency است و باید جدا نصب شود)، با توجه به این‌که بقیه dependencyهای پروژه نباید به‌هم بخورد؛ ۲) ایمپورت css — اضافه کردن @amir83nasr/map/styles.css (شامل CSS مپ‌لایبر؛ فقط یک import CSS) طوری که با استایل‌های فعلی پروژه تداخل نکند (همه کلاس‌ها و متغیرهای قم‌پیک با qp- شروع می‌شوند)؛ ۳) کانتینر — رندر LocationPickerView با ارتفاع مشخص (مثلاً 480px، چون بدون ارتفاع نقشه خالی دیده می‌شود) در جای مناسب صفحه فعلی؛ ۴) اتصال — دادن center و zoom، استفاده یا جایگزینی پیشنهادهای پیش‌فرض search، نمایش markers، و گرفتن مختصات و آدرس تاییدشده با onConfirm؛۵) پاک‌سازی — کامپوننت LocationPickerView خودش destroy را در cleanup صدا می‌زند. کد کامل و قابل اجرا بده شامل همه importها، بگو هر بخش چه می‌کند، و در پایان خروجی مورد انتظار را توصیف کن: نقشه فارسی راست‌چین (RTL) و موبایل‌فرست با پین وسط، دکمه GPS، جستجو و دکمه تایید موقعیت. اگر چیزی از پروژه من لازم داری (نسخه React/Next.js، نسخه پکیج‌ها، ساختار فایل‌ها) اول بپرس.", ie = {
1248
- zero: D,
1258
+ const F = "من می‌خواهم با پکیج قم‌پیک (@amir83nasr/map) یک نقشه انتخاب موقعیت (LocationPickerView) از صفر در پروژه React/Next.js بسازم. این پکیج کاملاً متن‌باز و رایگان است و روی MapLibre GL ساخته شده و فقط نسخه React دارد. لطفاً قدم‌به‌قدم و به ترتیب راهنمایی‌ام کن: ۱) نصب — دستور نصب @amir83nasr/map و maplibre-gl نسخه ۶ (که peer dependency است و باید جدا نصب شود)؛ ۲) راه‌اندازی پایه — ایمپورت @amir83nasr/map/styles.css (شامل CSS مپ‌لایبر، فقط یک import CSS) و رندر کامپوننت LocationPickerView با ارتفاع مشخص (مثلاً 480px، چون بدون ارتفاع نقشه خالی دیده می‌شود) و center و zoom اولیه؛ ۳) جستجو — استفاده از پیشنهادهای پیش‌فرض محله‌های قم، یا جایگزینی آن‌ها با search.suggestions شامل name و addr و lat و lng؛۴) مارکرها — نمایش مارکر مکان‌ها با markers؛ ۵) دریافت نتیجه — گرفتن مختصات و آدرس تاییدشده کاربر با onConfirm؛ ۶) پاک‌سازی — کامپوننت LocationPickerView خودش destroy را در cleanup صدا می‌زند. کد کامل و قابل اجرا بده شامل همه importها و cssها، بگو هر بخش چه می‌کند، و در پایان خروجی مورد انتظار را توصیف کن: نقشه فارسی راست‌چین (RTL) و موبایل‌فرست با پین وسط، دکمه GPS، جستجو و دکمه تایید موقعیت. اگر چیزی از پروژه من لازم داری (نسخه React/Next.js، نسخه پکیج‌ها) اول بپرس.", ae = "پروژه React/Next.js من از قبل وجود دارد و می‌خواهم نقشه انتخاب موقعیت قم‌پیک (@amir83nasr/map) را به آن اضافه کنم بدون این‌که چیز دیگری خراب شود. این پکیج کاملاً متن‌باز و رایگان است و روی MapLibre GL ساخته شده و فقط نسخه React دارد. لطفاً قدم‌به‌قدم و به ترتیب راهنمایی‌ام کن: ۱) نصب — دستور نصب @amir83nasr/map و maplibre-gl نسخه ۶ (که peer dependency است و باید جدا نصب شود)، با توجه به این‌که بقیه dependencyهای پروژه نباید به‌هم بخورد؛ ۲) ایمپورت css — اضافه کردن @amir83nasr/map/styles.css (شامل CSS مپ‌لایبر؛ فقط یک import CSS) طوری که با استایل‌های فعلی پروژه تداخل نکند (همه کلاس‌ها و متغیرهای قم‌پیک با qp- شروع می‌شوند)؛ ۳) کانتینر — رندر LocationPickerView با ارتفاع مشخص (مثلاً 480px، چون بدون ارتفاع نقشه خالی دیده می‌شود) در جای مناسب صفحه فعلی؛ ۴) اتصال — دادن center و zoom، استفاده یا جایگزینی پیشنهادهای پیش‌فرض search، نمایش markers، و گرفتن مختصات و آدرس تاییدشده با onConfirm؛۵) پاک‌سازی — کامپوننت LocationPickerView خودش destroy را در cleanup صدا می‌زند. کد کامل و قابل اجرا بده شامل همه importها، بگو هر بخش چه می‌کند، و در پایان خروجی مورد انتظار را توصیف کن: نقشه فارسی راست‌چین (RTL) و موبایل‌فرست با پین وسط، دکمه GPS، جستجو و دکمه تایید موقعیت. اگر چیزی از پروژه من لازم داری (نسخه React/Next.js، نسخه پکیج‌ها، ساختار فایل‌ها) اول بپرس.", Xe = {
1259
+ zero: F,
1249
1260
  existing: ae
1250
1261
  };
1251
- function w(s) {
1262
+ function w(a) {
1252
1263
  const e = document.createElement("template");
1253
- return e.innerHTML = s.trim(), e.content.firstElementChild;
1264
+ return e.innerHTML = a.trim(), e.content.firstElementChild;
1254
1265
  }
1255
1266
  class Ke {
1256
1267
  constructor(e) {
@@ -1286,8 +1297,8 @@ class Ke {
1286
1297
  var o, r;
1287
1298
  const t = typeof e.container == "string" ? document.querySelector(e.container) : e.container;
1288
1299
  if (!t) throw new Error("qompick: container not found");
1289
- this.opts = be(e);
1290
- for (const [i, a] of [
1300
+ this.opts = fe(e);
1301
+ for (const [i, s] of [
1291
1302
  ["onLocationChange", "locationChange"],
1292
1303
  ["onAddressResolved", "addressResolved"],
1293
1304
  ["onSearchResults", "searchResults"],
@@ -1297,7 +1308,7 @@ class Ke {
1297
1308
  ["onError", "error"]
1298
1309
  ]) {
1299
1310
  const n = e[i];
1300
- typeof n == "function" && this.emitter.on(a, n);
1311
+ typeof n == "function" && this.emitter.on(s, n);
1301
1312
  }
1302
1313
  this.build(t), this.initMap(), this.opts.markers.length && this.addVenues(this.opts.markers), this.setLocation(
1303
1314
  ((o = this.opts.map.center) == null ? void 0 : o.lat) ?? z.lat,
@@ -1377,7 +1388,7 @@ class Ke {
1377
1388
  return this.opts.i18n.labels[e];
1378
1389
  }
1379
1390
  build(e) {
1380
- const t = this.opts, o = fe(), r = (t.search.placeholder ?? this.t("searchPlaceholder")).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1391
+ const t = this.opts, o = ye(), r = (t.search.placeholder ?? this.t("searchPlaceholder")).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1381
1392
  this.root = w(`<div class="qp qp-app" dir="${o}"></div>`);
1382
1393
  const i = '<div class="qp-pin" aria-hidden="true"><div class="qp-pin-body"><div class="qp-pin-head"><div class="qp-pin-hole"></div></div><div class="qp-pin-stem"></div><div class="qp-pin-foot"></div></div><div class="qp-pin-shadow"></div></div>';
1383
1394
  this.root.innerHTML = `
@@ -1405,8 +1416,8 @@ class Ke {
1405
1416
  <div class="qp-toast" role="status"></div>`, e.appendChild(this.root), this.labelEl = this.root.querySelector(".qp-search-label") ?? w("<span></span>"), this.toastEl = this.root.querySelector(".qp-toast"), this.overlay = this.root.querySelector(".qp-overlay") ?? w("<div></div>"), this.wire(), requestAnimationFrame(() => this.root.classList.add("is-ready"));
1406
1417
  }
1407
1418
  wire() {
1408
- var o, r, i, a, n, l, g, m, p, h, L;
1409
- (o = this.root.querySelector(".qp-gps")) == null || o.addEventListener("click", () => this.locate()), (r = this.root.querySelector(".qp-search-trigger")) == null || r.addEventListener("click", () => this.openSearch()), (i = this.root.querySelector(".qp-ov-close")) == null || i.addEventListener("click", () => this.closeSearch()), (a = this.root.querySelector(".qp-cta")) == null || a.addEventListener("click", () => this.openConfirm()), (n = this.root.querySelector(".qp-final")) == null || n.addEventListener("click", () => this.finishConfirm()), (l = this.root.querySelector(".qp-edit")) == null || l.addEventListener("click", () => this.closeModal("qp-confirm")), (g = this.root.querySelector(".qp-geo-retry")) == null || g.addEventListener("click", () => {
1419
+ var o, r, i, s, n, l, g, m, p, h, L;
1420
+ (o = this.root.querySelector(".qp-gps")) == null || o.addEventListener("click", () => this.locate()), (r = this.root.querySelector(".qp-search-trigger")) == null || r.addEventListener("click", () => this.openSearch()), (i = this.root.querySelector(".qp-ov-close")) == null || i.addEventListener("click", () => this.closeSearch()), (s = this.root.querySelector(".qp-cta")) == null || s.addEventListener("click", () => this.openConfirm()), (n = this.root.querySelector(".qp-final")) == null || n.addEventListener("click", () => this.finishConfirm()), (l = this.root.querySelector(".qp-edit")) == null || l.addEventListener("click", () => this.closeModal("qp-confirm")), (g = this.root.querySelector(".qp-geo-retry")) == null || g.addEventListener("click", () => {
1410
1421
  this.closeModal("qp-geo"), this.locate();
1411
1422
  }), this.root.querySelectorAll(".qp-modal").forEach(
1412
1423
  (c) => c.addEventListener("click", (u) => {
@@ -1423,6 +1434,10 @@ class Ke {
1423
1434
  (c) => c.addEventListener("click", (u) => {
1424
1435
  this.copyPrompt(u.currentTarget);
1425
1436
  })
1437
+ ), this.root.querySelectorAll(".qp-code-copy").forEach(
1438
+ (c) => c.addEventListener("click", (u) => {
1439
+ this.copyCode(u.currentTarget);
1440
+ })
1426
1441
  );
1427
1442
  const e = this.root.querySelector(".qp-overlay .qp-field input");
1428
1443
  if (e) {
@@ -1453,14 +1468,14 @@ class Ke {
1453
1468
  }
1454
1469
  // ── MAP ──
1455
1470
  initMap() {
1456
- const e = this.opts, t = this.root.querySelector(".qp-map"), o = typeof e.map.style == "object" && e.map.style !== null ? { ...e.map.style } : { ...je }, r = e.map.glyphs ? { ...o, glyphs: e.map.glyphs } : o;
1471
+ const e = this.opts, t = this.root.querySelector(".qp-map"), o = typeof e.map.style == "object" && e.map.style !== null ? { ...e.map.style } : { ...De }, r = e.map.glyphs ? { ...o, glyphs: e.map.glyphs } : o;
1457
1472
  if (typeof r.glyphs == "string" && !/^(https?:|data:|blob:|\/)/.test(r.glyphs)) {
1458
1473
  const p = document.baseURI, h = p.endsWith("/") ? p : p.slice(0, p.lastIndexOf("/") + 1);
1459
1474
  r.glyphs = h + r.glyphs;
1460
1475
  }
1461
- const i = e.map.bounds, a = Ye(() => this.showWorkerError());
1476
+ const i = e.map.bounds, s = Qe(() => this.showWorkerError());
1462
1477
  try {
1463
- this.map = new de({
1478
+ this.map = new ce({
1464
1479
  container: t,
1465
1480
  style: r,
1466
1481
  center: [e.map.center.lng, e.map.center.lat],
@@ -1476,16 +1491,20 @@ class Ke {
1476
1491
  dragRotate: !1,
1477
1492
  touchPitch: !1,
1478
1493
  clickTolerance: 5,
1494
+ // Fullscreen dialogs on hiDPI (DPR 2-3) exceed MapLibre's 4096
1495
+ // default: canvas CSS size × DPR > 4096px warns and drops pixel
1496
+ // ratio. 8192 fits typical MAX_TEXTURE_SIZE, keeps full res.
1497
+ maxCanvasSize: [8192, 8192],
1479
1498
  maxBounds: [
1480
1499
  [i[0][1], i[0][0]],
1481
1500
  [i[1][1], i[1][0]]
1482
1501
  ]
1483
1502
  });
1484
1503
  } finally {
1485
- a();
1504
+ s();
1486
1505
  }
1487
1506
  W && this.showWorkerError(), this.map.on("error", (p) => {
1488
- if (Xe(p.error)) {
1507
+ if (Ye(p.error)) {
1489
1508
  this.showWorkerError();
1490
1509
  return;
1491
1510
  }
@@ -1514,7 +1533,7 @@ class Ke {
1514
1533
  if (!this.destroyed) {
1515
1534
  if (this.opts.behavior.snapToRoad && !u)
1516
1535
  try {
1517
- const E = He(this.map, h.lat, h.lng);
1536
+ const E = Ve(this.map, h.lat, h.lng);
1518
1537
  if (E) {
1519
1538
  l = E, this.map.easeTo({ center: [E.lng, E.lat], duration: 400 }), this.setLocation(E.lat, E.lng);
1520
1539
  return;
@@ -1527,17 +1546,17 @@ class Ke {
1527
1546
  });
1528
1547
  }
1529
1548
  showWorkerError() {
1530
- var a;
1549
+ var s;
1531
1550
  if (this.destroyed || this.workerFailed) return;
1532
1551
  this.workerFailed = !0;
1533
- const e = new Error(Qe);
1552
+ const e = new Error(He);
1534
1553
  console.warn(e.message), this.fail(e);
1535
1554
  const t = w('<div class="qp-err qp-map-err" role="alert"></div>'), o = w("<strong></strong>");
1536
1555
  o.textContent = "ورکر MapLibre بارگذاری نشد؛ نقشه قابل استفاده نیست.";
1537
1556
  const r = w("<span></span>");
1538
1557
  r.textContent = "راه‌حل: ";
1539
1558
  const i = w('<code dir="ltr"></code>');
1540
- i.textContent = Ue, r.appendChild(i), t.append(o, r), (a = this.root.querySelector(".qp-map-wrap")) == null || a.appendChild(t);
1559
+ i.textContent = Ge, r.appendChild(i), t.append(o, r), (s = this.root.querySelector(".qp-map-wrap")) == null || s.appendChild(t);
1541
1560
  }
1542
1561
  showMyPos(e, t) {
1543
1562
  if (this.myMarker) {
@@ -1545,7 +1564,7 @@ class Ke {
1545
1564
  return;
1546
1565
  }
1547
1566
  const o = w('<div class="qp-my-wrap"><div class="qp-my-dot"></div></div>');
1548
- this.myMarker = new V({ element: o }).setLngLat([t, e]).addTo(this.map);
1567
+ this.myMarker = new U({ element: o }).setLngLat([t, e]).addTo(this.map);
1549
1568
  }
1550
1569
  addVenues(e) {
1551
1570
  for (const t of e) {
@@ -1557,16 +1576,16 @@ class Ke {
1557
1576
  '<div class="qp-venue-pop"><span class="qp-venue-dot"></span><span></span></div>'
1558
1577
  );
1559
1578
  r.lastElementChild.textContent = t.name;
1560
- const i = new pe({
1579
+ const i = new de({
1561
1580
  offset: 26,
1562
1581
  anchor: "top",
1563
1582
  closeButton: !1,
1564
1583
  className: "qp-venue-pop-wrap"
1565
- }).setDOMContent(r), a = new V({ element: o }).setLngLat([t.lng, t.lat]).setPopup(i).addTo(this.map);
1584
+ }).setDOMContent(r), s = new U({ element: o }).setLngLat([t.lng, t.lat]).setPopup(i).addTo(this.map);
1566
1585
  let n = 0;
1567
1586
  i.on("open", () => {
1568
1587
  window.clearTimeout(n), n = window.setTimeout(() => i.remove(), 4e3), this.venueT.push(n);
1569
- }), i.on("close", () => window.clearTimeout(n)), this.venueMarkers.push(a);
1588
+ }), i.on("close", () => window.clearTimeout(n)), this.venueMarkers.push(s);
1570
1589
  }
1571
1590
  }
1572
1591
  // ── ADDRESS ──
@@ -1597,58 +1616,71 @@ class Ke {
1597
1616
  }
1598
1617
  // ── DEVELOPERS DOCS ──
1599
1618
  devDocsHtml() {
1619
+ const e = this.t("copy"), t = (o) => `<div class="qp-code" dir="ltr"><pre>${o}</pre><button class="qp-ghost qp-code-copy" type="button">${e}</button></div>`;
1600
1620
  return `<div class="qp-docs" hidden><div class="qp-docs-card">
1601
1621
  <div class="qp-modal-head"><h2>${this.t("developers")}</h2><button class="qp-x" type="button" aria-label="${this.t("close")}">${v.x}</button></div>
1602
- <section><h3>معرفی</h3><p>قم‌پیک (@amir83nasr/map) نقشه انتخاب موقعیت روی MapLibre برای React است؛ کاملاً متن‌باز و رایگان. فقط نسخه React دارد (کلاس vanilla در exports نیست؛ engine داخلی است). نقشه پیش‌فرض همیشه VECTOR است (نه raster)، با جستجوی آدرس، پین وسط، مارکر مکان‌ها، رابط فارسی راست‌چین (RTL) و طراحی موبایل‌فرست.</p></section>
1603
- <section><h3>نصب</h3><pre dir="ltr">pnpm add @amir83nasr/map maplibre-gl</pre>
1604
- <p class="qp-note">نکته: maplibre-gl نسخه ۶ و react/react-dom peer dependency هستند و باید جدا نصب شوند.</p>
1605
- <pre dir="ltr">npm i @amir83nasr/map maplibre-gl
1606
- yarn add @amir83nasr/map maplibre-gl</pre></section>
1607
- <section><h3>شروع سریع (React)</h3><pre dir="ltr">import '@amir83nasr/map/styles.css';
1608
- import { LocationPickerView } from '@amir83nasr/map';
1609
-
1610
- &lt;LocationPickerView
1611
- onConfirm={(loc) =&gt; console.log(loc)}
1612
- /&gt;;</pre>
1613
- <p class="qp-note">نکته: CSS مپ‌لایبر داخل <code dir="ltr">@amir83nasr/map/styles.css</code> بسته‌بندی شده — فقط همین یک import CSS کافی است.</p>
1614
- <p class="qp-note">نکته: فونت فارسی IRANYekanX داخل خود پکیج است (با همین import CSS لود می‌شود) و لیبل‌های فارسی نقشه هم از PBFهای داخل پکیج می‌آیند — بدون تنظیم اضافه.</p>
1615
- <p class="qp-note">نکته: کامپوننت خودش init و destroy را در lifecycle (useEffect) انجام می‌دهد — بدون init/destroy دستی. تنظیمات engine فقط موقع mount اعمال می‌شوند؛ برای تنظیمات جدید با <code dir="ltr">key</code> ریمانت کنید (فقط callbackها زنده می‌مانند).</p>
1616
- <p class="qp-note">ورکر MapLibre را قبل از mount تنظیم کنید: در Vite فایل <code dir="ltr">maplibre-gl-worker.mjs?worker&amp;url</code> را import و به <code dir="ltr">setupQomPickWorker()</code> بدهید؛ در Next.js/webpack هر دو فایل worker و shared را کپی کنید. خطای ورکر در <code dir="ltr">onError</code>، کنسول و <code dir="ltr">.qp-err</code> نمایش داده می‌شود.</p>
1622
+ <p class="qp-note">قم‌پیک (@amir83nasr/map) — نقشه انتخاب موقعیت روی MapLibre، فقط React، کاملاً متن‌باز و رایگان. نقشه همیشه VECTOR است (نه raster)؛ فارسی راست‌چین (RTL) و موبایل‌فرست.</p>
1623
+ <nav class="qp-docs-nav">
1624
+ <a href="#qp-d-install">نصب</a><a href="#qp-d-quick">شروع سریع</a><a href="#qp-d-worker">ورکر</a><a href="#qp-d-props">تنظیمات</a><a href="#qp-d-cb">کال‌بک‌ها</a><a href="#qp-d-style">ظاهر</a><a href="#qp-d-faq">خطاها</a><a href="#qp-d-prompts">پرامپت‌ها</a>
1625
+ </nav>
1626
+ <section id="qp-d-install"><h3>۱) نصب</h3>${t("pnpm add @amir83nasr/map maplibre-gl")}
1627
+ <p class="qp-note">نکته: maplibre-gl نسخه ۶ و react/react-dom‏ peer dependency هستند و باید جدا نصب شوند.</p></section>
1628
+ <section id="qp-d-quick"><h3>۲) شروع سریع — ۲ خط</h3>${t(`import '@amir83nasr/map/styles.css';
1629
+ import { LocationPickerView } from '@amir83nasr/map';`)}${t(`&lt;LocationPickerView
1630
+ style={{ height: 480 }}
1631
+ onConfirm={(loc) =&gt; console.log(loc.lat, loc.lng, loc.address)}
1632
+ /&gt;;`)}
1633
+ <p class="qp-note">نکته: همین یک import کافی است (CSS مپ‌لایبر + فونت IRANYekanX داخلش است). بدون <code dir="ltr">height</code> نقشه خالی دیده می‌شود (پیش‌فرض <code dir="ltr">480px</code>). کامپوننت خودش init/destroy می‌کند — دستی صدا نزنید.</p>
1617
1634
  <p class="qp-note">نکته Next.js App Router: کامپوننت client است؛ با <code dir="ltr">dynamic(..., { ssr: false })</code> لود کنید.</p></section>
1618
- <section><h3>تنظیمات مهم</h3><ul class="qp-list">
1619
- <li><code dir="ltr">map</code> — مرکز، زوم و محدوده نقشه (<code dir="ltr">center / zoom / minZoom / maxZoom / bounds</code>) و استایل سفارشی برداری (<code dir="ltr">style</code>).</li>
1620
- <li><code dir="ltr">search</code> — جستجو با پیشنهادهای پیش‌فرض ۴۱ محله قم: <code dir="ltr">enabled / placeholder / suggestions / minLength / debounceMs / limit</code>. آرایه سفارشی جایگزین پیش‌فرض می‌شود؛ <code dir="ltr">suggestions: []</code> آن را خالی می‌کند. <code dir="ltr">limit</code> پیشنهادهای محلی را هم محدود می‌کند.</li>
1621
- <li><code dir="ltr">markers</code> — مارکر مکان‌ها با <code dir="ltr">name / lat / lng</code>.</li>
1622
- <li><code dir="ltr">controls</code> — دکمه‌ها: <code dir="ltr">gps / confirmButton / searchTrigger / developers</code>.</li>
1623
- <li><code dir="ltr">behavior</code> — رفتار: <code dir="ltr">snapToRoad / resolveOnMove / resolveDelayMs / settleDelayMs / snapDelayMs / pickZoom / locateZoom</code>.</li>
1624
- <li><code dir="ltr">i18n.labels</code> — متن‌ها؛ پیش‌فرض فارسی راست‌چین.</li>
1625
- <li>callbackها: <code dir="ltr">onLocationChange / onAddressResolved / onSearchResults / onPick / onConfirm / onLocate / onError</code>.</li></ul>
1626
- <pre dir="ltr">&lt;LocationPickerView
1635
+ <section id="qp-d-worker"><h3>۳) ورکر MapLibre — قبل از mount (اجباری)</h3>
1636
+ <p class="qp-note">پکیج نمی‌تواند ورکر را برای شما باندل کند. علامت خرابی: نقشه خاکستری + باکس <code dir="ltr">.qp-map-err</code> + یک <code dir="ltr">console.warn</code> + کال <code dir="ltr">onError</code>.</p>
1637
+ <p class="qp-note">Vite:</p>${t(`import { setupQomPickWorker } from '@amir83nasr/map';
1638
+ import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&amp;url';
1639
+ setupQomPickWorker(workerUrl);`)}
1640
+ <p class="qp-note">Next.js/webpack: هر دو فایل <code dir="ltr">maplibre-gl-worker.mjs</code> و <code dir="ltr">maplibre-gl-shared.mjs</code> را در خروجی public کپی کنید و URL عمومی ورکر را به <code dir="ltr">setupQomPickWorker()</code> بدهید (ال‌یاس <code dir="ltr">setupMapWorker</code> یکسان است).</p></section>
1641
+ <section id="qp-d-props"><h3>۴) تنظیمات مهم</h3><ul class="qp-list">
1642
+ <li><code dir="ltr">map</code> — مرکز/زوم/محدوده (<code dir="ltr">center / zoom / minZoom / maxZoom / bounds</code>)؛ پیش‌فرض قم <code dir="ltr">34.6416,50.8764</code> زوم ۱۴. استایل سفارشی فقط برداری (<code dir="ltr">style</code>)؛ <code dir="ltr">glyphs</code> برای self-host فونت نقشه.</li>
1643
+ <li><code dir="ltr">search</code> — پیش‌فرض ۵۲ محله قم (همه نمایش، بدون سقف): <code dir="ltr">enabled / placeholder / suggestions / minLength(3) / debounceMs(350) / limit(5)</code>. آرایه سفارشی جایگزین می‌شود؛ <code dir="ltr">[]</code> غیرفعال می‌کند. <code dir="ltr">limit</code> فقط نتایج ریموت (Nominatim) است.</li>
1644
+ <li><code dir="ltr">markers</code> — پین‌ها با <code dir="ltr">name / lat / lng</code>؛ کلیک → پرواز تا <code dir="ltr">pickZoom</code> + کال <code dir="ltr">onPick</code>.</li>
1645
+ <li><code dir="ltr">controls</code> — <code dir="ltr">gps / confirmButton / searchTrigger / developers</code>.</li>
1646
+ <li><code dir="ltr">behavior</code> — <code dir="ltr">snapToRoad / resolveOnMove / resolveDelayMs(400) / settleDelayMs(250) / snapDelayMs(900) / pickZoom(15) / locateZoom(18)</code>. اسنپ فقط حرکت دستی، زوم ≥ ۱۵؛ پینچ‌زوم و حرکات کد هرگز اسنپ نمی‌شوند.</li>
1647
+ <li><code dir="ltr">i18n.labels</code> — بازنویسی متن‌ها؛ چیدمان همیشه RTL است.</li></ul>
1648
+ ${t(`&lt;LocationPickerView
1627
1649
  map={{ center: { lat: 34.64, lng: 50.87 }, zoom: 15 }}
1628
1650
  search={{ minLength: 3, limit: 5 }}
1651
+ markers={[{ name: 'فروشگاه', lat: 34.63, lng: 50.87 }]}
1629
1652
  controls={{ gps: true, developers: true }}
1630
1653
  onConfirm={(loc) =&gt; console.log(loc)}
1631
- /&gt;;</pre></section>
1632
- <section><h3>ساختار پروژه</h3><ul class="qp-list">
1633
- <li><code dir="ltr">package/src/index.tsx</code> — API عمومی: کامپوننت <code dir="ltr">LocationPickerView</code>، هلپر <code dir="ltr">setupQomPickWorker</code> + تایپ‌ها.</li>
1634
- <li><code dir="ltr">package/src/picker.ts</code> — engine داخلی (در exports عمومی نیست).</li>
1635
- <li><code dir="ltr">package/src/*.ts</code> — helperها: geocode، snap، format، i18n، map-style، …</li>
1636
- <li><code dir="ltr">package/src/styles.css</code> — استایل‌ها؛ خروجی build <code dir="ltr">dist/qompick-react.css</code> است (ایمپورت: <code dir="ltr">@amir83nasr/map/styles.css</code>).</li>
1637
- <li><code dir="ltr">package/fonts/</code> — فونت IRANYekanX (woff2) و PBFهای glyph نقشه؛ داخل tarball منتشر می‌شود.</li>
1638
- <li><code dir="ltr">demo/</code> — دموی Vite؛ <code dir="ltr">docs/</code> — ARCHITECTURE و CHANGELOG.</li></ul></section>
1639
- <section><h3>سفارشی‌سازی ظاهر</h3><p>همه کلاس‌ها و متغیرها با <code dir="ltr">qp-</code> شروع می‌شوند و با استایل پروژه تداخل نمی‌کنند. prop جداگانه theme نیست؛ رنگ و فونت را با متغیرهای CSS عوض کنید:</p>
1640
- <pre dir="ltr">.qp { --qp-brand: #16a34a; --qp-radius: 16px; }</pre></section>
1641
- <section><h3>پرامپت شروع از صفر</h3><div class="qp-prompt">${D}</div>
1654
+ /&gt;;`)}
1655
+ <p class="qp-note">تنظیمات engine فقط موقع mount اعمال می‌شوند؛ برای اعمال جدید با <code dir="ltr">key</code> ریمانت کنید — فقط کال‌بک‌ها زنده می‌مانند: <code dir="ltr">&lt;LocationPickerView key={cityId} ... /&gt;</code>.</p></section>
1656
+ <section id="qp-d-cb"><h3>۵) کال‌بک‌ها — کدام برای چه</h3><ul class="qp-list">
1657
+ <li><code dir="ltr">onConfirm</code> — دکمه تایید در مودال → <b>ذخیره نتیجه</b> (فرم/سرور).</li>
1658
+ <li><code dir="ltr">onPick</code> — کلیک پین/پیشنهاد → واکنش، نه ذخیره.</li>
1659
+ <li><code dir="ltr">onLocationChange</code> — هر حرکت مرکز (پرتکرار).</li>
1660
+ <li><code dir="ltr">onAddressResolved</code> — پایان ژئوکد معکوس.</li>
1661
+ <li><code dir="ltr">onSearchResults</code> — پایان جستجوی ریموت.</li>
1662
+ <li><code dir="ltr">onLocate</code> — موفقیت GPS. <code dir="ltr">onError</code> — هر خطا از جمله ورکر.</li></ul></section>
1663
+ <section id="qp-d-style"><h3>۶) سفارشی‌سازی ظاهر</h3><p class="qp-note">prop تم نیست؛ همه کلاس‌ها/متغیرها با <code dir="ltr">qp-</code> شروع می‌شوند و با پروژه تداخل نمی‌کنند:</p>
1664
+ ${t(".qp { --qp-brand: #16a34a; --qp-ink: #111; --qp-radius: 16px; }")}
1665
+ <p class="qp-note">متغیرها: <code dir="ltr">--qp-brand --qp-brand-dark --qp-bg --qp-card --qp-ink --qp-muted --qp-line --qp-radius --qp-shadow --qp-font</code>.</p></section>
1666
+ <section><h3>۷) ساختار پروژه</h3><ul class="qp-list">
1667
+ <li><code dir="ltr">package/src/index.tsx</code> — API عمومی (re-export از <code dir="ltr">react/ + core/</code>).</li>
1668
+ <li><code dir="ltr">package/src/react/</code> — کامپوننت <code dir="ltr">LocationPickerView</code> + هلپر <code dir="ltr">setupQomPickWorker</code>.</li>
1669
+ <li><code dir="ltr">package/src/engine/</code> — engine داخلی (<code dir="ltr">picker</code>، در exports عمومی نیست).</li>
1670
+ <li><code dir="ltr">package/src/core/ + style/</code> — تایپ‌ها و helperها + استایل و basemap.</li>
1671
+ <li><code dir="ltr">dist/styles.css</code> — ایمپورت: <code dir="ltr">@amir83nasr/map/styles.css</code>.</li>
1672
+ <li><code dir="ltr">package/fonts/</code> — فونت IRANYekanX‏ (woff2) و PBFهای glyph نقشه؛ داخل tarball منتشر می‌شود.</li></ul></section>
1673
+ <section id="qp-d-faq"><h3>۸) سوالات پرتکرار</h3><ul class="qp-list">
1674
+ <li>نقشه خالی/خاکستری بدون خطا؟ ارتفاع بدهید (<code dir="ltr">style={{ height: 480 }}</code>).</li>
1675
+ <li>باکس قرمز ورکر؟ بخش ۳ (ورکر) — نه چیز دیگر.</li>
1676
+ <li>لیبل فارسی نقشه نیست؟ CDN glyph مسدود است؛ <code dir="ltr">map.glyphs</code> را به کپی محلی <code dir="ltr">fonts/</code> بدهید.</li>
1677
+ <li>پراپ جدید اثر ندارد؟ mount-only است؛ <code dir="ltr">key</code> بدهید.</li>
1678
+ <li>کرش Next.js‏ (<code dir="ltr">window/document</code>)؟ <code dir="ltr">'use client' + ssr: false</code>.</li>
1679
+ <li>کدام نسخه maplibre؟ ۶ (peer). رایگان؟ بله، متن‌باز.</li></ul></section>
1680
+ <section id="qp-d-prompts"><h3>پرامپت شروع از صفر</h3><div class="qp-prompt">${F}</div>
1642
1681
  <div class="qp-modal-row"><button class="qp-ghost qp-copy" type="button" data-prompt="zero">${this.t("copy")}</button></div></section>
1643
1682
  <section><h3>پرامپت افزودن به پروژه موجود</h3><div class="qp-prompt">${ae}</div>
1644
1683
  <div class="qp-modal-row"><button class="qp-ghost qp-copy" type="button" data-prompt="existing">${this.t("copy")}</button></div></section>
1645
- <section><h3>سوالات پرتکرار</h3><ul class="qp-list">
1646
- <li>نقشه خالی است؟ به کامپوننت ارتفاع بدهید (مثلاً <code dir="ltr">style={{ height: 480 }}</code>)؛ بدون ارتفاع نقشه دیده نمی‌شود.</li>
1647
- <li>لیبل‌های فارسی نقشه نمایش داده نمی‌شود؟ glyphهای پیش‌فرض از CDN پکیج می‌آیند؛ برای self-host کردن، <code dir="ltr">map.glyphs</code> را به مسیر فونت‌های پکیج (مثلاً <code dir="ltr">/fonts/{fontstack}/{range}.pbf</code> بعد از کپی <code dir="ltr">node_modules/@amir83nasr/map/fonts</code>) تنظیم کنید.</li>
1648
- <li>پیام خطای ورکر روی نقشه می‌بینید؟ در Vite، <code dir="ltr">maplibre-gl-worker.mjs?worker&amp;url</code> را import و قبل از mount به <code dir="ltr">setupQomPickWorker()</code> بدهید؛ در Next.js/webpack هر دو فایل <code dir="ltr">maplibre-gl-worker.mjs</code> و <code dir="ltr">maplibre-gl-shared.mjs</code> را کپی کنید. پکیج همین خطا را یک‌بار به <code dir="ltr">onError</code> و کنسول هم می‌فرستد.</li>
1649
- <li>کدام نسخه maplibre؟ نسخه ۶؛ چون peer dependency است باید جدا نصب شود.</li>
1650
- <li>در Next.js App Router؟ کامپوننت client است؛ با <code dir="ltr">dynamic(..., { ssr: false })</code> لود کنید.</li>
1651
- <li>رایگان است؟ بله، قم‌پیک کاملاً متن‌باز و رایگان است.</li></ul></section>
1652
1684
  <div class="qp-modal-row"><button class="qp-cta qp-back" type="button">${this.t("backToMap")}</button></div>
1653
1685
  </div></div>`;
1654
1686
  }
@@ -1660,21 +1692,29 @@ import { LocationPickerView } from '@amir83nasr/map';
1660
1692
  const e = this.root.querySelector(".qp-docs");
1661
1693
  e && (e.hidden = !0);
1662
1694
  }
1663
- copyPrompt(e) {
1695
+ copyDone(e) {
1696
+ const t = e.textContent ?? "";
1697
+ e.textContent = this.t("copied"), window.setTimeout(() => {
1698
+ e.textContent = t;
1699
+ }, 1500);
1700
+ }
1701
+ copyText(e, t) {
1664
1702
  var r;
1665
- const t = () => {
1666
- const i = e.textContent ?? "";
1667
- e.textContent = this.t("copied"), window.setTimeout(() => {
1668
- e.textContent = i;
1669
- }, 1500);
1670
- };
1703
+ const o = () => this.copyDone(t);
1671
1704
  if ((r = navigator.clipboard) != null && r.writeText) {
1672
- const i = e.dataset.prompt ?? "zero", a = ie[i] ?? D;
1673
- navigator.clipboard.writeText(a).then(t, () => this.fallbackCopy(a, t));
1705
+ navigator.clipboard.writeText(e).then(o, () => this.fallbackCopy(e, o));
1674
1706
  return;
1675
1707
  }
1676
- const o = e.dataset.prompt ?? "zero";
1677
- this.fallbackCopy(ie[o] ?? D, t);
1708
+ this.fallbackCopy(e, o);
1709
+ }
1710
+ copyPrompt(e) {
1711
+ const t = e.dataset.prompt ?? "zero";
1712
+ this.copyText(Xe[t] ?? F, e);
1713
+ }
1714
+ copyCode(e) {
1715
+ var o;
1716
+ const t = (o = e.closest(".qp-code")) == null ? void 0 : o.querySelector("pre");
1717
+ t && this.copyText(t.textContent ?? "", e);
1678
1718
  }
1679
1719
  fallbackCopy(e, t) {
1680
1720
  const o = document.createElement("textarea");
@@ -1720,10 +1760,10 @@ import { LocationPickerView } from '@amir83nasr/map';
1720
1760
  return r.querySelector("b").textContent = S(String(e).split(",")[0]), r.querySelector("small").textContent = S(te(e)), r.addEventListener("click", () => this.pickResult(t, o)), r;
1721
1761
  }
1722
1762
  filteredSuggestions(e) {
1723
- const t = M(e).trim(), o = this.opts.search.limit ?? 5;
1763
+ const t = M(e).trim();
1724
1764
  return this.suggestions().filter(
1725
- (r) => !t || M(r.name).includes(t) || M(r.addr).includes(t)
1726
- ).sort((r, i) => r.name.localeCompare(i.name, "fa")).slice(0, Math.max(1, o));
1765
+ (o) => !t || M(o.name).includes(t) || M(o.addr).includes(t)
1766
+ ).sort((o, r) => o.name.localeCompare(r.name, "fa"));
1727
1767
  }
1728
1768
  suggestions() {
1729
1769
  return this.opts.search.suggestions ?? [];
@@ -1757,12 +1797,12 @@ import { LocationPickerView } from '@amir83nasr/map';
1757
1797
  this.searchSeq++;
1758
1798
  const r = this.searchSeq;
1759
1799
  window.clearTimeout(this.searchT);
1760
- const i = e.trim(), a = this.opts.search.minLength ?? re;
1800
+ const i = e.trim(), s = this.opts.search.minLength ?? re;
1761
1801
  if (i.length < 1) {
1762
1802
  t("");
1763
1803
  return;
1764
1804
  }
1765
- if (i.length < a) {
1805
+ if (i.length < s) {
1766
1806
  t(i);
1767
1807
  return;
1768
1808
  }
@@ -1782,7 +1822,7 @@ import { LocationPickerView } from '@amir83nasr/map';
1782
1822
  }
1783
1823
  async runRemoteSearch(e, t, o) {
1784
1824
  var g;
1785
- const r = e.trim(), i = this.root.querySelector(t), a = this.root.querySelector(o);
1825
+ const r = e.trim(), i = this.root.querySelector(t), s = this.root.querySelector(o);
1786
1826
  if (!i) return;
1787
1827
  if (!r) {
1788
1828
  t.includes("desk") ? this.renderDeskSuggest("") : this.renderSuggest("");
@@ -1794,9 +1834,9 @@ import { LocationPickerView } from '@amir83nasr/map';
1794
1834
  return;
1795
1835
  }
1796
1836
  const l = ++this.searchSeq;
1797
- (g = this.searchAbort) == null || g.abort(), this.searchAbort = new AbortController(), a && (a.hidden = !0), i.innerHTML = `<div class="qp-err">${this.t("searching")}</div>`;
1837
+ (g = this.searchAbort) == null || g.abort(), this.searchAbort = new AbortController(), s && (s.hidden = !0), i.innerHTML = `<div class="qp-err">${this.t("searching")}</div>`;
1798
1838
  try {
1799
- const m = await Ze(r, this.opts.search.limit ?? 5, {
1839
+ const m = await Fe(r, this.opts.search.limit ?? 5, {
1800
1840
  signal: this.searchAbort.signal
1801
1841
  });
1802
1842
  if (l !== this.searchSeq) return;
@@ -1844,11 +1884,11 @@ import { LocationPickerView } from '@amir83nasr/map';
1844
1884
  this.emitter.emit("error", t);
1845
1885
  }
1846
1886
  }
1847
- function Je(s) {
1848
- he(s);
1887
+ function Je(a) {
1888
+ pe(a);
1849
1889
  }
1850
1890
  const it = Je;
1851
- function st({ className: s, style: e, ...t }) {
1891
+ function at({ className: a, style: e, ...t }) {
1852
1892
  const o = Z(null), r = Z(t);
1853
1893
  return B(() => {
1854
1894
  r.current = t;
@@ -1857,41 +1897,41 @@ function st({ className: s, style: e, ...t }) {
1857
1897
  const i = new Ke({
1858
1898
  ...r.current,
1859
1899
  container: o.current,
1860
- onLocationChange: (a) => {
1900
+ onLocationChange: (s) => {
1861
1901
  var n, l;
1862
- return (l = (n = r.current).onLocationChange) == null ? void 0 : l.call(n, a);
1902
+ return (l = (n = r.current).onLocationChange) == null ? void 0 : l.call(n, s);
1863
1903
  },
1864
- onAddressResolved: (a) => {
1904
+ onAddressResolved: (s) => {
1865
1905
  var n, l;
1866
- return (l = (n = r.current).onAddressResolved) == null ? void 0 : l.call(n, a);
1906
+ return (l = (n = r.current).onAddressResolved) == null ? void 0 : l.call(n, s);
1867
1907
  },
1868
- onSearchResults: (a) => {
1908
+ onSearchResults: (s) => {
1869
1909
  var n, l;
1870
- return (l = (n = r.current).onSearchResults) == null ? void 0 : l.call(n, a);
1910
+ return (l = (n = r.current).onSearchResults) == null ? void 0 : l.call(n, s);
1871
1911
  },
1872
- onPick: (a) => {
1912
+ onPick: (s) => {
1873
1913
  var n, l;
1874
- return (l = (n = r.current).onPick) == null ? void 0 : l.call(n, a);
1914
+ return (l = (n = r.current).onPick) == null ? void 0 : l.call(n, s);
1875
1915
  },
1876
- onConfirm: (a) => {
1916
+ onConfirm: (s) => {
1877
1917
  var n, l;
1878
- return (l = (n = r.current).onConfirm) == null ? void 0 : l.call(n, a);
1918
+ return (l = (n = r.current).onConfirm) == null ? void 0 : l.call(n, s);
1879
1919
  },
1880
- onLocate: (a) => {
1920
+ onLocate: (s) => {
1881
1921
  var n, l;
1882
- return (l = (n = r.current).onLocate) == null ? void 0 : l.call(n, a);
1922
+ return (l = (n = r.current).onLocate) == null ? void 0 : l.call(n, s);
1883
1923
  },
1884
- onError: (a) => {
1924
+ onError: (s) => {
1885
1925
  var n, l;
1886
- return (l = (n = r.current).onError) == null ? void 0 : l.call(n, a);
1926
+ return (l = (n = r.current).onError) == null ? void 0 : l.call(n, s);
1887
1927
  }
1888
1928
  });
1889
1929
  return () => i.destroy();
1890
- }, []), /* @__PURE__ */ ce("div", { ref: o, className: s, style: { height: 480, ...e } });
1930
+ }, []), /* @__PURE__ */ le("div", { ref: o, className: a, style: { height: 480, ...e } });
1891
1931
  }
1892
1932
  export {
1893
- st as LocationPickerView,
1894
- me as QOM_SUGGESTIONS,
1933
+ at as LocationPickerView,
1934
+ ue as QOM_SUGGESTIONS,
1895
1935
  it as setupMapWorker,
1896
1936
  Je as setupQomPickWorker
1897
1937
  };