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,603 +1,616 @@
1
- # Getting Started — Xertica UI
2
-
3
- Welcome to the Xertica UI ecosystem. This library provides an enterprise-grade React component system for building business applications — dashboards, management panels, data-heavy CRUD interfaces, and AI-powered tools.
4
-
5
- ---
6
-
7
- ## For AI Agents
8
-
9
- If you are an AI agent (such as Antigravity, Cursor, or Copilot) tasked with adding features to a project that already uses `xertica-ui`:
10
-
11
- 1. **Start at `docs/llms.md`** — it's the master index and reading guide.
12
- 2. **Read `docs/ai-usage.md`** before writing any code — it contains strict rules about what is permitted.
13
- 3. **Use what exists** — browse `/docs/components` before creating any custom component.
14
- 4. **Follow patterns** — `/docs/patterns` contains pre-validated recipes for common page types.
15
- 5. **Never violate guidelines** — `/docs/guidelines.md` defines the visual language of the system.
16
-
17
- ---
18
-
19
- ## For Human Developers
20
-
21
- ### Prerequisites
22
-
23
- - Node.js >= 18
24
- - React >= 18
25
- - A project initialized with Vite, Next.js, or CRA
26
-
27
- ### Step 1 — Initialize a New Project (CLI)
28
-
29
- If starting from scratch, use the CLI to scaffold a fully configured project:
30
-
31
- ```bash
32
- npx xertica-ui@latest init
33
- ```
34
-
35
- The CLI walks you through an interactive setup:
36
-
37
- | Prompt | Choices |
38
- |---|---|
39
- | Pages to include | Login, Home, Template (multi-select) |
40
- | Languages to support | pt-BR, English, Español (multi-select, min 1) |
41
- | Default color theme | Xertica, Slate, Blue, Violet, Rose, Emerald, … |
42
- | **Include AI Assistant** | yes (default) / no |
43
- | Install dependencies | yes / no |
44
-
45
- This command:
46
-
47
- - Creates the project structure with FSD/FDA architecture
48
- - Installs all dependencies
49
- - Configures Tailwind CSS v4
50
- - Injects the theme token system (`tokens.css`)
51
- - Copies only the locale files for the selected languages
52
- - Conditionally scaffolds the AI Assistant (`AssistantPage`, `features/assistant/`) based on your answer
53
- - Persists your choices in `src/locales/.languages.json` and `.xertica.json`
54
-
55
- ### Step 1b — Update an Existing Project (CLI)
56
-
57
- Run `update` to change individual aspects without reinitializing:
58
-
59
- ```bash
60
- npx xertica-ui@latest update
61
- ```
62
-
63
- The menu offers:
64
-
65
- | Option | What it does |
66
- |---|---|
67
- | **Theme only** | Re-prompts for color theme, overwrites `tokens.css` |
68
- | **Languages** | Add/remove language support, regenerates `i18n.ts` and `App.tsx` |
69
- | **Assistant** | Add or remove the AI Assistant (copies/deletes files, regenerates `AuthGuard.tsx`, `HomePage.tsx`, `TemplatePage.tsx`) |
70
- | **Project files** | Updates `app/`, `shared/`, `features/`, `pages/` to a newer version |
71
-
72
- > **Tip:** You can also manually edit `src/styles/xertica/tokens.css` to tweak individual color values — the file is fully commented and designed to be human-readable.
73
-
74
- ### Step 2Install in an Existing Project
75
-
76
- ```bash
77
- npm install xertica-ui
78
- ```
79
-
80
- Then follow the manual setup in `docs/installation.md`.
81
-
82
- ---
83
-
84
- ## Provider Setup
85
-
86
- The **single most critical setup step** is wrapping your app in both `<QueryClientProvider>` and `<XerticaProvider>`. Add `<AuthProvider>` inside the router for authentication state.
87
-
88
- ```tsx
89
- // App.tsx
90
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
91
- import { XerticaProvider } from 'xertica-ui/brand';
92
- import { BrowserRouter as Router } from 'react-router-dom';
93
- import { AuthProvider } from './app/context/AuthContext';
94
- import { AppErrorBoundary, PageErrorBoundary } from './shared/error-boundary';
95
- import 'xertica-ui/style.css';
96
-
97
- const queryClient = new QueryClient({
98
- defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false } },
99
- });
100
-
101
- function App() {
102
- return (
103
- <AppErrorBoundary> {/* catches provider/context crashes */}
104
- <QueryClientProvider client={queryClient}>
105
- <XerticaProvider>
106
- <Router>
107
- <AuthProvider> {/* must be inside Router */}
108
- <PageErrorBoundary> {/* catches lazy-chunk + page errors */}
109
- <YourRoutes />
110
- </PageErrorBoundary>
111
- </AuthProvider>
112
- </Router>
113
- </XerticaProvider>
114
- </QueryClientProvider>
115
- </AppErrorBoundary>
116
- );
117
- }
118
- ```
119
-
120
- `XerticaProvider` initializes:
121
-
122
- - **Theme system** (dark/light mode with token injection)
123
- - **Toast notifications** (Sonner, rendered via portal)
124
- - **Tooltip provider** (wraps Radix TooltipProvider)
125
- - **Layout context** (`useLayout()` hook for sidebar state)
126
- - **AI Assistant context** (if using `XerticaAssistant`)
127
- - **Language context** (`useLanguage()` hook + i18next sync) — defaults to `pt-BR`, `en`, `es`
128
- - **Google Maps loader** (lazy, only activates if `googleMapsApiKey` is provided)
129
-
130
- `QueryClientProvider` enables React Query for all server state (see [State Management](./state-management.md)).
131
-
132
- `AuthProvider` manages the authentication session — see [Authentication](#authentication) below.
133
-
134
- ### Configuring languages
135
-
136
- By default, `<XerticaProvider>` enables the three built-in languages. Pass `availableLanguages` to override — for example, to lock the app to a single language (the `LanguageSelector` auto-hides) or to add custom locales:
137
-
138
- ```tsx
139
- import { XerticaProvider, DEFAULT_LANGUAGES } from 'xertica-ui';
140
- import fr from './locales/fr.json';
141
-
142
- // Monolingual English
143
- <XerticaProvider availableLanguages={[{ code: 'en', label: 'English' }]}>
144
-
145
- // Three defaults + French
146
- <XerticaProvider
147
- availableLanguages={[
148
- ...DEFAULT_LANGUAGES,
149
- { code: 'fr', label: 'Français', shortLabel: 'FR', resources: fr },
150
- ]}
151
- >
152
- ```
153
-
154
- See [`docs/i18n.md`](./i18n.md) for the full `LanguageDefinition` and `registerLanguageResource` API.
155
-
156
- ### Provider Props
157
-
158
- | Prop | Type | Description |
159
- | ---------- | ----------- | --------------------------- |
160
- | `children` | `ReactNode` | Application content to wrap |
161
-
162
- ---
163
-
164
- ## Authentication
165
-
166
- Authentication state is managed by `AuthContext`. Wrap your route tree with `<AuthProvider>` (inside `<Router>`) to expose `useAuth()` to all pages:
167
-
168
- ```tsx
169
- import { useAuth } from './app/context/AuthContext';
170
-
171
- // Any page or component inside <AuthProvider>
172
- function MyPage() {
173
- const { user, logout } = useAuth();
174
-
175
- return (
176
- <div>
177
- <p>Logged in as {user?.email}</p>
178
- <button onClick={logout}>Sign out</button>
179
- </div>
180
- );
181
- }
182
- ```
183
-
184
- `useAuth()` returns:
185
-
186
- | Property | Type | Description |
187
- | ----------- | ------------------------------------------ | -------------------------------------------- |
188
- | `user` | `AuthUser \| null` | Current user (`email`, `name?`, `avatar?`) |
189
- | `isLoading` | `boolean` | `true` while the session is being hydrated |
190
- | `login` | `(email, password) => boolean` | Attempt login; returns `true` on success |
191
- | `logout` | `() => void` | Clear session and redirect to `/login` |
192
-
193
- ### Route Guards
194
-
195
- Use `ProtectedRoute` and `GuestRoute` wrappers (provided in the CLI-generated `AuthGuard.tsx`):
196
-
197
- ```tsx
198
- // Redirect unauthenticated users to /login
199
- function ProtectedRoute({ children }) {
200
- const { user, isLoading } = useAuth();
201
- if (isLoading) return null; // wait for localStorage hydration
202
- if (!user) return <Navigate to="/login" replace />;
203
- return <>{children}</>;
204
- }
205
-
206
- // Redirect already-authenticated users away from login
207
- function GuestRoute({ children }) {
208
- const { user, isLoading } = useAuth();
209
- if (isLoading) return null;
210
- if (user) return <Navigate to="/home" replace />;
211
- return <>{children}</>;
212
- }
213
- ```
214
-
215
- ---
216
-
217
- ## Lazy Loading
218
-
219
- All routes should use `React.lazy()` + `<Suspense>` to split each page into a separate chunk:
220
-
221
- ```tsx
222
- import React, { Suspense } from 'react';
223
-
224
- const HomePage = React.lazy(() =>
225
- import('./pages/HomePage').then(m => ({ default: m.HomePage }))
226
- );
227
-
228
- function AppRoutes() {
229
- return (
230
- <Suspense fallback={null}>
231
- <Routes>
232
- <Route path="/home" element={<ProtectedRoute><HomePage /></ProtectedRoute>} />
233
- </Routes>
234
- </Suspense>
235
- );
236
- }
237
- ```
238
-
239
- The CLI-generated project configures lazy loading for all routes automatically.
240
-
241
- ---
242
-
243
- ## Error Boundaries
244
-
245
- Wrap your app with `<AppErrorBoundary>` and your route tree with `<PageErrorBoundary>` to prevent crashes from producing blank screens:
246
-
247
- ```tsx
248
- import { AppErrorBoundary, PageErrorBoundary, SectionErrorBoundary } from '@/shared/error-boundary';
249
-
250
- // In App.tsx
251
- <AppErrorBoundary>
252
- <QueryClientProvider client={queryClient}>
253
- <XerticaProvider>
254
- <Router>
255
- <AuthProvider>
256
- <PageErrorBoundary>
257
- <Suspense fallback={null}>
258
- <AuthGuard />
259
- </Suspense>
260
- </PageErrorBoundary>
261
- </AuthProvider>
262
- </Router>
263
- </XerticaProvider>
264
- </QueryClientProvider>
265
- </AppErrorBoundary>
266
-
267
- // In page content sections
268
- <SectionErrorBoundary>
269
- <TeamDataTable />
270
- </SectionErrorBoundary>
271
- ```
272
-
273
- The CLI-generated scaffold adds all three boundaries automatically. See [`docs/components/error-boundary.md`](./components/error-boundary.md) for full API reference.
274
-
275
- ---
276
-
277
- ## Internationalization (i18n)
278
-
279
- The project uses `i18next` + `react-i18next`. All UI strings are translated via `useTranslation()`:
280
-
281
- ```tsx
282
- import { useTranslation } from 'react-i18next';
283
-
284
- function MyPage() {
285
- const { t } = useTranslation();
286
- return <h1>{t('home.welcome')}</h1>;
287
- }
288
- ```
289
-
290
- The `LanguageSelector` component (rendered by `Header` via `showLanguageSelector`) drives language switching and is wired to `LanguageContext` + `i18next` automatically. See [`docs/i18n.md`](./i18n.md) for setup and locale file structure.
291
-
292
- ---
293
-
294
- ## Theme System
295
-
296
- The design system is token-driven. All colors, radii, and shadows are controlled by CSS custom properties injected at `:root`.
297
-
298
- ### Color Token Semantics
299
-
300
- | Token Class | Usage |
301
- | ------------------------------------------------ | -------------------------------------- |
302
- | `bg-background` / `text-foreground` | Page background and primary text |
303
- | `bg-card` / `text-card-foreground` | Card surfaces |
304
- | `bg-muted` / `text-muted-foreground` | Subdued backgrounds and secondary text |
305
- | `bg-primary` / `text-primary-foreground` | Primary actions (buttons, links) |
306
- | `bg-secondary` / `text-secondary-foreground` | Secondary actions |
307
- | `bg-destructive` / `text-destructive-foreground` | Danger / error states |
308
- | `bg-accent` / `text-accent-foreground` | Hover states |
309
- | `border-border` | Standard borders |
310
- | `border-input` | Form field borders |
311
-
312
- **Always use semantic tokens for semantic/status contexts.** Never use raw hex values (`#3b82f6`, `rgb(...)`) in any context. For error, warning, success, and status states, always use semantic tokens (`bg-destructive`, `bg-success`, `bg-warning`, `text-muted-foreground`). For layout, spacing, and general non-semantic UI, standard Tailwind color utilities are acceptable.
313
-
314
- ### Dark Mode
315
-
316
- The theme responds to the `dark` class on `<html>`. Use the `<ThemeToggle>` component which toggles this class automatically:
317
-
318
- ```tsx
319
- import { ThemeToggle } from 'xertica-ui/brand';
320
-
321
- // Typically placed in Header actions or Sidebar footer
322
- <ThemeToggle />;
323
- ```
324
-
325
- `ThemeToggle` is fully self-contained it reads and writes `document.documentElement.classList` directly and does not require any context provider.
326
-
327
- ### CSS Setup (Critical)
328
-
329
- The consumer's `src/styles/index.css` **must** follow this exact structure for theme tokens to apply correctly:
330
-
331
- ```css
332
- @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@400;500;700&display=swap');
333
-
334
- /* 1. Import the compiled library styles (includes Tailwind base) */
335
- @import 'xertica-ui/style.css';
336
-
337
- /* 2. Import YOUR theme tokens (overrides library defaults) */
338
- @import './xertica/tokens.css';
339
-
340
- /* 3. Tell Tailwind v4 to scan xertica-ui components for class names */
341
- @source '../node_modules/xertica-ui';
342
-
343
- /* 4. Map CSS variables to Tailwind tokens using @theme inline
344
- ⚠️ MUST be `@theme inline` — NOT plain `@theme`.
345
- `@theme inline` keeps var() references dynamic so your tokens.css
346
- overrides cascade correctly into utility classes like bg-destructive. */
347
- @theme inline {
348
- --color-primary: var(--primary);
349
- --color-destructive: var(--destructive);
350
- /* ... full mapping in the generated file */
351
- }
352
- ```
353
-
354
- > **Why `@theme inline`?** Plain `@theme {}` causes Tailwind v4 to compile color tokens **statically** at build time using the library's default values. With `@theme inline`, Tailwind keeps the `var()` references in the output CSS, so your `tokens.css` overrides cascade correctly at runtime. This is why alert colors, sidebar colors, and brand colors were not applying when using the theme selector.
355
-
356
- ---
357
-
358
- ## Layout System
359
-
360
- The layout is managed globally through `LayoutContext`. Use the `useLayout()` hook to access and control layout state in any component:
361
-
362
- ```tsx
363
- import { useLayout } from 'xertica-ui/hooks';
364
-
365
- function MyComponent() {
366
- const {
367
- sidebarExpanded, // boolean
368
- sidebarWidth, // number (px)
369
- setSidebarWidth, // (width: number) => void
370
- toggleSidebar, // () => void
371
- assistenteExpanded,
372
- toggleAssistente,
373
- } = useLayout();
374
- }
375
- ```
376
-
377
- See `docs/layout.md` for the complete reference.
378
-
379
- ---
380
-
381
- ## Routing
382
-
383
- Xertica UI integrates with `react-router-dom` v6. Pass router hooks to navigation components:
384
-
385
- ```tsx
386
- import { useNavigate, useLocation } from 'react-router-dom';
387
- import { Sidebar } from 'xertica-ui/layout';
388
-
389
- function Layout() {
390
- const navigate = useNavigate();
391
- const location = useLocation();
392
-
393
- return (
394
- <Sidebar
395
- navigate={navigate}
396
- location={location}
397
- routes={routes}
398
- // ...
399
- />
400
- );
401
- }
402
- ```
403
-
404
- ---
405
-
406
- ## Component Import
407
-
408
- ### Subpath Imports (v2 — Recommended)
409
-
410
- Xertica UI v2 exposes granular subpath entries for precise, tree-shaken imports:
411
-
412
- ```tsx
413
- import { Button, Card, CardContent, Input, Badge } from 'xertica-ui/ui';
414
- import { Sidebar, Header } from 'xertica-ui/layout';
415
- import { XerticaProvider, XerticaLogo } from 'xertica-ui/brand';
416
- import { XerticaAssistant } from 'xertica-ui/assistant';
417
- import { VideoPlayer } from 'xertica-ui/media';
418
- import { useLayout, useTheme } from 'xertica-ui/hooks';
419
- ```
420
-
421
- ### Root Barrel (Backward Compatible)
422
-
423
- The root entrypoint exports everything and remains fully supported:
424
-
425
- ```tsx
426
- import {
427
- Button,
428
- Card,
429
- CardContent,
430
- CardHeader,
431
- CardTitle,
432
- Input,
433
- Badge,
434
- Table,
435
- TableBody,
436
- TableCell,
437
- TableHead,
438
- TableHeader,
439
- TableRow,
440
- } from 'xertica-ui/ui';
441
- ```
442
-
443
- > **TypeScript note**: Subpath imports require `"moduleResolution": "bundler"` (or `"node16"` / `"nodenext"`) in your `tsconfig.json`.
444
-
445
- Icons are separate — always use `lucide-react`:
446
-
447
- ```tsx
448
- import { Home, Settings, Users, LogOut } from 'lucide-react';
449
- ```
450
-
451
- ---
452
-
453
- ## Troubleshooting
454
-
455
- ### Components render without styles (transparent / unstyled)
456
-
457
- **Cause**: Missing CSS import.
458
-
459
- **Fix**: Add `import 'xertica-ui/style.css'` to your entry file (`main.tsx` or `index.tsx`), **before** your own styles:
460
-
461
- ```tsx
462
- import 'xertica-ui/style.css';
463
- import './styles/index.css'; // your tokens and overrides
464
- ```
465
-
466
- ---
467
-
468
- ### Dark mode doesn't apply
469
-
470
- **Cause**: The `dark` class is not being toggled on `<html>`, or `@theme inline` is missing from your CSS.
471
-
472
- **Fix 1**: Use `<ThemeToggle>` from `xertica-ui/brand` it handles the class toggle automatically.
473
-
474
- **Fix 2**: Ensure your `index.css` uses `@theme inline` (not plain `@theme`):
475
-
476
- ```css
477
- /* ✅ Correct */
478
- @theme inline {
479
- --color-primary: var(--primary);
480
- }
481
-
482
- /* ❌ Wrong — compiles tokens statically, ignoring your tokens.css overrides */
483
- @theme {
484
- --color-primary: var(--primary);
485
- }
486
- ```
487
-
488
- ---
489
-
490
- ### Subpath imports cause TypeScript errors
491
-
492
- **Cause**: `tsconfig.json` uses `"moduleResolution": "node"` which does not support package subpath exports.
493
-
494
- **Fix**: Update `tsconfig.json`:
495
-
496
- ```json
497
- {
498
- "compilerOptions": {
499
- "moduleResolution": "bundler"
500
- }
501
- }
502
- ```
503
-
504
- Alternatively, use `"moduleResolution": "node16"` or `"nodenext"`.
505
-
506
- ---
507
-
508
- ### Toast notifications don't appear
509
-
510
- **Cause**: `<Toaster>` is not mounted, or `<XerticaProvider>` is missing.
511
-
512
- **Fix**: Wrap your app in `<XerticaProvider>` — it auto-injects `<Toaster>`. If you are not using `XerticaProvider`, add `<Toaster />` manually:
513
-
514
- ```tsx
515
- import { Toaster } from 'xertica-ui/ui';
516
-
517
- function App() {
518
- return (
519
- <>
520
- <YourApp />
521
- <Toaster />
522
- </>
523
- );
524
- }
525
- ```
526
-
527
- ---
528
-
529
- ### Dialogs / Modals don't appear
530
-
531
- **Cause**: Missing `<XerticaProvider>` (which includes `TooltipProvider` and portal context).
532
-
533
- **Fix**: Ensure `<XerticaProvider>` wraps the entire application at the root level.
534
-
535
- ---
536
-
537
- ### Google Maps doesn't load
538
-
539
- **Cause**: Missing or invalid `googleMapsApiKey`, or the Maps API script failed to load.
540
-
541
- **Fix**: Pass the key to `XerticaProvider`:
542
-
543
- ```tsx
544
- <XerticaProvider googleMapsApiKey="YOUR_VALID_KEY">
545
- <App />
546
- </XerticaProvider>
547
- ```
548
-
549
- Or use `useApiKey()` to set it at runtime:
550
-
551
- ```tsx
552
- const { setGoogleMapsApiKey, reloadMapsApi } = useApiKey();
553
- setGoogleMapsApiKey('YOUR_KEY');
554
- await reloadMapsApi();
555
- ```
556
-
557
- ---
558
-
559
- ### `useLayout()` throws "must be used within LayoutProvider"
560
-
561
- **Cause**: The component using `useLayout()` is rendered outside `<XerticaProvider>`.
562
-
563
- **Fix**: Ensure `<XerticaProvider>` is an ancestor of all components that use `useLayout()`, `useTheme()`, or any other context hook.
564
-
565
- For components that may be used both inside and outside the provider (e.g., in Storybook), use `useOptionalLayout()` instead — it returns `null` when the context is unavailable.
566
-
567
- ---
568
-
569
- ### Sidebar width causes content overlap
570
-
571
- **Cause**: Content area is not reading `sidebarWidth` from `useLayout()`.
572
-
573
- **Fix**: Apply the sidebar width as a left margin or padding on the main content area:
574
-
575
- ```tsx
576
- const { sidebarWidth } = useLayout();
577
-
578
- <main style={{ marginLeft: sidebarWidth }} className="flex-1 overflow-auto">
579
- {/* content */}
580
- </main>;
581
- ```
582
-
583
- ---
584
-
585
- ### AI Assistant doesn't respond (real mode)
586
-
587
- **Cause**: Missing or invalid Gemini API key.
588
-
589
- **Fix**: Set the Gemini API key via `useApiKey()` or pass it to `XerticaProvider`:
590
-
591
- ```tsx
592
- <XerticaProvider initialGeminiApiKey="YOUR_GEMINI_KEY">
593
- <App />
594
- </XerticaProvider>
595
- ```
596
-
597
- Or use the Settings pattern to let users enter their own key. See [`docs/patterns/settings.md`](./patterns/settings.md).
598
-
599
- For testing without a real API key, use `demoMode={true}` on `XerticaAssistant`:
600
-
601
- ```tsx
602
- <XerticaAssistant demoMode={true} />
603
- ```
1
+ # Getting Started — Xertica UI
2
+
3
+ Welcome to the Xertica UI ecosystem. This library provides an enterprise-grade React component system for building business applications — dashboards, management panels, data-heavy CRUD interfaces, and AI-powered tools.
4
+
5
+ ---
6
+
7
+ ## For AI Agents
8
+
9
+ If you are an AI agent (such as Antigravity, Cursor, or Copilot) tasked with adding features to a project that already uses `xertica-ui`:
10
+
11
+ 1. **Start at `docs/llms.md`** — it's the master index and reading guide.
12
+ 2. **Read `docs/ai-usage.md`** before writing any code — it contains strict rules about what is permitted.
13
+ 3. **Use what exists** — browse `/docs/components` before creating any custom component.
14
+ 4. **Follow patterns** — `/docs/patterns` contains pre-validated recipes for common page types.
15
+ 5. **Never violate guidelines** — `/docs/guidelines.md` defines the visual language of the system.
16
+
17
+ ---
18
+
19
+ ## For Human Developers
20
+
21
+ ### Prerequisites
22
+
23
+ - Node.js >= 18
24
+ - React >= 18
25
+ - A project initialized with Vite, Next.js, or CRA
26
+
27
+ ### Step 1 — Initialize a New Project (CLI)
28
+
29
+ If starting from scratch, use the CLI to scaffold a fully configured project:
30
+
31
+ ```bash
32
+ npx xertica-ui@latest init
33
+ ```
34
+
35
+ The CLI walks you through an interactive setup:
36
+
37
+ | Prompt | Choices |
38
+ | ----------------------------- | ---------------------------------------------- |
39
+ | Pages to include | Login, Home, Template (multi-select) |
40
+ | Languages to support | pt-BR, English, Español (multi-select, min 1) |
41
+ | Default color theme | Xertica, Slate, Blue, Violet, Rose, Emerald, … |
42
+ | **Enable dark mode support?** | yes (default) / no |
43
+ | **Include AI Assistant** | yes (default) / no |
44
+ | Install dependencies | yes / no |
45
+
46
+ This command:
47
+
48
+ - Creates the project structure with FSD/FDA architecture
49
+ - Installs all dependencies
50
+ - Configures Tailwind CSS v4
51
+ - Injects the theme token system (`tokens.css`)
52
+ - Copies only the locale files for the selected languages
53
+ - Conditionally scaffolds the AI Assistant (`AssistantPage`, `features/assistant/`) based on your answer
54
+ - Persists your choices in `src/locales/.languages.json` and `.xertica.json` (e.g. `hasAssistant`, `disableDarkMode`)
55
+
56
+ ### Step 1b — Update an Existing Project (CLI)
57
+
58
+ Run `update` to change individual aspects without reinitializing:
59
+
60
+ ```bash
61
+ npx xertica-ui@latest update
62
+ ```
63
+
64
+ The menu offers:
65
+
66
+ | Option | What it does |
67
+ | ----------------- | ---------------------------------------------------------------------------------------------------------------------- |
68
+ | **Theme only** | Re-prompts for color theme, overwrites `tokens.css` |
69
+ | **Languages** | Add/remove language support, regenerates `i18n.ts` and `App.tsx` |
70
+ | **Dark Mode** | Enable or disable dark mode support (updates `.xertica.json` and regenerates `App.tsx` to set `disableDarkMode` flag) |
71
+ | **Assistant** | Add or remove the AI Assistant (copies/deletes files, regenerates `AuthGuard.tsx`, `HomePage.tsx`, `TemplatePage.tsx`) |
72
+ | **Project files** | Updates `app/`, `shared/`, `features/`, `pages/` to a newer version |
73
+
74
+ > **Tip:** You can also manually edit `src/styles/xertica/tokens.css` to tweak individual color values the file is fully commented and designed to be human-readable.
75
+
76
+ ### Step 2 — Install in an Existing Project
77
+
78
+ ```bash
79
+ npm install xertica-ui
80
+ ```
81
+
82
+ Then follow the manual setup in `docs/installation.md`.
83
+
84
+ ---
85
+
86
+ ## Provider Setup
87
+
88
+ The **single most critical setup step** is wrapping your app in both `<QueryClientProvider>` and `<XerticaProvider>`. Add `<AuthProvider>` inside the router for authentication state.
89
+
90
+ ```tsx
91
+ // App.tsx
92
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
93
+ import { XerticaProvider } from 'xertica-ui/brand';
94
+ import { BrowserRouter as Router } from 'react-router-dom';
95
+ import { AuthProvider } from './app/context/AuthContext';
96
+ import { AppErrorBoundary, PageErrorBoundary } from './shared/error-boundary';
97
+ import 'xertica-ui/style.css';
98
+
99
+ const queryClient = new QueryClient({
100
+ defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false } },
101
+ });
102
+
103
+ function App() {
104
+ return (
105
+ <AppErrorBoundary>
106
+ {' '}
107
+ {/* catches provider/context crashes */}
108
+ <QueryClientProvider client={queryClient}>
109
+ <XerticaProvider>
110
+ <Router>
111
+ <AuthProvider>
112
+ {' '}
113
+ {/* must be inside Router */}
114
+ <PageErrorBoundary>
115
+ {' '}
116
+ {/* catches lazy-chunk + page errors */}
117
+ <YourRoutes />
118
+ </PageErrorBoundary>
119
+ </AuthProvider>
120
+ </Router>
121
+ </XerticaProvider>
122
+ </QueryClientProvider>
123
+ </AppErrorBoundary>
124
+ );
125
+ }
126
+ ```
127
+
128
+ `XerticaProvider` initializes:
129
+
130
+ - **Theme system** (dark/light mode with token injection)
131
+ - **Toast notifications** (Sonner, rendered via portal)
132
+ - **Tooltip provider** (wraps Radix TooltipProvider)
133
+ - **Layout context** (`useLayout()` hook for sidebar state)
134
+ - **AI Assistant context** (if using `XerticaAssistant`)
135
+ - **Language context** (`useLanguage()` hook + i18next sync) — defaults to `pt-BR`, `en`, `es`
136
+ - **Google Maps loader** (lazy, only activates if `googleMapsApiKey` is provided)
137
+
138
+ `QueryClientProvider` enables React Query for all server state (see [State Management](./state-management.md)).
139
+
140
+ `AuthProvider` manages the authentication session — see [Authentication](#authentication) below.
141
+
142
+ ### Configuring languages
143
+
144
+ By default, `<XerticaProvider>` enables the three built-in languages. Pass `availableLanguages` to override — for example, to lock the app to a single language (the `LanguageSelector` auto-hides) or to add custom locales:
145
+
146
+ ```tsx
147
+ import { XerticaProvider, DEFAULT_LANGUAGES } from 'xertica-ui';
148
+ import fr from './locales/fr.json';
149
+
150
+ // Monolingual English
151
+ <XerticaProvider availableLanguages={[{ code: 'en', label: 'English' }]}>
152
+
153
+ // Three defaults + French
154
+ <XerticaProvider
155
+ availableLanguages={[
156
+ ...DEFAULT_LANGUAGES,
157
+ { code: 'fr', label: 'Français', shortLabel: 'FR', resources: fr },
158
+ ]}
159
+ >
160
+ ```
161
+
162
+ See [`docs/i18n.md`](./i18n.md) for the full `LanguageDefinition` and `registerLanguageResource` API.
163
+
164
+ ### Provider Props
165
+
166
+ | Prop | Type | Description |
167
+ | ---------- | ----------- | --------------------------- |
168
+ | `children` | `ReactNode` | Application content to wrap |
169
+
170
+ ---
171
+
172
+ ## Authentication
173
+
174
+ Authentication state is managed by `AuthContext`. Wrap your route tree with `<AuthProvider>` (inside `<Router>`) to expose `useAuth()` to all pages:
175
+
176
+ ```tsx
177
+ import { useAuth } from './app/context/AuthContext';
178
+
179
+ // Any page or component inside <AuthProvider>
180
+ function MyPage() {
181
+ const { user, logout } = useAuth();
182
+
183
+ return (
184
+ <div>
185
+ <p>Logged in as {user?.email}</p>
186
+ <button onClick={logout}>Sign out</button>
187
+ </div>
188
+ );
189
+ }
190
+ ```
191
+
192
+ `useAuth()` returns:
193
+
194
+ | Property | Type | Description |
195
+ | ----------- | ------------------------------ | ------------------------------------------ |
196
+ | `user` | `AuthUser \| null` | Current user (`email`, `name?`, `avatar?`) |
197
+ | `isLoading` | `boolean` | `true` while the session is being hydrated |
198
+ | `login` | `(email, password) => boolean` | Attempt login; returns `true` on success |
199
+ | `logout` | `() => void` | Clear session and redirect to `/login` |
200
+
201
+ ### Route Guards
202
+
203
+ Use `ProtectedRoute` and `GuestRoute` wrappers (provided in the CLI-generated `AuthGuard.tsx`):
204
+
205
+ ```tsx
206
+ // Redirect unauthenticated users to /login
207
+ function ProtectedRoute({ children }) {
208
+ const { user, isLoading } = useAuth();
209
+ if (isLoading) return null; // wait for localStorage hydration
210
+ if (!user) return <Navigate to="/login" replace />;
211
+ return <>{children}</>;
212
+ }
213
+
214
+ // Redirect already-authenticated users away from login
215
+ function GuestRoute({ children }) {
216
+ const { user, isLoading } = useAuth();
217
+ if (isLoading) return null;
218
+ if (user) return <Navigate to="/home" replace />;
219
+ return <>{children}</>;
220
+ }
221
+ ```
222
+
223
+ ---
224
+
225
+ ## Lazy Loading
226
+
227
+ All routes should use `React.lazy()` + `<Suspense>` to split each page into a separate chunk:
228
+
229
+ ```tsx
230
+ import React, { Suspense } from 'react';
231
+
232
+ const HomePage = React.lazy(() => import('./pages/HomePage').then(m => ({ default: m.HomePage })));
233
+
234
+ function AppRoutes() {
235
+ return (
236
+ <Suspense fallback={null}>
237
+ <Routes>
238
+ <Route
239
+ path="/home"
240
+ element={
241
+ <ProtectedRoute>
242
+ <HomePage />
243
+ </ProtectedRoute>
244
+ }
245
+ />
246
+ </Routes>
247
+ </Suspense>
248
+ );
249
+ }
250
+ ```
251
+
252
+ The CLI-generated project configures lazy loading for all routes automatically.
253
+
254
+ ---
255
+
256
+ ## Error Boundaries
257
+
258
+ Wrap your app with `<AppErrorBoundary>` and your route tree with `<PageErrorBoundary>` to prevent crashes from producing blank screens:
259
+
260
+ ```tsx
261
+ import { AppErrorBoundary, PageErrorBoundary, SectionErrorBoundary } from '@/shared/error-boundary';
262
+
263
+ // In App.tsx
264
+ <AppErrorBoundary>
265
+ <QueryClientProvider client={queryClient}>
266
+ <XerticaProvider>
267
+ <Router>
268
+ <AuthProvider>
269
+ <PageErrorBoundary>
270
+ <Suspense fallback={null}>
271
+ <AuthGuard />
272
+ </Suspense>
273
+ </PageErrorBoundary>
274
+ </AuthProvider>
275
+ </Router>
276
+ </XerticaProvider>
277
+ </QueryClientProvider>
278
+ </AppErrorBoundary>
279
+
280
+ // In page content sections
281
+ <SectionErrorBoundary>
282
+ <TeamDataTable />
283
+ </SectionErrorBoundary>
284
+ ```
285
+
286
+ The CLI-generated scaffold adds all three boundaries automatically. See [`docs/components/error-boundary.md`](./components/error-boundary.md) for full API reference.
287
+
288
+ ---
289
+
290
+ ## Internationalization (i18n)
291
+
292
+ The project uses `i18next` + `react-i18next`. All UI strings are translated via `useTranslation()`:
293
+
294
+ ```tsx
295
+ import { useTranslation } from 'react-i18next';
296
+
297
+ function MyPage() {
298
+ const { t } = useTranslation();
299
+ return <h1>{t('home.welcome')}</h1>;
300
+ }
301
+ ```
302
+
303
+ The `LanguageSelector` component (rendered by `Header` via `showLanguageSelector`) drives language switching and is wired to `LanguageContext` + `i18next` automatically. See [`docs/i18n.md`](./i18n.md) for setup and locale file structure.
304
+
305
+ ---
306
+
307
+ ## Theme System
308
+
309
+ The design system is token-driven. All colors, radii, and shadows are controlled by CSS custom properties injected at `:root`.
310
+
311
+ ### Color Token Semantics
312
+
313
+ | Token Class | Usage |
314
+ | ------------------------------------------------ | -------------------------------------- |
315
+ | `bg-background` / `text-foreground` | Page background and primary text |
316
+ | `bg-card` / `text-card-foreground` | Card surfaces |
317
+ | `bg-muted` / `text-muted-foreground` | Subdued backgrounds and secondary text |
318
+ | `bg-primary` / `text-primary-foreground` | Primary actions (buttons, links) |
319
+ | `bg-secondary` / `text-secondary-foreground` | Secondary actions |
320
+ | `bg-destructive` / `text-destructive-foreground` | Danger / error states |
321
+ | `bg-accent` / `text-accent-foreground` | Hover states |
322
+ | `border-border` | Standard borders |
323
+ | `border-input` | Form field borders |
324
+
325
+ **Always use semantic tokens for semantic/status contexts.** Never use raw hex values (`#3b82f6`, `rgb(...)`) in any context. For error, warning, success, and status states, always use semantic tokens (`bg-destructive`, `bg-success`, `bg-warning`, `text-muted-foreground`). For layout, spacing, and general non-semantic UI, standard Tailwind color utilities are acceptable.
326
+
327
+ ### Dark Mode
328
+
329
+ The theme responds to the `dark` class on `<html>`. Use the `<ThemeToggle>` component which toggles this class automatically:
330
+
331
+ ```tsx
332
+ import { ThemeToggle } from 'xertica-ui/brand';
333
+
334
+ // Typically placed in Header actions or Sidebar footer
335
+ <ThemeToggle />;
336
+ ```
337
+
338
+ `ThemeToggle` is fully self-contained — it reads and writes `document.documentElement.classList` directly and does not require any context provider.
339
+
340
+ ### CSS Setup (Critical)
341
+
342
+ The consumer's `src/styles/index.css` **must** follow this exact structure for theme tokens to apply correctly:
343
+
344
+ ```css
345
+ @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@400;500;700&display=swap');
346
+
347
+ /* 1. Import the compiled library styles (includes Tailwind base) */
348
+ @import 'xertica-ui/style.css';
349
+
350
+ /* 2. Import YOUR theme tokens (overrides library defaults) */
351
+ @import './xertica/tokens.css';
352
+
353
+ /* 3. Tell Tailwind v4 to scan xertica-ui components for class names */
354
+ @source '../node_modules/xertica-ui';
355
+
356
+ /* 4. Map CSS variables to Tailwind tokens using @theme inline
357
+ ⚠️ MUST be `@theme inline` — NOT plain `@theme`.
358
+ `@theme inline` keeps var() references dynamic so your tokens.css
359
+ overrides cascade correctly into utility classes like bg-destructive. */
360
+ @theme inline {
361
+ --color-primary: var(--primary);
362
+ --color-destructive: var(--destructive);
363
+ /* ... full mapping in the generated file */
364
+ }
365
+ ```
366
+
367
+ > **Why `@theme inline`?** Plain `@theme {}` causes Tailwind v4 to compile color tokens **statically** at build time using the library's default values. With `@theme inline`, Tailwind keeps the `var()` references in the output CSS, so your `tokens.css` overrides cascade correctly at runtime. This is why alert colors, sidebar colors, and brand colors were not applying when using the theme selector.
368
+
369
+ ---
370
+
371
+ ## Layout System
372
+
373
+ The layout is managed globally through `LayoutContext`. Use the `useLayout()` hook to access and control layout state in any component:
374
+
375
+ ```tsx
376
+ import { useLayout } from 'xertica-ui/hooks';
377
+
378
+ function MyComponent() {
379
+ const {
380
+ sidebarExpanded, // boolean
381
+ sidebarWidth, // number (px)
382
+ setSidebarWidth, // (width: number) => void
383
+ toggleSidebar, // () => void
384
+ assistenteExpanded,
385
+ toggleAssistente,
386
+ } = useLayout();
387
+ }
388
+ ```
389
+
390
+ See `docs/layout.md` for the complete reference.
391
+
392
+ ---
393
+
394
+ ## Routing
395
+
396
+ Xertica UI integrates with `react-router-dom` v6. Pass router hooks to navigation components:
397
+
398
+ ```tsx
399
+ import { useNavigate, useLocation } from 'react-router-dom';
400
+ import { Sidebar } from 'xertica-ui/layout';
401
+
402
+ function Layout() {
403
+ const navigate = useNavigate();
404
+ const location = useLocation();
405
+
406
+ return (
407
+ <Sidebar
408
+ navigate={navigate}
409
+ location={location}
410
+ routes={routes}
411
+ // ...
412
+ />
413
+ );
414
+ }
415
+ ```
416
+
417
+ ---
418
+
419
+ ## Component Import
420
+
421
+ ### Subpath Imports (v2 — Recommended)
422
+
423
+ Xertica UI v2 exposes granular subpath entries for precise, tree-shaken imports:
424
+
425
+ ```tsx
426
+ import { Button, Card, CardContent, Input, Badge } from 'xertica-ui/ui';
427
+ import { Sidebar, Header } from 'xertica-ui/layout';
428
+ import { XerticaProvider, XerticaLogo } from 'xertica-ui/brand';
429
+ import { XerticaAssistant } from 'xertica-ui/assistant';
430
+ import { VideoPlayer } from 'xertica-ui/media';
431
+ import { useLayout, useTheme } from 'xertica-ui/hooks';
432
+ ```
433
+
434
+ ### Root Barrel (Backward Compatible)
435
+
436
+ The root entrypoint exports everything and remains fully supported:
437
+
438
+ ```tsx
439
+ import {
440
+ Button,
441
+ Card,
442
+ CardContent,
443
+ CardHeader,
444
+ CardTitle,
445
+ Input,
446
+ Badge,
447
+ Table,
448
+ TableBody,
449
+ TableCell,
450
+ TableHead,
451
+ TableHeader,
452
+ TableRow,
453
+ } from 'xertica-ui/ui';
454
+ ```
455
+
456
+ > **TypeScript note**: Subpath imports require `"moduleResolution": "bundler"` (or `"node16"` / `"nodenext"`) in your `tsconfig.json`.
457
+
458
+ Icons are separate — always use `lucide-react`:
459
+
460
+ ```tsx
461
+ import { Home, Settings, Users, LogOut } from 'lucide-react';
462
+ ```
463
+
464
+ ---
465
+
466
+ ## Troubleshooting
467
+
468
+ ### Components render without styles (transparent / unstyled)
469
+
470
+ **Cause**: Missing CSS import.
471
+
472
+ **Fix**: Add `import 'xertica-ui/style.css'` to your entry file (`main.tsx` or `index.tsx`), **before** your own styles:
473
+
474
+ ```tsx
475
+ import 'xertica-ui/style.css';
476
+ import './styles/index.css'; // your tokens and overrides
477
+ ```
478
+
479
+ ---
480
+
481
+ ### Dark mode doesn't apply
482
+
483
+ **Cause**: The `dark` class is not being toggled on `<html>`, or `@theme inline` is missing from your CSS.
484
+
485
+ **Fix 1**: Use `<ThemeToggle>` from `xertica-ui/brand` — it handles the class toggle automatically.
486
+
487
+ **Fix 2**: Ensure your `index.css` uses `@theme inline` (not plain `@theme`):
488
+
489
+ ```css
490
+ /* Correct */
491
+ @theme inline {
492
+ --color-primary: var(--primary);
493
+ }
494
+
495
+ /* ❌ Wrong — compiles tokens statically, ignoring your tokens.css overrides */
496
+ @theme {
497
+ --color-primary: var(--primary);
498
+ }
499
+ ```
500
+
501
+ ---
502
+
503
+ ### Subpath imports cause TypeScript errors
504
+
505
+ **Cause**: `tsconfig.json` uses `"moduleResolution": "node"` which does not support package subpath exports.
506
+
507
+ **Fix**: Update `tsconfig.json`:
508
+
509
+ ```json
510
+ {
511
+ "compilerOptions": {
512
+ "moduleResolution": "bundler"
513
+ }
514
+ }
515
+ ```
516
+
517
+ Alternatively, use `"moduleResolution": "node16"` or `"nodenext"`.
518
+
519
+ ---
520
+
521
+ ### Toast notifications don't appear
522
+
523
+ **Cause**: `<Toaster>` is not mounted, or `<XerticaProvider>` is missing.
524
+
525
+ **Fix**: Wrap your app in `<XerticaProvider>` — it auto-injects `<Toaster>`. If you are not using `XerticaProvider`, add `<Toaster />` manually:
526
+
527
+ ```tsx
528
+ import { Toaster } from 'xertica-ui/ui';
529
+
530
+ function App() {
531
+ return (
532
+ <>
533
+ <YourApp />
534
+ <Toaster />
535
+ </>
536
+ );
537
+ }
538
+ ```
539
+
540
+ ---
541
+
542
+ ### Dialogs / Modals don't appear
543
+
544
+ **Cause**: Missing `<XerticaProvider>` (which includes `TooltipProvider` and portal context).
545
+
546
+ **Fix**: Ensure `<XerticaProvider>` wraps the entire application at the root level.
547
+
548
+ ---
549
+
550
+ ### Google Maps doesn't load
551
+
552
+ **Cause**: Missing or invalid `googleMapsApiKey`, or the Maps API script failed to load.
553
+
554
+ **Fix**: Pass the key to `XerticaProvider`:
555
+
556
+ ```tsx
557
+ <XerticaProvider googleMapsApiKey="YOUR_VALID_KEY">
558
+ <App />
559
+ </XerticaProvider>
560
+ ```
561
+
562
+ Or use `useApiKey()` to set it at runtime:
563
+
564
+ ```tsx
565
+ const { setGoogleMapsApiKey, reloadMapsApi } = useApiKey();
566
+ setGoogleMapsApiKey('YOUR_KEY');
567
+ await reloadMapsApi();
568
+ ```
569
+
570
+ ---
571
+
572
+ ### `useLayout()` throws "must be used within LayoutProvider"
573
+
574
+ **Cause**: The component using `useLayout()` is rendered outside `<XerticaProvider>`.
575
+
576
+ **Fix**: Ensure `<XerticaProvider>` is an ancestor of all components that use `useLayout()`, `useTheme()`, or any other context hook.
577
+
578
+ For components that may be used both inside and outside the provider (e.g., in Storybook), use `useOptionalLayout()` instead — it returns `null` when the context is unavailable.
579
+
580
+ ---
581
+
582
+ ### Sidebar width causes content overlap
583
+
584
+ **Cause**: Content area is not reading `sidebarWidth` from `useLayout()`.
585
+
586
+ **Fix**: Apply the sidebar width as a left margin or padding on the main content area:
587
+
588
+ ```tsx
589
+ const { sidebarWidth } = useLayout();
590
+
591
+ <main style={{ marginLeft: sidebarWidth }} className="flex-1 overflow-auto">
592
+ {/* content */}
593
+ </main>;
594
+ ```
595
+
596
+ ---
597
+
598
+ ### AI Assistant doesn't respond (real mode)
599
+
600
+ **Cause**: Missing or invalid Gemini API key.
601
+
602
+ **Fix**: Set the Gemini API key via `useApiKey()` or pass it to `XerticaProvider`:
603
+
604
+ ```tsx
605
+ <XerticaProvider initialGeminiApiKey="YOUR_GEMINI_KEY">
606
+ <App />
607
+ </XerticaProvider>
608
+ ```
609
+
610
+ Or use the Settings pattern to let users enter their own key. See [`docs/patterns/settings.md`](./patterns/settings.md).
611
+
612
+ For testing without a real API key, use `demoMode={true}` on `XerticaAssistant`:
613
+
614
+ ```tsx
615
+ <XerticaAssistant demoMode={true} />
616
+ ```