themelia-react-ui 2.0.5 → 3.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.
Files changed (968) hide show
  1. package/CHANGELOG.md +326 -0
  2. package/MIGRATION.md +858 -0
  3. package/README.md +35 -24
  4. package/dist/{accordion-B9MHG0cT.js → accordion-DNVqwEIC.js} +37 -37
  5. package/dist/accordion-DNVqwEIC.js.map +1 -0
  6. package/dist/action-menu-D5343RwT.js +286 -0
  7. package/dist/action-menu-D5343RwT.js.map +1 -0
  8. package/dist/ai-artifact-otrz9ZwS.js +1214 -0
  9. package/dist/ai-artifact-otrz9ZwS.js.map +1 -0
  10. package/dist/anchored-positioning-1U_eBFNx.js +9 -0
  11. package/dist/anchored-positioning-1U_eBFNx.js.map +1 -0
  12. package/dist/app-shell-CPN30Nb1.js +372 -0
  13. package/dist/app-shell-CPN30Nb1.js.map +1 -0
  14. package/dist/{attachment-Dg_69lPS.js → attachment-D2-fpfmv.js} +15 -15
  15. package/dist/{attachment-Dg_69lPS.js.map → attachment-D2-fpfmv.js.map} +1 -1
  16. package/dist/{auth-DTkkshS8.js → auth-g_oUTDDC.js} +236 -243
  17. package/dist/auth-g_oUTDDC.js.map +1 -0
  18. package/dist/{avatar-CeZaFmNH.js → avatar-Ca3Ihrq4.js} +4 -4
  19. package/dist/{avatar-CeZaFmNH.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
  20. package/dist/{badge-xIiV_E7f.js → badge-oGiXblW7.js} +8 -9
  21. package/dist/badge-oGiXblW7.js.map +1 -0
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +2 -2
  29. package/dist/base/cards.js +3 -3
  30. package/dist/base/carousel.js +11 -11
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +2 -2
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +4 -4
  42. package/dist/base/forms-numeric.js +2 -2
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +13 -13
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +203 -2
  48. package/dist/base/media-gallery.js.map +1 -0
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +7 -7
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +32 -22
  54. package/dist/base/qr-code.js.map +1 -1
  55. package/dist/base/repeaters.js +208 -198
  56. package/dist/base/repeaters.js.map +1 -1
  57. package/dist/base/sidebar.js +2 -2
  58. package/dist/base/signature-pad.js +14 -14
  59. package/dist/base/signature-pad.js.map +1 -1
  60. package/dist/base/skeleton.js +1 -1
  61. package/dist/base/spinner.js +8 -14
  62. package/dist/base/spinner.js.map +1 -1
  63. package/dist/base/structure.js +1 -1
  64. package/dist/base/table.js +1 -1
  65. package/dist/base/text-inputs.js +3 -3
  66. package/dist/base/toaster.js +2 -2
  67. package/dist/base/tree.js +2 -2
  68. package/dist/base/upload-queue.js +303 -2
  69. package/dist/base/upload-queue.js.map +1 -0
  70. package/dist/base/upload.js +3 -4
  71. package/dist/base/value-inputs.js +1 -1
  72. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-D6MZQNnC.js} +10 -10
  73. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-D6MZQNnC.js.map} +1 -1
  74. package/dist/blocks/admin.js +242 -228
  75. package/dist/blocks/admin.js.map +1 -1
  76. package/dist/blocks/ai.js +398 -354
  77. package/dist/blocks/ai.js.map +1 -1
  78. package/dist/blocks/analytics/charts.js +1022 -0
  79. package/dist/blocks/analytics/charts.js.map +1 -0
  80. package/dist/blocks/analytics/usage-card.js +1 -1
  81. package/dist/blocks/analytics.js +173 -1392
  82. package/dist/blocks/analytics.js.map +1 -1
  83. package/dist/blocks/collaboration.js +1 -1
  84. package/dist/blocks/commerce/receipt.js +1 -1
  85. package/dist/blocks/commerce.js +1533 -1399
  86. package/dist/blocks/commerce.js.map +1 -1
  87. package/dist/blocks/data-display.js +2 -3
  88. package/dist/blocks/onboarding.js +91 -82
  89. package/dist/blocks/onboarding.js.map +1 -1
  90. package/dist/blocks/planning.js +25 -25
  91. package/dist/blocks/planning.js.map +1 -1
  92. package/dist/blocks/timelines.js +2 -2
  93. package/dist/breadcrumbs-CQ9JSlez.js +136 -0
  94. package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
  95. package/dist/{button-S2Cubiiz.js → button-rd6FiHfQ.js} +12 -8
  96. package/dist/button-rd6FiHfQ.js.map +1 -0
  97. package/dist/{buttons-BedGfygC.js → buttons-pZVgPTZn.js} +230 -246
  98. package/dist/buttons-pZVgPTZn.js.map +1 -0
  99. package/dist/{cards-rNX1M4Xn.js → cards-CgWyqvgZ.js} +25 -22
  100. package/dist/{cards-rNX1M4Xn.js.map → cards-CgWyqvgZ.js.map} +1 -1
  101. package/dist/cascader-Cf05pwaq.js +444 -0
  102. package/dist/cascader-Cf05pwaq.js.map +1 -0
  103. package/dist/{chart-Darg_0Kv.js → chart-CygRCyIZ.js} +5 -5
  104. package/dist/{chart-Darg_0Kv.js.map → chart-CygRCyIZ.js.map} +1 -1
  105. package/dist/{checkbox-fflqmODR.js → checkbox-Dy5_XBMZ.js} +4 -4
  106. package/dist/{checkbox-fflqmODR.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
  107. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-oJEsrb5Y.js} +195 -184
  108. package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
  109. package/dist/{code-block-BzmM9Eig.js → code-block-BrLD7mCi.js} +44 -60
  110. package/dist/code-block-BrLD7mCi.js.map +1 -0
  111. package/dist/collapsible-CRCCg_bO.js +80 -0
  112. package/dist/collapsible-CRCCg_bO.js.map +1 -0
  113. package/dist/{collection-content-gDh1v6O4.js → collection-content-D7SoDlYd.js} +3 -3
  114. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-D7SoDlYd.js.map} +1 -1
  115. package/dist/combobox-Dl6f6kHz.js +362 -0
  116. package/dist/combobox-Dl6f6kHz.js.map +1 -0
  117. package/dist/combobox-DrDXtSSt.js +929 -0
  118. package/dist/combobox-DrDXtSSt.js.map +1 -0
  119. package/dist/command-CjZ2VzKC.js +432 -0
  120. package/dist/command-CjZ2VzKC.js.map +1 -0
  121. package/dist/comments-C2MZyRmh.js +1214 -0
  122. package/dist/comments-C2MZyRmh.js.map +1 -0
  123. package/dist/components/base/accordion/accordion.d.ts +11 -3
  124. package/dist/components/base/action-menu/action-menu.d.ts +11 -3
  125. package/dist/components/base/buttons/button.d.ts +2 -2
  126. package/dist/components/base/buttons/index.d.ts +1 -1
  127. package/dist/components/base/buttons/loader-button.d.ts +6 -15
  128. package/dist/components/base/cards/index.d.ts +1 -1
  129. package/dist/components/base/cards/partials/card-body-context.d.ts +6 -0
  130. package/dist/components/base/cards/smart-card.d.ts +0 -2
  131. package/dist/components/base/cards/smart-card.types.d.ts +12 -10
  132. package/dist/components/base/cascader/cascader.d.ts +8 -2
  133. package/dist/components/base/cascader/cascader.types.d.ts +24 -2
  134. package/dist/components/base/cascader/index.d.ts +1 -1
  135. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  136. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  137. package/dist/components/base/choice-inputs/switch.d.ts +1 -1
  138. package/dist/components/base/code-block/use-code-copy.d.ts +2 -6
  139. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  140. package/dist/components/base/command/command.d.ts +1 -1
  141. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  142. package/dist/components/base/date-pickers/datepicker.types.d.ts +11 -7
  143. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  144. package/dist/components/base/display/dialog.d.ts +3 -9
  145. package/dist/components/base/display/index.d.ts +2 -3
  146. package/dist/components/base/display/separator.d.ts +1 -1
  147. package/dist/components/base/feedback/alert.d.ts +2 -1
  148. package/dist/components/base/feedback/empty.d.ts +10 -2
  149. package/dist/components/base/feedback/state-display.d.ts +5 -1
  150. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  151. package/dist/components/base/forms/form-field.d.ts +7 -2
  152. package/dist/components/base/forms/workflow.d.ts +2 -2
  153. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  154. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  155. package/dist/components/base/forms-numeric/dimensions-input.d.ts +13 -18
  156. package/dist/components/base/forms-numeric/index.d.ts +3 -3
  157. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  158. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  159. package/dist/components/base/item/item.types.d.ts +6 -2
  160. package/dist/components/base/metadata-list/index.d.ts +1 -3
  161. package/dist/components/base/metadata-list/metadata-list.d.ts +4 -1
  162. package/dist/components/base/navigation/index.d.ts +2 -2
  163. package/dist/components/base/navigation/language-switcher.d.ts +17 -8
  164. package/dist/components/base/navigation/navigation-tabs.d.ts +8 -1
  165. package/dist/components/base/navigation/page-header/index.d.ts +1 -1
  166. package/dist/components/base/navigation/page-header/page-header.d.ts +13 -17
  167. package/dist/components/base/navigation/pagination.d.ts +5 -5
  168. package/dist/components/base/popover/popover.recipes.d.ts +0 -1
  169. package/dist/components/base/qr-code/qr-code.d.ts +4 -0
  170. package/dist/components/base/repeaters/index.d.ts +1 -1
  171. package/dist/components/base/repeaters/key-value-editor.d.ts +6 -1
  172. package/dist/components/base/sheet/sheet.d.ts +6 -15
  173. package/dist/components/base/sidebar/index.d.ts +1 -6
  174. package/dist/components/base/sidebar/sidebar.d.ts +40 -10
  175. package/dist/components/base/skeleton/skeleton.d.ts +1 -1
  176. package/dist/components/base/structure/structure.types.d.ts +11 -2
  177. package/dist/components/base/text-inputs/index.d.ts +1 -1
  178. package/dist/components/base/tree/index.d.ts +1 -0
  179. package/dist/components/base/tree/tree.d.ts +2 -2
  180. package/dist/components/base/tree/tree.types.d.ts +7 -1
  181. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  182. package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
  183. package/dist/components/base/upload/image-upload.d.ts +4 -1
  184. package/dist/components/base/upload/index.d.ts +3 -9
  185. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -0
  186. package/dist/components/base/value-inputs/slider.d.ts +5 -2
  187. package/dist/components/blocks/admin/action-surfaces/index.d.ts +17 -4
  188. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +9 -3
  189. package/dist/components/blocks/admin/index.d.ts +1 -1
  190. package/dist/components/blocks/ai/ai-artifact/ai-artifact.d.ts +1 -1
  191. package/dist/components/blocks/ai/ai-artifact/types.d.ts +9 -4
  192. package/dist/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.d.ts +1 -1
  193. package/dist/components/blocks/ai/ai-chain-of-thought/types.d.ts +11 -1
  194. package/dist/components/blocks/ai/ai-citation/ai-citation.d.ts +1 -1
  195. package/dist/components/blocks/ai/ai-citation/types.d.ts +8 -0
  196. package/dist/components/blocks/ai/ai-confirmation/ai-confirmation.d.ts +1 -1
  197. package/dist/components/blocks/ai/ai-confirmation/types.d.ts +21 -5
  198. package/dist/components/blocks/ai/ai-feedback/types.d.ts +7 -2
  199. package/dist/components/blocks/ai/ai-inline-citation/types.d.ts +9 -3
  200. package/dist/components/blocks/ai/ai-package-info/ai-package-info.d.ts +1 -1
  201. package/dist/components/blocks/ai/ai-package-info/types.d.ts +6 -0
  202. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  203. package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
  204. package/dist/components/blocks/ai/ai-sources/types.d.ts +10 -2
  205. package/dist/components/blocks/ai/ai-task/ai-task.d.ts +1 -1
  206. package/dist/components/blocks/ai/ai-task/types.d.ts +10 -1
  207. package/dist/components/blocks/ai/ai-tool-call/ai-tool-call.d.ts +1 -1
  208. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +8 -0
  209. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  210. package/dist/components/blocks/analytics/activity-heatmap/types.d.ts +1 -1
  211. package/dist/components/blocks/analytics/analytics.strings.d.ts +2 -0
  212. package/dist/components/blocks/analytics/atoms/metric-trend-chip.d.ts +11 -1
  213. package/dist/components/blocks/analytics/chart-card/chart-card.d.ts +7 -5
  214. package/dist/components/blocks/analytics/charts/index.d.ts +27 -0
  215. package/dist/components/blocks/analytics/index.d.ts +17 -24
  216. package/dist/components/blocks/analytics/metric/metric.d.ts +7 -3
  217. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  218. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  219. package/dist/components/blocks/analytics/types.d.ts +13 -4
  220. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  221. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  222. package/dist/components/blocks/commerce/address-card/types.d.ts +5 -16
  223. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +2 -2
  224. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +6 -4
  225. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +0 -2
  226. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  227. package/dist/components/blocks/commerce/cart-summary/types.d.ts +9 -11
  228. package/dist/components/blocks/commerce/coupon-input/coupon-input.d.ts +1 -1
  229. package/dist/components/blocks/commerce/coupon-input/types.d.ts +7 -3
  230. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +0 -2
  231. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  232. package/dist/components/blocks/commerce/discount-stack/types.d.ts +4 -6
  233. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  234. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +2 -0
  235. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-balance.d.ts +18 -0
  236. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-compact.d.ts +1 -1
  237. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-copy-button.d.ts +0 -1
  238. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-dark.d.ts +1 -1
  239. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-full.d.ts +1 -1
  240. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-illustrated.d.ts +1 -1
  241. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-minimal.d.ts +1 -1
  242. package/dist/components/blocks/commerce/giftcard-card/types.d.ts +16 -5
  243. package/dist/components/blocks/commerce/index.d.ts +8 -8
  244. package/dist/components/blocks/commerce/inventory-level/inventory-level.strings.d.ts +2 -0
  245. package/dist/components/blocks/commerce/inventory-level/types.d.ts +1 -1
  246. package/dist/components/blocks/commerce/inventory-section/types.d.ts +0 -5
  247. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +6 -3
  248. package/dist/components/blocks/commerce/loyalty-points/loyalty-points.d.ts +1 -1
  249. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +11 -5
  250. package/dist/components/blocks/commerce/order-status/order-status.d.ts +1 -1
  251. package/dist/components/blocks/commerce/order-status/types.d.ts +12 -8
  252. package/dist/components/blocks/commerce/order-timeline/order-timeline.d.ts +1 -1
  253. package/dist/components/blocks/commerce/order-timeline/types.d.ts +3 -1
  254. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  255. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +0 -8
  256. package/dist/components/blocks/commerce/payment-method/types.d.ts +0 -2
  257. package/dist/components/blocks/commerce/receipt/index.d.ts +1 -1
  258. package/dist/components/blocks/commerce/receipt/receipt-items.d.ts +1 -1
  259. package/dist/components/blocks/commerce/receipt/types.d.ts +10 -0
  260. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  261. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +0 -2
  262. package/dist/components/blocks/commerce/refund-status/types.d.ts +0 -2
  263. package/dist/components/blocks/commerce/seo-listing/types.d.ts +7 -0
  264. package/dist/components/blocks/commerce/shared/code-entry.d.ts +39 -0
  265. package/dist/components/blocks/commerce/shared/order-status.d.ts +1 -1
  266. package/dist/components/blocks/commerce/subscription-summary/subscription-summary.d.ts +1 -1
  267. package/dist/components/blocks/commerce/subscription-summary/types.d.ts +10 -1
  268. package/dist/components/blocks/commerce/upcoming-booking/index.d.ts +2 -1
  269. package/dist/components/blocks/commerce/upcoming-booking/types.d.ts +8 -0
  270. package/dist/components/blocks/commerce/upcoming-booking/upcoming-booking.d.ts +2 -2
  271. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -5
  272. package/dist/components/blocks/commerce/voucher-entry/types.d.ts +6 -3
  273. package/dist/components/blocks/commerce/voucher-entry/voucher-entry.d.ts +1 -1
  274. package/dist/components/blocks/content-block-hooks.d.ts +22 -0
  275. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +5 -1
  276. package/dist/components/blocks/data-display/dense-info-card/helpers.d.ts +3 -1
  277. package/dist/components/blocks/data-display/dense-info-card/index.d.ts +1 -1
  278. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-classification.d.ts +1 -1
  279. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.d.ts +1 -1
  280. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-financial.d.ts +1 -1
  281. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-project.d.ts +1 -1
  282. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-score.d.ts +1 -1
  283. package/dist/components/blocks/data-display/dense-info-card/types.d.ts +12 -5
  284. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +10 -3
  285. package/dist/components/blocks/data-display/index.d.ts +0 -1
  286. package/dist/components/blocks/data-display/relationship-card-frame.d.ts +1 -1
  287. package/dist/components/blocks/onboarding/checklist/checklist.types.d.ts +5 -3
  288. package/dist/components/blocks/planning/task-card.types.d.ts +7 -3
  289. package/dist/components/blocks/timelines/changelog/types.d.ts +2 -2
  290. package/dist/components/blocks/timelines/index.d.ts +2 -2
  291. package/dist/components/blocks/timelines/milestones/types.d.ts +2 -2
  292. package/dist/components/blocks/timelines/shared/timeline.d.ts +6 -0
  293. package/dist/components/blocks/timelines/steps-card/index.d.ts +2 -1
  294. package/dist/components/blocks/timelines/steps-card/steps-card.d.ts +2 -2
  295. package/dist/components/blocks/timelines/steps-card/types.d.ts +13 -1
  296. package/dist/components/features/activities/activities.strings.d.ts +5 -3
  297. package/dist/components/features/activities/activities.types.d.ts +46 -22
  298. package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
  299. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  300. package/dist/components/features/activities/index.d.ts +1 -1
  301. package/dist/components/features/activities/partials/activity-headline.d.ts +5 -0
  302. package/dist/components/features/activities/partials/activity-row.d.ts +12 -13
  303. package/dist/components/features/activities/partials/row-layers.d.ts +7 -0
  304. package/dist/components/features/activities/relative-time.d.ts +18 -0
  305. package/dist/components/features/ai-chat/ai-chat.d.ts +6 -2
  306. package/dist/components/features/ai-chat/ai-chat.strings.d.ts +41 -2
  307. package/dist/components/features/ai-chat/ai-chat.types.d.ts +6 -0
  308. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  309. package/dist/components/features/ai-chat/partials/ai-chat-attachments-strip.d.ts +5 -1
  310. package/dist/components/features/ai-chat/partials/ai-chat-prompt-input.d.ts +2 -2
  311. package/dist/components/features/ai-chat/partials/ai-chat-queue.d.ts +3 -1
  312. package/dist/components/features/ai-chat/partials/ai-chat-suggestions-row.d.ts +6 -1
  313. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  314. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +20 -4
  315. package/dist/components/features/appointment-calendar/index.d.ts +1 -1
  316. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +18 -10
  317. package/dist/components/features/async-preview/async-preview.d.ts +2 -2
  318. package/dist/components/features/async-preview/async-preview.types.d.ts +30 -1
  319. package/dist/components/features/async-preview/preview-trigger-cell.d.ts +7 -2
  320. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  321. package/dist/components/features/combobox/combobox.d.ts +12 -3
  322. package/dist/components/features/combobox/components/error-message.d.ts +3 -1
  323. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +4 -3
  324. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  325. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  326. package/dist/components/features/combobox/index.d.ts +1 -1
  327. package/dist/components/features/combobox/types.d.ts +68 -37
  328. package/dist/components/features/comments/comments.strings.d.ts +6 -5
  329. package/dist/components/features/comments/comments.types.d.ts +40 -26
  330. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -1
  331. package/dist/components/features/comments/hooks/use-comments.d.ts +8 -1
  332. package/dist/components/features/data-view/data-view.strings.d.ts +9 -2
  333. package/dist/components/features/data-view/data-view.types.d.ts +15 -2
  334. package/dist/components/features/email-composer/email-html.d.ts +5 -0
  335. package/dist/components/features/email-composer/http.d.ts +2 -0
  336. package/dist/components/features/email-composer/strings.d.ts +17 -2
  337. package/dist/components/features/email-composer/types.d.ts +19 -2
  338. package/dist/components/features/email-composer/use-composer.d.ts +2 -78
  339. package/dist/components/features/event-calendar/event-calendar-day-cell.d.ts +1 -1
  340. package/dist/components/features/event-calendar/event-calendar-event-badge.d.ts +1 -1
  341. package/dist/components/features/event-calendar/event-calendar-header.d.ts +1 -1
  342. package/dist/components/features/event-calendar/event-calendar-legend.d.ts +2 -2
  343. package/dist/components/features/event-calendar/event-calendar.d.ts +1 -1
  344. package/dist/components/features/event-calendar/event-calendar.types.d.ts +126 -21
  345. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  346. package/dist/components/features/filters/facets/range-facet.d.ts +24 -7
  347. package/dist/components/features/filters/filter-context.d.ts +9 -0
  348. package/dist/components/features/filters/filters.strings.d.ts +36 -3
  349. package/dist/components/features/filters/filters.types.d.ts +75 -8
  350. package/dist/components/features/filters/hooks/use-filter-draft.d.ts +1 -0
  351. package/dist/components/features/filters/index.d.ts +2 -2
  352. package/dist/components/features/filters/operator-options.d.ts +25 -2
  353. package/dist/components/features/filters/partials/active-filter-item.d.ts +0 -13
  354. package/dist/components/features/filters/partials/async-options-status.d.ts +32 -0
  355. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  356. package/dist/components/features/filters/partials/filter-draft-footer.d.ts +11 -0
  357. package/dist/components/features/filters/partials/filter-operator-select.d.ts +4 -2
  358. package/dist/components/features/filters/partials/filter-pill.d.ts +5 -1
  359. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  360. package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
  361. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  362. package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
  363. package/dist/components/features/filters/utils/filter-utils.d.ts +34 -5
  364. package/dist/components/features/global-search/global-search-dialog.d.ts +7 -1
  365. package/dist/components/features/global-search/global-search.d.ts +7 -1
  366. package/dist/components/features/global-search/global-search.strings.d.ts +19 -3
  367. package/dist/components/features/global-search/global-search.types.d.ts +30 -6
  368. package/dist/components/features/global-search/index.d.ts +1 -1
  369. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +6 -1
  370. package/dist/components/features/global-search/partials/global-search-input.d.ts +2 -0
  371. package/dist/components/features/kanban/index.d.ts +2 -2
  372. package/dist/components/features/kanban/kanban-context.d.ts +4 -0
  373. package/dist/components/features/kanban/kanban-keyboard.d.ts +7 -2
  374. package/dist/components/features/kanban/kanban.d.ts +10 -1
  375. package/dist/components/features/kanban/kanban.strings.d.ts +11 -2
  376. package/dist/components/features/kanban/kanban.types.d.ts +26 -0
  377. package/dist/components/features/map/map.d.ts +4 -0
  378. package/dist/components/features/map/place-autocomplete.d.ts +10 -1
  379. package/dist/components/features/media-library/hooks/use-media-library.d.ts +3 -1
  380. package/dist/components/features/media-library/media-library.d.ts +1 -1
  381. package/dist/components/features/media-library/media-library.strings.d.ts +39 -3
  382. package/dist/components/features/media-library/media-library.types.d.ts +82 -9
  383. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  384. package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
  385. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  386. package/dist/components/features/mentions/index.d.ts +1 -1
  387. package/dist/components/features/mentions/mentions.strings.d.ts +10 -2
  388. package/dist/components/features/mentions/partials/mention-chip.d.ts +1 -0
  389. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +12 -1
  390. package/dist/components/features/mentions/partials/mention-picker.d.ts +8 -1
  391. package/dist/components/features/mentions/partials/mention-search-error.d.ts +6 -0
  392. package/dist/components/features/mentions/utils/index.d.ts +0 -1
  393. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  394. package/dist/components/features/overlays/dialog.d.ts +1 -1
  395. package/dist/components/features/overlays/drawer.d.ts +1 -1
  396. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  397. package/dist/components/features/overlays/index.d.ts +2 -2
  398. package/dist/components/features/overlays/overlays.strings.d.ts +2 -1
  399. package/dist/components/features/overlays/overlays.types.d.ts +27 -10
  400. package/dist/components/features/products/components/index.d.ts +0 -10
  401. package/dist/components/features/products/components/product-contract-overview.d.ts +1 -1
  402. package/dist/components/features/products/components/product-details-card.d.ts +1 -1
  403. package/dist/components/features/products/components/product-operations-card.d.ts +1 -1
  404. package/dist/components/features/products/components/product-option-action-menu.d.ts +1 -1
  405. package/dist/components/features/products/components/product-options-summary.d.ts +1 -1
  406. package/dist/components/features/products/components/product-policies-card.d.ts +1 -1
  407. package/dist/components/features/products/components/product-quote-preview-card.d.ts +1 -1
  408. package/dist/components/features/products/components/product-readiness-card.d.ts +1 -1
  409. package/dist/components/features/products/components/product-structure-card.d.ts +1 -1
  410. package/dist/components/features/products/components/product-variant-action-menu.d.ts +1 -1
  411. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  412. package/dist/components/features/products/components/product-variants-table.d.ts +1 -1
  413. package/dist/components/features/products/partials/product-surface.d.ts +15 -0
  414. package/dist/components/features/products/products.strings.d.ts +8 -0
  415. package/dist/components/features/products/products.types.d.ts +26 -8
  416. package/dist/components/features/questionnaire/questionnaire.types.d.ts +7 -2
  417. package/dist/components/features/resource/index.d.ts +2 -3
  418. package/dist/components/features/resource/resource.d.ts +2 -10
  419. package/dist/components/features/resource/resource.types.d.ts +7 -147
  420. package/dist/components/features/resource-assignment/partials/assignment-surface.d.ts +15 -0
  421. package/dist/components/features/resource-assignment/resource-assignment.strings.d.ts +6 -1
  422. package/dist/components/features/resource-assignment/resource-assignment.types.d.ts +6 -0
  423. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  424. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
  425. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  426. package/dist/components/features/rich-text-editor/partials/html-helpers.d.ts +2 -3
  427. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +6 -2
  428. package/dist/components/features/rich-text-editor/partials/index.d.ts +2 -3
  429. package/dist/components/features/rich-text-editor/partials/rich-text-editor-tiptap.d.ts +0 -1
  430. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +5 -4
  431. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  432. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +30 -4
  433. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +10 -1
  434. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  435. package/dist/components/features/schema-form/schema-form.d.ts +1 -1
  436. package/dist/components/features/schema-form/schema-form.types.d.ts +13 -5
  437. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  438. package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
  439. package/dist/components/features/suggestions/suggestions.types.d.ts +13 -5
  440. package/dist/components/features/table/data-table.d.ts +1 -1
  441. package/dist/components/features/table/filter-bar.d.ts +1 -1
  442. package/dist/components/features/table/index.d.ts +1 -0
  443. package/dist/components/features/table/pagination.d.ts +1 -1
  444. package/dist/components/features/table/partials/cell-value.d.ts +1 -1
  445. package/dist/components/features/table/table-body.d.ts +1 -1
  446. package/dist/components/features/table/table-header.d.ts +1 -1
  447. package/dist/components/features/table/table-helpers.d.ts +37 -12
  448. package/dist/components/features/table/table-region.recipes.d.ts +11 -0
  449. package/dist/components/features/table/table-toolbar.d.ts +1 -1
  450. package/dist/components/features/table/table.strings.d.ts +4 -0
  451. package/dist/components/features/table/table.types.d.ts +91 -49
  452. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +4 -0
  453. package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +10 -7
  454. package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +17 -0
  455. package/dist/components/layout/app-shell/app-shell.types.d.ts +46 -49
  456. package/dist/components/layout/app-shell/index.d.ts +2 -2
  457. package/dist/components/layout/app-shell/shell-regions.d.ts +9 -0
  458. package/dist/components/layout/app-shell/shell-skip-link.d.ts +9 -0
  459. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  460. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  461. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  462. package/dist/components/layout/auth/auth-shell.d.ts +1 -1
  463. package/dist/components/layout/auth/auth.types.d.ts +0 -5
  464. package/dist/components/layout/containers/inline-gutter-context.d.ts +7 -0
  465. package/dist/components/layout/containers/main-landmark-context.d.ts +6 -0
  466. package/dist/components/layout/header/header.types.d.ts +19 -8
  467. package/dist/components/layout/header/partials/header-global-search-trigger.d.ts +1 -1
  468. package/dist/components/layout/header/partials/header-notifications.d.ts +1 -1
  469. package/dist/components/layout/header/partials/header-search.d.ts +1 -1
  470. package/dist/components/layout/hooks/use-command-shortcut.d.ts +10 -1
  471. package/dist/components/layout/layout.types.d.ts +6 -4
  472. package/dist/components/layout/navigation/breadcrumb-progress/breadcrumb-progress.d.ts +1 -1
  473. package/dist/components/layout/navigation/breadcrumb-progress/types.d.ts +9 -0
  474. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +8 -1
  475. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  476. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  477. package/dist/components/layout/page/index.d.ts +2 -3
  478. package/dist/components/layout/page/page.strings.d.ts +12 -0
  479. package/dist/components/layout/page/page.types.d.ts +7 -110
  480. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  481. package/dist/components/layout/settings/index.d.ts +1 -1
  482. package/dist/components/layout/settings/settings.d.ts +4 -6
  483. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  484. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  485. package/dist/components/layout/sidebar/components/sidebar-navigation-footer.d.ts +1 -1
  486. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  487. package/dist/components/layout/sidebar/index.d.ts +1 -1
  488. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +17 -7
  489. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  490. package/dist/components/layout/sidebar/sidebar.types.d.ts +12 -12
  491. package/dist/components/layout/sidebar/sidebar.utils.d.ts +4 -0
  492. package/dist/components/layout/workspace/workspace.strings.d.ts +2 -2
  493. package/dist/components/layout/workspace/workspace.types.d.ts +13 -7
  494. package/dist/components/primitives/date.d.ts +22 -3
  495. package/dist/components/primitives/file-size.d.ts +8 -2
  496. package/dist/components/primitives/index.d.ts +1 -1
  497. package/dist/components/primitives/initials.d.ts +3 -1
  498. package/dist/components/primitives/link.d.ts +11 -3
  499. package/dist/components/primitives/money.d.ts +2 -2
  500. package/dist/components/primitives/number.d.ts +3 -2
  501. package/dist/components/typography/heading.d.ts +9 -3
  502. package/dist/components/typography/index.d.ts +1 -1
  503. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  504. package/dist/components/typography/text-link.d.ts +10 -3
  505. package/dist/components/ui/badge.d.ts +2 -4
  506. package/dist/components/ui/breadcrumb.d.ts +2 -3
  507. package/dist/components/ui/button.d.ts +8 -2
  508. package/dist/components/ui/collapsible.d.ts +1 -4
  509. package/dist/components/ui/command.d.ts +20 -18
  510. package/dist/components/ui/dialog.d.ts +3 -9
  511. package/dist/components/ui/empty.d.ts +2 -2
  512. package/dist/components/ui/input-group.d.ts +3 -3
  513. package/dist/components/ui/item.d.ts +3 -3
  514. package/dist/components/ui/popover.d.ts +3 -7
  515. package/dist/components/ui/sheet.d.ts +4 -12
  516. package/dist/components/ui/sidebar-state.d.ts +6 -1
  517. package/dist/components/ui/sidebar.d.ts +7 -4
  518. package/dist/components/ui/tabs.d.ts +2 -2
  519. package/dist/components/ui/toggle-group.d.ts +3 -3
  520. package/dist/components/ui/toggle.d.ts +2 -2
  521. package/dist/components/ui/tooltip.d.ts +1 -3
  522. package/dist/{containers-CIxwbZt5.js → containers-BdfLTP4w.js} +37 -32
  523. package/dist/containers-BdfLTP4w.js.map +1 -0
  524. package/dist/content-block-hooks-Z3iKjqd1.js +17 -0
  525. package/dist/content-block-hooks-Z3iKjqd1.js.map +1 -0
  526. package/dist/{copyable-DIznBqiT.js → copyable-Bmr14W0d.js} +6 -6
  527. package/dist/{copyable-DIznBqiT.js.map → copyable-Bmr14W0d.js.map} +1 -1
  528. package/dist/{data-display-BdgCAw8T.js → data-display-CWe9SOYh.js} +264 -250
  529. package/dist/data-display-CWe9SOYh.js.map +1 -0
  530. package/dist/date-3qsCE1ID.js +209 -0
  531. package/dist/date-3qsCE1ID.js.map +1 -0
  532. package/dist/date-picker-D1keJQIG.js +1617 -0
  533. package/dist/date-picker-D1keJQIG.js.map +1 -0
  534. package/dist/date-pickers-D8aJoeHc.js +185 -0
  535. package/dist/date-pickers-D8aJoeHc.js.map +1 -0
  536. package/dist/disclosure-panel-B0HFNZ9x.js.map +1 -1
  537. package/dist/{display-KsZLw9Ov.js → display-VlmP1I0i.js} +23 -46
  538. package/dist/display-VlmP1I0i.js.map +1 -0
  539. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-B8hjvbkS.js} +9 -9
  540. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-B8hjvbkS.js.map} +1 -1
  541. package/dist/dropzone-CHBNK3de.js +116 -0
  542. package/dist/dropzone-CHBNK3de.js.map +1 -0
  543. package/dist/features/activities.js +767 -700
  544. package/dist/features/activities.js.map +1 -1
  545. package/dist/features/ai-chat.js +280 -235
  546. package/dist/features/ai-chat.js.map +1 -1
  547. package/dist/features/appointment-calendar.js +430 -334
  548. package/dist/features/appointment-calendar.js.map +1 -1
  549. package/dist/features/async-preview.js +351 -265
  550. package/dist/features/async-preview.js.map +1 -1
  551. package/dist/features/combobox.js +2 -2
  552. package/dist/features/comments.js +1 -1
  553. package/dist/features/data-view.js +212 -151
  554. package/dist/features/data-view.js.map +1 -1
  555. package/dist/features/email-composer/engine.js +1 -1
  556. package/dist/features/email-composer.js +347 -313
  557. package/dist/features/email-composer.js.map +1 -1
  558. package/dist/features/event-calendar.js +501 -348
  559. package/dist/features/event-calendar.js.map +1 -1
  560. package/dist/features/filters.js +2 -2
  561. package/dist/features/global-search.js +250 -210
  562. package/dist/features/global-search.js.map +1 -1
  563. package/dist/features/kanban.js +280 -210
  564. package/dist/features/kanban.js.map +1 -1
  565. package/dist/features/map/style.css +15 -0
  566. package/dist/features/map.js +435 -404
  567. package/dist/features/map.js.map +1 -1
  568. package/dist/features/media-library.js +1745 -1195
  569. package/dist/features/media-library.js.map +1 -1
  570. package/dist/features/mentions.js +2 -2
  571. package/dist/features/overlays.js +2 -2
  572. package/dist/features/products.js +1862 -1759
  573. package/dist/features/products.js.map +1 -1
  574. package/dist/features/questionnaire.js +188 -168
  575. package/dist/features/questionnaire.js.map +1 -1
  576. package/dist/features/resource-assignment.js +223 -191
  577. package/dist/features/resource-assignment.js.map +1 -1
  578. package/dist/features/resource.js +55 -217
  579. package/dist/features/resource.js.map +1 -1
  580. package/dist/features/rich-text-editor.js +28 -19
  581. package/dist/features/rich-text-editor.js.map +1 -1
  582. package/dist/features/schema-form.js +380 -287
  583. package/dist/features/schema-form.js.map +1 -1
  584. package/dist/features/suggestions.js +90 -74
  585. package/dist/features/suggestions.js.map +1 -1
  586. package/dist/features/table.js +2 -2
  587. package/dist/features/theme-tweaker.js +718 -627
  588. package/dist/features/theme-tweaker.js.map +1 -1
  589. package/dist/feedback-DmqmXKLn.js +254 -0
  590. package/dist/feedback-DmqmXKLn.js.map +1 -0
  591. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-DfbMadot.js} +13 -9
  592. package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
  593. package/dist/field-control-attributes-B6i335wr.js +18 -0
  594. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  595. package/dist/field-state-recipes-EtCxpEy3.js +18 -0
  596. package/dist/field-state-recipes-EtCxpEy3.js.map +1 -0
  597. package/dist/filters-BviMRMLS.js +2692 -0
  598. package/dist/filters-BviMRMLS.js.map +1 -0
  599. package/dist/{focus-recipes-B653VaLq.js → focus-recipes-DSkiUvUp.js} +3 -3
  600. package/dist/focus-recipes-DSkiUvUp.js.map +1 -0
  601. package/dist/form-field-BdfCwSoQ.js +74 -0
  602. package/dist/form-field-BdfCwSoQ.js.map +1 -0
  603. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-DE_dZw32.js} +3 -3
  604. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-DE_dZw32.js.map} +1 -1
  605. package/dist/{forms-C0RGnJTe.js → forms-B8DzJnBN.js} +35 -35
  606. package/dist/forms-B8DzJnBN.js.map +1 -0
  607. package/dist/forms-numeric-DOBswjKj.js +992 -0
  608. package/dist/forms-numeric-DOBswjKj.js.map +1 -0
  609. package/dist/{header-DMMxG__r.js → header-Cq3G0ZRP.js} +163 -158
  610. package/dist/header-Cq3G0ZRP.js.map +1 -0
  611. package/dist/hooks/use-files.d.ts +2 -0
  612. package/dist/{hooks-DB6CJ4MR.js → hooks-DHfeSMAO.js} +34 -14
  613. package/dist/hooks-DHfeSMAO.js.map +1 -0
  614. package/dist/{http-D_6rOnzU.js → http-Cu-GPpss.js} +61 -35
  615. package/dist/http-Cu-GPpss.js.map +1 -0
  616. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-B0Kq7wom.js} +3 -3
  617. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-B0Kq7wom.js.map} +1 -1
  618. package/dist/index.js +6 -6
  619. package/dist/inline-gutter-context-CSqmrMFZ.js +11 -0
  620. package/dist/inline-gutter-context-CSqmrMFZ.js.map +1 -0
  621. package/dist/{input-DMBwAZmr.js → input-2YrgTUrz.js} +3 -3
  622. package/dist/{input-DMBwAZmr.js.map → input-2YrgTUrz.js.map} +1 -1
  623. package/dist/{input-CvyDQlY7.js → input-DfJyrjoR.js} +7 -7
  624. package/dist/{input-CvyDQlY7.js.map → input-DfJyrjoR.js.map} +1 -1
  625. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-DmuS1ase.js} +2 -2
  626. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-DmuS1ase.js.map} +1 -1
  627. package/dist/item-GJ9mvCcg.js +279 -0
  628. package/dist/item-GJ9mvCcg.js.map +1 -0
  629. package/dist/layout/app-shell.js +1 -1
  630. package/dist/layout/auth.js +1 -1
  631. package/dist/layout/containers.js +1 -1
  632. package/dist/layout/header.js +1 -1
  633. package/dist/layout/hooks.js +1 -1
  634. package/dist/layout/navigation.js +1 -1
  635. package/dist/layout/page.js +2 -2
  636. package/dist/layout/settings.js +2 -2
  637. package/dist/layout/sidebar.js +3 -3
  638. package/dist/layout/workspace.js +1 -1
  639. package/dist/layout.js +12 -12
  640. package/dist/layout.types-DbtnyAtd.js +33 -0
  641. package/dist/layout.types-DbtnyAtd.js.map +1 -0
  642. package/dist/lib/anchored-positioning.d.ts +11 -0
  643. package/dist/lib/field-affordance-recipes.d.ts +10 -0
  644. package/dist/lib/field-control-attributes.d.ts +11 -0
  645. package/dist/lib/field-state-recipes.d.ts +8 -0
  646. package/dist/lib/focus-recipes.d.ts +7 -0
  647. package/dist/lib/format.d.ts +26 -0
  648. package/dist/lib/money-format.d.ts +6 -0
  649. package/dist/lib/motion-recipes.d.ts +6 -0
  650. package/dist/lib/surface-recipes.d.ts +33 -3
  651. package/dist/lib/theme-scope.d.ts +17 -1
  652. package/dist/lib/token-merge.generated.d.ts +19 -25
  653. package/dist/lib/ui-provider/index.d.ts +1 -1
  654. package/dist/lib/ui-provider/types.d.ts +5 -0
  655. package/dist/lib/use-controllable-state.d.ts +16 -0
  656. package/dist/lib/use-copy-feedback.d.ts +15 -0
  657. package/dist/lib/utils.js +1 -1
  658. package/dist/lib/variant-props.d.ts +9 -0
  659. package/dist/main-landmark-context-BAsyqp2I.js +11 -0
  660. package/dist/main-landmark-context-BAsyqp2I.js.map +1 -0
  661. package/dist/mentions-zz0ewNIq.js +670 -0
  662. package/dist/mentions-zz0ewNIq.js.map +1 -0
  663. package/dist/message-BiiVrRrm.js +138 -0
  664. package/dist/message-BiiVrRrm.js.map +1 -0
  665. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-G85roWjS.js} +13 -12
  666. package/dist/metadata-list-G85roWjS.js.map +1 -0
  667. package/dist/{motion-recipes-DitYv6P2.js → motion-recipes-CUc_aHuG.js} +7 -4
  668. package/dist/motion-recipes-CUc_aHuG.js.map +1 -0
  669. package/dist/navigation-C0Be5C3i.js +304 -0
  670. package/dist/navigation-C0Be5C3i.js.map +1 -0
  671. package/dist/navigation-CmqaQR_G.js +257 -0
  672. package/dist/navigation-CmqaQR_G.js.map +1 -0
  673. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  674. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  675. package/dist/number-NFWKIoiK.js +340 -0
  676. package/dist/number-NFWKIoiK.js.map +1 -0
  677. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
  678. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
  679. package/dist/{overlays-BSgCtM2v.js → overlays-D-gAIfPF.js} +369 -364
  680. package/dist/overlays-D-gAIfPF.js.map +1 -0
  681. package/dist/page-D4pQhgSq.js +216 -0
  682. package/dist/page-D4pQhgSq.js.map +1 -0
  683. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-elelNOfd.js} +29 -29
  684. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-elelNOfd.js.map} +1 -1
  685. package/dist/{pagination-CgCjElfu.js → pagination-BuSWw1US.js} +22 -23
  686. package/dist/pagination-BuSWw1US.js.map +1 -0
  687. package/dist/popover-BpMxbqEK.js +205 -0
  688. package/dist/popover-BpMxbqEK.js.map +1 -0
  689. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-CO-_iiuz.js} +7 -7
  690. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
  691. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-BqkdvlZn.js} +3 -4
  692. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
  693. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-BPeS4rGB.js} +2 -2
  694. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-BPeS4rGB.js.map} +1 -1
  695. package/dist/primitives-BlC1lXBr.js +447 -0
  696. package/dist/primitives-BlC1lXBr.js.map +1 -0
  697. package/dist/primitives.js +4 -4
  698. package/dist/{progress-BJhQP9WX.js → progress-RARK8AjB.js} +5 -5
  699. package/dist/{progress-BJhQP9WX.js.map → progress-RARK8AjB.js.map} +1 -1
  700. package/dist/receipt-CUf2Vegp.js +114 -0
  701. package/dist/receipt-CUf2Vegp.js.map +1 -0
  702. package/dist/rich-text-Cypm9__d.js +44 -0
  703. package/dist/rich-text-Cypm9__d.js.map +1 -0
  704. package/dist/rich-text-editor-Z6cQepsA.js +919 -0
  705. package/dist/rich-text-editor-Z6cQepsA.js.map +1 -0
  706. package/dist/rich-text-editor-toolbar-DYbRJARB.js +100 -0
  707. package/dist/rich-text-editor-toolbar-DYbRJARB.js.map +1 -0
  708. package/dist/rich-text-tree-DdKHIJx4.js +154 -0
  709. package/dist/rich-text-tree-DdKHIJx4.js.map +1 -0
  710. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-B9HKbji0.js} +3 -3
  711. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-B9HKbji0.js.map} +1 -1
  712. package/dist/{separator-Ct_WSWTJ.js → separator-DaDe26sf.js} +3 -3
  713. package/dist/separator-DaDe26sf.js.map +1 -0
  714. package/dist/{separator-Bb17I4pu.js → separator-KGsNXt2J.js} +2 -2
  715. package/dist/{separator-Bb17I4pu.js.map → separator-KGsNXt2J.js.map} +1 -1
  716. package/dist/services/actions/action-adapters.d.ts +5 -2
  717. package/dist/services/actions/index.d.ts +1 -1
  718. package/dist/services/actions.js +2 -2
  719. package/dist/services/actions.js.map +1 -1
  720. package/dist/settings-D5j_RJvT.js +160 -0
  721. package/dist/settings-D5j_RJvT.js.map +1 -0
  722. package/dist/sheet-B6j_BE9O.js +241 -0
  723. package/dist/sheet-B6j_BE9O.js.map +1 -0
  724. package/dist/{sidebar-f9gRWXIR.js → sidebar-C-iQ_TJP.js} +379 -350
  725. package/dist/sidebar-C-iQ_TJP.js.map +1 -0
  726. package/dist/sidebar-D5VO2W8S.js +715 -0
  727. package/dist/sidebar-D5VO2W8S.js.map +1 -0
  728. package/dist/{skeleton-BapcJd9C.js → skeleton-Cab_KgVo.js} +13 -13
  729. package/dist/skeleton-Cab_KgVo.js.map +1 -0
  730. package/dist/{smart-card-CW0hjetE.js → smart-card-C59z6KFO.js} +217 -210
  731. package/dist/smart-card-C59z6KFO.js.map +1 -0
  732. package/dist/{structure-DuxKl954.js → structure-DElaQwwN.js} +2 -2
  733. package/dist/{structure-DuxKl954.js.map → structure-DElaQwwN.js.map} +1 -1
  734. package/dist/style.css +1 -1
  735. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-DV6rrOFq.js} +11 -3
  736. package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
  737. package/dist/table-CSRUgpdK.js +180 -0
  738. package/dist/table-CSRUgpdK.js.map +1 -0
  739. package/dist/table-DdXDBsR_.js +1657 -0
  740. package/dist/table-DdXDBsR_.js.map +1 -0
  741. package/dist/tabs-WnHfV2pM.js +192 -0
  742. package/dist/tabs-WnHfV2pM.js.map +1 -0
  743. package/dist/{text-inputs-B1culiSK.js → text-inputs-ljyBYaCd.js} +112 -112
  744. package/dist/text-inputs-ljyBYaCd.js.map +1 -0
  745. package/dist/theme.css +21 -5
  746. package/dist/timelines-mOmS9Eh3.js +479 -0
  747. package/dist/timelines-mOmS9Eh3.js.map +1 -0
  748. package/dist/tooltip-yjX-Uv-p.js +112 -0
  749. package/dist/tooltip-yjX-Uv-p.js.map +1 -0
  750. package/dist/{tree-CzUJHnFs.js → tree-YpkxUG2Z.js} +80 -72
  751. package/dist/tree-YpkxUG2Z.js.map +1 -0
  752. package/dist/typography/rich-text.js +1 -1
  753. package/dist/{typography-BQnine1k.js → typography-C0dELqYV.js} +46 -40
  754. package/dist/typography-C0dELqYV.js.map +1 -0
  755. package/dist/typography.js +1 -1
  756. package/dist/{ui-provider-C-74NVLc.js → ui-provider-Bu1S-o96.js} +4 -3
  757. package/dist/ui-provider-Bu1S-o96.js.map +1 -0
  758. package/dist/ui-provider.js +2 -2
  759. package/dist/upload-DMuMYJFT.js +875 -0
  760. package/dist/upload-DMuMYJFT.js.map +1 -0
  761. package/dist/{usage-card-BeSLY0i0.js → usage-card-DDPki5P1.js} +57 -54
  762. package/dist/usage-card-DDPki5P1.js.map +1 -0
  763. package/dist/use-controllable-state-BlP8SyBI.js +13 -0
  764. package/dist/use-controllable-state-BlP8SyBI.js.map +1 -0
  765. package/dist/use-copy-feedback-CzcaqlLf.js +28 -0
  766. package/dist/use-copy-feedback-CzcaqlLf.js.map +1 -0
  767. package/dist/use-metric-format-options-Dk4rC1NO.js +251 -0
  768. package/dist/use-metric-format-options-Dk4rC1NO.js.map +1 -0
  769. package/dist/{utils-B6kKb8jB.js → utils-BVbAG2J6.js} +128 -112
  770. package/dist/utils-BVbAG2J6.js.map +1 -0
  771. package/dist/value-inputs-h5MwjGCo.js +982 -0
  772. package/dist/value-inputs-h5MwjGCo.js.map +1 -0
  773. package/dist/value-typography-D15uwfj-.js +154 -0
  774. package/dist/value-typography-D15uwfj-.js.map +1 -0
  775. package/dist/workspace-DIryPqBt.js +400 -0
  776. package/dist/workspace-DIryPqBt.js.map +1 -0
  777. package/docs/consumer-skill/SKILL.md +7 -0
  778. package/docs/consumer-skill/agents/themelia-ui-designer.md +11 -2
  779. package/docs/consumer-skill/examples/analytics.tsx +1 -1
  780. package/docs/consumer-skill/examples/app-layout.tsx +3 -3
  781. package/docs/consumer-skill/examples/commerce-lines.tsx +7 -5
  782. package/docs/consumer-skill/examples/detail.tsx +3 -2
  783. package/docs/consumer-skill/examples/edit.tsx +3 -3
  784. package/docs/consumer-skill/examples/email-composer.tsx +1 -1
  785. package/docs/consumer-skill/examples/index-table.tsx +2 -2
  786. package/docs/consumer-skill/examples/scoped-directory.tsx +7 -6
  787. package/docs/consumer-skill/references/agents-md.md +27 -23
  788. package/docs/consumer-skill/references/analytics.md +33 -4
  789. package/docs/consumer-skill/references/building-views.md +213 -0
  790. package/docs/consumer-skill/references/catalogue.md +617 -0
  791. package/docs/consumer-skill/references/component-contracts.json +25852 -32067
  792. package/docs/consumer-skill/references/composition.md +42 -21
  793. package/docs/consumer-skill/references/design-contract.md +1 -0
  794. package/docs/consumer-skill/references/discovery.md +8 -5
  795. package/docs/consumer-skill/references/installation.md +59 -10
  796. package/docs/consumer-skill/references/integration.md +28 -5
  797. package/docs/consumer-skill/references/product-composition.md +2 -2
  798. package/docs/consumer-skill/references/public-api.json +726 -641
  799. package/docs/consumer-skill/references/review.md +57 -15
  800. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  801. package/docs/consumer-skill/references/screen-archetypes.md +2 -2
  802. package/docs/consumer-skill/references/theming.md +8 -3
  803. package/docs/consumer-skill/references/tokens.json +4 -4
  804. package/docs/consumer-skill/references/workflows.md +7 -7
  805. package/docs/consumer-skill/scripts/composition-policy.mjs +178 -44
  806. package/docs/consumer-skill/scripts/composition.mjs +4 -1
  807. package/docs/consumer-skill/scripts/discovery.mjs +3 -1
  808. package/docs/consumer-skill/scripts/setup-skills.mjs +74 -10
  809. package/docs/consumer-skills/themelia-components/SKILL.md +8 -4
  810. package/docs/consumer-skills/themelia-composition/SKILL.md +7 -3
  811. package/docs/consumer-skills/themelia-design/SKILL.md +7 -1
  812. package/docs/consumer-skills/themelia-tokenization/SKILL.md +1 -1
  813. package/package.json +12 -13
  814. package/templates/README.md +3 -2
  815. package/templates/admin-shell-template.tsx +50 -11
  816. package/templates/analytics-operations-template.tsx +20 -24
  817. package/templates/customers-template.tsx +30 -25
  818. package/templates/index.ts +2 -8
  819. package/templates/orders-template.tsx +28 -24
  820. package/templates/products-template.tsx +14 -4
  821. package/templates/user-permissions-template.tsx +11 -14
  822. package/dist/accordion-B9MHG0cT.js.map +0 -1
  823. package/dist/action-menu-Dr8K-ghE.js +0 -284
  824. package/dist/action-menu-Dr8K-ghE.js.map +0 -1
  825. package/dist/ai-artifact-C58tQcBy.js +0 -1185
  826. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  827. package/dist/anchored-positioning-DPnKTvNs.js +0 -6
  828. package/dist/anchored-positioning-DPnKTvNs.js.map +0 -1
  829. package/dist/app-shell-B_IuNWOo.js +0 -321
  830. package/dist/app-shell-B_IuNWOo.js.map +0 -1
  831. package/dist/auth-DTkkshS8.js.map +0 -1
  832. package/dist/badge-xIiV_E7f.js.map +0 -1
  833. package/dist/base/sheet.js +0 -3
  834. package/dist/breadcrumbs-J-K2kl4c.js +0 -129
  835. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  836. package/dist/button-S2Cubiiz.js.map +0 -1
  837. package/dist/buttons-BedGfygC.js.map +0 -1
  838. package/dist/cascader-B1MiqkBq.js +0 -439
  839. package/dist/cascader-B1MiqkBq.js.map +0 -1
  840. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  841. package/dist/code-block-BzmM9Eig.js.map +0 -1
  842. package/dist/collapsible-BkAI_XD4.js +0 -81
  843. package/dist/collapsible-BkAI_XD4.js.map +0 -1
  844. package/dist/combobox-BEx0vJgF.js +0 -362
  845. package/dist/combobox-BEx0vJgF.js.map +0 -1
  846. package/dist/combobox-BwzoXFSG.js +0 -884
  847. package/dist/combobox-BwzoXFSG.js.map +0 -1
  848. package/dist/command-CrlPIL6m.js +0 -425
  849. package/dist/command-CrlPIL6m.js.map +0 -1
  850. package/dist/comments-Dmpp0YIc.js +0 -1169
  851. package/dist/comments-Dmpp0YIc.js.map +0 -1
  852. package/dist/components/base/buttons/tooltip-button.d.ts +0 -7
  853. package/dist/components/base/display/content-block.d.ts +0 -75
  854. package/dist/components/base/display/content-block.strings.d.ts +0 -5
  855. package/dist/components/base/sheet/index.d.ts +0 -29
  856. package/dist/components/blocks/ai/use-copy-feedback.d.ts +0 -6
  857. package/dist/components/blocks/data-display/metadata/index.d.ts +0 -30
  858. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +0 -16
  859. package/dist/components/features/resource/resource.strings.d.ts +0 -12
  860. package/dist/components/features/rich-text-editor/partials/rich-text-editor-fallback.d.ts +0 -8
  861. package/dist/components/features/sync/index.d.ts +0 -26
  862. package/dist/components/features/sync/sync-range-dialog-form.d.ts +0 -5
  863. package/dist/components/features/sync/sync.strings.d.ts +0 -18
  864. package/dist/components/features/sync/sync.types.d.ts +0 -44
  865. package/dist/components/layout/page/partials/page-actions.d.ts +0 -3
  866. package/dist/components/ui/slot.d.ts +0 -6
  867. package/dist/containers-CIxwbZt5.js.map +0 -1
  868. package/dist/data-display-BdgCAw8T.js.map +0 -1
  869. package/dist/date-Cq8ioE4o.js +0 -144
  870. package/dist/date-Cq8ioE4o.js.map +0 -1
  871. package/dist/date-picker-RlIzKom_.js +0 -1551
  872. package/dist/date-picker-RlIzKom_.js.map +0 -1
  873. package/dist/date-pickers-DY-CpXS1.js +0 -179
  874. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  875. package/dist/display-KsZLw9Ov.js.map +0 -1
  876. package/dist/features/sync.js +0 -142
  877. package/dist/features/sync.js.map +0 -1
  878. package/dist/feedback-Dm4izqFn.js +0 -240
  879. package/dist/feedback-Dm4izqFn.js.map +0 -1
  880. package/dist/field-affordance-recipes-DWcNcOjh.js.map +0 -1
  881. package/dist/field-state-recipes-BVA2CWHo.js +0 -12
  882. package/dist/field-state-recipes-BVA2CWHo.js.map +0 -1
  883. package/dist/filters-DzgSJpMK.js +0 -2257
  884. package/dist/filters-DzgSJpMK.js.map +0 -1
  885. package/dist/focus-recipes-B653VaLq.js.map +0 -1
  886. package/dist/form-field-BriWAXyg.js +0 -63
  887. package/dist/form-field-BriWAXyg.js.map +0 -1
  888. package/dist/forms-C0RGnJTe.js.map +0 -1
  889. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  890. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  891. package/dist/header-DMMxG__r.js.map +0 -1
  892. package/dist/hooks-DB6CJ4MR.js.map +0 -1
  893. package/dist/http-D_6rOnzU.js.map +0 -1
  894. package/dist/item-DjCcM18E.js +0 -277
  895. package/dist/item-DjCcM18E.js.map +0 -1
  896. package/dist/layout.types-Cn7aUzJp.js +0 -20
  897. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  898. package/dist/media-gallery-C-vChPmE.js +0 -203
  899. package/dist/media-gallery-C-vChPmE.js.map +0 -1
  900. package/dist/mentions-0_4nWuI-.js +0 -570
  901. package/dist/mentions-0_4nWuI-.js.map +0 -1
  902. package/dist/message-g8p7eVtN.js +0 -128
  903. package/dist/message-g8p7eVtN.js.map +0 -1
  904. package/dist/metadata-list-C3MkU-Om.js.map +0 -1
  905. package/dist/motion-recipes-DitYv6P2.js.map +0 -1
  906. package/dist/navigation-C90-oQFq.js +0 -255
  907. package/dist/navigation-C90-oQFq.js.map +0 -1
  908. package/dist/navigation-DaRjthVk.js +0 -288
  909. package/dist/navigation-DaRjthVk.js.map +0 -1
  910. package/dist/number-CRU3kGuk.js +0 -354
  911. package/dist/number-CRU3kGuk.js.map +0 -1
  912. package/dist/overlays-BSgCtM2v.js.map +0 -1
  913. package/dist/page-DUUKDAjo.js +0 -331
  914. package/dist/page-DUUKDAjo.js.map +0 -1
  915. package/dist/pagination-CgCjElfu.js.map +0 -1
  916. package/dist/popover-B85RenIl.js +0 -201
  917. package/dist/popover-B85RenIl.js.map +0 -1
  918. package/dist/primitives-ByWgGUgt.js +0 -380
  919. package/dist/primitives-ByWgGUgt.js.map +0 -1
  920. package/dist/receipt-tOc7B3hw.js +0 -116
  921. package/dist/receipt-tOc7B3hw.js.map +0 -1
  922. package/dist/rich-text-Dth5E882.js +0 -78
  923. package/dist/rich-text-Dth5E882.js.map +0 -1
  924. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  925. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  926. package/dist/rich-text-editor-toolbar-laT3tpBT.js +0 -98
  927. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  928. package/dist/sanitize-html-DsQmI48u.js +0 -92
  929. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  930. package/dist/separator-Ct_WSWTJ.js.map +0 -1
  931. package/dist/settings-Bar5wiSo.js +0 -167
  932. package/dist/settings-Bar5wiSo.js.map +0 -1
  933. package/dist/sheet-BGPERY55.js +0 -250
  934. package/dist/sheet-BGPERY55.js.map +0 -1
  935. package/dist/sidebar-D-JYMMbY.js +0 -686
  936. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  937. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  938. package/dist/skeleton-BapcJd9C.js.map +0 -1
  939. package/dist/slot-CLF9kLrS.js +0 -16
  940. package/dist/slot-CLF9kLrS.js.map +0 -1
  941. package/dist/smart-card-CW0hjetE.js.map +0 -1
  942. package/dist/surface-recipes-BKRVW8Os.js.map +0 -1
  943. package/dist/table-B4TE7iOV.js +0 -175
  944. package/dist/table-B4TE7iOV.js.map +0 -1
  945. package/dist/table-CFOWY9pQ.js +0 -1536
  946. package/dist/table-CFOWY9pQ.js.map +0 -1
  947. package/dist/tabs-e7ko9S2o.js +0 -191
  948. package/dist/tabs-e7ko9S2o.js.map +0 -1
  949. package/dist/text-inputs-B1culiSK.js.map +0 -1
  950. package/dist/timelines-D3Sl9ueq.js +0 -458
  951. package/dist/timelines-D3Sl9ueq.js.map +0 -1
  952. package/dist/tooltip-8wz5S_Zr.js +0 -113
  953. package/dist/tooltip-8wz5S_Zr.js.map +0 -1
  954. package/dist/tree-CzUJHnFs.js.map +0 -1
  955. package/dist/typography-BQnine1k.js.map +0 -1
  956. package/dist/ui-provider-C-74NVLc.js.map +0 -1
  957. package/dist/upload-BOW6U2tI.js +0 -855
  958. package/dist/upload-BOW6U2tI.js.map +0 -1
  959. package/dist/upload-queue-qUXn1ykN.js +0 -409
  960. package/dist/upload-queue-qUXn1ykN.js.map +0 -1
  961. package/dist/usage-card-BeSLY0i0.js.map +0 -1
  962. package/dist/utils-B6kKb8jB.js.map +0 -1
  963. package/dist/value-inputs-skdVB2zh.js +0 -980
  964. package/dist/value-inputs-skdVB2zh.js.map +0 -1
  965. package/dist/value-typography-uAmWUAL1.js +0 -116
  966. package/dist/value-typography-uAmWUAL1.js.map +0 -1
  967. package/dist/workspace-DHeHv0qw.js +0 -411
  968. package/dist/workspace-DHeHv0qw.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"map.js","names":["React","Map","_Fragment","ButtonGroup","Text","elevationRecipes","popoverRecipes","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuRadioGroup","DropdownMenuCheckboxItem","DropdownMenuLabel","DropdownMenuContent","DropdownMenu","DropdownMenuRadioItem","layerRecipes","CommandItem","CommandEmpty","CommandList","CommandGroup","Command","PopoverTrigger","Popover","PopoverContent","InputGroup","InputGroupInput","InputGroupAddon","useDebounce","React$1","Fragment$1","defaultPlaceAutocompleteStrings","formatAddress","parts","properties","buildSearchUrl","url","query","lang","limit","bbox","lat","lon","zoom","locationBiasScale","searchPhoton","response","options","usePlaceSearch","results","setResults","isLoading","setIsLoading","error","setError","hasSearched","setHasSearched","retryAttempt","setRetryAttempt","onSearchErrorRef","onSearchError","debouncedQuery","debounceMs","bboxKey","current","abortController","fetchResults","features","searchPlaces","signal","addressOsmIds","id","feature","err","failure","attempt","formatPlaceAutocompleteString","template","params","key","match","PlaceAutocomplete","controlledValue","controlledOnValueChange","stringsProp","inputOnFocus","props","strings","useStrings","internalValue","setInternalValue","defaultValue","searchQuery","setSearchQuery","isListDismissed","setIsListDismissed","activeIndex","setActiveIndex","listId","anchorRef","popoverActionsRef","optionNodes","isControlled","displayValue","onResultsChangeRef","onResultsChange","hasNoResults","hasCommandList","showCommandList","selectPlace","address","onPlaceSelect","cn","className","event","flushSync","next","open","details","SearchIcon","index","newValue","Loader2Icon","Button","retry","formattedAddress","node","MapPinIcon","useMapColorScheme","read","useCallback","container","subscribe","observer","notify","useSyncExternalStore","mapControlSurface","mapControlActiveSurface","ReactLeafletHooksContext","createContext","defaultMapStrings","MapStringsContext","useMapStrings","useContext","ReactLeafletRuntimeContext","ReactLeafletRuntime","lazy","mod","createRuntimeComponent","runtime","Component","select","LeafletMapContainer","LeafletTileLayer","LeafletMarker","LeafletPopup","LeafletTooltip","LeafletCircle","LeafletCircleMarker","LeafletPolyline","LeafletPolygon","LeafletRectangle","LeafletLayerGroup","LeafletFeatureGroup","createLazyComponent","factory","Suspense","LeafletMarkerClusterGroup","ReactLeafletHooksProvider","useLeafletMap","hooks","useLeafletMapEvents","handlers","assignRef","ref","value","Map$1","focusCleanup","useRef","handleMapRef","map","focusWithoutScroll","isMounted","setIsMounted","useState","useEffect","MapLayersContext","useMapLayersContext","MapTileLayer","nameProp","name","context","resolvedTheme","resolvedUrl","darkUrl","resolvedAttribution","darkAttribution","attribution","MapLayerGroup","disabled","MapFeatureGroup","MapLayers","tileLayers","setTileLayers","selectedTileLayer","setSelectedTileLayer","defaultTileLayer","layerGroups","setLayerGroups","activeLayerGroups","setActiveLayerGroups","defaultLayerGroups","registerTileLayer","prevTileLayers","layer","tileLayer","registerLayerGroup","prevLayerGroups","group","layerGroup","validDefaultValue","MapLayersControl","layersContext","handleLayerGroupToggle","checked","groupName","showTileLayersDropdown","showLayerGroupsDropdown","triggerProps","position","LayersIcon","tileLayersLabel","layerGroupsLabel","MapMarker","useLeaflet","markerRef","resolvedAriaLabel","ariaLabel","resolvedTitle","syncMarkerElement","element","marker","handleMarkerRef","L","renderToString","icon","bgPos","popupAnchor","tooltipAnchor","MapMarkerClusterGroup","iconNode","cluster","MapCircle","MapCircleMarker","MapPolyline","MapPolygon","MapRectangle","MapPopup","MapTooltip","ARROW_POSITION_CLASSES","DEFAULT_OFFSET","sideOffset","side","children","MapZoomControl","zoomLevel","setZoomLevel","MapControlContainer","PlusIcon","MinusIcon","MapFullscreenControl","isFullscreen","setIsFullscreen","fullscreenControl","handleEnter","handleExit","jsx","MinimizeIcon","MaximizeIcon","MapLocatePulseIcon","MapLocateControl","isLocating","setIsLocating","useDelayedLoadingState","location","setLocation","hasLocation","startLocating","onLocationFound","onLocationError","watch","stopLocating","trackingHandler","trackingTitle","trackingAriaLabel","locationMarker","LoaderCircleIcon","NavigationIcon","MapSearchControl","MapDrawContext","useMapDrawContext","MapDrawControl","featureGroupRef","editControlRef","deleteControlRef","activeMode","setActiveMode","layersCount","setLayersCount","updateLayersCount","handleDrawCreated","onLayersChange","handleDrawEditedOrDeleted","LeafletDraw","MapDrawShapeButton","drawContext","controlRef","isActive","drawMode","drawLabel","control","createDrawTool","handleClick","MapDrawMarker","MapDrawPolyline","mapDrawHandleIcon","useMapDrawHandleIcon","WaypointsIcon","MapDrawCircle","CircleIcon","MapDrawRectangle","SquareIcon","MapDrawPolygon","PentagonIcon","MapDrawActionButton","drawAction","hasFeatures","actionLabel","featureGroup","MapDrawEdit","PenLineIcon","MapDrawDelete","Trash2Icon","MapDrawUndo","isInEditMode","isInDeleteMode","undoLabel","handleUndo","Undo2Icon","containerRef","setL","setLeafletDraw","loadLeaflet","leaflet","leafletFullscreen","leafletDraw","L_object","showLoading","setShowLoading","timeoutRef","delay"],"sources":["../../src/components/features/map/place-autocomplete.tsx","../../src/components/features/map/use-map-color-scheme.ts","../../src/components/features/map/map.tsx"],"sourcesContent":["import { Button } from \"../../base/buttons\"\nimport { Text } from \"../../typography\"\nimport { useDebounce } from \"../../../hooks/use-debounce\"\nimport { DEFAULT_DEBOUNCE_MS } from \"../../../hooks/use-debounced-callback\"\nimport { useStrings, type StringsProp } from \"../../../lib/strings\"\nimport { cn } from \"../../../lib/utils\"\nimport {\n\t\tCommand,\n\t\tCommandEmpty,\n\t\tCommandGroup,\n\t\tCommandItem,\n\t\tCommandList,\n} from \"../../base/command\"\nimport {\n\t\tPopover,\n\t\tPopoverContent,\n\t\tPopoverTrigger,\n} from \"../../base/popover\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../base/text-inputs';\nimport { Loader2Icon, MapPinIcon, SearchIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { flushSync } from \"react-dom\"\n\ntype BBox = [number, number, number, number]\ntype Point = {\n\t\ttype: \"Point\"\n\t\tcoordinates: [number, number]\n}\ntype Feature<TGeometry, TProperties> = {\n\t\ttype: \"Feature\"\n\t\tgeometry: TGeometry\n\t\tproperties: TProperties\n\t\tbbox?: BBox\n}\ntype FeatureCollection<TGeometry, TProperties> = {\n\t\ttype: \"FeatureCollection\"\n\t\tfeatures: Array<Feature<TGeometry, TProperties>>\n\t\tbbox?: BBox\n}\n\ninterface PlaceFeatureProperties {\n\t\tosm_id: number\n\t\tosm_type: \"N\" | \"W\" | \"R\"\n\t\tosm_key: string\n\t\tosm_value: string\n\t\ttype: string\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname?: string\n\t\thousenumber?: string\n\t\tstreet?: string\n\t\tlocality?: string\n\t\tdistrict?: string\n\t\tpostcode?: string\n\t\tcity?: string\n\t\tcounty?: string\n\t\tstate?: string\n\t\tcountry?: string\n\t\tcountrycode?: string\n\t\textent?: [number, number, number, number]\n\t\textra?: Record<string, string>\n}\ntype PlaceFeature = Feature<Point, PlaceFeatureProperties>\ntype PlaceFeatureCollection = FeatureCollection<Point, PlaceFeatureProperties>\n\ninterface PlaceAutocompleteStrings {\n\t\tsearchPlaceholder: string\n\t\t/** Announced while a place lookup is in flight. */\n\t\tloading: string\n\t\terror: string\n\t\t/** Action shown after a failed lookup. */\n\t\tretry?: string\n\t\tnoResults: string\n\t\tunknownPlace: string\n}\n\nconst defaultPlaceAutocompleteStrings: PlaceAutocompleteStrings = {\n\t\tsearchPlaceholder: \"Search\",\n\t\tloading: \"Searching places\",\n\t\terror: \"Error: {{message}}\",\n\t\tretry: \"Retry\",\n\t\tnoResults: \"Can't find {{query}}.\",\n\t\tunknownPlace: \"Unknown\",\n}\n\n/**\n * Query parameters for Photon geocoding API\n * @see https://github.com/komoot/photon#photon-api\n */\ninterface PlaceSearchOptions {\n\t\t/** Search text (address, place name, or POI) */\n\t\tquery: string\n\t\t/** Preferred language for results (e.g., \"en\", \"de\", \"fr\") */\n\t\tlang?: string\n\t\t/** Maximum number of results to return */\n\t\tlimit?: number\n\t\t/**\n\t\t * Bounding box used to restrict results.\n\t\t * Format: [minLongitude, minLatitude, maxLongitude, maxLatitude]\n\t\t */\n\t\tbbox?: BBox\n\t\t/** Latitude used to bias results toward a specific location */\n\t\tlat?: number\n\t\t/** Longitude used to bias results toward a specific location */\n\t\tlon?: number\n\t\t/**\n\t\t * Zoom level used for location biasing.\n\t\t * Higher values increase locality.\n\t\t */\n\t\tzoom?: number\n\t\t/**\n\t\t * Strength of the location bias.\n\t\t */\n\t\tlocationBiasScale?: number\n}\n\n/** Consumer-owned geocoding integration. Keep callback identity stable until its provider changes. */\ntype PlaceSearchCallback = (options: PlaceSearchOptions, signal: AbortSignal) => Promise<PlaceFeature[]>\n\ninterface PlaceAutocompleteProps\n\t\textends Omit<PlaceSearchOptions, \"query\">,\n\t\t\t\tOmit<React.ComponentProps<\"input\">, \"value\" | \"onChange\"> {\n\t\tdebounceMs?: number\n\t\t/** Current value. Controlled. */\n\t\tvalue?: string\n\t\t/** Initial value for uncontrolled use. */\n\t\tdefaultValue?: string\n\t\t/** Fired with the next text value. */\n\t\tonValueChange?: (value: string) => void\n\t\tonPlaceSelect?: (feature: PlaceFeature) => void\n\t\tonResultsChange?: (results: PlaceFeature[]) => void\n\t\t/** Overrides Photon. Memoize when its implementation captures consumer state. */\n\t\tsearchPlaces?: PlaceSearchCallback\n\t\t/** Reports a current lookup failure; cancelled or superseded failures are ignored. */\n\t\tonSearchError?: (error: Error) => void\n\t\t/** Overrides this surface's own copy. */\n\t\tstrings?: StringsProp<PlaceAutocompleteStrings>\n}\n\nfunction formatAddress(properties: PlaceFeatureProperties) {\n\t\tconst parts = []\n\n\t\tif (properties.name) {\n\t\t\t\tparts.push(properties.name)\n\t\t}\n\n\t\tif (properties.housenumber && properties.street) {\n\t\t\t\tparts.push(`${properties.housenumber} ${properties.street}`)\n\t\t} else if (properties.street) {\n\t\t\t\tparts.push(properties.street)\n\t\t}\n\n\t\tif (properties.city) {\n\t\t\t\tparts.push(properties.city)\n\t\t} else if (properties.locality) {\n\t\t\t\tparts.push(properties.locality)\n\t\t}\n\n\t\tif (properties.state && properties.state !== properties.city) {\n\t\t\t\tparts.push(properties.state)\n\t\t}\n\n\t\tif (properties.country) {\n\t\t\t\tparts.push(properties.country)\n\t\t}\n\n\t\treturn [...new Set(parts)].join(\", \")\n}\n\nfunction buildSearchUrl({\n\t\tquery,\n\t\tbbox,\n\t\tlang,\n\t\tlat,\n\t\tlimit,\n\t\tlocationBiasScale,\n\t\tlon,\n\t\tzoom,\n}: PlaceSearchOptions) {\n\t\tconst url = new URL(\"https://photon.komoot.io/api\")\n\t\turl.searchParams.set(\"q\", query)\n\n\t\tif (lang) {\n\t\t\t\turl.searchParams.set(\"lang\", lang)\n\t\t}\n\n\t\tif (limit) {\n\t\t\t\turl.searchParams.set(\"limit\", String(limit))\n\t\t}\n\n\t\tif (bbox) {\n\t\t\t\turl.searchParams.set(\"bbox\", bbox.join(\",\"))\n\t\t}\n\n\t\tif (lat !== undefined && lon !== undefined) {\n\t\t\t\turl.searchParams.set(\"lat\", String(lat))\n\t\t\t\turl.searchParams.set(\"lon\", String(lon))\n\t\t}\n\n\t\tif (zoom !== undefined) {\n\t\t\t\turl.searchParams.set(\"zoom\", String(zoom))\n\t\t}\n\n\t\tif (locationBiasScale !== undefined) {\n\t\t\t\turl.searchParams.set(\"location_bias_scale\", String(locationBiasScale))\n\t\t}\n\n\t\treturn String(url)\n}\n\nconst searchPhoton: PlaceSearchCallback = async (options, signal) => {\n\t\tconst response = await fetch(buildSearchUrl(options), { signal })\n\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Photon API error: ${response.status} ${response.statusText}`)\n\t\t}\n\t\tconst data: PlaceFeatureCollection = await response.json()\n\t\treturn data.features\n}\n\nfunction usePlaceSearch({\n\t\tdebounceMs,\n\t\tquery,\n\t\tlang,\n\t\tlimit,\n\t\tbbox,\n\t\tlat,\n\t\tlon,\n\t\tzoom,\n\t\tlocationBiasScale,\n\t\tsearchPlaces = searchPhoton,\n\t\tonSearchError,\n}: {\n\t\tdebounceMs: number\n\t\tsearchPlaces?: PlaceSearchCallback\n\t\tonSearchError?: (error: Error) => void\n} & PlaceSearchOptions) {\n\t\tconst [results, setResults] = React.useState<PlaceFeature[]>([])\n\t\tconst [isLoading, setIsLoading] = React.useState(false)\n\t\tconst [error, setError] = React.useState<Error | null>(null)\n\t\tconst [hasSearched, setHasSearched] = React.useState(false)\n\t\tconst [retryAttempt, setRetryAttempt] = React.useState(0)\n\t\tconst onSearchErrorRef = React.useRef(onSearchError)\n\t\tReact.useEffect(() => { onSearchErrorRef.current = onSearchError }, [onSearchError])\n\n\t\tconst debouncedQuery = useDebounce(query, debounceMs)\n\t\t// Tuple values define the context; a consumer's inline bbox must not restart it.\n\t\tconst bboxKey = bbox?.join(',')\n\n\t\tReact.useEffect(() => {\n\t\t\t\tsetResults(current => current.length ? [] : current)\n\t\t\t\tsetError(null)\n\t\t\t\tif (!query.trim() || query !== debouncedQuery) {\n\t\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\t\tsetHasSearched(false)\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst abortController = new AbortController()\n\t\t\t\tconst { signal } = abortController\n\t\t\t\tsetIsLoading(true)\n\t\t\t\tsetHasSearched(true)\n\n\t\t\t\tasync function fetchResults() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst features = await searchPlaces({\n\t\t\t\t\t\t\t\t\t\tquery: debouncedQuery, lang, limit,\n\t\t\t\t\t\t\t\t\t\tbbox: bboxKey ? bboxKey.split(',').map(Number) as BBox : undefined,\n\t\t\t\t\t\t\t\t\t\tlat, lon, zoom, locationBiasScale,\n\t\t\t\t\t\t\t\t}, signal)\n\t\t\t\t\t\t\t\tif (signal.aborted) return\n\t\t\t\t\t\t\t\tconst addressOsmIds = new Set<number>()\n\t\t\t\t\t\t\t\tsetResults(features.filter(feature => {\n\t\t\t\t\t\t\t\t\t\tconst id = feature.properties.osm_id\n\t\t\t\t\t\t\t\t\t\tif (addressOsmIds.has(id)) return false\n\t\t\t\t\t\t\t\t\t\taddressOsmIds.add(id)\n\t\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tif (signal.aborted || (err instanceof Error && err.name === 'AbortError')) return\n\t\t\t\t\t\t\t\tconst failure = err instanceof Error ? err : new Error(String(err))\n\t\t\t\t\t\t\t\tsetError(failure)\n\t\t\t\t\t\t\t\tonSearchErrorRef.current?.(failure)\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tif (!signal.aborted) setIsLoading(false)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvoid fetchResults()\n\t\t\t\treturn () => abortController.abort()\n\t\t}, [query, debouncedQuery, lang, limit, bboxKey, lat, lon, zoom, locationBiasScale, searchPlaces, retryAttempt])\n\n\t\treturn { results, isLoading, error, hasSearched, retry: () => setRetryAttempt(attempt => attempt + 1) }\n}\n\nfunction formatPlaceAutocompleteString(\n\t\ttemplate: string,\n\t\tparams: Record<string, string>\n) {\n\t\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key) => {\n\t\t\t\treturn params[key] ?? match\n\t\t})\n}\n\nfunction PlaceAutocomplete({\n\t\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\t\tlang,\n\t\tlimit = 5,\n\t\tbbox,\n\t\tlat,\n\t\tlon,\n\t\tzoom,\n\t\tlocationBiasScale,\n\t\tclassName,\n\t\tvalue: controlledValue,\n\t\tdefaultValue = \"\",\n\t\tonValueChange: controlledOnValueChange,\n\t\tonPlaceSelect,\n\t\tonResultsChange,\n\t\tsearchPlaces,\n\t\tonSearchError,\n\t\tstrings: stringsProp,\n\t\tonFocus: inputOnFocus,\n\t\t...props\n}: PlaceAutocompleteProps) {\n\t\tconst strings = useStrings(defaultPlaceAutocompleteStrings, stringsProp)\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue)\n\t\tconst [searchQuery, setSearchQuery] = React.useState(\"\")\n\t\tconst [isListDismissed, setIsListDismissed] = React.useState(false)\n\t\tconst [activeIndex, setActiveIndex] = React.useState(-1)\n\t\tconst listId = React.useId()\n\t\tconst anchorRef = React.useRef<HTMLDivElement>(null)\n\t\tconst popoverActionsRef: React.ComponentProps<typeof Popover>['actionsRef'] = React.useRef(null)\n\t\tconst optionNodes = React.useRef(new Map<number, HTMLElement>())\n\n\t\tconst isControlled = controlledValue !== undefined\n\t\tconst displayValue = isControlled ? controlledValue : internalValue\n\n\t\tconst { results, isLoading, error, hasSearched, retry } = usePlaceSearch({\n\t\t\t\tquery: searchQuery,\n\t\t\t\tsearchPlaces,\n\t\t\t\tonSearchError,\n\t\t\t\tdebounceMs,\n\t\t\t\tlang,\n\t\t\t\tlimit,\n\t\t\t\tbbox,\n\t\t\t\tlat,\n\t\t\t\tlon,\n\t\t\t\tzoom,\n\t\t\t\tlocationBiasScale,\n\t\t})\n\n\t\tconst onResultsChangeRef = React.useRef(onResultsChange)\n\t\tReact.useEffect(() => { onResultsChangeRef.current = onResultsChange }, [onResultsChange])\n\t\tReact.useEffect(() => {\n\t\t\t\tonResultsChangeRef.current?.(results)\n\t\t}, [results])\n\n\t\tconst hasNoResults =\n\t\t\t\thasSearched && !isLoading && !error && results.length === 0\n\t\tconst hasCommandList = Boolean(error || hasNoResults || results.length > 0)\n\t\tconst showCommandList = hasCommandList && !isListDismissed\n\t\tconst selectPlace = (feature: PlaceFeature) => {\n\t\t\t\tconst address = formatAddress(feature.properties)\n\t\t\t\tif (!isControlled) setInternalValue(address)\n\t\t\t\tsetSearchQuery(\"\")\n\t\t\t\tsetIsListDismissed(true)\n\t\t\t\tsetActiveIndex(-1)\n\t\t\t\tcontrolledOnValueChange?.(address)\n\t\t\t\tonPlaceSelect?.(feature)\n\t\t}\n\t\tconst optionId = (index: number) => optionNodes.current.get(index)?.id\n\n\t\treturn (\n\t\t\t\t<Command\n inset=\"flush\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'place-autocomplete--component',\n\t\t\t\t\t\t\t\t// The input group owns the closed-state surface. Keep the\n\t\t\t\t\t\t\t\t// command root flush while inheriting canonical list and row\n\t\t\t\t\t\t\t\t// presentation from base/command.\n\t\t\t\t\t\t\t\t\"h-fit overflow-visible\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tvalue={activeIndex >= 0 ? String(results[activeIndex]?.properties.osm_id ?? '') : ''}\n\t\t\t\t\t\tonKeyDownCapture={(event) => {\n\t\t\t\t\t\t\tif (!(event.target instanceof HTMLInputElement)) return\n\t\t\t\t\t\t\tif (event.key === 'Tab' && showCommandList && (!error || event.shiftKey)) {\n\t\t\t\t\t\t\t\t// Remove closing popup guards before native Tab follows the page order.\n\t\t\t\t\t\t\t\t// A forward Tab on an error still reaches the popup's Retry action.\n\t\t\t\t\t\t\t\tflushSync(() => {\n\t\t\t\t\t\t\t\t\tsetIsListDismissed(true)\n\t\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tpopoverActionsRef.current?.unmount()\n\t\t\t\t\t\t\t} else if (event.key === 'Escape') {\n\t\t\t\t\t\t\t\tsetIsListDismissed(true)\n\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t} else if (results.length && ['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n\t\t\t\t\t\t\t\tsetIsListDismissed(false)\n\t\t\t\t\t\t\t\tconst next = event.key === 'Home' ? 0 : event.key === 'End' ? results.length - 1 : activeIndex < 0 ? (event.key === 'ArrowDown' ? 0 : results.length - 1) : (activeIndex + (event.key === 'ArrowDown' ? 1 : -1) + results.length) % results.length\n\t\t\t\t\t\t\t\tsetActiveIndex(next)\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t} else if (event.key === 'Enter' && showCommandList && results[activeIndex]) {\n\t\t\t\t\t\t\t\tselectPlace(results[activeIndex])\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshouldFilter={false}\n\t\t\t\t\t\tloop>\n\t\t\t\t\t\t<Popover\n\t\t\t\t\t\t\t\tactionsRef={popoverActionsRef}\n\t\t\t\t\t\t\t\topen={showCommandList}\n\t\t\t\t\t\t\t\tonOpenChange={(open, details) => {\n\t\t\t\t\t\t\t\t\t\t// The visible input is part of this composite, outside the portal.\n\t\t\t\t\t\t\t\t\t\tif (!open && details.reason === 'focus-out' && document.activeElement === anchorRef.current?.querySelector('input')) {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails.cancel()\n\t\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (!open) setIsListDismissed(true)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div ref={anchorRef} className=\"place-autocomplete--anchor relative\">\n\t\t\t\t\t\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\t\t\t\t\t\t\trender={<span />}\n\t\t\t\t\t\t\t\t\t\t\t\tnativeButton={false}\n\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<InputGroup className=\"border-input! bg-popover! ring-0!\">\n\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SearchIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupInput\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-expanded={showCommandList}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-controls={showCommandList ? listId : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-activedescendant={showCommandList && results[activeIndex] ? optionId(activeIndex) : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst newValue = event.target.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!isControlled) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetInternalValue(newValue)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetIsListDismissed(false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearchQuery(newValue)\n\t\t\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontrolledOnValueChange?.(newValue)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (hasCommandList) setIsListDismissed(false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputOnFocus?.(event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!isLoading && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2Icon className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</InputGroup>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\t\taria-label={strings.searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\t\t\tinitialFocus={false}\n\t\t\t\t\t\t\t\t\t\tfinalFocus={false}\n\t\t\t\t\t\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"place-autocomplete--results w-[var(--anchor-width)] max-w-[var(--available-width)] gap-0 overflow-hidden\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CommandList id={listId} label={strings.searchPlaceholder} className=\"max-h-72\">\n\t\t\t\t\t\t\t\t\t\t\t\t{!!error && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" align=\"center\" className=\"block\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPlaceAutocompleteString(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.error,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ message: error.message }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button buttonStyle=\"ghost\" size=\"sm\" onClick={() => { anchorRef.current?.querySelector('input')?.focus(); setIsListDismissed(false); retry() }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.retry ?? defaultPlaceAutocompleteStrings.retry}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{!!hasNoResults && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" align=\"center\" className=\"block\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPlaceAutocompleteString(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.noResults,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ query: displayValue }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{results.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{results.map((feature, index) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst formattedAddress = formatAddress(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfeature.properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={feature.properties.osm_id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={String(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfeature.properties.osm_id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => { if (node) optionNodes.current.set(index, node); else optionNodes.current.delete(index) }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => selectPlace(feature)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<MapPinIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start text-start\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{feature.properties.name ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfeature.properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.street ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.unknownPlace}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formattedAddress}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</CommandList>\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t</Popover>\n\t\t\t\t</Command>\n\t\t)\n}\n\nexport {\n\t\tPlaceAutocomplete,\n\t\tdefaultPlaceAutocompleteStrings,\n\t\ttype PlaceAutocompleteProps,\n\t\ttype PlaceAutocompleteStrings,\n\t\ttype PlaceFeature,\n\t\ttype PlaceSearchOptions,\n\t\ttype PlaceSearchCallback,\n}\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/** Observe inherited CSS theme classes without adding a second theme store. */\nexport function useMapColorScheme(container: HTMLElement | null): 'light' | 'dark' {\n const read = useCallback(() => {\n for(let node=container;node;node=node.parentElement) {\n if(node.classList.contains('dark')) return 'dark';\n if(node.classList.contains('light')) return 'light';\n }\n return 'light';\n },[container]);\n const subscribe = useCallback((notify: () => void) => {\n const observer=new MutationObserver(notify);\n for(let node=container;node;node=node.parentElement) observer.observe(node,{attributes:true,attributeFilter:['class']});\n return () => observer.disconnect();\n },[container]);\n return useSyncExternalStore(subscribe,read,()=>'light');\n}\n","\"use client\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { layerRecipes } from \"../../../lib/layer-recipes\"\nimport { elevationRecipes } from \"../../../lib/surface-recipes\"\nimport { popoverRecipes } from \"../../base/popover/popover.recipes\"\nimport { useStrings, type StringsProp } from \"../../../lib/strings\"\nimport { Button, ButtonGroup } from \"../../base/buttons\"\nimport {\n\t\tDropdownMenu,\n\t\tDropdownMenuCheckboxItem,\n\t\tDropdownMenuContent,\n\t\tDropdownMenuGroup,\n\t\tDropdownMenuLabel,\n\t\tDropdownMenuRadioGroup,\n\t\tDropdownMenuRadioItem,\n\t\tDropdownMenuSeparator,\n\t\tDropdownMenuTrigger,\n} from \"../../base/navigation/dropdown-menu\"\nimport {\n\t\tPlaceAutocomplete,\n\t\ttype PlaceAutocompleteProps,\n} from \"./place-autocomplete\"\nimport type {\n\t\tCircle,\n\t\tCircleMarker,\n\t\tDivIconOptions,\n\t\tDraw,\n\t\tDrawEvents,\n\t\tDrawMap,\n\t\tDrawOptions,\n\t\tEditToolbar,\n\t\tErrorEvent,\n\t\tFeatureGroup,\n\t\tLatLngExpression,\n\t\tLayerGroup,\n\t\tMap as LeafletMap,\n\t\tLocateOptions,\n\t\tLocationEvent,\n\t\tMarker,\n\t\tMarkerCluster,\n\t\tPointExpression,\n\t\tPolygon,\n\t\tPolyline,\n\t\tPopup,\n\t\tRectangle,\n\t\tTileLayer,\n\t\tTooltip,\n} from \"leaflet\"\nimport type * as LeafletDrawNamespace from \"leaflet-draw\"\nimport type * as LeafletNamespace from \"leaflet\"\nimport type {} from \"leaflet.markercluster\"\nimport {\n\t\tCircleIcon,\n\t\tLayersIcon,\n\t\tLoaderCircleIcon,\n\t\tMapPinIcon,\n\t\tMaximizeIcon,\n\t\tMinimizeIcon,\n\t\tMinusIcon,\n\t\tNavigationIcon,\n\t\tPenLineIcon,\n\t\tPentagonIcon,\n\t\tPlusIcon,\n\t\tSquareIcon,\n\t\tTrash2Icon,\n\t\tUndo2Icon,\n\t\tWaypointsIcon,\n} from \"lucide-react\"\nimport React, {\n\t\tSuspense,\n\t\tcreateContext,\n\t\tlazy,\n\t\tuseCallback,\n\t\tuseContext,\n\t\tuseEffect,\n\t\tuseRef,\n\t\tuseState,\n\t\ttype ComponentType,\n\t\ttype ReactNode,\n\t\ttype Ref,\n} from \"react\"\nimport { useMapColorScheme } from './use-map-color-scheme';\nimport { renderToString } from \"react-dom/server\"\nimport type {\n\t\tCircleMarkerProps,\n\t\tCircleProps,\n\t\tLayerGroupProps,\n\t\tMapContainerProps,\n\t\tMarkerProps,\n\t\tPolygonProps,\n\t\tPolylineProps,\n\t\tPopupProps,\n\t\tRectangleProps,\n\t\tTileLayerProps,\n\t\tTooltipProps,\n\t\tMarkerClusterGroupProps,\n} from \"./public-leaflet.types\"\n\n/**\n * Floating map controls sit over arbitrary tiles, so each one is an outline\n * button (the shared control boundary) on an opaque card surface with the card\n * elevation for small controls over media; hover and press keep the button's own\n * fills. An active tool keeps its solid primary fill and the same elevation.\n */\nconst mapControlSurface = cn(\"bg-card\", elevationRecipes.card)\nconst mapControlActiveSurface = elevationRecipes.card\n\ntype LeafletModule = typeof LeafletNamespace\ntype LeafletDrawModule = typeof LeafletDrawNamespace\ntype ReactLeafletModule = typeof import(\"react-leaflet\")\ntype ReactLeafletHooks = Pick<ReactLeafletModule, \"useMap\" | \"useMapEvents\">\n\nconst ReactLeafletHooksContext = createContext<ReactLeafletHooks | null>(null)\n\nexport interface MapStrings {\n\t\t/** Id of the tile layer shown first. */\n\t\tdefaultTileLayer: string\n\t\tmapType: string\n\t\tlayers: string\n\t\tselectLayers: string\n\t\tmarker: string\n\t\tzoomControls: string\n\t\tzoomIn: string\n\t\tzoomOut: string\n\t\tenterFullscreen: string\n\t\texitFullscreen: string\n\t\tlocating: string\n\t\tstopTracking: string\n\t\ttrackLocation: string\n\t\tstopLocationTracking: string\n\t\tstartLocationTracking: string\n\t\tcurrentLocation: string\n\t\tdrawMarker: string\n\t\tdrawPolyline: string\n\t\tdrawCircle: string\n\t\tdrawRectangle: string\n\t\tdrawPolygon: string\n\t\teditShapes: string\n\t\tremoveShapes: string\n\t\tundoEdit: string\n\t\tundoRemove: string\n\t\teditInstructions: string\n\t\tremoveInstructions: string\n}\n\nexport const defaultMapStrings: MapStrings = {\n\t\tdefaultTileLayer: \"Default\",\n\t\tmapType: \"Map type\",\n\t\tlayers: \"Layers\",\n\t\tselectLayers: \"Select layers\",\n\t\tmarker: \"Map marker\",\n\t\tzoomControls: \"Zoom controls\",\n\t\tzoomIn: \"Zoom in\",\n\t\tzoomOut: \"Zoom out\",\n\t\tenterFullscreen: \"Enter fullscreen\",\n\t\texitFullscreen: \"Exit fullscreen\",\n\t\tlocating: \"Locating…\",\n\t\tstopTracking: \"Stop tracking\",\n\t\ttrackLocation: \"Track location\",\n\t\tstopLocationTracking: \"Stop location tracking\",\n\t\tstartLocationTracking: \"Start location tracking\",\n\t\tcurrentLocation: \"Current location\",\n\t\tdrawMarker: \"Draw marker\",\n\t\tdrawPolyline: \"Draw polyline\",\n\t\tdrawCircle: \"Draw circle\",\n\t\tdrawRectangle: \"Draw rectangle\",\n\t\tdrawPolygon: \"Draw polygon\",\n\t\teditShapes: \"Edit shapes\",\n\t\tremoveShapes: \"Remove shapes\",\n\t\tundoEdit: \"Undo edit\",\n\t\tundoRemove: \"Undo remove\",\n\t\teditInstructions: \"Drag handles or markers to edit.\",\n\t\tremoveInstructions: \"Click on a shape to remove.\",\n}\n\nconst MapStringsContext = createContext<MapStrings>(defaultMapStrings)\n\nfunction useMapStrings() {\n\t\treturn useContext(MapStringsContext)\n}\n\n// Load the shared runtime before mounting MapContainer. Suspending below an\n// already initialized MapContainer disconnects its passive cleanup and removes\n// the Leaflet instance, leaving its visible markers attached to a stale map.\nconst ReactLeafletRuntimeContext = createContext<ReactLeafletModule | null>(null)\nconst ReactLeafletRuntime = lazy(async () => {\n\tconst mod = await import(\"react-leaflet\")\n\treturn { default: ({ children }: { children?: ReactNode }) => (\n\t\t<ReactLeafletRuntimeContext.Provider value={mod}>{children}</ReactLeafletRuntimeContext.Provider>\n\t) }\n})\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors React ComponentType's generic constraint.\nfunction createRuntimeComponent<T extends ComponentType<any>>(select: (runtime: ReactLeafletModule) => T) {\n\treturn (props: React.ComponentProps<T>) => {\n\t\tconst runtime = useContext(ReactLeafletRuntimeContext)\n\t\tif (!runtime) throw new Error(\"Map primitives must be rendered within Map.\")\n\t\tconst Component = select(runtime)\n\t\treturn <Component {...props} />\n\t}\n}\n\nconst LeafletMapContainer = createRuntimeComponent(mod => mod.MapContainer)\nconst LeafletTileLayer = createRuntimeComponent(mod => mod.TileLayer)\nconst LeafletMarker = createRuntimeComponent(mod => mod.Marker)\nconst LeafletPopup = createRuntimeComponent(mod => mod.Popup)\nconst LeafletTooltip = createRuntimeComponent(mod => mod.Tooltip)\nconst LeafletCircle = createRuntimeComponent(mod => mod.Circle)\nconst LeafletCircleMarker = createRuntimeComponent(mod => mod.CircleMarker)\nconst LeafletPolyline = createRuntimeComponent(mod => mod.Polyline)\nconst LeafletPolygon = createRuntimeComponent(mod => mod.Polygon)\nconst LeafletRectangle = createRuntimeComponent(mod => mod.Rectangle)\nconst LeafletLayerGroup = createRuntimeComponent(mod => mod.LayerGroup)\nconst LeafletFeatureGroup = createRuntimeComponent(mod => mod.FeatureGroup)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors React lazy's ComponentType constraint.\nfunction createLazyComponent<T extends ComponentType<any>>(factory: () => Promise<{ default: T }>) {\n\tconst Component = lazy(factory)\n\treturn (props: React.ComponentProps<T>) => <Suspense><Component {...props} /></Suspense>\n}\nconst LeafletMarkerClusterGroup = createLazyComponent(async () =>\n\timport(\"react-leaflet-markercluster\").then(mod => ({ default: mod.default }))\n)\n\nfunction ReactLeafletHooksProvider({ children }: { children?: ReactNode }) {\n\tconst mod = useContext(ReactLeafletRuntimeContext)\n\tif (!mod) throw new Error(\"Map controls must be rendered within Map.\")\n\treturn <ReactLeafletHooksContext.Provider value={mod}>{children}</ReactLeafletHooksContext.Provider>\n}\n\nfunction useLeafletMap() {\n\t\tconst hooks = useContext(ReactLeafletHooksContext)\n\t\tif (!hooks) {\n\t\t\t\tthrow new Error(\"Map controls must be rendered within Map.\")\n\t\t}\n\n\t\treturn hooks.useMap()\n}\n\nfunction useLeafletMapEvents(\n\t\thandlers: Parameters<ReactLeafletModule[\"useMapEvents\"]>[0]\n) {\n\t\tconst hooks = useContext(ReactLeafletHooksContext)\n\t\tif (!hooks) {\n\t\t\t\tthrow new Error(\"Map controls must be rendered within Map.\")\n\t\t}\n\n\t\treturn hooks.useMapEvents(handlers)\n}\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n\t\tif (!ref) return\n\n\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(value)\n\t\t\t\treturn\n\t\t}\n\n\t\t;(ref as React.MutableRefObject<T | null>).current = value\n}\n\nfunction Map({\n\t\tzoom = 15,\n\t\tmaxZoom = 18,\n\t\tclassName,\n\t\tchildren,\n\t\tstrings: stringsProp,\n\t\tref,\n\t\t...props\n}: Omit<MapContainerProps, \"zoomControl\"> & {\n\t\tcenter: LatLngExpression\n\t\tref?: Ref<LeafletMap>\n\t\t/** Overrides the map's own copy. */\n\t\tstrings?: StringsProp<MapStrings>\n}) {\n\t\tconst strings = useStrings(defaultMapStrings, stringsProp)\n\t\tconst focusCleanup = useRef<(() => void) | null>(null)\n\t\tconst handleMapRef = useCallback((map: LeafletMap | null) => {\n\t\t\tfocusCleanup.current?.()\n\t\t\tfocusCleanup.current = null\n\t\t\tif (map?.options.keyboard) {\n\t\t\t\tconst container = map.getContainer()\n\t\t\t\t// Leaflet's keyboard mousedown handler uses plain focus and only\n\t\t\t\t// restores window scroll. Focus first without moving nested scrollers\n\t\t\t\t// so pointerup still lands on the marker pressed by pointerdown.\n\t\t\t\tconst focusWithoutScroll = () => {\n\t\t\t\t\tif (document.activeElement !== container) container.focus({ preventScroll: true })\n\t\t\t\t}\n\t\t\t\tcontainer.addEventListener(\"mousedown\", focusWithoutScroll, true)\n\t\t\t\tfocusCleanup.current = () => container.removeEventListener(\"mousedown\", focusWithoutScroll, true)\n\t\t\t}\n\t\t\tassignRef(ref, map)\n\t\t}, [ref])\n\t\t// Keep the optional runtime outside the server tree.\n\t\tconst [isMounted, setIsMounted] = useState(false)\n\t\tuseEffect(() => { setIsMounted(true) }, [])\n\t\tif (!isMounted) return null\n\t\treturn (\n\t\t\t\t<Suspense>\n\t\t\t\t<ReactLeafletRuntime>\n\t\t\t\t<LeafletMapContainer\n\t\t\t\t\t\tref={handleMapRef}\n\t\t\t\t\t\tzoom={zoom}\n\t\t\t\t\t\tmaxZoom={maxZoom}\n\t\t\t\t\t\tattributionControl={false}\n\t\t\t\t\t\tzoomControl={false}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t// The themed background lives in `map.css`: Leaflet's own\n\t\t\t\t\t\t\t\t// `.leaflet-container { background: #ddd }` is unlayered, so it beats a\n\t\t\t\t\t\t\t\t// `bg-muted` utility on this element regardless of import order.\n\t\t\t\t\t\t\t\t'map--component',\n\t\t\t\t\t\t\t\t\"z-50 size-full min-h-0 flex-1 rounded-surface\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t<MapStringsContext.Provider value={strings}>\n\t\t\t\t\t\t\t\t<ReactLeafletHooksProvider>{children}</ReactLeafletHooksProvider>\n\t\t\t\t\t\t</MapStringsContext.Provider>\n\t\t\t\t</LeafletMapContainer>\n\t\t\t\t</ReactLeafletRuntime>\n\t\t\t\t</Suspense>\n\t\t)\n}\n\ninterface MapTileLayerOption {\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname: string\n\t\t/** Tile URL template. */\n\t\turl: string\n\t\t/** Attribution shown for the tile layer. */\n\t\tattribution?: string\n}\n\ninterface MapLayerGroupOption\n\t\textends Pick<React.ComponentProps<typeof DropdownMenuCheckboxItem>, \"disabled\"> {\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname: string\n}\n\ninterface MapLayersContextType {\n\t\tregisterTileLayer: (layer: MapTileLayerOption) => void\n\t\ttileLayers: MapTileLayerOption[]\n\t\tselectedTileLayer: string\n\t\tsetSelectedTileLayer: (name: string) => void\n\t\tregisterLayerGroup: (layer: MapLayerGroupOption) => void\n\t\tlayerGroups: MapLayerGroupOption[]\n\t\tactiveLayerGroups: string[]\n\t\tsetActiveLayerGroups: (names: string[]) => void\n}\n\nconst MapLayersContext = createContext<MapLayersContextType | null>(null)\n\nfunction useMapLayersContext() {\n\t\treturn useContext(MapLayersContext)\n}\n\nfunction MapTileLayer({\n\t\tname: nameProp,\n\t\turl,\n\t\tattribution,\n\t\tdarkUrl,\n\t\tdarkAttribution,\n\t\t...props\n}: Partial<TileLayerProps> & {\n\t\t/** Display name for the layer in the layer control. */\n\t\tname?: string\n\t\t/** Tile URL used when the dark theme is active. */\n\t\tdarkUrl?: string\n\t\t/** Attribution shown for the dark tile layer. */\n\t\tdarkAttribution?: string\n\t\tref?: Ref<TileLayer>\n}) {\n\t\tconst strings = useMapStrings()\n\t\tconst name = nameProp ?? strings.defaultTileLayer\n\t\tconst map = useLeafletMap()\n\t\tif (map.attributionControl) {\n\t\t\t\tmap.attributionControl.setPrefix(\"\")\n\t\t}\n\n\t\tconst context = useContext(MapLayersContext)\n\t\tconst DEFAULT_URL =\n\t\t\t\t\"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\"\n\t\tconst DEFAULT_DARK_URL =\n\t\t\t\t\"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\"\n\n\t\tconst resolvedTheme = useMapColorScheme(map.getContainer())\n\t\tconst resolvedUrl =\n\t\t\t\tresolvedTheme === \"dark\"\n\t\t\t\t\t\t? (darkUrl ?? url ?? DEFAULT_DARK_URL)\n\t\t\t\t\t\t: (url ?? DEFAULT_URL)\n\t\tconst resolvedAttribution =\n\t\t\t\tresolvedTheme === \"dark\" && darkAttribution\n\t\t\t\t\t\t? darkAttribution\n\t\t\t\t\t\t: (attribution ??\n\t\t\t\t\t\t\t'&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>, &copy; <a href=\"https://carto.com/attributions\">CARTO</a>')\n\n\t\tuseEffect(() => {\n\t\t\t\tif (context) {\n\t\t\t\t\t\tcontext.registerTileLayer({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\turl: resolvedUrl,\n\t\t\t\t\t\t\t\tattribution: resolvedAttribution,\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t}, [context, name, resolvedAttribution, resolvedUrl])\n\n\t\tif (context && context.selectedTileLayer !== name) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn (\n\t\t\t\t<LeafletTileLayer\n\t\t\t\t\t\turl={resolvedUrl}\n\t\t\t\t\t\tattribution={resolvedAttribution}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapLayerGroup({\n\t\tname,\n\t\tdisabled,\n\t\t...props\n}: LayerGroupProps & MapLayerGroupOption & { ref?: Ref<LayerGroup> }) {\n\t\tconst context = useMapLayersContext()\n\n\t\tuseEffect(() => {\n\t\t\t\tif (context) {\n\t\t\t\t\t\tcontext.registerLayerGroup({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t}, [context, name, disabled])\n\n\t\tif (context && !context.activeLayerGroups.includes(name)) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn <LeafletLayerGroup {...props} />\n}\n\nfunction MapFeatureGroup({\n\t\tname,\n\t\tdisabled,\n\t\t...props\n}: LayerGroupProps & MapLayerGroupOption & { ref?: Ref<FeatureGroup> }) {\n\t\tconst context = useMapLayersContext()\n\n\t\tuseEffect(() => {\n\t\t\t\tif (context) {\n\t\t\t\t\t\tcontext.registerLayerGroup({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t}, [context, name, disabled])\n\n\t\tif (context && !context.activeLayerGroups.includes(name)) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn <LeafletFeatureGroup {...props} />\n}\n\nfunction MapLayers({\n\t\tdefaultTileLayer,\n\t\tdefaultLayerGroups = [],\n\t\t...props\n}: Omit<React.ComponentProps<typeof MapLayersContext.Provider>, \"value\"> & {\n\t\t/** Name of the tile layer shown first. */\n\t\tdefaultTileLayer?: string\n\t\t/** Names of the overlay groups shown first. */\n\t\tdefaultLayerGroups?: string[]\n}) {\n\t\tconst [tileLayers, setTileLayers] = useState<MapTileLayerOption[]>([])\n\t\tconst [selectedTileLayer, setSelectedTileLayer] = useState<string>(\n\t\t\t\tdefaultTileLayer || \"\"\n\t\t)\n\t\tconst [layerGroups, setLayerGroups] = useState<MapLayerGroupOption[]>([])\n\t\tconst [activeLayerGroups, setActiveLayerGroups] =\n\t\t\t\tuseState<string[]>(defaultLayerGroups)\n\n\t\tfunction registerTileLayer(tileLayer: MapTileLayerOption) {\n\t\t\t\tsetTileLayers((prevTileLayers) => {\n\t\t\t\t\t\tif (prevTileLayers.some((layer) => layer.name === tileLayer.name)) {\n\t\t\t\t\t\t\t\treturn prevTileLayers\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [...prevTileLayers, tileLayer]\n\t\t\t\t})\n\t\t}\n\n\t\tfunction registerLayerGroup(layerGroup: MapLayerGroupOption) {\n\t\t\t\tsetLayerGroups((prevLayerGroups) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tprevLayerGroups.some((group) => group.name === layerGroup.name)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn prevLayerGroups\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [...prevLayerGroups, layerGroup]\n\t\t\t\t})\n\t\t}\n\n\t\tuseEffect(() => {\n\t\t\t\t// Error: Invalid defaultValue\n\t\t\t\tif (\n\t\t\t\t\t\tdefaultTileLayer &&\n\t\t\t\t\t\ttileLayers.length > 0 &&\n\t\t\t\t\t\t!tileLayers.some((tileLayer) => tileLayer.name === defaultTileLayer)\n\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Invalid defaultTileLayer \"${defaultTileLayer}\" provided to MapLayers. It must match a MapTileLayer's name prop.`\n\t\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Set initial selected tile layer\n\t\t\t\tif (tileLayers.length > 0 && !selectedTileLayer) {\n\t\t\t\t\t\tconst validDefaultValue =\n\t\t\t\t\t\t\t\tdefaultTileLayer &&\n\t\t\t\t\t\t\t\ttileLayers.some((layer) => layer.name === defaultTileLayer)\n\t\t\t\t\t\t\t\t\t\t? defaultTileLayer\n\t\t\t\t\t\t\t\t\t\t: tileLayers[0].name\n\t\t\t\t\t\tsetSelectedTileLayer(validDefaultValue)\n\t\t\t\t}\n\n\t\t\t\t// Error: Invalid defaultActiveLayerGroups\n\t\t\t\tif (\n\t\t\t\t\t\tdefaultLayerGroups.length > 0 &&\n\t\t\t\t\t\tlayerGroups.length > 0 &&\n\t\t\t\t\t\tdefaultLayerGroups.some(\n\t\t\t\t\t\t\t\t(name) => !layerGroups.some((group) => group.name === name)\n\t\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Invalid defaultLayerGroups value provided to MapLayers. All names must match a MapLayerGroup's name prop.`\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t}, [\n\t\t\t\ttileLayers,\n\t\t\t\tdefaultTileLayer,\n\t\t\t\tselectedTileLayer,\n\t\t\t\tlayerGroups,\n\t\t\t\tdefaultLayerGroups,\n\t\t])\n\n\t\treturn (\n\t\t\t\t<MapLayersContext.Provider\n\t\t\t\t\t\tvalue={{\n\t\t\t\t\t\t\t\tregisterTileLayer,\n\t\t\t\t\t\t\t\ttileLayers,\n\t\t\t\t\t\t\t\tselectedTileLayer,\n\t\t\t\t\t\t\t\tsetSelectedTileLayer,\n\t\t\t\t\t\t\t\tregisterLayerGroup,\n\t\t\t\t\t\t\t\tlayerGroups,\n\t\t\t\t\t\t\t\tactiveLayerGroups,\n\t\t\t\t\t\t\t\tsetActiveLayerGroups,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapLayersControl({\n\t\ttileLayersLabel,\n\t\tlayerGroupsLabel,\n\t\tposition = \"top-1 right-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\t/** Heading for the tile-layer group in the layer control. */\n\t\ttileLayersLabel?: string\n\t\t/** Heading for the overlay group in the layer control. */\n\t\tlayerGroupsLabel?: string\n\t\t/** Corner the control is anchored to. */\n\t\tposition?: string\n}) {\n\t\tconst strings = useMapStrings()\n\t\tconst layersContext = useMapLayersContext()\n\t\tif (!layersContext) {\n\t\t\t\tthrow new Error(\"MapLayersControl must be used within MapLayers\")\n\t\t}\n\n\t\tconst {\n\t\t\t\ttileLayers,\n\t\t\t\tselectedTileLayer,\n\t\t\t\tsetSelectedTileLayer,\n\t\t\t\tlayerGroups,\n\t\t\t\tactiveLayerGroups,\n\t\t\t\tsetActiveLayerGroups,\n\t\t} = layersContext\n\n\t\tif (tileLayers.length === 0 && layerGroups.length === 0) {\n\t\t\t\treturn null\n\t\t}\n\n\t\tfunction handleLayerGroupToggle(name: string, checked: boolean) {\n\t\t\t\tsetActiveLayerGroups(\n\t\t\t\t\t\tchecked\n\t\t\t\t\t\t\t\t? [...activeLayerGroups, name]\n\t\t\t\t\t\t\t\t: activeLayerGroups.filter((groupName) => groupName !== name)\n\t\t\t\t)\n\t\t}\n\n\t\tconst showTileLayersDropdown = tileLayers.length > 1\n\t\tconst showLayerGroupsDropdown = layerGroups.length > 0\n\n\t\tif (!showTileLayersDropdown && !showLayerGroupsDropdown) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn (\n\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t<DropdownMenuTrigger\n\t\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.selectLayers}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={strings.selectLayers}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmapControlSurface,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"absolute z-1000\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerProps.className\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<LayersIcon />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DropdownMenuContent align=\"end\" className=\"z-1000\">\n\t\t\t\t\t\t\t\t{!!showTileLayersDropdown && <>\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={selectedTileLayer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonValueChange={setSelectedTileLayer}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuLabel>{tileLayersLabel ?? strings.mapType}</DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tileLayers.map((tileLayer) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={tileLayer.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={tileLayer.name}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tileLayer.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t\t\t\t\t\t</>}\n\t\t\t\t\t\t\t\t{!!showTileLayersDropdown && !!showLayerGroupsDropdown && <DropdownMenuSeparator />}\n\t\t\t\t\t\t\t\t{!!showLayerGroupsDropdown && (\n\t\t\t\t\t\t\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{layerGroupsLabel ?? strings.layers}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{layerGroups.map((layerGroup) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuCheckboxItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={layerGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={activeLayerGroups.includes(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayerGroup.name\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={layerGroup.disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleLayerGroupToggle(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayerGroup.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{layerGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuCheckboxItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</DropdownMenuGroup>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t</DropdownMenu>\n\t\t)\n}\n\nfunction MapMarker({\n\t\ticon = <MapPinIcon className=\"size-icon-lg fill-background text-foreground\" />,\n\t\ticonAnchor = [12, 12],\n\t\tbgPos,\n\t\tpopupAnchor,\n\t\ttooltipAnchor,\n\t\tariaLabel,\n\t\tref,\n\t\t...props\n}: Omit<MarkerProps, \"icon\"> &\n\t\tPick<\n\t\t\t\tDivIconOptions,\n\t\t\t\t\"iconAnchor\" | \"bgPos\" | \"popupAnchor\" | \"tooltipAnchor\"\n\t\t> & {\n\t\t\t\ticon?: ReactNode\n\t\t\t\tariaLabel?: string\n\t\t\t\tref?: Ref<Marker>\n\t\t}) {\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst markerRef = useRef<Marker | null>(null)\n\t\tconst resolvedAriaLabel =\n\t\t\t\tariaLabel ??\n\t\t\t\t(typeof props.title === \"string\" && props.title.trim()\n\t\t\t\t\t\t? props.title\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\tstrings.marker\n\t\tconst resolvedTitle =\n\t\t\t\ttypeof props.title === \"string\" && props.title.trim()\n\t\t\t\t\t\t? props.title\n\t\t\t\t\t\t: resolvedAriaLabel\n\t\tconst syncMarkerElement = useCallback(\n\t\t\t\t(marker: Marker | null) => {\n\t\t\t\t\t\tconst element = marker?.getElement()\n\t\t\t\t\t\tif (!element) return\n\n\t\t\t\t\t\telement.setAttribute(\"aria-label\", resolvedAriaLabel)\n\t\t\t\t\t\tif (!element.getAttribute(\"title\")) {\n\t\t\t\t\t\t\t\telement.setAttribute(\"title\", resolvedAriaLabel)\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[resolvedAriaLabel]\n\t\t)\n\t\tconst handleMarkerRef = useCallback(\n\t\t\t\t(marker: Marker | null) => {\n\t\t\t\t\t\tmarkerRef.current = marker\n\t\t\t\t\t\tassignRef(ref, marker)\n\t\t\t\t\t\tsyncMarkerElement(marker)\n\t\t\t\t},\n\t\t\t\t[ref, syncMarkerElement]\n\t\t)\n\n\t\tuseEffect(() => {\n\t\t\t\tsyncMarkerElement(markerRef.current)\n\t\t}, [syncMarkerElement])\n\n\t\tif (!L) return null\n\n\t\treturn (\n\t\t\t\t<LeafletMarker\n\t\t\t\t\t\tref={handleMarkerRef}\n\t\t\t\t\t\ticon={L.divIcon({\n\t\t\t\t\t\t\t\t// Empty className stops leaflet's default `.leaflet-div-icon`\n\t\t\t\t\t\t\t\t// (white background + grey border rectangle) from being applied\n\t\t\t\t\t\t\t\t// around our SVG marker.\n\t\t\t\t\t\t\t\tclassName: \"\",\n\t\t\t\t\t\t\t\thtml: renderToString(icon),\n\t\t\t\t\t\t\t\ticonAnchor,\n\t\t\t\t\t\t\t\t...(bgPos ? { bgPos } : {}),\n\t\t\t\t\t\t\t\t...(popupAnchor ? { popupAnchor } : {}),\n\t\t\t\t\t\t\t\t...(tooltipAnchor ? { tooltipAnchor } : {}),\n\t\t\t\t\t\t})}\n\t\t\t\t\t\triseOnHover\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\ttitle={resolvedTitle}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapMarkerClusterGroup({\n\t\tpolygonOptions = {\n\t\t\t\tclassName: \"fill-foreground stroke-foreground stroke-2\",\n\t\t},\n\t\tspiderLegPolylineOptions = {\n\t\t\t\tclassName: \"fill-foreground stroke-foreground stroke-2\",\n\t\t},\n\t\ticon,\n\t\t...props\n}: Omit<MarkerClusterGroupProps, \"iconCreateFunction\"> & {\n\t\tchildren: ReactNode\n\t\t/** Marker glyph. */\n\t\ticon?: (markerCount: number) => ReactNode\n}) {\n\t\tconst { L } = useLeaflet()\n\t\tif (!L) return null\n\n\t\tconst iconCreateFunction = icon\n\t\t\t\t? (cluster: MarkerCluster) => {\n\t\t\t\t\t\t\tconst markerCount = cluster.getChildCount()\n\t\t\t\t\t\t\tconst iconNode = icon(markerCount)\n\t\t\t\t\t\t\treturn L.divIcon({\n\t\t\t\t\t\t\t\t\thtml: renderToString(iconNode),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\treturn (\n\t\t\t\t<LeafletMarkerClusterGroup\n\t\t\t\t\t\tpolygonOptions={polygonOptions}\n\t\t\t\t\t\tspiderLegPolylineOptions={spiderLegPolylineOptions}\n\t\t\t\t\t\ticonCreateFunction={iconCreateFunction}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapCircle({\n\t\tclassName,\n\t\t...props\n}: CircleProps & { ref?: Ref<Circle> }) {\n\t\treturn (\n\t\t\t\t<LeafletCircle\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapCircleMarker({\n\t\tclassName,\n\t\t...props\n}: CircleMarkerProps & { ref?: Ref<CircleMarker> }) {\n\t\treturn (\n\t\t\t\t<LeafletCircleMarker\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPolyline({\n\t\tclassName,\n\t\t...props\n}: PolylineProps & { ref?: Ref<Polyline> }) {\n\t\treturn (\n\t\t\t\t<LeafletPolyline\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPolygon({\n\t\tclassName,\n\t\t...props\n}: PolygonProps & { ref?: Ref<Polygon> }) {\n\t\treturn (\n\t\t\t\t<LeafletPolygon\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapRectangle({\n\t\tclassName,\n\t\t...props\n}: RectangleProps & { ref?: Ref<Rectangle> }) {\n\t\treturn (\n\t\t\t\t<LeafletRectangle\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPopup({\n\t\tclassName,\n\t\t...props\n}: Omit<PopupProps, \"content\"> & { ref?: Ref<Popup> }) {\n\t\treturn (\n\t\t\t\t<LeafletPopup\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"map-popup--component\",\n\t\t\t\t\t\t\t\t// The shared anchored-surface chrome and display inset; Leaflet positions it.\n\t\t\t\t\t\t\t\tpopoverRecipes.surface,\n\t\t\t\t\t\t\t\tpopoverRecipes.display,\n\t\t\t\t\t\t\t\tlayerRecipes.overlay,\n\t\t\t\t\t\t\t\t\"animate-in fade-out-0 fade-in-0 zoom-out-95 zoom-in-95 slide-in-from-bottom-2 w-72 font-sans outline-hidden\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapTooltip({\n\t\tclassName,\n\t\tchildren,\n\t\tside = \"top\",\n\t\tsideOffset = 15,\n\t\t...props\n}: Omit<TooltipProps, \"offset\"> & {\n\t\t/** Which side of the trigger the surface opens on. */\n\t\tside?: \"top\" | \"right\" | \"bottom\" | \"left\"\n\t\t/** Distance from the trigger, in pixels. */\n\t\tsideOffset?: number\n\t\tref?: Ref<Tooltip>\n}) {\n\t\tconst ARROW_POSITION_CLASSES = {\n\t\t\t\ttop: \"bottom-0.5 left-1/2 -translate-x-1/2 translate-y-1/2\",\n\t\t\t\tbottom: \"top-0.5 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\tleft: \"right-0.5 top-1/2 translate-x-1/2 -translate-y-1/2\",\n\t\t\t\tright: \"left-0.5 top-1/2 -translate-x-1/2 -translate-y-1/2\",\n\t\t}\n\t\tconst DEFAULT_OFFSET = {\n\t\t\t\ttop: [0, -sideOffset] satisfies PointExpression,\n\t\t\t\tbottom: [0, sideOffset] satisfies PointExpression,\n\t\t\t\tleft: [-sideOffset, 0] satisfies PointExpression,\n\t\t\t\tright: [sideOffset, 0] satisfies PointExpression,\n\t\t}\n\n\t\treturn (\n\t\t\t\t<LeafletTooltip\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"animate-in fade-in-0 zoom-in-95 fade-out-0 zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 w-fit text-xs text-balance transition-opacity\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tdata-side={side}\n\t\t\t\t\t\tdirection={side}\n\t\t\t\t\t\toffset={DEFAULT_OFFSET[side]}\n\t\t\t\t\t\topacity={1}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"bg-foreground fill-foreground absolute z-50 size-2.5 rotate-45 rounded-[2px]\",\n\t\t\t\t\t\t\t\t\t\tARROW_POSITION_CLASSES[side]\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t</LeafletTooltip>\n\t\t)\n}\n\nfunction MapZoomControl({\n\t\tposition = \"top-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"div\"> & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [zoomLevel, setZoomLevel] = useState(map.getZoom())\n\n\t\tuseLeafletMapEvents({\n\t\t\t\tzoomend: () => {\n\t\t\t\t\t\tsetZoomLevel(map.getZoom())\n\t\t\t\t},\n\t\t})\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<ButtonGroup\n\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\taria-label={strings.zoomControls}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.zoomIn}\n\t\t\t\t\t\t\t\t\t\ttitle={strings.zoomIn}\n\t\t\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t\t\tdisabled={zoomLevel >= map.getMaxZoom()}\n\t\t\t\t\t\t\t\t\t\tonClick={() => map.zoomIn()}>\n\t\t\t\t\t\t\t\t\t\t<PlusIcon />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.zoomOut}\n\t\t\t\t\t\t\t\t\t\ttitle={strings.zoomOut}\n\t\t\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t\t\tdisabled={zoomLevel <= map.getMinZoom()}\n\t\t\t\t\t\t\t\t\t\tonClick={() => map.zoomOut()}>\n\t\t\t\t\t\t\t\t\t\t<MinusIcon />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</ButtonGroup>\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapFullscreenControl({\n\t\tposition = \"top-1 right-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [isFullscreen, setIsFullscreen] = useState(false)\n\n\t\tconst { L } = useLeaflet()\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L) return\n\n\t\t\t\tconst fullscreenControl = new L.Control.FullScreen()\n\t\t\t\tfullscreenControl.addTo(map)\n\n\t\t\t\tconst container = fullscreenControl.getContainer()\n\t\t\t\tif (container) {\n\t\t\t\t\t\tcontainer.style.display = \"none\"\n\t\t\t\t}\n\n\t\t\t\tconst handleEnter = () => setIsFullscreen(true)\n\t\t\t\tconst handleExit = () => setIsFullscreen(false)\n\n\t\t\t\tmap.on(\"enterFullscreen\", handleEnter)\n\t\t\t\tmap.on(\"exitFullscreen\", handleExit)\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tfullscreenControl.remove()\n\t\t\t\t\t\tmap.off(\"enterFullscreen\", handleEnter)\n\t\t\t\t\t\tmap.off(\"exitFullscreen\", handleExit)\n\t\t\t\t}\n\t\t}, [L, map])\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\tonClick={() => map.toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\tisFullscreen ? strings.exitFullscreen : strings.enterFullscreen\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttitle={isFullscreen ? strings.exitFullscreen : strings.enterFullscreen}\n\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t{isFullscreen ? <MinimizeIcon /> : <MaximizeIcon />}\n\t\t\t\t\t\t</Button>\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapLocatePulseIcon() {\n\t\treturn (\n\t\t\t\t<div className=\"absolute -top-1 -right-1 flex size-icon-sm rounded-full\">\n\t\t\t\t\t\t<div className=\"bg-primary absolute inline-flex size-full animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t<div className=\"bg-primary relative inline-flex size-icon-sm rounded-full\" />\n\t\t\t\t</div>\n\t\t)\n}\n\nfunction MapLocateControl({\n\t\twatch = false,\n\t\tonLocationFound,\n\t\tonLocationError,\n\t\tposition = \"right-1 bottom-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> &\n\t\tPick<LocateOptions, \"watch\"> & {\n\t\t\t\tonLocationFound?: (location: LocationEvent) => void\n\t\t\t\tonLocationError?: (error: ErrorEvent) => void\n\t\t} & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [isLocating, setIsLocating] = useDelayedLoadingState(200)\n\t\tconst [location, setLocation] = useState<LatLngExpression | null>(null)\n\t\tconst hasLocation = location !== null\n\n\t\tconst startLocating = useCallback(() => {\n\t\t\t\tsetIsLocating(true)\n\t\t\t\tmap.locate({ setView: true, maxZoom: map.getMaxZoom(), watch })\n\t\t\t\tmap.on(\"locationfound\", (location: LocationEvent) => {\n\t\t\t\t\t\tsetLocation(location.latlng)\n\t\t\t\t\t\tsetIsLocating(false)\n\t\t\t\t\t\tonLocationFound?.(location)\n\t\t\t\t})\n\t\t\t\tmap.on(\"locationerror\", (error: ErrorEvent) => {\n\t\t\t\t\t\tsetLocation(null)\n\t\t\t\t\t\tsetIsLocating(false)\n\t\t\t\t\t\tonLocationError?.(error)\n\t\t\t\t})\n\t\t}, [map, onLocationError, onLocationFound, setIsLocating, watch])\n\n\t\tconst stopLocating = useCallback(() => {\n\t\t\t\tmap.stopLocate()\n\t\t\t\tmap.off(\"locationfound\")\n\t\t\t\tmap.off(\"locationerror\")\n\t\t\t\tsetLocation(null)\n\t\t\t\tsetIsLocating(false)\n\t\t}, [map, setIsLocating])\n\t\tconst trackingHandler = hasLocation ? stopLocating : startLocating\n\t\tconst trackingTitle = isLocating\n\t\t\t\t? strings.locating\n\t\t\t\t: hasLocation\n\t\t\t\t\t? strings.stopTracking\n\t\t\t\t\t: strings.trackLocation\n\t\tconst trackingAriaLabel = isLocating\n\t\t\t\t? strings.locating\n\t\t\t\t: hasLocation\n\t\t\t\t\t? strings.stopLocationTracking\n\t\t\t\t\t: strings.startLocationTracking\n\t\tconst locationMarker =\n\t\t\t\thasLocation && location ? (\n\t\t\t\t\t\t<MapMarker\n\t\t\t\t\t\t\t\tposition={location}\n\t\t\t\t\t\t\t\ticon={<MapLocatePulseIcon />}\n\t\t\t\t\t\t\t\tariaLabel={strings.currentLocation}\n\t\t\t\t\t\t/>\n\t\t\t\t) : null\n\n\t\tuseEffect(() => () => stopLocating(), [stopLocating])\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\ttone={hasLocation ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\t\t\tbuttonStyle={hasLocation ? \"solid\" : \"outline\"}\n\t\t\t\t\t\t\t\tonClick={trackingHandler}\n\t\t\t\t\t\t\t\tdisabled={isLocating}\n\t\t\t\t\t\t\t\ttitle={trackingTitle}\n\t\t\t\t\t\t\t\taria-label={trackingAriaLabel}\n\t\t\t\t\t\t\t\tclassName={hasLocation ? mapControlActiveSurface : mapControlSurface}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t{isLocating ? (\n\t\t\t\t\t\t\t\t\t\t<LoaderCircleIcon className=\"animate-spin\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<NavigationIcon />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{locationMarker}\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapSearchControl({\n\t\tposition = \"top-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: PlaceAutocompleteProps & { position?: string }) {\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(\"z-1001 w-60\", position, className)}>\n\t\t\t\t\t\t<PlaceAutocomplete {...props} />\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\ntype MapDrawShape = \"marker\" | \"polyline\" | \"circle\" | \"rectangle\" | \"polygon\"\ntype MapDrawAction = \"edit\" | \"delete\"\ntype MapDrawMode = MapDrawShape | MapDrawAction | null\ninterface MapDrawContextType {\n\t\treadonly featureGroup: L.FeatureGroup | null\n\t\tactiveMode: MapDrawMode\n\t\tsetActiveMode: (mode: MapDrawMode) => void\n\t\treadonly editControlRef: React.RefObject<EditToolbar.Edit | null>\n\t\treadonly deleteControlRef: React.RefObject<EditToolbar.Delete | null>\n\t\treadonly layersCount: number\n}\n\nconst MapDrawContext = createContext<MapDrawContextType | null>(null)\n\nfunction useMapDrawContext() {\n\t\treturn useContext(MapDrawContext)\n}\n\nfunction MapDrawControl({\n\t\tonLayersChange,\n\t\tposition = \"bottom-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"div\"> & {\n\t\tonLayersChange?: (layers: L.FeatureGroup) => void\n\t\t/** Corner the control is anchored to. */\n\t\tposition?: string\n}) {\n\t\tconst { L, LeafletDraw } = useLeaflet()\n\t\tconst map = useLeafletMap()\n\t\tconst featureGroupRef = useRef<L.FeatureGroup | null>(null)\n\t\tconst editControlRef = useRef<EditToolbar.Edit | null>(null)\n\t\tconst deleteControlRef = useRef<EditToolbar.Delete | null>(null)\n\t\tconst [activeMode, setActiveMode] = useState<MapDrawMode>(null)\n\t\tconst [layersCount, setLayersCount] = useState(0)\n\n\t\tconst updateLayersCount = useCallback(() => {\n\t\t\t\tif (featureGroupRef.current) {\n\t\t\t\t\t\tsetLayersCount(featureGroupRef.current.getLayers().length)\n\t\t\t\t}\n\t\t}, [])\n\n\t\tconst handleDrawCreated = useCallback((event: DrawEvents.Created) => {\n\t\t\t\tif (!featureGroupRef.current) return\n\t\t\t\tconst { layer } = event\n\t\t\t\tfeatureGroupRef.current.addLayer(layer)\n\t\t\t\tonLayersChange?.(featureGroupRef.current)\n\t\t\t\tupdateLayersCount()\n\t\t\t\tsetActiveMode(null)\n\t\t}, [onLayersChange, updateLayersCount])\n\n\t\tconst handleDrawEditedOrDeleted = useCallback(() => {\n\t\t\t\tif (!featureGroupRef.current) return\n\t\t\t\tonLayersChange?.(featureGroupRef.current)\n\t\t\t\tupdateLayersCount()\n\t\t\t\tsetActiveMode(null)\n\t\t}, [onLayersChange, updateLayersCount])\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !LeafletDraw || !map) return\n\n\t\t\t\tmap.on(\n\t\t\t\t\t\tL.Draw.Event.CREATED,\n\t\t\t\t\t\thandleDrawCreated as L.LeafletEventHandlerFn\n\t\t\t\t)\n\t\t\t\tmap.on(L.Draw.Event.EDITED, handleDrawEditedOrDeleted)\n\t\t\t\tmap.on(L.Draw.Event.DELETED, handleDrawEditedOrDeleted)\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tmap.off(\n\t\t\t\t\t\t\t\tL.Draw.Event.CREATED,\n\t\t\t\t\t\t\t\thandleDrawCreated as L.LeafletEventHandlerFn\n\t\t\t\t\t\t)\n\t\t\t\t\t\tmap.off(L.Draw.Event.EDITED, handleDrawEditedOrDeleted)\n\t\t\t\t\t\tmap.off(L.Draw.Event.DELETED, handleDrawEditedOrDeleted)\n\t\t\t\t}\n\t\t}, [L, LeafletDraw, map, handleDrawCreated, handleDrawEditedOrDeleted])\n\n\t\treturn (\n\t\t\t\t<MapDrawContext.Provider\n\t\t\t\t\t\tvalue={{\n\t\t\t\t\t\t\t\tfeatureGroup: featureGroupRef.current,\n\t\t\t\t\t\t\t\tactiveMode,\n\t\t\t\t\t\t\t\tsetActiveMode,\n\t\t\t\t\t\t\t\teditControlRef,\n\t\t\t\t\t\t\t\tdeleteControlRef,\n\t\t\t\t\t\t\t\tlayersCount,\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<LeafletFeatureGroup ref={featureGroupRef} />\n\t\t\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t\t\t<ButtonGroup orientation=\"vertical\" {...props} />\n\t\t\t\t\t\t</MapControlContainer>\n\t\t\t\t</MapDrawContext.Provider>\n\t\t)\n}\n\nfunction MapDrawShapeButton<T extends Draw.Feature>({\n\t\tdrawMode,\n\t\tcreateDrawTool,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\tdrawMode: MapDrawShape\n\t\tcreateDrawTool: (L: LeafletModule, map: DrawMap) => T\n}) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawShapeButton must be used within MapDrawControl\")\n\t\t}\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst map = useLeafletMap()\n\t\tconst controlRef = useRef<T | null>(null)\n\t\tconst { activeMode, setActiveMode } = drawContext\n\t\tconst isActive = activeMode === drawMode\n\t\tconst drawLabels: Record<MapDrawShape, string> = {\n\t\t\t\tmarker: strings.drawMarker,\n\t\t\t\tpolyline: strings.drawPolyline,\n\t\t\t\tcircle: strings.drawCircle,\n\t\t\t\trectangle: strings.drawRectangle,\n\t\t\t\tpolygon: strings.drawPolygon,\n\t\t}\n\t\tconst drawLabel = drawLabels[drawMode]\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !isActive) {\n\t\t\t\t\t\tcontrolRef.current?.disable()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst control = createDrawTool(L, map as DrawMap)\n\t\t\t\tcontrol.enable()\n\t\t\t\tcontrolRef.current = control\n\t\t\t\treturn () => {\n\t\t\t\t\t\tcontrol.disable()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t}\n\t\t}, [L, map, isActive, createDrawTool])\n\n\t\tfunction handleClick() {\n\t\t\t\tsetActiveMode(isActive ? null : drawMode)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\taria-label={drawLabel}\n\t\t\t\t\t\ttitle={drawLabel}\n\t\t\t\t\t\tclassName={cn(isActive ? mapControlActiveSurface : mapControlSurface, className)}\n\t\t\t\t\t\ttone={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\tbuttonStyle={isActive ? \"solid\" : \"outline\"}\n\t\t\t\t\t\tdisabled={activeMode === \"edit\" || activeMode === \"delete\"}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapDrawMarker({ ...props }: DrawOptions.MarkerOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"marker\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Marker(map, {\n\t\t\t\t\t\t\t\t\t\ticon: L.divIcon({\n\t\t\t\t\t\t\t\t\t\t\t\tclassName: \"\", // For fixing the moving bug when going in and out the edit mode\n\t\t\t\t\t\t\t\t\t\t\t\ticonAnchor: [12, 12],\n\t\t\t\t\t\t\t\t\t\t\t\thtml: renderToString(<MapPinIcon className=\"size-icon-lg\" />),\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<MapPinIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawPolyline({\n\t\tshowLength = false,\n\t\tdrawError = {\n\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t},\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.PolylineOptions) {\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"polyline\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Polyline(map, {\n\t\t\t\t\t\t\t\t\t\t...(mapDrawHandleIcon\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\tshowLength,\n\t\t\t\t\t\t\t\t\t\tdrawError,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<WaypointsIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawCircle({\n\t\tshowRadius = false,\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.CircleOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"circle\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Circle(map, {\n\t\t\t\t\t\t\t\t\t\tshowRadius,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<CircleIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawRectangle({\n\t\tshowArea = false,\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.RectangleOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"rectangle\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Rectangle(map, {\n\t\t\t\t\t\t\t\t\t\tshowArea,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<SquareIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawPolygon({\n\t\tdrawError = {\n\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t},\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.PolygonOptions) {\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"polygon\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Polygon(map, {\n\t\t\t\t\t\t\t\t\t\t...(mapDrawHandleIcon\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\tdrawError,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<PentagonIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawActionButton<T extends EditToolbar.Edit | EditToolbar.Delete>({\n\t\tdrawAction,\n\t\tcreateDrawTool,\n\t\tcontrolRef,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\tdrawAction: MapDrawAction\n\t\tcreateDrawTool: (\n\t\t\t\tL: LeafletModule,\n\t\t\t\tmap: DrawMap,\n\t\t\t\tfeatureGroup: L.FeatureGroup\n\t\t) => T\n\t\tcontrolRef: React.RefObject<T | null>\n}) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"MapDrawActionButton must be used within MapDrawControl\"\n\t\t\t\t)\n\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst map = useLeafletMap()\n\t\tconst { featureGroup, activeMode, setActiveMode, layersCount } = drawContext\n\t\tconst isActive = activeMode === drawAction\n\t\tconst hasFeatures = layersCount > 0\n\t\tconst actionLabel = drawAction === \"edit\" ? strings.editShapes : strings.removeShapes\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !featureGroup || !isActive) {\n\t\t\t\t\t\tcontrolRef.current?.disable?.()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst control = createDrawTool(L, map as DrawMap, featureGroup)\n\t\t\t\tcontrol.enable?.()\n\t\t\t\tcontrolRef.current = control\n\t\t\t\treturn () => {\n\t\t\t\t\t\tcontrol.disable?.()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t}\n\t\t}, [L, map, isActive, featureGroup, createDrawTool, controlRef])\n\n\t\tfunction handleClick() {\n\t\t\t\tcontrolRef.current?.save()\n\t\t\t\tsetActiveMode(isActive ? null : drawAction)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\taria-label={actionLabel}\n\t\t\t\t\t\ttitle={actionLabel}\n\t\t\t\t\t\ttone={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\tbuttonStyle={isActive ? \"solid\" : \"outline\"}\n\t\t\t\t\t\tdisabled={!hasFeatures}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tclassName={cn(isActive ? mapControlActiveSurface : mapControlSurface, className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapDrawEdit({\n\t\tselectedPathOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\tfillColor: \"var(--color-primary)\",\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: Omit<EditToolbar.EditHandlerOptions, \"featureGroup\">) {\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawEdit must be used within MapDrawControl\")\n\t\t}\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !mapDrawHandleIcon) return\n\n\t\t\t\tL.Edit.PolyVerticesEdit.mergeOptions({\n\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\tdrawError: {\n\t\t\t\t\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tL.Edit.SimpleShape.mergeOptions({\n\t\t\t\t\t\tmoveIcon: mapDrawHandleIcon,\n\t\t\t\t\t\tresizeIcon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchMoveIcon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchResizeIcon: mapDrawHandleIcon,\n\t\t\t\t})\n\t\t\t\tL.drawLocal.edit.handlers.edit.tooltip = {\n\t\t\t\t\t\ttext: strings.editInstructions,\n\t\t\t\t\t\tsubtext: \"\",\n\t\t\t\t}\n\t\t\t\tL.drawLocal.edit.handlers.remove.tooltip = {\n\t\t\t\t\t\ttext: strings.removeInstructions,\n\t\t\t\t}\n\t\t}, [L, mapDrawHandleIcon, strings.editInstructions, strings.removeInstructions])\n\n\t\treturn (\n\t\t\t\t<MapDrawActionButton\n\t\t\t\t\t\tdrawAction=\"edit\"\n\t\t\t\t\t\tcontrolRef={drawContext.editControlRef}\n\t\t\t\t\t\tcreateDrawTool={(L, map, featureGroup) =>\n\t\t\t\t\t\t\t\tnew L.EditToolbar.Edit(map, {\n\t\t\t\t\t\t\t\t\t\tfeatureGroup,\n\t\t\t\t\t\t\t\t\t\tselectedPathOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<PenLineIcon />\n\t\t\t\t</MapDrawActionButton>\n\t\t)\n}\n\nfunction MapDrawDelete() {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawDelete must be used within MapDrawControl\")\n\t\t}\n\n\t\treturn (\n\t\t\t\t<MapDrawActionButton\n\t\t\t\t\t\tdrawAction=\"delete\"\n\t\t\t\t\t\tcontrolRef={drawContext.deleteControlRef}\n\t\t\t\t\t\tcreateDrawTool={(L, map, featureGroup) =>\n\t\t\t\t\t\t\t\tnew L.EditToolbar.Delete(map, { featureGroup })\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<Trash2Icon />\n\t\t\t\t</MapDrawActionButton>\n\t\t)\n}\n\nfunction MapDrawUndo({ className, ...props }: React.ComponentProps<\"button\">) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext)\n\t\t\t\tthrow new Error(\"MapDrawUndo must be used within MapDrawControl\")\n\t\tconst strings = useMapStrings()\n\n\t\tconst {\n\t\t\t\tactiveMode,\n\t\t\t\tsetActiveMode,\n\t\t\t\teditControlRef,\n\t\t\t\tdeleteControlRef,\n\t\t\t\tlayersCount,\n\t\t} = drawContext\n\t\tconst isInEditMode = activeMode === \"edit\"\n\t\tconst isInDeleteMode = activeMode === \"delete\"\n\t\tconst isActive = (isInEditMode || isInDeleteMode) && layersCount > 0\n\t\tconst undoLabel = isInDeleteMode ? strings.undoRemove : strings.undoEdit\n\n\t\tfunction handleUndo() {\n\t\t\t\tif (isInEditMode) {\n\t\t\t\t\t\teditControlRef.current?.revertLayers()\n\t\t\t\t} else if (isInDeleteMode) {\n\t\t\t\t\t\tdeleteControlRef.current?.revertLayers()\n\t\t\t\t}\n\t\t\t\tsetActiveMode(null)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\taria-label={undoLabel}\n\t\t\t\t\t\ttitle={undoLabel}\n\t\t\t\t\t\tonClick={handleUndo}\n\t\t\t\t\t\tdisabled={!isActive}\n\t\t\t\t\t\tclassName={cn(mapControlSurface, className)}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t<Undo2Icon />\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapControlContainer({\n\t\tclassName,\n\t\t...props\n}: React.ComponentPropsWithoutRef<\"div\">) {\n\t\tconst { L } = useLeaflet()\n\t\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L) return\n\t\t\t\tconst element = containerRef.current\n\t\t\t\tif (!element) return\n\t\t\t\tL.DomEvent.disableClickPropagation(element)\n\t\t\t\tL.DomEvent.disableScrollPropagation(element)\n\t\t}, [L])\n\n\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\t\tref={containerRef}\n\t\t\t\t\t\tclassName={cn(\"absolute z-1000 size-fit cursor-default\", className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction useMapDrawHandleIcon() {\n\t\tconst { L } = useLeaflet()\n\t\tif (!L) return null\n\n\t\treturn L.divIcon({\n\t\t\t\ticonAnchor: [8, 8],\n\t\t\t\thtml: renderToString(\n\t\t\t\t\t\t<CircleIcon className=\"fill-primary-accent stroke-primary-accent size-icon transition-transform hover:scale-110\" />\n\t\t\t\t),\n\t\t})\n}\n\nfunction useLeaflet() {\n\t\tconst [L, setL] = useState<LeafletModule | null>(null)\n\t\tconst [LeafletDraw, setLeafletDraw] = useState<LeafletDrawModule | null>(\n\t\t\t\tnull\n\t\t)\n\n\t\tuseEffect(() => {\n\t\t\t\tasync function loadLeaflet() {\n\t\t\t\t\t\tconst leaflet = await import(\"leaflet\")\n\t\t\t\t\t\tconst leafletFullscreen = await import(\"leaflet.fullscreen\")\n\t\t\t\t\t\tconst leafletDraw = await import(\"leaflet-draw\")\n\n\t\t\t\t\t\tconst L_object = leaflet.default\n\t\t\t\t\t\tif (L_object.Control && !L_object.Control.FullScreen) {\n\t\t\t\t\t\t\t\tL_object.Control.FullScreen =\n\t\t\t\t\t\t\t\t\t\tleafletFullscreen.default || leafletFullscreen\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetLeafletDraw(leafletDraw)\n\t\t\t\t\t\tsetL(L_object)\n\t\t\t\t}\n\n\t\t\t\tif (L && LeafletDraw) return\n\t\t\t\tif (typeof window === \"undefined\") return\n\n\t\t\t\tvoid loadLeaflet()\n\t\t}, [L, LeafletDraw])\n\n\t\treturn { L, LeafletDraw }\n}\n\n/**\n * Delays the *appearance* of a loading indicator so a fast lookup never\n * flashes a spinner. Not a debounce: it neither collapses a burst of calls\n * nor defers the work itself, so `useDebouncedCallback` does not apply.\n */\nfunction useDelayedLoadingState(delay = 200) {\n\t\tconst [isLoading, setIsLoading] = useState(false)\n\t\tconst [showLoading, setShowLoading] = useState(false)\n\t\tconst timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n\t\tuseEffect(() => {\n\t\t\t\tif (isLoading) {\n\t\t\t\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\t\t\t\t\tsetShowLoading(true)\n\t\t\t\t\t\t}, delay)\n\t\t\t\t} else {\n\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t\t\t\t\t\ttimeoutRef.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetShowLoading(false)\n\t\t\t\t}\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}, [isLoading, delay])\n\n\t\treturn [showLoading, setIsLoading] as const\n}\n\nexport {\n\t\tMap,\n\t\tMapCircle,\n\t\tMapCircleMarker,\n\t\tMapControlContainer,\n\t\tMapDrawCircle,\n\t\tMapDrawControl,\n\t\tMapDrawDelete,\n\t\tMapDrawEdit,\n\t\tMapDrawMarker,\n\t\tMapDrawPolygon,\n\t\tMapDrawPolyline,\n\t\tMapDrawRectangle,\n\t\tMapDrawUndo,\n\t\tMapFeatureGroup,\n\t\tMapFullscreenControl,\n\t\tMapLayerGroup,\n\t\tMapLayers,\n\t\tMapLayersControl,\n\t\tMapLocateControl,\n\t\tMapMarker,\n\t\tMapMarkerClusterGroup,\n\t\tMapPolygon,\n\t\tMapPolyline,\n\t\tMapPopup,\n\t\tMapRectangle,\n\t\tMapSearchControl,\n\t\tMapTileLayer,\n\t\tMapTooltip,\n\t\tMapZoomControl,\n\t\tuseLeaflet,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA2EA,IAAM+B,KAA4D;CAChE,mBAAmB;CACnB,SAAS;CACT,OAAO;CACP,OAAO;CACP,WAAW;CACX,cAAc;AAChB;AAwDA,SAASC,GAAc,GAAoC;CACzD,IAAMC,IAAQ,CAAC;CA0Bf,OAxBIC,EAAW,QACbD,EAAM,KAAKC,EAAW,IAAI,GAGxBA,EAAW,eAAeA,EAAW,SACvCD,EAAM,KAAK,GAAGC,EAAW,YAAY,GAAGA,EAAW,QAAQ,IAClDA,EAAW,UACpBD,EAAM,KAAKC,EAAW,MAAM,GAG1BA,EAAW,OACbD,EAAM,KAAKC,EAAW,IAAI,IACjBA,EAAW,YACpBD,EAAM,KAAKC,EAAW,QAAQ,GAG5BA,EAAW,SAASA,EAAW,UAAUA,EAAW,QACtDD,EAAM,KAAKC,EAAW,KAAK,GAGzBA,EAAW,WACbD,EAAM,KAAKC,EAAW,OAAO,GAGxB,CAAC,GAAG,IAAI,IAAID,CAAK,CAAC,CAAC,CAAC,KAAK,IAAI;AACtC;AAEA,SAASE,GAAe,EACtB,UACA,SACA,SACA,QACA,UACA,sBACA,QACA,WACqB;CACrB,IAAMC,IAAM,IAAI,IAAI,8BAA8B;CA4BlD,OA3BAA,EAAI,aAAa,IAAI,KAAKC,CAAK,GAE3BC,KACFF,EAAI,aAAa,IAAI,QAAQE,CAAI,GAG/BC,KACFH,EAAI,aAAa,IAAI,SAAS,OAAOG,CAAK,CAAC,GAGzCC,KACFJ,EAAI,aAAa,IAAI,QAAQI,EAAK,KAAK,GAAG,CAAC,GAGzCC,MAAQ,KAAA,KAAaC,MAAQ,KAAA,MAC/BN,EAAI,aAAa,IAAI,OAAO,OAAOK,CAAG,CAAC,GACvCL,EAAI,aAAa,IAAI,OAAO,OAAOM,CAAG,CAAC,IAGrCC,MAAS,KAAA,KACXP,EAAI,aAAa,IAAI,QAAQ,OAAOO,CAAI,CAAC,GAGvCC,MAAsB,KAAA,KACxBR,EAAI,aAAa,IAAI,uBAAuB,OAAOQ,CAAiB,CAAC,GAGhE,OAAOR,CAAG;AACnB;AAEA,IAAMS,KAAoC,OAAO,GAAS,MAAW;CACnE,IAAMC,IAAW,MAAM,MAAMX,GAAeY,CAAO,GAAG,EAAE,UAAO,CAAC;CAChE,IAAI,CAACD,EAAS,IACZ,MAAU,MAAM,qBAAqBA,EAAS,OAAO,GAAGA,EAAS,YAAY;CAG/E,QAAO,MADoCA,EAAS,KAAK,EAAA,CAC7C;AACd;AAEA,SAASE,GAAe,EACtB,eACA,UACA,SACA,UACA,SACA,QACA,QACA,SACA,sBACA,kBAAeH,IACf,oBAKsB;CACtB,IAAM,CAACI,GAASC,KAAclD,EAAM,SAAyB,CAAC,CAAC,GACzD,CAACmD,GAAWC,KAAgBpD,EAAM,SAAS,EAAK,GAChD,CAACqD,GAAOC,KAAYtD,EAAM,SAAuB,IAAI,GACrD,CAACuD,GAAaC,KAAkBxD,EAAM,SAAS,EAAK,GACpD,CAACyD,GAAcC,KAAmB1D,EAAM,SAAS,CAAC,GAClD2D,IAAmB3D,EAAM,OAAO4D,CAAa;CACnD,EAAM,gBAAgB;EAAE,EAAiB,UAAUA;CAAc,GAAG,CAACA,CAAa,CAAC;CAEnF,IAAMC,IAAiBjC,EAAYS,GAAOyB,CAAU,GAE9CC,IAAUvB,GAAM,KAAK,GAAG;CA6C9B,OA3CAX,EAAM,gBAAgB;EAGpB,IAFAqB,GAAW,MAAWc,EAAQ,SAAS,CAAC,IAAIA,CAAO,GACnDV,EAAS,IAAI,GACT,CAACjB,EAAM,KAAK,KAAKA,MAAUwB,GAAgB;GAE7C,AADAT,EAAa,EAAK,GAClBI,EAAe,EAAK;GACpB;EACF;EAEA,IAAMS,IAAkB,IAAI,gBAAgB,GACtC,EAAE,cAAWA;EAEnB,AADAb,EAAa,EAAI,GACjBI,EAAe,EAAI;EAEnB,eAAeU,IAAe;GAC5B,IAAI;IACF,IAAMC,IAAW,MAAMC,EAAa;KAClC,OAAOP;KAAgB;KAAM;KAC7B,MAAME,IAAUA,EAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,IAAY,KAAA;KACzD;KAAK;KAAK;KAAM;IAClB,GAAGM,CAAM;IACT,IAAIA,EAAO,SAAS;IACpB,IAAMC,oBAAgB,IAAI,IAAY;IACtC,EAAWH,EAAS,QAAO,MAAW;KACpC,IAAMI,IAAKC,EAAQ,WAAW;KAG9B,OAFA,CAAIF,EAAc,IAAIC,CAAE,MACxBD,EAAc,IAAIC,CAAE,GACb;IACT,CAAC,CAAC;GACJ,SAASE,GAAK;IACZ,IAAIJ,EAAO,WAAYI,aAAe,SAASA,EAAI,SAAS,cAAe;IAC3E,IAAMC,IAAUD,aAAe,QAAQA,IAAU,MAAM,OAAOA,CAAG,CAAC;IAElE,AADAnB,EAASoB,CAAO,GAChBf,EAAiB,UAAUe,CAAO;GACpC,UAAU;IACR,AAAKL,EAAO,WAASjB,EAAa,EAAK;GACzC;EACF;EAGA,OADAc,EAAkB,SACLD,EAAgB,MAAM;CACrC,GAAG;EAAC5B;EAAOwB;EAAgBvB;EAAMC;EAAOwB;EAAStB;EAAKC;EAAKC;EAAMC;EAAmBwB;EAAcX;CAAY,CAAC,GAExG;EAAE;EAAS;EAAW;EAAO;EAAa,aAAaC,GAAgB,MAAWiB,IAAU,CAAC;CAAE;AACxG;AAEA,SAASC,GACP,GACA,GACA;CACA,OAAOC,EAAS,QAAQ,yBAAyB,GAAO,MAC/CC,EAAOC,MAAQC,CACvB;AACH;AAEA,SAASC,GAAkB,EACzB,gBAAA,KACA,SACA,WAAQ,GACR,SACA,QACA,QACA,SACA,sBACA,cACA,OAAOC,GACP,kBAAe,IACf,eAAeC,GACf,kBACA,oBACA,kBACA,kBACA,SAASC,IACT,SAASC,GACT,GAAGC,KACsB;CACzB,IAAMC,IAAUC,EAAWzD,IAAiCqD,EAAW,GACjE,CAACK,GAAeC,KAAoB1F,EAAM,SAAS2F,CAAY,GAC/D,CAACC,IAAaC,MAAkB7F,EAAM,SAAS,EAAE,GACjD,CAAC8F,IAAiBC,KAAsB/F,EAAM,SAAS,EAAK,GAC5D,CAACgG,GAAaC,KAAkBjG,EAAM,SAAS,EAAE,GACjDkG,KAASlG,EAAM,MAAM,GACrBmG,IAAYnG,EAAM,OAAuB,IAAI,GAC7CoG,KAAwEpG,EAAM,OAAO,IAAI,GACzFqG,IAAcrG,EAAM,uBAAO,IAAI,IAAyB,CAAC,GAEzDsG,IAAepB,MAAoB,KAAA,GACnCqB,KAAeD,IAAepB,IAAkBO,GAEhD,EAAE,YAAS,eAAW,UAAO,iBAAa,aAAUzC,GAAe;EACvE,OAAO4C;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEKY,KAAqBxG,EAAM,OAAOyG,CAAe;CAEvD,AADA5E,EAAM,gBAAgB;EAAE,GAAmB,UAAU4E;CAAgB,GAAG,CAACA,CAAe,CAAC,GACzF5E,EAAM,gBAAgB;EACpB,GAAmB,UAAUoB,CAAO;CACtC,GAAG,CAACA,CAAO,CAAC;CAEZ,IAAMyD,KACJnD,MAAe,CAACJ,MAAa,CAACE,KAASJ,EAAQ,WAAW,GACtD0D,KAAiB,GAAQtD,KAASqD,MAAgBzD,EAAQ,SAAS,IACnE2D,IAAkBD,MAAkB,CAACb,IACrCe,KAAe,MAA0B;EAC7C,IAAMC,IAAU9E,GAAcwC,EAAQ,UAAU;EAMhD,AALK8B,KAAcZ,EAAiBoB,CAAO,GAC3CjB,GAAe,EAAE,GACjBE,EAAmB,EAAI,GACvBE,EAAe,EAAE,GACjBd,IAA0B2B,CAAO,GACjCC,IAAgBvC,CAAO;CACzB;CAGA,OACE,kBAACnD,GAAD;EACE,OAAM;EACN,WAAW2F,EACT,iCAIA,0BACAC,CACF;EACA,OAAOjB,KAAe,IAAI,OAAO/C,EAAQ+C,EAAY,EAAE,WAAW,UAAU,EAAE,IAAI;EAClF,mBAAmB,MAAU;GAC5B,IAAMkB,EAAM,kBAAkB,kBAC9B;QAAIA,EAAM,QAAQ,SAASN,MAAoB,CAACvD,KAAS6D,EAAM,WAO9D,AAJAC,SAAgB;KAEf,AADApB,EAAmB,EAAI,GACvBE,EAAe,EAAE;IAClB,CAAC,GACDG,GAAkB,SAAS,QAAQ;SAC7B,IAAIc,EAAM,QAAQ,UAGxB,AAFAnB,EAAmB,EAAI,GACvBE,EAAe,EAAE,GACjBiB,EAAM,eAAe;SACf,IAAIjE,EAAQ,UAAU;KAAC;KAAa;KAAW;KAAQ;IAAK,CAAC,CAAC,SAASiE,EAAM,GAAG,GAAG;KACzF,EAAmB,EAAK;KACxB,IAAME,IAAOF,EAAM,QAAQ,SAAS,IAAIA,EAAM,QAAQ,QAAQjE,EAAQ,SAAS,IAAI+C,IAAc,IAAKkB,EAAM,QAAQ,cAAc,IAAIjE,EAAQ,SAAS,KAAM+C,KAAekB,EAAM,QAAQ,cAAc,IAAI,MAAMjE,EAAQ,UAAUA,EAAQ;KAE5O,AADAgD,EAAemB,CAAI,GACnBF,EAAM,eAAe;IACtB,OAAO,AAAIA,EAAM,QAAQ,WAAWN,KAAmB3D,EAAQ+C,OAC9Da,EAAY5D,EAAQ+C,EAAY,GAChCkB,EAAM,eAAe;GACtB;EACD;EACA,cAAc;EACd,MAAA;EACA,UAAA,kBAAC3F,GAAD;GACE,YAAY6E;GACZ,MAAMQ;GACN,eAAe,GAAM,MAAY;IAE/B,IAAI,CAACS,KAAQC,EAAQ,WAAW,eAAe,SAAS,kBAAkBnB,EAAU,SAAS,cAAc,OAAO,GAAG;KACnH,EAAQ,OAAO;KACf;IACF;IACA,AAAKkB,KAAMtB,EAAmB,EAAI;GACpC;GAVF,UAAA,CAYE,kBAAC,OAAD;IAAK,KAAKI;IAAW,WAAU;IAA/B,UAAA,CACE,kBAAC7E,GAAD;KACE,QAAQ,kBAAC,QAAD,CAAO,CAAA;KACf,cAAc;KACd,UAAU;KACV,eAAY;KACZ,WAAU;IACX,CAAA,GACD,kBAACG,GAAD;KAAY,WAAU;KAAtB,UAAA;MACE,kBAACE,IAAD,EAAA,UACE,kBAAC4F,IAAD,CAAa,CAAA,EACE,CAAA;MACjB,kBAAC7F,IAAD;OACE,MAAK;OACL,qBAAkB;OAClB,iBAAekF;OACf,iBAAeA,IAAkBV,KAAS,KAAA;OAC1C,yBAAuBU,KAAmB3D,EAAQ+C,OArE5C,MAAkBK,EAAY,QAAQ,IAAImB,CAAK,CAAC,EAAE,GAqES,CAASxB,CAAW,IAAI,KAAA;OACzF,aAAaT,EAAQ;OACrB,OAAOgB;OACP,WAAW,MAAU;QACnB,IAAMkB,IAAWP,EAAM,OAAO;QAO9B,AANKZ,KACHZ,EAAiB+B,CAAQ,GAE3B1B,EAAmB,EAAK,GACxBF,GAAe4B,CAAQ,GAC7BxB,EAAe,EAAE,GACXd,IAA0BsC,CAAQ;OACpC;OACA,UAAU,MAAU;QAElB,AADId,MAAgBZ,EAAmB,EAAK,GAC5CV,IAAe6B,CAAK;OACtB;OACA,GAAI5B;MACL,CAAA;MACA,CAAC,CAACnC,MACD,kBAACxB,IAAD;OAAiB,OAAM;OAAvB,UAAA,CACE,kBAAC+F,IAAD;QAAa,WAAU;QAAe,eAAY;OAAQ,CAAA,GAC1D,kBAACtH,GAAD;QAAM,KAAI;QAAO,MAAK;QAAU,WAAU;QACvC,UAAAmF,EAAQ;OACL,CAAA,CACS;;KAET;IACT,CAAA,CAAA;GACL,CAAA,GAAA,kBAAC/D,IAAD;IACE,cAAY+D,EAAQ;IACpB,OAAM;IACN,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,OAAM;IACN,WAAU;IAEV,UAAA,kBAACpE,GAAD;KAAa,IAAI+E;KAAQ,OAAOX,EAAQ;KAAmB,WAAU;KAArE,UAAA;MACG,CAAC,CAAClC,KACD,kBAACnC,GAAD,EAAA,UAAA,CACE,kBAACd,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,OAAM;OAAS,WAAU;OAClE,UAAAwE,GACCW,EAAQ,OACR,EAAE,SAASlC,EAAM,QAAQ,CAC3B;MACI,CAAA,GACN,kBAACsE,GAAD;OAAQ,aAAY;OAAQ,MAAK;OAAK,eAAe;QAAiF,AAA/ExB,EAAU,SAAS,cAAc,OAAO,CAAC,EAAE,MAAM,GAAGJ,EAAmB,EAAK,GAAG6B,EAAM;OAAE;OAC3I,UAAArC,EAAQ,SAASxD,GAAgC;MAC5C,CAAA,CACI,EAAA,CAAA;MAEf,CAAC,CAAC2E,MACD,kBAACxF,GAAD,EAAA,UACE,kBAACd,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,OAAM;OAAS,WAAU;OAClE,UAAAwE,GACCW,EAAQ,WACR,EAAE,OAAOgB,GAAa,CACxB;MACI,CAAA,EACM,CAAA;MAEftD,EAAQ,SAAS,KAChB,kBAAC7B,GAAD,EAAA,UACG6B,EAAQ,KAAK,GAAS,MAAU;OAC/B,IAAM4E,IAAmB7F,GACvBwC,EAAQ,UACV;OACA,OACE,kBAACvD,GAAD;QAEE,OAAO,OACLuD,EAAQ,WAAW,MACrB;QACA,MAAM,MAAS;SAAE,AAAIsD,IAAMzB,EAAY,QAAQ,IAAImB,GAAOM,CAAI,IAAQzB,EAAY,QAAQ,OAAOmB,CAAK;QAAE;QAC9G,gBAAgBX,EAAYrC,CAAO;QAN/B,UAAA,CAOE,kBAACuD,GAAD,CAAa,CAAA,GACb,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACE,kBAAC3H,GAAD;UAAM,KAAI;UAAO,QAAO;UACrB,UAAAoE,EAAQ,WAAW,QAClBA,EAAQ,WACL,UACHe,EAAQ;SACN,CAAA,GACN,kBAACnF,GAAD;UAAM,KAAI;UAAO,MAAK;UAAK,MAAK;UAC7B,UAAAyH;SACG,CAAA,CACH;QACM,CAAA,CAAA;OAlBN,GAAArD,EAAQ,WAAW,MAkBb;MAEjB,CAAC,EACW,CAAA;KAEL;;GACC,CAAA,CACT;;CACF,CAAA;AAEb;;;ACrhBA,SAAgBwD,EAAkB,GAAiD;CAClF,IAAMC,IAAOC,QAAkB;EAC9B,KAAI,IAAIJ,IAAKK,GAAUL,GAAK,IAAKA,EAAK,eAAe;GACpD,IAAGA,EAAK,UAAU,SAAS,MAAM,GAAG,OAAO;GAC3C,IAAGA,EAAK,UAAU,SAAS,OAAO,GAAG,OAAO;EAC7C;EACA,OAAO;CACR,GAAE,CAACK,CAAS,CAAC,GACPC,IAAYF,GAAa,MAAuB;EACrD,IAAMG,IAAS,IAAI,iBAAiBC,CAAM;EAC1C,KAAI,IAAIR,IAAKK,GAAUL,GAAK,IAAKA,EAAK,eAAe,EAAS,QAAQA,GAAK;GAAC,YAAW;GAAK,iBAAgB,CAAC,OAAO;EAAC,CAAC;EACtH,aAAaO,EAAS,WAAW;CAClC,GAAE,CAACF,CAAS,CAAC;CACb,OAAOI,GAAqBH,GAAUH,SAAS,OAAO;AACvD;;;ACwFA,IAAMO,IAAoBxB,EAAG,WAAW3G,EAAiB,IAAI,GACvDoI,KAA0BpI,EAAiB,MAO3CqI,KAA2BC,EAAwC,IAAI,GAiChEC,KAAgC;CAC3C,kBAAkB;CAClB,SAAS;CACT,QAAQ;CACR,cAAc;CACd,QAAQ;CACR,cAAc;CACd,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,eAAe;CACf,sBAAsB;CACtB,uBAAuB;CACvB,iBAAiB;CACjB,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,eAAe;CACf,aAAa;CACb,YAAY;CACZ,cAAc;CACd,UAAU;CACV,YAAY;CACZ,kBAAkB;CAClB,oBAAoB;AACtB,GAEMC,KAAoBF,EAA0BC,EAAiB;AAErE,SAASE,IAAgB;CACvB,OAAOC,EAAWF,EAAiB;AACrC;AAKA,IAAMG,KAA6BL,EAAyC,IAAI,GAC1EM,KAAsBC,GAAK,YAAY;CAC5C,IAAMC,IAAM,MAAM,OAAO;CACzB,OAAO,EAAE,UAAU,EAAE,kBACpB,kBAACH,GAA2B,UAA5B;EAAqC,OAAOG;EAAM;CAA8C,CAAA,EAC/F;AACH,CAAC;AAGD,SAASC,EAAqD,GAA4C;CACzG,QAAQ,MAAmC;EAC1C,IAAMC,IAAUN,EAAWC,EAA0B;EACrD,IAAI,CAACK,GAAS,MAAU,MAAM,6CAA6C;EAC3E,IAAMC,IAAYC,EAAOF,CAAO;EAChC,OAAO,kBAACC,GAAD,EAAW,GAAIhE,EAAQ,CAAA;CAC/B;AACD;AAEA,IAAMkE,KAAsBJ,GAAuB,MAAOD,EAAI,YAAY,GACpEM,KAAmBL,GAAuB,MAAOD,EAAI,SAAS,GAC9DO,KAAgBN,GAAuB,MAAOD,EAAI,MAAM,GACxDQ,KAAeP,GAAuB,MAAOD,EAAI,KAAK,GACtDS,KAAiBR,GAAuB,MAAOD,EAAI,OAAO,GAC1DU,KAAgBT,GAAuB,MAAOD,EAAI,MAAM,GACxDW,KAAsBV,GAAuB,MAAOD,EAAI,YAAY,GACpEY,KAAkBX,GAAuB,MAAOD,EAAI,QAAQ,GAC5Da,KAAiBZ,GAAuB,MAAOD,EAAI,OAAO,GAC1Dc,KAAmBb,GAAuB,MAAOD,EAAI,SAAS,GAC9De,KAAoBd,GAAuB,MAAOD,EAAI,UAAU,GAChEgB,KAAsBf,GAAuB,MAAOD,EAAI,YAAY;AAE1E,SAASiB,GAAkD,GAAwC;CAClG,IAAMd,IAAYJ,GAAKmB,CAAO;CAC9B,QAAQ,MAAmC,kBAACC,IAAD,EAAA,UAAU,kBAAChB,GAAD,EAAW,GAAIhE,EAAQ,CAAA,EAAW,CAAA;AACxF;AACA,IAAMiF,KAA4BH,GAAoB,YACrD,OAAO,8BAA8B,CAAC,MAAK,OAAQ,EAAE,SAASjB,EAAI,QAAQ,EAAE,CAC7E;AAEA,SAASqB,GAA0B,EAAE,eAAsC;CAC1E,IAAMrB,IAAMJ,EAAWC,EAA0B;CACjD,IAAI,CAACG,GAAK,MAAU,MAAM,2CAA2C;CACrE,OAAO,kBAACT,GAAyB,UAA1B;EAAmC,OAAOS;EAAM;CAA4C,CAAA;AACpG;AAEA,SAASsB,IAAgB;CACvB,IAAMC,IAAQ3B,EAAWL,EAAwB;CACjD,IAAI,CAACgC,GACH,MAAU,MAAM,2CAA2C;CAG7D,OAAOA,EAAM,OAAO;AACtB;AAEA,SAASC,GACP,GACA;CACA,IAAMD,IAAQ3B,EAAWL,EAAwB;CACjD,IAAI,CAACgC,GACH,MAAU,MAAM,2CAA2C;CAG7D,OAAOA,EAAM,aAAaE,CAAQ;AACpC;AAEA,SAASC,GAAa,GAAyB,GAAiB;CAC9D,IAAKC,GAEL;MAAI,OAAOA,KAAQ,YAAY;GAC7B,EAAIC,CAAK;GACT;EACF;EAEC,EAA0C,UAAUA;CAFrD;AAGF;AAEA,SAAS9K,GAAI,EACX,UAAO,IACP,aAAU,IACV,cACA,aACA,SAASmF,GACT,QACA,GAAGE,KAMF;CACD,IAAMC,IAAUC,EAAWoD,IAAmBxD,CAAW,GACnD6F,IAAeC,EAA4B,IAAI,GAC/CC,IAAejD,GAAa,MAA2B;EAG5D,IAFA+C,EAAa,UAAU,GACvB,EAAa,UAAU,MACnBG,GAAK,QAAQ,UAAU;GAC1B,IAAMjD,IAAYiD,EAAI,aAAa,GAI7BC,UAA2B;IAChC,AAAI,SAAS,kBAAkBlD,KAAWA,EAAU,MAAM,EAAE,eAAe,GAAK,CAAC;GAClF;GAEA,AADAA,EAAU,iBAAiB,aAAakD,GAAoB,EAAI,GAChE,EAAa,gBAAgBlD,EAAU,oBAAoB,aAAakD,GAAoB,EAAI;EACjG;EACA,GAAUP,GAAKM,CAAG;CACnB,GAAG,CAACN,CAAG,CAAC,GAEF,CAACQ,GAAWC,KAAgBC,EAAS,EAAK;CAGhD,OAFAC,QAAgB;EAAE,EAAa,EAAI;CAAE,GAAG,CAAC,CAAC,GACrCH,IAEH,kBAAChB,IAAD,EAAA,UACA,kBAACrB,IAAD,EAAA,UACA,kBAACO,IAAD;EACE,KAAK2B;EACC;EACG;EACT,oBAAoB;EACpB,aAAa;EACb,WAAWnE,EAIT,kBACA,iDACAC,CACF;EACA,GAAI3B;EACJ,UAAA,kBAACuD,GAAkB,UAAnB;GAA4B,OAAOtD;GACjC,UAAA,kBAACiF,IAAD,EAA4B,YAAoC,CAAA;EACtC,CAAA;CACT,CAAA,EACA,CAAA,EACX,CAAA,IAxBW;AA0BzB;AA4BA,IAAMkB,KAAmB/C,EAA2C,IAAI;AAExE,SAASgD,KAAsB;CAC7B,OAAO5C,EAAW2C,EAAgB;AACpC;AAEA,SAASE,GAAa,EACpB,MAAMC,GACN,QACA,gBACA,YACA,oBACA,GAAGvG,KASF;CACD,IAAMC,IAAUuD,EAAc,GACxBgD,IAAOD,KAAYtG,EAAQ,kBAC3B6F,IAAMX,EAAc;CAC1B,AAAIW,EAAI,sBACNA,EAAI,mBAAmB,UAAU,EAAE;CAGrC,IAAMW,IAAUhD,EAAW2C,EAAgB,GAMrCM,IAAgBhE,EAAkBoD,EAAI,aAAa,CAAC,GACpDa,IACJD,MAAkB,SACbE,KAAW9J,KAAO,+DAClBA,KAAO,+DACR+J,IACJH,MAAkB,UAAUI,IACxBA,IACCC,KACF;CAgBL,OAdAZ,QAAgB;EACd,AAAIM,KACFA,EAAQ,kBAAkB;GACxB;GACA,KAAKE;GACL,aAAaE;EACf,CAAC;CAEL,GAAG;EAACJ;EAASD;EAAMK;EAAqBF;CAAW,CAAC,GAEhDF,KAAWA,EAAQ,sBAAsBD,IACpC,OAIP,kBAACrC,IAAD;EACE,KAAKwC;EACL,aAAaE;EACb,GAAI7G;CACL,CAAA;AAEL;AAEA,SAASgH,GAAc,EACrB,SACA,aACA,GAAGhH,KACiE;CACpE,IAAMyG,IAAUJ,GAAoB;CAepC,OAbAF,QAAgB;EACd,AAAIM,KACFA,EAAQ,mBAAmB;GACzB;GACA;EACF,CAAC;CAEL,GAAG;EAACA;EAASD;EAAMS;CAAQ,CAAC,GAExBR,KAAW,CAACA,EAAQ,kBAAkB,SAASD,CAAI,IAC9C,OAGF,kBAAC5B,IAAD,EAAmB,GAAI5E,EAAQ,CAAA;AACxC;AAEA,SAASkH,GAAgB,EACvB,SACA,aACA,GAAGlH,KACmE;CACtE,IAAMyG,IAAUJ,GAAoB;CAepC,OAbAF,QAAgB;EACd,AAAIM,KACFA,EAAQ,mBAAmB;GACzB;GACA;EACF,CAAC;CAEL,GAAG;EAACA;EAASD;EAAMS;CAAQ,CAAC,GAExBR,KAAW,CAACA,EAAQ,kBAAkB,SAASD,CAAI,IAC9C,OAGF,kBAAC3B,IAAD,EAAqB,GAAI7E,EAAQ,CAAA;AAC1C;AAEA,SAASmH,GAAU,EACjB,qBACA,wBAAqB,CAAC,GACtB,GAAGnH,KAMF;CACD,IAAM,CAACoH,GAAYC,KAAiBnB,EAA+B,CAAC,CAAC,GAC/D,CAACoB,GAAmBC,KAAwBrB,EAChDsB,KAAoB,EACtB,GACM,CAACC,GAAaC,KAAkBxB,EAAgC,CAAC,CAAC,GAClE,CAACyB,GAAmBC,KACxB1B,EAAmB2B,CAAkB;CAEvC,SAASC,EAAkB,GAA+B;EACxD,GAAe,MACTC,EAAe,MAAM,MAAUC,EAAM,SAASC,EAAU,IAAI,IACvDF,IAEF,CAAC,GAAGA,GAAgBE,CAAS,CACrC;CACH;CAEA,SAASC,EAAmB,GAAiC;EAC3D,GAAgB,MAEZC,EAAgB,MAAM,MAAUC,EAAM,SAASC,EAAW,IAAI,IAEvDF,IAEF,CAAC,GAAGA,GAAiBE,CAAU,CACvC;CACH;CA4CA,OA1CAlC,QAAgB;EAEd,IACEqB,KACAJ,EAAW,SAAS,KACpB,CAACA,EAAW,MAAM,MAAca,EAAU,SAAST,CAAgB,GAEnE,MAAU,MACR,6BAA6BA,EAAiB,mEAChD;EAIF,IAAIJ,EAAW,SAAS,KAAK,CAACE,GAAmB;GAC/C,IAAMgB,IACJd,KACAJ,EAAW,MAAM,MAAUY,EAAM,SAASR,CAAgB,IACtDA,IACAJ,EAAW,EAAE,CAAC;GACpB,EAAqBkB,CAAiB;EACxC;EAGA,IACET,EAAmB,SAAS,KAC5BJ,EAAY,SAAS,KACrBI,EAAmB,MAChB,MAAS,CAACJ,EAAY,MAAM,MAAUW,EAAM,SAAS5B,CAAI,CAC5D,GAEA,MAAU,MACR,2GACF;CAEJ,GAAG;EACDY;EACAI;EACAF;EACAG;EACAI;CACF,CAAC,GAGC,kBAACzB,GAAiB,UAAlB;EACE,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,GAAIpG;CACL,CAAA;AAEL;AAEA,SAASuI,GAAiB,EACxB,oBACA,qBACA,cAAW,iBACX,cACA,GAAGvI,KAQF;CACD,IAAMC,IAAUuD,EAAc,GACxBgF,IAAgBnC,GAAoB;CAC1C,IAAI,CAACmC,GACH,MAAU,MAAM,gDAAgD;CAGlE,IAAM,EACJ,eACA,sBACA,yBACA,gBACA,sBACA,4BACEA;CAEJ,IAAIpB,EAAW,WAAW,KAAKK,EAAY,WAAW,GACpD,OAAO;CAGT,SAASgB,GAAuB,GAAc,GAAkB;EAC9D,EACEC,IACI,CAAC,GAAGf,GAAmBnB,CAAI,IAC3BmB,EAAkB,QAAQ,MAAcgB,MAAcnC,CAAI,CAChE;CACF;CAEA,IAAMoC,IAAyBxB,EAAW,SAAS,GAC7CyB,KAA0BpB,EAAY,SAAS;CAMrD,OAJI,CAACmB,KAA0B,CAACC,KACvB,OAIP,kBAACrN,GAAD,EAAA,UAAA,CACE,kBAACN,GAAD,EACE,SAAS,MACP,kBAACmH,GAAD;EACE,GAAIyG;EACJ,MAAK;EACL,MAAK;EACL,aAAY;EACZ,MAAK;EAAK,UAAA;EACV,cAAY7I,EAAQ;EACpB,OAAOA,EAAQ;EACf,WAAWyB,EACTwB,GACA,mBACA6F,GACApH,GACAmH,EAAa,SACf;EACA,GAAI9I;EAEJ,UAAA,kBAACgJ,GAAD,CAAa,CAAA;CACP,CAAA,EAEX,CAAA,GACD,kBAACzN,GAAD;EAAqB,OAAM;EAAM,WAAU;EAA3C,UAAA;GACG,CAAC,CAACqN,KAA0B,kBAAAhO,IAAA,EAAA,UACzB,kBAACQ,GAAD;IACE,OAAOkM;IACP,eAAeC;IAFjB,UAAA,CAGE,kBAACjM,GAAD,EAAA,UAAoB2N,KAAmBhJ,EAAQ,QAA2B,CAAA,GACzEmH,EAAW,KAAK,MACf,kBAAC3L,GAAD;KAEE,OAAOwM,EAAU;KAChB,UAAAA,EAAU;IACU,GAHhBA,EAAU,IAGM,CACxB,CACqB;GACxB,CAAA,EAAA,CAAA;GACH,CAAC,CAACW,KAA0B,CAAC,CAACC,MAA2B,kBAAC5N,GAAD,CAAwB,CAAA;GACjF,CAAC,CAAC4N,MACD,kBAAC1N,GAAD,EAAA,UAAA,CACE,kBAACG,GAAD,EAAA,UACG4N,KAAoBjJ,EAAQ,OACZ,CAAA,GAClBwH,EAAY,KAAK,MAChB,kBAACpM,GAAD;IAEE,SAASsM,EAAkB,SACzBU,EAAW,IACb;IACA,UAAUA,EAAW;IACrB,kBAAkB,MAChBI,GACEJ,EAAW,MACXK,CACF;IAED,UAAAL,EAAW;GACY,GAZnBA,EAAW,IAYQ,CAC3B,CACgB,EAAA,CAAA;EAEF;CACT,CAAA,CAAA,EAAA,CAAA;AAElB;AAEA,SAASc,GAAU,EACjB,UAAO,kBAAC1G,GAAD,EAAY,WAAU,+CAAgD,CAAA,GAC7E,gBAAa,CAAC,IAAI,EAAE,GACpB,UACA,gBACA,kBACA,cACA,QACA,GAAGzC,KASA;CACH,IAAM,EAAE,SAAMoJ,EAAW,GACnBnJ,IAAUuD,EAAc,GACxB6F,IAAYzD,EAAsB,IAAI,GACtC0D,IACJC,MACC,OAAOvJ,EAAM,SAAU,YAAYA,EAAM,MAAM,KAAK,IACjDA,EAAM,QACN,KAAA,MACJC,EAAQ,QACJuJ,IACJ,OAAOxJ,EAAM,SAAU,YAAYA,EAAM,MAAM,KAAK,IAChDA,EAAM,QACNsJ,GACAG,IAAoB7G,GACvB,MAA0B;EACzB,IAAM8G,IAAUC,GAAQ,WAAW;EACnC,AAAKD,MAELA,EAAQ,aAAa,cAAcJ,CAAiB,GAC/CI,EAAQ,aAAa,OAAO,KAC/BA,EAAQ,aAAa,SAASJ,CAAiB;CAEnD,GACA,CAACA,CAAiB,CACpB,GACMM,IAAkBhH,GACrB,MAA0B;EAGzB,AAFA,EAAU,UAAU+G,GACpBpE,GAAUC,GAAKmE,CAAM,GACrBF,EAAkBE,CAAM;CAC1B,GACA,CAACnE,GAAKiE,CAAiB,CACzB;CAQA,OANAtD,QAAgB;EACd,EAAkBkD,EAAU,OAAO;CACrC,GAAG,CAACI,CAAiB,CAAC,GAEjBI,IAGH,kBAACzF,IAAD;EACE,KAAKwF;EACL,MAAMC,EAAE,QAAQ;GAId,WAAW;GACX,MAAMC,EAAeC,CAAI;GACzB;GACA,GAAIC,IAAQ,EAAE,SAAM,IAAI,CAAC;GACzB,GAAIC,IAAc,EAAE,eAAY,IAAI,CAAC;GACrC,GAAIC,IAAgB,EAAE,iBAAc,IAAI,CAAC;EAC3C,CAAC;EACD,aAAA;EACA,GAAIlK;EACJ,OAAOwJ;CACR,CAAA,IAnBY;AAqBjB;AAEA,SAASW,GAAsB,EAC7B,oBAAiB,EACf,WAAW,6CACb,GACA,8BAA2B,EACzB,WAAW,6CACb,GACA,SACA,GAAGnK,KAKF;CACD,IAAM,EAAE,SAAMoJ,EAAW;CAazB,OAZKS,IAaH,kBAAC5E,IAAD;EACkB;EACU;EACN,oBAdG8E,KACtB,MAA2B;GAE3B,IAAMK,IAAWL,EADGM,EAAQ,cACN,CAAW;GACjC,OAAOR,EAAE,QAAQ,EACf,MAAMC,EAAeM,CAAQ,EAC/B,CAAC;EACH,IACC,KAAA;EAOA,GAAIpK;CACL,CAAA,IAlBY;AAoBjB;AAEA,SAASsK,GAAU,EACjB,cACA,GAAGtK,KACmC;CACtC,OACE,kBAACuE,IAAD;EACE,WAAW7C,EACT,8CACAC,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAASuK,GAAgB,EACvB,cACA,GAAGvK,KAC+C;CAClD,OACE,kBAACwE,IAAD;EACE,WAAW9C,EACT,8CACAC,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAASwK,GAAY,EACnB,cACA,GAAGxK,KACuC;CAC1C,OACE,kBAACyE,IAAD;EACE,WAAW/C,EACT,8CACAC,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAASyK,GAAW,EAClB,cACA,GAAGzK,KACqC;CACxC,OACE,kBAAC0E,IAAD;EACE,WAAWhD,EACT,8CACAC,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAAS0K,GAAa,EACpB,cACA,GAAG1K,KACyC;CAC5C,OACE,kBAAC2E,IAAD;EACE,WAAWjD,EACT,8CACAC,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAAS2K,GAAS,EAChB,cACA,GAAG3K,KACkD;CACrD,OACE,kBAACqE,IAAD;EACE,WAAW3C,EACT,wBAEA1G,EAAe,SACfA,EAAe,SACfU,EAAa,SACb,+GACAiG,CACF;EACA,GAAI3B;CACL,CAAA;AAEL;AAEA,SAAS4K,GAAW,EAClB,cACA,aACA,UAAO,OACP,gBAAa,IACb,GAAG5K,KAOF;CACD,IAAM6K,IAAyB;EAC7B,KAAK;EACL,QAAQ;EACR,MAAM;EACN,OAAO;CACT,GACMC,IAAiB;EACrB,KAAK,CAAC,GAAG,CAACC,CAAU;EACpB,QAAQ,CAAC,GAAGA,CAAU;EACtB,MAAM,CAAC,CAACA,GAAY,CAAC;EACrB,OAAO,CAACA,GAAY,CAAC;CACvB;CAEA,OACE,kBAACzG,IAAD;EACE,WAAW5C,EACT,kRACAC,CACF;EACA,aAAWqJ;EACX,WAAWA;EACX,QAAQF,EAAeE;EACvB,SAAS;EACT,GAAIhL;EATN,UAAA,CAUGiL,GACD,kBAAC,OAAD,EACE,WAAWvJ,EACT,gFACAmJ,EAAuBG,EACzB,EACD,CAAA,CACa;;AAEpB;AAEA,SAASE,GAAe,EACtB,cAAW,gBACX,cACA,GAAGlL,KACmD;CACtD,IAAM8F,IAAMX,EAAc,GACpBlF,IAAUuD,EAAc,GACxB,CAAC2H,GAAWC,KAAgBlF,EAASJ,EAAI,QAAQ,CAAC;CAQxD,OANAT,GAAoB,EAClB,eAAe;EACb,EAAaS,EAAI,QAAQ,CAAC;CAC5B,EACF,CAAC,GAGC,kBAACuF,GAAD;EAAqB,WAAW3J,EAAGqH,GAAUpH,CAAS;EACpD,UAAA,kBAAC9G,GAAD;GACE,aAAY;GACZ,cAAYoF,EAAQ;GACpB,GAAID;GAHN,UAAA,CAIE,kBAACqC,GAAD;IACE,MAAK;IACL,MAAK;IAAK,UAAA;IACV,MAAK;IACL,aAAY;IACZ,cAAYpC,EAAQ;IACpB,OAAOA,EAAQ;IACf,WAAWiD;IACX,UAAUiI,KAAarF,EAAI,WAAW;IACtC,eAAeA,EAAI,OAAO;IAC1B,UAAA,kBAACwF,IAAD,CAAW,CAAA;GACL,CAAA,GACR,kBAACjJ,GAAD;IACE,MAAK;IACL,MAAK;IAAK,UAAA;IACV,MAAK;IACL,aAAY;IACZ,cAAYpC,EAAQ;IACpB,OAAOA,EAAQ;IACf,WAAWiD;IACX,UAAUiI,KAAarF,EAAI,WAAW;IACtC,eAAeA,EAAI,QAAQ;IAC3B,UAAA,kBAACyF,GAAD,CAAY,CAAA;GACN,CAAA,CACG;;CACM,CAAA;AAEzB;AAEA,SAASC,GAAqB,EAC5B,cAAW,iBACX,cACA,GAAGxL,KACsD;CACzD,IAAM8F,IAAMX,EAAc,GACpBlF,IAAUuD,EAAc,GACxB,CAACiI,GAAcC,KAAmBxF,EAAS,EAAK,GAEhD,EAAE,SAAMkD,EAAW;CA0BzB,OAxBAjD,QAAgB;EACd,IAAI,CAAC0D,GAAG;EAER,IAAM8B,IAAoB,IAAI9B,EAAE,QAAQ,WAAW;EACnD,EAAkB,MAAM/D,CAAG;EAE3B,IAAMjD,IAAY8I,EAAkB,aAAa;EACjD,AAAI9I,MACF,EAAU,MAAM,UAAU;EAG5B,IAAM+I,UAAoBF,EAAgB,EAAI,GACxCG,UAAmBH,EAAgB,EAAK;EAK9C,OAHA5F,EAAI,GAAG,mBAAmB8F,CAAW,GACrC9F,EAAI,GAAG,kBAAkB+F,CAAU,SAEtB;GAGX,AAFAF,EAAkB,OAAO,GACzB7F,EAAI,IAAI,mBAAmB8F,CAAW,GACtC9F,EAAI,IAAI,kBAAkB+F,CAAU;EACtC;CACF,GAAG,CAAChC,GAAG/D,CAAG,CAAC,GAGT,kBAACuF,GAAD;EAAqB,WAAW3J,EAAGqH,GAAUpH,CAAS;EACpD,UAAA,kBAACU,GAAD;GACE,MAAK;GACL,MAAK;GAAK,UAAA;GACV,MAAK;GACL,aAAY;GACZ,eAAeyD,EAAI,iBAAiB;GACpC,cACE2F,IAAexL,EAAQ,iBAAiBA,EAAQ;GAElD,OAAOwL,IAAexL,EAAQ,iBAAiBA,EAAQ;GACvD,WAAWiD;GACX,GAAIlD;GACH,UAAe8L,EAAfL,IAAgBM,KAAmBC,GAApB,CAAe,CAAmB;EAC5C,CAAA;CACW,CAAA;AAEzB;AAEA,SAASC,KAAqB;CAC5B,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,iFAAkF,CAAA,GACjG,kBAAC,OAAD,EAAK,WAAU,4DAA6D,CAAA,CACzE;;AAET;AAEA,SAASC,GAAiB,EACxB,WAAQ,IACR,oBACA,oBACA,cAAW,oBACX,cACA,GAAGlM,KAKwB;CAC3B,IAAM8F,IAAMX,EAAc,GACpBlF,IAAUuD,EAAc,GACxB,CAAC2I,GAAYC,KAAiBC,GAAuB,GAAG,GACxD,CAACC,GAAUC,KAAerG,EAAkC,IAAI,GAChEsG,IAAcF,MAAa,MAE3BG,IAAgB7J,QAAkB;EAQtC,AAPAwJ,EAAc,EAAI,GAClBtG,EAAI,OAAO;GAAE,SAAS;GAAM,SAASA,EAAI,WAAW;GAAG;EAAM,CAAC,GAC9DA,EAAI,GAAG,kBAAkB,MAA4B;GAGnD,AAFAyG,EAAYD,EAAS,MAAM,GAC3BF,EAAc,EAAK,GACnBM,IAAkBJ,CAAQ;EAC5B,CAAC,GACDxG,EAAI,GAAG,kBAAkB,MAAsB;GAG7C,AAFAyG,EAAY,IAAI,GAChBH,EAAc,EAAK,GACnBO,IAAkB5O,CAAK;EACzB,CAAC;CACH,GAAG;EAAC+H;EAAK6G;EAAiBD;EAAiBN;EAAeQ;CAAK,CAAC,GAE1DC,IAAejK,QAAkB;EAKrC,AAJAkD,EAAI,WAAW,GACfA,EAAI,IAAI,eAAe,GACvBA,EAAI,IAAI,eAAe,GACvByG,EAAY,IAAI,GAChBH,EAAc,EAAK;CACrB,GAAG,CAACtG,GAAKsG,CAAa,CAAC,GACjBU,IAAkBN,IAAcK,IAAeJ,GAC/CM,IAAgBZ,IAClBlM,EAAQ,WACRuM,IACCvM,EAAQ,eACRA,EAAQ,eACP+M,IAAoBb,IACtBlM,EAAQ,WACRuM,IACCvM,EAAQ,uBACRA,EAAQ,uBACPgN,IACJT,KAAeF,IACb,kBAACnD,IAAD;EACE,UAAUmD;EACV,MAAM,kBAACL,IAAD,CAAqB,CAAA;EAC3B,WAAWhM,EAAQ;CACpB,CAAA,IACC;CAIN,OAFAkG,cAAsB0G,EAAa,GAAG,CAACA,CAAY,CAAC,GAGlD,kBAACxB,GAAD;EAAqB,WAAW3J,EAAGqH,GAAUpH,CAAS;EAAtD,UAAA,CACE,kBAACU,GAAD;GACE,MAAK;GACL,MAAK;GAAK,UAAA;GACV,MAAMmK,IAAc,YAAY;GAChC,aAAaA,IAAc,UAAU;GACrC,SAASM;GACT,UAAUX;GACV,OAAOY;GACP,cAAYC;GACZ,WAAWR,IAAcrJ,KAA0BD;GACnD,GAAIlD;GACH,UAAAmM,IACC,kBAACe,GAAD,EAAkB,WAAU,eAAgB,CAAA,IAE5C,kBAACC,IAAD,CAAiB,CAAA;EAEb,CAAA,GACPF,CACkB;;AAEzB;AAEA,SAASG,GAAiB,EACxB,cAAW,gBACX,cACA,GAAGpN,KAC8C;CACjD,OACE,kBAACqL,GAAD;EAAqB,WAAW3J,EAAG,eAAeqH,GAAUpH,CAAS;EACnE,UAAA,kBAAChC,IAAD,EAAmB,GAAIK,EAAQ,CAAA;CACZ,CAAA;AAEzB;AAcA,IAAMqN,KAAiBhK,EAAyC,IAAI;AAEpE,SAASiK,IAAoB;CAC3B,OAAO7J,EAAW4J,EAAc;AAClC;AAEA,SAASE,GAAe,EACtB,mBACA,cAAW,mBACX,cACA,GAAGvN,KAKF;CACD,IAAM,EAAE,MAAG,mBAAgBoJ,EAAW,GAChCtD,IAAMX,EAAc,GACpBqI,IAAkB5H,EAA8B,IAAI,GACpD6H,IAAiB7H,EAAgC,IAAI,GACrD8H,IAAmB9H,EAAkC,IAAI,GACzD,CAAC+H,GAAYC,KAAiB1H,EAAsB,IAAI,GACxD,CAAC2H,GAAaC,KAAkB5H,EAAS,CAAC,GAE1C6H,IAAoBnL,QAAkB;EAC1C,AAAI4K,EAAgB,WAClBM,EAAeN,EAAgB,QAAQ,UAAU,CAAC,CAAC,MAAM;CAE7D,GAAG,CAAC,CAAC,GAECQ,IAAoBpL,GAAa,MAA8B;EACnE,IAAI,CAAC4K,EAAgB,SAAS;EAC9B,IAAM,EAAE,aAAU5L;EAIlB,AAHA4L,EAAgB,QAAQ,SAASxF,CAAK,GACtCiG,IAAiBT,EAAgB,OAAO,GACxCO,EAAkB,GAClBH,EAAc,IAAI;CACpB,GAAG,CAACK,GAAgBF,CAAiB,CAAC,GAEhCG,IAA4BtL,QAAkB;EAClD,AAAK4K,EAAgB,YACrBS,IAAiBT,EAAgB,OAAO,GACxCO,EAAkB,GAClBH,EAAc,IAAI;CACpB,GAAG,CAACK,GAAgBF,CAAiB,CAAC;CAsBtC,OApBA5H,QAAgB;EACd,IAAK0D,KAAMsE,KAAgBrI,GAS3B,OAPAA,EAAI,GACF+D,EAAE,KAAK,MAAM,SACbmE,CACF,GACAlI,EAAI,GAAG+D,EAAE,KAAK,MAAM,QAAQqE,CAAyB,GACrDpI,EAAI,GAAG+D,EAAE,KAAK,MAAM,SAASqE,CAAyB,SAEzC;GAMX,AALApI,EAAI,IACF+D,EAAE,KAAK,MAAM,SACbmE,CACF,GACAlI,EAAI,IAAI+D,EAAE,KAAK,MAAM,QAAQqE,CAAyB,GACtDpI,EAAI,IAAI+D,EAAE,KAAK,MAAM,SAASqE,CAAyB;EACzD;CACF,GAAG;EAACrE;EAAGsE;EAAarI;EAAKkI;EAAmBE;CAAyB,CAAC,GAGpE,kBAACb,GAAe,UAAhB;EACE,OAAO;GACL,cAAcG,EAAgB;GAC9B;GACA;GACA;GACA;GACA;EACF;EARF,UAAA,CASE,kBAAC3I,IAAD,EAAqB,KAAK2I,EAAkB,CAAA,GAC5C,kBAACnC,GAAD;GAAqB,WAAW3J,EAAGqH,GAAUpH,CAAS;GACpD,UAAA,kBAAC9G,GAAD;IAAa,aAAY;IAAW,GAAImF;GAAQ,CAAA;EAC7B,CAAA,CACE;;AAE7B;AAEA,SAASoO,EAA2C,EAClD,aACA,mBACA,cACA,aACA,GAAGpO,KAIF;CACD,IAAMqO,IAAcf,EAAkB;CACtC,IAAI,CAACe,GACH,MAAU,MAAM,uDAAuD;CAEzE,IAAM,EAAE,SAAMjF,EAAW,GACnBnJ,IAAUuD,EAAc,GACxBsC,IAAMX,EAAc,GACpBmJ,IAAa1I,EAAiB,IAAI,GAClC,EAAE,eAAY,qBAAkByI,GAChCE,IAAWZ,MAAea,GAQ1BC,IAAY;EANhB,QAAQxO,EAAQ;EAChB,UAAUA,EAAQ;EAClB,QAAQA,EAAQ;EAChB,WAAWA,EAAQ;EACnB,SAASA,EAAQ;CAED,EAAWuO;CAE7B,QAAgB;EACd,IAAI,CAAC3E,KAAK,CAAC0E,GAAU;GAEnB,AADAD,EAAW,SAAS,QAAQ,GAC5B,EAAW,UAAU;GACrB;EACF;EACA,IAAMI,IAAUC,EAAe9E,GAAG/D,CAAc;EAGhD,OAFA4I,EAAQ,OAAO,GACf,EAAW,UAAUA,SACR;GAEX,AADAA,EAAQ,QAAQ,GAChB,EAAW,UAAU;EACvB;CACF,GAAG;EAAC7E;EAAG/D;EAAKyI;EAAUI;CAAc,CAAC;CAErC,SAASC,IAAc;EACrB,EAAcL,IAAW,OAAOC,CAAQ;CAC1C;CAEA,OACE,kBAACnM,GAAD;EACE,MAAK;EACL,MAAK;EAAK,UAAA;EACV,cAAYoM;EACZ,OAAOA;EACP,WAAW/M,EAAG6M,IAAWpL,KAA0BD,GAAmBvB,CAAS;EAC/E,MAAM4M,IAAW,YAAY;EAC7B,aAAaA,IAAW,UAAU;EAClC,UAAUZ,MAAe,UAAUA,MAAe;EAClD,SAASiB;EACT,GAAI5O;EAEH;CACK,CAAA;AAEZ;AAEA,SAAS6O,GAAc,EAAE,GAAG7O,KAAoC;CAC9D,OACE,kBAACoO,GAAD;EACE,UAAS;EACT,iBAAiB,GAAG,MAClB,IAAIvE,EAAE,KAAK,OAAO/D,GAAK;GACrB,MAAM+D,EAAE,QAAQ;IACd,WAAW;IACX,YAAY,CAAC,IAAI,EAAE;IACnB,MAAMC,EAAe,kBAACrH,GAAD,EAAY,WAAU,eAAgB,CAAA,CAAC;GAC9D,CAAC;GACD,GAAGzC;EACL,CAAC;EAEH,UAAA,kBAACyC,GAAD,CAAa,CAAA;CACK,CAAA;AAExB;AAEA,SAASqM,GAAgB,EACvB,gBAAa,IACb,eAAY,EACV,OAAO,2BACT,GACA,kBAAe;CACb,OAAO;CACP,SAAS;CACT,QAAQ;AACV,GACA,GAAG9O,KAC2B;CAC9B,IAAM+O,IAAoBC,GAAqB;CAE/C,OACE,kBAACZ,GAAD;EACE,UAAS;EACT,iBAAiB,GAAG,MAClB,IAAIvE,EAAE,KAAK,SAAS/D,GAAK;GACvB,GAAIiJ,IACA;IACC,MAAMA;IACN,WAAWA;GACb,IACC,CAAC;GACL;GACA;GACA;GACA,GAAG/O;EACL,CAAC;EAEH,UAAA,kBAACiP,IAAD,CAAgB,CAAA;CACE,CAAA;AAExB;AAEA,SAASC,GAAc,EACrB,gBAAa,IACb,kBAAe;CACb,OAAO;CACP,SAAS;CACT,QAAQ;AACV,GACA,GAAGlP,KACyB;CAC5B,OACE,kBAACoO,GAAD;EACE,UAAS;EACT,iBAAiB,GAAG,MAClB,IAAIvE,EAAE,KAAK,OAAO/D,GAAK;GACrB;GACA;GACA,GAAG9F;EACL,CAAC;EAEH,UAAA,kBAACmP,IAAD,CAAa,CAAA;CACK,CAAA;AAExB;AAEA,SAASC,GAAiB,EACxB,cAAW,IACX,kBAAe;CACb,OAAO;CACP,SAAS;CACT,QAAQ;AACV,GACA,GAAGpP,KAC4B;CAC/B,OACE,kBAACoO,GAAD;EACE,UAAS;EACT,iBAAiB,GAAG,MAClB,IAAIvE,EAAE,KAAK,UAAU/D,GAAK;GACxB;GACA;GACA,GAAG9F;EACL,CAAC;EAEH,UAAA,kBAACqP,GAAD,CAAa,CAAA;CACK,CAAA;AAExB;AAEA,SAASC,GAAe,EACtB,eAAY,EACV,OAAO,2BACT,GACA,kBAAe;CACb,OAAO;CACP,SAAS;CACT,QAAQ;AACV,GACA,GAAGtP,KAC0B;CAC7B,IAAM+O,IAAoBC,GAAqB;CAE/C,OACE,kBAACZ,GAAD;EACE,UAAS;EACT,iBAAiB,GAAG,MAClB,IAAIvE,EAAE,KAAK,QAAQ/D,GAAK;GACtB,GAAIiJ,IACA;IACC,MAAMA;IACN,WAAWA;GACb,IACC,CAAC;GACL;GACA;GACA,GAAG/O;EACL,CAAC;EAEH,UAAA,kBAACuP,GAAD,CAAe,CAAA;CACG,CAAA;AAExB;AAEA,SAASC,GAAqE,EAC5E,eACA,mBACA,eACA,cACA,aACA,GAAGxP,KASF;CACD,IAAMqO,IAAcf,EAAkB;CACtC,IAAI,CAACe,GACH,MAAU,MACR,wDACF;CAEF,IAAM,EAAE,SAAMjF,EAAW,GACnBnJ,IAAUuD,EAAc,GACxBsC,IAAMX,EAAc,GACpB,EAAE,iBAAc,eAAY,kBAAe,mBAAgBkJ,GAC3DE,IAAWZ,MAAe8B,GAC1BC,IAAc7B,IAAc,GAC5B8B,IAAcF,MAAe,SAASxP,EAAQ,aAAaA,EAAQ;CAEzE,QAAgB;EACd,IAAI,CAAC4J,KAAK,CAAC+F,KAAgB,CAACrB,GAAU;GAEpC,AADAD,EAAW,SAAS,UAAU,GAC9B,EAAW,UAAU;GACrB;EACF;EACA,IAAMI,IAAUC,EAAe9E,GAAG/D,GAAgB8J,CAAY;EAG9D,OAFAlB,EAAQ,SAAS,GACjB,EAAW,UAAUA,SACR;GAEX,AADAA,EAAQ,UAAU,GAClB,EAAW,UAAU;EACvB;CACF,GAAG;EAAC7E;EAAG/D;EAAKyI;EAAUqB;EAAcjB;EAAgBL;CAAU,CAAC;CAE/D,SAASM,IAAc;EAErB,AADAN,EAAW,SAAS,KAAK,GACzBV,EAAcW,IAAW,OAAOkB,CAAU;CAC5C;CAEA,OACE,kBAACpN,GAAD;EACE,MAAK;EACL,MAAK;EAAK,UAAA;EACV,cAAYsN;EACZ,OAAOA;EACP,MAAMpB,IAAW,YAAY;EAC7B,aAAaA,IAAW,UAAU;EAClC,UAAU,CAACmB;EACX,SAASd;EACT,WAAWlN,EAAG6M,IAAWpL,KAA0BD,GAAmBvB,CAAS;EAC/E,GAAI3B;EAEH;CACK,CAAA;AAEZ;AAEA,SAAS6P,GAAY,EACnB,yBAAsB;CACpB,OAAO;CACP,WAAW;CACX,QAAQ;AACV,GACA,GAAG7P,KACoD;CACvD,IAAM,EAAE,SAAMoJ,EAAW,GACnBnJ,IAAUuD,EAAc,GACxBuL,IAAoBC,GAAqB,GACzCX,IAAcf,EAAkB;CACtC,IAAI,CAACe,GACH,MAAU,MAAM,gDAAgD;CA4BlE,OAzBAlI,QAAgB;EACd,AAAK0D,KAAMkF,MAEXlF,EAAE,KAAK,iBAAiB,aAAa;GACnC,MAAMkF;GACN,WAAWA;GACX,WAAW,EACT,OAAO,2BACT;EACF,CAAC,GACDlF,EAAE,KAAK,YAAY,aAAa;GAC9B,UAAUkF;GACV,YAAYA;GACZ,eAAeA;GACf,iBAAiBA;EACnB,CAAC,GACD,EAAE,UAAU,KAAK,SAAS,KAAK,UAAU;GACvC,MAAM9O,EAAQ;GACd,SAAS;EACX,GACA,EAAE,UAAU,KAAK,SAAS,OAAO,UAAU,EACzC,MAAMA,EAAQ,mBAChB;CACF,GAAG;EAAC4J;EAAGkF;EAAmB9O,EAAQ;EAAkBA,EAAQ;CAAkB,CAAC,GAG7E,kBAACuP,IAAD;EACE,YAAW;EACX,YAAYnB,EAAY;EACxB,iBAAiB,GAAG,GAAK,MACvB,IAAIxE,EAAE,YAAY,KAAK/D,GAAK;GAC1B;GACA;GACA,GAAG9F;EACL,CAAC;EAEH,UAAA,kBAAC8P,GAAD,CAAc,CAAA;CACK,CAAA;AAEzB;AAEA,SAASC,KAAgB;CACvB,IAAM1B,IAAcf,EAAkB;CACtC,IAAI,CAACe,GACH,MAAU,MAAM,kDAAkD;CAGpE,OACE,kBAACmB,IAAD;EACE,YAAW;EACX,YAAYnB,EAAY;EACxB,iBAAiB,GAAG,GAAK,MACvB,IAAIxE,EAAE,YAAY,OAAO/D,GAAK,EAAE,gBAAa,CAAC;EAEhD,UAAA,kBAACkK,IAAD,CAAa,CAAA;CACM,CAAA;AAEzB;AAEA,SAASC,GAAY,EAAE,cAAW,GAAGjQ,KAAyC;CAC5E,IAAMqO,IAAcf,EAAkB;CACtC,IAAI,CAACe,GACH,MAAU,MAAM,gDAAgD;CAClE,IAAMpO,IAAUuD,EAAc,GAExB,EACJ,eACA,kBACA,mBACA,qBACA,mBACE6K,GACE6B,IAAevC,MAAe,QAC9BwC,IAAiBxC,MAAe,UAChCY,KAAY2B,KAAgBC,MAAmBtC,IAAc,GAC7DuC,IAAYD,IAAiBlQ,EAAQ,aAAaA,EAAQ;CAEhE,SAASoQ,IAAa;EAMpB,AALIH,IACFzC,EAAe,SAAS,aAAa,IAC5B0C,KACTzC,EAAiB,SAAS,aAAa,GAEzCE,EAAc,IAAI;CACpB;CAEA,OACE,kBAACvL,GAAD;EACE,MAAK;EACL,MAAK;EAAK,UAAA;EACV,MAAK;EACL,aAAY;EACZ,cAAY+N;EACZ,OAAOA;EACP,SAASC;EACT,UAAU,CAAC9B;EACX,WAAW7M,EAAGwB,GAAmBvB,CAAS;EAC1C,GAAI3B;EACJ,UAAA,kBAACsQ,GAAD,CAAY,CAAA;CACN,CAAA;AAEZ;AAEA,SAASjF,EAAoB,EAC3B,cACA,GAAGrL,KACqC;CACxC,IAAM,EAAE,SAAMoJ,EAAW,GACnBmH,IAAe3K,EAAuB,IAAI;CAUhD,OARAO,QAAgB;EACd,IAAI,CAAC0D,GAAG;EACR,IAAMH,IAAU6G,EAAa;EAC7B,AAAK7G,MACLG,EAAE,SAAS,wBAAwBH,CAAO,GAC1CG,EAAE,SAAS,yBAAyBH,CAAO;CAC7C,GAAG,CAACG,CAAC,CAAC,GAGJ,kBAAC,OAAD;EACE,KAAK0G;EACL,WAAW7O,EAAG,2CAA2CC,CAAS;EAClE,GAAI3B;CACL,CAAA;AAEL;AAEA,SAASgP,KAAuB;CAC9B,IAAM,EAAE,SAAM5F,EAAW;CAGzB,OAFKS,IAEEA,EAAE,QAAQ;EACf,YAAY,CAAC,GAAG,CAAC;EACjB,MAAMC,EACJ,kBAACqF,IAAD,EAAY,WAAU,2FAA4F,CAAA,CACpH;CACF,CAAC,IAPc;AAQjB;AAEA,SAAS/F,IAAa;CACpB,IAAM,CAACS,GAAG2G,KAAQtK,EAA+B,IAAI,GAC/C,CAACiI,GAAasC,KAAkBvK,EACpC,IACF;CAwBA,OAtBAC,QAAgB;EACd,eAAeuK,IAAc;GAC3B,IAAMC,IAAU,MAAM,OAAO,YACvBC,IAAoB,MAAM,OAAO,uBACjCC,IAAc,MAAM,OAAO,iBAE3BC,IAAWH,EAAQ;GAOzB,AANIG,EAAS,WAAW,CAACA,EAAS,QAAQ,eACxC,EAAS,QAAQ,aACfF,EAAkB,WAAWA,IAGjCH,EAAeI,CAAW,GAC1BL,EAAKM,CAAQ;EACf;EAEA,AAAIjH,KAAKsE,KACL,OAAO,SAAW,OAEtBuC,EAAiB;CACnB,GAAG,CAAC7G,GAAGsE,CAAW,CAAC,GAEZ;EAAE;EAAG;CAAY;AAC1B;AAOA,SAAS9B,GAAuB,IAAQ,KAAK;CAC3C,IAAM,CAACxO,GAAWC,KAAgBoI,EAAS,EAAK,GAC1C,CAAC6K,GAAaC,KAAkB9K,EAAS,EAAK,GAC9C+K,IAAarL,EAA6C,IAAI;CAsBpE,OApBAO,SACMtI,IACF,EAAW,UAAU,iBAAiB;EACpC,EAAe,EAAI;CACrB,GAAGqT,CAAK,KAER,AAEED,EAAW,aADX,aAAaA,EAAW,OAAO,GACV,OAEvBD,EAAe,EAAK,UAGT;EACX,AAAIC,EAAW,WACb,aAAaA,EAAW,OAAO;CAEnC,IACC,CAACpT,GAAWqT,CAAK,CAAC,GAEd,CAACH,GAAajT,CAAY;AACnC"}
1
+ {"version":3,"file":"map.js","names":["React","Map","_Fragment","Text","resolveTextClassNames","Button","ButtonGroup","elevationRecipes","popoverRecipes","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuRadioGroup","DropdownMenuCheckboxItem","DropdownMenuLabel","DropdownMenuContent","DropdownMenu","DropdownMenuRadioItem","layerRecipes","CommandItem","CommandEmpty","CommandList","CommandGroup","Command","PopoverTrigger","Popover","PopoverContent","InputGroup","InputGroupInput","InputGroupAddon","useDebounce","React$1","Fragment$1","placeFeatureId","feature","defaultPlaceAutocompleteStrings","formatAddress","parts","properties","buildSearchUrl","url","query","lang","limit","bbox","lat","lon","zoom","locationBiasScale","searchPhoton","response","options","usePlaceSearch","results","setResults","isLoading","setIsLoading","error","setError","hasSearched","setHasSearched","retryAttempt","setRetryAttempt","onSearchErrorRef","onSearchError","debouncedQuery","debounceMs","bboxKey","current","abortController","fetchResults","features","searchPlaces","signal","seen","id","err","failure","attempt","formatPlaceAutocompleteString","template","params","key","match","PlaceAutocomplete","controlledValue","controlledOnValueChange","stringsProp","inputOnFocus","props","strings","useStrings","internalValue","setInternalValue","defaultValue","searchQuery","setSearchQuery","isListDismissed","setIsListDismissed","activeIndex","setActiveIndex","listId","anchorRef","popoverActionsRef","optionNodes","isControlled","displayValue","onResultsChangeRef","onResultsChange","hasNoResults","hasCommandList","showCommandList","selectPlace","address","onPlaceSelect","cn","className","event","flushSync","next","open","details","SearchIcon","index","newValue","Loader2Icon","retry","formattedAddress","node","MapPinIcon","useMapColorScheme","read","useCallback","container","subscribe","observer","notify","useSyncExternalStore","mapControlSurface","mapControlActiveSurface","ReactLeafletHooksContext","createContext","defaultMapStrings","MapStringsContext","useMapStrings","useContext","ReactLeafletRuntimeContext","ReactLeafletRuntime","lazy","mod","createRuntimeComponent","runtime","Component","select","LeafletMapContainer","LeafletTileLayer","LeafletMarker","LeafletPopup","LeafletTooltip","LeafletCircle","LeafletCircleMarker","LeafletPolyline","LeafletPolygon","LeafletRectangle","LeafletLayerGroup","LeafletFeatureGroup","createLazyComponent","factory","Suspense","LeafletMarkerClusterGroup","ReactLeafletHooksProvider","useLeafletMap","hooks","useLeafletMapEvents","handlers","assignRef","ref","value","Map$1","focusCleanup","useRef","handleMapRef","map","focusWithoutScroll","isMounted","setIsMounted","useState","useEffect","MapLayersContext","useMapLayersContext","MapTileLayer","nameProp","name","context","resolvedTheme","resolvedUrl","darkUrl","resolvedAttribution","darkAttribution","attribution","registerTileLayer","unregisterTileLayer","useRegisteredLayerGroup","registerLayerGroup","unregisterLayerGroup","disabled","MapLayerGroup","MapFeatureGroup","MapLayers","tileLayers","setTileLayers","chosenTileLayer","setSelectedTileLayer","defaultTileLayer","layerGroups","setLayerGroups","activeLayerGroups","setActiveLayerGroups","defaultLayerGroups","previous","layer","tileLayer","position","group","layerGroup","selectedTileLayer","checkedDefaultTileLayer","checkedDefaultLayerGroups","useMemo","MapLayersControl","layersContext","handleLayerGroupToggle","checked","groupName","showTileLayersDropdown","showLayerGroupsDropdown","triggerProps","LayersIcon","tileLayersLabel","layerGroupsLabel","MapMarker","useLeaflet","markerRef","resolvedAriaLabel","ariaLabel","resolvedTitle","syncMarkerElement","element","marker","handleMarkerRef","L","renderToString","icon","bgPos","popupAnchor","tooltipAnchor","MapMarkerClusterGroup","iconNode","cluster","MapCircle","MapCircleMarker","MapPolyline","MapPolygon","MapRectangle","MapPopup","MapTooltip","DEFAULT_OFFSET","sideOffset","side","MapZoomControl","zoomLevel","setZoomLevel","MapControlContainer","PlusIcon","MinusIcon","MapFullscreenControl","isFullscreen","setIsFullscreen","fullscreenControl","handleEnter","handleExit","jsx","MinimizeIcon","MaximizeIcon","MapLocatePulseIcon","MapLocateControl","isLocating","setIsLocating","useDelayedLoadingState","watching","setWatching","location","setLocation","stopRequestRef","callbacks","isTracking","onLocationFound","onLocationError","startLocating","detach","handleFound","handleError","stopRequest","watch","continuesWatching","stopLocating","trackingHandler","trackingTitle","trackingAriaLabel","locationMarker","LoaderCircleIcon","NavigationIcon","MapSearchControl","MapDrawContext","useMapDrawContext","MapDrawControl","featureGroupRef","editControlRef","deleteControlRef","activeMode","setActiveMode","layersCount","setLayersCount","updateLayersCount","handleDrawCreated","onLayersChange","handleDrawEditedOrDeleted","LeafletDraw","MapDrawShapeButton","drawContext","controlRef","createDrawToolRef","createDrawTool","isActive","drawMode","drawLabel","control","handleClick","MapDrawMarker","MapDrawPolyline","mapDrawHandleIcon","useMapDrawHandleIcon","WaypointsIcon","MapDrawCircle","CircleIcon","MapDrawRectangle","SquareIcon","MapDrawPolygon","PentagonIcon","MapDrawActionButton","drawAction","hasFeatures","actionLabel","featureGroup","MapDrawEdit","PenLineIcon","MapDrawDelete","Trash2Icon","MapDrawUndo","isInEditMode","isInDeleteMode","undoLabel","handleUndo","Undo2Icon","containerRef","setL","setLeafletDraw","loadLeaflet","leaflet","leafletFullscreen","leafletDraw","L_object","showLoading","setShowLoading","timeoutRef","delay"],"sources":["../../src/components/features/map/place-autocomplete.tsx","../../src/components/features/map/use-map-color-scheme.ts","../../src/components/features/map/map.tsx"],"sourcesContent":["import { Button } from \"../../base/buttons\"\nimport { Text } from \"../../typography\"\nimport { useDebounce } from \"../../../hooks/use-debounce\"\nimport { DEFAULT_DEBOUNCE_MS } from \"../../../hooks/use-debounced-callback\"\nimport { useStrings, type StringsProp } from \"../../../lib/strings\"\nimport { cn } from \"../../../lib/utils\"\nimport {\n\t\tCommand,\n\t\tCommandEmpty,\n\t\tCommandGroup,\n\t\tCommandItem,\n\t\tCommandList,\n} from \"../../base/command\"\nimport {\n\t\tPopover,\n\t\tPopoverContent,\n\t\tPopoverTrigger,\n} from \"../../base/popover\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../base/text-inputs';\nimport { Loader2Icon, MapPinIcon, SearchIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport { flushSync } from \"react-dom\"\n\ntype BBox = [number, number, number, number]\ntype Point = {\n\t\ttype: \"Point\"\n\t\tcoordinates: [number, number]\n}\ntype Feature<TGeometry, TProperties> = {\n\t\ttype: \"Feature\"\n\t\tgeometry: TGeometry\n\t\tproperties: TProperties\n\t\tbbox?: BBox\n}\ntype FeatureCollection<TGeometry, TProperties> = {\n\t\ttype: \"FeatureCollection\"\n\t\tfeatures: Array<Feature<TGeometry, TProperties>>\n\t\tbbox?: BBox\n}\n\ninterface PlaceFeatureProperties {\n\t\t/**\n\t\t * With `osm_type`, the result's identity: OSM ids are unique per element\n\t\t * type only, so a node and a way may share a number. A `searchPlaces`\n\t\t * adapter for another provider must give every result its own\n\t\t * `osm_type` + `osm_id` pair; results repeating a pair are dropped.\n\t\t */\n\t\tosm_id: number\n\t\tosm_type: \"N\" | \"W\" | \"R\"\n\t\tosm_key: string\n\t\tosm_value: string\n\t\ttype: string\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname?: string\n\t\thousenumber?: string\n\t\tstreet?: string\n\t\tlocality?: string\n\t\tdistrict?: string\n\t\tpostcode?: string\n\t\tcity?: string\n\t\tcounty?: string\n\t\tstate?: string\n\t\tcountry?: string\n\t\tcountrycode?: string\n\t\textent?: [number, number, number, number]\n\t\textra?: Record<string, string>\n}\ntype PlaceFeature = Feature<Point, PlaceFeatureProperties>\n\n/** One result's identity: the OSM element type and id together. */\nfunction placeFeatureId(feature: PlaceFeature): string {\n\t\treturn `${feature.properties.osm_type ?? \"\"}${feature.properties.osm_id}`\n}\ntype PlaceFeatureCollection = FeatureCollection<Point, PlaceFeatureProperties>\n\ninterface PlaceAutocompleteStrings {\n\t\tsearchPlaceholder: string\n\t\t/** Announced while a place lookup is in flight. */\n\t\tloading: string\n\t\terror: string\n\t\t/** Action shown after a failed lookup. */\n\t\tretry?: string\n\t\tnoResults: string\n\t\tunknownPlace: string\n}\n\nconst defaultPlaceAutocompleteStrings: PlaceAutocompleteStrings = {\n\t\tsearchPlaceholder: \"Search\",\n\t\tloading: \"Searching places\",\n\t\terror: \"Error: {{message}}\",\n\t\tretry: \"Retry\",\n\t\tnoResults: \"Can't find {{query}}.\",\n\t\tunknownPlace: \"Unknown\",\n}\n\n/**\n * Query parameters for Photon geocoding API\n * @see https://github.com/komoot/photon#photon-api\n */\ninterface PlaceSearchOptions {\n\t\t/** Search text (address, place name, or POI) */\n\t\tquery: string\n\t\t/** Preferred language for results (e.g., \"en\", \"de\", \"fr\") */\n\t\tlang?: string\n\t\t/** Maximum number of results to return */\n\t\tlimit?: number\n\t\t/**\n\t\t * Bounding box used to restrict results.\n\t\t * Format: [minLongitude, minLatitude, maxLongitude, maxLatitude]\n\t\t */\n\t\tbbox?: BBox\n\t\t/** Latitude used to bias results toward a specific location */\n\t\tlat?: number\n\t\t/** Longitude used to bias results toward a specific location */\n\t\tlon?: number\n\t\t/**\n\t\t * Zoom level used for location biasing.\n\t\t * Higher values increase locality.\n\t\t */\n\t\tzoom?: number\n\t\t/**\n\t\t * Strength of the location bias.\n\t\t */\n\t\tlocationBiasScale?: number\n}\n\n/**\n * Consumer-owned geocoding integration. Keep callback identity stable until its\n * provider changes. Each result is identified by `osm_type` + `osm_id`.\n */\ntype PlaceSearchCallback = (options: PlaceSearchOptions, signal: AbortSignal) => Promise<PlaceFeature[]>\n\ninterface PlaceAutocompleteProps\n\t\textends Omit<PlaceSearchOptions, \"query\">,\n\t\t\t\tOmit<React.ComponentProps<\"input\">, \"value\" | \"onChange\"> {\n\t\tdebounceMs?: number\n\t\t/** Current value. Controlled. */\n\t\tvalue?: string\n\t\t/** Initial value for uncontrolled use. */\n\t\tdefaultValue?: string\n\t\t/** Fired with the next text value. */\n\t\tonValueChange?: (value: string) => void\n\t\tonPlaceSelect?: (feature: PlaceFeature) => void\n\t\tonResultsChange?: (results: PlaceFeature[]) => void\n\t\t/** Overrides Photon. Memoize when its implementation captures consumer state. */\n\t\tsearchPlaces?: PlaceSearchCallback\n\t\t/** Reports a current lookup failure; cancelled or superseded failures are ignored. */\n\t\tonSearchError?: (error: Error) => void\n\t\t/** Overrides this surface's own copy. */\n\t\tstrings?: StringsProp<PlaceAutocompleteStrings>\n}\n\nfunction formatAddress(properties: PlaceFeatureProperties) {\n\t\tconst parts = []\n\n\t\tif (properties.name) {\n\t\t\t\tparts.push(properties.name)\n\t\t}\n\n\t\tif (properties.housenumber && properties.street) {\n\t\t\t\tparts.push(`${properties.housenumber} ${properties.street}`)\n\t\t} else if (properties.street) {\n\t\t\t\tparts.push(properties.street)\n\t\t}\n\n\t\tif (properties.city) {\n\t\t\t\tparts.push(properties.city)\n\t\t} else if (properties.locality) {\n\t\t\t\tparts.push(properties.locality)\n\t\t}\n\n\t\tif (properties.state && properties.state !== properties.city) {\n\t\t\t\tparts.push(properties.state)\n\t\t}\n\n\t\tif (properties.country) {\n\t\t\t\tparts.push(properties.country)\n\t\t}\n\n\t\treturn [...new Set(parts)].join(\", \")\n}\n\nfunction buildSearchUrl({\n\t\tquery,\n\t\tbbox,\n\t\tlang,\n\t\tlat,\n\t\tlimit,\n\t\tlocationBiasScale,\n\t\tlon,\n\t\tzoom,\n}: PlaceSearchOptions) {\n\t\tconst url = new URL(\"https://photon.komoot.io/api\")\n\t\turl.searchParams.set(\"q\", query)\n\n\t\tif (lang) {\n\t\t\t\turl.searchParams.set(\"lang\", lang)\n\t\t}\n\n\t\tif (limit) {\n\t\t\t\turl.searchParams.set(\"limit\", String(limit))\n\t\t}\n\n\t\tif (bbox) {\n\t\t\t\turl.searchParams.set(\"bbox\", bbox.join(\",\"))\n\t\t}\n\n\t\tif (lat !== undefined && lon !== undefined) {\n\t\t\t\turl.searchParams.set(\"lat\", String(lat))\n\t\t\t\turl.searchParams.set(\"lon\", String(lon))\n\t\t}\n\n\t\tif (zoom !== undefined) {\n\t\t\t\turl.searchParams.set(\"zoom\", String(zoom))\n\t\t}\n\n\t\tif (locationBiasScale !== undefined) {\n\t\t\t\turl.searchParams.set(\"location_bias_scale\", String(locationBiasScale))\n\t\t}\n\n\t\treturn String(url)\n}\n\nconst searchPhoton: PlaceSearchCallback = async (options, signal) => {\n\t\tconst response = await fetch(buildSearchUrl(options), { signal })\n\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Photon API error: ${response.status} ${response.statusText}`)\n\t\t}\n\t\tconst data: PlaceFeatureCollection = await response.json()\n\t\treturn data.features\n}\n\nfunction usePlaceSearch({\n\t\tdebounceMs,\n\t\tquery,\n\t\tlang,\n\t\tlimit,\n\t\tbbox,\n\t\tlat,\n\t\tlon,\n\t\tzoom,\n\t\tlocationBiasScale,\n\t\tsearchPlaces = searchPhoton,\n\t\tonSearchError,\n}: {\n\t\tdebounceMs: number\n\t\tsearchPlaces?: PlaceSearchCallback\n\t\tonSearchError?: (error: Error) => void\n} & PlaceSearchOptions) {\n\t\tconst [results, setResults] = React.useState<PlaceFeature[]>([])\n\t\tconst [isLoading, setIsLoading] = React.useState(false)\n\t\tconst [error, setError] = React.useState<Error | null>(null)\n\t\tconst [hasSearched, setHasSearched] = React.useState(false)\n\t\tconst [retryAttempt, setRetryAttempt] = React.useState(0)\n\t\tconst onSearchErrorRef = React.useRef(onSearchError)\n\t\tReact.useEffect(() => { onSearchErrorRef.current = onSearchError }, [onSearchError])\n\n\t\tconst debouncedQuery = useDebounce(query, debounceMs)\n\t\t// Tuple values define the context; a consumer's inline bbox must not restart it.\n\t\tconst bboxKey = bbox?.join(',')\n\n\t\tReact.useEffect(() => {\n\t\t\t\tsetResults(current => current.length ? [] : current)\n\t\t\t\tsetError(null)\n\t\t\t\tif (!query.trim() || query !== debouncedQuery) {\n\t\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\t\tsetHasSearched(false)\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst abortController = new AbortController()\n\t\t\t\tconst { signal } = abortController\n\t\t\t\tsetIsLoading(true)\n\t\t\t\tsetHasSearched(true)\n\n\t\t\t\tasync function fetchResults() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst features = await searchPlaces({\n\t\t\t\t\t\t\t\t\t\tquery: debouncedQuery, lang, limit,\n\t\t\t\t\t\t\t\t\t\tbbox: bboxKey ? bboxKey.split(',').map(Number) as BBox : undefined,\n\t\t\t\t\t\t\t\t\t\tlat, lon, zoom, locationBiasScale,\n\t\t\t\t\t\t\t\t}, signal)\n\t\t\t\t\t\t\t\tif (signal.aborted) return\n\t\t\t\t\t\t\t\tconst seen = new Set<string>()\n\t\t\t\t\t\t\t\tsetResults(features.filter(feature => {\n\t\t\t\t\t\t\t\t\t\tconst id = placeFeatureId(feature)\n\t\t\t\t\t\t\t\t\t\tif (seen.has(id)) return false\n\t\t\t\t\t\t\t\t\t\tseen.add(id)\n\t\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tif (signal.aborted || (err instanceof Error && err.name === 'AbortError')) return\n\t\t\t\t\t\t\t\tconst failure = err instanceof Error ? err : new Error(String(err))\n\t\t\t\t\t\t\t\tsetError(failure)\n\t\t\t\t\t\t\t\tonSearchErrorRef.current?.(failure)\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tif (!signal.aborted) setIsLoading(false)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvoid fetchResults()\n\t\t\t\treturn () => abortController.abort()\n\t\t}, [query, debouncedQuery, lang, limit, bboxKey, lat, lon, zoom, locationBiasScale, searchPlaces, retryAttempt])\n\n\t\treturn { results, isLoading, error, hasSearched, retry: () => setRetryAttempt(attempt => attempt + 1) }\n}\n\nfunction formatPlaceAutocompleteString(\n\t\ttemplate: string,\n\t\tparams: Record<string, string>\n) {\n\t\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key) => {\n\t\t\t\treturn params[key] ?? match\n\t\t})\n}\n\nfunction PlaceAutocomplete({\n\t\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\t\tlang,\n\t\tlimit = 5,\n\t\tbbox,\n\t\tlat,\n\t\tlon,\n\t\tzoom,\n\t\tlocationBiasScale,\n\t\tclassName,\n\t\tvalue: controlledValue,\n\t\tdefaultValue = \"\",\n\t\tonValueChange: controlledOnValueChange,\n\t\tonPlaceSelect,\n\t\tonResultsChange,\n\t\tsearchPlaces,\n\t\tonSearchError,\n\t\tstrings: stringsProp,\n\t\tonFocus: inputOnFocus,\n\t\t...props\n}: PlaceAutocompleteProps) {\n\t\tconst strings = useStrings(defaultPlaceAutocompleteStrings, stringsProp)\n\t\tconst [internalValue, setInternalValue] = React.useState(defaultValue)\n\t\tconst [searchQuery, setSearchQuery] = React.useState(\"\")\n\t\tconst [isListDismissed, setIsListDismissed] = React.useState(false)\n\t\tconst [activeIndex, setActiveIndex] = React.useState(-1)\n\t\tconst listId = React.useId()\n\t\tconst anchorRef = React.useRef<HTMLDivElement>(null)\n\t\tconst popoverActionsRef: React.ComponentProps<typeof Popover>['actionsRef'] = React.useRef(null)\n\t\tconst optionNodes = React.useRef(new Map<number, HTMLElement>())\n\n\t\tconst isControlled = controlledValue !== undefined\n\t\tconst displayValue = isControlled ? controlledValue : internalValue\n\n\t\tconst { results, isLoading, error, hasSearched, retry } = usePlaceSearch({\n\t\t\t\tquery: searchQuery,\n\t\t\t\tsearchPlaces,\n\t\t\t\tonSearchError,\n\t\t\t\tdebounceMs,\n\t\t\t\tlang,\n\t\t\t\tlimit,\n\t\t\t\tbbox,\n\t\t\t\tlat,\n\t\t\t\tlon,\n\t\t\t\tzoom,\n\t\t\t\tlocationBiasScale,\n\t\t})\n\n\t\tconst onResultsChangeRef = React.useRef(onResultsChange)\n\t\tReact.useEffect(() => { onResultsChangeRef.current = onResultsChange }, [onResultsChange])\n\t\tReact.useEffect(() => {\n\t\t\t\tonResultsChangeRef.current?.(results)\n\t\t}, [results])\n\n\t\tconst hasNoResults =\n\t\t\t\thasSearched && !isLoading && !error && results.length === 0\n\t\tconst hasCommandList = Boolean(error || hasNoResults || results.length > 0)\n\t\tconst showCommandList = hasCommandList && !isListDismissed\n\t\tconst selectPlace = (feature: PlaceFeature) => {\n\t\t\t\tconst address = formatAddress(feature.properties)\n\t\t\t\tif (!isControlled) setInternalValue(address)\n\t\t\t\tsetSearchQuery(\"\")\n\t\t\t\tsetIsListDismissed(true)\n\t\t\t\tsetActiveIndex(-1)\n\t\t\t\tcontrolledOnValueChange?.(address)\n\t\t\t\tonPlaceSelect?.(feature)\n\t\t}\n\t\tconst optionId = (index: number) => optionNodes.current.get(index)?.id\n\n\t\treturn (\n\t\t\t\t<Command\n inset=\"flush\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'place-autocomplete--component',\n\t\t\t\t\t\t\t\t// The input group owns the closed-state surface. Keep the\n\t\t\t\t\t\t\t\t// command root flush while inheriting canonical list and row\n\t\t\t\t\t\t\t\t// presentation from base/command.\n\t\t\t\t\t\t\t\t\"h-fit overflow-visible bg-transparent text-inherit\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tvalue={activeIndex >= 0 && results[activeIndex] ? placeFeatureId(results[activeIndex]) : ''}\n\t\t\t\t\t\tonKeyDownCapture={(event) => {\n\t\t\t\t\t\t\tif (!(event.target instanceof HTMLInputElement)) return\n\t\t\t\t\t\t\tif (event.key === 'Tab' && showCommandList && (!error || event.shiftKey)) {\n\t\t\t\t\t\t\t\t// Remove closing popup guards before native Tab follows the page order.\n\t\t\t\t\t\t\t\t// A forward Tab on an error still reaches the popup's Retry action.\n\t\t\t\t\t\t\t\tflushSync(() => {\n\t\t\t\t\t\t\t\t\tsetIsListDismissed(true)\n\t\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tpopoverActionsRef.current?.unmount()\n\t\t\t\t\t\t\t} else if (event.key === 'Escape') {\n\t\t\t\t\t\t\t\tsetIsListDismissed(true)\n\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t} else if (results.length && ['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n\t\t\t\t\t\t\t\tsetIsListDismissed(false)\n\t\t\t\t\t\t\t\tconst next = event.key === 'Home' ? 0 : event.key === 'End' ? results.length - 1 : activeIndex < 0 ? (event.key === 'ArrowDown' ? 0 : results.length - 1) : (activeIndex + (event.key === 'ArrowDown' ? 1 : -1) + results.length) % results.length\n\t\t\t\t\t\t\t\tsetActiveIndex(next)\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t} else if (event.key === 'Enter' && showCommandList && results[activeIndex]) {\n\t\t\t\t\t\t\t\tselectPlace(results[activeIndex])\n\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshouldFilter={false}\n\t\t\t\t\t\tloop>\n\t\t\t\t\t\t<Popover\n\t\t\t\t\t\t\t\tactionsRef={popoverActionsRef}\n\t\t\t\t\t\t\t\topen={showCommandList}\n\t\t\t\t\t\t\t\tonOpenChange={(open, details) => {\n\t\t\t\t\t\t\t\t\t\t// The visible input is part of this composite, outside the portal.\n\t\t\t\t\t\t\t\t\t\tif (!open && details.reason === 'focus-out' && document.activeElement === anchorRef.current?.querySelector('input')) {\n\t\t\t\t\t\t\t\t\t\t\t\tdetails.cancel()\n\t\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (!open) setIsListDismissed(true)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div ref={anchorRef} className=\"place-autocomplete--anchor relative\">\n\t\t\t\t\t\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\t\t\t\t\t\t\trender={<span />}\n\t\t\t\t\t\t\t\t\t\t\t\tnativeButton={false}\n\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"pointer-events-none absolute inset-0\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<InputGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SearchIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupInput\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-expanded={showCommandList}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-controls={showCommandList ? listId : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-activedescendant={showCommandList && results[activeIndex] ? optionId(activeIndex) : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst newValue = event.target.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!isControlled) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetInternalValue(newValue)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetIsListDismissed(false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearchQuery(newValue)\n\t\t\t\t\t\t\t\t\t\tsetActiveIndex(-1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontrolledOnValueChange?.(newValue)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (hasCommandList) setIsListDismissed(false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputOnFocus?.(event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!isLoading && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2Icon className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</InputGroup>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\t\taria-label={strings.searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\t\t\tinitialFocus={false}\n\t\t\t\t\t\t\t\t\t\tfinalFocus={false}\n\t\t\t\t\t\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"place-autocomplete--results w-[var(--anchor-width)] max-w-[var(--available-width)] gap-0 overflow-hidden\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CommandList id={listId} label={strings.searchPlaceholder}>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!error && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" align=\"center\" className=\"block\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPlaceAutocompleteString(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.error,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ message: error.message }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button buttonStyle=\"ghost\" size=\"sm\" onClick={() => { anchorRef.current?.querySelector('input')?.focus(); setIsListDismissed(false); retry() }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.retry ?? defaultPlaceAutocompleteStrings.retry}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{!!hasNoResults && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" align=\"center\" className=\"block\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formatPlaceAutocompleteString(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.noResults,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ query: displayValue }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandEmpty>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{results.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{results.map((feature, index) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst formattedAddress = formatAddress(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfeature.properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={placeFeatureId(feature)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={placeFeatureId(feature)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => { if (node) optionNodes.current.set(index, node); else optionNodes.current.delete(index) }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => selectPlace(feature)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<MapPinIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-start text-start\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{feature.properties.name ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfeature.properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.street ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings.unknownPlace}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{formattedAddress}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</CommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</CommandList>\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t</Popover>\n\t\t\t\t</Command>\n\t\t)\n}\n\nexport {\n\t\tPlaceAutocomplete,\n\t\tdefaultPlaceAutocompleteStrings,\n\t\ttype PlaceAutocompleteProps,\n\t\ttype PlaceAutocompleteStrings,\n\t\ttype PlaceFeature,\n\t\ttype PlaceSearchOptions,\n\t\ttype PlaceSearchCallback,\n}\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/** Observe inherited CSS theme classes without adding a second theme store. */\nexport function useMapColorScheme(container: HTMLElement | null): 'light' | 'dark' {\n const read = useCallback(() => {\n for(let node=container;node;node=node.parentElement) {\n if(node.classList.contains('dark')) return 'dark';\n if(node.classList.contains('light')) return 'light';\n }\n return 'light';\n },[container]);\n const subscribe = useCallback((notify: () => void) => {\n const observer=new MutationObserver(notify);\n for(let node=container;node;node=node.parentElement) observer.observe(node,{attributes:true,attributeFilter:['class']});\n return () => observer.disconnect();\n },[container]);\n return useSyncExternalStore(subscribe,read,()=>'light');\n}\n","\"use client\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { layerRecipes } from \"../../../lib/layer-recipes\"\nimport { elevationRecipes } from \"../../../lib/surface-recipes\"\nimport { popoverRecipes } from \"../../base/popover/popover.recipes\"\nimport { resolveTextClassNames } from \"../../typography/text.styles\"\nimport { useStrings, type StringsProp } from \"../../../lib/strings\"\nimport { Button, ButtonGroup } from \"../../base/buttons\"\nimport {\n\t\tDropdownMenu,\n\t\tDropdownMenuCheckboxItem,\n\t\tDropdownMenuContent,\n\t\tDropdownMenuGroup,\n\t\tDropdownMenuLabel,\n\t\tDropdownMenuRadioGroup,\n\t\tDropdownMenuRadioItem,\n\t\tDropdownMenuSeparator,\n\t\tDropdownMenuTrigger,\n} from \"../../base/navigation/dropdown-menu\"\nimport {\n\t\tPlaceAutocomplete,\n\t\ttype PlaceAutocompleteProps,\n} from \"./place-autocomplete\"\nimport type {\n\t\tCircle,\n\t\tCircleMarker,\n\t\tDivIconOptions,\n\t\tDraw,\n\t\tDrawEvents,\n\t\tDrawMap,\n\t\tDrawOptions,\n\t\tEditToolbar,\n\t\tErrorEvent,\n\t\tFeatureGroup,\n\t\tLatLngExpression,\n\t\tLayerGroup,\n\t\tMap as LeafletMap,\n\t\tLocateOptions,\n\t\tLocationEvent,\n\t\tMarker,\n\t\tMarkerCluster,\n\t\tPointExpression,\n\t\tPolygon,\n\t\tPolyline,\n\t\tPopup,\n\t\tRectangle,\n\t\tTileLayer,\n\t\tTooltip,\n} from \"leaflet\"\nimport type * as LeafletDrawNamespace from \"leaflet-draw\"\nimport type * as LeafletNamespace from \"leaflet\"\nimport type {} from \"leaflet.markercluster\"\nimport {\n\t\tCircleIcon,\n\t\tLayersIcon,\n\t\tLoaderCircleIcon,\n\t\tMapPinIcon,\n\t\tMaximizeIcon,\n\t\tMinimizeIcon,\n\t\tMinusIcon,\n\t\tNavigationIcon,\n\t\tPenLineIcon,\n\t\tPentagonIcon,\n\t\tPlusIcon,\n\t\tSquareIcon,\n\t\tTrash2Icon,\n\t\tUndo2Icon,\n\t\tWaypointsIcon,\n} from \"lucide-react\"\nimport React, {\n\t\tSuspense,\n\t\tcreateContext,\n\t\tlazy,\n\t\tuseCallback,\n\t\tuseContext,\n\t\tuseEffect,\n\t\tuseMemo,\n\t\tuseRef,\n\t\tuseState,\n\t\ttype ComponentType,\n\t\ttype ReactNode,\n\t\ttype Ref,\n} from \"react\"\nimport { useMapColorScheme } from './use-map-color-scheme';\nimport { renderToString } from \"react-dom/server\"\nimport type {\n\t\tCircleMarkerProps,\n\t\tCircleProps,\n\t\tLayerGroupProps,\n\t\tMapContainerProps,\n\t\tMarkerProps,\n\t\tPolygonProps,\n\t\tPolylineProps,\n\t\tPopupProps,\n\t\tRectangleProps,\n\t\tTileLayerProps,\n\t\tTooltipProps,\n\t\tMarkerClusterGroupProps,\n} from \"./public-leaflet.types\"\n\n/**\n * Floating map controls sit over arbitrary tiles, so each one is an outline\n * button (the shared control boundary) on an opaque card surface with the card\n * elevation for small controls over media; hover and press keep the button's own\n * fills. An active tool keeps its solid primary fill and the same elevation.\n */\nconst mapControlSurface = cn(\"bg-card\", elevationRecipes.card)\nconst mapControlActiveSurface = elevationRecipes.card\n\ntype LeafletModule = typeof LeafletNamespace\ntype LeafletDrawModule = typeof LeafletDrawNamespace\ntype ReactLeafletModule = typeof import(\"react-leaflet\")\ntype ReactLeafletHooks = Pick<ReactLeafletModule, \"useMap\" | \"useMapEvents\">\n\nconst ReactLeafletHooksContext = createContext<ReactLeafletHooks | null>(null)\n\nexport interface MapStrings {\n\t\t/** Id of the tile layer shown first. */\n\t\tdefaultTileLayer: string\n\t\tmapType: string\n\t\tlayers: string\n\t\tselectLayers: string\n\t\tmarker: string\n\t\tzoomControls: string\n\t\tzoomIn: string\n\t\tzoomOut: string\n\t\tenterFullscreen: string\n\t\texitFullscreen: string\n\t\tlocating: string\n\t\tstopTracking: string\n\t\ttrackLocation: string\n\t\tstopLocationTracking: string\n\t\tstartLocationTracking: string\n\t\tcurrentLocation: string\n\t\tdrawMarker: string\n\t\tdrawPolyline: string\n\t\tdrawCircle: string\n\t\tdrawRectangle: string\n\t\tdrawPolygon: string\n\t\teditShapes: string\n\t\tremoveShapes: string\n\t\tundoEdit: string\n\t\tundoRemove: string\n\t\teditInstructions: string\n\t\tremoveInstructions: string\n}\n\nexport const defaultMapStrings: MapStrings = {\n\t\tdefaultTileLayer: \"Default\",\n\t\tmapType: \"Map type\",\n\t\tlayers: \"Layers\",\n\t\tselectLayers: \"Select layers\",\n\t\tmarker: \"Map marker\",\n\t\tzoomControls: \"Zoom controls\",\n\t\tzoomIn: \"Zoom in\",\n\t\tzoomOut: \"Zoom out\",\n\t\tenterFullscreen: \"Enter fullscreen\",\n\t\texitFullscreen: \"Exit fullscreen\",\n\t\tlocating: \"Locating…\",\n\t\tstopTracking: \"Stop tracking\",\n\t\ttrackLocation: \"Track location\",\n\t\tstopLocationTracking: \"Stop location tracking\",\n\t\tstartLocationTracking: \"Start location tracking\",\n\t\tcurrentLocation: \"Current location\",\n\t\tdrawMarker: \"Draw marker\",\n\t\tdrawPolyline: \"Draw polyline\",\n\t\tdrawCircle: \"Draw circle\",\n\t\tdrawRectangle: \"Draw rectangle\",\n\t\tdrawPolygon: \"Draw polygon\",\n\t\teditShapes: \"Edit shapes\",\n\t\tremoveShapes: \"Remove shapes\",\n\t\tundoEdit: \"Undo edit\",\n\t\tundoRemove: \"Undo remove\",\n\t\teditInstructions: \"Drag handles or markers to edit.\",\n\t\tremoveInstructions: \"Click on a shape to remove.\",\n}\n\nconst MapStringsContext = createContext<MapStrings>(defaultMapStrings)\n\nfunction useMapStrings() {\n\t\treturn useContext(MapStringsContext)\n}\n\n// Load the shared runtime before mounting MapContainer. Suspending below an\n// already initialized MapContainer disconnects its passive cleanup and removes\n// the Leaflet instance, leaving its visible markers attached to a stale map.\nconst ReactLeafletRuntimeContext = createContext<ReactLeafletModule | null>(null)\nconst ReactLeafletRuntime = lazy(async () => {\n\tconst mod = await import(\"react-leaflet\")\n\treturn { default: ({ children }: { children?: ReactNode }) => (\n\t\t<ReactLeafletRuntimeContext.Provider value={mod}>{children}</ReactLeafletRuntimeContext.Provider>\n\t) }\n})\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors React ComponentType's generic constraint.\nfunction createRuntimeComponent<T extends ComponentType<any>>(select: (runtime: ReactLeafletModule) => T) {\n\treturn (props: React.ComponentProps<T>) => {\n\t\tconst runtime = useContext(ReactLeafletRuntimeContext)\n\t\tif (!runtime) throw new Error(\"Map primitives must be rendered within Map.\")\n\t\tconst Component = select(runtime)\n\t\treturn <Component {...props} />\n\t}\n}\n\nconst LeafletMapContainer = createRuntimeComponent(mod => mod.MapContainer)\nconst LeafletTileLayer = createRuntimeComponent(mod => mod.TileLayer)\nconst LeafletMarker = createRuntimeComponent(mod => mod.Marker)\nconst LeafletPopup = createRuntimeComponent(mod => mod.Popup)\nconst LeafletTooltip = createRuntimeComponent(mod => mod.Tooltip)\nconst LeafletCircle = createRuntimeComponent(mod => mod.Circle)\nconst LeafletCircleMarker = createRuntimeComponent(mod => mod.CircleMarker)\nconst LeafletPolyline = createRuntimeComponent(mod => mod.Polyline)\nconst LeafletPolygon = createRuntimeComponent(mod => mod.Polygon)\nconst LeafletRectangle = createRuntimeComponent(mod => mod.Rectangle)\nconst LeafletLayerGroup = createRuntimeComponent(mod => mod.LayerGroup)\nconst LeafletFeatureGroup = createRuntimeComponent(mod => mod.FeatureGroup)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors React lazy's ComponentType constraint.\nfunction createLazyComponent<T extends ComponentType<any>>(factory: () => Promise<{ default: T }>) {\n\tconst Component = lazy(factory)\n\treturn (props: React.ComponentProps<T>) => <Suspense><Component {...props} /></Suspense>\n}\nconst LeafletMarkerClusterGroup = createLazyComponent(async () =>\n\timport(\"react-leaflet-markercluster\").then(mod => ({ default: mod.default }))\n)\n\nfunction ReactLeafletHooksProvider({ children }: { children?: ReactNode }) {\n\tconst mod = useContext(ReactLeafletRuntimeContext)\n\tif (!mod) throw new Error(\"Map controls must be rendered within Map.\")\n\treturn <ReactLeafletHooksContext.Provider value={mod}>{children}</ReactLeafletHooksContext.Provider>\n}\n\nfunction useLeafletMap() {\n\t\tconst hooks = useContext(ReactLeafletHooksContext)\n\t\tif (!hooks) {\n\t\t\t\tthrow new Error(\"Map controls must be rendered within Map.\")\n\t\t}\n\n\t\treturn hooks.useMap()\n}\n\nfunction useLeafletMapEvents(\n\t\thandlers: Parameters<ReactLeafletModule[\"useMapEvents\"]>[0]\n) {\n\t\tconst hooks = useContext(ReactLeafletHooksContext)\n\t\tif (!hooks) {\n\t\t\t\tthrow new Error(\"Map controls must be rendered within Map.\")\n\t\t}\n\n\t\treturn hooks.useMapEvents(handlers)\n}\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n\t\tif (!ref) return\n\n\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(value)\n\t\t\t\treturn\n\t\t}\n\n\t\t;(ref as React.MutableRefObject<T | null>).current = value\n}\n\nfunction Map({\n\t\tzoom = 15,\n\t\tmaxZoom = 18,\n\t\tclassName,\n\t\tchildren,\n\t\tstrings: stringsProp,\n\t\tref,\n\t\t...props\n}: Omit<MapContainerProps, \"zoomControl\"> & {\n\t\tcenter: LatLngExpression\n\t\tref?: Ref<LeafletMap>\n\t\t/** Overrides the map's own copy. */\n\t\tstrings?: StringsProp<MapStrings>\n}) {\n\t\tconst strings = useStrings(defaultMapStrings, stringsProp)\n\t\tconst focusCleanup = useRef<(() => void) | null>(null)\n\t\tconst handleMapRef = useCallback((map: LeafletMap | null) => {\n\t\t\tfocusCleanup.current?.()\n\t\t\tfocusCleanup.current = null\n\t\t\tif (map?.options.keyboard) {\n\t\t\t\tconst container = map.getContainer()\n\t\t\t\t// Leaflet's keyboard mousedown handler uses plain focus and only\n\t\t\t\t// restores window scroll. Focus first without moving nested scrollers\n\t\t\t\t// so pointerup still lands on the marker pressed by pointerdown.\n\t\t\t\tconst focusWithoutScroll = () => {\n\t\t\t\t\tif (document.activeElement !== container) container.focus({ preventScroll: true })\n\t\t\t\t}\n\t\t\t\tcontainer.addEventListener(\"mousedown\", focusWithoutScroll, true)\n\t\t\t\tfocusCleanup.current = () => container.removeEventListener(\"mousedown\", focusWithoutScroll, true)\n\t\t\t}\n\t\t\tassignRef(ref, map)\n\t\t}, [ref])\n\t\t// Keep the optional runtime outside the server tree.\n\t\tconst [isMounted, setIsMounted] = useState(false)\n\t\tuseEffect(() => { setIsMounted(true) }, [])\n\t\tif (!isMounted) return null\n\t\treturn (\n\t\t\t\t<Suspense>\n\t\t\t\t<ReactLeafletRuntime>\n\t\t\t\t<LeafletMapContainer\n\t\t\t\t\t\tref={handleMapRef}\n\t\t\t\t\t\tzoom={zoom}\n\t\t\t\t\t\tmaxZoom={maxZoom}\n\t\t\t\t\t\tattributionControl={false}\n\t\t\t\t\t\tzoomControl={false}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t// The themed background lives in `map.css`: Leaflet's own\n\t\t\t\t\t\t\t\t// `.leaflet-container { background: #ddd }` is unlayered, so it beats a\n\t\t\t\t\t\t\t\t// `bg-muted` utility on this element regardless of import order.\n\t\t\t\t\t\t\t\t'map--component',\n\t\t\t\t\t\t\t\t\"z-50 size-full min-h-0 flex-1 rounded-surface\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t<MapStringsContext.Provider value={strings}>\n\t\t\t\t\t\t\t\t<ReactLeafletHooksProvider>{children}</ReactLeafletHooksProvider>\n\t\t\t\t\t\t</MapStringsContext.Provider>\n\t\t\t\t</LeafletMapContainer>\n\t\t\t\t</ReactLeafletRuntime>\n\t\t\t\t</Suspense>\n\t\t)\n}\n\ninterface MapTileLayerOption {\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname: string\n\t\t/** Tile URL template. */\n\t\turl: string\n\t\t/** Attribution shown for the tile layer. */\n\t\tattribution?: string\n}\n\ninterface MapLayerGroupOption\n\t\textends Pick<React.ComponentProps<typeof DropdownMenuCheckboxItem>, \"disabled\"> {\n\t\t/** Form field name, forwarded for native submits. */\n\t\tname: string\n}\n\ninterface MapLayersContextType {\n\t\t/** Adds the layer, or replaces the entry of the same name in place. */\n\t\tregisterTileLayer: (layer: MapTileLayerOption) => void\n\t\tunregisterTileLayer: (name: string) => void\n\t\ttileLayers: MapTileLayerOption[]\n\t\tselectedTileLayer: string\n\t\tsetSelectedTileLayer: (name: string) => void\n\t\t/** Adds the group, or replaces the entry of the same name in place. */\n\t\tregisterLayerGroup: (layer: MapLayerGroupOption) => void\n\t\tunregisterLayerGroup: (name: string) => void\n\t\tlayerGroups: MapLayerGroupOption[]\n\t\tactiveLayerGroups: string[]\n\t\tsetActiveLayerGroups: (names: string[]) => void\n}\n\nconst MapLayersContext = createContext<MapLayersContextType | null>(null)\n\nfunction useMapLayersContext() {\n\t\treturn useContext(MapLayersContext)\n}\n\nfunction MapTileLayer({\n\t\tname: nameProp,\n\t\turl,\n\t\tattribution,\n\t\tdarkUrl,\n\t\tdarkAttribution,\n\t\t...props\n}: Partial<TileLayerProps> & {\n\t\t/** Display name for the layer in the layer control. */\n\t\tname?: string\n\t\t/** Tile URL used when the dark theme is active. */\n\t\tdarkUrl?: string\n\t\t/** Attribution shown for the dark tile layer. */\n\t\tdarkAttribution?: string\n\t\tref?: Ref<TileLayer>\n}) {\n\t\tconst strings = useMapStrings()\n\t\tconst name = nameProp ?? strings.defaultTileLayer\n\t\tconst map = useLeafletMap()\n\t\tif (map.attributionControl) {\n\t\t\t\tmap.attributionControl.setPrefix(\"\")\n\t\t}\n\n\t\tconst context = useContext(MapLayersContext)\n\t\tconst DEFAULT_URL =\n\t\t\t\t\"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\"\n\t\tconst DEFAULT_DARK_URL =\n\t\t\t\t\"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\"\n\n\t\tconst resolvedTheme = useMapColorScheme(map.getContainer())\n\t\tconst resolvedUrl =\n\t\t\t\tresolvedTheme === \"dark\"\n\t\t\t\t\t\t? (darkUrl ?? url ?? DEFAULT_DARK_URL)\n\t\t\t\t\t\t: (url ?? DEFAULT_URL)\n\t\tconst resolvedAttribution =\n\t\t\t\tresolvedTheme === \"dark\" && darkAttribution\n\t\t\t\t\t\t? darkAttribution\n\t\t\t\t\t\t: (attribution ??\n\t\t\t\t\t\t\t'&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>, &copy; <a href=\"https://carto.com/attributions\">CARTO</a>')\n\n\t\t// The registry functions are stable, so these effects follow the layer's\n\t\t// own props rather than every MapLayers render. Registering replaces the\n\t\t// entry in place, which keeps its position in the control; only a rename\n\t\t// or an unmount removes it.\n\t\tconst registerTileLayer = context?.registerTileLayer\n\t\tconst unregisterTileLayer = context?.unregisterTileLayer\n\t\tuseEffect(() => {\n\t\t\t\tregisterTileLayer?.({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\turl: resolvedUrl,\n\t\t\t\t\t\tattribution: resolvedAttribution,\n\t\t\t\t})\n\t\t}, [registerTileLayer, name, resolvedAttribution, resolvedUrl])\n\t\tuseEffect(() => {\n\t\t\t\tif (!unregisterTileLayer) return\n\t\t\t\treturn () => unregisterTileLayer(name)\n\t\t}, [unregisterTileLayer, name])\n\n\t\tif (context && context.selectedTileLayer !== name) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn (\n\t\t\t\t<LeafletTileLayer\n\t\t\t\t\t\turl={resolvedUrl}\n\t\t\t\t\t\tattribution={resolvedAttribution}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\n/** Keeps a layer group's entry in the layers control in step with its props, and removes it on unmount. */\nfunction useRegisteredLayerGroup(\n\t\tcontext: MapLayersContextType | null,\n\t\tname: string,\n\t\tdisabled: MapLayerGroupOption[\"disabled\"]\n) {\n\t\tconst registerLayerGroup = context?.registerLayerGroup\n\t\tconst unregisterLayerGroup = context?.unregisterLayerGroup\n\t\tuseEffect(() => {\n\t\t\t\tregisterLayerGroup?.({ name, disabled })\n\t\t}, [registerLayerGroup, name, disabled])\n\t\tuseEffect(() => {\n\t\t\t\tif (!unregisterLayerGroup) return\n\t\t\t\treturn () => unregisterLayerGroup(name)\n\t\t}, [unregisterLayerGroup, name])\n}\n\nfunction MapLayerGroup({\n\t\tname,\n\t\tdisabled,\n\t\t...props\n}: LayerGroupProps & MapLayerGroupOption & { ref?: Ref<LayerGroup> }) {\n\t\tconst context = useMapLayersContext()\n\n\t\tuseRegisteredLayerGroup(context, name, disabled)\n\n\t\tif (context && !context.activeLayerGroups.includes(name)) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn <LeafletLayerGroup {...props} />\n}\n\nfunction MapFeatureGroup({\n\t\tname,\n\t\tdisabled,\n\t\t...props\n}: LayerGroupProps & MapLayerGroupOption & { ref?: Ref<FeatureGroup> }) {\n\t\tconst context = useMapLayersContext()\n\n\t\tuseRegisteredLayerGroup(context, name, disabled)\n\n\t\tif (context && !context.activeLayerGroups.includes(name)) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn <LeafletFeatureGroup {...props} />\n}\n\nfunction MapLayers({\n\t\tdefaultTileLayer,\n\t\tdefaultLayerGroups = [],\n\t\t...props\n}: Omit<React.ComponentProps<typeof MapLayersContext.Provider>, \"value\"> & {\n\t\t/** Name of the tile layer shown first. */\n\t\tdefaultTileLayer?: string\n\t\t/** Names of the overlay groups shown first. */\n\t\tdefaultLayerGroups?: string[]\n}) {\n\t\tconst [tileLayers, setTileLayers] = useState<MapTileLayerOption[]>([])\n\t\tconst [chosenTileLayer, setSelectedTileLayer] = useState<string>(\n\t\t\t\tdefaultTileLayer || \"\"\n\t\t)\n\t\tconst [layerGroups, setLayerGroups] = useState<MapLayerGroupOption[]>([])\n\t\tconst [activeLayerGroups, setActiveLayerGroups] =\n\t\t\t\tuseState<string[]>(defaultLayerGroups)\n\n\t\t// Stable identities: the layers depend on these in their effects, so a new\n\t\t// function per render would re-register every layer on every render.\n\t\tconst registerTileLayer = useCallback((tileLayer: MapTileLayerOption) => {\n\t\t\t\tsetTileLayers((previous) => {\n\t\t\t\t\t\tconst index = previous.findIndex((layer) => layer.name === tileLayer.name)\n\t\t\t\t\t\tif (index === -1) return [...previous, tileLayer]\n\t\t\t\t\t\tconst current = previous[index]\n\t\t\t\t\t\tif (current.url === tileLayer.url && current.attribution === tileLayer.attribution) return previous\n\t\t\t\t\t\treturn previous.map((layer, position) => (position === index ? tileLayer : layer))\n\t\t\t\t})\n\t\t}, [])\n\t\tconst unregisterTileLayer = useCallback((name: string) => {\n\t\t\t\tsetTileLayers((previous) => previous.filter((layer) => layer.name !== name))\n\t\t}, [])\n\t\tconst registerLayerGroup = useCallback((layerGroup: MapLayerGroupOption) => {\n\t\t\t\tsetLayerGroups((previous) => {\n\t\t\t\t\t\tconst index = previous.findIndex((group) => group.name === layerGroup.name)\n\t\t\t\t\t\tif (index === -1) return [...previous, layerGroup]\n\t\t\t\t\t\tif (previous[index].disabled === layerGroup.disabled) return previous\n\t\t\t\t\t\treturn previous.map((group, position) => (position === index ? layerGroup : group))\n\t\t\t\t})\n\t\t}, [])\n\t\tconst unregisterLayerGroup = useCallback((name: string) => {\n\t\t\t\tsetLayerGroups((previous) => previous.filter((group) => group.name !== name))\n\t\t}, [])\n\n\t\t// The basemap on screen is always a registered one. Before any layer has\n\t\t// registered the choice stands as given; once the chosen layer is gone\n\t\t// (it unmounted or was renamed) the first remaining layer takes over.\n\t\tconst selectedTileLayer =\n\t\t\t\ttileLayers.length === 0 || tileLayers.some((layer) => layer.name === chosenTileLayer)\n\t\t\t\t\t\t? chosenTileLayer\n\t\t\t\t\t\t: tileLayers[0].name\n\n\t\t// The defaults are checked once, against the first layers to register. A\n\t\t// default layer that unmounts later is an ordinary app, not a mistake.\n\t\tconst checkedDefaultTileLayer = useRef(false)\n\t\tconst checkedDefaultLayerGroups = useRef(false)\n\t\tuseEffect(() => {\n\t\t\t\tif (tileLayers.length > 0 && !checkedDefaultTileLayer.current) {\n\t\t\t\t\t\tcheckedDefaultTileLayer.current = true\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tdefaultTileLayer &&\n\t\t\t\t\t\t\t\t!tileLayers.some((tileLayer) => tileLayer.name === defaultTileLayer)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid defaultTileLayer \"${defaultTileLayer}\" provided to MapLayers. It must match a MapTileLayer's name prop.`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (layerGroups.length > 0 && !checkedDefaultLayerGroups.current) {\n\t\t\t\t\t\tcheckedDefaultLayerGroups.current = true\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tdefaultLayerGroups.some(\n\t\t\t\t\t\t\t\t\t\t(name) => !layerGroups.some((group) => group.name === name)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid defaultLayerGroups value provided to MapLayers. All names must match a MapLayerGroup's name prop.`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}, [tileLayers, defaultTileLayer, layerGroups, defaultLayerGroups])\n\n\t\tconst value = useMemo<MapLayersContextType>(\n\t\t\t\t() => ({\n\t\t\t\t\t\tregisterTileLayer,\n\t\t\t\t\t\tunregisterTileLayer,\n\t\t\t\t\t\ttileLayers,\n\t\t\t\t\t\tselectedTileLayer,\n\t\t\t\t\t\tsetSelectedTileLayer,\n\t\t\t\t\t\tregisterLayerGroup,\n\t\t\t\t\t\tunregisterLayerGroup,\n\t\t\t\t\t\tlayerGroups,\n\t\t\t\t\t\tactiveLayerGroups,\n\t\t\t\t\t\tsetActiveLayerGroups,\n\t\t\t\t}),\n\t\t\t\t[\n\t\t\t\t\t\tregisterTileLayer,\n\t\t\t\t\t\tunregisterTileLayer,\n\t\t\t\t\t\ttileLayers,\n\t\t\t\t\t\tselectedTileLayer,\n\t\t\t\t\t\tregisterLayerGroup,\n\t\t\t\t\t\tunregisterLayerGroup,\n\t\t\t\t\t\tlayerGroups,\n\t\t\t\t\t\tactiveLayerGroups,\n\t\t\t\t]\n\t\t)\n\n\t\treturn <MapLayersContext.Provider value={value} {...props} />\n}\n\nfunction MapLayersControl({\n\t\ttileLayersLabel,\n\t\tlayerGroupsLabel,\n\t\tposition = \"top-1 right-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\t/** Heading for the tile-layer group in the layer control. */\n\t\ttileLayersLabel?: string\n\t\t/** Heading for the overlay group in the layer control. */\n\t\tlayerGroupsLabel?: string\n\t\t/** Corner the control is anchored to. */\n\t\tposition?: string\n}) {\n\t\tconst strings = useMapStrings()\n\t\tconst layersContext = useMapLayersContext()\n\t\tif (!layersContext) {\n\t\t\t\tthrow new Error(\"MapLayersControl must be used within MapLayers\")\n\t\t}\n\n\t\tconst {\n\t\t\t\ttileLayers,\n\t\t\t\tselectedTileLayer,\n\t\t\t\tsetSelectedTileLayer,\n\t\t\t\tlayerGroups,\n\t\t\t\tactiveLayerGroups,\n\t\t\t\tsetActiveLayerGroups,\n\t\t} = layersContext\n\n\t\tif (tileLayers.length === 0 && layerGroups.length === 0) {\n\t\t\t\treturn null\n\t\t}\n\n\t\tfunction handleLayerGroupToggle(name: string, checked: boolean) {\n\t\t\t\tsetActiveLayerGroups(\n\t\t\t\t\t\tchecked\n\t\t\t\t\t\t\t\t? [...activeLayerGroups, name]\n\t\t\t\t\t\t\t\t: activeLayerGroups.filter((groupName) => groupName !== name)\n\t\t\t\t)\n\t\t}\n\n\t\tconst showTileLayersDropdown = tileLayers.length > 1\n\t\tconst showLayerGroupsDropdown = layerGroups.length > 0\n\n\t\tif (!showTileLayersDropdown && !showLayerGroupsDropdown) {\n\t\t\t\treturn null\n\t\t}\n\n\t\treturn (\n\t\t\t\t<DropdownMenu>\n\t\t\t\t\t\t<DropdownMenuTrigger\n\t\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.selectLayers}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={strings.selectLayers}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmapControlSurface,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"absolute z-1000\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerProps.className\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<LayersIcon />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<DropdownMenuContent align=\"end\" className=\"z-1000\">\n\t\t\t\t\t\t\t\t{!!showTileLayersDropdown && <>\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={selectedTileLayer}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonValueChange={setSelectedTileLayer}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuLabel>{tileLayersLabel ?? strings.mapType}</DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tileLayers.map((tileLayer) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={tileLayer.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={tileLayer.name}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{tileLayer.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t\t\t\t\t\t\t\t</>}\n\t\t\t\t\t\t\t\t{!!showTileLayersDropdown && !!showLayerGroupsDropdown && <DropdownMenuSeparator />}\n\t\t\t\t\t\t\t\t{!!showLayerGroupsDropdown && (\n\t\t\t\t\t\t\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{layerGroupsLabel ?? strings.layers}\n\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t{layerGroups.map((layerGroup) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DropdownMenuCheckboxItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={layerGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={activeLayerGroups.includes(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayerGroup.name\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={layerGroup.disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleLayerGroupToggle(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlayerGroup.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{layerGroup.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</DropdownMenuCheckboxItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</DropdownMenuGroup>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</DropdownMenuContent>\n\t\t\t\t</DropdownMenu>\n\t\t)\n}\n\nfunction MapMarker({\n\t\ticon = <MapPinIcon className=\"size-icon-lg fill-background text-foreground\" />,\n\t\ticonAnchor = [12, 12],\n\t\tbgPos,\n\t\tpopupAnchor,\n\t\ttooltipAnchor,\n\t\tariaLabel,\n\t\tref,\n\t\t...props\n}: Omit<MarkerProps, \"icon\"> &\n\t\tPick<\n\t\t\t\tDivIconOptions,\n\t\t\t\t\"iconAnchor\" | \"bgPos\" | \"popupAnchor\" | \"tooltipAnchor\"\n\t\t> & {\n\t\t\t\ticon?: ReactNode\n\t\t\t\tariaLabel?: string\n\t\t\t\tref?: Ref<Marker>\n\t\t}) {\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst markerRef = useRef<Marker | null>(null)\n\t\tconst resolvedAriaLabel =\n\t\t\t\tariaLabel ??\n\t\t\t\t(typeof props.title === \"string\" && props.title.trim()\n\t\t\t\t\t\t? props.title\n\t\t\t\t\t\t: undefined) ??\n\t\t\t\tstrings.marker\n\t\tconst resolvedTitle =\n\t\t\t\ttypeof props.title === \"string\" && props.title.trim()\n\t\t\t\t\t\t? props.title\n\t\t\t\t\t\t: resolvedAriaLabel\n\t\tconst syncMarkerElement = useCallback(\n\t\t\t\t(marker: Marker | null) => {\n\t\t\t\t\t\tconst element = marker?.getElement()\n\t\t\t\t\t\tif (!element) return\n\n\t\t\t\t\t\telement.setAttribute(\"aria-label\", resolvedAriaLabel)\n\t\t\t\t\t\tif (!element.getAttribute(\"title\")) {\n\t\t\t\t\t\t\t\telement.setAttribute(\"title\", resolvedAriaLabel)\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[resolvedAriaLabel]\n\t\t)\n\t\tconst handleMarkerRef = useCallback(\n\t\t\t\t(marker: Marker | null) => {\n\t\t\t\t\t\tmarkerRef.current = marker\n\t\t\t\t\t\tassignRef(ref, marker)\n\t\t\t\t\t\tsyncMarkerElement(marker)\n\t\t\t\t},\n\t\t\t\t[ref, syncMarkerElement]\n\t\t)\n\n\t\tuseEffect(() => {\n\t\t\t\tsyncMarkerElement(markerRef.current)\n\t\t}, [syncMarkerElement])\n\n\t\tif (!L) return null\n\n\t\treturn (\n\t\t\t\t<LeafletMarker\n\t\t\t\t\t\tref={handleMarkerRef}\n\t\t\t\t\t\ticon={L.divIcon({\n\t\t\t\t\t\t\t\t// Empty className stops leaflet's default `.leaflet-div-icon`\n\t\t\t\t\t\t\t\t// (white background + grey border rectangle) from being applied\n\t\t\t\t\t\t\t\t// around our SVG marker.\n\t\t\t\t\t\t\t\tclassName: \"\",\n\t\t\t\t\t\t\t\thtml: renderToString(icon),\n\t\t\t\t\t\t\t\ticonAnchor,\n\t\t\t\t\t\t\t\t...(bgPos ? { bgPos } : {}),\n\t\t\t\t\t\t\t\t...(popupAnchor ? { popupAnchor } : {}),\n\t\t\t\t\t\t\t\t...(tooltipAnchor ? { tooltipAnchor } : {}),\n\t\t\t\t\t\t})}\n\t\t\t\t\t\triseOnHover\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\ttitle={resolvedTitle}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapMarkerClusterGroup({\n\t\tpolygonOptions = {\n\t\t\t\tclassName: \"fill-foreground stroke-foreground stroke-2\",\n\t\t},\n\t\tspiderLegPolylineOptions = {\n\t\t\t\tclassName: \"fill-foreground stroke-foreground stroke-2\",\n\t\t},\n\t\ticon,\n\t\t...props\n}: Omit<MarkerClusterGroupProps, \"iconCreateFunction\"> & {\n\t\tchildren: ReactNode\n\t\t/** Marker glyph. */\n\t\ticon?: (markerCount: number) => ReactNode\n}) {\n\t\tconst { L } = useLeaflet()\n\t\tif (!L) return null\n\n\t\tconst iconCreateFunction = icon\n\t\t\t\t? (cluster: MarkerCluster) => {\n\t\t\t\t\t\t\tconst markerCount = cluster.getChildCount()\n\t\t\t\t\t\t\tconst iconNode = icon(markerCount)\n\t\t\t\t\t\t\treturn L.divIcon({\n\t\t\t\t\t\t\t\t\thtml: renderToString(iconNode),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\treturn (\n\t\t\t\t<LeafletMarkerClusterGroup\n\t\t\t\t\t\tpolygonOptions={polygonOptions}\n\t\t\t\t\t\tspiderLegPolylineOptions={spiderLegPolylineOptions}\n\t\t\t\t\t\ticonCreateFunction={iconCreateFunction}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapCircle({\n\t\tclassName,\n\t\t...props\n}: CircleProps & { ref?: Ref<Circle> }) {\n\t\treturn (\n\t\t\t\t<LeafletCircle\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapCircleMarker({\n\t\tclassName,\n\t\t...props\n}: CircleMarkerProps & { ref?: Ref<CircleMarker> }) {\n\t\treturn (\n\t\t\t\t<LeafletCircleMarker\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPolyline({\n\t\tclassName,\n\t\t...props\n}: PolylineProps & { ref?: Ref<Polyline> }) {\n\t\treturn (\n\t\t\t\t<LeafletPolyline\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPolygon({\n\t\tclassName,\n\t\t...props\n}: PolygonProps & { ref?: Ref<Polygon> }) {\n\t\treturn (\n\t\t\t\t<LeafletPolygon\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapRectangle({\n\t\tclassName,\n\t\t...props\n}: RectangleProps & { ref?: Ref<Rectangle> }) {\n\t\treturn (\n\t\t\t\t<LeafletRectangle\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"fill-foreground stroke-foreground stroke-2\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapPopup({\n\t\tclassName,\n\t\t...props\n}: Omit<PopupProps, \"content\"> & { ref?: Ref<Popup> }) {\n\t\treturn (\n\t\t\t\t<LeafletPopup\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"map-popup--component\",\n\t\t\t\t\t\t\t\t// The shared anchored-surface chrome and display inset; Leaflet positions it.\n\t\t\t\t\t\t\t\tpopoverRecipes.surface,\n\t\t\t\t\t\t\t\tpopoverRecipes.display,\n\t\t\t\t\t\t\t\tlayerRecipes.overlay,\n\t\t\t\t\t\t\t\t// Leaflet mounts and removes the popup itself, so there are no Base UI\n\t\t\t\t\t\t\t\t// presence states for the shared popup motion recipe to follow: the\n\t\t\t\t\t\t\t\t// surface enters once, and only when motion is allowed.\n\t\t\t\t\t\t\t\t\"animate-in fade-in-0 zoom-in-95 slide-in-from-bottom-2 motion-reduce:animate-none w-72 font-sans outline-hidden\",\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction MapTooltip({\n\t\tclassName,\n\t\tchildren,\n\t\tside = \"top\",\n\t\tsideOffset = 15,\n\t\t...props\n}: Omit<TooltipProps, \"offset\"> & {\n\t\t/** Which side of the trigger the surface opens on. */\n\t\tside?: \"top\" | \"right\" | \"bottom\" | \"left\"\n\t\t/** Distance from the trigger, in pixels. */\n\t\tsideOffset?: number\n\t\tref?: Ref<Tooltip>\n}) {\n\t\tconst DEFAULT_OFFSET = {\n\t\t\t\ttop: [0, -sideOffset] satisfies PointExpression,\n\t\t\t\tbottom: [0, sideOffset] satisfies PointExpression,\n\t\t\t\tleft: [-sideOffset, 0] satisfies PointExpression,\n\t\t\t\tright: [sideOffset, 0] satisfies PointExpression,\n\t\t}\n\n\t\treturn (\n\t\t\t\t<LeafletTooltip\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"map-tooltip--component animate-in fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none z-50 w-fit max-w-xs text-balance transition-opacity motion-reduce:transition-none rounded-radius-xs border-0 bg-inverse-background px-space-md py-space-xs shadow-none\",\n\t\t\t\t\t\t\t\tresolveTextClassNames({ type: 'inverse', size: 'xs', lineHeight: 'snug' }),\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tdata-side={side}\n\t\t\t\t\t\tdirection={side}\n\t\t\t\t\t\toffset={DEFAULT_OFFSET[side]}\n\t\t\t\t\t\topacity={1}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t{children}\n\t\t\t\t</LeafletTooltip>\n\t\t)\n}\n\nfunction MapZoomControl({\n\t\tposition = \"top-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"div\"> & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [zoomLevel, setZoomLevel] = useState(map.getZoom())\n\n\t\tuseLeafletMapEvents({\n\t\t\t\tzoomend: () => {\n\t\t\t\t\t\tsetZoomLevel(map.getZoom())\n\t\t\t\t},\n\t\t})\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<ButtonGroup\n\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\taria-label={strings.zoomControls}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.zoomIn}\n\t\t\t\t\t\t\t\t\t\ttitle={strings.zoomIn}\n\t\t\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t\t\tdisabled={zoomLevel >= map.getMaxZoom()}\n\t\t\t\t\t\t\t\t\t\tonClick={() => map.zoomIn()}>\n\t\t\t\t\t\t\t\t\t\t<PlusIcon />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.zoomOut}\n\t\t\t\t\t\t\t\t\t\ttitle={strings.zoomOut}\n\t\t\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t\t\tdisabled={zoomLevel <= map.getMinZoom()}\n\t\t\t\t\t\t\t\t\t\tonClick={() => map.zoomOut()}>\n\t\t\t\t\t\t\t\t\t\t<MinusIcon />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</ButtonGroup>\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapFullscreenControl({\n\t\tposition = \"top-1 right-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [isFullscreen, setIsFullscreen] = useState(false)\n\n\t\tconst { L } = useLeaflet()\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L) return\n\n\t\t\t\tconst fullscreenControl = new L.Control.FullScreen()\n\t\t\t\tfullscreenControl.addTo(map)\n\n\t\t\t\tconst container = fullscreenControl.getContainer()\n\t\t\t\tif (container) {\n\t\t\t\t\t\tcontainer.style.display = \"none\"\n\t\t\t\t}\n\n\t\t\t\tconst handleEnter = () => setIsFullscreen(true)\n\t\t\t\tconst handleExit = () => setIsFullscreen(false)\n\n\t\t\t\tmap.on(\"enterFullscreen\", handleEnter)\n\t\t\t\tmap.on(\"exitFullscreen\", handleExit)\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tfullscreenControl.remove()\n\t\t\t\t\t\tmap.off(\"enterFullscreen\", handleEnter)\n\t\t\t\t\t\tmap.off(\"exitFullscreen\", handleExit)\n\t\t\t\t}\n\t\t}, [L, map])\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\tonClick={() => map.toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\tisFullscreen ? strings.exitFullscreen : strings.enterFullscreen\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttitle={isFullscreen ? strings.exitFullscreen : strings.enterFullscreen}\n\t\t\t\t\t\t\t\tclassName={mapControlSurface}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t{isFullscreen ? <MinimizeIcon /> : <MaximizeIcon />}\n\t\t\t\t\t\t</Button>\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapLocatePulseIcon() {\n\t\treturn (\n\t\t\t\t<div className=\"absolute -top-1 -right-1 flex size-icon-sm rounded-full\">\n\t\t\t\t\t\t<div className=\"bg-primary absolute inline-flex size-full animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t<div className=\"bg-primary relative inline-flex size-icon-sm rounded-full\" />\n\t\t\t\t</div>\n\t\t)\n}\n\nfunction MapLocateControl({\n\t\twatch = false,\n\t\tonLocationFound,\n\t\tonLocationError,\n\t\tposition = \"right-1 bottom-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"button\"> &\n\t\tPick<LocateOptions, \"watch\"> & {\n\t\t\t\tonLocationFound?: (location: LocationEvent) => void\n\t\t\t\tonLocationError?: (error: ErrorEvent) => void\n\t\t} & { position?: string }) {\n\t\tconst map = useLeafletMap()\n\t\tconst strings = useMapStrings()\n\t\tconst [isLocating, setIsLocating] = useDelayedLoadingState(200)\n\t\tconst [watching, setWatching] = useState(false)\n\t\tconst [location, setLocation] = useState<LatLngExpression | null>(null)\n\t\tconst stopRequestRef = useRef<(() => void) | null>(null)\n\t\tconst callbacks = useRef({ onLocationFound, onLocationError })\n\t\tconst isTracking = watching || location !== null\n\n\t\tuseEffect(() => {\n\t\t\t\tcallbacks.current = { onLocationFound, onLocationError }\n\t\t}, [onLocationFound, onLocationError])\n\n\t\tconst startLocating = useCallback(() => {\n\t\t\t\tif (stopRequestRef.current) return\n\n\t\t\t\tfunction detach() {\n\t\t\t\t\t\tmap.off(\"locationfound\", handleFound)\n\t\t\t\t\t\tmap.off(\"locationerror\", handleError)\n\t\t\t\t\t\tstopRequestRef.current = null\n\t\t\t\t}\n\n\t\t\t\tfunction stopRequest() {\n\t\t\t\t\t\tdetach()\n\t\t\t\t\t\tmap.stopLocate()\n\t\t\t\t}\n\n\t\t\t\tfunction handleFound(location: LocationEvent) {\n\t\t\t\t\t\tif (watch) setWatching(true)\n\t\t\t\t\t\telse detach()\n\t\t\t\t\t\tsetLocation(location.latlng)\n\t\t\t\t\t\tsetIsLocating(false)\n\t\t\t\t\t\tcallbacks.current.onLocationFound?.(location)\n\t\t\t\t}\n\n\t\t\t\tfunction handleError(error: ErrorEvent) {\n\t\t\t\t\t\t// Position unavailable and timeout can recover on the same watch.\n\t\t\t\t\t\tconst continuesWatching = watch && (error.code === 2 || error.code === 3)\n\t\t\t\t\t\tif (!continuesWatching) {\n\t\t\t\t\t\t\t\tif (watch) stopRequest()\n\t\t\t\t\t\t\t\telse detach()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetWatching(continuesWatching)\n\t\t\t\t\t\tsetLocation(null)\n\t\t\t\t\t\tsetIsLocating(false)\n\t\t\t\t\t\tcallbacks.current.onLocationError?.(error)\n\t\t\t\t}\n\n\t\t\t\tstopRequestRef.current = stopRequest\n\t\t\t\tmap.on(\"locationfound\", handleFound)\n\t\t\t\tmap.on(\"locationerror\", handleError)\n\t\t\t\tsetIsLocating(true)\n\t\t\t\tmap.locate({ setView: true, maxZoom: map.getMaxZoom(), watch })\n\t\t}, [map, setIsLocating, watch])\n\n\t\tconst stopLocating = useCallback(() => {\n\t\t\t\tstopRequestRef.current?.()\n\t\t\t\tsetWatching(false)\n\t\t\t\tsetLocation(null)\n\t\t\t\tsetIsLocating(false)\n\t\t}, [setIsLocating])\n\t\tconst trackingHandler = isTracking ? stopLocating : startLocating\n\t\tconst trackingTitle = isLocating\n\t\t\t\t? strings.locating\n\t\t\t\t: isTracking\n\t\t\t\t\t? strings.stopTracking\n\t\t\t\t\t: strings.trackLocation\n\t\tconst trackingAriaLabel = isLocating\n\t\t\t\t? strings.locating\n\t\t\t\t: isTracking\n\t\t\t\t\t? strings.stopLocationTracking\n\t\t\t\t\t: strings.startLocationTracking\n\t\tconst locationMarker =\n\t\t\t\tlocation ? (\n\t\t\t\t\t\t<MapMarker\n\t\t\t\t\t\t\t\tposition={location}\n\t\t\t\t\t\t\t\ticon={<MapLocatePulseIcon />}\n\t\t\t\t\t\t\t\tariaLabel={strings.currentLocation}\n\t\t\t\t\t\t/>\n\t\t\t\t) : null\n\n\t\tuseEffect(() => {\n\t\t\t\tsetWatching(false)\n\t\t\t\tsetLocation(null)\n\t\t\t\tsetIsLocating(false)\n\t\t\t\treturn () => stopRequestRef.current?.()\n\t\t}, [map, setIsLocating])\n\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\ttone={isTracking ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\t\t\tbuttonStyle={isTracking ? \"solid\" : \"outline\"}\n\t\t\t\t\t\t\t\tonClick={trackingHandler}\n\t\t\t\t\t\t\t\tdisabled={isLocating}\n\t\t\t\t\t\t\t\ttitle={trackingTitle}\n\t\t\t\t\t\t\t\taria-label={trackingAriaLabel}\n\t\t\t\t\t\t\t\tclassName={isTracking ? mapControlActiveSurface : mapControlSurface}\n\t\t\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t\t\t{isLocating ? (\n\t\t\t\t\t\t\t\t\t\t<LoaderCircleIcon className=\"animate-spin\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<NavigationIcon />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{locationMarker}\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\nfunction MapSearchControl({\n\t\tposition = \"top-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: PlaceAutocompleteProps & { position?: string }) {\n\t\treturn (\n\t\t\t\t<MapControlContainer className={cn(\"z-1001 w-60\", position, className)}>\n\t\t\t\t\t\t<PlaceAutocomplete {...props} />\n\t\t\t\t</MapControlContainer>\n\t\t)\n}\n\ntype MapDrawShape = \"marker\" | \"polyline\" | \"circle\" | \"rectangle\" | \"polygon\"\ntype MapDrawAction = \"edit\" | \"delete\"\ntype MapDrawMode = MapDrawShape | MapDrawAction | null\ninterface MapDrawContextType {\n\t\treadonly featureGroup: L.FeatureGroup | null\n\t\tactiveMode: MapDrawMode\n\t\tsetActiveMode: (mode: MapDrawMode) => void\n\t\treadonly editControlRef: React.RefObject<EditToolbar.Edit | null>\n\t\treadonly deleteControlRef: React.RefObject<EditToolbar.Delete | null>\n\t\treadonly layersCount: number\n}\n\nconst MapDrawContext = createContext<MapDrawContextType | null>(null)\n\nfunction useMapDrawContext() {\n\t\treturn useContext(MapDrawContext)\n}\n\nfunction MapDrawControl({\n\t\tonLayersChange,\n\t\tposition = \"bottom-1 left-1\",\n\t\tclassName,\n\t\t...props\n}: React.ComponentProps<\"div\"> & {\n\t\tonLayersChange?: (layers: L.FeatureGroup) => void\n\t\t/** Corner the control is anchored to. */\n\t\tposition?: string\n}) {\n\t\tconst { L, LeafletDraw } = useLeaflet()\n\t\tconst map = useLeafletMap()\n\t\tconst featureGroupRef = useRef<L.FeatureGroup | null>(null)\n\t\tconst editControlRef = useRef<EditToolbar.Edit | null>(null)\n\t\tconst deleteControlRef = useRef<EditToolbar.Delete | null>(null)\n\t\tconst [activeMode, setActiveMode] = useState<MapDrawMode>(null)\n\t\tconst [layersCount, setLayersCount] = useState(0)\n\n\t\tconst updateLayersCount = useCallback(() => {\n\t\t\t\tif (featureGroupRef.current) {\n\t\t\t\t\t\tsetLayersCount(featureGroupRef.current.getLayers().length)\n\t\t\t\t}\n\t\t}, [])\n\n\t\tconst handleDrawCreated = useCallback((event: DrawEvents.Created) => {\n\t\t\t\tif (!featureGroupRef.current) return\n\t\t\t\tconst { layer } = event\n\t\t\t\tfeatureGroupRef.current.addLayer(layer)\n\t\t\t\tonLayersChange?.(featureGroupRef.current)\n\t\t\t\tupdateLayersCount()\n\t\t\t\tsetActiveMode(null)\n\t\t}, [onLayersChange, updateLayersCount])\n\n\t\tconst handleDrawEditedOrDeleted = useCallback(() => {\n\t\t\t\tif (!featureGroupRef.current) return\n\t\t\t\tonLayersChange?.(featureGroupRef.current)\n\t\t\t\tupdateLayersCount()\n\t\t\t\tsetActiveMode(null)\n\t\t}, [onLayersChange, updateLayersCount])\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !LeafletDraw || !map) return\n\n\t\t\t\tmap.on(\n\t\t\t\t\t\tL.Draw.Event.CREATED,\n\t\t\t\t\t\thandleDrawCreated as L.LeafletEventHandlerFn\n\t\t\t\t)\n\t\t\t\tmap.on(L.Draw.Event.EDITED, handleDrawEditedOrDeleted)\n\t\t\t\tmap.on(L.Draw.Event.DELETED, handleDrawEditedOrDeleted)\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tmap.off(\n\t\t\t\t\t\t\t\tL.Draw.Event.CREATED,\n\t\t\t\t\t\t\t\thandleDrawCreated as L.LeafletEventHandlerFn\n\t\t\t\t\t\t)\n\t\t\t\t\t\tmap.off(L.Draw.Event.EDITED, handleDrawEditedOrDeleted)\n\t\t\t\t\t\tmap.off(L.Draw.Event.DELETED, handleDrawEditedOrDeleted)\n\t\t\t\t}\n\t\t}, [L, LeafletDraw, map, handleDrawCreated, handleDrawEditedOrDeleted])\n\n\t\treturn (\n\t\t\t\t<MapDrawContext.Provider\n\t\t\t\t\t\tvalue={{\n\t\t\t\t\t\t\t\tfeatureGroup: featureGroupRef.current,\n\t\t\t\t\t\t\t\tactiveMode,\n\t\t\t\t\t\t\t\tsetActiveMode,\n\t\t\t\t\t\t\t\teditControlRef,\n\t\t\t\t\t\t\t\tdeleteControlRef,\n\t\t\t\t\t\t\t\tlayersCount,\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<MapControlContainer className={cn(position, className)}>\n\t\t\t\t\t\t\t\t<ButtonGroup orientation=\"vertical\" {...props} />\n\t\t\t\t\t\t</MapControlContainer>\n\t\t\t\t\t\t{/* After the buttons: React cleans siblings up in order, so an\n\t\t\t\t\t\t active tool stops while its shapes are still on the map. */}\n\t\t\t\t\t\t<LeafletFeatureGroup ref={featureGroupRef} />\n\t\t\t\t</MapDrawContext.Provider>\n\t\t)\n}\n\nfunction MapDrawShapeButton<T extends Draw.Feature>({\n\t\tdrawMode,\n\t\tcreateDrawTool,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\tdrawMode: MapDrawShape\n\t\tcreateDrawTool: (L: LeafletModule, map: DrawMap) => T\n}) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawShapeButton must be used within MapDrawControl\")\n\t\t}\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst map = useLeafletMap()\n\t\tconst controlRef = useRef<T | null>(null)\n\t\tconst createDrawToolRef = useRef(createDrawTool)\n\t\tconst { activeMode, setActiveMode } = drawContext\n\t\tconst isActive = activeMode === drawMode\n\t\tconst drawLabels: Record<MapDrawShape, string> = {\n\t\t\t\tmarker: strings.drawMarker,\n\t\t\t\tpolyline: strings.drawPolyline,\n\t\t\t\tcircle: strings.drawCircle,\n\t\t\t\trectangle: strings.drawRectangle,\n\t\t\t\tpolygon: strings.drawPolygon,\n\t\t}\n\t\tconst drawLabel = drawLabels[drawMode]\n\n\t\tuseEffect(() => {\n\t\t\t\tcreateDrawToolRef.current = createDrawTool\n\t\t}, [createDrawTool])\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !isActive) {\n\t\t\t\t\t\tcontrolRef.current?.disable()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst control = createDrawToolRef.current(L, map as DrawMap)\n\t\t\t\tcontrol.enable()\n\t\t\t\tcontrolRef.current = control\n\t\t\t\treturn () => {\n\t\t\t\t\t\tcontrol.disable()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t}\n\t\t}, [L, map, isActive])\n\n\t\tfunction handleClick() {\n\t\t\t\tsetActiveMode(isActive ? null : drawMode)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\taria-label={drawLabel}\n\t\t\t\t\t\ttitle={drawLabel}\n\t\t\t\t\t\tclassName={cn(isActive ? mapControlActiveSurface : mapControlSurface, className)}\n\t\t\t\t\t\ttone={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\tbuttonStyle={isActive ? \"solid\" : \"outline\"}\n\t\t\t\t\t\tdisabled={activeMode === \"edit\" || activeMode === \"delete\"}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapDrawMarker({ ...props }: DrawOptions.MarkerOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"marker\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Marker(map, {\n\t\t\t\t\t\t\t\t\t\ticon: L.divIcon({\n\t\t\t\t\t\t\t\t\t\t\t\tclassName: \"\", // For fixing the moving bug when going in and out the edit mode\n\t\t\t\t\t\t\t\t\t\t\t\ticonAnchor: [12, 12],\n\t\t\t\t\t\t\t\t\t\t\t\thtml: renderToString(<MapPinIcon className=\"size-icon-lg\" />),\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<MapPinIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawPolyline({\n\t\tshowLength = false,\n\t\tdrawError = {\n\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t},\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.PolylineOptions) {\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"polyline\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Polyline(map, {\n\t\t\t\t\t\t\t\t\t\t...(mapDrawHandleIcon\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\tshowLength,\n\t\t\t\t\t\t\t\t\t\tdrawError,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<WaypointsIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawCircle({\n\t\tshowRadius = false,\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.CircleOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"circle\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Circle(map, {\n\t\t\t\t\t\t\t\t\t\tshowRadius,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<CircleIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawRectangle({\n\t\tshowArea = false,\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.RectangleOptions) {\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"rectangle\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Rectangle(map, {\n\t\t\t\t\t\t\t\t\t\tshowArea,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<SquareIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawPolygon({\n\t\tdrawError = {\n\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t},\n\t\tshapeOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\topacity: 1,\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: DrawOptions.PolygonOptions) {\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\n\t\treturn (\n\t\t\t\t<MapDrawShapeButton\n\t\t\t\t\t\tdrawMode=\"polygon\"\n\t\t\t\t\t\tcreateDrawTool={(L, map) =>\n\t\t\t\t\t\t\t\tnew L.Draw.Polygon(map, {\n\t\t\t\t\t\t\t\t\t\t...(mapDrawHandleIcon\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\tdrawError,\n\t\t\t\t\t\t\t\t\t\tshapeOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}>\n\t\t\t\t\t\t<PentagonIcon />\n\t\t\t\t</MapDrawShapeButton>\n\t\t)\n}\n\nfunction MapDrawActionButton<T extends EditToolbar.Edit | EditToolbar.Delete>({\n\t\tdrawAction,\n\t\tcreateDrawTool,\n\t\tcontrolRef,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n}: React.ComponentProps<\"button\"> & {\n\t\tdrawAction: MapDrawAction\n\t\tcreateDrawTool: (\n\t\t\t\tL: LeafletModule,\n\t\t\t\tmap: DrawMap,\n\t\t\t\tfeatureGroup: L.FeatureGroup\n\t\t) => T\n\t\tcontrolRef: React.RefObject<T | null>\n}) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"MapDrawActionButton must be used within MapDrawControl\"\n\t\t\t\t)\n\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst map = useLeafletMap()\n\t\tconst {\n\t\t\t\tfeatureGroup,\n\t\t\t\tactiveMode,\n\t\t\t\tsetActiveMode,\n\t\t\t\tlayersCount,\n\t\t\t\teditControlRef,\n\t\t\t\tdeleteControlRef,\n\t\t} = drawContext\n\t\tconst createDrawToolRef = useRef(createDrawTool)\n\t\tconst isActive = activeMode === drawAction\n\t\tconst hasFeatures = layersCount > 0\n\t\tconst actionLabel = drawAction === \"edit\" ? strings.editShapes : strings.removeShapes\n\n\t\tuseEffect(() => {\n\t\t\t\tcreateDrawToolRef.current = createDrawTool\n\t\t}, [createDrawTool])\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !featureGroup || !isActive) {\n\t\t\t\t\t\tcontrolRef.current?.disable?.()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst control = createDrawToolRef.current(L, map as DrawMap, featureGroup)\n\t\t\t\tcontrol.enable?.()\n\t\t\t\tcontrolRef.current = control\n\t\t\t\treturn () => {\n\t\t\t\t\t\t// When the whole map unmounts it has already released the shapes\n\t\t\t\t\t\t// (a marker drops its drag handler as it leaves), and Leaflet.draw's\n\t\t\t\t\t\t// disable() walks every shape. There is nothing left to stop then.\n\t\t\t\t\t\tif (map.hasLayer(featureGroup)) control.disable?.()\n\t\t\t\t\t\tcontrolRef.current = null\n\t\t\t\t}\n\t\t}, [L, map, isActive, featureGroup, controlRef])\n\n\t\tfunction handleClick() {\n\t\t\t\t// Leaving edit or remove commits it first, whichever button asked.\n\t\t\t\t// Leaflet.draw's disable() keeps the changed geometry but reports\n\t\t\t\t// nothing, so switching straight to the other mode would lose the\n\t\t\t\t// EDITED or DELETED event that onLayersChange listens for.\n\t\t\t\teditControlRef.current?.save()\n\t\t\t\tdeleteControlRef.current?.save()\n\t\t\t\tsetActiveMode(isActive ? null : drawAction)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\taria-label={actionLabel}\n\t\t\t\t\t\ttitle={actionLabel}\n\t\t\t\t\t\ttone={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\tbuttonStyle={isActive ? \"solid\" : \"outline\"}\n\t\t\t\t\t\tdisabled={!hasFeatures}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tclassName={cn(isActive ? mapControlActiveSurface : mapControlSurface, className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapDrawEdit({\n\t\tselectedPathOptions = {\n\t\t\t\tcolor: \"var(--color-primary)\",\n\t\t\t\tfillColor: \"var(--color-primary)\",\n\t\t\t\tweight: 2,\n\t\t},\n\t\t...props\n}: Omit<EditToolbar.EditHandlerOptions, \"featureGroup\">) {\n\t\tconst { L } = useLeaflet()\n\t\tconst strings = useMapStrings()\n\t\tconst mapDrawHandleIcon = useMapDrawHandleIcon()\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawEdit must be used within MapDrawControl\")\n\t\t}\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L || !mapDrawHandleIcon) return\n\n\t\t\t\tL.Edit.PolyVerticesEdit.mergeOptions({\n\t\t\t\t\t\ticon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchIcon: mapDrawHandleIcon,\n\t\t\t\t\t\tdrawError: {\n\t\t\t\t\t\t\t\tcolor: \"var(--color-destructive)\",\n\t\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tL.Edit.SimpleShape.mergeOptions({\n\t\t\t\t\t\tmoveIcon: mapDrawHandleIcon,\n\t\t\t\t\t\tresizeIcon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchMoveIcon: mapDrawHandleIcon,\n\t\t\t\t\t\ttouchResizeIcon: mapDrawHandleIcon,\n\t\t\t\t})\n\t\t}, [L, mapDrawHandleIcon])\n\n\t\treturn (\n\t\t\t\t<MapDrawActionButton\n\t\t\t\t\t\tdrawAction=\"edit\"\n\t\t\t\t\t\tcontrolRef={drawContext.editControlRef}\n\t\t\t\t\t\tcreateDrawTool={(L, map, featureGroup) => {\n\t\t\t\t\t\t\t\t// Leaflet.draw reads its tooltips from the one global\n\t\t\t\t\t\t\t\t// `L.drawLocal`, so they are written as this map's tool\n\t\t\t\t\t\t\t\t// starts: the tool on screen then shows this map's strings,\n\t\t\t\t\t\t\t\t// not those of whichever map rendered last.\n\t\t\t\t\t\t\t\tL.drawLocal.edit.handlers.edit.tooltip = {\n\t\t\t\t\t\t\t\t\t\ttext: strings.editInstructions,\n\t\t\t\t\t\t\t\t\t\tsubtext: \"\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new L.EditToolbar.Edit(map, {\n\t\t\t\t\t\t\t\t\t\tfeatureGroup,\n\t\t\t\t\t\t\t\t\t\tselectedPathOptions,\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<PenLineIcon />\n\t\t\t\t</MapDrawActionButton>\n\t\t)\n}\n\nfunction MapDrawDelete() {\n\t\tconst strings = useMapStrings()\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext) {\n\t\t\t\tthrow new Error(\"MapDrawDelete must be used within MapDrawControl\")\n\t\t}\n\n\t\treturn (\n\t\t\t\t<MapDrawActionButton\n\t\t\t\t\t\tdrawAction=\"delete\"\n\t\t\t\t\t\tcontrolRef={drawContext.deleteControlRef}\n\t\t\t\t\t\tcreateDrawTool={(L, map, featureGroup) => {\n\t\t\t\t\t\t\t\t// Written as the tool starts; see MapDrawEdit.\n\t\t\t\t\t\t\t\tL.drawLocal.edit.handlers.remove.tooltip = {\n\t\t\t\t\t\t\t\t\t\ttext: strings.removeInstructions,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new L.EditToolbar.Delete(map, { featureGroup })\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t<Trash2Icon />\n\t\t\t\t</MapDrawActionButton>\n\t\t)\n}\n\nfunction MapDrawUndo({ className, ...props }: React.ComponentProps<\"button\">) {\n\t\tconst drawContext = useMapDrawContext()\n\t\tif (!drawContext)\n\t\t\t\tthrow new Error(\"MapDrawUndo must be used within MapDrawControl\")\n\t\tconst strings = useMapStrings()\n\n\t\tconst {\n\t\t\t\tactiveMode,\n\t\t\t\tsetActiveMode,\n\t\t\t\teditControlRef,\n\t\t\t\tdeleteControlRef,\n\t\t\t\tlayersCount,\n\t\t} = drawContext\n\t\tconst isInEditMode = activeMode === \"edit\"\n\t\tconst isInDeleteMode = activeMode === \"delete\"\n\t\tconst isActive = (isInEditMode || isInDeleteMode) && layersCount > 0\n\t\tconst undoLabel = isInDeleteMode ? strings.undoRemove : strings.undoEdit\n\n\t\tfunction handleUndo() {\n\t\t\t\tif (isInEditMode) {\n\t\t\t\t\t\teditControlRef.current?.revertLayers()\n\t\t\t\t} else if (isInDeleteMode) {\n\t\t\t\t\t\tdeleteControlRef.current?.revertLayers()\n\t\t\t\t}\n\t\t\t\tsetActiveMode(null)\n\t\t}\n\n\t\treturn (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\taria-label={undoLabel}\n\t\t\t\t\t\ttitle={undoLabel}\n\t\t\t\t\t\tonClick={handleUndo}\n\t\t\t\t\t\tdisabled={!isActive}\n\t\t\t\t\t\tclassName={cn(mapControlSurface, className)}\n\t\t\t\t\t\t{...props}>\n\t\t\t\t\t\t<Undo2Icon />\n\t\t\t\t</Button>\n\t\t)\n}\n\nfunction MapControlContainer({\n\t\tclassName,\n\t\t...props\n}: React.ComponentPropsWithoutRef<\"div\">) {\n\t\tconst { L } = useLeaflet()\n\t\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\t\tuseEffect(() => {\n\t\t\t\tif (!L) return\n\t\t\t\tconst element = containerRef.current\n\t\t\t\tif (!element) return\n\t\t\t\tL.DomEvent.disableClickPropagation(element)\n\t\t\t\tL.DomEvent.disableScrollPropagation(element)\n\t\t}, [L])\n\n\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\t\tref={containerRef}\n\t\t\t\t\t\tclassName={cn(\"absolute z-1000 size-fit cursor-default\", className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t)\n}\n\nfunction useMapDrawHandleIcon() {\n\t\tconst { L } = useLeaflet()\n\n\t\treturn useMemo(() => {\n\t\t\t\tif (!L) return null\n\t\t\t\treturn L.divIcon({\n\t\t\t\t\t\ticonAnchor: [8, 8],\n\t\t\t\t\t\thtml: renderToString(\n\t\t\t\t\t\t\t\t<CircleIcon className=\"fill-primary-accent stroke-primary-accent size-icon transition-transform hover:scale-110\" />\n\t\t\t\t\t\t),\n\t\t\t\t})\n\t\t}, [L])\n}\n\nfunction useLeaflet() {\n\t\tconst [L, setL] = useState<LeafletModule | null>(null)\n\t\tconst [LeafletDraw, setLeafletDraw] = useState<LeafletDrawModule | null>(\n\t\t\t\tnull\n\t\t)\n\n\t\tuseEffect(() => {\n\t\t\t\tasync function loadLeaflet() {\n\t\t\t\t\t\tconst leaflet = await import(\"leaflet\")\n\t\t\t\t\t\tconst leafletFullscreen = await import(\"leaflet.fullscreen\")\n\t\t\t\t\t\tconst leafletDraw = await import(\"leaflet-draw\")\n\n\t\t\t\t\t\tconst L_object = leaflet.default\n\t\t\t\t\t\tif (L_object.Control && !L_object.Control.FullScreen) {\n\t\t\t\t\t\t\t\tL_object.Control.FullScreen =\n\t\t\t\t\t\t\t\t\t\tleafletFullscreen.default || leafletFullscreen\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetLeafletDraw(leafletDraw)\n\t\t\t\t\t\tsetL(L_object)\n\t\t\t\t}\n\n\t\t\t\tif (L && LeafletDraw) return\n\t\t\t\tif (typeof window === \"undefined\") return\n\n\t\t\t\tvoid loadLeaflet()\n\t\t}, [L, LeafletDraw])\n\n\t\treturn { L, LeafletDraw }\n}\n\n/**\n * Delays the *appearance* of a loading indicator so a fast lookup never\n * flashes a spinner. Not a debounce: it neither collapses a burst of calls\n * nor defers the work itself, so `useDebouncedCallback` does not apply.\n */\nfunction useDelayedLoadingState(delay = 200) {\n\t\tconst [isLoading, setIsLoading] = useState(false)\n\t\tconst [showLoading, setShowLoading] = useState(false)\n\t\tconst timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n\t\tuseEffect(() => {\n\t\t\t\tif (isLoading) {\n\t\t\t\t\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\t\t\t\t\t\tsetShowLoading(true)\n\t\t\t\t\t\t}, delay)\n\t\t\t\t} else {\n\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t\t\t\t\t\ttimeoutRef.current = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetShowLoading(false)\n\t\t\t\t}\n\n\t\t\t\treturn () => {\n\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current)\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}, [isLoading, delay])\n\n\t\treturn [showLoading, setIsLoading] as const\n}\n\nexport {\n\t\tMap,\n\t\tMapCircle,\n\t\tMapCircleMarker,\n\t\tMapControlContainer,\n\t\tMapDrawCircle,\n\t\tMapDrawControl,\n\t\tMapDrawDelete,\n\t\tMapDrawEdit,\n\t\tMapDrawMarker,\n\t\tMapDrawPolygon,\n\t\tMapDrawPolyline,\n\t\tMapDrawRectangle,\n\t\tMapDrawUndo,\n\t\tMapFeatureGroup,\n\t\tMapFullscreenControl,\n\t\tMapLayerGroup,\n\t\tMapLayers,\n\t\tMapLayersControl,\n\t\tMapLocateControl,\n\t\tMapMarker,\n\t\tMapMarkerClusterGroup,\n\t\tMapPolygon,\n\t\tMapPolyline,\n\t\tMapPopup,\n\t\tMapRectangle,\n\t\tMapSearchControl,\n\t\tMapTileLayer,\n\t\tMapTooltip,\n\t\tMapZoomControl,\n\t\tuseLeaflet,\n}\n"],"mappings":"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"}