xertica-ui 2.6.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +20 -12
  3. package/bin/generate-tokens.ts +25 -9
  4. package/components/assistant/xertica-assistant/use-assistant.ts +5 -6
  5. package/components/assistant/xertica-assistant/xertica-assistant.tsx +1 -1
  6. package/{templates/src/features/auth/ui → components/blocks/auth}/AuthPageShell.tsx +8 -3
  7. package/components/blocks/auth/PasswordStrengthMeter.tsx +41 -0
  8. package/components/blocks/auth/SocialLoginButtons.tsx +95 -0
  9. package/components/blocks/auth/index.ts +11 -0
  10. package/components/blocks/auth/usePasswordStrength.ts +13 -0
  11. package/components/blocks/index.ts +1 -0
  12. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +45 -139
  13. package/components/pages/login-page/LoginPage.tsx +52 -145
  14. package/components/pages/reset-password-page/ResetPasswordPage.tsx +79 -169
  15. package/components/pages/verify-email-page/VerifyEmailPage.tsx +48 -150
  16. package/components/ui/button/button.test.tsx +2 -2
  17. package/components/ui/button/button.tsx +6 -6
  18. package/components/ui/card/card.tsx +14 -2
  19. package/components/ui/input/input.tsx +1 -1
  20. package/components/ui/input-otp/input-otp.tsx +1 -1
  21. package/components/ui/search/search.tsx +1 -1
  22. package/components/ui/select/select.tsx +2 -2
  23. package/components/ui/switch/switch.tsx +1 -1
  24. package/components/ui/textarea/textarea.tsx +1 -1
  25. package/contexts/BrandColorsContext.tsx +50 -2
  26. package/contexts/theme-data.ts +100 -3
  27. package/dist/AssistantChart-BFBJXVcm.js +3383 -0
  28. package/dist/AssistantChart-BTnE94FR.cjs +3551 -0
  29. package/dist/AssistantChart-BvccsQMx.cjs +3551 -0
  30. package/dist/AssistantChart-CImCNLfD.cjs +3551 -0
  31. package/dist/AssistantChart-CkskcBVD.js +3383 -0
  32. package/dist/AssistantChart-CrPkO9ip.js +3383 -0
  33. package/dist/AssistantChart-DKz2O1R8.cjs +3551 -0
  34. package/dist/AssistantChart-DYL6UEvo.cjs +3551 -0
  35. package/dist/AssistantChart-DfdIfmQr.js +3383 -0
  36. package/dist/AssistantChart-keo-ogKi.js +3383 -0
  37. package/dist/AudioPlayer-AoU5MTiM.cjs +1282 -0
  38. package/dist/AudioPlayer-Bx1vrblm.js +1278 -0
  39. package/dist/AudioPlayer-D0-I6J3J.cjs +1282 -0
  40. package/dist/AudioPlayer-DIWX_Yg7.cjs +1282 -0
  41. package/dist/AudioPlayer-DrWJnS7c.js +1278 -0
  42. package/dist/AudioPlayer-_P-Z7pAK.js +1278 -0
  43. package/dist/BrandColorsContext-B25Bpr3b.cjs +819 -0
  44. package/dist/BrandColorsContext-BCieATdW.js +812 -0
  45. package/dist/BrandColorsContext-DP0DXAXS.js +824 -0
  46. package/dist/BrandColorsContext-DjpC9wR_.cjs +798 -0
  47. package/dist/BrandColorsContext-MpXFhte7.cjs +831 -0
  48. package/dist/BrandColorsContext-V3tOc-Zw.js +791 -0
  49. package/dist/CodeBlock-CK4rO6lM.js +221 -0
  50. package/dist/CodeBlock-CKXamfVd.cjs +223 -0
  51. package/dist/CodeBlock-CVmE7isS.cjs +223 -0
  52. package/dist/CodeBlock-D7i5-cMv.js +221 -0
  53. package/dist/CodeBlock-Dg56j2ut.cjs +223 -0
  54. package/dist/CodeBlock-Dt6nUQoo.js +221 -0
  55. package/dist/CustomTooltipContent-Bxynuq7T.js +33 -0
  56. package/dist/CustomTooltipContent-BzjOSA0P.cjs +54 -0
  57. package/dist/CustomTooltipContent-C-ZeCNsf.js +33 -0
  58. package/dist/CustomTooltipContent-CON_QrXm.cjs +54 -0
  59. package/dist/CustomTooltipContent-UR_n2QfW.js +33 -0
  60. package/dist/CustomTooltipContent-v1SXjoFn.cjs +54 -0
  61. package/dist/FeatureCard-4n_8a63v.cjs +497 -0
  62. package/dist/FeatureCard-BLiAWT3w.js +485 -0
  63. package/dist/FeatureCard-BXRW97Ef.cjs +497 -0
  64. package/dist/FeatureCard-BhpfmPPx.js +485 -0
  65. package/dist/FeatureCard-CDgLlWE2.js +485 -0
  66. package/dist/FeatureCard-CgQ8lq-I.cjs +497 -0
  67. package/dist/FeatureCard-Cp8cVC6T.cjs +497 -0
  68. package/dist/FeatureCard-D-5yS_OD.cjs +497 -0
  69. package/dist/FeatureCard-D0MwrTRP.js +485 -0
  70. package/dist/FeatureCard-uE5i0in_.js +485 -0
  71. package/dist/ImageWithFallback-BOh1FM3I.js +98 -0
  72. package/dist/ImageWithFallback-BQO7952C.js +98 -0
  73. package/dist/ImageWithFallback-BkMXHCvV.cjs +122 -0
  74. package/dist/ImageWithFallback-C72nwszA.cjs +122 -0
  75. package/dist/ImageWithFallback-CCUMDuEC.cjs +122 -0
  76. package/dist/ImageWithFallback-CfkAkctC.cjs +122 -0
  77. package/dist/ImageWithFallback-DQD5TTlY.js +98 -0
  78. package/dist/ImageWithFallback-bw-CxxDc.js +98 -0
  79. package/dist/LanguageContext-CX_zdxre.js +1912 -0
  80. package/dist/LanguageContext-CjhSSqJT.cjs +1917 -0
  81. package/dist/LanguageSelector-1XhM7R1i.cjs +48 -0
  82. package/dist/LanguageSelector-B3ZVNc55.js +46 -0
  83. package/dist/LanguageSelector-BR3Ss0k_.js +46 -0
  84. package/dist/LanguageSelector-CHOLPmHr.cjs +48 -0
  85. package/dist/LanguageSelector-Cj6zl0CM.js +46 -0
  86. package/dist/LanguageSelector-DK1zD4VH.cjs +48 -0
  87. package/dist/LanguageSelector-DseCAa0p.cjs +48 -0
  88. package/dist/LanguageSelector-Du09anfM.js +46 -0
  89. package/dist/LanguageSelector-PZHlFfEs.cjs +48 -0
  90. package/dist/LanguageSelector-SB-NJSmx.js +46 -0
  91. package/dist/PasswordStrengthMeter-B3S6i_k4.cjs +179 -0
  92. package/dist/PasswordStrengthMeter-B8ky1nJI.js +173 -0
  93. package/dist/PasswordStrengthMeter-C5VEopH-.cjs +179 -0
  94. package/dist/PasswordStrengthMeter-C8irs0G1.js +173 -0
  95. package/dist/PasswordStrengthMeter-CIm7_jNT.js +173 -0
  96. package/dist/PasswordStrengthMeter-DKSAbQzu.js +173 -0
  97. package/dist/PasswordStrengthMeter-DxLu54p-.cjs +179 -0
  98. package/dist/PasswordStrengthMeter-MLzhax-d.cjs +179 -0
  99. package/dist/PasswordStrengthMeter-k-e9Pole.cjs +179 -0
  100. package/dist/PasswordStrengthMeter-pAi2viq5.js +173 -0
  101. package/dist/ThemeContext-CEY9pCn-.cjs +86 -0
  102. package/dist/ThemeContext-Dk3tH7Ym.js +83 -0
  103. package/dist/ThemeToggle-4pQbVkpK.js +215 -0
  104. package/dist/ThemeToggle-B6rIVLvC.cjs +219 -0
  105. package/dist/ThemeToggle-BUOTps5l.cjs +219 -0
  106. package/dist/ThemeToggle-BpM_iHh8.js +215 -0
  107. package/dist/ThemeToggle-CO5mPl6e.js +215 -0
  108. package/dist/ThemeToggle-CZRlv0d4.cjs +219 -0
  109. package/dist/ThemeToggle-DbZQ0JSV.cjs +219 -0
  110. package/dist/ThemeToggle-vLXEq2TS.js +215 -0
  111. package/dist/VerifyEmailPage-BKiaw2YK.js +2954 -0
  112. package/dist/VerifyEmailPage-BTjI2c9n.js +2954 -0
  113. package/dist/VerifyEmailPage-Beaicc6V.cjs +2963 -0
  114. package/dist/VerifyEmailPage-BehPBp0F.cjs +2963 -0
  115. package/dist/VerifyEmailPage-CJGfDSOx.js +2954 -0
  116. package/dist/VerifyEmailPage-DOlZUNc0.cjs +2963 -0
  117. package/dist/VerifyEmailPage-DQPRl_RJ.js +2954 -0
  118. package/dist/VerifyEmailPage-Djb6hthM.js +2954 -0
  119. package/dist/VerifyEmailPage-DrdqMbLC.cjs +2963 -0
  120. package/dist/VerifyEmailPage-hyDfeCRa.cjs +2963 -0
  121. package/dist/VerifyEmailPage-kKSXl8vu.cjs +2963 -0
  122. package/dist/VerifyEmailPage-w4N-bDhU.js +2954 -0
  123. package/dist/XerticaOrbe-B9tegV1n.js +1925 -0
  124. package/dist/XerticaOrbe-BQ_NjwPS.cjs +1927 -0
  125. package/dist/XerticaOrbe-BdUX171Q.cjs +1927 -0
  126. package/dist/XerticaOrbe-BdlKXRHU.cjs +1927 -0
  127. package/dist/XerticaOrbe-CByPAFE5.js +1925 -0
  128. package/dist/XerticaOrbe-Ccu9eFMu.js +1925 -0
  129. package/dist/XerticaProvider-BVid1oqn.cjs +46 -0
  130. package/dist/XerticaProvider-BijpC_py.cjs +46 -0
  131. package/dist/XerticaProvider-Bz_YfNY4.js +44 -0
  132. package/dist/XerticaProvider-C2wDRQhT.js +44 -0
  133. package/dist/XerticaProvider-CtvYfRbZ.cjs +46 -0
  134. package/dist/XerticaProvider-DMiyExQS.js +44 -0
  135. package/dist/XerticaProvider-DP2lzKip.cjs +46 -0
  136. package/dist/XerticaProvider-De79hhgp.js +44 -0
  137. package/dist/XerticaProvider-Dkk1Vbsy.js +44 -0
  138. package/dist/XerticaProvider-EdzH9Nrw.cjs +46 -0
  139. package/dist/alert-dialog-9XYAn5z5.js +819 -0
  140. package/dist/alert-dialog-B281hud0.cjs +872 -0
  141. package/dist/alert-dialog-BVWbrcrw.cjs +872 -0
  142. package/dist/alert-dialog-B_Ko1xpu.js +819 -0
  143. package/dist/alert-dialog-BzIcTKn_.cjs +872 -0
  144. package/dist/alert-dialog-CIxE8T-J.cjs +872 -0
  145. package/dist/alert-dialog-DW-_iPuf.js +819 -0
  146. package/dist/alert-dialog-kty5pxQp.js +819 -0
  147. package/dist/assistant.cjs.js +2 -2
  148. package/dist/assistant.es.js +2 -2
  149. package/dist/avatar-BJwIMbZ_.js +54 -0
  150. package/dist/avatar-C4Zh5fAJ.cjs +77 -0
  151. package/dist/avatar-CTEUKZUT.js +54 -0
  152. package/dist/avatar-D1bZhlhL.cjs +77 -0
  153. package/dist/avatar-DKIxHeKG.cjs +77 -0
  154. package/dist/avatar-v16eZC8p.js +54 -0
  155. package/dist/blocks.cjs.js +7 -3
  156. package/dist/blocks.es.js +2 -2
  157. package/dist/brand.cjs.js +8 -7
  158. package/dist/brand.es.js +4 -3
  159. package/dist/breadcrumb-B1mUiaWB.cjs +98 -0
  160. package/dist/breadcrumb-BIRgmem-.js +90 -0
  161. package/dist/breadcrumb-BSng-oUf.cjs +98 -0
  162. package/dist/breadcrumb-CES7furU.js +90 -0
  163. package/dist/breadcrumb-CP275kbF.cjs +98 -0
  164. package/dist/breadcrumb-D7hr1EvJ.js +90 -0
  165. package/dist/button-BYtQygX5.cjs +85 -0
  166. package/dist/button-BnAW-a_w.js +62 -0
  167. package/dist/button-CUPDQews.js +62 -0
  168. package/dist/button-DFa-rtPy.js +62 -0
  169. package/dist/button-DV1G6XrI.cjs +85 -0
  170. package/dist/button-Kd9Fj53S.cjs +85 -0
  171. package/dist/cli.js +94 -10
  172. package/dist/components/blocks/auth/AuthPageShell.d.ts +12 -0
  173. package/dist/components/blocks/auth/PasswordStrengthMeter.d.ts +7 -0
  174. package/dist/components/blocks/auth/SocialLoginButtons.d.ts +8 -0
  175. package/dist/components/blocks/auth/index.d.ts +8 -0
  176. package/dist/components/blocks/auth/usePasswordStrength.d.ts +3 -0
  177. package/dist/components/blocks/index.d.ts +1 -0
  178. package/dist/components/pages/reset-password-page/ResetPasswordPage.d.ts +1 -1
  179. package/dist/components/ui/card/card.d.ts +11 -1
  180. package/dist/contexts/theme-data.d.ts +15 -1
  181. package/dist/dropdown-menu-B9wTZ0uX.cjs +225 -0
  182. package/dist/dropdown-menu-BeBtZOrs.cjs +225 -0
  183. package/dist/dropdown-menu-D7mRDGis.js +190 -0
  184. package/dist/dropdown-menu-D8ZmqHB7.js +190 -0
  185. package/dist/dropdown-menu-_AWBeOts.cjs +225 -0
  186. package/dist/dropdown-menu-qGzLO_HO.js +190 -0
  187. package/dist/hooks.cjs.js +6 -5
  188. package/dist/hooks.es.js +3 -2
  189. package/dist/index.cjs.js +42 -37
  190. package/dist/index.es.js +25 -24
  191. package/dist/input-B53E6K8G.js +65 -0
  192. package/dist/input-B7Q7vcoG.cjs +91 -0
  193. package/dist/input-BysqLMK1.js +65 -0
  194. package/dist/input-CStdFsaH.cjs +91 -0
  195. package/dist/input-CXYth6nW.cjs +91 -0
  196. package/dist/input-CX_fWE2D.cjs +91 -0
  197. package/dist/input-CitUVnEn.js +65 -0
  198. package/dist/input-wkBYTp-B.js +65 -0
  199. package/dist/layout.cjs.js +1 -1
  200. package/dist/layout.es.js +1 -1
  201. package/dist/media.cjs.js +1 -1
  202. package/dist/media.es.js +1 -1
  203. package/dist/pages.cjs.js +1 -1
  204. package/dist/pages.es.js +1 -1
  205. package/dist/rich-text-editor-BHiRUzWZ.js +2894 -0
  206. package/dist/rich-text-editor-BWMRUMJ2.js +2894 -0
  207. package/dist/rich-text-editor-BoE6Ks5x.cjs +2968 -0
  208. package/dist/rich-text-editor-BzuEwR_X.js +2894 -0
  209. package/dist/rich-text-editor-CcopGbQ-.js +2894 -0
  210. package/dist/rich-text-editor-CmxSRJIi.cjs +2968 -0
  211. package/dist/rich-text-editor-DyYAu28v.cjs +2968 -0
  212. package/dist/rich-text-editor-JS_eMQCC.cjs +2968 -0
  213. package/dist/select-BNfFJwYp.js +130 -0
  214. package/dist/select-CN8IDjGB.js +130 -0
  215. package/dist/select-CwRzQHA7.cjs +161 -0
  216. package/dist/select-CwgD3nMD.js +130 -0
  217. package/dist/select-DEHUm_AC.cjs +161 -0
  218. package/dist/select-DJDgpVm3.cjs +161 -0
  219. package/dist/select-DSLWQLmo.cjs +161 -0
  220. package/dist/select-YFx0wCYT.js +130 -0
  221. package/dist/sidebar-B7YzwAp3.js +1151 -0
  222. package/dist/sidebar-BF7JEL7U.js +1151 -0
  223. package/dist/sidebar-Bjr2doX5.cjs +1154 -0
  224. package/dist/sidebar-CMrNCmhb.cjs +1154 -0
  225. package/dist/sidebar-CO9x8AVn.cjs +1154 -0
  226. package/dist/sidebar-Cb0U7NsV.cjs +1154 -0
  227. package/dist/sidebar-Cn_KB4c6.js +1151 -0
  228. package/dist/sidebar-Db_C30ph.cjs +1154 -0
  229. package/dist/sidebar-miPHsRz4.js +1151 -0
  230. package/dist/sidebar-pZF8mLLu.js +1151 -0
  231. package/dist/skeleton-BX2XTjMO.cjs +87 -0
  232. package/dist/skeleton-BoLK0iV7.js +78 -0
  233. package/dist/skeleton-Bysq8yeB.js +79 -0
  234. package/dist/skeleton-C7nspYnC.cjs +87 -0
  235. package/dist/skeleton-DL4V5Vub.cjs +87 -0
  236. package/dist/skeleton-DSMhdqp1.js +78 -0
  237. package/dist/skeleton-DhJswvTW.cjs +88 -0
  238. package/dist/skeleton-DicUfozA.js +78 -0
  239. package/dist/slider-77T_Eqw4.js +56 -0
  240. package/dist/slider-B6puMLXS.cjs +78 -0
  241. package/dist/slider-B785N7lZ.js +56 -0
  242. package/dist/slider-C6yssKyZ.cjs +78 -0
  243. package/dist/slider-CKZO9gVh.cjs +78 -0
  244. package/dist/slider-Cn-ImSze.js +56 -0
  245. package/dist/tooltip-BiJVGob3.cjs +72 -0
  246. package/dist/tooltip-D2OPn-1v.cjs +72 -0
  247. package/dist/tooltip-DlCHQuh1.js +48 -0
  248. package/dist/tooltip-fQ2Va0G8.cjs +72 -0
  249. package/dist/tooltip-oAw00FX2.js +48 -0
  250. package/dist/tooltip-u147L0wD.js +48 -0
  251. package/dist/ui.cjs.js +17 -17
  252. package/dist/ui.es.js +13 -13
  253. package/dist/xertica-assistant-8fh8KA2K.js +2173 -0
  254. package/dist/xertica-assistant-BjfG3zyL.cjs +2180 -0
  255. package/dist/xertica-assistant-C2A0R94j.js +2173 -0
  256. package/dist/xertica-assistant-CSUprvTR.js +2173 -0
  257. package/dist/xertica-assistant-Caubm0HR.js +2173 -0
  258. package/dist/xertica-assistant-DEexPM2u.cjs +2180 -0
  259. package/dist/xertica-assistant-Dh1dmEx3.cjs +2180 -0
  260. package/dist/xertica-assistant-GGcyHEZG.cjs +2180 -0
  261. package/dist/xertica-assistant-USefPe2L.js +2173 -0
  262. package/dist/xertica-assistant-cwSHFwfv.cjs +2180 -0
  263. package/dist/xertica-ui.css +1 -1
  264. package/docs/i18n.md +2 -0
  265. package/package.json +3 -2
  266. package/styles/xertica/base.css +38 -0
  267. package/styles/xertica/tokens.css +9 -0
  268. package/templates/package.json +2 -2
  269. package/templates/src/app/App.tsx +5 -1
  270. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +1 -2
  271. package/templates/src/features/auth/ui/LoginContent.tsx +1 -2
  272. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +3 -57
  273. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +1 -2
  274. package/templates/src/features/home/index.ts +0 -10
  275. package/templates/src/features/home/ui/HomeContent.tsx +19 -74
  276. package/templates/src/features/template/index.ts +0 -4
  277. package/templates/src/features/template/ui/TemplateContent.tsx +397 -1107
  278. package/templates/src/locales/en/pages/templates.json +70 -270
  279. package/templates/src/locales/es/pages/templates.json +77 -277
  280. package/templates/src/locales/pt-BR/pages/templates.json +77 -277
  281. package/templates/src/styles/xertica/tokens.css +9 -0
  282. package/templates/vite.config.ts +25 -0
  283. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +0 -78
  284. package/templates/src/features/home/data/mock.ts +0 -41
  285. package/templates/src/features/home/hooks/useFeatureCards.ts +0 -20
  286. package/templates/src/features/home/store/dashboardStore.ts +0 -25
  287. package/templates/src/features/template/ui/CrudTemplate.tsx +0 -112
  288. package/templates/src/features/template/ui/DashboardTemplate.tsx +0 -110
  289. package/templates/src/features/template/ui/FormTemplate.tsx +0 -117
  290. package/templates/src/features/template/ui/LoginTemplate.tsx +0 -59
  291. package/templates/src/locales/en/pages/crudTemplate.json +0 -25
  292. package/templates/src/locales/en/pages/dashboardTemplate.json +0 -20
  293. package/templates/src/locales/en/pages/formTemplate.json +0 -16
  294. package/templates/src/locales/en/pages/loginTemplate.json +0 -9
  295. package/templates/src/locales/es/pages/crudTemplate.json +0 -25
  296. package/templates/src/locales/es/pages/dashboardTemplate.json +0 -20
  297. package/templates/src/locales/es/pages/formTemplate.json +0 -16
  298. package/templates/src/locales/es/pages/loginTemplate.json +0 -9
  299. package/templates/src/locales/pt-BR/pages/crudTemplate.json +0 -25
  300. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +0 -20
  301. package/templates/src/locales/pt-BR/pages/formTemplate.json +0 -16
  302. package/templates/src/locales/pt-BR/pages/loginTemplate.json +0 -9
  303. package/templates/vite.config.d.ts +0 -2
  304. package/templates/vite.config.js +0 -20
