@techzyapp/ui-library 1.0.40 → 1.0.41

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 (378) hide show
  1. package/dist/{AdminRoot-JOgiNkJA.js → AdminRoot-aOYQtzF0.js} +34 -32
  2. package/dist/AdminRoot-aOYQtzF0.js.map +1 -0
  3. package/dist/AdminRoot-ajWIf94J.cjs +2 -0
  4. package/dist/AdminRoot-ajWIf94J.cjs.map +1 -0
  5. package/dist/{Alert-CY8iU1zd.cjs → Alert-5tpyGb2M.cjs} +2 -2
  6. package/dist/{Alert-CY8iU1zd.cjs.map → Alert-5tpyGb2M.cjs.map} +1 -1
  7. package/dist/{Alert-CtUr-0s8.js → Alert-Dz0sNGpz.js} +3 -3
  8. package/dist/{Alert-CtUr-0s8.js.map → Alert-Dz0sNGpz.js.map} +1 -1
  9. package/dist/{Breadcrumbs-hi6dJhfN.cjs → Breadcrumbs-B6Pii2Y_.cjs} +2 -2
  10. package/dist/{Breadcrumbs-hi6dJhfN.cjs.map → Breadcrumbs-B6Pii2Y_.cjs.map} +1 -1
  11. package/dist/{Breadcrumbs-Dqhk-dY2.js → Breadcrumbs-DKYJOdHZ.js} +3 -3
  12. package/dist/{Breadcrumbs-Dqhk-dY2.js.map → Breadcrumbs-DKYJOdHZ.js.map} +1 -1
  13. package/dist/{Button-Bst_NtPJ.js → Button-CjsnB8gX.js} +2 -2
  14. package/dist/{Button-Bst_NtPJ.js.map → Button-CjsnB8gX.js.map} +1 -1
  15. package/dist/{Button-CYZoF18-.cjs → Button-ClVfHGBc.cjs} +2 -2
  16. package/dist/{Button-CYZoF18-.cjs.map → Button-ClVfHGBc.cjs.map} +1 -1
  17. package/dist/{Calendar-CMNBHtvY.cjs → Calendar-BzGVX4F4.cjs} +2 -2
  18. package/dist/{Calendar-CMNBHtvY.cjs.map → Calendar-BzGVX4F4.cjs.map} +1 -1
  19. package/dist/{Calendar-OYXsfuWz.js → Calendar-CQaPEukM.js} +3 -3
  20. package/dist/{Calendar-OYXsfuWz.js.map → Calendar-CQaPEukM.js.map} +1 -1
  21. package/dist/{Card-CkZtVNyV.cjs → Card-CIRGqg3P.cjs} +2 -2
  22. package/dist/{Card-CkZtVNyV.cjs.map → Card-CIRGqg3P.cjs.map} +1 -1
  23. package/dist/{Card-B91LGIzF.js → Card-Co3A4Qgo.js} +2 -2
  24. package/dist/{Card-B91LGIzF.js.map → Card-Co3A4Qgo.js.map} +1 -1
  25. package/dist/{Chip-D5ZZs3QH.js → Chip-BjSNgaAf.js} +2 -2
  26. package/dist/{Chip-D5ZZs3QH.js.map → Chip-BjSNgaAf.js.map} +1 -1
  27. package/dist/{Chip-B7cAHjlx.cjs → Chip-Dp8skUZ2.cjs} +2 -2
  28. package/dist/{Chip-B7cAHjlx.cjs.map → Chip-Dp8skUZ2.cjs.map} +1 -1
  29. package/dist/{CodeBlock-DrWRSRmO.js → CodeBlock-CcJjS0_q.js} +3 -3
  30. package/dist/{CodeBlock-DrWRSRmO.js.map → CodeBlock-CcJjS0_q.js.map} +1 -1
  31. package/dist/{CodeBlock-C3mG_seZ.cjs → CodeBlock-o_VSkAek.cjs} +2 -2
  32. package/dist/{CodeBlock-C3mG_seZ.cjs.map → CodeBlock-o_VSkAek.cjs.map} +1 -1
  33. package/dist/{ColorPicker-w7NdprlW.js → ColorPicker-C1hZcAbH.js} +3 -3
  34. package/dist/{ColorPicker-w7NdprlW.js.map → ColorPicker-C1hZcAbH.js.map} +1 -1
  35. package/dist/{ColorPicker-C1pDI4su.cjs → ColorPicker-DY6Vk1uS.cjs} +2 -2
  36. package/dist/{ColorPicker-C1pDI4su.cjs.map → ColorPicker-DY6Vk1uS.cjs.map} +1 -1
  37. package/dist/{ColorPickerPanel-CKMd-dqd.js → ColorPickerPanel-BuzwmkPN.js} +2 -2
  38. package/dist/{ColorPickerPanel-CKMd-dqd.js.map → ColorPickerPanel-BuzwmkPN.js.map} +1 -1
  39. package/dist/{ColorPickerPanel-BbgujQ3X.cjs → ColorPickerPanel-CDrHbCfG.cjs} +2 -2
  40. package/dist/{ColorPickerPanel-BbgujQ3X.cjs.map → ColorPickerPanel-CDrHbCfG.cjs.map} +1 -1
  41. package/dist/{ColorRamp-D9_5JULy.cjs → ColorRamp-CVnOYlu3.cjs} +2 -2
  42. package/dist/{ColorRamp-D9_5JULy.cjs.map → ColorRamp-CVnOYlu3.cjs.map} +1 -1
  43. package/dist/{ColorRamp-Mp_ddhmb.js → ColorRamp-CePqEkMR.js} +2 -2
  44. package/dist/{ColorRamp-Mp_ddhmb.js.map → ColorRamp-CePqEkMR.js.map} +1 -1
  45. package/dist/ConfigProvider-Bgu85MsI.js +379 -0
  46. package/dist/ConfigProvider-Bgu85MsI.js.map +1 -0
  47. package/dist/ConfigProvider-DELhJlqo.cjs +2 -0
  48. package/dist/ConfigProvider-DELhJlqo.cjs.map +1 -0
  49. package/dist/{CopyButton-Yg5ZVTiX.js → CopyButton-CgDeyJ3A.js} +3 -3
  50. package/dist/{CopyButton-Yg5ZVTiX.js.map → CopyButton-CgDeyJ3A.js.map} +1 -1
  51. package/dist/{CopyButton-DZeYcG68.cjs → CopyButton-CjPyKpky.cjs} +2 -2
  52. package/dist/{CopyButton-DZeYcG68.cjs.map → CopyButton-CjPyKpky.cjs.map} +1 -1
  53. package/dist/{DatePicker-CXRsT-lt.cjs → DatePicker-CwZ_-ElE.cjs} +2 -2
  54. package/dist/{DatePicker-CXRsT-lt.cjs.map → DatePicker-CwZ_-ElE.cjs.map} +1 -1
  55. package/dist/{DatePicker-BMJlfCKB.js → DatePicker-tid4OuJ2.js} +4 -4
  56. package/dist/{DatePicker-BMJlfCKB.js.map → DatePicker-tid4OuJ2.js.map} +1 -1
  57. package/dist/{DateTimePicker-B-Jjejzm.js → DateTimePicker-C2871cuc.js} +7 -7
  58. package/dist/{DateTimePicker-B-Jjejzm.js.map → DateTimePicker-C2871cuc.js.map} +1 -1
  59. package/dist/{DateTimePicker-BuTIRTUX.cjs → DateTimePicker-DdEPtw9U.cjs} +2 -2
  60. package/dist/{DateTimePicker-BuTIRTUX.cjs.map → DateTimePicker-DdEPtw9U.cjs.map} +1 -1
  61. package/dist/{DescriptionList-CG08_qwT.js → DescriptionList-BP4CDME5.js} +4 -4
  62. package/dist/{DescriptionList-CG08_qwT.js.map → DescriptionList-BP4CDME5.js.map} +1 -1
  63. package/dist/{DescriptionList-S9C6Tp90.cjs → DescriptionList-BWw0Fe6U.cjs} +2 -2
  64. package/dist/{DescriptionList-S9C6Tp90.cjs.map → DescriptionList-BWw0Fe6U.cjs.map} +1 -1
  65. package/dist/{EmptyState-BCoPw8jf.js → EmptyState-BlmQtbSs.js} +2 -2
  66. package/dist/{EmptyState-BCoPw8jf.js.map → EmptyState-BlmQtbSs.js.map} +1 -1
  67. package/dist/{EmptyState-DnGds1ch.cjs → EmptyState-DGHOD_jy.cjs} +2 -2
  68. package/dist/{EmptyState-DnGds1ch.cjs.map → EmptyState-DGHOD_jy.cjs.map} +1 -1
  69. package/dist/{ErrorBoundary-JCNa0_Ys.cjs → ErrorBoundary-DL194IyB.cjs} +2 -2
  70. package/dist/{ErrorBoundary-JCNa0_Ys.cjs.map → ErrorBoundary-DL194IyB.cjs.map} +1 -1
  71. package/dist/{ErrorBoundary-BILk_3fM.js → ErrorBoundary-ukRaS6uS.js} +3 -3
  72. package/dist/{ErrorBoundary-BILk_3fM.js.map → ErrorBoundary-ukRaS6uS.js.map} +1 -1
  73. package/dist/{ErrorState-MQBeyF2n.cjs → ErrorState-BjEA0VfF.cjs} +2 -2
  74. package/dist/{ErrorState-MQBeyF2n.cjs.map → ErrorState-BjEA0VfF.cjs.map} +1 -1
  75. package/dist/{ErrorState-DI28ZCJN.js → ErrorState-Hfd_0MeE.js} +7 -7
  76. package/dist/{ErrorState-DI28ZCJN.js.map → ErrorState-Hfd_0MeE.js.map} +1 -1
  77. package/dist/{FileCard-Cl88Gu6L.cjs → FileCard-COc4rHe-.cjs} +2 -2
  78. package/dist/{FileCard-Cl88Gu6L.cjs.map → FileCard-COc4rHe-.cjs.map} +1 -1
  79. package/dist/{FileCard-5QvVkO1-.js → FileCard-CWwB8CWF.js} +3 -3
  80. package/dist/{FileCard-5QvVkO1-.js.map → FileCard-CWwB8CWF.js.map} +1 -1
  81. package/dist/{FileUploader-DwAl3UXI.js → FileUploader--WOmlhSh.js} +5 -5
  82. package/dist/{FileUploader-DwAl3UXI.js.map → FileUploader--WOmlhSh.js.map} +1 -1
  83. package/dist/{FileUploader-FMVbj7rz.cjs → FileUploader-Bqy_fV7l.cjs} +2 -2
  84. package/dist/{FileUploader-FMVbj7rz.cjs.map → FileUploader-Bqy_fV7l.cjs.map} +1 -1
  85. package/dist/{Flag-Do7x-AhS.cjs → Flag-C48Zfhvb.cjs} +2 -2
  86. package/dist/{Flag-Do7x-AhS.cjs.map → Flag-C48Zfhvb.cjs.map} +1 -1
  87. package/dist/{Flag-DfA2t0yd.js → Flag-fgMTTcy8.js} +2 -2
  88. package/dist/{Flag-DfA2t0yd.js.map → Flag-fgMTTcy8.js.map} +1 -1
  89. package/dist/{FullscreenToggle-Bbb_z2xj.cjs → FullscreenToggle-DuLaUzi_.cjs} +2 -2
  90. package/dist/{FullscreenToggle-Bbb_z2xj.cjs.map → FullscreenToggle-DuLaUzi_.cjs.map} +1 -1
  91. package/dist/{FullscreenToggle-DM6wWZ1a.js → FullscreenToggle-GjsMn1GO.js} +3 -3
  92. package/dist/{FullscreenToggle-DM6wWZ1a.js.map → FullscreenToggle-GjsMn1GO.js.map} +1 -1
  93. package/dist/{IconButton-CQ25TtBc.cjs → IconButton-D3ZpI0XL.cjs} +2 -2
  94. package/dist/{IconButton-CQ25TtBc.cjs.map → IconButton-D3ZpI0XL.cjs.map} +1 -1
  95. package/dist/{IconButton-06pmftMo.js → IconButton-t1OhAMNc.js} +2 -2
  96. package/dist/{IconButton-06pmftMo.js.map → IconButton-t1OhAMNc.js.map} +1 -1
  97. package/dist/{Loader-B5Pm8AaT.cjs → Loader-Cywaf7ju.cjs} +2 -2
  98. package/dist/{Loader-B5Pm8AaT.cjs.map → Loader-Cywaf7ju.cjs.map} +1 -1
  99. package/dist/{Loader-Bj5uwVR9.js → Loader-De8_GqR1.js} +2 -2
  100. package/dist/{Loader-Bj5uwVR9.js.map → Loader-De8_GqR1.js.map} +1 -1
  101. package/dist/{LocationPicker-D-sT4rSe.cjs → LocationPicker-DBsxCYi9.cjs} +2 -2
  102. package/dist/{LocationPicker-D-sT4rSe.cjs.map → LocationPicker-DBsxCYi9.cjs.map} +1 -1
  103. package/dist/{LocationPicker-Ce8aLubZ.js → LocationPicker-UfyDBvhp.js} +6 -6
  104. package/dist/{LocationPicker-Ce8aLubZ.js.map → LocationPicker-UfyDBvhp.js.map} +1 -1
  105. package/dist/{Modal-DjSOhZqd.cjs → Modal--5EbLfMz.cjs} +2 -2
  106. package/dist/{Modal-DjSOhZqd.cjs.map → Modal--5EbLfMz.cjs.map} +1 -1
  107. package/dist/{Modal-DTnB_mGg.js → Modal-Dfwc9eIq.js} +3 -3
  108. package/dist/{Modal-DTnB_mGg.js.map → Modal-Dfwc9eIq.js.map} +1 -1
  109. package/dist/{MultiSelect-C4RvohFY.cjs → MultiSelect-lBAEcAlR.cjs} +2 -2
  110. package/dist/{MultiSelect-C4RvohFY.cjs.map → MultiSelect-lBAEcAlR.cjs.map} +1 -1
  111. package/dist/{MultiSelect-Dn8l5z52.js → MultiSelect-q__o8HyU.js} +4 -4
  112. package/dist/{MultiSelect-Dn8l5z52.js.map → MultiSelect-q__o8HyU.js.map} +1 -1
  113. package/dist/{NumberField-DvQ5UP1R.js → NumberField-CXH0B1Bt.js} +3 -3
  114. package/dist/{NumberField-DvQ5UP1R.js.map → NumberField-CXH0B1Bt.js.map} +1 -1
  115. package/dist/{NumberField-C3TLdAgT.cjs → NumberField-DSicjq5R.cjs} +2 -2
  116. package/dist/{NumberField-C3TLdAgT.cjs.map → NumberField-DSicjq5R.cjs.map} +1 -1
  117. package/dist/{OtpField-Dy4O1MeD.js → OtpField-Dy-LKTi9.js} +2 -2
  118. package/dist/{OtpField-Dy4O1MeD.js.map → OtpField-Dy-LKTi9.js.map} +1 -1
  119. package/dist/{OtpField-OdkuKKcV.cjs → OtpField-KHwdaajC.cjs} +2 -2
  120. package/dist/{OtpField-OdkuKKcV.cjs.map → OtpField-KHwdaajC.cjs.map} +1 -1
  121. package/dist/{PageError-aUV0vUfB.cjs → PageError-MHbSl1oT.cjs} +2 -2
  122. package/dist/{PageError-aUV0vUfB.cjs.map → PageError-MHbSl1oT.cjs.map} +1 -1
  123. package/dist/{PageError-BORFaxGW.js → PageError-VYc07Q7W.js} +5 -5
  124. package/dist/{PageError-BORFaxGW.js.map → PageError-VYc07Q7W.js.map} +1 -1
  125. package/dist/{PageLayout-rtEl8uqS.cjs → PageLayout-Bt6U_80d.cjs} +2 -2
  126. package/dist/{PageLayout-rtEl8uqS.cjs.map → PageLayout-Bt6U_80d.cjs.map} +1 -1
  127. package/dist/{PageLayout-ojiBEcxI.js → PageLayout-Df1SOlr7.js} +4 -4
  128. package/dist/{PageLayout-ojiBEcxI.js.map → PageLayout-Df1SOlr7.js.map} +1 -1
  129. package/dist/{PageNotFound-D536Tshv.js → PageNotFound-BWfaomjC.js} +5 -5
  130. package/dist/{PageNotFound-D536Tshv.js.map → PageNotFound-BWfaomjC.js.map} +1 -1
  131. package/dist/{PageNotFound-f-dxrnol.cjs → PageNotFound-e4ITkqDC.cjs} +2 -2
  132. package/dist/{PageNotFound-f-dxrnol.cjs.map → PageNotFound-e4ITkqDC.cjs.map} +1 -1
  133. package/dist/{Pagination-DoDGKGpQ.js → Pagination-DDMq_7OZ.js} +2 -2
  134. package/dist/{Pagination-DoDGKGpQ.js.map → Pagination-DDMq_7OZ.js.map} +1 -1
  135. package/dist/{Pagination-Ffv6IFIU.cjs → Pagination-UMeckhmY.cjs} +2 -2
  136. package/dist/{Pagination-Ffv6IFIU.cjs.map → Pagination-UMeckhmY.cjs.map} +1 -1
  137. package/dist/PaletteField-D4c-Q1PG.js +56 -0
  138. package/dist/PaletteField-D4c-Q1PG.js.map +1 -0
  139. package/dist/PaletteField-DnUpn2zP.cjs +2 -0
  140. package/dist/PaletteField-DnUpn2zP.cjs.map +1 -0
  141. package/dist/{PhoneField-DzLTXJcw.cjs → PhoneField-BTB2_Lo1.cjs} +2 -2
  142. package/dist/{PhoneField-DzLTXJcw.cjs.map → PhoneField-BTB2_Lo1.cjs.map} +1 -1
  143. package/dist/{PhoneField-CjYw-Unw.js → PhoneField-BY5hapKk.js} +4 -4
  144. package/dist/{PhoneField-CjYw-Unw.js.map → PhoneField-BY5hapKk.js.map} +1 -1
  145. package/dist/{Popconfirm-B3GhhrRM.js → Popconfirm-BXa5qLHY.js} +3 -3
  146. package/dist/{Popconfirm-B3GhhrRM.js.map → Popconfirm-BXa5qLHY.js.map} +1 -1
  147. package/dist/{Popconfirm-CYc8ywDI.cjs → Popconfirm-PkVgBrL-.cjs} +2 -2
  148. package/dist/{Popconfirm-CYc8ywDI.cjs.map → Popconfirm-PkVgBrL-.cjs.map} +1 -1
  149. package/dist/{Progress-BABBBG2y.cjs → Progress-R_Vt4gJA.cjs} +2 -2
  150. package/dist/{Progress-BABBBG2y.cjs.map → Progress-R_Vt4gJA.cjs.map} +1 -1
  151. package/dist/{Progress-ZNQrxw_Q.js → Progress-bId4RkgJ.js} +2 -2
  152. package/dist/{Progress-ZNQrxw_Q.js.map → Progress-bId4RkgJ.js.map} +1 -1
  153. package/dist/{RemoveDialog-B_Y18MeJ.cjs → RemoveDialog-Cvj-DaiY.cjs} +2 -2
  154. package/dist/{RemoveDialog-B_Y18MeJ.cjs.map → RemoveDialog-Cvj-DaiY.cjs.map} +1 -1
  155. package/dist/{RemoveDialog-ayAfGXpB.js → RemoveDialog-Dh_q5jZF.js} +5 -5
  156. package/dist/{RemoveDialog-ayAfGXpB.js.map → RemoveDialog-Dh_q5jZF.js.map} +1 -1
  157. package/dist/{RichTextEditor-itYD1PfE.js → RichTextEditor-Dv-LDsN-.js} +7 -7
  158. package/dist/{RichTextEditor-itYD1PfE.js.map → RichTextEditor-Dv-LDsN-.js.map} +1 -1
  159. package/dist/{RichTextEditor-DSvSaszc.cjs → RichTextEditor-lmPGowSR.cjs} +2 -2
  160. package/dist/{RichTextEditor-DSvSaszc.cjs.map → RichTextEditor-lmPGowSR.cjs.map} +1 -1
  161. package/dist/RootLayout-B_ZtI-L_.cjs +2 -0
  162. package/dist/RootLayout-B_ZtI-L_.cjs.map +1 -0
  163. package/dist/RootLayout-DIOquzrU.js +642 -0
  164. package/dist/RootLayout-DIOquzrU.js.map +1 -0
  165. package/dist/{Select-K0a_7ROf.js → Select-Bw8Q86ts.js} +3 -3
  166. package/dist/{Select-K0a_7ROf.js.map → Select-Bw8Q86ts.js.map} +1 -1
  167. package/dist/{Select-1FWkryTK.cjs → Select-DdkJXkw-.cjs} +2 -2
  168. package/dist/{Select-1FWkryTK.cjs.map → Select-DdkJXkw-.cjs.map} +1 -1
  169. package/dist/{Sidebar-Dg15hPpM.js → Sidebar-CGL5hvpl.js} +3 -3
  170. package/dist/{Sidebar-Dg15hPpM.js.map → Sidebar-CGL5hvpl.js.map} +1 -1
  171. package/dist/{Sidebar-C3-u3Agj.cjs → Sidebar-CfEx7W7i.cjs} +2 -2
  172. package/dist/{Sidebar-C3-u3Agj.cjs.map → Sidebar-CfEx7W7i.cjs.map} +1 -1
  173. package/dist/{SpeedDial-CEBAWIYo.js → SpeedDial-C-yLmnk7.js} +2 -2
  174. package/dist/{SpeedDial-CEBAWIYo.js.map → SpeedDial-C-yLmnk7.js.map} +1 -1
  175. package/dist/{SpeedDial-D6me6w_m.cjs → SpeedDial-jOxWEd09.cjs} +2 -2
  176. package/dist/{SpeedDial-D6me6w_m.cjs.map → SpeedDial-jOxWEd09.cjs.map} +1 -1
  177. package/dist/{Stepper-wPPs57uZ.cjs → Stepper-D7An-ugU.cjs} +2 -2
  178. package/dist/{Stepper-wPPs57uZ.cjs.map → Stepper-D7An-ugU.cjs.map} +1 -1
  179. package/dist/{Stepper-BN0GsRZW.js → Stepper-DYpiLhzD.js} +2 -2
  180. package/dist/{Stepper-BN0GsRZW.js.map → Stepper-DYpiLhzD.js.map} +1 -1
  181. package/dist/{Table-CFl3OYlo.cjs → Table-BhaH8EKZ.cjs} +2 -2
  182. package/dist/{Table-CFl3OYlo.cjs.map → Table-BhaH8EKZ.cjs.map} +1 -1
  183. package/dist/{Table-DChIfjqj.js → Table-DK4GBKS3.js} +15 -15
  184. package/dist/{Table-DChIfjqj.js.map → Table-DK4GBKS3.js.map} +1 -1
  185. package/dist/{Tabs-BAKPWO4g.cjs → Tabs-6x4vC8je.cjs} +2 -2
  186. package/dist/{Tabs-BAKPWO4g.cjs.map → Tabs-6x4vC8je.cjs.map} +1 -1
  187. package/dist/{Tabs-DfVFgOfs.js → Tabs-CWiDeqqW.js} +2 -2
  188. package/dist/{Tabs-DfVFgOfs.js.map → Tabs-CWiDeqqW.js.map} +1 -1
  189. package/dist/{TagsField-CoBRqcjW.js → TagsField-Cg9YVl7G.js} +4 -4
  190. package/dist/{TagsField-CoBRqcjW.js.map → TagsField-Cg9YVl7G.js.map} +1 -1
  191. package/dist/{TagsField-5mbyaFQZ.cjs → TagsField-DwZLCIeb.cjs} +2 -2
  192. package/dist/{TagsField-5mbyaFQZ.cjs.map → TagsField-DwZLCIeb.cjs.map} +1 -1
  193. package/dist/{TextField-0gFvIFs8.js → TextField-5nQkU8HP.js} +3 -3
  194. package/dist/{TextField-0gFvIFs8.js.map → TextField-5nQkU8HP.js.map} +1 -1
  195. package/dist/{TextField-BL6OAJcP.cjs → TextField-BRaoadxk.cjs} +2 -2
  196. package/dist/{TextField-BL6OAJcP.cjs.map → TextField-BRaoadxk.cjs.map} +1 -1
  197. package/dist/ThemeToggle-DXpbooYn.js +28 -0
  198. package/dist/{ThemeToggle-_SUmLxmU.js.map → ThemeToggle-DXpbooYn.js.map} +1 -1
  199. package/dist/{ThemeToggle-BgKfcb02.cjs → ThemeToggle-DhaVEyPL.cjs} +2 -2
  200. package/dist/{ThemeToggle-BgKfcb02.cjs.map → ThemeToggle-DhaVEyPL.cjs.map} +1 -1
  201. package/dist/{TimeColumns-BE1sLoRV.js → TimeColumns-C_gdJn__.js} +2 -2
  202. package/dist/{TimeColumns-BE1sLoRV.js.map → TimeColumns-C_gdJn__.js.map} +1 -1
  203. package/dist/{TimeColumns-DkJsIu1w.cjs → TimeColumns-girAEgEN.cjs} +2 -2
  204. package/dist/{TimeColumns-DkJsIu1w.cjs.map → TimeColumns-girAEgEN.cjs.map} +1 -1
  205. package/dist/{TimePicker-Bv2qIFf9.js → TimePicker-DHdsY8kQ.js} +5 -5
  206. package/dist/{TimePicker-Bv2qIFf9.js.map → TimePicker-DHdsY8kQ.js.map} +1 -1
  207. package/dist/{TimePicker-6nHQx0P5.cjs → TimePicker-_Ak5yB_5.cjs} +2 -2
  208. package/dist/{TimePicker-6nHQx0P5.cjs.map → TimePicker-_Ak5yB_5.cjs.map} +1 -1
  209. package/dist/{Toaster-Fq6-ImDJ.js → Toaster-Dput5iLU.js} +2 -2
  210. package/dist/{Toaster-Fq6-ImDJ.js.map → Toaster-Dput5iLU.js.map} +1 -1
  211. package/dist/{Toaster-Brcspf7v.cjs → Toaster-fjyF8W3F.cjs} +2 -2
  212. package/dist/{Toaster-Brcspf7v.cjs.map → Toaster-fjyF8W3F.cjs.map} +1 -1
  213. package/dist/{TranslatedFields-CVc0NvXa.cjs → TranslatedFields-B-BU17IV.cjs} +2 -2
  214. package/dist/{TranslatedFields-CVc0NvXa.cjs.map → TranslatedFields-B-BU17IV.cjs.map} +1 -1
  215. package/dist/{TranslatedFields-CmRhRGC_.js → TranslatedFields-JnqLgUiF.js} +16 -16
  216. package/dist/{TranslatedFields-CmRhRGC_.js.map → TranslatedFields-JnqLgUiF.js.map} +1 -1
  217. package/dist/{UserCard-1ubnvBV6.cjs → UserCard-B9bzkZph.cjs} +2 -2
  218. package/dist/{UserCard-1ubnvBV6.cjs.map → UserCard-B9bzkZph.cjs.map} +1 -1
  219. package/dist/{UserCard-DcTLEHFu.js → UserCard-DYK6S-nr.js} +3 -3
  220. package/dist/{UserCard-DcTLEHFu.js.map → UserCard-DYK6S-nr.js.map} +1 -1
  221. package/dist/app/AdminRoot.d.cts +8 -1
  222. package/dist/app/AdminRoot.d.ts +8 -1
  223. package/dist/components/Alert/index.cjs +1 -1
  224. package/dist/components/Alert/index.js +1 -1
  225. package/dist/components/Breadcrumbs/index.cjs +1 -1
  226. package/dist/components/Breadcrumbs/index.js +1 -1
  227. package/dist/components/Button/index.cjs +1 -1
  228. package/dist/components/Button/index.js +1 -1
  229. package/dist/components/Card/index.cjs +1 -1
  230. package/dist/components/Card/index.js +1 -1
  231. package/dist/components/Chip/index.cjs +1 -1
  232. package/dist/components/Chip/index.js +1 -1
  233. package/dist/components/CodeBlock/index.cjs +1 -1
  234. package/dist/components/CodeBlock/index.js +1 -1
  235. package/dist/components/ColorPicker/index.cjs +1 -1
  236. package/dist/components/ColorPicker/index.js +1 -1
  237. package/dist/components/ColorRamp/index.cjs +1 -1
  238. package/dist/components/ColorRamp/index.js +1 -1
  239. package/dist/components/CopyButton/index.cjs +1 -1
  240. package/dist/components/CopyButton/index.js +1 -1
  241. package/dist/components/DatePicker/index.cjs +1 -1
  242. package/dist/components/DatePicker/index.js +1 -1
  243. package/dist/components/DateTimePicker/index.cjs +1 -1
  244. package/dist/components/DateTimePicker/index.js +1 -1
  245. package/dist/components/DescriptionList/index.cjs +1 -1
  246. package/dist/components/DescriptionList/index.js +1 -1
  247. package/dist/components/EmptyState/index.cjs +1 -1
  248. package/dist/components/EmptyState/index.js +1 -1
  249. package/dist/components/ErrorState/index.cjs +1 -1
  250. package/dist/components/ErrorState/index.js +2 -2
  251. package/dist/components/FileCard/index.cjs +1 -1
  252. package/dist/components/FileCard/index.js +1 -1
  253. package/dist/components/FileUploader/index.cjs +1 -1
  254. package/dist/components/FileUploader/index.js +1 -1
  255. package/dist/components/Flag/index.cjs +1 -1
  256. package/dist/components/Flag/index.js +1 -1
  257. package/dist/components/FullscreenToggle/index.cjs +1 -1
  258. package/dist/components/FullscreenToggle/index.js +1 -1
  259. package/dist/components/IconButton/index.cjs +1 -1
  260. package/dist/components/IconButton/index.js +1 -1
  261. package/dist/components/Loader/index.cjs +1 -1
  262. package/dist/components/Loader/index.js +1 -1
  263. package/dist/components/LocationPicker/index.cjs +1 -1
  264. package/dist/components/LocationPicker/index.js +1 -1
  265. package/dist/components/Modal/index.cjs +1 -1
  266. package/dist/components/Modal/index.js +1 -1
  267. package/dist/components/MultiSelect/index.cjs +1 -1
  268. package/dist/components/MultiSelect/index.js +1 -1
  269. package/dist/components/NumberField/index.cjs +1 -1
  270. package/dist/components/NumberField/index.js +1 -1
  271. package/dist/components/OtpField/index.cjs +1 -1
  272. package/dist/components/OtpField/index.js +1 -1
  273. package/dist/components/PageError/index.cjs +1 -1
  274. package/dist/components/PageError/index.js +1 -1
  275. package/dist/components/PageLayout/index.cjs +1 -1
  276. package/dist/components/PageLayout/index.js +1 -1
  277. package/dist/components/PageNotFound/index.cjs +1 -1
  278. package/dist/components/PageNotFound/index.js +1 -1
  279. package/dist/components/Pagination/index.cjs +1 -1
  280. package/dist/components/Pagination/index.js +1 -1
  281. package/dist/components/PaletteField/PaletteField.d.cts +8 -2
  282. package/dist/components/PaletteField/PaletteField.d.ts +8 -2
  283. package/dist/components/PaletteField/index.cjs +1 -1
  284. package/dist/components/PaletteField/index.js +1 -1
  285. package/dist/components/PhoneField/index.cjs +1 -1
  286. package/dist/components/PhoneField/index.js +1 -1
  287. package/dist/components/Popconfirm/index.cjs +1 -1
  288. package/dist/components/Popconfirm/index.js +1 -1
  289. package/dist/components/Progress/index.cjs +1 -1
  290. package/dist/components/Progress/index.js +1 -1
  291. package/dist/components/RemoveDialog/index.cjs +1 -1
  292. package/dist/components/RemoveDialog/index.js +1 -1
  293. package/dist/components/RichTextEditor/index.cjs +1 -1
  294. package/dist/components/RichTextEditor/index.js +1 -1
  295. package/dist/components/RootLayout/RootLayout.d.cts +18 -5
  296. package/dist/components/RootLayout/RootLayout.d.ts +18 -5
  297. package/dist/components/RootLayout/SettingsDrawer.d.cts +8 -2
  298. package/dist/components/RootLayout/SettingsDrawer.d.ts +8 -2
  299. package/dist/components/RootLayout/index.cjs +1 -1
  300. package/dist/components/RootLayout/index.d.cts +1 -1
  301. package/dist/components/RootLayout/index.d.ts +1 -1
  302. package/dist/components/RootLayout/index.js +1 -1
  303. package/dist/components/Select/index.cjs +1 -1
  304. package/dist/components/Select/index.js +1 -1
  305. package/dist/components/Sidebar/index.cjs +1 -1
  306. package/dist/components/Sidebar/index.js +1 -1
  307. package/dist/components/SpeedDial/index.cjs +1 -1
  308. package/dist/components/SpeedDial/index.js +1 -1
  309. package/dist/components/Stepper/index.cjs +1 -1
  310. package/dist/components/Stepper/index.js +1 -1
  311. package/dist/components/Table/index.cjs +1 -1
  312. package/dist/components/Table/index.js +1 -1
  313. package/dist/components/Tabs/index.cjs +1 -1
  314. package/dist/components/Tabs/index.js +1 -1
  315. package/dist/components/TagsField/index.cjs +1 -1
  316. package/dist/components/TagsField/index.js +1 -1
  317. package/dist/components/TextField/index.cjs +1 -1
  318. package/dist/components/TextField/index.js +1 -1
  319. package/dist/components/ThemeToggle/index.cjs +1 -1
  320. package/dist/components/ThemeToggle/index.js +1 -1
  321. package/dist/components/TimePicker/index.cjs +1 -1
  322. package/dist/components/TimePicker/index.js +1 -1
  323. package/dist/components/Toast/index.cjs +1 -1
  324. package/dist/components/Toast/index.js +1 -1
  325. package/dist/components/TranslatedFields/index.cjs +1 -1
  326. package/dist/components/TranslatedFields/index.js +1 -1
  327. package/dist/components/UserCard/index.cjs +1 -1
  328. package/dist/components/UserCard/index.js +1 -1
  329. package/dist/entries/app.cjs +1 -1
  330. package/dist/entries/app.js +1 -1
  331. package/dist/entries/components.cjs +1 -1
  332. package/dist/entries/components.js +50 -50
  333. package/dist/entries/i18n.cjs +1 -1
  334. package/dist/entries/i18n.js +2 -2
  335. package/dist/entries/theme.cjs +1 -1
  336. package/dist/entries/theme.d.cts +2 -2
  337. package/dist/entries/theme.d.ts +2 -2
  338. package/dist/entries/theme.js +12 -11
  339. package/dist/i18n/messages.d.cts +6 -0
  340. package/dist/i18n/messages.d.ts +6 -0
  341. package/dist/index.cjs +1 -1
  342. package/dist/index.css +1 -1
  343. package/dist/index.js +232 -231
  344. package/dist/{messages-CMgYU5p6.js → messages-BasxRpyx.js} +64 -22
  345. package/dist/messages-BasxRpyx.js.map +1 -0
  346. package/dist/{messages-h22vS9zn.cjs → messages-CElolVGm.cjs} +9 -9
  347. package/dist/messages-CElolVGm.cjs.map +1 -0
  348. package/dist/theme/ConfigProvider.d.cts +33 -2
  349. package/dist/theme/ConfigProvider.d.ts +33 -2
  350. package/dist/theme/index.d.cts +2 -2
  351. package/dist/theme/index.d.ts +2 -2
  352. package/dist/{useHomeTo-MfvJxziQ.cjs → useHomeTo-BnjXms11.cjs} +2 -2
  353. package/dist/{useHomeTo-MfvJxziQ.cjs.map → useHomeTo-BnjXms11.cjs.map} +1 -1
  354. package/dist/{useHomeTo-Ckq7scIY.js → useHomeTo-Btkk0RSB.js} +2 -2
  355. package/dist/{useHomeTo-Ckq7scIY.js.map → useHomeTo-Btkk0RSB.js.map} +1 -1
  356. package/dist/{useOptionMenu-BBsyUow1.js → useOptionMenu-DeW68na-.js} +3 -3
  357. package/dist/{useOptionMenu-BBsyUow1.js.map → useOptionMenu-DeW68na-.js.map} +1 -1
  358. package/dist/{useOptionMenu-3YlvxPAM.cjs → useOptionMenu-IebDGoqk.cjs} +2 -2
  359. package/dist/{useOptionMenu-3YlvxPAM.cjs.map → useOptionMenu-IebDGoqk.cjs.map} +1 -1
  360. package/package.json +1 -1
  361. package/dist/AdminRoot-CRTBGUxq.cjs +0 -2
  362. package/dist/AdminRoot-CRTBGUxq.cjs.map +0 -1
  363. package/dist/AdminRoot-JOgiNkJA.js.map +0 -1
  364. package/dist/ConfigProvider-B_Bb6pk1.cjs +0 -2
  365. package/dist/ConfigProvider-B_Bb6pk1.cjs.map +0 -1
  366. package/dist/ConfigProvider-DeMASTVo.js +0 -347
  367. package/dist/ConfigProvider-DeMASTVo.js.map +0 -1
  368. package/dist/PaletteField-ChG2VQtS.js +0 -54
  369. package/dist/PaletteField-ChG2VQtS.js.map +0 -1
  370. package/dist/PaletteField-DQ1OvXqe.cjs +0 -2
  371. package/dist/PaletteField-DQ1OvXqe.cjs.map +0 -1
  372. package/dist/RootLayout-BlYjYAYk.js +0 -582
  373. package/dist/RootLayout-BlYjYAYk.js.map +0 -1
  374. package/dist/RootLayout-D5nlzYlH.cjs +0 -2
  375. package/dist/RootLayout-D5nlzYlH.cjs.map +0 -1
  376. package/dist/ThemeToggle-_SUmLxmU.js +0 -28
  377. package/dist/messages-CMgYU5p6.js.map +0 -1
  378. package/dist/messages-h22vS9zn.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"LocationPicker-Ce8aLubZ.js","sources":["../src/components/LocationPicker/googleMaps.ts","../src/components/LocationPicker/PlaceSearch.tsx","../src/components/LocationPicker/LocationPicker.tsx"],"sourcesContent":["// Google Maps JavaScript API — loaded on demand with Google's own `<script>` (no npm dependency, so an app that\n// never renders a map neither installs nor downloads anything), once per page, then reused. The types below are\n// the small slice `LocationPicker` touches, so the library's public typings don't depend on `@types/google.maps`.\n\nexport interface LatLngLiteral {\n lat: number\n lng: number\n}\n\nexport interface MapsLatLng {\n lat(): number\n lng(): number\n}\n\nexport interface MapsEventListener {\n remove(): void\n}\n\nexport interface MapsMouseEvent {\n latLng: MapsLatLng | null\n}\n\nexport interface MapsMap {\n setCenter(center: LatLngLiteral): void\n panTo(center: LatLngLiteral): void\n setZoom(zoom: number): void\n getZoom(): number | undefined\n getCenter(): MapsLatLng | undefined\n setOptions(options: Record<string, unknown>): void\n addListener(event: string, handler: (event: MapsMouseEvent) => void): MapsEventListener\n}\n\n/** A custom pin image: an SVG string, its rendered size and the anchor (the tip) in that size's px. */\nexport interface PinIcon {\n svg: string\n width: number\n height: number\n anchorX: number\n anchorY: number\n}\n\n/** The pin — a classic `Marker` or an `AdvancedMarkerElement`, adapted to one shape. */\nexport interface MapsPin {\n setPosition(position: LatLngLiteral | null): void\n /** Swap the pin image (e.g. a new accent color). */\n setIcon(icon: PinIcon): void\n setDraggable(draggable: boolean): void\n onDragEnd(handler: (position: LatLngLiteral) => void): MapsEventListener\n remove(): void\n}\n\n/** One autocomplete suggestion — a place's main text (name / street) and its secondary text (city, country). */\nexport interface PlaceSuggestion {\n id: string\n primary: string\n secondary?: string\n}\n\n/** A picked place, resolved to a point (+ its formatted address when Google has one). */\nexport interface PlaceResult {\n location: LatLngLiteral\n address?: string\n}\n\n/**\n * An address / place search session (Places API (New)). Suggestions share one session token until a place is\n * resolved — that's how Google bills a search as one session, not per keystroke.\n */\nexport interface PlacesSession {\n suggest(\n input: string,\n options: { language?: string; bias?: LatLngLiteral; regions?: string[] },\n ): Promise<PlaceSuggestion[]>\n /** Resolve a suggestion to its point + address (ends the session). */\n resolve(id: string): Promise<PlaceResult | null>\n}\n\nexport interface GoogleMapsApi {\n /** Google's `ColorScheme` value for a mode (the Map ID light / dark option; set when a map is created). */\n colorScheme(mode: 'light' | 'dark'): unknown\n /** Start an address / place search session (loads the `places` library on first use). */\n createPlacesSession(): PlacesSession\n /** The formatted address at a point (Geocoding API; loads `geocoding` on first use), or `null`. */\n reverseGeocode(position: LatLngLiteral, language?: string): Promise<string | null>\n /** Create a map in `element`. */\n createMap(element: HTMLElement, options: Record<string, unknown>): MapsMap\n /** Create the pin on `map` (an `AdvancedMarkerElement` when the map has a `mapId`). */\n createPin(\n map: MapsMap,\n options: { position: LatLngLiteral | null; advanced: boolean; icon?: PinIcon },\n ): MapsPin\n}\n\ninterface RawLibraries {\n Map: new (element: HTMLElement, options: Record<string, unknown>) => MapsMap\n Marker: new (options: Record<string, unknown>) => {\n setPosition(position: LatLngLiteral | null): void\n setMap(map: MapsMap | null): void\n setDraggable(draggable: boolean): void\n setIcon(icon: unknown): void\n getPosition(): MapsLatLng | null | undefined\n addListener(event: string, handler: () => void): MapsEventListener\n }\n AdvancedMarkerElement?: new (options: Record<string, unknown>) => {\n position: LatLngLiteral | MapsLatLng | null\n map: MapsMap | null\n gmpDraggable: boolean\n content: HTMLElement | null\n addListener(event: string, handler: () => void): MapsEventListener\n }\n ColorScheme?: { LIGHT: unknown; DARK: unknown }\n Size?: new (width: number, height: number) => unknown\n Point?: new (x: number, y: number) => unknown\n}\n\ninterface GoogleNamespace {\n maps: {\n importLibrary(name: string): Promise<Record<string, unknown>>\n Animation?: { DROP: unknown }\n }\n}\n\nconst SCRIPT_ID = 'tz-google-maps'\nconst CALLBACK = '__tzGoogleMapsReady'\n\nlet pending: { key: string; promise: Promise<GoogleMapsApi> } | null = null\nlet geocodeDeniedWarned = false\n\n// ── key rejected ─────────────────────────────────────────────────────────────────────────────────────\n// Google reports an authentication failure (key restricted to other referrers, Maps JavaScript API not enabled,\n// no billing…) only by calling a global `gm_authFailure()` and painting its own grey \"Oops!\" over the map. We\n// hook it so `LocationPicker` can cover that with its own, localized message. Any app-defined handler still runs.\nlet authFailed = false\nconst authListeners = new Set<() => void>()\nfunction installAuthFailureHook() {\n const g = globalThis as { gm_authFailure?: () => void; __tzAuthHooked?: boolean }\n if (g.__tzAuthHooked) return\n g.__tzAuthHooked = true\n const previous = g.gm_authFailure\n g.gm_authFailure = () => {\n authFailed = true\n authListeners.forEach((listener) => listener())\n previous?.()\n }\n}\n\n/** Call `listener` when Google rejects the API key (immediately if it already has). Returns an unsubscribe. */\nexport function onMapsAuthFailure(listener: () => void): () => void {\n if (authFailed) listener()\n authListeners.add(listener)\n return () => {\n authListeners.delete(listener)\n }\n}\n\nconst googleNs = (): GoogleNamespace | undefined =>\n (globalThis as { google?: GoogleNamespace }).google\n\nconst toLiteral = (p: LatLngLiteral | MapsLatLng): LatLngLiteral =>\n typeof (p as MapsLatLng).lat === 'function'\n ? { lat: (p as MapsLatLng).lat(), lng: (p as MapsLatLng).lng() }\n : (p as LatLngLiteral)\n\n/** Inject Google's script tag (first map on the page) and resolve once its namespace is ready. */\nfunction injectScript(apiKey: string, language?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const params = new URLSearchParams({\n key: apiKey,\n v: 'weekly',\n loading: 'async',\n callback: CALLBACK,\n })\n if (language) params.set('language', language)\n ;(globalThis as Record<string, unknown>)[CALLBACK] = () => resolve()\n const script = document.createElement('script')\n script.id = SCRIPT_ID\n script.async = true\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`\n script.onerror = () => {\n script.remove()\n reject(new Error('The Google Maps script failed to load'))\n }\n document.head.appendChild(script)\n })\n}\n\nasync function buildApi(): Promise<GoogleMapsApi> {\n const ns = googleNs()\n if (!ns?.maps?.importLibrary) throw new Error('Google Maps is unavailable')\n const [core, maps, marker] = await Promise.all([\n ns.maps.importLibrary('core'),\n ns.maps.importLibrary('maps'),\n ns.maps.importLibrary('marker'),\n ])\n const lib = { ...core, ...maps, ...marker } as unknown as RawLibraries\n const drop = ns.maps.Animation?.DROP\n const svgUrl = (svg: string) => `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`\n\n // classic marker icon — Google wants its own Size / Point instances\n const markerIcon = (icon: PinIcon) => ({\n url: svgUrl(icon.svg),\n scaledSize: lib.Size\n ? new lib.Size(icon.width, icon.height)\n : { width: icon.width, height: icon.height },\n anchor: lib.Point\n ? new lib.Point(icon.anchorX, icon.anchorY)\n : { x: icon.anchorX, y: icon.anchorY },\n })\n // advanced marker content — the element's bottom-centre sits on the position, so shift the tip down onto it\n const pinElement = (icon: PinIcon) => {\n const img = document.createElement('img')\n img.src = svgUrl(icon.svg)\n img.width = icon.width\n img.height = icon.height\n img.alt = ''\n img.style.display = 'block'\n img.style.transform = `translate(${icon.width / 2 - icon.anchorX}px, ${icon.height - icon.anchorY}px)`\n return img\n }\n\n // the search / address libraries are only fetched the first time they're used\n let placesLib: Promise<Record<string, unknown>> | null = null\n let geocodingLib: Promise<Record<string, unknown>> | null = null\n const places = () => (placesLib ??= ns.maps.importLibrary('places'))\n const geocoding = () => (geocodingLib ??= ns.maps.importLibrary('geocoding'))\n\n interface RawPrediction {\n placeId?: string\n text?: { text: string }\n mainText?: { text: string } | null\n secondaryText?: { text: string } | null\n toPlace(): {\n fetchFields(options: { fields: string[] }): Promise<unknown>\n location?: MapsLatLng | null\n formattedAddress?: string | null\n }\n }\n\n return {\n colorScheme: (mode) =>\n lib.ColorScheme ? lib.ColorScheme[mode === 'dark' ? 'DARK' : 'LIGHT'] : mode.toUpperCase(),\n createPlacesSession: () => {\n let token: unknown = null\n let predictions = new Map<string, RawPrediction>()\n return {\n async suggest(input, { language, bias, regions }) {\n const lib = (await places()) as {\n AutocompleteSessionToken: new () => unknown\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions(\n request: Record<string, unknown>,\n ): Promise<{ suggestions: { placePrediction?: RawPrediction | null }[] }>\n }\n }\n token ??= new lib.AutocompleteSessionToken()\n const { suggestions } = await lib.AutocompleteSuggestion.fetchAutocompleteSuggestions({\n input,\n sessionToken: token,\n ...(language ? { language } : {}),\n ...(bias ? { locationBias: { center: bias, radius: 50000 } } : {}),\n ...(regions?.length ? { includedRegionCodes: regions } : {}),\n })\n predictions = new Map()\n return suggestions.flatMap((s, i) => {\n const p = s.placePrediction\n if (!p) return []\n const id = p.placeId ?? String(i)\n predictions.set(id, p)\n const primary = p.mainText?.text ?? p.text?.text ?? ''\n return [{ id, primary, secondary: p.secondaryText?.text ?? undefined }]\n })\n },\n async resolve(id) {\n const prediction = predictions.get(id)\n if (!prediction) return null\n const place = prediction.toPlace()\n await place.fetchFields({ fields: ['location', 'formattedAddress'] })\n token = null // the details call closes the session\n if (!place.location) return null\n return {\n location: toLiteral(place.location),\n address: place.formattedAddress ?? undefined,\n }\n },\n }\n },\n reverseGeocode: async (position, language) => {\n const lib = (await geocoding()) as {\n Geocoder: new () => {\n geocode(request: Record<string, unknown>): Promise<{\n results: { formatted_address?: string }[]\n }>\n }\n }\n try {\n const { results } = await new lib.Geocoder().geocode({\n location: position,\n ...(language ? { language } : {}),\n })\n return results[0]?.formatted_address ?? null\n } catch (error) {\n // ZERO_RESULTS (sea, desert…) is just \"no address\"; a denied request means the Geocoding API isn't\n // enabled / allowed for the key — say so once, so a silently missing address has a visible cause\n const code = (error as { code?: string } | null)?.code\n if (code === 'REQUEST_DENIED' && !geocodeDeniedWarned) {\n geocodeDeniedWarned = true\n console.warn(\n \"[LocationPicker] Address lookup was denied — enable the Geocoding API for this Google Maps key (and allow it in the key's API restrictions).\",\n )\n }\n return null\n }\n },\n createMap: (element, options) => new lib.Map(element, options),\n createPin: (map, { position, advanced, icon }) => {\n if (advanced && lib.AdvancedMarkerElement) {\n const pin = new lib.AdvancedMarkerElement({\n map,\n position,\n gmpDraggable: true,\n ...(icon ? { content: pinElement(icon) } : {}),\n })\n return {\n setPosition: (p) => {\n pin.position = p\n },\n setIcon: (next) => {\n pin.content = pinElement(next)\n },\n setDraggable: (d) => {\n pin.gmpDraggable = d\n },\n onDragEnd: (handler) =>\n pin.addListener('dragend', () => pin.position && handler(toLiteral(pin.position))),\n remove: () => {\n pin.map = null\n },\n }\n }\n const pin = new lib.Marker({\n map,\n position,\n draggable: true,\n animation: drop,\n ...(icon ? { icon: markerIcon(icon) } : {}),\n })\n return {\n setPosition: (p) => pin.setPosition(p),\n setIcon: (next) => pin.setIcon(markerIcon(next)),\n setDraggable: (d) => pin.setDraggable(d),\n onDragEnd: (handler) =>\n pin.addListener('dragend', () => {\n const p = pin.getPosition()\n if (p) handler(toLiteral(p))\n }),\n remove: () => pin.setMap(null),\n }\n },\n }\n}\n\n/**\n * Load the Maps JavaScript API (once per page) and return the small adapter `LocationPicker` uses. Reuses an\n * already-present `google.maps` (an app that loads Maps itself, or tests); a failed load can be retried.\n */\nexport function loadGoogleMaps(apiKey: string, language?: string): Promise<GoogleMapsApi> {\n installAuthFailureHook()\n if (pending && pending.key === apiKey) return pending.promise\n const promise = (async () => {\n if (!googleNs()?.maps?.importLibrary) {\n if (typeof document === 'undefined') throw new Error('Google Maps needs a browser')\n if (!document.getElementById(SCRIPT_ID)) await injectScript(apiKey, language)\n else {\n // another key's script is already on the page — Maps can't be loaded twice; wait for it\n await new Promise<void>((resolve) => {\n const check = () => (googleNs()?.maps?.importLibrary ? resolve() : setTimeout(check, 50))\n check()\n })\n }\n }\n return buildApi()\n })()\n pending = { key: apiKey, promise }\n promise.catch(() => {\n if (pending?.promise === promise) pending = null // let a later render retry\n })\n return promise\n}\n\n/** Test hook: forget the cached loader and any recorded key rejection. */\nexport function resetGoogleMapsLoader(): void {\n pending = null\n authFailed = false\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent } from 'react'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Icon } from '../Icon'\nimport { ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { TextField } from '../TextField'\nimport { Typography } from '../Typography'\nimport type {\n GoogleMapsApi,\n LatLngLiteral,\n PlaceResult,\n PlaceSuggestion,\n PlacesSession,\n} from './googleMaps'\nimport styles from './LocationPicker.module.css'\n\nconst DEBOUNCE_MS = 250\nconst MIN_CHARS = 2\n\ntype SearchState = 'idle' | 'loading' | 'ready' | 'error'\n\nexport interface PlaceSearchProps {\n api: GoogleMapsApi\n /** UI language for the suggestions. */\n language?: string\n /** Bias results towards this point (the map's centre). */\n bias?: () => LatLngLiteral | undefined\n /** Restrict results to these regions (ISO 3166-1 alpha-2, e.g. `['ge']`). */\n regions?: string[]\n size: 'sm' | 'md' | 'lg'\n disabled?: boolean\n /** Fires with the picked place's point + address. */\n onPick: (place: PlaceResult) => void\n}\n\n/**\n * The address / place search above the map — our own field + listbox (so it looks and behaves like the rest of\n * the library), fed by Google's Places API (New): debounced suggestions biased to the map centre, keyboard\n * navigation (↑ ↓ Enter Escape), and a pick that resolves the place to a point. Internal to `LocationPicker`.\n */\nexport function PlaceSearch({\n api,\n language,\n bias,\n regions,\n size,\n disabled,\n onPick,\n}: PlaceSearchProps) {\n const t = useT()\n const listId = useId()\n const anchorRef = useRef<HTMLDivElement | null>(null)\n const sessionRef = useRef<PlacesSession | null>(null)\n const requestRef = useRef(0)\n const [query, setQuery] = useState('')\n const [suggestions, setSuggestions] = useState<PlaceSuggestion[]>([])\n const [state, setState] = useState<SearchState>('idle')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(-1)\n const [resolving, setResolving] = useState(false)\n\n const session = () => (sessionRef.current ??= api.createPlacesSession())\n\n // debounced suggestions — only the latest request's answer is shown\n useEffect(() => {\n const input = query.trim()\n if (input.length < MIN_CHARS) {\n setSuggestions([])\n setState('idle')\n return\n }\n const id = ++requestRef.current\n setState('loading')\n const timer = window.setTimeout(() => {\n session()\n .suggest(input, { language, bias: bias?.(), regions })\n .then((list) => {\n if (id !== requestRef.current) return\n setSuggestions(list)\n setActive(list.length ? 0 : -1)\n setState('ready')\n })\n .catch(() => {\n if (id !== requestRef.current) return\n setSuggestions([])\n setState('error')\n })\n }, DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, language, regions?.join(',')])\n\n const pick = async (suggestion: PlaceSuggestion) => {\n setResolving(true)\n try {\n const place = await session().resolve(suggestion.id)\n sessionRef.current = null // the next search is a new session\n if (!place) return\n setQuery(\n place.address ?? [suggestion.primary, suggestion.secondary].filter(Boolean).join(', '),\n )\n setOpen(false)\n setSuggestions([])\n setState('idle')\n requestRef.current++ // drop any in-flight suggestion answer for the old text\n onPick(place)\n } catch {\n setState('error')\n } finally {\n setResolving(false)\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (!suggestions.length) return\n event.preventDefault()\n setOpen(true)\n const step = event.key === 'ArrowDown' ? 1 : -1\n setActive((i) => (i + step + suggestions.length) % suggestions.length)\n } else if (event.key === 'Enter') {\n // never submit the surrounding form from the search box\n event.preventDefault()\n const suggestion = suggestions[active]\n if (open && suggestion) void pick(suggestion)\n } else if (event.key === 'Escape' && open) {\n event.stopPropagation() // close the list, not an enclosing Modal\n setOpen(false)\n }\n }\n\n const showPanel = open && query.trim().length >= MIN_CHARS && state !== 'idle'\n const optionId = (i: number) => `${listId}-option-${i}`\n\n return (\n <div ref={anchorRef} className={styles.search}>\n <TextField\n size={size}\n disabled={disabled}\n value={query}\n placeholder={t('location.searchPlaceholder')}\n adornment={resolving ? <Loader size=\"sm\" /> : <Icon name=\"SearchNormal\" />}\n role=\"combobox\"\n aria-label={t('location.searchPlaceholder')}\n aria-autocomplete=\"list\"\n aria-expanded={showPanel}\n aria-controls={showPanel ? listId : undefined}\n aria-activedescendant={showPanel && active >= 0 ? optionId(active) : undefined}\n autoComplete=\"off\"\n onChange={(e) => {\n setQuery(e.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n <FloatingPanel\n open={showPanel}\n triggerRef={anchorRef}\n matchTriggerWidth\n onClose={() => setOpen(false)}\n className={styles.searchPanel}\n >\n {state === 'loading' && !suggestions.length ? (\n <div className={styles.searchStatus}>\n <Loader size=\"sm\" />\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searching')}\n </Typography>\n </div>\n ) : state === 'error' ? (\n <div className={styles.searchStatus}>\n <Icon name=\"Danger\" color=\"error\" />\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searchUnavailable')}\n </Typography>\n </div>\n ) : suggestions.length === 0 ? (\n <div className={styles.searchStatus}>\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searchEmpty')}\n </Typography>\n </div>\n ) : (\n <div role=\"listbox\" id={listId} aria-label={t('location.searchPlaceholder')}>\n {suggestions.map((s, i) => (\n <ListItem\n key={s.id}\n id={optionId(i)}\n role=\"option\"\n aria-selected={i === active}\n selected={i === active}\n clickable\n icon={<Icon name=\"Location\" />}\n description={s.secondary}\n // keep focus in the input while choosing\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => void pick(s)}\n >\n {s.primary}\n </ListItem>\n ))}\n </div>\n )}\n </FloatingPanel>\n </div>\n )\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useColorMode, useLanguage, useMapsConfig, useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { CopyButton } from '../CopyButton'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Skeleton } from '../Skeleton'\nimport { TextField } from '../TextField'\nimport { Tooltip } from '../Tooltip'\nimport { Typography } from '../Typography'\nimport {\n loadGoogleMaps,\n onMapsAuthFailure,\n type GoogleMapsApi,\n type LatLngLiteral,\n type MapsMap,\n type MapsPin,\n type PinIcon,\n} from './googleMaps'\nimport { PlaceSearch } from './PlaceSearch'\nimport styles from './LocationPicker.module.css'\n\nexport type LocationPickerSize = 'sm' | 'md' | 'lg'\n\n/** A point on the map — the field's value (`null` while no pin is placed). */\nexport interface LocationValue {\n /** Latitude (განედი), `-90`…`90`. */\n lat: number\n /** Longitude (გრძედი), `-180`…`180`. */\n lng: number\n}\n\n/** The map view — where it's centred and how far it's zoomed. */\nexport interface LocationView {\n center: LocationValue\n zoom: number\n}\n\n/** Tbilisi — the default view when there's no pin. */\nexport const TBILISI: LocationValue = { lat: 41.7151, lng: 44.8271 }\nconst DEFAULT_ZOOM = 12\n/** Google's zoom range (world … building). */\nconst MIN_ZOOM = 0\nconst MAX_ZOOM = 22\n/** Zoom used when \"my location\" jumps to the user. */\nconst LOCATE_ZOOM = 16\n\nexport interface LocationPickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'color'\n> {\n /** Controlled value — `{ lat, lng }`, or `null` for no pin. */\n value?: LocationValue | null\n /** Initial value for uncontrolled use. */\n defaultValue?: LocationValue | null\n /** Fires with the new point (map click, pin drag, typed coordinates, \"my location\") or `null` when cleared. */\n onChange?: (value: LocationValue | null) => void\n /** Form field name — binds the value to a surrounding `<Form>` (value = `{ lat, lng } | null`). */\n name?: string\n /** Label above the map. */\n label?: ReactNode\n /** Helper / validation text under the fields. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Error state — red frame + helper. */\n error?: boolean\n /** Shows a required asterisk after the label. */\n required?: boolean\n /** Read-only: the map can be looked at but not pinned, the fields are disabled. */\n disabled?: boolean\n /** Size of the latitude / longitude fields. Defaults to `md`. */\n size?: LocationPickerSize\n /** Google Maps API key. Defaults to `config.maps.apiKey`. */\n apiKey?: string\n /** Google Map ID (cloud styling + advanced marker). Defaults to `config.maps.mapId`. */\n mapId?: string\n /** Controlled map centre. Defaults to the pin, else Tbilisi. */\n center?: LocationValue\n /** Initial map centre (uncontrolled). Defaults to the value's pin, else Tbilisi. */\n defaultCenter?: LocationValue\n /** Fires after the map is panned (once it settles) with the new centre. */\n onCenterChange?: (center: LocationValue) => void\n /** Controlled zoom level. */\n zoom?: number\n /** Initial zoom level (uncontrolled). Defaults to `12` (a city). */\n defaultZoom?: number\n /** Fires with the new zoom level. */\n onZoomChange?: (zoom: number) => void\n /** Height of the map in px. Defaults to `300`. */\n mapHeight?: number\n /** Show the \"my location\" button (browser geolocation). Defaults to `true`. */\n locateButton?: boolean\n /** Decimal places the coordinates are kept to. Defaults to `6` (~0.1 m). */\n precision?: number\n /**\n * Show an **address / place search** above the map (Google **Places API (New)** — enable it for the key).\n * Picking a result drops the pin there and moves the map to it. Defaults to `false`.\n */\n search?: boolean\n /** Restrict the search to these regions (ISO 3166-1 alpha-2 codes, e.g. `['ge']`). Default: worldwide. */\n searchRegions?: string[]\n /**\n * Look up the **address of the pin** (Google **Geocoding API** — enable it for the key) and show it under the\n * map; reported through `onAddressChange` / `addressName`. A place picked from the search brings its own\n * address (no extra lookup). Defaults to `false`.\n */\n geocode?: boolean\n /** Fires with the pin's address after a user change (`null` when there's no pin / no address). */\n onAddressChange?: (address: string | null) => void\n /** Inside a `<Form>`: the field the pin's address is written to (e.g. `\"address\"`), alongside the coordinates. */\n addressName?: string\n}\n\ntype MapStatus = 'missingKey' | 'loading' | 'ready' | 'error' | 'authError'\n\nconst round = (n: number, precision: number) => Number(n.toFixed(precision))\nconst sameCenter = (a: LocationValue, b: LocationValue) =>\n Math.abs(a.lat - b.lat) < 1e-7 && Math.abs(a.lng - b.lng) < 1e-7\nconst formatCoord = (n: number | undefined, precision: number) =>\n n == null ? '' : String(round(n, precision))\n\n/** Parse one coordinate draft → a number in range, `null` for empty, `undefined` for invalid. */\nfunction parseCoord(draft: string, limit: number): number | null | undefined {\n const s = draft.trim().replace(',', '.')\n if (s === '') return null\n if (!/^[-+]?\\d+(\\.\\d*)?$/.test(s)) return undefined // a trailing '.' while typing is fine\n const n = Number(s)\n return Math.abs(n) <= limit ? n : undefined\n}\n\n/** A pasted \"41.7151, 44.8271\" (or \"41.7151 44.8271\") → both coordinates. */\nfunction parsePair(text: string): LocationValue | null {\n const m = text.trim().match(/^\\(?\\s*([-+]?\\d+(?:\\.\\d+)?)\\s*[,;\\s]\\s*([-+]?\\d+(?:\\.\\d+)?)\\s*\\)?$/)\n if (!m) return null\n const lat = Number(m[1])\n const lng = Number(m[2])\n return Math.abs(lat) <= 90 && Math.abs(lng) <= 180 ? { lat, lng } : null\n}\n\n/** A theme color token (`--tz-color-<name>-rgb`) as `#rrggbb`, read live from `<html>`. */\nfunction tokenHex(name: string, fallback: string): string {\n const raw = getComputedStyle(document.documentElement)\n .getPropertyValue(`--tz-color-${name}-rgb`)\n .trim()\n if (!raw) return fallback\n const [r, g, b] = raw.split(',').map((v) => Number(v.trim()))\n if ([r, g, b].some((v) => Number.isNaN(v))) return fallback\n return `#${[r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * The pin: a teardrop in the theme's **accent** color with a white rim, a white centre dot and a soft drop\n * shadow (so it reads on light and dark tiles alike). Drawn on a 40×52 grid — the tip at (20, 45), the rest\n * of the box is the shadow's room — and rendered at 34×44.\n */\nconst PIN_VIEW = { width: 40, height: 52, tipX: 20, tipY: 45 }\nconst PIN_SIZE = { width: 34, height: 44 }\nfunction pinIcon(color: string): PinIcon {\n const scale = PIN_SIZE.width / PIN_VIEW.width\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${PIN_VIEW.width}\" height=\"${PIN_VIEW.height}\" viewBox=\"0 0 ${PIN_VIEW.width} ${PIN_VIEW.height}\">` +\n `<defs><filter id=\"s\" x=\"-40%\" y=\"-20%\" width=\"180%\" height=\"160%\">` +\n `<feDropShadow dx=\"0\" dy=\"2\" stdDeviation=\"1.8\" flood-color=\"#000\" flood-opacity=\".3\"/></filter></defs>` +\n `<path filter=\"url(#s)\" fill=\"${color}\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linejoin=\"round\" ` +\n `d=\"M20 3C11.2 3 4 10 4 18.7c0 10.9 13.3 24 14.7 25.3a1.9 1.9 0 0 0 2.6 0C22.7 42.7 36 29.6 36 18.7 36 10 28.8 3 20 3Z\"/>` +\n `<circle cx=\"20\" cy=\"18.5\" r=\"6.2\" fill=\"#fff\"/>` +\n `</svg>`\n return {\n svg,\n width: PIN_SIZE.width,\n height: PIN_SIZE.height,\n anchorX: PIN_VIEW.tipX * scale,\n anchorY: PIN_VIEW.tipY * scale,\n }\n}\n/** The accent the pin is painted with right now (the brand teal before a theme has been applied). */\nconst accentPin = () => pinIcon(tokenHex('accent', '#056472'))\n\n/** A dark map built from the live theme tokens, so it matches the panel (classic styling, no `mapId`). */\nfunction darkMapStyles(): Record<string, unknown>[] {\n const css = getComputedStyle(document.documentElement)\n const rgb = (name: string, fallback: string) => {\n const raw = css.getPropertyValue(`--tz-color-${name}-rgb`).trim()\n if (!raw) return fallback\n const [r, g, b] = raw.split(',').map((v) => Number(v.trim()))\n return `#${[r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('')}`\n }\n const surface = rgb('surface', '#191919')\n const background = rgb('background', '#0f0f0f')\n const text = rgb('primary', '#e6e8eb')\n const accent = rgb('accent', '#16a6b4')\n return [\n { elementType: 'geometry', stylers: [{ color: surface }] },\n { elementType: 'labels.text.fill', stylers: [{ color: text }, { lightness: -35 }] },\n { elementType: 'labels.text.stroke', stylers: [{ color: background }] },\n { featureType: 'road', elementType: 'geometry', stylers: [{ color: background }] },\n { featureType: 'road', elementType: 'geometry.stroke', stylers: [{ color: surface }] },\n {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{ color: accent }, { lightness: -55 }],\n },\n {\n featureType: 'poi',\n elementType: 'geometry',\n stylers: [{ color: surface }, { lightness: 4 }],\n },\n { featureType: 'transit', stylers: [{ visibility: 'off' }] },\n ]\n}\n\n/**\n * A location picker: a **Google Map** you click to drop a pin (drag it to adjust), with **latitude / longitude**\n * fields below that stay in sync both ways — pasting `\"41.7151, 44.8271\"` into either fills both. The value is\n * `{ lat, lng } | null`; binds to a `<Form>` by `name`. The map shows **Tbilisi** by default, doesn't hijack the\n * page scroll (Ctrl / ⌘ + scroll zooms), offers **my location**, **centre on pin** and **remove pin**, and a\n * copyable coordinate pill. Its **view is controllable** (`center` / `zoom` + `onCenterChange` / `onZoomChange`,\n * or `defaultCenter` / `defaultZoom`). The Maps JavaScript API is loaded on demand with the `apiKey` prop or\n * `config.maps.apiKey`; without a key (or if loading fails) the fields keep working and the map says why.\n */\nexport const LocationPicker = forwardRef<HTMLDivElement, LocationPickerProps>(\n function LocationPicker(\n {\n value,\n defaultValue = null,\n onChange,\n name,\n label,\n helperText,\n error,\n required = false,\n disabled = false,\n size = 'md',\n apiKey: apiKeyProp,\n mapId: mapIdProp,\n center,\n defaultCenter,\n onCenterChange,\n zoom,\n defaultZoom = DEFAULT_ZOOM,\n onZoomChange,\n mapHeight = 300,\n locateButton = true,\n precision = 6,\n search = false,\n searchRegions,\n geocode = false,\n onAddressChange,\n addressName,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const t = useT()\n const { language } = useLanguage()\n const colorMode = useColorMode()\n const mapsConfig = useMapsConfig()\n const apiKey = apiKeyProp ?? mapsConfig.apiKey\n const mapId = mapIdProp ?? mapsConfig.mapId\n const reactId = useId()\n const labelId = `${reactId}-label`\n\n // ── value: controlled / form-bound / uncontrolled ──\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const [internal, setInternal] = useState<LocationValue | null>(defaultValue)\n const current: LocationValue | null =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as LocationValue | null | undefined) ?? null)\n : internal\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n // ── the pin's address (search result or reverse geocode) ──\n const userChangedRef = useRef(false)\n const [address, setAddress] = useState<string | null>(null)\n const [addressLoading, setAddressLoading] = useState(false)\n // a place picked from the search brings its address — remembered for that exact point, so it isn't re-looked up\n const knownAddressRef = useRef<(LocationValue & { address: string }) | null>(null)\n const geocodeRequestRef = useRef(0)\n\n const commit = useCallback(\n (next: LocationValue | null) => {\n const rounded = next && { lat: round(next.lat, precision), lng: round(next.lng, precision) }\n userChangedRef.current = true // from here on, address changes are reported (not on the initial load)\n if (value === undefined && !isFormBound) setInternal(rounded)\n if (isFormBound) form!.setValue(name!, rounded as never)\n onChange?.(rounded)\n },\n [value, isFormBound, form, name, onChange, precision],\n )\n const commitRef = useRef(commit)\n commitRef.current = commit\n\n // ── the two coordinate drafts (strings while typing; synced from the value when it changes) ──\n const [latDraft, setLatDraft] = useState(() => formatCoord(current?.lat, precision))\n const [lngDraft, setLngDraft] = useState(() => formatCoord(current?.lng, precision))\n // rewrite the drafts only when they no longer describe the value (a map click, \"remove pin\", an outside\n // change) — never for a change that came from the fields themselves: clearing one of a pair makes the value\n // `null`, and the half-typed other field must stay as the user left it\n const draftsRef = useRef({ lat: latDraft, lng: lngDraft })\n draftsRef.current = { lat: latDraft, lng: lngDraft }\n useEffect(() => {\n const la = parseCoord(draftsRef.current.lat, 90)\n const ln = parseCoord(draftsRef.current.lng, 180)\n const pair = la != null && ln != null ? { lat: la, lng: ln } : null\n const inSync = current ? pair != null && sameCenter(pair, current) : pair == null\n if (inSync) return\n setLatDraft(formatCoord(current?.lat, precision))\n setLngDraft(formatCoord(current?.lng, precision))\n }, [current?.lat, current?.lng, precision]) // eslint-disable-line react-hooks/exhaustive-deps\n const latParsed = parseCoord(latDraft, 90)\n const lngParsed = parseCoord(lngDraft, 180)\n // which field the user has typed in / left — a half-filled pair is only flagged on a field they've touched\n const [touched, setTouched] = useState({ lat: false, lng: false })\n const latMissing = latParsed === null && lngParsed != null && touched.lat\n const lngMissing = lngParsed === null && latParsed != null && touched.lng\n\n // ── the map ──\n // a `<Form>`'s scroll-to-error looks for `[name=\"…\"]` and focuses it — mirror the field name onto the map\n // frame (focusable via tabIndex -1), so an invalid location scrolls the map into view and rings it. Not on\n // the inputs: React re-sets an <input>'s `name` on every update, and passing `name` to a TextField would\n // bind it to the form as a plain string field.\n const frameRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const el = frameRef.current\n if (!el) return\n if (name) el.setAttribute('name', name)\n else el.removeAttribute('name')\n }, [name])\n\n const mapEl = useRef<HTMLDivElement | null>(null)\n const mapRef = useRef<MapsMap | null>(null)\n const pinRef = useRef<MapsPin | null>(null)\n const apiRef = useRef<GoogleMapsApi | null>(null)\n const [status, setStatus] = useState<MapStatus>(apiKey ? 'loading' : 'missingKey')\n const [locating, setLocating] = useState(false)\n const [locateFailed, setLocateFailed] = useState(false)\n\n const initialCenter = center ?? defaultCenter ?? current ?? TBILISI\n const initialZoom = zoom ?? defaultZoom\n const viewRef = useRef({ center: initialCenter, zoom: initialZoom })\n const onCenterChangeRef = useRef(onCenterChange)\n onCenterChangeRef.current = onCenterChange\n const onZoomChangeRef = useRef(onZoomChange)\n onZoomChangeRef.current = onZoomChange\n const disabledRef = useRef(disabled)\n disabledRef.current = disabled\n const currentRef = useRef(current)\n currentRef.current = current\n\n // with a Map ID, light / dark is Google's `colorScheme` — fixed when the map is created, so a mode change\n // rebuilds the map (view + pin carry over via the refs). Without one the JSON styles below switch in place.\n const mapScheme = mapId ? colorMode : null\n\n // load the API + build the map (once per key / map id / scheme)\n useEffect(() => {\n if (!apiKey) {\n setStatus('missingKey')\n return\n }\n let cancelled = false\n const listeners: { remove(): void }[] = []\n // a fresh host per build — a new Map in a node that already holds one would stack them\n let host: HTMLDivElement | null = null\n // only the first build shows the skeleton; a rebuild (scheme change) keeps the controls in place\n if (!apiRef.current) setStatus('loading')\n // Google rejected the key (referrer restriction, API not enabled, billing…) — cover its grey \"Oops!\" with ours\n const stopAuth = onMapsAuthFailure(() => {\n if (!cancelled) setStatus('authError')\n })\n loadGoogleMaps(apiKey, language.split('-')[0])\n .then((api) => {\n if (cancelled || !mapEl.current) return\n apiRef.current = api\n host = document.createElement('div')\n host.className = styles.mapHost\n mapEl.current.appendChild(host)\n const map = api.createMap(host, {\n center: viewRef.current.center,\n zoom: viewRef.current.zoom,\n ...(mapId ? { mapId, colorScheme: api.colorScheme(mapScheme ?? 'light') } : {}),\n disableDefaultUI: true,\n zoomControl: false, // our own + / − (styled like the other map buttons)\n clickableIcons: false,\n gestureHandling: 'cooperative',\n draggableCursor: disabledRef.current ? undefined : 'crosshair',\n })\n mapRef.current = map\n const pin = api.createPin(map, {\n position: currentRef.current,\n advanced: Boolean(mapId),\n icon: accentPin(),\n })\n pin.setDraggable(!disabledRef.current)\n pinRef.current = pin\n listeners.push(\n map.addListener('click', (e) => {\n if (disabledRef.current || !e.latLng) return\n commitRef.current({ lat: e.latLng.lat(), lng: e.latLng.lng() })\n }),\n pin.onDragEnd((p) => commitRef.current(p)),\n map.addListener('zoom_changed', () => {\n const z = map.getZoom()\n if (z == null || z === viewRef.current.zoom) return\n viewRef.current = { ...viewRef.current, zoom: z }\n onZoomChangeRef.current?.(z)\n }),\n map.addListener('idle', () => {\n const c = map.getCenter()\n if (!c) return\n const next = { lat: c.lat(), lng: c.lng() }\n if (sameCenter(next, viewRef.current.center)) return\n viewRef.current = { ...viewRef.current, center: next }\n onCenterChangeRef.current?.(next)\n }),\n )\n setStatus((s) => (s === 'authError' ? s : 'ready'))\n })\n .catch(() => {\n if (!cancelled) setStatus('error')\n })\n return () => {\n cancelled = true\n stopAuth()\n listeners.forEach((l) => l.remove())\n pinRef.current?.remove()\n pinRef.current = null\n mapRef.current = null\n host?.remove()\n }\n // the map is rebuilt only for a new key / map id / (Map ID) color scheme; everything else syncs below\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiKey, mapId, mapScheme])\n\n // pin follows the value\n useEffect(() => {\n pinRef.current?.setPosition(current)\n }, [current, status])\n\n // read-only toggles\n useEffect(() => {\n pinRef.current?.setDraggable(!disabled)\n mapRef.current?.setOptions({ draggableCursor: disabled ? undefined : 'crosshair' })\n }, [disabled, status])\n\n // controlled view: apply `center` / `zoom` when they change from outside\n useEffect(() => {\n const map = mapRef.current\n if (!map || !center || sameCenter(center, viewRef.current.center)) return\n viewRef.current = { ...viewRef.current, center }\n map.setCenter(center)\n }, [center?.lat, center?.lng, status]) // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const map = mapRef.current\n if (!map || zoom == null || zoom === viewRef.current.zoom) return\n viewRef.current = { ...viewRef.current, zoom }\n map.setZoom(zoom)\n }, [zoom, status])\n\n // the pin follows the accent — repaint it when the theme on <html> changes (Settings: accent / light-dark)\n useEffect(() => {\n if (status !== 'ready' || typeof MutationObserver === 'undefined') return\n let color = tokenHex('accent', '#056472')\n const observer = new MutationObserver(() => {\n const next = tokenHex('accent', '#056472')\n if (next === color) return\n color = next\n pinRef.current?.setIcon(pinIcon(next))\n })\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['style', 'data-tz-theme'],\n })\n return () => observer.disconnect()\n }, [status])\n\n // dark map in dark mode (classic styling only — a `mapId` brings its own cloud style)\n useEffect(() => {\n if (!mapRef.current || mapId) return\n mapRef.current.setOptions({ styles: colorMode === 'dark' ? darkMapStyles() : null })\n }, [colorMode, mapId, status])\n\n const zoomBy = (delta: number) => {\n const map = mapRef.current\n if (!map) return\n map.setZoom(\n Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, (map.getZoom() ?? viewRef.current.zoom) + delta)),\n )\n }\n\n const reportAddress = (next: string | null) => {\n if (!userChangedRef.current) return // the initial load just displays it\n onAddressChange?.(next)\n if (form && addressName) form.setValue(addressName, (next ?? '') as never)\n }\n const reportAddressRef = useRef(reportAddress)\n reportAddressRef.current = reportAddress\n\n // resolve the address whenever the pin moves: the search's own address, else (with `geocode`) a debounced\n // reverse geocode — only the latest answer counts\n useEffect(() => {\n const id = ++geocodeRequestRef.current\n if (!current) {\n setAddress(null)\n setAddressLoading(false)\n reportAddressRef.current(null)\n return\n }\n const known = knownAddressRef.current\n if (known && sameCenter(known, current)) {\n setAddress(known.address)\n setAddressLoading(false)\n reportAddressRef.current(known.address)\n return\n }\n if (!geocode || status !== 'ready' || !apiRef.current) {\n setAddress(null)\n setAddressLoading(false)\n return\n }\n setAddress(null) // the old point's address would be wrong while the new one loads\n setAddressLoading(true)\n const api = apiRef.current\n const point = current\n const timer = window.setTimeout(() => {\n api.reverseGeocode(point, language.split('-')[0]).then((resolved) => {\n if (id !== geocodeRequestRef.current) return\n setAddress(resolved)\n setAddressLoading(false)\n reportAddressRef.current(resolved)\n })\n }, 400)\n return () => window.clearTimeout(timer)\n }, [current?.lat, current?.lng, geocode, status, language]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePlacePick = (place: { location: LatLngLiteral; address?: string }) => {\n const point = {\n lat: round(place.location.lat, precision),\n lng: round(place.location.lng, precision),\n }\n knownAddressRef.current = place.address ? { ...point, address: place.address } : null\n commit(point)\n panToPin(point, LOCATE_ZOOM)\n }\n\n const panToPin = (point: LatLngLiteral, zoomTo?: number) => {\n const map = mapRef.current\n if (!map) return\n map.panTo(point)\n if (zoomTo != null && (map.getZoom() ?? 0) < zoomTo) map.setZoom(zoomTo)\n }\n\n // ── fields ──\n const commitDrafts = (lat: string, lng: string) => {\n const la = parseCoord(lat, 90)\n const ln = parseCoord(lng, 180)\n // the value mirrors the fields exactly: a pin only while BOTH are filled and valid — clear / break either\n // one and the pin goes (and a required rule fires)\n if (la == null || ln == null) {\n if (current) commit(null)\n return\n }\n const next = { lat: la, lng: ln }\n if (current && sameCenter(next, current)) return\n commit(next)\n panToPin(next)\n }\n const handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n const pair = parsePair(event.clipboardData.getData('text'))\n if (!pair) return\n event.preventDefault()\n setLatDraft(String(round(pair.lat, precision)))\n setLngDraft(String(round(pair.lng, precision)))\n commit(pair)\n panToPin(pair)\n }\n\n const locate = () => {\n if (!navigator.geolocation) return\n setLocating(true)\n setLocateFailed(false)\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n setLocating(false)\n const point = { lat: pos.coords.latitude, lng: pos.coords.longitude }\n commit(point)\n panToPin(point, LOCATE_ZOOM)\n },\n () => {\n setLocating(false)\n setLocateFailed(true)\n },\n { enableHighAccuracy: true, timeout: 10000 },\n )\n }\n\n const pinText = current\n ? `${round(current.lat, precision)}, ${round(current.lng, precision)}`\n : ''\n const statusMessage =\n status === 'missingKey'\n ? t('location.missingKey')\n : status === 'authError'\n ? t('location.authError')\n : status === 'error'\n ? t('location.loadError')\n : null\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={label != null ? labelId : undefined}\n className={clsx(styles.root, disabled && styles.disabled, className)}\n style={{ '--tz-location-map-height': `${mapHeight}px`, ...style } as CSSProperties}\n {...props}\n >\n {label != null && (\n <div className={styles.label} id={labelId}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n {search && status === 'ready' && apiRef.current && !disabled && (\n <PlaceSearch\n api={apiRef.current}\n language={language.split('-')[0]}\n bias={() => {\n const c = mapRef.current?.getCenter()\n return c ? { lat: c.lat(), lng: c.lng() } : viewRef.current.center\n }}\n regions={searchRegions}\n size={size}\n onPick={handlePlacePick}\n />\n )}\n\n <div\n ref={frameRef}\n tabIndex={-1}\n className={clsx(styles.frame, resolvedError && styles.error)}\n >\n <div\n ref={mapEl}\n className={styles.map}\n role=\"application\"\n aria-label={t('location.mapLabel')}\n data-testid=\"location-map\"\n />\n\n {status === 'loading' && (\n <div className={styles.cover} aria-hidden=\"true\">\n <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" radius=\"xxs\" />\n </div>\n )}\n\n {statusMessage && (\n <div className={clsx(styles.cover, styles.message)} role=\"status\">\n <span className={styles.messageIcon}>\n <Icon name=\"Map\" />\n </span>\n <Typography variant=\"bodySmall\" color=\"muted\" align=\"center\">\n {statusMessage}\n </Typography>\n </div>\n )}\n\n {status === 'ready' && (\n <>\n <div className={styles.controls}>\n {locateButton &&\n !disabled &&\n typeof navigator !== 'undefined' &&\n navigator.geolocation && (\n <Tooltip\n content={locateFailed ? t('location.locateFailed') : t('location.locate')}\n placement=\"left\"\n >\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.locate')}\n loading={locating}\n onClick={locate}\n >\n <Icon name={locateFailed ? 'GpsSlash' : 'Gps'} />\n </IconButton>\n </Tooltip>\n )}\n {current && (\n <Tooltip content={t('location.centerOnPin')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.centerOnPin')}\n onClick={() => panToPin(current)}\n >\n <Icon name=\"Location\" />\n </IconButton>\n </Tooltip>\n )}\n {current && !disabled && (\n <Tooltip content={t('location.removePin')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.removePin')}\n onClick={() => commit(null)}\n >\n <Icon name=\"LocationCross\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n\n <div className={clsx(styles.controls, styles.zoomControls)}>\n <Tooltip content={t('location.zoomIn')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.zoomIn')}\n onClick={() => zoomBy(1)}\n >\n <Icon name=\"Add\" />\n </IconButton>\n </Tooltip>\n <Tooltip content={t('location.zoomOut')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.zoomOut')}\n onClick={() => zoomBy(-1)}\n >\n <Icon name=\"Minus\" />\n </IconButton>\n </Tooltip>\n </div>\n\n <div className={styles.badge} aria-live=\"polite\">\n {current ? (\n <>\n <Icon name=\"Location\" size=\"sm\" className={styles.badgeIcon} />\n <span className={styles.coords}>{pinText}</span>\n <CopyButton value={pinText} size=\"sm\" className={styles.copy} />\n </>\n ) : (\n !disabled && (\n <>\n <Icon name=\"LocationAdd\" size=\"sm\" className={styles.badgeIcon} />\n <span>{t('location.hint')}</span>\n </>\n )\n )}\n </div>\n </>\n )}\n </div>\n\n {(geocode || search) && current && (address || addressLoading) && (\n <div className={styles.address} aria-live=\"polite\">\n <Icon name=\"Location\" size=\"sm\" className={styles.addressIcon} />\n {addressLoading && !address ? (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {t('location.addressLoading')}\n </Typography>\n ) : (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.addressText}>\n {address}\n </Typography>\n )}\n </div>\n )}\n\n <div className={styles.fields}>\n <TextField\n label={t('location.latitude')}\n size={size}\n inputMode=\"decimal\"\n placeholder={String(TBILISI.lat)}\n value={latDraft}\n disabled={disabled}\n error={resolvedError || latParsed === undefined || latMissing}\n helperText={\n latParsed === undefined\n ? t('location.latitudeRange')\n : latMissing\n ? t('location.pairIncomplete')\n : undefined\n }\n onChange={(e) => {\n setLatDraft(e.target.value)\n setTouched((s) => (s.lat ? s : { ...s, lat: true }))\n commitDrafts(e.target.value, lngDraft)\n }}\n onPaste={handlePaste}\n onBlur={(e) => {\n setTouched((s) => (s.lat ? s : { ...s, lat: true }))\n bound?.onBlur(e as never)\n }}\n />\n <TextField\n label={t('location.longitude')}\n size={size}\n inputMode=\"decimal\"\n placeholder={String(TBILISI.lng)}\n value={lngDraft}\n disabled={disabled}\n error={resolvedError || lngParsed === undefined || lngMissing}\n helperText={\n lngParsed === undefined\n ? t('location.longitudeRange')\n : lngMissing\n ? t('location.pairIncomplete')\n : undefined\n }\n onChange={(e) => {\n setLngDraft(e.target.value)\n setTouched((s) => (s.lng ? s : { ...s, lng: true }))\n commitDrafts(latDraft, e.target.value)\n }}\n onPaste={handlePaste}\n onBlur={(e) => {\n setTouched((s) => (s.lng ? s : { ...s, lng: true }))\n bound?.onBlur(e as never)\n }}\n />\n </div>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n },\n)\n"],"names":["SCRIPT_ID","CALLBACK","pending","geocodeDeniedWarned","authFailed","authListeners","installAuthFailureHook","g","previous","listener","onMapsAuthFailure","googleNs","toLiteral","p","injectScript","apiKey","language","resolve","reject","params","script","buildApi","ns","_a","core","maps","marker","lib","drop","_b","svgUrl","svg","markerIcon","icon","pinElement","img","placesLib","geocodingLib","places","geocoding","mode","token","predictions","input","bias","regions","suggestions","s","i","id","primary","_c","prediction","place","position","results","error","element","options","map","advanced","pin","next","d","handler","loadGoogleMaps","promise","check","DEBOUNCE_MS","MIN_CHARS","PlaceSearch","api","size","disabled","onPick","t","useT","listId","useId","anchorRef","useRef","sessionRef","requestRef","query","setQuery","useState","setSuggestions","state","setState","open","setOpen","active","setActive","resolving","setResolving","session","useEffect","timer","list","pick","suggestion","handleKeyDown","event","step","showPanel","optionId","styles","jsx","TextField","Loader","Icon","e","FloatingPanel","jsxs","Typography","ListItem","TBILISI","DEFAULT_ZOOM","MIN_ZOOM","MAX_ZOOM","LOCATE_ZOOM","round","n","precision","sameCenter","a","b","formatCoord","parseCoord","draft","limit","parsePair","text","m","lat","lng","tokenHex","name","fallback","raw","r","v","PIN_VIEW","PIN_SIZE","pinIcon","color","scale","accentPin","darkMapStyles","css","rgb","surface","background","accent","LocationPicker","forwardRef","value","defaultValue","onChange","label","helperText","required","apiKeyProp","mapIdProp","center","defaultCenter","onCenterChange","zoom","defaultZoom","onZoomChange","mapHeight","locateButton","search","searchRegions","geocode","onAddressChange","addressName","className","style","props","ref","useLanguage","colorMode","useColorMode","mapsConfig","useMapsConfig","mapId","labelId","form","useFormContext","isFormBound","bound","internal","setInternal","current","resolvedError","resolvedHelperText","userChangedRef","address","setAddress","addressLoading","setAddressLoading","knownAddressRef","geocodeRequestRef","commit","useCallback","rounded","commitRef","latDraft","setLatDraft","lngDraft","setLngDraft","draftsRef","la","ln","pair","latParsed","lngParsed","touched","setTouched","latMissing","lngMissing","frameRef","el","mapEl","mapRef","pinRef","apiRef","status","setStatus","locating","setLocating","locateFailed","setLocateFailed","viewRef","onCenterChangeRef","onZoomChangeRef","disabledRef","currentRef","mapScheme","cancelled","listeners","host","stopAuth","z","c","l","observer","zoomBy","delta","reportAddress","reportAddressRef","known","point","resolved","handlePlacePick","panToPin","zoomTo","commitDrafts","handlePaste","locate","pos","pinText","statusMessage","clsx","Skeleton","Fragment","Tooltip","IconButton","CopyButton"],"mappings":"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"}
