xertica-ui 2.3.0 → 2.4.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 (534) hide show
  1. package/CHANGELOG.md +564 -552
  2. package/README.md +417 -406
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/cli.ts +1244 -1155
  6. package/bin/language-config.ts +358 -361
  7. package/components/assistant/code-block/CodeBlock.tsx +268 -268
  8. package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
  9. package/components/assistant/modern-chat-input/ModernChatInput.tsx +564 -554
  10. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
  11. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -106
  12. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
  13. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -78
  14. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
  15. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -560
  16. package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
  17. package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
  18. package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
  19. package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -613
  20. package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
  21. package/components/blocks/card-patterns/ActivityCardSkeleton.tsx +56 -56
  22. package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +58 -63
  23. package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
  24. package/components/blocks/card-patterns/NotificationCardSkeleton.tsx +81 -81
  25. package/components/blocks/card-patterns/ProfileCard.tsx +112 -114
  26. package/components/blocks/card-patterns/ProfileCardSkeleton.tsx +69 -69
  27. package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
  28. package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +67 -72
  29. package/components/blocks/card-patterns/QuickActionCardSkeleton.tsx +44 -44
  30. package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
  31. package/components/blocks/card-patterns/index.ts +29 -29
  32. package/components/brand/language-selector/LanguageSelector.tsx +102 -102
  33. package/components/brand/language-selector/language-selector.stories.tsx +111 -114
  34. package/components/brand/language-selector/language-selector.test.tsx +101 -101
  35. package/components/brand/theme-toggle/ThemeToggle.tsx +74 -70
  36. package/components/brand/xertica-provider/XerticaProvider.tsx +109 -112
  37. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  38. package/components/index.ts +86 -90
  39. package/components/layout/sidebar/sidebar.mdx +1 -1
  40. package/components/layout/sidebar/sidebar.tsx +1079 -1073
  41. package/components/media/FloatingMediaWrapper.tsx +371 -371
  42. package/components/media/audio-player/AudioPlayer.tsx +768 -766
  43. package/components/media/video-player/VideoPlayer.tsx +310 -310
  44. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +1 -1
  45. package/components/pages/home-content/HomeContent.tsx +120 -120
  46. package/components/pages/home-content/home-content.mdx +62 -62
  47. package/components/pages/home-page/HomePage.tsx +78 -74
  48. package/components/pages/home-page/home-page.mdx +53 -53
  49. package/components/pages/login-page/LoginPage.tsx +218 -216
  50. package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -239
  51. package/components/pages/template-content/TemplateContent.tsx +1354 -1235
  52. package/components/pages/template-content/template-content.mdx +61 -61
  53. package/components/pages/template-page/template-page.mdx +53 -53
  54. package/components/pages/verify-email-page/VerifyEmailPage.tsx +206 -206
  55. package/components/shared/error-boundary.stories.tsx +4 -22
  56. package/components/shared/error-boundary.tsx +1 -5
  57. package/components/shared/error-fallbacks.tsx +4 -8
  58. package/components/ui/accordion/accordion.mdx +8 -8
  59. package/components/ui/alert/alert.mdx +8 -8
  60. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  61. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  62. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  63. package/components/ui/avatar/avatar.mdx +8 -8
  64. package/components/ui/badge/badge.mdx +8 -8
  65. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  66. package/components/ui/button/button.mdx +8 -8
  67. package/components/ui/calendar/calendar.mdx +8 -8
  68. package/components/ui/card/card.mdx +8 -8
  69. package/components/ui/carousel/carousel.mdx +8 -8
  70. package/components/ui/chart/chart.mdx +8 -8
  71. package/components/ui/checkbox/checkbox.mdx +8 -8
  72. package/components/ui/collapsible/collapsible.mdx +8 -8
  73. package/components/ui/command/command.mdx +8 -8
  74. package/components/ui/context-menu/context-menu.mdx +8 -8
  75. package/components/ui/dialog/dialog.mdx +8 -8
  76. package/components/ui/drawer/drawer.mdx +8 -8
  77. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  78. package/components/ui/empty/empty.mdx +8 -8
  79. package/components/ui/file-upload/file-upload.mdx +8 -8
  80. package/components/ui/hover-card/hover-card.mdx +8 -8
  81. package/components/ui/input/input.mdx +8 -8
  82. package/components/ui/input-otp/input-otp.mdx +8 -8
  83. package/components/ui/label/label.mdx +8 -8
  84. package/components/ui/map/map.mdx +8 -8
  85. package/components/ui/menubar/menubar.mdx +8 -8
  86. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  87. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  88. package/components/ui/pagination/pagination.mdx +8 -8
  89. package/components/ui/popover/popover.mdx +8 -8
  90. package/components/ui/progress/progress.mdx +8 -8
  91. package/components/ui/radio-group/radio-group.mdx +8 -8
  92. package/components/ui/rating/rating.mdx +8 -8
  93. package/components/ui/resizable/resizable.mdx +8 -8
  94. package/components/ui/route-map/route-map.mdx +8 -8
  95. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  96. package/components/ui/search/search.mdx +8 -8
  97. package/components/ui/select/select.mdx +8 -8
  98. package/components/ui/separator/separator.mdx +8 -8
  99. package/components/ui/sheet/sheet.mdx +8 -8
  100. package/components/ui/simple-map/simple-map.mdx +8 -8
  101. package/components/ui/skeleton/skeleton.mdx +8 -8
  102. package/components/ui/slider/slider.mdx +8 -8
  103. package/components/ui/sonner/sonner.mdx +8 -8
  104. package/components/ui/stats-card/index.ts +2 -2
  105. package/components/ui/stats-card/stats-card-skeleton.tsx +60 -62
  106. package/components/ui/stats-card/stats-card.mdx +8 -8
  107. package/components/ui/stats-card/stats-card.stories.tsx +99 -99
  108. package/components/ui/stepper/stepper.mdx +8 -8
  109. package/components/ui/switch/switch.mdx +8 -8
  110. package/components/ui/table/table.mdx +8 -8
  111. package/components/ui/tabs/tabs.mdx +8 -8
  112. package/components/ui/textarea/textarea.mdx +8 -8
  113. package/components/ui/timeline/timeline.mdx +8 -8
  114. package/components/ui/toggle/toggle.mdx +8 -8
  115. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  116. package/components/ui/tooltip/tooltip.mdx +8 -8
  117. package/components/ui/tree-view/tree-view.mdx +8 -8
  118. package/components.json +892 -892
  119. package/contexts/AuthContext.tsx +11 -8
  120. package/contexts/LanguageContext.test.tsx +121 -121
  121. package/contexts/LanguageContext.tsx +250 -251
  122. package/dist/{AssistantChart-DoZCyS5r.cjs → AssistantChart-9w31gdAb.cjs} +4 -4
  123. package/dist/{AssistantChart-CldVCVDe.cjs → AssistantChart-BAudAfne.cjs} +5 -5
  124. package/dist/{AssistantChart-Bdd44uBn.cjs → AssistantChart-BAx9VQvb.cjs} +127 -388
  125. package/dist/{AssistantChart-Cu3m7RBo.js → AssistantChart-BP8upjMk.js} +5 -5
  126. package/dist/{AssistantChart-CFhDdGyU.js → AssistantChart-CVko2A1W.js} +130 -391
  127. package/dist/{AssistantChart-C_hwFRRr.js → AssistantChart-CVzmmhx4.js} +4 -4
  128. package/dist/{AudioPlayer-IAU5q5T1.cjs → AudioPlayer-1ypwE2Wh.cjs} +1 -1
  129. package/dist/{AudioPlayer-CGRUtUdN.js → AudioPlayer-DuKXrCfy.js} +1 -1
  130. package/dist/{LanguageContext-CS14yCpi.js → LanguageContext-BwhwC3G2.js} +2 -2
  131. package/dist/{LanguageContext-B_KFTCzT.cjs → LanguageContext-DvUt5jBg.cjs} +2 -2
  132. package/dist/{ThemeContext-C2EwAPDt.js → ThemeContext-BbBNoFTG.js} +2 -2
  133. package/dist/{ThemeContext-Bmod0Cg2.cjs → ThemeContext-BblcjQup.cjs} +13 -8
  134. package/dist/{ThemeContext-BWq9ACPo.js → ThemeContext-Bo-W2WZH.js} +13 -8
  135. package/dist/{ThemeContext-j5aGtPky.cjs → ThemeContext-CP3a0jxy.cjs} +193 -262
  136. package/dist/{ThemeContext-vTjumZeM.cjs → ThemeContext-Cmr8Ex8H.cjs} +2 -2
  137. package/dist/ThemeContext-CpqYShLq.cjs +324 -0
  138. package/dist/{ThemeContext-CQSo4Iwc.js → ThemeContext-D3LzacmG.js} +8 -1
  139. package/dist/ThemeContext-Du2nE1PL.js +325 -0
  140. package/dist/ThemeContext-GeEBTJ3q.cjs +1621 -0
  141. package/dist/ThemeContext-JyLK9B1o.js +1622 -0
  142. package/dist/{ThemeContext-CGk3KK0k.cjs → ThemeContext-U4dEYc6C.cjs} +8 -1
  143. package/dist/{ThemeContext-BXjrgUjW.js → ThemeContext-ept8jhXI.js} +200 -261
  144. package/dist/{VerifyEmailPage-C0c2e5n0.js → VerifyEmailPage-BE-L9mB7.js} +7 -7
  145. package/dist/{VerifyEmailPage-DSBMRHtl.js → VerifyEmailPage-BIBOKV7Z.js} +41 -36
  146. package/dist/{VerifyEmailPage-DgIid028.js → VerifyEmailPage-BJjAMUTW.js} +4 -4
  147. package/dist/{VerifyEmailPage--1Vurewl.cjs → VerifyEmailPage-BRSP-Pwt.cjs} +3 -3
  148. package/dist/{VerifyEmailPage-Cwi3kbol.cjs → VerifyEmailPage-Bae2cBXT.cjs} +7 -7
  149. package/dist/{VerifyEmailPage-De6bQjrz.cjs → VerifyEmailPage-BiRm7Nh4.cjs} +41 -36
  150. package/dist/{VerifyEmailPage-ByerOcm4.cjs → VerifyEmailPage-Bv8Ah_TK.cjs} +23 -20
  151. package/dist/VerifyEmailPage-Bvfv8HVQ.js +3214 -0
  152. package/dist/{VerifyEmailPage-BComraR7.cjs → VerifyEmailPage-CR7kb5df.cjs} +22 -12
  153. package/dist/{VerifyEmailPage-MTD7AG1Z.js → VerifyEmailPage-C_ihbcth.js} +4 -4
  154. package/dist/{VerifyEmailPage-1WwWczAn.js → VerifyEmailPage-CbgjOF0v.js} +22 -12
  155. package/dist/{VerifyEmailPage-DvMLZgFt.js → VerifyEmailPage-CdYPSJoO.js} +1 -1
  156. package/dist/{VerifyEmailPage-By3Jf__L.cjs → VerifyEmailPage-CkBYfsNy.cjs} +4 -4
  157. package/dist/{VerifyEmailPage-CJLz3jrn.js → VerifyEmailPage-Cyl55sJb.js} +23 -20
  158. package/dist/VerifyEmailPage-D-FRj5TU.cjs +3213 -0
  159. package/dist/VerifyEmailPage-DF2ilhum.cjs +3210 -0
  160. package/dist/{VerifyEmailPage-CYXtbKi3.cjs → VerifyEmailPage-DMBh4NM9.cjs} +1 -1
  161. package/dist/{VerifyEmailPage-CgMxRb4z.js → VerifyEmailPage-DTtFfC-J.js} +3 -3
  162. package/dist/{VerifyEmailPage-CFLMls1p.cjs → VerifyEmailPage-Dt7zgA4w.cjs} +4 -4
  163. package/dist/VerifyEmailPage-EhudUdqF.js +3211 -0
  164. package/dist/{VerifyEmailPage-C5TNQTBa.js → VerifyEmailPage-X14vhdyl.js} +148 -75
  165. package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
  166. package/dist/{VerifyEmailPage-B4peJjAT.cjs → VerifyEmailPage-u_Dn7t1U.cjs} +148 -75
  167. package/dist/VerifyEmailPage-vYHbYK3q.js +3214 -0
  168. package/dist/{XerticaProvider-CBGc4EMA.cjs → XerticaProvider-AChwphCO.cjs} +4 -4
  169. package/dist/{XerticaProvider-BIrqfZ-i.cjs → XerticaProvider-AbWlr7Af.cjs} +8 -11
  170. package/dist/{XerticaProvider-D-yNhF94.cjs → XerticaProvider-B8CaV7xu.cjs} +1 -1
  171. package/dist/{XerticaProvider-DDuiIcKo.js → XerticaProvider-BErr83Bg.js} +14 -11
  172. package/dist/{XerticaProvider-CEoWMTxu.js → XerticaProvider-BITjgC5p.js} +2 -2
  173. package/dist/{XerticaProvider-CllrbMEJ.cjs → XerticaProvider-By8q3Roe.cjs} +2 -2
  174. package/dist/{XerticaProvider-C1DKnvLh.js → XerticaProvider-CUYJZc32.js} +4 -4
  175. package/dist/{XerticaProvider-ET0ihewn.cjs → XerticaProvider-CW9hpCdF.cjs} +2 -2
  176. package/dist/{XerticaProvider-Dt5HEzbQ.js → XerticaProvider-CWgby5mY.js} +10 -10
  177. package/dist/XerticaProvider-CWs6EwNa.js +49 -0
  178. package/dist/XerticaProvider-CjQAQPcn.cjs +48 -0
  179. package/dist/XerticaProvider-CwOkHxiT.cjs +44 -0
  180. package/dist/XerticaProvider-D5lLumH-.js +49 -0
  181. package/dist/{XerticaProvider-DYq4JWtg.js → XerticaProvider-DQtvJU7m.js} +1 -1
  182. package/dist/XerticaProvider-qQUDop71.cjs +48 -0
  183. package/dist/{XerticaProvider-B7EVH-NF.js → XerticaProvider-siSt9uG2.js} +2 -2
  184. package/dist/{XerticaXLogo-Zw2B276b.cjs → XerticaXLogo-8TTzBjHw.cjs} +1 -1
  185. package/dist/{XerticaXLogo-B7xQ5dhi.js → XerticaXLogo-BWaag64t.js} +1 -1
  186. package/dist/{XerticaXLogo-DZbo4vOE.js → XerticaXLogo-BX3ueACh.js} +5 -2
  187. package/dist/XerticaXLogo-CFuIlYFH.js +252 -0
  188. package/dist/XerticaXLogo-CU-U-GP4.cjs +251 -0
  189. package/dist/XerticaXLogo-ChryA6xj.js +252 -0
  190. package/dist/{XerticaXLogo-CQUUjXoH.cjs → XerticaXLogo-CziKMQil.cjs} +8 -8
  191. package/dist/XerticaXLogo-DHz5SugF.js +252 -0
  192. package/dist/XerticaXLogo-DTee_y8X.cjs +251 -0
  193. package/dist/{XerticaXLogo-Cmsp-Eey.js → XerticaXLogo-DfUvz-lD.js} +9 -9
  194. package/dist/XerticaXLogo-kslQ8Tk_.cjs +251 -0
  195. package/dist/{XerticaXLogo-bvZSgwGF.cjs → XerticaXLogo-qBPhwK3g.cjs} +5 -2
  196. package/dist/{alert-dialog-s-vmNkJ_.js → alert-dialog-iDe5VE5o.js} +3 -3
  197. package/dist/{alert-dialog-DSKByiKZ.cjs → alert-dialog-yckpaOpy.cjs} +3 -3
  198. package/dist/assistant.cjs.js +1 -1
  199. package/dist/assistant.es.js +1 -1
  200. package/dist/brand.cjs.js +2 -2
  201. package/dist/brand.es.js +2 -2
  202. package/dist/cli.js +90 -37
  203. package/dist/components/brand/theme-toggle/ThemeToggle.d.ts +1 -1
  204. package/dist/components/index.d.ts +1 -1
  205. package/dist/{google-maps-loader-Y-QkD-Li.cjs → google-maps-loader-BqsYL48U.cjs} +0 -5
  206. package/dist/{google-maps-loader-CTYySAun.js → google-maps-loader-t2IlYBzw.js} +0 -4
  207. package/dist/index-CkTUgOwX.js +8 -0
  208. package/dist/{index-COtD8bRW.cjs → index-D3RLKRAs.cjs} +1 -1
  209. package/dist/index.cjs.js +5 -5
  210. package/dist/index.es.js +5 -5
  211. package/dist/index.umd.js +454 -1027
  212. package/dist/layout.cjs.js +1 -1
  213. package/dist/layout.es.js +1 -1
  214. package/dist/pages.cjs.js +1 -1
  215. package/dist/pages.es.js +1 -1
  216. package/dist/{sidebar-DAaY8bRU.cjs → sidebar-B3EYhli0.cjs} +33 -24
  217. package/dist/{sidebar-B6SlKZYN.js → sidebar-B4ZWaMrE.js} +1 -1
  218. package/dist/{sidebar-DQj1z3jG.cjs → sidebar-B9NR0lCe.cjs} +269 -227
  219. package/dist/{sidebar-nzPoVHBQ.cjs → sidebar-BS1p2V7t.cjs} +1 -1
  220. package/dist/sidebar-BvF5I2Ue.cjs +800 -0
  221. package/dist/{sidebar-q7P2Godd.cjs → sidebar-C5B_LHek.cjs} +1 -1
  222. package/dist/{sidebar-CrQDDdcz.js → sidebar-CA6_ek3f.js} +33 -24
  223. package/dist/{sidebar-BxGXsDAd.cjs → sidebar-CVUGHOS_.cjs} +8 -16
  224. package/dist/{sidebar-BViy8Eeu.js → sidebar-CmvwjnVb.js} +9 -17
  225. package/dist/sidebar-CplprZpM.js +801 -0
  226. package/dist/{sidebar-BbVIQvlP.js → sidebar-Dz7bd3zP.js} +1 -1
  227. package/dist/sidebar-KIS0C2JH.js +801 -0
  228. package/dist/sidebar-OTO_up7Z.js +801 -0
  229. package/dist/sidebar-zowjejT2.cjs +800 -0
  230. package/dist/{use-audio-player-nv8ZSGa1.js → use-audio-player-Bkh23vQ3.js} +3 -7
  231. package/dist/{use-audio-player-NKsWyjWu.cjs → use-audio-player-Dn1NR9xN.cjs} +3 -7
  232. package/dist/{xertica-assistant-dyP7KHM5.cjs → xertica-assistant-B1IaHXnB.cjs} +388 -529
  233. package/dist/{xertica-assistant-DCsnQyi5.js → xertica-assistant-B1NaSFFj.js} +46 -29
  234. package/dist/{xertica-assistant-ciJaWqm1.js → xertica-assistant-BMqdyRVi.js} +10 -28
  235. package/dist/{xertica-assistant-V_IdW4WF.cjs → xertica-assistant-Bj3vBCq_.cjs} +9 -27
  236. package/dist/{xertica-assistant-CrgTb6Hs.cjs → xertica-assistant-CIaUlbIt.cjs} +47 -22
  237. package/dist/{xertica-assistant-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
  238. package/dist/{CodeBlock-BgfYL_rD.cjs → xertica-assistant-Qp3ydksa.cjs} +51 -263
  239. package/dist/{CodeBlock-BeSt1h5P.js → xertica-assistant-gnCJdcZY.js} +7 -219
  240. package/dist/xertica-ui.css +2 -2
  241. package/docs/architecture-improvements.md +456 -456
  242. package/docs/architecture.md +312 -306
  243. package/docs/components/assistant.md +428 -428
  244. package/docs/components/branding.md +252 -252
  245. package/docs/components/card-patterns.md +447 -445
  246. package/docs/components/error-boundary.md +32 -22
  247. package/docs/components/hooks.md +432 -430
  248. package/docs/components/language-selector.md +176 -172
  249. package/docs/components/pages.md +20 -6
  250. package/docs/doc-audit.md +244 -243
  251. package/docs/getting-started.md +616 -603
  252. package/docs/guidelines.md +330 -328
  253. package/docs/i18n.md +480 -476
  254. package/docs/installation.md +7 -6
  255. package/docs/llms.md +295 -295
  256. package/docs/state-management.md +289 -289
  257. package/guidelines/Guidelines.md +409 -406
  258. package/llms-compact.txt +1 -1
  259. package/llms.txt +1 -1
  260. package/package.json +219 -219
  261. package/styles/xertica/base.css +6 -0
  262. package/templates/.prettierignore +4 -4
  263. package/templates/.prettierrc +10 -10
  264. package/templates/CLAUDE.md +180 -165
  265. package/templates/guidelines/Guidelines.md +577 -553
  266. package/templates/package.json +69 -69
  267. package/templates/src/app/App.tsx +46 -46
  268. package/templates/src/app/components/AuthGuard.tsx +57 -8
  269. package/templates/src/features/assistant/data/mock.ts +75 -75
  270. package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
  271. package/templates/src/features/assistant/index.ts +5 -5
  272. package/templates/src/features/auth/ui/AuthPageShell.tsx +1 -1
  273. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -72
  274. package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
  275. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -179
  276. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
  277. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -84
  278. package/templates/src/features/home/data/mock.ts +6 -0
  279. package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
  280. package/templates/src/features/home/index.ts +11 -11
  281. package/templates/src/features/home/ui/HomeContent.tsx +117 -119
  282. package/templates/src/features/template/ui/CrudTemplate.tsx +112 -115
  283. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
  284. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  285. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
  286. package/templates/src/features/template/ui/TemplateContent.tsx +1322 -1314
  287. package/templates/src/i18n.ts +124 -124
  288. package/templates/src/locales/en/common.json +21 -21
  289. package/templates/src/locales/en/components/activityCard.json +10 -10
  290. package/templates/src/locales/en/components/assistant.json +119 -119
  291. package/templates/src/locales/en/components/media.json +29 -29
  292. package/templates/src/locales/en/components/notificationCard.json +5 -5
  293. package/templates/src/locales/en/components/profileCard.json +8 -8
  294. package/templates/src/locales/en/components/projectCard.json +10 -10
  295. package/templates/src/locales/en/components/sidebar.json +14 -14
  296. package/templates/src/locales/en/components/stats.json +8 -8
  297. package/templates/src/locales/en/components/team.json +14 -14
  298. package/templates/src/locales/en/errors.json +9 -9
  299. package/templates/src/locales/en/languageSelector.json +7 -7
  300. package/templates/src/locales/en/nav.json +6 -6
  301. package/templates/src/locales/en/pages/crudTemplate.json +25 -25
  302. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
  303. package/templates/src/locales/en/pages/forgotPassword.json +10 -10
  304. package/templates/src/locales/en/pages/formTemplate.json +16 -16
  305. package/templates/src/locales/en/pages/home.json +7 -7
  306. package/templates/src/locales/en/pages/login.json +15 -15
  307. package/templates/src/locales/en/pages/loginTemplate.json +9 -9
  308. package/templates/src/locales/en/pages/resetPassword.json +18 -18
  309. package/templates/src/locales/en/pages/templates.json +317 -317
  310. package/templates/src/locales/en/pages/verifyEmail.json +12 -12
  311. package/templates/src/locales/en/themeToggle.json +6 -6
  312. package/templates/src/locales/es/common.json +21 -21
  313. package/templates/src/locales/es/components/activityCard.json +10 -10
  314. package/templates/src/locales/es/components/assistant.json +119 -119
  315. package/templates/src/locales/es/components/media.json +29 -29
  316. package/templates/src/locales/es/components/notificationCard.json +5 -5
  317. package/templates/src/locales/es/components/profileCard.json +8 -8
  318. package/templates/src/locales/es/components/projectCard.json +10 -10
  319. package/templates/src/locales/es/components/sidebar.json +14 -14
  320. package/templates/src/locales/es/components/stats.json +8 -8
  321. package/templates/src/locales/es/components/team.json +14 -14
  322. package/templates/src/locales/es/errors.json +9 -9
  323. package/templates/src/locales/es/languageSelector.json +7 -7
  324. package/templates/src/locales/es/nav.json +6 -6
  325. package/templates/src/locales/es/pages/crudTemplate.json +25 -25
  326. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
  327. package/templates/src/locales/es/pages/forgotPassword.json +10 -10
  328. package/templates/src/locales/es/pages/formTemplate.json +16 -16
  329. package/templates/src/locales/es/pages/home.json +7 -7
  330. package/templates/src/locales/es/pages/login.json +15 -15
  331. package/templates/src/locales/es/pages/loginTemplate.json +9 -9
  332. package/templates/src/locales/es/pages/resetPassword.json +18 -18
  333. package/templates/src/locales/es/pages/templates.json +317 -317
  334. package/templates/src/locales/es/pages/verifyEmail.json +12 -12
  335. package/templates/src/locales/es/themeToggle.json +6 -6
  336. package/templates/src/locales/pt-BR/common.json +21 -21
  337. package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
  338. package/templates/src/locales/pt-BR/components/assistant.json +119 -119
  339. package/templates/src/locales/pt-BR/components/media.json +29 -29
  340. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
  341. package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
  342. package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
  343. package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
  344. package/templates/src/locales/pt-BR/components/stats.json +8 -8
  345. package/templates/src/locales/pt-BR/components/team.json +14 -14
  346. package/templates/src/locales/pt-BR/errors.json +9 -9
  347. package/templates/src/locales/pt-BR/languageSelector.json +7 -7
  348. package/templates/src/locales/pt-BR/nav.json +6 -6
  349. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
  350. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
  351. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -10
  352. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
  353. package/templates/src/locales/pt-BR/pages/home.json +7 -7
  354. package/templates/src/locales/pt-BR/pages/login.json +15 -15
  355. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
  356. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
  357. package/templates/src/locales/pt-BR/pages/templates.json +317 -317
  358. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
  359. package/templates/src/locales/pt-BR/themeToggle.json +6 -6
  360. package/templates/src/pages/AssistantPage.tsx +470 -464
  361. package/templates/src/pages/HomePage.tsx +53 -49
  362. package/templates/src/shared/error-boundary.tsx +1 -5
  363. package/templates/src/shared/error-fallbacks.tsx +4 -8
  364. package/templates/vite.config.js +20 -20
  365. package/templates/vite.config.ts +55 -52
  366. package/dist/AssistantChart-CxGjH7Qk.js +0 -3477
  367. package/dist/AssistantChart-DIpshm3i.js +0 -4784
  368. package/dist/AssistantChart-D_PTeu8P.cjs +0 -3503
  369. package/dist/AssistantChart-zjsy2GaZ.cjs +0 -4810
  370. package/dist/AudioPlayer-B1lt5cPl.cjs +0 -989
  371. package/dist/AudioPlayer-BZ7bibzU.cjs +0 -982
  372. package/dist/AudioPlayer-BpRPS4-1.cjs +0 -1277
  373. package/dist/AudioPlayer-C12BjQBV.cjs +0 -997
  374. package/dist/AudioPlayer-CFeV8t-5.cjs +0 -936
  375. package/dist/AudioPlayer-Coly3q5R.js +0 -1278
  376. package/dist/AudioPlayer-CySJIyvL.js +0 -937
  377. package/dist/AudioPlayer-DMcG_c7L.js +0 -990
  378. package/dist/AudioPlayer-DcFKRJE_.js +0 -998
  379. package/dist/AudioPlayer-e8LfNoqO.js +0 -983
  380. package/dist/BrandColorsContext-565dDHd5.js +0 -660
  381. package/dist/BrandColorsContext-BcJbtkqn.cjs +0 -659
  382. package/dist/CodeBlock-7TTgmdGG.cjs +0 -2094
  383. package/dist/CodeBlock-BlcqlA9M.cjs +0 -2094
  384. package/dist/CodeBlock-Bnmeu5ez.cjs +0 -2094
  385. package/dist/CodeBlock-BtfPlbAI.js +0 -2078
  386. package/dist/CodeBlock-CIySIuYr.js +0 -2078
  387. package/dist/CodeBlock-CuPtUM-7.cjs +0 -2094
  388. package/dist/CodeBlock-D6ffWXgc.js +0 -2078
  389. package/dist/CodeBlock-D8dcwbit.cjs +0 -2094
  390. package/dist/CodeBlock-DMZrFnlw.cjs +0 -2094
  391. package/dist/CodeBlock-DlBehYN8.js +0 -2078
  392. package/dist/CodeBlock-DnYNI8rQ.js +0 -2078
  393. package/dist/CodeBlock-DvKWbSnE.cjs +0 -2094
  394. package/dist/CodeBlock-DwMCfkFY.js +0 -2078
  395. package/dist/CodeBlock-Dy6CNYyj.js +0 -2078
  396. package/dist/CodeBlock-U1pPOQI7.cjs +0 -2094
  397. package/dist/CodeBlock-f_GpNhEB.js +0 -2078
  398. package/dist/CodeBlock-oB6u8nI1.js +0 -2078
  399. package/dist/CodeBlock-tZC31B73.cjs +0 -2094
  400. package/dist/FeatureCard-CxC-7C-C.cjs +0 -300
  401. package/dist/FeatureCard-DbHWCb4E.js +0 -301
  402. package/dist/ImageWithFallback-CGtidP6B.cjs +0 -4542
  403. package/dist/ImageWithFallback-lsg3pdFg.js +0 -4508
  404. package/dist/LanguageSelector-B5YfbHra.js +0 -231
  405. package/dist/LanguageSelector-D6uacAIM.cjs +0 -230
  406. package/dist/LayoutContext-B45-e9DI.cjs +0 -93
  407. package/dist/LayoutContext-BAql6ZRY.js +0 -97
  408. package/dist/LayoutContext-Bav3UMEA.js +0 -94
  409. package/dist/LayoutContext-BvK-ggDa.cjs +0 -96
  410. package/dist/ThemeContext-BoH4NLfN.js +0 -734
  411. package/dist/ThemeContext-r69W20Xg.cjs +0 -733
  412. package/dist/VerifyEmailPage-COiyNl1y.js +0 -2825
  413. package/dist/VerifyEmailPage-CqKsR2v8.js +0 -2827
  414. package/dist/VerifyEmailPage-DjQKRlUS.cjs +0 -2824
  415. package/dist/VerifyEmailPage-s-1X3LDJ.cjs +0 -2826
  416. package/dist/XerticaOrbe-KL1RBHzw.cjs +0 -1354
  417. package/dist/XerticaOrbe-zwS1p2a8.js +0 -1355
  418. package/dist/XerticaProvider-6btlAlzc.js +0 -17
  419. package/dist/XerticaProvider-BNoNOxQ5.cjs +0 -16
  420. package/dist/XerticaProvider-BlY2limY.cjs +0 -38
  421. package/dist/XerticaProvider-cI9hSs27.cjs +0 -38
  422. package/dist/XerticaProvider-hSwhNQex.js +0 -39
  423. package/dist/alert-dialog-BOje--vD.js +0 -847
  424. package/dist/alert-dialog-BtEuQqrg.cjs +0 -870
  425. package/dist/breadcrumb-CqJ7bHY5.js +0 -161
  426. package/dist/breadcrumb-m9Hb2_XN.cjs +0 -177
  427. package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +0 -6
  428. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +0 -21
  429. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +0 -49
  430. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +0 -16
  431. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +0 -35
  432. package/dist/components/blocks/audio-player/index.d.ts +0 -1
  433. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +0 -26
  434. package/dist/components/blocks/document-editor/index.d.ts +0 -1
  435. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +0 -41
  436. package/dist/components/blocks/podcast-player/index.d.ts +0 -1
  437. package/dist/components/ui/chart/parts/chart-dashboard.d.ts +0 -113
  438. package/dist/components/ui/chart/parts/chart-metric.d.ts +0 -118
  439. package/dist/components/ui/chart/parts/chart-primitives.d.ts +0 -101
  440. package/dist/components/ui/chart/parts/chart-shared.d.ts +0 -20
  441. package/dist/components/ui/chart/parts/chart-utils.d.ts +0 -12
  442. package/dist/components/ui/chart/parts/index.d.ts +0 -5
  443. package/dist/dropdown-menu-BDB5CmQs.cjs +0 -247
  444. package/dist/dropdown-menu-DQidbKBD.js +0 -231
  445. package/dist/google-maps-loader-BFWp6VPd.js +0 -287
  446. package/dist/google-maps-loader-BKcdgFbu.cjs +0 -312
  447. package/dist/google-maps-loader-CumCNXeG.js +0 -312
  448. package/dist/google-maps-loader-eS3uQ5TA.cjs +0 -287
  449. package/dist/header-Cgy6vYPk.cjs +0 -731
  450. package/dist/header-DRlT4jgI.js +0 -715
  451. package/dist/header-Dux00SI4.cjs +0 -731
  452. package/dist/header-EkGKXPsD.js +0 -715
  453. package/dist/header-WfEywpyc.cjs +0 -731
  454. package/dist/header-tifNQn2U.js +0 -715
  455. package/dist/index-BhapVLVj.js +0 -8
  456. package/dist/index-D6fxYEY8.cjs +0 -7
  457. package/dist/index-DAIp0_HK.js +0 -8
  458. package/dist/index-DW5tYe26.js +0 -8
  459. package/dist/index-GA__GvnG.cjs +0 -7
  460. package/dist/input-2R4loU86.js +0 -127
  461. package/dist/input-DWANSKGb.cjs +0 -145
  462. package/dist/progress-DPtzoVV8.js +0 -175
  463. package/dist/progress-EeaoqqUs.cjs +0 -191
  464. package/dist/rich-text-editor-0mraWT5y.cjs +0 -2376
  465. package/dist/rich-text-editor-B-IkcPD0.js +0 -2874
  466. package/dist/rich-text-editor-B6jMRLzk.cjs +0 -1939
  467. package/dist/rich-text-editor-B8_oYcIR.js +0 -1730
  468. package/dist/rich-text-editor-B9UbSXNb.js +0 -1203
  469. package/dist/rich-text-editor-BYuRBNBU.js +0 -2373
  470. package/dist/rich-text-editor-Bb9pySTs.cjs +0 -2374
  471. package/dist/rich-text-editor-BcL6L3cm.cjs +0 -2374
  472. package/dist/rich-text-editor-BoVZYtTs.cjs +0 -2391
  473. package/dist/rich-text-editor-Bp3zQqMC.js +0 -2954
  474. package/dist/rich-text-editor-CMgSN_w2.js +0 -1189
  475. package/dist/rich-text-editor-CPV1lEPH.cjs +0 -1748
  476. package/dist/rich-text-editor-CeucBdIv.cjs +0 -2971
  477. package/dist/rich-text-editor-CoKqbCtu.cjs +0 -1799
  478. package/dist/rich-text-editor-Cw56T_mB.js +0 -2356
  479. package/dist/rich-text-editor-Cyt8qs2b.js +0 -1921
  480. package/dist/rich-text-editor-D6H84OcX.cjs +0 -1220
  481. package/dist/rich-text-editor-D76gD-QI.js +0 -2328
  482. package/dist/rich-text-editor-DKkokOnA.js +0 -1781
  483. package/dist/rich-text-editor-DNsdpN64.cjs +0 -2359
  484. package/dist/rich-text-editor-DfG8bCyY.js +0 -2358
  485. package/dist/rich-text-editor-Dxjw31Z4.js +0 -2341
  486. package/dist/rich-text-editor-DzP0Epmb.js +0 -2356
  487. package/dist/rich-text-editor-bRkNoeZY.cjs +0 -2891
  488. package/dist/rich-text-editor-lyYE2ZG5.cjs +0 -1207
  489. package/dist/rich-text-editor-skplNlBM.cjs +0 -2345
  490. package/dist/select-Bkbr0f-Z.cjs +0 -162
  491. package/dist/select-CvIVdX2n.js +0 -145
  492. package/dist/sidebar-CK_0ZQHj.cjs +0 -803
  493. package/dist/sidebar-CUuOvYhK.js +0 -787
  494. package/dist/sidebar-Djn5syhi.cjs +0 -786
  495. package/dist/sidebar-LluMXfam.js +0 -759
  496. package/dist/sidebar-_rT7rBMk.js +0 -787
  497. package/dist/slider-Bc5Hd0y1.js +0 -56
  498. package/dist/slider-N7hFFj6X.cjs +0 -73
  499. package/dist/tooltip-Ded96neP.cjs +0 -137
  500. package/dist/tooltip-HDOoD2-0.js +0 -120
  501. package/dist/use-audio-player-B31J-aqh.cjs +0 -187
  502. package/dist/use-audio-player-BkmEmj8Q.js +0 -185
  503. package/dist/use-audio-player-CLFTWFW1.cjs +0 -184
  504. package/dist/use-audio-player-CLLn00I6.js +0 -188
  505. package/dist/use-file-upload-BcjEo2S5.js +0 -404
  506. package/dist/use-file-upload-CRJR68Tj.cjs +0 -403
  507. package/dist/use-mobile-B0hNy_Y6.cjs +0 -4303
  508. package/dist/use-mobile-BXuYROXM.js +0 -4202
  509. package/dist/use-mobile-Bbd51ASU.cjs +0 -4392
  510. package/dist/use-mobile-Bk6CX-TC.js +0 -4359
  511. package/dist/use-mobile-BvYdisLP.js +0 -4202
  512. package/dist/use-mobile-BzuxjzNX.cjs +0 -4392
  513. package/dist/use-mobile-CG2-SdXV.cjs +0 -4235
  514. package/dist/use-mobile-CKb5pqTs.js +0 -4269
  515. package/dist/use-mobile-CYuAuGDl.js +0 -4202
  516. package/dist/use-mobile-CaENcqm-.js +0 -4508
  517. package/dist/use-mobile-CbrYgJGJ.js +0 -4203
  518. package/dist/use-mobile-Cd4xPrKq.cjs +0 -46
  519. package/dist/use-mobile-DMOvImGQ.cjs +0 -4542
  520. package/dist/use-mobile-DRB3BQgD.cjs +0 -4235
  521. package/dist/use-mobile-DZvv7QMR.js +0 -4359
  522. package/dist/use-mobile-DdI_TXam.cjs +0 -4235
  523. package/dist/use-mobile-DlceKf8a.js +0 -4359
  524. package/dist/use-mobile-DsOnow1o.cjs +0 -4236
  525. package/dist/use-mobile-Kcj6jSnK.cjs +0 -4392
  526. package/dist/use-mobile-bnKcua_i.js +0 -4202
  527. package/dist/use-mobile-j4w2Jrf1.js +0 -30
  528. package/dist/use-mobile-ncXBeE2z.cjs +0 -4235
  529. package/dist/use-rich-text-editor-DjiddBGv.js +0 -282
  530. package/dist/use-rich-text-editor-lpeswbCs.cjs +0 -281
  531. package/dist/xertica-assistant-BdiZag0h.js +0 -2187
  532. package/dist/xertica-assistant-DUBpmEgo.cjs +0 -2186
  533. package/dist/{rich-text-editor-DgF8s7xW.js → rich-text-editor-BmsjY03B.js} +26 -26
  534. package/dist/{rich-text-editor-mWoaSCE4.cjs → rich-text-editor-GS2kpTAK.cjs} +26 -26
@@ -1,251 +1,250 @@
1
- import React, {
2
- createContext,
3
- useCallback,
4
- useContext,
5
- useEffect,
6
- useMemo,
7
- useState,
8
- type ReactNode,
9
- } from 'react';
10
- import i18n from '../i18n';
11
- import { useQueryClient } from '@tanstack/react-query';
12
-
13
- // ─────────────────────────────────────────────────────────────────────────────
14
- // Types
15
- // ─────────────────────────────────────────────────────────────────────────────
16
-
17
- /**
18
- * Language code — any string is allowed so consumers can extend with their own
19
- * locales (e.g. `'fr'`, `'de'`, `'ja'`). The library ships with built-in
20
- * support for `'pt-BR'`, `'en'`, and `'es'`, but those are recommendations not
21
- * restrictions.
22
- */
23
- export type Language = string;
24
-
25
- /**
26
- * Descriptor for a single language available in the picker.
27
- */
28
- export interface LanguageDefinition {
29
- /** ISO/BCP-47 code stored in localStorage and passed to i18n.changeLanguage() */
30
- code: Language;
31
- /** Full display label shown in the LanguageSelector dropdown */
32
- label: string;
33
- /** Short label shown in `variant="minimal"` (e.g. "PT", "EN") */
34
- shortLabel?: string;
35
- /** Optional translation JSON. When provided, it is registered with i18next
36
- * on mount so dynamically added locales are loaded automatically.
37
- * Use a plain object matching your `pt-BR.json` shape. */
38
- resources?: Record<string, unknown>;
39
- }
40
-
41
- interface LanguageContextType {
42
- /** Currently active language code */
43
- language: Language;
44
- /** Change the active language (persists + updates i18n + invalidates queries) */
45
- setLanguage: (language: Language) => void;
46
- /** All languages registered for this app */
47
- availableLanguages: LanguageDefinition[];
48
- /** True when only a single language is configured — UI can hide selectors */
49
- isMonolingual: boolean;
50
- }
51
-
52
- // ─────────────────────────────────────────────────────────────────────────────
53
- // Defaults
54
- // ─────────────────────────────────────────────────────────────────────────────
55
-
56
- /**
57
- * Default language set when no `availableLanguages` prop is provided.
58
- * These are the locales the library ships with out-of-the-box.
59
- */
60
- export const DEFAULT_LANGUAGES: LanguageDefinition[] = [
61
- { code: 'pt-BR', label: 'Português (BR)', shortLabel: 'PT' },
62
- { code: 'en', label: 'English', shortLabel: 'EN' },
63
- { code: 'es', label: 'Español', shortLabel: 'ES' },
64
- ];
65
-
66
- const STORAGE_KEY = 'xertica_language';
67
-
68
- // Maps legacy localStorage values (from older versions) to canonical codes.
69
- const LEGACY_LANGUAGE_MAP: Record<string, string> = {
70
- PT: 'pt-BR',
71
- pt: 'pt-BR',
72
- EN: 'en',
73
- 'en-US': 'en',
74
- ES: 'es',
75
- };
76
-
77
- // ─────────────────────────────────────────────────────────────────────────────
78
- // Context
79
- // ─────────────────────────────────────────────────────────────────────────────
80
-
81
- const LanguageContext = createContext<LanguageContextType | undefined>(undefined);
82
-
83
- // ─────────────────────────────────────────────────────────────────────────────
84
- // Provider
85
- // ─────────────────────────────────────────────────────────────────────────────
86
-
87
- export interface LanguageProviderProps {
88
- children: ReactNode;
89
- /**
90
- * List of languages available to this app. The first item is the default
91
- * when no saved preference exists. Pass a single-item array to lock the
92
- * app to one language (the LanguageSelector will hide itself automatically).
93
- * Defaults to `DEFAULT_LANGUAGES` (pt-BR, en, es) when omitted.
94
- *
95
- * @example
96
- * ```tsx
97
- * // Monolingual English app
98
- * <LanguageProvider availableLanguages={[{ code: 'en', label: 'English' }]}>
99
- * ```
100
- *
101
- * @example
102
- * ```tsx
103
- * // Add French alongside the built-in languages
104
- * import fr from './locales/fr.json';
105
- *
106
- * <LanguageProvider availableLanguages={[
107
- * ...DEFAULT_LANGUAGES,
108
- * { code: 'fr', label: 'Français', shortLabel: 'FR', resources: fr },
109
- * ]}>
110
- * ```
111
- */
112
- availableLanguages?: LanguageDefinition[];
113
- /**
114
- * Override the default language. Falls back to the first item in
115
- * `availableLanguages` when omitted.
116
- */
117
- defaultLanguage?: Language;
118
- }
119
-
120
- export function LanguageProvider({
121
- children,
122
- availableLanguages = DEFAULT_LANGUAGES,
123
- defaultLanguage,
124
- }: LanguageProviderProps) {
125
- // Hard guard: empty array is almost always a consumer mistake. Throwing here
126
- // surfaces the bug at provider mount instead of letting the app silently fall
127
- // back to DEFAULT_LANGUAGES (which would, in turn, surprise monolingual apps
128
- // that meant to pass `[{code:'en',...}]` but accidentally passed `[]`).
129
- if (availableLanguages.length === 0) {
130
- throw new Error(
131
- 'LanguageProvider: `availableLanguages` cannot be empty. Pass at least one ' +
132
- 'LanguageDefinition or omit the prop to use DEFAULT_LANGUAGES.'
133
- );
134
- }
135
- const languages = availableLanguages;
136
-
137
- // useQueryClient() works because LanguageProvider is always rendered inside
138
- // <QueryClientProvider> (both in App.tsx and via XerticaProvider in templates).
139
- const queryClient = useQueryClient();
140
-
141
- // Stable "signature" of the configured languages — string of comma-joined
142
- // codes. This prevents the effect below (and downstream `useMemo`) from
143
- // firing every render when a consumer passes `availableLanguages={[...]}`
144
- // inline (a fresh array reference on every render).
145
- const languageCodesKey = useMemo(() => languages.map(l => l.code).join(','), [languages]);
146
-
147
- // Register any locale `resources` carried by language definitions. This
148
- // allows consumers to ship new locales without editing `i18n.ts`.
149
- useEffect(() => {
150
- for (const lang of languages) {
151
- if (lang.resources && !i18n.hasResourceBundle(lang.code, 'translation')) {
152
- i18n.addResourceBundle(lang.code, 'translation', lang.resources, true, true);
153
- }
154
- }
155
- // `languageCodesKey` is a stable string signature; only re-runs when the
156
- // set of configured language codes actually changes.
157
- // eslint-disable-next-line react-hooks/exhaustive-deps
158
- }, [languageCodesKey]);
159
-
160
- const resolvedDefault = defaultLanguage ?? languages[0].code;
161
-
162
- const [language, setLanguageState] = useState<Language>(() => {
163
- const saved =
164
- typeof window !== 'undefined' ? window.localStorage?.getItem(STORAGE_KEY) : null;
165
-
166
- // Direct match against configured languages
167
- if (saved && languages.some(l => l.code === saved)) {
168
- return saved;
169
- }
170
-
171
- // Legacy migration
172
- if (saved && LEGACY_LANGUAGE_MAP[saved]) {
173
- const migrated = LEGACY_LANGUAGE_MAP[saved];
174
- if (languages.some(l => l.code === migrated)) {
175
- return migrated;
176
- }
177
- }
178
-
179
- return resolvedDefault;
180
- });
181
-
182
- /** Change language: persists to localStorage, updates i18next, and invalidates
183
- * the React Query cache so any query whose result contains translated strings
184
- * is refetched in the new language on next render.
185
- *
186
- * Components using `useTranslation()` already update instantly (i18next notifies
187
- * them). Queries using `useFeatureCards()` / `useAssistantConfig()` etc. also
188
- * update instantly because language is included in their queryKey switching
189
- * language means a new key → cache miss → immediate refetch.
190
- *
191
- * Wrapped in `useCallback` so that consumers destructuring `setLanguage` and
192
- * passing it into effect dependency arrays get a stable reference. */
193
- const setLanguage = useCallback(
194
- (lang: Language) => {
195
- // Silently no-op if the requested language is not registered.
196
- if (!languages.some(l => l.code === lang)) {
197
- if (typeof console !== 'undefined') {
198
- console.warn(
199
- `[LanguageProvider] Language "${lang}" is not in availableLanguages — ignoring.`
200
- );
201
- }
202
- return;
203
- }
204
- setLanguageState(lang);
205
- window.localStorage?.setItem(STORAGE_KEY, lang);
206
- i18n.changeLanguage(lang);
207
- // Defensive invalidation: refetches any query that didn't include language
208
- // in its queryKey and would otherwise serve stale translated strings.
209
- queryClient.invalidateQueries();
210
- },
211
- // Depend on the stable codes signature instead of the `languages` array
212
- // reference so the callback identity remains stable across inline-prop renders.
213
- // eslint-disable-next-line react-hooks/exhaustive-deps
214
- [languageCodesKey, queryClient]
215
- );
216
-
217
- // Sync i18next on mount in case the page refreshed with a saved language
218
- useEffect(() => {
219
- if (i18n.language !== language) {
220
- i18n.changeLanguage(language);
221
- }
222
- // eslint-disable-next-line react-hooks/exhaustive-deps
223
- }, []); // mount-only — i18n.ts already reads localStorage for the initial lng
224
-
225
- const value = useMemo<LanguageContextType>(
226
- () => ({
227
- language,
228
- setLanguage,
229
- availableLanguages: languages,
230
- isMonolingual: languages.length <= 1,
231
- }),
232
- // `setLanguage` is stable thanks to useCallback above; `languages` is gated
233
- // by `languageCodesKey` so that inline-array consumers don't thrash the memo.
234
- // eslint-disable-next-line react-hooks/exhaustive-deps
235
- [language, setLanguage, languageCodesKey]
236
- );
237
-
238
- return <LanguageContext.Provider value={value}>{children}</LanguageContext.Provider>;
239
- }
240
-
241
- // ─────────────────────────────────────────────────────────────────────────────
242
- // Hook
243
- // ─────────────────────────────────────────────────────────────────────────────
244
-
245
- export function useLanguage() {
246
- const context = useContext(LanguageContext);
247
- if (context === undefined) {
248
- throw new Error('useLanguage must be used within a LanguageProvider');
249
- }
250
- return context;
251
- }
1
+ import React, {
2
+ createContext,
3
+ useCallback,
4
+ useContext,
5
+ useEffect,
6
+ useMemo,
7
+ useState,
8
+ type ReactNode,
9
+ } from 'react';
10
+ import i18n from '../i18n';
11
+ import { useQueryClient } from '@tanstack/react-query';
12
+
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ // Types
15
+ // ─────────────────────────────────────────────────────────────────────────────
16
+
17
+ /**
18
+ * Language code — any string is allowed so consumers can extend with their own
19
+ * locales (e.g. `'fr'`, `'de'`, `'ja'`). The library ships with built-in
20
+ * support for `'pt-BR'`, `'en'`, and `'es'`, but those are recommendations not
21
+ * restrictions.
22
+ */
23
+ export type Language = string;
24
+
25
+ /**
26
+ * Descriptor for a single language available in the picker.
27
+ */
28
+ export interface LanguageDefinition {
29
+ /** ISO/BCP-47 code stored in localStorage and passed to i18n.changeLanguage() */
30
+ code: Language;
31
+ /** Full display label shown in the LanguageSelector dropdown */
32
+ label: string;
33
+ /** Short label shown in `variant="minimal"` (e.g. "PT", "EN") */
34
+ shortLabel?: string;
35
+ /** Optional translation JSON. When provided, it is registered with i18next
36
+ * on mount so dynamically added locales are loaded automatically.
37
+ * Use a plain object matching your `pt-BR.json` shape. */
38
+ resources?: Record<string, unknown>;
39
+ }
40
+
41
+ interface LanguageContextType {
42
+ /** Currently active language code */
43
+ language: Language;
44
+ /** Change the active language (persists + updates i18n + invalidates queries) */
45
+ setLanguage: (language: Language) => void;
46
+ /** All languages registered for this app */
47
+ availableLanguages: LanguageDefinition[];
48
+ /** True when only a single language is configured — UI can hide selectors */
49
+ isMonolingual: boolean;
50
+ }
51
+
52
+ // ─────────────────────────────────────────────────────────────────────────────
53
+ // Defaults
54
+ // ─────────────────────────────────────────────────────────────────────────────
55
+
56
+ /**
57
+ * Default language set when no `availableLanguages` prop is provided.
58
+ * These are the locales the library ships with out-of-the-box.
59
+ */
60
+ export const DEFAULT_LANGUAGES: LanguageDefinition[] = [
61
+ { code: 'pt-BR', label: 'Português (BR)', shortLabel: 'PT' },
62
+ { code: 'en', label: 'English', shortLabel: 'EN' },
63
+ { code: 'es', label: 'Español', shortLabel: 'ES' },
64
+ ];
65
+
66
+ const STORAGE_KEY = 'xertica_language';
67
+
68
+ // Maps legacy localStorage values (from older versions) to canonical codes.
69
+ const LEGACY_LANGUAGE_MAP: Record<string, string> = {
70
+ PT: 'pt-BR',
71
+ pt: 'pt-BR',
72
+ EN: 'en',
73
+ 'en-US': 'en',
74
+ ES: 'es',
75
+ };
76
+
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ // Context
79
+ // ─────────────────────────────────────────────────────────────────────────────
80
+
81
+ const LanguageContext = createContext<LanguageContextType | undefined>(undefined);
82
+
83
+ // ─────────────────────────────────────────────────────────────────────────────
84
+ // Provider
85
+ // ─────────────────────────────────────────────────────────────────────────────
86
+
87
+ export interface LanguageProviderProps {
88
+ children: ReactNode;
89
+ /**
90
+ * List of languages available to this app. The first item is the default
91
+ * when no saved preference exists. Pass a single-item array to lock the
92
+ * app to one language (the LanguageSelector will hide itself automatically).
93
+ * Defaults to `DEFAULT_LANGUAGES` (pt-BR, en, es) when omitted.
94
+ *
95
+ * @example
96
+ * ```tsx
97
+ * // Monolingual English app
98
+ * <LanguageProvider availableLanguages={[{ code: 'en', label: 'English' }]}>
99
+ * ```
100
+ *
101
+ * @example
102
+ * ```tsx
103
+ * // Add French alongside the built-in languages
104
+ * import fr from './locales/fr.json';
105
+ *
106
+ * <LanguageProvider availableLanguages={[
107
+ * ...DEFAULT_LANGUAGES,
108
+ * { code: 'fr', label: 'Français', shortLabel: 'FR', resources: fr },
109
+ * ]}>
110
+ * ```
111
+ */
112
+ availableLanguages?: LanguageDefinition[];
113
+ /**
114
+ * Override the default language. Falls back to the first item in
115
+ * `availableLanguages` when omitted.
116
+ */
117
+ defaultLanguage?: Language;
118
+ }
119
+
120
+ export function LanguageProvider({
121
+ children,
122
+ availableLanguages = DEFAULT_LANGUAGES,
123
+ defaultLanguage,
124
+ }: LanguageProviderProps) {
125
+ // Hard guard: empty array is almost always a consumer mistake. Throwing here
126
+ // surfaces the bug at provider mount instead of letting the app silently fall
127
+ // back to DEFAULT_LANGUAGES (which would, in turn, surprise monolingual apps
128
+ // that meant to pass `[{code:'en',...}]` but accidentally passed `[]`).
129
+ if (availableLanguages.length === 0) {
130
+ throw new Error(
131
+ 'LanguageProvider: `availableLanguages` cannot be empty. Pass at least one ' +
132
+ 'LanguageDefinition or omit the prop to use DEFAULT_LANGUAGES.'
133
+ );
134
+ }
135
+ const languages = availableLanguages;
136
+
137
+ // useQueryClient() works because LanguageProvider is always rendered inside
138
+ // <QueryClientProvider> (both in App.tsx and via XerticaProvider in templates).
139
+ const queryClient = useQueryClient();
140
+
141
+ // Stable "signature" of the configured languages — string of comma-joined
142
+ // codes. This prevents the effect below (and downstream `useMemo`) from
143
+ // firing every render when a consumer passes `availableLanguages={[...]}`
144
+ // inline (a fresh array reference on every render).
145
+ const languageCodesKey = useMemo(() => languages.map(l => l.code).join(','), [languages]);
146
+
147
+ // Register any locale `resources` carried by language definitions. This
148
+ // allows consumers to ship new locales without editing `i18n.ts`.
149
+ useEffect(() => {
150
+ for (const lang of languages) {
151
+ if (lang.resources && !i18n.hasResourceBundle(lang.code, 'translation')) {
152
+ i18n.addResourceBundle(lang.code, 'translation', lang.resources, true, true);
153
+ }
154
+ }
155
+ // `languageCodesKey` is a stable string signature; only re-runs when the
156
+ // set of configured language codes actually changes.
157
+ // eslint-disable-next-line react-hooks/exhaustive-deps
158
+ }, [languageCodesKey]);
159
+
160
+ const resolvedDefault = defaultLanguage ?? languages[0].code;
161
+
162
+ const [language, setLanguageState] = useState<Language>(() => {
163
+ const saved = typeof window !== 'undefined' ? window.localStorage?.getItem(STORAGE_KEY) : null;
164
+
165
+ // Direct match against configured languages
166
+ if (saved && languages.some(l => l.code === saved)) {
167
+ return saved;
168
+ }
169
+
170
+ // Legacy migration
171
+ if (saved && LEGACY_LANGUAGE_MAP[saved]) {
172
+ const migrated = LEGACY_LANGUAGE_MAP[saved];
173
+ if (languages.some(l => l.code === migrated)) {
174
+ return migrated;
175
+ }
176
+ }
177
+
178
+ return resolvedDefault;
179
+ });
180
+
181
+ /** Change language: persists to localStorage, updates i18next, and invalidates
182
+ * the React Query cache so any query whose result contains translated strings
183
+ * is refetched in the new language on next render.
184
+ *
185
+ * Components using `useTranslation()` already update instantly (i18next notifies
186
+ * them). Queries using `useFeatureCards()` / `useAssistantConfig()` etc. also
187
+ * update instantly because language is included in their queryKey — switching
188
+ * language means a new key cache miss immediate refetch.
189
+ *
190
+ * Wrapped in `useCallback` so that consumers destructuring `setLanguage` and
191
+ * passing it into effect dependency arrays get a stable reference. */
192
+ const setLanguage = useCallback(
193
+ (lang: Language) => {
194
+ // Silently no-op if the requested language is not registered.
195
+ if (!languages.some(l => l.code === lang)) {
196
+ if (typeof console !== 'undefined') {
197
+ console.warn(
198
+ `[LanguageProvider] Language "${lang}" is not in availableLanguages — ignoring.`
199
+ );
200
+ }
201
+ return;
202
+ }
203
+ setLanguageState(lang);
204
+ window.localStorage?.setItem(STORAGE_KEY, lang);
205
+ i18n.changeLanguage(lang);
206
+ // Defensive invalidation: refetches any query that didn't include language
207
+ // in its queryKey and would otherwise serve stale translated strings.
208
+ queryClient.invalidateQueries();
209
+ },
210
+ // Depend on the stable codes signature instead of the `languages` array
211
+ // reference so the callback identity remains stable across inline-prop renders.
212
+ // eslint-disable-next-line react-hooks/exhaustive-deps
213
+ [languageCodesKey, queryClient]
214
+ );
215
+
216
+ // Sync i18next on mount in case the page refreshed with a saved language
217
+ useEffect(() => {
218
+ if (i18n.language !== language) {
219
+ i18n.changeLanguage(language);
220
+ }
221
+ // eslint-disable-next-line react-hooks/exhaustive-deps
222
+ }, []); // mount-only — i18n.ts already reads localStorage for the initial lng
223
+
224
+ const value = useMemo<LanguageContextType>(
225
+ () => ({
226
+ language,
227
+ setLanguage,
228
+ availableLanguages: languages,
229
+ isMonolingual: languages.length <= 1,
230
+ }),
231
+ // `setLanguage` is stable thanks to useCallback above; `languages` is gated
232
+ // by `languageCodesKey` so that inline-array consumers don't thrash the memo.
233
+ // eslint-disable-next-line react-hooks/exhaustive-deps
234
+ [language, setLanguage, languageCodesKey]
235
+ );
236
+
237
+ return <LanguageContext.Provider value={value}>{children}</LanguageContext.Provider>;
238
+ }
239
+
240
+ // ─────────────────────────────────────────────────────────────────────────────
241
+ // Hook
242
+ // ─────────────────────────────────────────────────────────────────────────────
243
+
244
+ export function useLanguage() {
245
+ const context = useContext(LanguageContext);
246
+ if (context === undefined) {
247
+ throw new Error('useLanguage must be used within a LanguageProvider');
248
+ }
249
+ return context;
250
+ }
@@ -11,7 +11,7 @@ const TogglePrimitive = require("@radix-ui/react-toggle");
11
11
  const inputOtp = require("input-otp");
12
12
  const reactSlot = require("@radix-ui/react-slot");
13
13
  const reactHookForm = require("react-hook-form");
14
- const alertDialog = require("./alert-dialog-DSKByiKZ.cjs");
14
+ const alertDialog = require("./alert-dialog-yckpaOpy.cjs");
15
15
  const reactDayPicker = require("react-day-picker");
16
16
  const DialogPrimitive = require("@radix-ui/react-dialog");
17
17
  const vaul = require("vaul");
@@ -24,7 +24,7 @@ const card = require("./card-DJTsYhLL.cjs");
24
24
  const CollapsiblePrimitive = require("@radix-ui/react-collapsible");
25
25
  const AccordionPrimitive = require("@radix-ui/react-accordion");
26
26
  const useEmblaCarousel = require("embla-carousel-react");
27
- const googleMapsLoader = require("./google-maps-loader-Y-QkD-Li.cjs");
27
+ const googleMapsLoader = require("./google-maps-loader-BqsYL48U.cjs");
28
28
  const RechartsPrimitive = require("recharts");
29
29
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
30
30
  function _interopNamespaceDefault(e) {
@@ -2939,7 +2939,7 @@ const Search = React__namespace.forwardRef(
2939
2939
  }
2940
2940
  );
2941
2941
  Search.displayName = "Search";
2942
- const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_GEMINI_API_KEY": "AIzaSyBnoWKe4LjQzlIklON_dVXMXNUl2gvfH6U", "VITE_GOOGLE_MAPS_API_KEY": "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" };
2942
+ const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false };
2943
2943
  const RouteMapContent = React.forwardRef(
2944
2944
  ({ apiKey, ...props }, ref) => {
2945
2945
  const { isLoaded, loadError, load } = googleMapsLoader.useGoogleMapsLoader();
@@ -3116,7 +3116,7 @@ RouteMapContent.displayName = "RouteMapContent";
3116
3116
  const RouteMap = React.forwardRef(
3117
3117
  (props, ref) => {
3118
3118
  const { isLoaded, loadError } = googleMapsLoader.useGoogleMapsLoader();
3119
- const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-DoZCyS5r.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" || "";
3119
+ const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-9w31gdAb.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && void 0 || "";
3120
3120
  const isValidKey = effectiveApiKey && effectiveApiKey !== "YOUR_GOOGLE_MAPS_API_KEY_HERE" && effectiveApiKey.startsWith("AIza");
3121
3121
  if (isLoaded || isValidKey || loadError) {
3122
3122
  return /* @__PURE__ */ jsxRuntime.jsx(RouteMapContent, { ref, ...props, apiKey: effectiveApiKey });
@@ -11,7 +11,7 @@ const TogglePrimitive = require("@radix-ui/react-toggle");
11
11
  const inputOtp = require("input-otp");
12
12
  const reactSlot = require("@radix-ui/react-slot");
13
13
  const reactHookForm = require("react-hook-form");
14
- const alertDialog = require("./alert-dialog-DSKByiKZ.cjs");
14
+ const alertDialog = require("./alert-dialog-yckpaOpy.cjs");
15
15
  const reactDayPicker = require("react-day-picker");
16
16
  const DialogPrimitive = require("@radix-ui/react-dialog");
17
17
  const vaul = require("vaul");
@@ -19,12 +19,12 @@ const HoverCardPrimitive = require("@radix-ui/react-hover-card");
19
19
  const ContextMenuPrimitive = require("@radix-ui/react-context-menu");
20
20
  const MenubarPrimitive = require("@radix-ui/react-menubar");
21
21
  const cmdk = require("cmdk");
22
- const richTextEditor = require("./rich-text-editor-mWoaSCE4.cjs");
22
+ const richTextEditor = require("./rich-text-editor-GS2kpTAK.cjs");
23
23
  const card = require("./card-DJTsYhLL.cjs");
24
24
  const CollapsiblePrimitive = require("@radix-ui/react-collapsible");
25
25
  const AccordionPrimitive = require("@radix-ui/react-accordion");
26
26
  const useEmblaCarousel = require("embla-carousel-react");
27
- const googleMapsLoader = require("./google-maps-loader-Y-QkD-Li.cjs");
27
+ const googleMapsLoader = require("./google-maps-loader-BqsYL48U.cjs");
28
28
  const RechartsPrimitive = require("recharts");
29
29
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
30
30
  function _interopNamespaceDefault(e) {
@@ -3162,7 +3162,7 @@ const Search = React__namespace.forwardRef(
3162
3162
  }
3163
3163
  );
3164
3164
  Search.displayName = "Search";
3165
- const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_GEMINI_API_KEY": "AIzaSyBnoWKe4LjQzlIklON_dVXMXNUl2gvfH6U", "VITE_GOOGLE_MAPS_API_KEY": "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" };
3165
+ const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false };
3166
3166
  const RouteMapContent = React.forwardRef(
3167
3167
  ({ apiKey, ...props }, ref) => {
3168
3168
  const { isLoaded, loadError, load } = googleMapsLoader.useGoogleMapsLoader();
@@ -3339,7 +3339,7 @@ RouteMapContent.displayName = "RouteMapContent";
3339
3339
  const RouteMap = React.forwardRef(
3340
3340
  (props, ref) => {
3341
3341
  const { isLoaded, loadError } = googleMapsLoader.useGoogleMapsLoader();
3342
- const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-CldVCVDe.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" || "";
3342
+ const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-BAudAfne.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && void 0 || "";
3343
3343
  const isValidKey = effectiveApiKey && effectiveApiKey !== "YOUR_GOOGLE_MAPS_API_KEY_HERE" && effectiveApiKey.startsWith("AIza");
3344
3344
  if (isLoaded || isValidKey || loadError) {
3345
3345
  return /* @__PURE__ */ jsxRuntime.jsx(RouteMapContent, { ref, ...props, apiKey: effectiveApiKey });