@@ -0,0 +1,819 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import * as LabelPrimitive from '@radix-ui/react-label';
3
+ import { c as cn, B as Button, b as buttonVariants } from './button-DFa-rtPy.js';
4
+ import { ChevronLeft, Check } from 'lucide-react';
5
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
6
+ import * as React from 'react';
7
+ import React__default, { useRef, useEffect, useState } from 'react';
8
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
9
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
10
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
11
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
12
+ import { createRoot } from 'react-dom/client';
13
+ import DOMPurify from 'dompurify';
14
+ import { u as useGoogleMapsLoader } from './google-maps-loader-BOug999f.js';
15
+ import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
16
+
17
+ function Label({
18
+ className,
19
+ size = "md",
20
+ ...props
21
+ }) {
22
+ const sizeClasses = {
23
+ sm: "text-xs",
24
+ md: "text-sm",
25
+ lg: "text-base"
26
+ };
27
+ return /* @__PURE__ */ jsx(
28
+ LabelPrimitive.Root,
29
+ {
30
+ "data-slot": "label",
31
+ className: cn(
32
+ "flex items-center gap-2 leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
33
+ sizeClasses[size],
34
+ className
35
+ ),
36
+ ...props
37
+ }
38
+ );
39
+ }
40
+
41
+ function PageHeader({
42
+ title,
43
+ subtitle,
44
+ backHref,
45
+ onBack,
46
+ renderBackLink,
47
+ actions,
48
+ className,
49
+ backLabel = "Back"
50
+ }) {
51
+ const showBack = !!(backHref || onBack || renderBackLink);
52
+ const icon = /* @__PURE__ */ jsx(ChevronLeft, { className: "h-5 w-5" });
53
+ return /* @__PURE__ */ jsxs(
54
+ "div",
55
+ {
56
+ className: cn(
57
+ "flex flex-col gap-4 md:flex-row md:items-center md:justify-between mb-8",
58
+ className
59
+ ),
60
+ children: [
61
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-4", children: [
62
+ showBack && /* @__PURE__ */ jsx(
63
+ Button,
64
+ {
65
+ variant: "outline",
66
+ size: "icon",
67
+ className: "h-10 w-10 shrink-0",
68
+ onClick: onBack,
69
+ asChild: !!renderBackLink || !!backHref,
70
+ "aria-label": backLabel,
71
+ children: renderBackLink ? renderBackLink(icon) : backHref ? /* @__PURE__ */ jsx("a", { href: backHref, children: icon }) : icon
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col space-y-1", children: [
75
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: title }),
76
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: subtitle })
77
+ ] })
78
+ ] }),
79
+ actions && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: actions })
80
+ ]
81
+ }
82
+ );
83
+ }
84
+ function PageHeaderHeading({
85
+ className,
86
+ ...props
87
+ }) {
88
+ return /* @__PURE__ */ jsx(
89
+ "h1",
90
+ {
91
+ className: cn(
92
+ "text-3xl font-bold leading-tight tracking-tighter md:text-4xl lg:leading-[1.1]",
93
+ className
94
+ ),
95
+ ...props
96
+ }
97
+ );
98
+ }
99
+ function PageHeaderDescription({
100
+ className,
101
+ ...props
102
+ }) {
103
+ return /* @__PURE__ */ jsx("p", { className: cn("text-lg text-muted-foreground sm:text-xl", className), ...props });
104
+ }
105
+
106
+ function Tabs({ className, ...props }) {
107
+ return /* @__PURE__ */ jsx(
108
+ TabsPrimitive.Root,
109
+ {
110
+ "data-slot": "tabs",
111
+ className: cn("flex flex-col gap-2", className),
112
+ ...props
113
+ }
114
+ );
115
+ }
116
+ function TabsList({ className, ...props }) {
117
+ return /* @__PURE__ */ jsx(
118
+ TabsPrimitive.List,
119
+ {
120
+ "data-slot": "tabs-list",
121
+ className: cn(
122
+ "relative inline-flex h-12 w-fit items-end justify-start border-b border-border bg-transparent",
123
+ className
124
+ ),
125
+ ...props
126
+ }
127
+ );
128
+ }
129
+ function TabsTrigger({ className, ...props }) {
130
+ return /* @__PURE__ */ jsx(
131
+ TabsPrimitive.Trigger,
132
+ {
133
+ "data-slot": "tabs-trigger",
134
+ className: cn(
135
+ "relative inline-flex h-12 items-center justify-center gap-1.5 bg-transparent px-4 py-3 text-sm font-medium whitespace-nowrap transition-all duration-200 ease-in-out border-b-2 border-transparent text-muted-foreground hover:text-foreground hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-primary data-[state=active]:border-primary data-[state=active]:bg-transparent [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
136
+ className
137
+ ),
138
+ ...props
139
+ }
140
+ );
141
+ }
142
+ function TabsContent({ className, ...props }) {
143
+ return /* @__PURE__ */ jsx(
144
+ TabsPrimitive.Content,
145
+ {
146
+ "data-slot": "tabs-content",
147
+ className: cn("flex-1 outline-none", className),
148
+ ...props
149
+ }
150
+ );
151
+ }
152
+
153
+ const Checkbox = React.forwardRef(({ className, size = "md", ...props }, ref) => {
154
+ const sizeClasses = {
155
+ sm: "size-3.5",
156
+ md: "size-4",
157
+ lg: "size-5"
158
+ };
159
+ const iconSizeClasses = {
160
+ sm: "size-3",
161
+ md: "size-3.5",
162
+ lg: "size-4"
163
+ };
164
+ return /* @__PURE__ */ jsx(
165
+ CheckboxPrimitive.Root,
166
+ {
167
+ ref,
168
+ "data-slot": "checkbox",
169
+ className: cn(
170
+ "peer border bg-white dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
171
+ sizeClasses[size],
172
+ className
173
+ ),
174
+ ...props,
175
+ children: /* @__PURE__ */ jsx(
176
+ CheckboxPrimitive.Indicator,
177
+ {
178
+ "data-slot": "checkbox-indicator",
179
+ className: "flex items-center justify-center text-current transition-none",
180
+ children: /* @__PURE__ */ jsx(Check, { className: iconSizeClasses[size] })
181
+ }
182
+ )
183
+ }
184
+ );
185
+ });
186
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
187
+
188
+ const RadioGroup = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { className: cn("grid gap-4", className), ...props, ref }));
189
+ RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
190
+ const RadioGroupItem = React.forwardRef(({ className, size = "md", ...props }, ref) => {
191
+ const sizeClasses = {
192
+ sm: "size-4",
193
+ md: "size-5",
194
+ lg: "size-6"
195
+ };
196
+ const dotSizeClasses = {
197
+ sm: "size-2",
198
+ md: "size-2.5",
199
+ lg: "size-3"
200
+ };
201
+ return /* @__PURE__ */ jsx(
202
+ RadioGroupPrimitive.Item,
203
+ {
204
+ ref,
205
+ "data-slot": "radio-group-item",
206
+ className: cn(
207
+ // Base styles - Material UI inspired
208
+ "relative aspect-square shrink-0 rounded-full border-2 transition-all duration-200 outline-none cursor-pointer",
209
+ // Default state - sempre com contorno usando variáveis CSS
210
+ "border-muted-foreground bg-background",
211
+ // Hover state - usa variável primary
212
+ "hover:border-primary hover:shadow-md",
213
+ // Focus state - usa variável primary
214
+ "focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2",
215
+ // Checked state - mantém contorno com primary
216
+ "data-[state=checked]:border-primary data-[state=checked]:bg-background",
217
+ // Disabled state
218
+ "disabled:cursor-not-allowed disabled:opacity-50 disabled:border-muted",
219
+ // Invalid state - usa variável destructive
220
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
221
+ sizeClasses[size],
222
+ className
223
+ ),
224
+ ...props,
225
+ children: /* @__PURE__ */ jsx(
226
+ RadioGroupPrimitive.Indicator,
227
+ {
228
+ "data-slot": "radio-group-indicator",
229
+ className: "flex items-center justify-center",
230
+ children: /* @__PURE__ */ jsx(
231
+ "div",
232
+ {
233
+ className: cn(
234
+ "rounded-full bg-primary transition-all duration-200",
235
+ dotSizeClasses[size]
236
+ )
237
+ }
238
+ )
239
+ }
240
+ )
241
+ }
242
+ );
243
+ });
244
+ RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
245
+
246
+ const Switch = React.forwardRef(({ className, size = "md", ...props }, ref) => {
247
+ const trackClasses = {
248
+ sm: "h-3.5 w-7",
249
+ md: "h-[1.15rem] w-8",
250
+ lg: "h-[1.375rem] w-10"
251
+ };
252
+ const thumbClasses = {
253
+ sm: "size-3",
254
+ md: "size-4",
255
+ lg: "size-5"
256
+ };
257
+ return /* @__PURE__ */ jsx(
258
+ SwitchPrimitive.Root,
259
+ {
260
+ className: cn(
261
+ "peer inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none disabled:cursor-not-allowed disabled:opacity-50",
262
+ "data-[state=checked]:bg-button-primary",
263
+ "data-[state=unchecked]:bg-muted",
264
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
265
+ trackClasses[size],
266
+ className
267
+ ),
268
+ ...props,
269
+ ref,
270
+ children: /* @__PURE__ */ jsx(
271
+ SwitchPrimitive.Thumb,
272
+ {
273
+ className: cn(
274
+ "pointer-events-none block rounded-full ring-0 transition-transform shadow-sm",
275
+ "bg-background",
276
+ "data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0",
277
+ thumbClasses[size]
278
+ )
279
+ }
280
+ )
281
+ }
282
+ );
283
+ });
284
+ Switch.displayName = SwitchPrimitive.Root.displayName;
285
+
286
+ function Separator({
287
+ className,
288
+ orientation = "horizontal",
289
+ decorative = true,
290
+ ...props
291
+ }) {
292
+ return /* @__PURE__ */ jsx(
293
+ SeparatorPrimitive.Root,
294
+ {
295
+ "data-slot": "separator-root",
296
+ decorative,
297
+ orientation,
298
+ className: cn(
299
+ "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
300
+ className
301
+ ),
302
+ ...props
303
+ }
304
+ );
305
+ }
306
+
307
+ function useMapLayers(map, layers) {
308
+ const trafficLayerRef = useRef(null);
309
+ const transitLayerRef = useRef(null);
310
+ const bicyclingLayerRef = useRef(null);
311
+ useEffect(() => {
312
+ if (!map) return;
313
+ if (layers.traffic) {
314
+ if (!trafficLayerRef.current) {
315
+ trafficLayerRef.current = new google.maps.TrafficLayer();
316
+ }
317
+ trafficLayerRef.current.setMap(map);
318
+ } else {
319
+ if (trafficLayerRef.current) {
320
+ trafficLayerRef.current.setMap(null);
321
+ }
322
+ }
323
+ return () => {
324
+ if (trafficLayerRef.current) {
325
+ trafficLayerRef.current.setMap(null);
326
+ }
327
+ };
328
+ }, [map, layers.traffic]);
329
+ useEffect(() => {
330
+ if (!map) return;
331
+ if (layers.transit) {
332
+ if (!transitLayerRef.current) {
333
+ transitLayerRef.current = new google.maps.TransitLayer();
334
+ }
335
+ transitLayerRef.current.setMap(map);
336
+ } else {
337
+ if (transitLayerRef.current) {
338
+ transitLayerRef.current.setMap(null);
339
+ }
340
+ }
341
+ return () => {
342
+ if (transitLayerRef.current) {
343
+ transitLayerRef.current.setMap(null);
344
+ }
345
+ };
346
+ }, [map, layers.transit]);
347
+ useEffect(() => {
348
+ if (!map) return;
349
+ if (layers.bicycling) {
350
+ if (!bicyclingLayerRef.current) {
351
+ bicyclingLayerRef.current = new google.maps.BicyclingLayer();
352
+ }
353
+ bicyclingLayerRef.current.setMap(map);
354
+ } else {
355
+ if (bicyclingLayerRef.current) {
356
+ bicyclingLayerRef.current.setMap(null);
357
+ }
358
+ }
359
+ return () => {
360
+ if (bicyclingLayerRef.current) {
361
+ bicyclingLayerRef.current.setMap(null);
362
+ }
363
+ };
364
+ }, [map, layers.bicycling]);
365
+ }
366
+
367
+ const __vite_import_meta_env__ = {"BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false};
368
+ const DEFAULT_CENTER = { lat: -23.5505, lng: -46.6333 };
369
+ const DEFAULT_ZOOM = 12;
370
+ const MapContent = React__default.forwardRef(
371
+ ({ apiKey, ...props }, ref) => {
372
+ const { isLoaded, loadError, load } = useGoogleMapsLoader();
373
+ const {
374
+ center = DEFAULT_CENTER,
375
+ zoom = DEFAULT_ZOOM,
376
+ markers = [],
377
+ circle,
378
+ polygon,
379
+ layers,
380
+ height = "400px",
381
+ mapContainerClassName,
382
+ disableDefaultUI = false,
383
+ zoomControl = true,
384
+ streetViewControl = false,
385
+ mapTypeControl = false,
386
+ fullscreenControl = true,
387
+ gestureHandling = "cooperative",
388
+ onMapLoad,
389
+ className,
390
+ ...divProps
391
+ } = props;
392
+ const [selectedMarker, setSelectedMarker] = useState(null);
393
+ const mapRef = useRef(null);
394
+ const gmpMapRef = useRef(null);
395
+ const infoWindowRef = useRef(null);
396
+ const circleRef = useRef(null);
397
+ const polygonRef = useRef(null);
398
+ const [themeColors, setThemeColors] = useState({
399
+ primary: "#4F46E5",
400
+ chart2: "#10B981"
401
+ });
402
+ useEffect(() => {
403
+ if (typeof window !== "undefined") {
404
+ const styles = getComputedStyle(document.documentElement);
405
+ setThemeColors({
406
+ primary: styles.getPropertyValue("--primary").trim() || "#4F46E5",
407
+ chart2: styles.getPropertyValue("--chart-2").trim() || "#10B981"
408
+ });
409
+ }
410
+ }, []);
411
+ useEffect(() => {
412
+ if (!isLoaded && apiKey && !loadError && load) {
413
+ load(apiKey).catch(console.error);
414
+ }
415
+ }, [isLoaded, apiKey, loadError, load]);
416
+ useEffect(() => {
417
+ if (!isLoaded || !gmpMapRef.current) return;
418
+ const gmpMap = gmpMapRef.current;
419
+ if (gmpMap.innerMap) {
420
+ mapRef.current = gmpMap.innerMap;
421
+ if (onMapLoad) {
422
+ onMapLoad(gmpMap.innerMap);
423
+ }
424
+ } else {
425
+ const interval = setInterval(() => {
426
+ if (gmpMap.innerMap) {
427
+ mapRef.current = gmpMap.innerMap;
428
+ if (onMapLoad) {
429
+ onMapLoad(gmpMap.innerMap);
430
+ }
431
+ clearInterval(interval);
432
+ }
433
+ }, 100);
434
+ return () => clearInterval(interval);
435
+ }
436
+ return () => {
437
+ mapRef.current = null;
438
+ };
439
+ }, [isLoaded]);
440
+ useEffect(() => {
441
+ if (gmpMapRef.current) {
442
+ if (center) gmpMapRef.current.center = center;
443
+ }
444
+ }, [center]);
445
+ useEffect(() => {
446
+ if (gmpMapRef.current) {
447
+ if (zoom !== void 0) gmpMapRef.current.zoom = zoom;
448
+ }
449
+ }, [zoom]);
450
+ useEffect(() => {
451
+ if (gmpMapRef.current) {
452
+ if (props.mapTypeId) gmpMapRef.current.mapTypeId = props.mapTypeId;
453
+ }
454
+ }, [props.mapTypeId]);
455
+ useEffect(() => {
456
+ const map = mapRef.current;
457
+ if (!map || !isLoaded) return;
458
+ circleRef.current?.setMap(null);
459
+ circleRef.current = null;
460
+ if (circle && circle.center && circle.radius) {
461
+ circleRef.current = new google.maps.Circle({
462
+ map,
463
+ center: circle.center,
464
+ radius: circle.radius,
465
+ fillColor: circle.fillColor || themeColors.primary,
466
+ fillOpacity: 0.2,
467
+ strokeColor: circle.strokeColor || themeColors.primary,
468
+ strokeOpacity: 0.8,
469
+ strokeWeight: 2
470
+ });
471
+ }
472
+ return () => {
473
+ circleRef.current?.setMap(null);
474
+ };
475
+ }, [circle, isLoaded, themeColors, mapRef.current]);
476
+ useEffect(() => {
477
+ const map = mapRef.current;
478
+ if (!map || !isLoaded) return;
479
+ polygonRef.current?.setMap(null);
480
+ polygonRef.current = null;
481
+ if (polygon && polygon.paths) {
482
+ polygonRef.current = new google.maps.Polygon({
483
+ map,
484
+ paths: polygon.paths,
485
+ fillColor: polygon.fillColor || themeColors.chart2,
486
+ fillOpacity: 0.2,
487
+ strokeColor: polygon.strokeColor || themeColors.chart2,
488
+ strokeOpacity: 0.8,
489
+ strokeWeight: 2
490
+ });
491
+ }
492
+ return () => {
493
+ polygonRef.current?.setMap(null);
494
+ };
495
+ }, [polygon, isLoaded, themeColors, mapRef.current]);
496
+ useMapLayers(mapRef.current, layers || {});
497
+ useEffect(() => {
498
+ const map = mapRef.current;
499
+ if (!map || selectedMarker === null) {
500
+ infoWindowRef.current?.close();
501
+ return;
502
+ }
503
+ const markerData = markers[selectedMarker];
504
+ if (!markerData) return;
505
+ }, [selectedMarker, markers]);
506
+ const handleMarkerClick = (index, markerElement) => {
507
+ setSelectedMarker(index);
508
+ const map = mapRef.current;
509
+ if (!map) return;
510
+ const markerData = markers[index];
511
+ if (!markerData) return;
512
+ let contentToRender = markerData.richContent;
513
+ if (!contentToRender && (markerData.title || markerData.info)) {
514
+ contentToRender = /* @__PURE__ */ jsxs("div", { className: "p-4 pr-8 min-w-[200px] max-w-[300px]", children: [
515
+ markerData.title && /* @__PURE__ */ jsx("h4", { className: "font-semibold text-base mb-1", children: markerData.title }),
516
+ markerData.info && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: markerData.info })
517
+ ] });
518
+ }
519
+ if (contentToRender && markerElement.innerMarker) {
520
+ if (!infoWindowRef.current) {
521
+ infoWindowRef.current = new google.maps.InfoWindow();
522
+ }
523
+ const container = document.createElement("div");
524
+ const root = createRoot(container);
525
+ root.render(contentToRender);
526
+ infoWindowRef.current.setContent(container);
527
+ infoWindowRef.current.open({
528
+ map,
529
+ anchor: markerElement.innerMarker
530
+ });
531
+ infoWindowRef.current.addListener("closeclick", () => {
532
+ setSelectedMarker(null);
533
+ setTimeout(() => root.unmount(), 0);
534
+ });
535
+ }
536
+ };
537
+ if (loadError) {
538
+ return /* @__PURE__ */ jsx(
539
+ "div",
540
+ {
541
+ ref,
542
+ className: cn(
543
+ "relative rounded-[var(--radius-card)] border border-destructive/50 overflow-hidden bg-destructive/5",
544
+ className
545
+ ),
546
+ style: { height },
547
+ ...divProps,
548
+ children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxs("div", { className: "text-center space-y-2 p-6", children: [
549
+ /* @__PURE__ */ jsx("div", { className: "text-destructive", children: /* @__PURE__ */ jsx(
550
+ "svg",
551
+ {
552
+ className: "w-12 h-12 mx-auto",
553
+ fill: "none",
554
+ stroke: "currentColor",
555
+ viewBox: "0 0 24 24",
556
+ children: /* @__PURE__ */ jsx(
557
+ "path",
558
+ {
559
+ strokeLinecap: "round",
560
+ strokeLinejoin: "round",
561
+ strokeWidth: 2,
562
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
563
+ }
564
+ )
565
+ }
566
+ ) }),
567
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-foreground", children: "Failed to load Google Maps" }),
568
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Check API key in Settings" })
569
+ ] }) })
570
+ }
571
+ );
572
+ }
573
+ if (!isLoaded) {
574
+ return /* @__PURE__ */ jsx(
575
+ "div",
576
+ {
577
+ ref,
578
+ className: cn(
579
+ "relative rounded-[var(--radius-card)] border border-border overflow-hidden bg-muted animate-pulse",
580
+ className
581
+ ),
582
+ style: { height },
583
+ ...divProps
584
+ }
585
+ );
586
+ }
587
+ return /* @__PURE__ */ jsx(
588
+ "div",
589
+ {
590
+ ref,
591
+ className: cn(
592
+ "relative rounded-[var(--radius-card)] border border-border overflow-hidden",
593
+ className
594
+ ),
595
+ style: { height },
596
+ ...divProps,
597
+ children: /* @__PURE__ */ jsx(
598
+ "gmp-map",
599
+ {
600
+ ref: gmpMapRef,
601
+ style: { height: "100%", width: "100%", display: "block" },
602
+ "map-id": props.mapId || "DEMO_MAP_ID",
603
+ children: markers.map((markerData, idx) => {
604
+ const markerColor = markerData.customColor || "var(--primary)";
605
+ const iconColor = markerData.iconColor || "white";
606
+ return (
607
+ // @ts-ignore
608
+ /* @__PURE__ */ jsx(
609
+ "gmp-advanced-marker",
610
+ {
611
+ title: markerData.title,
612
+ ref: (el) => {
613
+ if (el) {
614
+ el.position = markerData.position;
615
+ el.addEventListener("gmp-click", () => handleMarkerClick(idx, el));
616
+ }
617
+ },
618
+ children: /* @__PURE__ */ jsx(
619
+ "div",
620
+ {
621
+ className: "flex items-center justify-center w-8 h-8 border-[3px] border-background shadow-lg cursor-pointer origin-center transition-transform duration-200",
622
+ style: {
623
+ borderRadius: "50% 50% 50% 0",
624
+ transform: "rotate(-45deg)",
625
+ backgroundColor: markerColor
626
+ },
627
+ children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center rotate-45", children: markerData.iconSvg ? /* @__PURE__ */ jsx(
628
+ "div",
629
+ {
630
+ dangerouslySetInnerHTML: {
631
+ __html: DOMPurify.sanitize(markerData.iconSvg, {
632
+ USE_PROFILES: { svg: true, svgFilters: true }
633
+ })
634
+ },
635
+ style: { color: iconColor, width: 16, height: 16, fill: "currentColor" }
636
+ }
637
+ ) : /* @__PURE__ */ jsx("span", { className: "font-semibold text-sm", style: { color: iconColor }, children: markerData.icon || markerData.label || "" }) })
638
+ }
639
+ )
640
+ },
641
+ idx
642
+ )
643
+ );
644
+ })
645
+ }
646
+ )
647
+ }
648
+ );
649
+ }
650
+ );
651
+ MapContent.displayName = "MapContent";
652
+ const Map = React__default.forwardRef((props, ref) => {
653
+ const { isLoaded, loadError } = useGoogleMapsLoader();
654
+ const effectiveApiKey = props.apiKey || typeof import.meta !== "undefined" && __vite_import_meta_env__ && undefined || "";
655
+ const isValidKey = effectiveApiKey && effectiveApiKey !== "YOUR_GOOGLE_MAPS_API_KEY_HERE" && effectiveApiKey.startsWith("AIza");
656
+ if (isLoaded || isValidKey || loadError) {
657
+ return /* @__PURE__ */ jsx(MapContent, { ref, ...props, apiKey: effectiveApiKey });
658
+ }
659
+ const isScriptInjected = typeof document !== "undefined" && !!document.querySelector('script[src*="maps.googleapis.com/maps/api/js"]');
660
+ if (isScriptInjected) {
661
+ return /* @__PURE__ */ jsx(MapContent, { ref, ...props, apiKey: effectiveApiKey });
662
+ }
663
+ return /* @__PURE__ */ jsx(
664
+ "div",
665
+ {
666
+ ref,
667
+ className: cn(
668
+ "relative rounded-[var(--radius-card)] border border-border overflow-hidden bg-muted",
669
+ props.className
670
+ ),
671
+ style: { height: props.height || "400px" },
672
+ children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-muted", children: /* @__PURE__ */ jsxs("div", { className: "text-center space-y-3 p-6", children: [
673
+ /* @__PURE__ */ jsx("div", { className: "w-16 h-16 mx-auto bg-primary/10 rounded-full flex items-center justify-center", children: /* @__PURE__ */ jsxs(
674
+ "svg",
675
+ {
676
+ className: "w-8 h-8 text-primary",
677
+ fill: "none",
678
+ stroke: "currentColor",
679
+ viewBox: "0 0 24 24",
680
+ children: [
681
+ /* @__PURE__ */ jsx(
682
+ "path",
683
+ {
684
+ strokeLinecap: "round",
685
+ strokeLinejoin: "round",
686
+ strokeWidth: 2,
687
+ d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
688
+ }
689
+ ),
690
+ /* @__PURE__ */ jsx(
691
+ "path",
692
+ {
693
+ strokeLinecap: "round",
694
+ strokeLinejoin: "round",
695
+ strokeWidth: 2,
696
+ d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z"
697
+ }
698
+ )
699
+ ]
700
+ }
701
+ ) }),
702
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Configure Google Maps API Key in Settings" })
703
+ ] }) })
704
+ }
705
+ );
706
+ });
707
+ Map.displayName = "Map";
708
+
709
+ function AlertDialog({ ...props }) {
710
+ return /* @__PURE__ */ jsx(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
711
+ }
712
+ function AlertDialogTrigger({
713
+ ...props
714
+ }) {
715
+ return /* @__PURE__ */ jsx(AlertDialogPrimitive.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
716
+ }
717
+ function AlertDialogPortal({ ...props }) {
718
+ return /* @__PURE__ */ jsx(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
719
+ }
720
+ const AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => {
721
+ return /* @__PURE__ */ jsx(
722
+ AlertDialogPrimitive.Overlay,
723
+ {
724
+ ref,
725
+ "data-slot": "alert-dialog-overlay",
726
+ className: cn(
727
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
728
+ className
729
+ ),
730
+ ...props
731
+ }
732
+ );
733
+ });
734
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
735
+ function AlertDialogContent({
736
+ className,
737
+ ...props
738
+ }) {
739
+ return /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
740
+ /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
741
+ /* @__PURE__ */ jsx(
742
+ AlertDialogPrimitive.Content,
743
+ {
744
+ "data-slot": "alert-dialog-content",
745
+ className: cn(
746
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
747
+ className
748
+ ),
749
+ ...props
750
+ }
751
+ )
752
+ ] });
753
+ }
754
+ function AlertDialogHeader({ className, ...props }) {
755
+ return /* @__PURE__ */ jsx(
756
+ "div",
757
+ {
758
+ "data-slot": "alert-dialog-header",
759
+ className: cn("flex flex-col gap-2 text-center sm:text-left", className),
760
+ ...props
761
+ }
762
+ );
763
+ }
764
+ function AlertDialogFooter({ className, ...props }) {
765
+ return /* @__PURE__ */ jsx(
766
+ "div",
767
+ {
768
+ "data-slot": "alert-dialog-footer",
769
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
770
+ ...props
771
+ }
772
+ );
773
+ }
774
+ function AlertDialogTitle({
775
+ className,
776
+ ...props
777
+ }) {
778
+ return /* @__PURE__ */ jsx(
779
+ AlertDialogPrimitive.Title,
780
+ {
781
+ "data-slot": "alert-dialog-title",
782
+ className: cn("text-lg font-semibold", className),
783
+ ...props
784
+ }
785
+ );
786
+ }
787
+ function AlertDialogDescription({
788
+ className,
789
+ ...props
790
+ }) {
791
+ return /* @__PURE__ */ jsx(
792
+ AlertDialogPrimitive.Description,
793
+ {
794
+ "data-slot": "alert-dialog-description",
795
+ className: cn("text-muted-foreground text-sm", className),
796
+ ...props
797
+ }
798
+ );
799
+ }
800
+ function AlertDialogAction({
801
+ className,
802
+ ...props
803
+ }) {
804
+ return /* @__PURE__ */ jsx(AlertDialogPrimitive.Action, { className: cn(buttonVariants(), className), ...props });
805
+ }
806
+ function AlertDialogCancel({
807
+ className,
808
+ ...props
809
+ }) {
810
+ return /* @__PURE__ */ jsx(
811
+ AlertDialogPrimitive.Cancel,
812
+ {
813
+ className: cn(buttonVariants({ variant: "outline" }), className),
814
+ ...props
815
+ }
816
+ );
817
+ }
818
+
819
+ export { AlertDialog as A, Checkbox as C, Label as L, Map as M, PageHeader as P, RadioGroup as R, Separator as S, Tabs as T, AlertDialogAction as a, AlertDialogCancel as b, AlertDialogContent as c, AlertDialogDescription as d, AlertDialogFooter as e, AlertDialogHeader as f, AlertDialogOverlay as g, AlertDialogPortal as h, AlertDialogTitle as i, AlertDialogTrigger as j, PageHeaderDescription as k, PageHeaderHeading as l, RadioGroupItem as m, Switch as n, TabsContent as o, TabsList as p, TabsTrigger as q, useMapLayers as u };