1
+ {"version":3,"file":"LocationPicker-UfyDBvhp.js","sources":["../src/components/LocationPicker/googleMaps.ts","../src/components/LocationPicker/PlaceSearch.tsx","../src/components/LocationPicker/LocationPicker.tsx"],"sourcesContent":["// Google Maps JavaScript API — loaded on demand with Google's own `<script>` (no npm dependency, so an app that\n// never renders a map neither installs nor downloads anything), once per page, then reused. The types below are\n// the small slice `LocationPicker` touches, so the library's public typings don't depend on `@types/google.maps`.\n\nexport interface LatLngLiteral {\n lat: number\n lng: number\n}\n\nexport interface MapsLatLng {\n lat(): number\n lng(): number\n}\n\nexport interface MapsEventListener {\n remove(): void\n}\n\nexport interface MapsMouseEvent {\n latLng: MapsLatLng | null\n}\n\nexport interface MapsMap {\n setCenter(center: LatLngLiteral): void\n panTo(center: LatLngLiteral): void\n setZoom(zoom: number): void\n getZoom(): number | undefined\n getCenter(): MapsLatLng | undefined\n setOptions(options: Record<string, unknown>): void\n addListener(event: string, handler: (event: MapsMouseEvent) => void): MapsEventListener\n}\n\n/** A custom pin image: an SVG string, its rendered size and the anchor (the tip) in that size's px. */\nexport interface PinIcon {\n svg: string\n width: number\n height: number\n anchorX: number\n anchorY: number\n}\n\n/** The pin — a classic `Marker` or an `AdvancedMarkerElement`, adapted to one shape. */\nexport interface MapsPin {\n setPosition(position: LatLngLiteral | null): void\n /** Swap the pin image (e.g. a new accent color). */\n setIcon(icon: PinIcon): void\n setDraggable(draggable: boolean): void\n onDragEnd(handler: (position: LatLngLiteral) => void): MapsEventListener\n remove(): void\n}\n\n/** One autocomplete suggestion — a place's main text (name / street) and its secondary text (city, country). */\nexport interface PlaceSuggestion {\n id: string\n primary: string\n secondary?: string\n}\n\n/** A picked place, resolved to a point (+ its formatted address when Google has one). */\nexport interface PlaceResult {\n location: LatLngLiteral\n address?: string\n}\n\n/**\n * An address / place search session (Places API (New)). Suggestions share one session token until a place is\n * resolved — that's how Google bills a search as one session, not per keystroke.\n */\nexport interface PlacesSession {\n suggest(\n input: string,\n options: { language?: string; bias?: LatLngLiteral; regions?: string[] },\n ): Promise<PlaceSuggestion[]>\n /** Resolve a suggestion to its point + address (ends the session). */\n resolve(id: string): Promise<PlaceResult | null>\n}\n\nexport interface GoogleMapsApi {\n /** Google's `ColorScheme` value for a mode (the Map ID light / dark option; set when a map is created). */\n colorScheme(mode: 'light' | 'dark'): unknown\n /** Start an address / place search session (loads the `places` library on first use). */\n createPlacesSession(): PlacesSession\n /** The formatted address at a point (Geocoding API; loads `geocoding` on first use), or `null`. */\n reverseGeocode(position: LatLngLiteral, language?: string): Promise<string | null>\n /** Create a map in `element`. */\n createMap(element: HTMLElement, options: Record<string, unknown>): MapsMap\n /** Create the pin on `map` (an `AdvancedMarkerElement` when the map has a `mapId`). */\n createPin(\n map: MapsMap,\n options: { position: LatLngLiteral | null; advanced: boolean; icon?: PinIcon },\n ): MapsPin\n}\n\ninterface RawLibraries {\n Map: new (element: HTMLElement, options: Record<string, unknown>) => MapsMap\n Marker: new (options: Record<string, unknown>) => {\n setPosition(position: LatLngLiteral | null): void\n setMap(map: MapsMap | null): void\n setDraggable(draggable: boolean): void\n setIcon(icon: unknown): void\n getPosition(): MapsLatLng | null | undefined\n addListener(event: string, handler: () => void): MapsEventListener\n }\n AdvancedMarkerElement?: new (options: Record<string, unknown>) => {\n position: LatLngLiteral | MapsLatLng | null\n map: MapsMap | null\n gmpDraggable: boolean\n content: HTMLElement | null\n addListener(event: string, handler: () => void): MapsEventListener\n }\n ColorScheme?: { LIGHT: unknown; DARK: unknown }\n Size?: new (width: number, height: number) => unknown\n Point?: new (x: number, y: number) => unknown\n}\n\ninterface GoogleNamespace {\n maps: {\n importLibrary(name: string): Promise<Record<string, unknown>>\n Animation?: { DROP: unknown }\n }\n}\n\nconst SCRIPT_ID = 'tz-google-maps'\nconst CALLBACK = '__tzGoogleMapsReady'\n\nlet pending: { key: string; promise: Promise<GoogleMapsApi> } | null = null\nlet geocodeDeniedWarned = false\n\n// ── key rejected ─────────────────────────────────────────────────────────────────────────────────────\n// Google reports an authentication failure (key restricted to other referrers, Maps JavaScript API not enabled,\n// no billing…) only by calling a global `gm_authFailure()` and painting its own grey \"Oops!\" over the map. We\n// hook it so `LocationPicker` can cover that with its own, localized message. Any app-defined handler still runs.\nlet authFailed = false\nconst authListeners = new Set<() => void>()\nfunction installAuthFailureHook() {\n const g = globalThis as { gm_authFailure?: () => void; __tzAuthHooked?: boolean }\n if (g.__tzAuthHooked) return\n g.__tzAuthHooked = true\n const previous = g.gm_authFailure\n g.gm_authFailure = () => {\n authFailed = true\n authListeners.forEach((listener) => listener())\n previous?.()\n }\n}\n\n/** Call `listener` when Google rejects the API key (immediately if it already has). Returns an unsubscribe. */\nexport function onMapsAuthFailure(listener: () => void): () => void {\n if (authFailed) listener()\n authListeners.add(listener)\n return () => {\n authListeners.delete(listener)\n }\n}\n\nconst googleNs = (): GoogleNamespace | undefined =>\n (globalThis as { google?: GoogleNamespace }).google\n\nconst toLiteral = (p: LatLngLiteral | MapsLatLng): LatLngLiteral =>\n typeof (p as MapsLatLng).lat === 'function'\n ? { lat: (p as MapsLatLng).lat(), lng: (p as MapsLatLng).lng() }\n : (p as LatLngLiteral)\n\n/** Inject Google's script tag (first map on the page) and resolve once its namespace is ready. */\nfunction injectScript(apiKey: string, language?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const params = new URLSearchParams({\n key: apiKey,\n v: 'weekly',\n loading: 'async',\n callback: CALLBACK,\n })\n if (language) params.set('language', language)\n ;(globalThis as Record<string, unknown>)[CALLBACK] = () => resolve()\n const script = document.createElement('script')\n script.id = SCRIPT_ID\n script.async = true\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`\n script.onerror = () => {\n script.remove()\n reject(new Error('The Google Maps script failed to load'))\n }\n document.head.appendChild(script)\n })\n}\n\nasync function buildApi(): Promise<GoogleMapsApi> {\n const ns = googleNs()\n if (!ns?.maps?.importLibrary) throw new Error('Google Maps is unavailable')\n const [core, maps, marker] = await Promise.all([\n ns.maps.importLibrary('core'),\n ns.maps.importLibrary('maps'),\n ns.maps.importLibrary('marker'),\n ])\n const lib = { ...core, ...maps, ...marker } as unknown as RawLibraries\n const drop = ns.maps.Animation?.DROP\n const svgUrl = (svg: string) => `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`\n\n // classic marker icon — Google wants its own Size / Point instances\n const markerIcon = (icon: PinIcon) => ({\n url: svgUrl(icon.svg),\n scaledSize: lib.Size\n ? new lib.Size(icon.width, icon.height)\n : { width: icon.width, height: icon.height },\n anchor: lib.Point\n ? new lib.Point(icon.anchorX, icon.anchorY)\n : { x: icon.anchorX, y: icon.anchorY },\n })\n // advanced marker content — the element's bottom-centre sits on the position, so shift the tip down onto it\n const pinElement = (icon: PinIcon) => {\n const img = document.createElement('img')\n img.src = svgUrl(icon.svg)\n img.width = icon.width\n img.height = icon.height\n img.alt = ''\n img.style.display = 'block'\n img.style.transform = `translate(${icon.width / 2 - icon.anchorX}px, ${icon.height - icon.anchorY}px)`\n return img\n }\n\n // the search / address libraries are only fetched the first time they're used\n let placesLib: Promise<Record<string, unknown>> | null = null\n let geocodingLib: Promise<Record<string, unknown>> | null = null\n const places = () => (placesLib ??= ns.maps.importLibrary('places'))\n const geocoding = () => (geocodingLib ??= ns.maps.importLibrary('geocoding'))\n\n interface RawPrediction {\n placeId?: string\n text?: { text: string }\n mainText?: { text: string } | null\n secondaryText?: { text: string } | null\n toPlace(): {\n fetchFields(options: { fields: string[] }): Promise<unknown>\n location?: MapsLatLng | null\n formattedAddress?: string | null\n }\n }\n\n return {\n colorScheme: (mode) =>\n lib.ColorScheme ? lib.ColorScheme[mode === 'dark' ? 'DARK' : 'LIGHT'] : mode.toUpperCase(),\n createPlacesSession: () => {\n let token: unknown = null\n let predictions = new Map<string, RawPrediction>()\n return {\n async suggest(input, { language, bias, regions }) {\n const lib = (await places()) as {\n AutocompleteSessionToken: new () => unknown\n AutocompleteSuggestion: {\n fetchAutocompleteSuggestions(\n request: Record<string, unknown>,\n ): Promise<{ suggestions: { placePrediction?: RawPrediction | null }[] }>\n }\n }\n token ??= new lib.AutocompleteSessionToken()\n const { suggestions } = await lib.AutocompleteSuggestion.fetchAutocompleteSuggestions({\n input,\n sessionToken: token,\n ...(language ? { language } : {}),\n ...(bias ? { locationBias: { center: bias, radius: 50000 } } : {}),\n ...(regions?.length ? { includedRegionCodes: regions } : {}),\n })\n predictions = new Map()\n return suggestions.flatMap((s, i) => {\n const p = s.placePrediction\n if (!p) return []\n const id = p.placeId ?? String(i)\n predictions.set(id, p)\n const primary = p.mainText?.text ?? p.text?.text ?? ''\n return [{ id, primary, secondary: p.secondaryText?.text ?? undefined }]\n })\n },\n async resolve(id) {\n const prediction = predictions.get(id)\n if (!prediction) return null\n const place = prediction.toPlace()\n await place.fetchFields({ fields: ['location', 'formattedAddress'] })\n token = null // the details call closes the session\n if (!place.location) return null\n return {\n location: toLiteral(place.location),\n address: place.formattedAddress ?? undefined,\n }\n },\n }\n },\n reverseGeocode: async (position, language) => {\n const lib = (await geocoding()) as {\n Geocoder: new () => {\n geocode(request: Record<string, unknown>): Promise<{\n results: { formatted_address?: string }[]\n }>\n }\n }\n try {\n const { results } = await new lib.Geocoder().geocode({\n location: position,\n ...(language ? { language } : {}),\n })\n return results[0]?.formatted_address ?? null\n } catch (error) {\n // ZERO_RESULTS (sea, desert…) is just \"no address\"; a denied request means the Geocoding API isn't\n // enabled / allowed for the key — say so once, so a silently missing address has a visible cause\n const code = (error as { code?: string } | null)?.code\n if (code === 'REQUEST_DENIED' && !geocodeDeniedWarned) {\n geocodeDeniedWarned = true\n console.warn(\n \"[LocationPicker] Address lookup was denied — enable the Geocoding API for this Google Maps key (and allow it in the key's API restrictions).\",\n )\n }\n return null\n }\n },\n createMap: (element, options) => new lib.Map(element, options),\n createPin: (map, { position, advanced, icon }) => {\n if (advanced && lib.AdvancedMarkerElement) {\n const pin = new lib.AdvancedMarkerElement({\n map,\n position,\n gmpDraggable: true,\n ...(icon ? { content: pinElement(icon) } : {}),\n })\n return {\n setPosition: (p) => {\n pin.position = p\n },\n setIcon: (next) => {\n pin.content = pinElement(next)\n },\n setDraggable: (d) => {\n pin.gmpDraggable = d\n },\n onDragEnd: (handler) =>\n pin.addListener('dragend', () => pin.position && handler(toLiteral(pin.position))),\n remove: () => {\n pin.map = null\n },\n }\n }\n const pin = new lib.Marker({\n map,\n position,\n draggable: true,\n animation: drop,\n ...(icon ? { icon: markerIcon(icon) } : {}),\n })\n return {\n setPosition: (p) => pin.setPosition(p),\n setIcon: (next) => pin.setIcon(markerIcon(next)),\n setDraggable: (d) => pin.setDraggable(d),\n onDragEnd: (handler) =>\n pin.addListener('dragend', () => {\n const p = pin.getPosition()\n if (p) handler(toLiteral(p))\n }),\n remove: () => pin.setMap(null),\n }\n },\n }\n}\n\n/**\n * Load the Maps JavaScript API (once per page) and return the small adapter `LocationPicker` uses. Reuses an\n * already-present `google.maps` (an app that loads Maps itself, or tests); a failed load can be retried.\n */\nexport function loadGoogleMaps(apiKey: string, language?: string): Promise<GoogleMapsApi> {\n installAuthFailureHook()\n if (pending && pending.key === apiKey) return pending.promise\n const promise = (async () => {\n if (!googleNs()?.maps?.importLibrary) {\n if (typeof document === 'undefined') throw new Error('Google Maps needs a browser')\n if (!document.getElementById(SCRIPT_ID)) await injectScript(apiKey, language)\n else {\n // another key's script is already on the page — Maps can't be loaded twice; wait for it\n await new Promise<void>((resolve) => {\n const check = () => (googleNs()?.maps?.importLibrary ? resolve() : setTimeout(check, 50))\n check()\n })\n }\n }\n return buildApi()\n })()\n pending = { key: apiKey, promise }\n promise.catch(() => {\n if (pending?.promise === promise) pending = null // let a later render retry\n })\n return promise\n}\n\n/** Test hook: forget the cached loader and any recorded key rejection. */\nexport function resetGoogleMapsLoader(): void {\n pending = null\n authFailed = false\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent } from 'react'\nimport { useT } from '../../theme'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { Icon } from '../Icon'\nimport { ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { TextField } from '../TextField'\nimport { Typography } from '../Typography'\nimport type {\n GoogleMapsApi,\n LatLngLiteral,\n PlaceResult,\n PlaceSuggestion,\n PlacesSession,\n} from './googleMaps'\nimport styles from './LocationPicker.module.css'\n\nconst DEBOUNCE_MS = 250\nconst MIN_CHARS = 2\n\ntype SearchState = 'idle' | 'loading' | 'ready' | 'error'\n\nexport interface PlaceSearchProps {\n api: GoogleMapsApi\n /** UI language for the suggestions. */\n language?: string\n /** Bias results towards this point (the map's centre). */\n bias?: () => LatLngLiteral | undefined\n /** Restrict results to these regions (ISO 3166-1 alpha-2, e.g. `['ge']`). */\n regions?: string[]\n size: 'sm' | 'md' | 'lg'\n disabled?: boolean\n /** Fires with the picked place's point + address. */\n onPick: (place: PlaceResult) => void\n}\n\n/**\n * The address / place search above the map — our own field + listbox (so it looks and behaves like the rest of\n * the library), fed by Google's Places API (New): debounced suggestions biased to the map centre, keyboard\n * navigation (↑ ↓ Enter Escape), and a pick that resolves the place to a point. Internal to `LocationPicker`.\n */\nexport function PlaceSearch({\n api,\n language,\n bias,\n regions,\n size,\n disabled,\n onPick,\n}: PlaceSearchProps) {\n const t = useT()\n const listId = useId()\n const anchorRef = useRef<HTMLDivElement | null>(null)\n const sessionRef = useRef<PlacesSession | null>(null)\n const requestRef = useRef(0)\n const [query, setQuery] = useState('')\n const [suggestions, setSuggestions] = useState<PlaceSuggestion[]>([])\n const [state, setState] = useState<SearchState>('idle')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(-1)\n const [resolving, setResolving] = useState(false)\n\n const session = () => (sessionRef.current ??= api.createPlacesSession())\n\n // debounced suggestions — only the latest request's answer is shown\n useEffect(() => {\n const input = query.trim()\n if (input.length < MIN_CHARS) {\n setSuggestions([])\n setState('idle')\n return\n }\n const id = ++requestRef.current\n setState('loading')\n const timer = window.setTimeout(() => {\n session()\n .suggest(input, { language, bias: bias?.(), regions })\n .then((list) => {\n if (id !== requestRef.current) return\n setSuggestions(list)\n setActive(list.length ? 0 : -1)\n setState('ready')\n })\n .catch(() => {\n if (id !== requestRef.current) return\n setSuggestions([])\n setState('error')\n })\n }, DEBOUNCE_MS)\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, language, regions?.join(',')])\n\n const pick = async (suggestion: PlaceSuggestion) => {\n setResolving(true)\n try {\n const place = await session().resolve(suggestion.id)\n sessionRef.current = null // the next search is a new session\n if (!place) return\n setQuery(\n place.address ?? [suggestion.primary, suggestion.secondary].filter(Boolean).join(', '),\n )\n setOpen(false)\n setSuggestions([])\n setState('idle')\n requestRef.current++ // drop any in-flight suggestion answer for the old text\n onPick(place)\n } catch {\n setState('error')\n } finally {\n setResolving(false)\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (!suggestions.length) return\n event.preventDefault()\n setOpen(true)\n const step = event.key === 'ArrowDown' ? 1 : -1\n setActive((i) => (i + step + suggestions.length) % suggestions.length)\n } else if (event.key === 'Enter') {\n // never submit the surrounding form from the search box\n event.preventDefault()\n const suggestion = suggestions[active]\n if (open && suggestion) void pick(suggestion)\n } else if (event.key === 'Escape' && open) {\n event.stopPropagation() // close the list, not an enclosing Modal\n setOpen(false)\n }\n }\n\n const showPanel = open && query.trim().length >= MIN_CHARS && state !== 'idle'\n const optionId = (i: number) => `${listId}-option-${i}`\n\n return (\n <div ref={anchorRef} className={styles.search}>\n <TextField\n size={size}\n disabled={disabled}\n value={query}\n placeholder={t('location.searchPlaceholder')}\n adornment={resolving ? <Loader size=\"sm\" /> : <Icon name=\"SearchNormal\" />}\n role=\"combobox\"\n aria-label={t('location.searchPlaceholder')}\n aria-autocomplete=\"list\"\n aria-expanded={showPanel}\n aria-controls={showPanel ? listId : undefined}\n aria-activedescendant={showPanel && active >= 0 ? optionId(active) : undefined}\n autoComplete=\"off\"\n onChange={(e) => {\n setQuery(e.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={handleKeyDown}\n />\n <FloatingPanel\n open={showPanel}\n triggerRef={anchorRef}\n matchTriggerWidth\n onClose={() => setOpen(false)}\n className={styles.searchPanel}\n >\n {state === 'loading' && !suggestions.length ? (\n <div className={styles.searchStatus}>\n <Loader size=\"sm\" />\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searching')}\n </Typography>\n </div>\n ) : state === 'error' ? (\n <div className={styles.searchStatus}>\n <Icon name=\"Danger\" color=\"error\" />\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searchUnavailable')}\n </Typography>\n </div>\n ) : suggestions.length === 0 ? (\n <div className={styles.searchStatus}>\n <Typography variant=\"bodySmall\" color=\"muted\">\n {t('location.searchEmpty')}\n </Typography>\n </div>\n ) : (\n <div role=\"listbox\" id={listId} aria-label={t('location.searchPlaceholder')}>\n {suggestions.map((s, i) => (\n <ListItem\n key={s.id}\n id={optionId(i)}\n role=\"option\"\n aria-selected={i === active}\n selected={i === active}\n clickable\n icon={<Icon name=\"Location\" />}\n description={s.secondary}\n // keep focus in the input while choosing\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => void pick(s)}\n >\n {s.primary}\n </ListItem>\n ))}\n </div>\n )}\n </FloatingPanel>\n </div>\n )\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ClipboardEvent,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useColorMode, useLanguage, useMapsConfig, useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { CopyButton } from '../CopyButton'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Skeleton } from '../Skeleton'\nimport { TextField } from '../TextField'\nimport { Tooltip } from '../Tooltip'\nimport { Typography } from '../Typography'\nimport {\n loadGoogleMaps,\n onMapsAuthFailure,\n type GoogleMapsApi,\n type LatLngLiteral,\n type MapsMap,\n type MapsPin,\n type PinIcon,\n} from './googleMaps'\nimport { PlaceSearch } from './PlaceSearch'\nimport styles from './LocationPicker.module.css'\n\nexport type LocationPickerSize = 'sm' | 'md' | 'lg'\n\n/** A point on the map — the field's value (`null` while no pin is placed). */\nexport interface LocationValue {\n /** Latitude (განედი), `-90`…`90`. */\n lat: number\n /** Longitude (გრძედი), `-180`…`180`. */\n lng: number\n}\n\n/** The map view — where it's centred and how far it's zoomed. */\nexport interface LocationView {\n center: LocationValue\n zoom: number\n}\n\n/** Tbilisi — the default view when there's no pin. */\nexport const TBILISI: LocationValue = { lat: 41.7151, lng: 44.8271 }\nconst DEFAULT_ZOOM = 12\n/** Google's zoom range (world … building). */\nconst MIN_ZOOM = 0\nconst MAX_ZOOM = 22\n/** Zoom used when \"my location\" jumps to the user. */\nconst LOCATE_ZOOM = 16\n\nexport interface LocationPickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue' | 'color'\n> {\n /** Controlled value — `{ lat, lng }`, or `null` for no pin. */\n value?: LocationValue | null\n /** Initial value for uncontrolled use. */\n defaultValue?: LocationValue | null\n /** Fires with the new point (map click, pin drag, typed coordinates, \"my location\") or `null` when cleared. */\n onChange?: (value: LocationValue | null) => void\n /** Form field name — binds the value to a surrounding `<Form>` (value = `{ lat, lng } | null`). */\n name?: string\n /** Label above the map. */\n label?: ReactNode\n /** Helper / validation text under the fields. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Error state — red frame + helper. */\n error?: boolean\n /** Shows a required asterisk after the label. */\n required?: boolean\n /** Read-only: the map can be looked at but not pinned, the fields are disabled. */\n disabled?: boolean\n /** Size of the latitude / longitude fields. Defaults to `md`. */\n size?: LocationPickerSize\n /** Google Maps API key. Defaults to `config.maps.apiKey`. */\n apiKey?: string\n /** Google Map ID (cloud styling + advanced marker). Defaults to `config.maps.mapId`. */\n mapId?: string\n /** Controlled map centre. Defaults to the pin, else Tbilisi. */\n center?: LocationValue\n /** Initial map centre (uncontrolled). Defaults to the value's pin, else Tbilisi. */\n defaultCenter?: LocationValue\n /** Fires after the map is panned (once it settles) with the new centre. */\n onCenterChange?: (center: LocationValue) => void\n /** Controlled zoom level. */\n zoom?: number\n /** Initial zoom level (uncontrolled). Defaults to `12` (a city). */\n defaultZoom?: number\n /** Fires with the new zoom level. */\n onZoomChange?: (zoom: number) => void\n /** Height of the map in px. Defaults to `300`. */\n mapHeight?: number\n /** Show the \"my location\" button (browser geolocation). Defaults to `true`. */\n locateButton?: boolean\n /** Decimal places the coordinates are kept to. Defaults to `6` (~0.1 m). */\n precision?: number\n /**\n * Show an **address / place search** above the map (Google **Places API (New)** — enable it for the key).\n * Picking a result drops the pin there and moves the map to it. Defaults to `false`.\n */\n search?: boolean\n /** Restrict the search to these regions (ISO 3166-1 alpha-2 codes, e.g. `['ge']`). Default: worldwide. */\n searchRegions?: string[]\n /**\n * Look up the **address of the pin** (Google **Geocoding API** — enable it for the key) and show it under the\n * map; reported through `onAddressChange` / `addressName`. A place picked from the search brings its own\n * address (no extra lookup). Defaults to `false`.\n */\n geocode?: boolean\n /** Fires with the pin's address after a user change (`null` when there's no pin / no address). */\n onAddressChange?: (address: string | null) => void\n /** Inside a `<Form>`: the field the pin's address is written to (e.g. `\"address\"`), alongside the coordinates. */\n addressName?: string\n}\n\ntype MapStatus = 'missingKey' | 'loading' | 'ready' | 'error' | 'authError'\n\nconst round = (n: number, precision: number) => Number(n.toFixed(precision))\nconst sameCenter = (a: LocationValue, b: LocationValue) =>\n Math.abs(a.lat - b.lat) < 1e-7 && Math.abs(a.lng - b.lng) < 1e-7\nconst formatCoord = (n: number | undefined, precision: number) =>\n n == null ? '' : String(round(n, precision))\n\n/** Parse one coordinate draft → a number in range, `null` for empty, `undefined` for invalid. */\nfunction parseCoord(draft: string, limit: number): number | null | undefined {\n const s = draft.trim().replace(',', '.')\n if (s === '') return null\n if (!/^[-+]?\\d+(\\.\\d*)?$/.test(s)) return undefined // a trailing '.' while typing is fine\n const n = Number(s)\n return Math.abs(n) <= limit ? n : undefined\n}\n\n/** A pasted \"41.7151, 44.8271\" (or \"41.7151 44.8271\") → both coordinates. */\nfunction parsePair(text: string): LocationValue | null {\n const m = text.trim().match(/^\\(?\\s*([-+]?\\d+(?:\\.\\d+)?)\\s*[,;\\s]\\s*([-+]?\\d+(?:\\.\\d+)?)\\s*\\)?$/)\n if (!m) return null\n const lat = Number(m[1])\n const lng = Number(m[2])\n return Math.abs(lat) <= 90 && Math.abs(lng) <= 180 ? { lat, lng } : null\n}\n\n/** A theme color token (`--tz-color-<name>-rgb`) as `#rrggbb`, read live from `<html>`. */\nfunction tokenHex(name: string, fallback: string): string {\n const raw = getComputedStyle(document.documentElement)\n .getPropertyValue(`--tz-color-${name}-rgb`)\n .trim()\n if (!raw) return fallback\n const [r, g, b] = raw.split(',').map((v) => Number(v.trim()))\n if ([r, g, b].some((v) => Number.isNaN(v))) return fallback\n return `#${[r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * The pin: a teardrop in the theme's **accent** color with a white rim, a white centre dot and a soft drop\n * shadow (so it reads on light and dark tiles alike). Drawn on a 40×52 grid — the tip at (20, 45), the rest\n * of the box is the shadow's room — and rendered at 34×44.\n */\nconst PIN_VIEW = { width: 40, height: 52, tipX: 20, tipY: 45 }\nconst PIN_SIZE = { width: 34, height: 44 }\nfunction pinIcon(color: string): PinIcon {\n const scale = PIN_SIZE.width / PIN_VIEW.width\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${PIN_VIEW.width}\" height=\"${PIN_VIEW.height}\" viewBox=\"0 0 ${PIN_VIEW.width} ${PIN_VIEW.height}\">` +\n `<defs><filter id=\"s\" x=\"-40%\" y=\"-20%\" width=\"180%\" height=\"160%\">` +\n `<feDropShadow dx=\"0\" dy=\"2\" stdDeviation=\"1.8\" flood-color=\"#000\" flood-opacity=\".3\"/></filter></defs>` +\n `<path filter=\"url(#s)\" fill=\"${color}\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linejoin=\"round\" ` +\n `d=\"M20 3C11.2 3 4 10 4 18.7c0 10.9 13.3 24 14.7 25.3a1.9 1.9 0 0 0 2.6 0C22.7 42.7 36 29.6 36 18.7 36 10 28.8 3 20 3Z\"/>` +\n `<circle cx=\"20\" cy=\"18.5\" r=\"6.2\" fill=\"#fff\"/>` +\n `</svg>`\n return {\n svg,\n width: PIN_SIZE.width,\n height: PIN_SIZE.height,\n anchorX: PIN_VIEW.tipX * scale,\n anchorY: PIN_VIEW.tipY * scale,\n }\n}\n/** The accent the pin is painted with right now (the brand teal before a theme has been applied). */\nconst accentPin = () => pinIcon(tokenHex('accent', '#056472'))\n\n/** A dark map built from the live theme tokens, so it matches the panel (classic styling, no `mapId`). */\nfunction darkMapStyles(): Record<string, unknown>[] {\n const css = getComputedStyle(document.documentElement)\n const rgb = (name: string, fallback: string) => {\n const raw = css.getPropertyValue(`--tz-color-${name}-rgb`).trim()\n if (!raw) return fallback\n const [r, g, b] = raw.split(',').map((v) => Number(v.trim()))\n return `#${[r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('')}`\n }\n const surface = rgb('surface', '#191919')\n const background = rgb('background', '#0f0f0f')\n const text = rgb('primary', '#e6e8eb')\n const accent = rgb('accent', '#16a6b4')\n return [\n { elementType: 'geometry', stylers: [{ color: surface }] },\n { elementType: 'labels.text.fill', stylers: [{ color: text }, { lightness: -35 }] },\n { elementType: 'labels.text.stroke', stylers: [{ color: background }] },\n { featureType: 'road', elementType: 'geometry', stylers: [{ color: background }] },\n { featureType: 'road', elementType: 'geometry.stroke', stylers: [{ color: surface }] },\n {\n featureType: 'water',\n elementType: 'geometry',\n stylers: [{ color: accent }, { lightness: -55 }],\n },\n {\n featureType: 'poi',\n elementType: 'geometry',\n stylers: [{ color: surface }, { lightness: 4 }],\n },\n { featureType: 'transit', stylers: [{ visibility: 'off' }] },\n ]\n}\n\n/**\n * A location picker: a **Google Map** you click to drop a pin (drag it to adjust), with **latitude / longitude**\n * fields below that stay in sync both ways — pasting `\"41.7151, 44.8271\"` into either fills both. The value is\n * `{ lat, lng } | null`; binds to a `<Form>` by `name`. The map shows **Tbilisi** by default, doesn't hijack the\n * page scroll (Ctrl / ⌘ + scroll zooms), offers **my location**, **centre on pin** and **remove pin**, and a\n * copyable coordinate pill. Its **view is controllable** (`center` / `zoom` + `onCenterChange` / `onZoomChange`,\n * or `defaultCenter` / `defaultZoom`). The Maps JavaScript API is loaded on demand with the `apiKey` prop or\n * `config.maps.apiKey`; without a key (or if loading fails) the fields keep working and the map says why.\n */\nexport const LocationPicker = forwardRef<HTMLDivElement, LocationPickerProps>(\n function LocationPicker(\n {\n value,\n defaultValue = null,\n onChange,\n name,\n label,\n helperText,\n error,\n required = false,\n disabled = false,\n size = 'md',\n apiKey: apiKeyProp,\n mapId: mapIdProp,\n center,\n defaultCenter,\n onCenterChange,\n zoom,\n defaultZoom = DEFAULT_ZOOM,\n onZoomChange,\n mapHeight = 300,\n locateButton = true,\n precision = 6,\n search = false,\n searchRegions,\n geocode = false,\n onAddressChange,\n addressName,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const t = useT()\n const { language } = useLanguage()\n const colorMode = useColorMode()\n const mapsConfig = useMapsConfig()\n const apiKey = apiKeyProp ?? mapsConfig.apiKey\n const mapId = mapIdProp ?? mapsConfig.mapId\n const reactId = useId()\n const labelId = `${reactId}-label`\n\n // ── value: controlled / form-bound / uncontrolled ──\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const [internal, setInternal] = useState<LocationValue | null>(defaultValue)\n const current: LocationValue | null =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as LocationValue | null | undefined) ?? null)\n : internal\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n // ── the pin's address (search result or reverse geocode) ──\n const userChangedRef = useRef(false)\n const [address, setAddress] = useState<string | null>(null)\n const [addressLoading, setAddressLoading] = useState(false)\n // a place picked from the search brings its address — remembered for that exact point, so it isn't re-looked up\n const knownAddressRef = useRef<(LocationValue & { address: string }) | null>(null)\n const geocodeRequestRef = useRef(0)\n\n const commit = useCallback(\n (next: LocationValue | null) => {\n const rounded = next && { lat: round(next.lat, precision), lng: round(next.lng, precision) }\n userChangedRef.current = true // from here on, address changes are reported (not on the initial load)\n if (value === undefined && !isFormBound) setInternal(rounded)\n if (isFormBound) form!.setValue(name!, rounded as never)\n onChange?.(rounded)\n },\n [value, isFormBound, form, name, onChange, precision],\n )\n const commitRef = useRef(commit)\n commitRef.current = commit\n\n // ── the two coordinate drafts (strings while typing; synced from the value when it changes) ──\n const [latDraft, setLatDraft] = useState(() => formatCoord(current?.lat, precision))\n const [lngDraft, setLngDraft] = useState(() => formatCoord(current?.lng, precision))\n // rewrite the drafts only when they no longer describe the value (a map click, \"remove pin\", an outside\n // change) — never for a change that came from the fields themselves: clearing one of a pair makes the value\n // `null`, and the half-typed other field must stay as the user left it\n const draftsRef = useRef({ lat: latDraft, lng: lngDraft })\n draftsRef.current = { lat: latDraft, lng: lngDraft }\n useEffect(() => {\n const la = parseCoord(draftsRef.current.lat, 90)\n const ln = parseCoord(draftsRef.current.lng, 180)\n const pair = la != null && ln != null ? { lat: la, lng: ln } : null\n const inSync = current ? pair != null && sameCenter(pair, current) : pair == null\n if (inSync) return\n setLatDraft(formatCoord(current?.lat, precision))\n setLngDraft(formatCoord(current?.lng, precision))\n }, [current?.lat, current?.lng, precision]) // eslint-disable-line react-hooks/exhaustive-deps\n const latParsed = parseCoord(latDraft, 90)\n const lngParsed = parseCoord(lngDraft, 180)\n // which field the user has typed in / left — a half-filled pair is only flagged on a field they've touched\n const [touched, setTouched] = useState({ lat: false, lng: false })\n const latMissing = latParsed === null && lngParsed != null && touched.lat\n const lngMissing = lngParsed === null && latParsed != null && touched.lng\n\n // ── the map ──\n // a `<Form>`'s scroll-to-error looks for `[name=\"…\"]` and focuses it — mirror the field name onto the map\n // frame (focusable via tabIndex -1), so an invalid location scrolls the map into view and rings it. Not on\n // the inputs: React re-sets an <input>'s `name` on every update, and passing `name` to a TextField would\n // bind it to the form as a plain string field.\n const frameRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const el = frameRef.current\n if (!el) return\n if (name) el.setAttribute('name', name)\n else el.removeAttribute('name')\n }, [name])\n\n const mapEl = useRef<HTMLDivElement | null>(null)\n const mapRef = useRef<MapsMap | null>(null)\n const pinRef = useRef<MapsPin | null>(null)\n const apiRef = useRef<GoogleMapsApi | null>(null)\n const [status, setStatus] = useState<MapStatus>(apiKey ? 'loading' : 'missingKey')\n const [locating, setLocating] = useState(false)\n const [locateFailed, setLocateFailed] = useState(false)\n\n const initialCenter = center ?? defaultCenter ?? current ?? TBILISI\n const initialZoom = zoom ?? defaultZoom\n const viewRef = useRef({ center: initialCenter, zoom: initialZoom })\n const onCenterChangeRef = useRef(onCenterChange)\n onCenterChangeRef.current = onCenterChange\n const onZoomChangeRef = useRef(onZoomChange)\n onZoomChangeRef.current = onZoomChange\n const disabledRef = useRef(disabled)\n disabledRef.current = disabled\n const currentRef = useRef(current)\n currentRef.current = current\n\n // with a Map ID, light / dark is Google's `colorScheme` — fixed when the map is created, so a mode change\n // rebuilds the map (view + pin carry over via the refs). Without one the JSON styles below switch in place.\n const mapScheme = mapId ? colorMode : null\n\n // load the API + build the map (once per key / map id / scheme)\n useEffect(() => {\n if (!apiKey) {\n setStatus('missingKey')\n return\n }\n let cancelled = false\n const listeners: { remove(): void }[] = []\n // a fresh host per build — a new Map in a node that already holds one would stack them\n let host: HTMLDivElement | null = null\n // only the first build shows the skeleton; a rebuild (scheme change) keeps the controls in place\n if (!apiRef.current) setStatus('loading')\n // Google rejected the key (referrer restriction, API not enabled, billing…) — cover its grey \"Oops!\" with ours\n const stopAuth = onMapsAuthFailure(() => {\n if (!cancelled) setStatus('authError')\n })\n loadGoogleMaps(apiKey, language.split('-')[0])\n .then((api) => {\n if (cancelled || !mapEl.current) return\n apiRef.current = api\n host = document.createElement('div')\n host.className = styles.mapHost\n mapEl.current.appendChild(host)\n const map = api.createMap(host, {\n center: viewRef.current.center,\n zoom: viewRef.current.zoom,\n ...(mapId ? { mapId, colorScheme: api.colorScheme(mapScheme ?? 'light') } : {}),\n disableDefaultUI: true,\n zoomControl: false, // our own + / − (styled like the other map buttons)\n clickableIcons: false,\n gestureHandling: 'cooperative',\n draggableCursor: disabledRef.current ? undefined : 'crosshair',\n })\n mapRef.current = map\n const pin = api.createPin(map, {\n position: currentRef.current,\n advanced: Boolean(mapId),\n icon: accentPin(),\n })\n pin.setDraggable(!disabledRef.current)\n pinRef.current = pin\n listeners.push(\n map.addListener('click', (e) => {\n if (disabledRef.current || !e.latLng) return\n commitRef.current({ lat: e.latLng.lat(), lng: e.latLng.lng() })\n }),\n pin.onDragEnd((p) => commitRef.current(p)),\n map.addListener('zoom_changed', () => {\n const z = map.getZoom()\n if (z == null || z === viewRef.current.zoom) return\n viewRef.current = { ...viewRef.current, zoom: z }\n onZoomChangeRef.current?.(z)\n }),\n map.addListener('idle', () => {\n const c = map.getCenter()\n if (!c) return\n const next = { lat: c.lat(), lng: c.lng() }\n if (sameCenter(next, viewRef.current.center)) return\n viewRef.current = { ...viewRef.current, center: next }\n onCenterChangeRef.current?.(next)\n }),\n )\n setStatus((s) => (s === 'authError' ? s : 'ready'))\n })\n .catch(() => {\n if (!cancelled) setStatus('error')\n })\n return () => {\n cancelled = true\n stopAuth()\n listeners.forEach((l) => l.remove())\n pinRef.current?.remove()\n pinRef.current = null\n mapRef.current = null\n host?.remove()\n }\n // the map is rebuilt only for a new key / map id / (Map ID) color scheme; everything else syncs below\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiKey, mapId, mapScheme])\n\n // pin follows the value\n useEffect(() => {\n pinRef.current?.setPosition(current)\n }, [current, status])\n\n // read-only toggles\n useEffect(() => {\n pinRef.current?.setDraggable(!disabled)\n mapRef.current?.setOptions({ draggableCursor: disabled ? undefined : 'crosshair' })\n }, [disabled, status])\n\n // controlled view: apply `center` / `zoom` when they change from outside\n useEffect(() => {\n const map = mapRef.current\n if (!map || !center || sameCenter(center, viewRef.current.center)) return\n viewRef.current = { ...viewRef.current, center }\n map.setCenter(center)\n }, [center?.lat, center?.lng, status]) // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const map = mapRef.current\n if (!map || zoom == null || zoom === viewRef.current.zoom) return\n viewRef.current = { ...viewRef.current, zoom }\n map.setZoom(zoom)\n }, [zoom, status])\n\n // the pin follows the accent — repaint it when the theme on <html> changes (Settings: accent / light-dark)\n useEffect(() => {\n if (status !== 'ready' || typeof MutationObserver === 'undefined') return\n let color = tokenHex('accent', '#056472')\n const observer = new MutationObserver(() => {\n const next = tokenHex('accent', '#056472')\n if (next === color) return\n color = next\n pinRef.current?.setIcon(pinIcon(next))\n })\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['style', 'data-tz-theme'],\n })\n return () => observer.disconnect()\n }, [status])\n\n // dark map in dark mode (classic styling only — a `mapId` brings its own cloud style)\n useEffect(() => {\n if (!mapRef.current || mapId) return\n mapRef.current.setOptions({ styles: colorMode === 'dark' ? darkMapStyles() : null })\n }, [colorMode, mapId, status])\n\n const zoomBy = (delta: number) => {\n const map = mapRef.current\n if (!map) return\n map.setZoom(\n Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, (map.getZoom() ?? viewRef.current.zoom) + delta)),\n )\n }\n\n const reportAddress = (next: string | null) => {\n if (!userChangedRef.current) return // the initial load just displays it\n onAddressChange?.(next)\n if (form && addressName) form.setValue(addressName, (next ?? '') as never)\n }\n const reportAddressRef = useRef(reportAddress)\n reportAddressRef.current = reportAddress\n\n // resolve the address whenever the pin moves: the search's own address, else (with `geocode`) a debounced\n // reverse geocode — only the latest answer counts\n useEffect(() => {\n const id = ++geocodeRequestRef.current\n if (!current) {\n setAddress(null)\n setAddressLoading(false)\n reportAddressRef.current(null)\n return\n }\n const known = knownAddressRef.current\n if (known && sameCenter(known, current)) {\n setAddress(known.address)\n setAddressLoading(false)\n reportAddressRef.current(known.address)\n return\n }\n if (!geocode || status !== 'ready' || !apiRef.current) {\n setAddress(null)\n setAddressLoading(false)\n return\n }\n setAddress(null) // the old point's address would be wrong while the new one loads\n setAddressLoading(true)\n const api = apiRef.current\n const point = current\n const timer = window.setTimeout(() => {\n api.reverseGeocode(point, language.split('-')[0]).then((resolved) => {\n if (id !== geocodeRequestRef.current) return\n setAddress(resolved)\n setAddressLoading(false)\n reportAddressRef.current(resolved)\n })\n }, 400)\n return () => window.clearTimeout(timer)\n }, [current?.lat, current?.lng, geocode, status, language]) // eslint-disable-line react-hooks/exhaustive-deps\n\n const handlePlacePick = (place: { location: LatLngLiteral; address?: string }) => {\n const point = {\n lat: round(place.location.lat, precision),\n lng: round(place.location.lng, precision),\n }\n knownAddressRef.current = place.address ? { ...point, address: place.address } : null\n commit(point)\n panToPin(point, LOCATE_ZOOM)\n }\n\n const panToPin = (point: LatLngLiteral, zoomTo?: number) => {\n const map = mapRef.current\n if (!map) return\n map.panTo(point)\n if (zoomTo != null && (map.getZoom() ?? 0) < zoomTo) map.setZoom(zoomTo)\n }\n\n // ── fields ──\n const commitDrafts = (lat: string, lng: string) => {\n const la = parseCoord(lat, 90)\n const ln = parseCoord(lng, 180)\n // the value mirrors the fields exactly: a pin only while BOTH are filled and valid — clear / break either\n // one and the pin goes (and a required rule fires)\n if (la == null || ln == null) {\n if (current) commit(null)\n return\n }\n const next = { lat: la, lng: ln }\n if (current && sameCenter(next, current)) return\n commit(next)\n panToPin(next)\n }\n const handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n const pair = parsePair(event.clipboardData.getData('text'))\n if (!pair) return\n event.preventDefault()\n setLatDraft(String(round(pair.lat, precision)))\n setLngDraft(String(round(pair.lng, precision)))\n commit(pair)\n panToPin(pair)\n }\n\n const locate = () => {\n if (!navigator.geolocation) return\n setLocating(true)\n setLocateFailed(false)\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n setLocating(false)\n const point = { lat: pos.coords.latitude, lng: pos.coords.longitude }\n commit(point)\n panToPin(point, LOCATE_ZOOM)\n },\n () => {\n setLocating(false)\n setLocateFailed(true)\n },\n { enableHighAccuracy: true, timeout: 10000 },\n )\n }\n\n const pinText = current\n ? `${round(current.lat, precision)}, ${round(current.lng, precision)}`\n : ''\n const statusMessage =\n status === 'missingKey'\n ? t('location.missingKey')\n : status === 'authError'\n ? t('location.authError')\n : status === 'error'\n ? t('location.loadError')\n : null\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={label != null ? labelId : undefined}\n className={clsx(styles.root, disabled && styles.disabled, className)}\n style={{ '--tz-location-map-height': `${mapHeight}px`, ...style } as CSSProperties}\n {...props}\n >\n {label != null && (\n <div className={styles.label} id={labelId}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n )}\n\n {search && status === 'ready' && apiRef.current && !disabled && (\n <PlaceSearch\n api={apiRef.current}\n language={language.split('-')[0]}\n bias={() => {\n const c = mapRef.current?.getCenter()\n return c ? { lat: c.lat(), lng: c.lng() } : viewRef.current.center\n }}\n regions={searchRegions}\n size={size}\n onPick={handlePlacePick}\n />\n )}\n\n <div\n ref={frameRef}\n tabIndex={-1}\n className={clsx(styles.frame, resolvedError && styles.error)}\n >\n <div\n ref={mapEl}\n className={styles.map}\n role=\"application\"\n aria-label={t('location.mapLabel')}\n data-testid=\"location-map\"\n />\n\n {status === 'loading' && (\n <div className={styles.cover} aria-hidden=\"true\">\n <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" radius=\"xxs\" />\n </div>\n )}\n\n {statusMessage && (\n <div className={clsx(styles.cover, styles.message)} role=\"status\">\n <span className={styles.messageIcon}>\n <Icon name=\"Map\" />\n </span>\n <Typography variant=\"bodySmall\" color=\"muted\" align=\"center\">\n {statusMessage}\n </Typography>\n </div>\n )}\n\n {status === 'ready' && (\n <>\n <div className={styles.controls}>\n {locateButton &&\n !disabled &&\n typeof navigator !== 'undefined' &&\n navigator.geolocation && (\n <Tooltip\n content={locateFailed ? t('location.locateFailed') : t('location.locate')}\n placement=\"left\"\n >\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.locate')}\n loading={locating}\n onClick={locate}\n >\n <Icon name={locateFailed ? 'GpsSlash' : 'Gps'} />\n </IconButton>\n </Tooltip>\n )}\n {current && (\n <Tooltip content={t('location.centerOnPin')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.centerOnPin')}\n onClick={() => panToPin(current)}\n >\n <Icon name=\"Location\" />\n </IconButton>\n </Tooltip>\n )}\n {current && !disabled && (\n <Tooltip content={t('location.removePin')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.removePin')}\n onClick={() => commit(null)}\n >\n <Icon name=\"LocationCross\" />\n </IconButton>\n </Tooltip>\n )}\n </div>\n\n <div className={clsx(styles.controls, styles.zoomControls)}>\n <Tooltip content={t('location.zoomIn')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.zoomIn')}\n onClick={() => zoomBy(1)}\n >\n <Icon name=\"Add\" />\n </IconButton>\n </Tooltip>\n <Tooltip content={t('location.zoomOut')} placement=\"left\">\n <IconButton\n size=\"sm\"\n color=\"surface\"\n className={styles.control}\n aria-label={t('location.zoomOut')}\n onClick={() => zoomBy(-1)}\n >\n <Icon name=\"Minus\" />\n </IconButton>\n </Tooltip>\n </div>\n\n <div className={styles.badge} aria-live=\"polite\">\n {current ? (\n <>\n <Icon name=\"Location\" size=\"sm\" className={styles.badgeIcon} />\n <span className={styles.coords}>{pinText}</span>\n <CopyButton value={pinText} size=\"sm\" className={styles.copy} />\n </>\n ) : (\n !disabled && (\n <>\n <Icon name=\"LocationAdd\" size=\"sm\" className={styles.badgeIcon} />\n <span>{t('location.hint')}</span>\n </>\n )\n )}\n </div>\n </>\n )}\n </div>\n\n {(geocode || search) && current && (address || addressLoading) && (\n <div className={styles.address} aria-live=\"polite\">\n <Icon name=\"Location\" size=\"sm\" className={styles.addressIcon} />\n {addressLoading && !address ? (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {t('location.addressLoading')}\n </Typography>\n ) : (\n <Typography as=\"span\" variant=\"bodySmall\" className={styles.addressText}>\n {address}\n </Typography>\n )}\n </div>\n )}\n\n <div className={styles.fields}>\n <TextField\n label={t('location.latitude')}\n size={size}\n inputMode=\"decimal\"\n placeholder={String(TBILISI.lat)}\n value={latDraft}\n disabled={disabled}\n error={resolvedError || latParsed === undefined || latMissing}\n helperText={\n latParsed === undefined\n ? t('location.latitudeRange')\n : latMissing\n ? t('location.pairIncomplete')\n : undefined\n }\n onChange={(e) => {\n setLatDraft(e.target.value)\n setTouched((s) => (s.lat ? s : { ...s, lat: true }))\n commitDrafts(e.target.value, lngDraft)\n }}\n onPaste={handlePaste}\n onBlur={(e) => {\n setTouched((s) => (s.lat ? s : { ...s, lat: true }))\n bound?.onBlur(e as never)\n }}\n />\n <TextField\n label={t('location.longitude')}\n size={size}\n inputMode=\"decimal\"\n placeholder={String(TBILISI.lng)}\n value={lngDraft}\n disabled={disabled}\n error={resolvedError || lngParsed === undefined || lngMissing}\n helperText={\n lngParsed === undefined\n ? t('location.longitudeRange')\n : lngMissing\n ? t('location.pairIncomplete')\n : undefined\n }\n onChange={(e) => {\n setLngDraft(e.target.value)\n setTouched((s) => (s.lng ? s : { ...s, lng: true }))\n commitDrafts(latDraft, e.target.value)\n }}\n onPaste={handlePaste}\n onBlur={(e) => {\n setTouched((s) => (s.lng ? s : { ...s, lng: true }))\n bound?.onBlur(e as never)\n }}\n />\n </div>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n },\n)\n"],"names":["SCRIPT_ID","CALLBACK","pending","geocodeDeniedWarned","authFailed","authListeners","installAuthFailureHook","g","previous","listener","onMapsAuthFailure","googleNs","toLiteral","p","injectScript","apiKey","language","resolve","reject","params","script","buildApi","ns","_a","core","maps","marker","lib","drop","_b","svgUrl","svg","markerIcon","icon","pinElement","img","placesLib","geocodingLib","places","geocoding","mode","token","predictions","input","bias","regions","suggestions","s","i","id","primary","_c","prediction","place","position","results","error","element","options","map","advanced","pin","next","d","handler","loadGoogleMaps","promise","check","DEBOUNCE_MS","MIN_CHARS","PlaceSearch","api","size","disabled","onPick","t","useT","listId","useId","anchorRef","useRef","sessionRef","requestRef","query","setQuery","useState","setSuggestions","state","setState","open","setOpen","active","setActive","resolving","setResolving","session","useEffect","timer","list","pick","suggestion","handleKeyDown","event","step","showPanel","optionId","styles","jsx","TextField","Loader","Icon","e","FloatingPanel","jsxs","Typography","ListItem","TBILISI","DEFAULT_ZOOM","MIN_ZOOM","MAX_ZOOM","LOCATE_ZOOM","round","n","precision","sameCenter","a","b","formatCoord","parseCoord","draft","limit","parsePair","text","m","lat","lng","tokenHex","name","fallback","raw","r","v","PIN_VIEW","PIN_SIZE","pinIcon","color","scale","accentPin","darkMapStyles","css","rgb","surface","background","accent","LocationPicker","forwardRef","value","defaultValue","onChange","label","helperText","required","apiKeyProp","mapIdProp","center","defaultCenter","onCenterChange","zoom","defaultZoom","onZoomChange","mapHeight","locateButton","search","searchRegions","geocode","onAddressChange","addressName","className","style","props","ref","useLanguage","colorMode","useColorMode","mapsConfig","useMapsConfig","mapId","labelId","form","useFormContext","isFormBound","bound","internal","setInternal","current","resolvedError","resolvedHelperText","userChangedRef","address","setAddress","addressLoading","setAddressLoading","knownAddressRef","geocodeRequestRef","commit","useCallback","rounded","commitRef","latDraft","setLatDraft","lngDraft","setLngDraft","draftsRef","la","ln","pair","latParsed","lngParsed","touched","setTouched","latMissing","lngMissing","frameRef","el","mapEl","mapRef","pinRef","apiRef","status","setStatus","locating","setLocating","locateFailed","setLocateFailed","viewRef","onCenterChangeRef","onZoomChangeRef","disabledRef","currentRef","mapScheme","cancelled","listeners","host","stopAuth","z","c","l","observer","zoomBy","delta","reportAddress","reportAddressRef","known","point","resolved","handlePlacePick","panToPin","zoomTo","commitDrafts","handlePaste","locate","pos","pinText","statusMessage","clsx","Skeleton","Fragment","Tooltip","IconButton","CopyButton"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const r=require("react/jsx-runtime"),s=require("react"),E=require("clsx"),k=require("./Icon-B6lz-V0A.cjs"),K=require("./IconButton-CQ25TtBc.cjs"),Y=require("react-dom"),Z=require("./useLockBodyScroll-CIXHZo-Q.cjs"),C=require("./ConfigProvider-B_Bb6pk1.cjs"),ee="_overlay_gwv2a_6",te={overlay:ee},w=s.forwardRef(function({open:n,onClose:t,closeOnBackdrop:u=!0,closeOnEscape:i=!0,lockScroll:N=!0,dim:o,className:f,style:d,children:T,onKeyDown:m,onMouseDown:h,onClick:_,...q},R){const g=s.useRef(null),[p,j]=s.useState(!1);Z.useLockBodyScroll(n&&N),s.useEffect(()=>{if(!n){j(!1);return}const l=requestAnimationFrame(()=>j(!0));return()=>cancelAnimationFrame(l)},[n]);const v=l=>{l.key==="Escape"&&(l.stopPropagation(),i&&(t==null||t())),m==null||m(l)},A=l=>{g.current=l.target,h==null||h(l)},b=l=>{u&&l.target===l.currentTarget&&g.current===l.currentTarget&&(t==null||t()),_==null||_(l)};return!n||typeof document>"u"?null:Y.createPortal(r.jsx("div",{ref:R,className:E.clsx(te.overlay,f),"data-open":p?"true":"false",style:o!=null?{"--tz-overlay-dim":o,...d}:d,onKeyDown:v,onMouseDown:A,onClick:b,...q,children:T}),document.body)}),ne="_overlay_1lotx_3",le="_modal_1lotx_25",re="_sm_1lotx_48",ae="_md_1lotx_51",se="_lg_1lotx_54",ce="_fullScreen_1lotx_57",oe="_header_1lotx_74",ie="_headerDivided_1lotx_83",de="_headerMain_1lotx_86",ue="_icon_1lotx_93",fe="_headerText_1lotx_96",me="_title_1lotx_103",xe="_subtitle_1lotx_115",_e="_close_1lotx_127",be="_body_1lotx_132",ye="_footer_1lotx_143",a={overlay:ne,modal:le,sm:re,md:ae,lg:se,fullScreen:ce,header:oe,headerDivided:ie,headerMain:de,icon:ue,headerText:fe,title:me,subtitle:xe,close:_e,body:be,footer:ye},he=new Set(k.ICON_NAMES),U='a[href]:not([tabindex="-1"]), button:not(:disabled):not([tabindex="-1"]), textarea:not(:disabled):not([tabindex="-1"]), input:not(:disabled):not([tabindex="-1"]), select:not(:disabled):not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])',ve='input:not([type="hidden"]):not(:disabled):not([tabindex="-1"]), textarea:not(:disabled):not([tabindex="-1"]), select:not(:disabled):not([tabindex="-1"]), [contenteditable]:not([contenteditable="false"]):not([tabindex="-1"])';function V(S){const n=Array.from(S);for(const t of n){const u=t instanceof HTMLInputElement&&t.type==="radio"&&!t.checked?n.find(i=>i instanceof HTMLInputElement&&i.type==="radio"&&i.name===t.name&&i.checked)??t:t;if(u.focus({preventScroll:!0}),document.activeElement===u)return!0}return!1}const Ie=s.forwardRef(function({open:n,onClose:t,size:u="md",scrollBehavior:i="outside",placement:N="center",title:o,description:f,icon:d,color:T="accent",footer:m,bodyClassName:h,showCloseButton:_=!0,closeOnBackdrop:q=!0,closeOnEscape:R=!0,ariaLabel:g,className:p,style:j,children:v,...A},b){const l=C.useT(),D=s.useRef(null),L=s.useRef(null),B=s.useRef(null),F=s.useId(),P=s.useId(),z=s.useRef(null),H=s.useRef(!1);n!==H.current&&(H.current=n,n&&typeof document<"u"&&(z.current=document.activeElement)),s.useEffect(()=>{var x,I;if(!n)return;const e=D.current,c=z.current;return e!=null&&e.contains(document.activeElement)||V(((x=L.current)==null?void 0:x.querySelectorAll(ve))??[])||V(((I=B.current)==null?void 0:I.querySelectorAll(U))??[])||e==null||e.focus({preventScroll:!0}),()=>{var y;c!=null&&c.isConnected&&((y=c.focus)==null||y.call(c))}},[n]);const G=e=>{D.current=e,typeof b=="function"?b(e):b&&(b.current=e)},J=e=>{if(e.key!=="Tab")return;const c=D.current;if(!c)return;const x=[...c.querySelectorAll(U)].filter($=>$.offsetParent!==null||$===document.activeElement);if(x.length===0){e.preventDefault(),c.focus();return}const I=x[0],y=x[x.length-1],O=document.activeElement;e.shiftKey&&(O===I||O===c)?(e.preventDefault(),y.focus()):!e.shiftKey&&O===y&&(e.preventDefault(),I.focus())};if(!n)return null;const Q=N!=="center",M=d==null?null:typeof d=="string"&&he.has(d)?r.jsx(k.Icon,{name:d}):d,W=o!=null||f!=null||M!=null||_,X=v!=null||m!=null;return r.jsx(w,{open:n,onClose:t,closeOnBackdrop:q,closeOnEscape:R,onKeyDown:J,className:a.overlay,"data-size":u,"data-placement":N,"data-scroll":Q?"inside":i,children:r.jsxs("div",{ref:G,className:E.clsx(a.modal,a[u],p),role:"dialog","aria-modal":"true","aria-labelledby":o!=null?F:void 0,"aria-label":o==null?g:void 0,"aria-describedby":f!=null?P:void 0,tabIndex:-1,style:j,...A,children:[W&&r.jsxs("div",{className:E.clsx(a.header,X&&a.headerDivided),children:[r.jsxs("div",{className:a.headerMain,children:[M!=null&&r.jsx(K.IconButton,{variant:"filled",size:"sm",color:T,nonClickable:!0,"aria-hidden":!0,className:a.icon,children:M}),(o!=null||f!=null)&&r.jsxs("div",{className:a.headerText,children:[o!=null&&r.jsx("div",{id:F,className:a.title,children:o}),f!=null&&r.jsx("div",{id:P,className:a.subtitle,children:f})]})]}),_&&r.jsx(K.IconButton,{variant:"filled",color:"primary",size:"sm",className:a.close,"aria-label":l("common.close"),onClick:t,children:r.jsx(k.Icon,{name:"Close"})})]}),v!=null&&r.jsx("div",{ref:L,className:E.clsx(a.body,h),children:v}),m!=null&&r.jsx("div",{ref:B,className:a.footer,children:m})]})})});exports.Modal=Ie;exports.Overlay=w;
2
- //# sourceMappingURL=Modal-DjSOhZqd.cjs.map
1
+ "use strict";const r=require("react/jsx-runtime"),s=require("react"),E=require("clsx"),k=require("./Icon-B6lz-V0A.cjs"),K=require("./IconButton-D3ZpI0XL.cjs"),Y=require("react-dom"),Z=require("./useLockBodyScroll-CIXHZo-Q.cjs"),C=require("./ConfigProvider-DELhJlqo.cjs"),ee="_overlay_gwv2a_6",te={overlay:ee},w=s.forwardRef(function({open:n,onClose:t,closeOnBackdrop:u=!0,closeOnEscape:i=!0,lockScroll:N=!0,dim:o,className:f,style:d,children:T,onKeyDown:m,onMouseDown:h,onClick:_,...q},R){const g=s.useRef(null),[p,j]=s.useState(!1);Z.useLockBodyScroll(n&&N),s.useEffect(()=>{if(!n){j(!1);return}const l=requestAnimationFrame(()=>j(!0));return()=>cancelAnimationFrame(l)},[n]);const v=l=>{l.key==="Escape"&&(l.stopPropagation(),i&&(t==null||t())),m==null||m(l)},A=l=>{g.current=l.target,h==null||h(l)},b=l=>{u&&l.target===l.currentTarget&&g.current===l.currentTarget&&(t==null||t()),_==null||_(l)};return!n||typeof document>"u"?null:Y.createPortal(r.jsx("div",{ref:R,className:E.clsx(te.overlay,f),"data-open":p?"true":"false",style:o!=null?{"--tz-overlay-dim":o,...d}:d,onKeyDown:v,onMouseDown:A,onClick:b,...q,children:T}),document.body)}),ne="_overlay_1lotx_3",le="_modal_1lotx_25",re="_sm_1lotx_48",ae="_md_1lotx_51",se="_lg_1lotx_54",ce="_fullScreen_1lotx_57",oe="_header_1lotx_74",ie="_headerDivided_1lotx_83",de="_headerMain_1lotx_86",ue="_icon_1lotx_93",fe="_headerText_1lotx_96",me="_title_1lotx_103",xe="_subtitle_1lotx_115",_e="_close_1lotx_127",be="_body_1lotx_132",ye="_footer_1lotx_143",a={overlay:ne,modal:le,sm:re,md:ae,lg:se,fullScreen:ce,header:oe,headerDivided:ie,headerMain:de,icon:ue,headerText:fe,title:me,subtitle:xe,close:_e,body:be,footer:ye},he=new Set(k.ICON_NAMES),U='a[href]:not([tabindex="-1"]), button:not(:disabled):not([tabindex="-1"]), textarea:not(:disabled):not([tabindex="-1"]), input:not(:disabled):not([tabindex="-1"]), select:not(:disabled):not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])',ve='input:not([type="hidden"]):not(:disabled):not([tabindex="-1"]), textarea:not(:disabled):not([tabindex="-1"]), select:not(:disabled):not([tabindex="-1"]), [contenteditable]:not([contenteditable="false"]):not([tabindex="-1"])';function V(S){const n=Array.from(S);for(const t of n){const u=t instanceof HTMLInputElement&&t.type==="radio"&&!t.checked?n.find(i=>i instanceof HTMLInputElement&&i.type==="radio"&&i.name===t.name&&i.checked)??t:t;if(u.focus({preventScroll:!0}),document.activeElement===u)return!0}return!1}const Ie=s.forwardRef(function({open:n,onClose:t,size:u="md",scrollBehavior:i="outside",placement:N="center",title:o,description:f,icon:d,color:T="accent",footer:m,bodyClassName:h,showCloseButton:_=!0,closeOnBackdrop:q=!0,closeOnEscape:R=!0,ariaLabel:g,className:p,style:j,children:v,...A},b){const l=C.useT(),D=s.useRef(null),L=s.useRef(null),B=s.useRef(null),F=s.useId(),P=s.useId(),z=s.useRef(null),H=s.useRef(!1);n!==H.current&&(H.current=n,n&&typeof document<"u"&&(z.current=document.activeElement)),s.useEffect(()=>{var x,I;if(!n)return;const e=D.current,c=z.current;return e!=null&&e.contains(document.activeElement)||V(((x=L.current)==null?void 0:x.querySelectorAll(ve))??[])||V(((I=B.current)==null?void 0:I.querySelectorAll(U))??[])||e==null||e.focus({preventScroll:!0}),()=>{var y;c!=null&&c.isConnected&&((y=c.focus)==null||y.call(c))}},[n]);const G=e=>{D.current=e,typeof b=="function"?b(e):b&&(b.current=e)},J=e=>{if(e.key!=="Tab")return;const c=D.current;if(!c)return;const x=[...c.querySelectorAll(U)].filter($=>$.offsetParent!==null||$===document.activeElement);if(x.length===0){e.preventDefault(),c.focus();return}const I=x[0],y=x[x.length-1],O=document.activeElement;e.shiftKey&&(O===I||O===c)?(e.preventDefault(),y.focus()):!e.shiftKey&&O===y&&(e.preventDefault(),I.focus())};if(!n)return null;const Q=N!=="center",M=d==null?null:typeof d=="string"&&he.has(d)?r.jsx(k.Icon,{name:d}):d,W=o!=null||f!=null||M!=null||_,X=v!=null||m!=null;return r.jsx(w,{open:n,onClose:t,closeOnBackdrop:q,closeOnEscape:R,onKeyDown:J,className:a.overlay,"data-size":u,"data-placement":N,"data-scroll":Q?"inside":i,children:r.jsxs("div",{ref:G,className:E.clsx(a.modal,a[u],p),role:"dialog","aria-modal":"true","aria-labelledby":o!=null?F:void 0,"aria-label":o==null?g:void 0,"aria-describedby":f!=null?P:void 0,tabIndex:-1,style:j,...A,children:[W&&r.jsxs("div",{className:E.clsx(a.header,X&&a.headerDivided),children:[r.jsxs("div",{className:a.headerMain,children:[M!=null&&r.jsx(K.IconButton,{variant:"filled",size:"sm",color:T,nonClickable:!0,"aria-hidden":!0,className:a.icon,children:M}),(o!=null||f!=null)&&r.jsxs("div",{className:a.headerText,children:[o!=null&&r.jsx("div",{id:F,className:a.title,children:o}),f!=null&&r.jsx("div",{id:P,className:a.subtitle,children:f})]})]}),_&&r.jsx(K.IconButton,{variant:"filled",color:"primary",size:"sm",className:a.close,"aria-label":l("common.close"),onClick:t,children:r.jsx(k.Icon,{name:"Close"})})]}),v!=null&&r.jsx("div",{ref:L,className:E.clsx(a.body,h),children:v}),m!=null&&r.jsx("div",{ref:B,className:a.footer,children:m})]})})});exports.Modal=Ie;exports.Overlay=w;
2
+ //# sourceMappingURL=Modal--5EbLfMz.cjs.map