xertica-ui 2.5.1 → 2.5.2

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 (535) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +14 -16
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/generate-tokens.ts +262 -262
  6. package/bin/language-config.ts +359 -358
  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 -564
  10. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
  11. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -104
  12. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
  13. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -88
  14. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
  15. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -564
  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 -611
  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 -58
  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 -112
  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 -67
  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 -111
  34. package/components/brand/language-selector/language-selector.test.tsx +101 -101
  35. package/components/brand/theme-toggle/ThemeToggle.tsx +74 -74
  36. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  37. package/components/index.ts +86 -86
  38. package/components/layout/sidebar/sidebar.mdx +1 -1
  39. package/components/layout/sidebar/sidebar.stories.tsx +1033 -787
  40. package/components/layout/sidebar/sidebar.tsx +338 -1
  41. package/components/media/FloatingMediaWrapper.tsx +371 -371
  42. package/components/media/audio-player/AudioPlayer.tsx +768 -768
  43. package/components/media/video-player/VideoPlayer.tsx +310 -310
  44. package/components/pages/home-content/HomeContent.tsx +120 -120
  45. package/components/pages/home-content/home-content.mdx +62 -62
  46. package/components/pages/home-page/HomePage.tsx +78 -78
  47. package/components/pages/home-page/home-page.mdx +53 -53
  48. package/components/pages/template-content/TemplateContent.tsx +1354 -1354
  49. package/components/pages/template-content/template-content.mdx +61 -61
  50. package/components/pages/template-page/TemplatePage.stories.tsx +32 -32
  51. package/components/pages/template-page/template-page.mdx +53 -53
  52. package/components/shared/error-boundary.stories.tsx +114 -114
  53. package/components/shared/error-boundary.tsx +150 -150
  54. package/components/shared/error-fallbacks.tsx +222 -222
  55. package/components/ui/accordion/accordion.mdx +8 -8
  56. package/components/ui/alert/alert.mdx +8 -8
  57. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  58. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  59. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  60. package/components/ui/avatar/avatar.mdx +8 -8
  61. package/components/ui/badge/badge.mdx +8 -8
  62. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  63. package/components/ui/button/button.mdx +8 -8
  64. package/components/ui/calendar/calendar.mdx +8 -8
  65. package/components/ui/card/card.mdx +8 -8
  66. package/components/ui/carousel/carousel.mdx +8 -8
  67. package/components/ui/chart/chart.mdx +8 -8
  68. package/components/ui/chart/chart.test.tsx +178 -178
  69. package/components/ui/chart/chart.tsx +2245 -2239
  70. package/components/ui/checkbox/checkbox.mdx +8 -8
  71. package/components/ui/collapsible/collapsible.mdx +8 -8
  72. package/components/ui/command/command.mdx +8 -8
  73. package/components/ui/context-menu/context-menu.mdx +8 -8
  74. package/components/ui/dialog/dialog.mdx +8 -8
  75. package/components/ui/drawer/drawer.mdx +8 -8
  76. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  77. package/components/ui/empty/empty.mdx +8 -8
  78. package/components/ui/file-upload/file-upload.mdx +8 -8
  79. package/components/ui/hover-card/hover-card.mdx +8 -8
  80. package/components/ui/input/input.mdx +8 -8
  81. package/components/ui/input-otp/input-otp.mdx +8 -8
  82. package/components/ui/label/label.mdx +8 -8
  83. package/components/ui/map/map.mdx +8 -8
  84. package/components/ui/menubar/menubar.mdx +8 -8
  85. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  86. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  87. package/components/ui/pagination/pagination.mdx +8 -8
  88. package/components/ui/popover/popover.mdx +8 -8
  89. package/components/ui/progress/progress.mdx +8 -8
  90. package/components/ui/radio-group/radio-group.mdx +8 -8
  91. package/components/ui/rating/rating.mdx +8 -8
  92. package/components/ui/resizable/resizable.mdx +8 -8
  93. package/components/ui/route-map/route-map.mdx +8 -8
  94. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  95. package/components/ui/search/search.mdx +8 -8
  96. package/components/ui/select/select.mdx +8 -8
  97. package/components/ui/separator/separator.mdx +8 -8
  98. package/components/ui/sheet/sheet.mdx +8 -8
  99. package/components/ui/simple-map/simple-map.mdx +8 -8
  100. package/components/ui/skeleton/skeleton.mdx +8 -8
  101. package/components/ui/slider/slider.mdx +8 -8
  102. package/components/ui/sonner/sonner.mdx +8 -8
  103. package/components/ui/stats-card/index.ts +2 -2
  104. package/components/ui/stats-card/stats-card-skeleton.tsx +60 -60
  105. package/components/ui/stats-card/stats-card.mdx +8 -8
  106. package/components/ui/stats-card/stats-card.tsx +109 -109
  107. package/components/ui/stepper/stepper.mdx +8 -8
  108. package/components/ui/switch/switch.mdx +8 -8
  109. package/components/ui/table/table.mdx +8 -8
  110. package/components/ui/tabs/tabs.mdx +8 -8
  111. package/components/ui/textarea/textarea.mdx +8 -8
  112. package/components/ui/timeline/timeline.mdx +8 -8
  113. package/components/ui/toggle/toggle.mdx +8 -8
  114. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  115. package/components/ui/tooltip/tooltip.mdx +8 -8
  116. package/components/ui/tree-view/tree-view.mdx +8 -8
  117. package/components.json +511 -511
  118. package/contexts/AuthContext.tsx +121 -121
  119. package/contexts/BrandColorsContext.tsx +282 -282
  120. package/contexts/LanguageContext.test.tsx +121 -121
  121. package/contexts/LanguageContext.tsx +250 -250
  122. package/contexts/theme-data.ts +391 -391
  123. package/dist/{AssistantChart-DoZCyS5r.cjs → AssistantChart-9w31gdAb.cjs} +4 -4
  124. package/dist/{AssistantChart-CldVCVDe.cjs → AssistantChart-BAudAfne.cjs} +5 -5
  125. package/dist/{AssistantChart-Bdd44uBn.cjs → AssistantChart-BAx9VQvb.cjs} +127 -388
  126. package/dist/{AssistantChart-Cu3m7RBo.js → AssistantChart-BP8upjMk.js} +5 -5
  127. package/dist/{AssistantChart-CFhDdGyU.js → AssistantChart-CVko2A1W.js} +130 -391
  128. package/dist/{AssistantChart-C_hwFRRr.js → AssistantChart-CVzmmhx4.js} +4 -4
  129. package/dist/{AudioPlayer-IAU5q5T1.cjs → AudioPlayer-1ypwE2Wh.cjs} +1 -1
  130. package/dist/{AudioPlayer-CGRUtUdN.js → AudioPlayer-DuKXrCfy.js} +1 -1
  131. package/dist/{LanguageContext-CS14yCpi.js → LanguageContext-BwhwC3G2.js} +2 -2
  132. package/dist/{LanguageContext-B_KFTCzT.cjs → LanguageContext-DvUt5jBg.cjs} +2 -2
  133. package/dist/{ThemeContext-C2EwAPDt.js → ThemeContext-BbBNoFTG.js} +2 -2
  134. package/dist/{ThemeContext-Bmod0Cg2.cjs → ThemeContext-BblcjQup.cjs} +13 -8
  135. package/dist/{ThemeContext-BWq9ACPo.js → ThemeContext-Bo-W2WZH.js} +13 -8
  136. package/dist/{ThemeContext-j5aGtPky.cjs → ThemeContext-CP3a0jxy.cjs} +193 -262
  137. package/dist/{ThemeContext-vTjumZeM.cjs → ThemeContext-Cmr8Ex8H.cjs} +2 -2
  138. package/dist/ThemeContext-CpqYShLq.cjs +324 -0
  139. package/dist/{ThemeContext-CQSo4Iwc.js → ThemeContext-D3LzacmG.js} +8 -1
  140. package/dist/ThemeContext-Du2nE1PL.js +325 -0
  141. package/dist/ThemeContext-GeEBTJ3q.cjs +1621 -0
  142. package/dist/ThemeContext-JyLK9B1o.js +1622 -0
  143. package/dist/{ThemeContext-CGk3KK0k.cjs → ThemeContext-U4dEYc6C.cjs} +8 -1
  144. package/dist/{ThemeContext-BXjrgUjW.js → ThemeContext-ept8jhXI.js} +200 -261
  145. package/dist/{VerifyEmailPage-CGIwmWrm.js → VerifyEmailPage-B31mCrMc.js} +1 -1
  146. package/dist/{VerifyEmailPage-C0c2e5n0.js → VerifyEmailPage-BE-L9mB7.js} +7 -7
  147. package/dist/{VerifyEmailPage-DSBMRHtl.js → VerifyEmailPage-BIBOKV7Z.js} +41 -36
  148. package/dist/{VerifyEmailPage-DgIid028.js → VerifyEmailPage-BJjAMUTW.js} +4 -4
  149. package/dist/{VerifyEmailPage--1Vurewl.cjs → VerifyEmailPage-BRSP-Pwt.cjs} +3 -3
  150. package/dist/{VerifyEmailPage-Cwi3kbol.cjs → VerifyEmailPage-Bae2cBXT.cjs} +7 -7
  151. package/dist/{VerifyEmailPage-De6bQjrz.cjs → VerifyEmailPage-BiRm7Nh4.cjs} +41 -36
  152. package/dist/{VerifyEmailPage-ByerOcm4.cjs → VerifyEmailPage-Bv8Ah_TK.cjs} +23 -20
  153. package/dist/VerifyEmailPage-Bvfv8HVQ.js +3214 -0
  154. package/dist/{VerifyEmailPage-BComraR7.cjs → VerifyEmailPage-CR7kb5df.cjs} +22 -12
  155. package/dist/{VerifyEmailPage-CpqqpLpo.cjs → VerifyEmailPage-C_Zk6Gen.cjs} +1 -1
  156. package/dist/{VerifyEmailPage-MTD7AG1Z.js → VerifyEmailPage-C_ihbcth.js} +4 -4
  157. package/dist/{VerifyEmailPage-1WwWczAn.js → VerifyEmailPage-CbgjOF0v.js} +22 -12
  158. package/dist/{VerifyEmailPage-DvMLZgFt.js → VerifyEmailPage-CdYPSJoO.js} +1 -1
  159. package/dist/{VerifyEmailPage-By3Jf__L.cjs → VerifyEmailPage-CkBYfsNy.cjs} +4 -4
  160. package/dist/{VerifyEmailPage-CJLz3jrn.js → VerifyEmailPage-Cyl55sJb.js} +23 -20
  161. package/dist/VerifyEmailPage-D-FRj5TU.cjs +3213 -0
  162. package/dist/{VerifyEmailPage-B4peJjAT.cjs → VerifyEmailPage-DF2ilhum.cjs} +334 -356
  163. package/dist/{VerifyEmailPage-CYXtbKi3.cjs → VerifyEmailPage-DMBh4NM9.cjs} +1 -1
  164. package/dist/{VerifyEmailPage-CgMxRb4z.js → VerifyEmailPage-DTtFfC-J.js} +3 -3
  165. package/dist/{VerifyEmailPage-CFLMls1p.cjs → VerifyEmailPage-Dt7zgA4w.cjs} +4 -4
  166. package/dist/{VerifyEmailPage-C5TNQTBa.js → VerifyEmailPage-EhudUdqF.js} +343 -355
  167. package/dist/{VerifyEmailPage-DGhuIqkb.js → VerifyEmailPage-X14vhdyl.js} +4 -4
  168. package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
  169. package/dist/{VerifyEmailPage-Bp1XXl3H.cjs → VerifyEmailPage-u_Dn7t1U.cjs} +4 -4
  170. package/dist/VerifyEmailPage-vYHbYK3q.js +3214 -0
  171. package/dist/{XerticaProvider-CBGc4EMA.cjs → XerticaProvider-AChwphCO.cjs} +4 -4
  172. package/dist/{XerticaProvider-BIrqfZ-i.cjs → XerticaProvider-AbWlr7Af.cjs} +8 -11
  173. package/dist/{XerticaProvider-D-yNhF94.cjs → XerticaProvider-B8CaV7xu.cjs} +1 -1
  174. package/dist/{XerticaProvider-CEoWMTxu.js → XerticaProvider-BITjgC5p.js} +2 -2
  175. package/dist/{XerticaProvider-CllrbMEJ.cjs → XerticaProvider-By8q3Roe.cjs} +2 -2
  176. package/dist/{XerticaProvider-C1DKnvLh.js → XerticaProvider-CUYJZc32.js} +4 -4
  177. package/dist/{XerticaProvider-ET0ihewn.cjs → XerticaProvider-CW9hpCdF.cjs} +2 -2
  178. package/dist/{XerticaProvider-Dt5HEzbQ.js → XerticaProvider-CWgby5mY.js} +10 -10
  179. package/dist/XerticaProvider-CWs6EwNa.js +49 -0
  180. package/dist/XerticaProvider-CjQAQPcn.cjs +48 -0
  181. package/dist/XerticaProvider-D5lLumH-.js +49 -0
  182. package/dist/{XerticaProvider-DYq4JWtg.js → XerticaProvider-DQtvJU7m.js} +1 -1
  183. package/dist/XerticaProvider-qQUDop71.cjs +48 -0
  184. package/dist/{XerticaProvider-B7EVH-NF.js → XerticaProvider-siSt9uG2.js} +2 -2
  185. package/dist/{XerticaXLogo-Zw2B276b.cjs → XerticaXLogo-8TTzBjHw.cjs} +1 -1
  186. package/dist/{XerticaXLogo-B7xQ5dhi.js → XerticaXLogo-BWaag64t.js} +1 -1
  187. package/dist/{XerticaXLogo-DZbo4vOE.js → XerticaXLogo-CFuIlYFH.js} +12 -12
  188. package/dist/{XerticaXLogo-bvZSgwGF.cjs → XerticaXLogo-CU-U-GP4.cjs} +7 -13
  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/{alert-dialog-s-vmNkJ_.js → alert-dialog-iDe5VE5o.js} +3 -3
  196. package/dist/{alert-dialog-DSKByiKZ.cjs → alert-dialog-yckpaOpy.cjs} +3 -3
  197. package/dist/cli.js +2 -1
  198. package/dist/components/ui/chart/chart.d.ts +7 -5
  199. package/dist/{google-maps-loader-Y-QkD-Li.cjs → google-maps-loader-BqsYL48U.cjs} +0 -5
  200. package/dist/{google-maps-loader-CTYySAun.js → google-maps-loader-t2IlYBzw.js} +0 -4
  201. package/dist/index-CkTUgOwX.js +8 -0
  202. package/dist/{index-COtD8bRW.cjs → index-D3RLKRAs.cjs} +1 -1
  203. package/dist/index.cjs.js +2 -2
  204. package/dist/index.es.js +2 -2
  205. package/dist/index.umd.js +454 -1027
  206. package/dist/layout.cjs.js +1 -1
  207. package/dist/layout.es.js +1 -1
  208. package/dist/pages.cjs.js +1 -1
  209. package/dist/pages.es.js +1 -1
  210. package/dist/{sidebar-DAaY8bRU.cjs → sidebar-B3EYhli0.cjs} +33 -24
  211. package/dist/{sidebar-nzPoVHBQ.cjs → sidebar-B9NR0lCe.cjs} +46 -41
  212. package/dist/{sidebar-CeTMuzOx.cjs → sidebar-BvF5I2Ue.cjs} +47 -128
  213. package/dist/{sidebar-q7P2Godd.cjs → sidebar-C5B_LHek.cjs} +1 -1
  214. package/dist/{sidebar-CrQDDdcz.js → sidebar-CA6_ek3f.js} +33 -24
  215. package/dist/sidebar-CLmIjgNd.cjs +1136 -0
  216. package/dist/{sidebar-BxGXsDAd.cjs → sidebar-CVUGHOS_.cjs} +8 -16
  217. package/dist/{sidebar-BViy8Eeu.js → sidebar-CmvwjnVb.js} +9 -17
  218. package/dist/{sidebar-B6SlKZYN.js → sidebar-CplprZpM.js} +49 -40
  219. package/dist/sidebar-Duermn32.js +1133 -0
  220. package/dist/{sidebar-BbVIQvlP.js → sidebar-Dz7bd3zP.js} +1 -1
  221. package/dist/{sidebar-0ocFLSks.js → sidebar-KIS0C2JH.js} +50 -127
  222. package/dist/sidebar-OTO_up7Z.js +801 -0
  223. package/dist/sidebar-zowjejT2.cjs +800 -0
  224. package/dist/{use-audio-player-nv8ZSGa1.js → use-audio-player-Bkh23vQ3.js} +3 -7
  225. package/dist/{use-audio-player-NKsWyjWu.cjs → use-audio-player-Dn1NR9xN.cjs} +3 -7
  226. package/dist/{xertica-assistant-dyP7KHM5.cjs → xertica-assistant-B1IaHXnB.cjs} +388 -529
  227. package/dist/{xertica-assistant-ciJaWqm1.js → xertica-assistant-BMqdyRVi.js} +10 -28
  228. package/dist/{xertica-assistant-V_IdW4WF.cjs → xertica-assistant-Bj3vBCq_.cjs} +9 -27
  229. package/dist/{xertica-assistant-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
  230. package/dist/{CodeBlock-7TTgmdGG.cjs → xertica-assistant-Qp3ydksa.cjs} +51 -263
  231. package/dist/{CodeBlock-BeSt1h5P.js → xertica-assistant-gnCJdcZY.js} +7 -219
  232. package/dist/xertica-ui.css +2 -2
  233. package/docs/architecture-improvements.md +456 -456
  234. package/docs/architecture.md +312 -312
  235. package/docs/components/assistant.md +428 -428
  236. package/docs/components/branding.md +252 -252
  237. package/docs/components/card-patterns.md +447 -447
  238. package/docs/components/error-boundary.md +201 -201
  239. package/docs/components/hooks.md +432 -432
  240. package/docs/components/language-selector.md +176 -176
  241. package/docs/components/pages.md +323 -323
  242. package/docs/components/sidebar.md +331 -331
  243. package/docs/components/stats-card.md +138 -138
  244. package/docs/doc-audit.md +244 -244
  245. package/docs/getting-started.md +616 -616
  246. package/docs/guidelines.md +330 -330
  247. package/docs/i18n.md +480 -480
  248. package/docs/installation.md +268 -268
  249. package/docs/llms.md +295 -295
  250. package/docs/state-management.md +289 -289
  251. package/guidelines/Guidelines.md +409 -409
  252. package/llms-compact.txt +1 -1
  253. package/llms-full.txt +10688 -10688
  254. package/llms.txt +1 -1
  255. package/package.json +1 -1
  256. package/styles/xertica/base.css +90 -90
  257. package/styles/xertica/tokens.css +240 -240
  258. package/templates/.prettierignore +4 -4
  259. package/templates/.prettierrc +10 -10
  260. package/templates/CLAUDE.md +180 -180
  261. package/templates/package.json +2 -2
  262. package/templates/src/app/App.tsx +46 -46
  263. package/templates/src/app/components/AuthGuard.tsx +131 -131
  264. package/templates/src/features/assistant/data/mock.ts +75 -75
  265. package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
  266. package/templates/src/features/assistant/index.ts +5 -5
  267. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  268. package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
  269. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -183
  270. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
  271. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -80
  272. package/templates/src/features/home/data/mock.ts +41 -41
  273. package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
  274. package/templates/src/features/home/index.ts +11 -11
  275. package/templates/src/features/home/ui/HomeContent.tsx +117 -117
  276. package/templates/src/features/template/ui/CrudTemplate.tsx +112 -112
  277. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
  278. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  279. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
  280. package/templates/src/features/template/ui/TemplateContent.tsx +1322 -1322
  281. package/templates/src/i18n.ts +124 -124
  282. package/templates/src/locales/en/common.json +21 -21
  283. package/templates/src/locales/en/components/activityCard.json +10 -10
  284. package/templates/src/locales/en/components/assistant.json +119 -119
  285. package/templates/src/locales/en/components/media.json +29 -29
  286. package/templates/src/locales/en/components/notificationCard.json +5 -5
  287. package/templates/src/locales/en/components/profileCard.json +8 -8
  288. package/templates/src/locales/en/components/projectCard.json +10 -10
  289. package/templates/src/locales/en/components/sidebar.json +14 -14
  290. package/templates/src/locales/en/components/stats.json +8 -8
  291. package/templates/src/locales/en/components/team.json +14 -14
  292. package/templates/src/locales/en/errors.json +9 -9
  293. package/templates/src/locales/en/languageSelector.json +7 -7
  294. package/templates/src/locales/en/nav.json +6 -6
  295. package/templates/src/locales/en/pages/crudTemplate.json +25 -25
  296. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
  297. package/templates/src/locales/en/pages/forgotPassword.json +10 -10
  298. package/templates/src/locales/en/pages/formTemplate.json +16 -16
  299. package/templates/src/locales/en/pages/home.json +7 -7
  300. package/templates/src/locales/en/pages/login.json +15 -15
  301. package/templates/src/locales/en/pages/loginTemplate.json +9 -9
  302. package/templates/src/locales/en/pages/resetPassword.json +18 -18
  303. package/templates/src/locales/en/pages/templates.json +317 -317
  304. package/templates/src/locales/en/pages/verifyEmail.json +12 -12
  305. package/templates/src/locales/en/themeToggle.json +6 -6
  306. package/templates/src/locales/es/common.json +21 -21
  307. package/templates/src/locales/es/components/activityCard.json +10 -10
  308. package/templates/src/locales/es/components/assistant.json +119 -119
  309. package/templates/src/locales/es/components/media.json +29 -29
  310. package/templates/src/locales/es/components/notificationCard.json +5 -5
  311. package/templates/src/locales/es/components/profileCard.json +8 -8
  312. package/templates/src/locales/es/components/projectCard.json +10 -10
  313. package/templates/src/locales/es/components/sidebar.json +14 -14
  314. package/templates/src/locales/es/components/stats.json +8 -8
  315. package/templates/src/locales/es/components/team.json +14 -14
  316. package/templates/src/locales/es/errors.json +9 -9
  317. package/templates/src/locales/es/languageSelector.json +7 -7
  318. package/templates/src/locales/es/nav.json +6 -6
  319. package/templates/src/locales/es/pages/crudTemplate.json +25 -25
  320. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
  321. package/templates/src/locales/es/pages/forgotPassword.json +10 -10
  322. package/templates/src/locales/es/pages/formTemplate.json +16 -16
  323. package/templates/src/locales/es/pages/home.json +7 -7
  324. package/templates/src/locales/es/pages/login.json +15 -15
  325. package/templates/src/locales/es/pages/loginTemplate.json +9 -9
  326. package/templates/src/locales/es/pages/resetPassword.json +18 -18
  327. package/templates/src/locales/es/pages/templates.json +317 -317
  328. package/templates/src/locales/es/pages/verifyEmail.json +12 -12
  329. package/templates/src/locales/es/themeToggle.json +6 -6
  330. package/templates/src/locales/pt-BR/common.json +21 -21
  331. package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
  332. package/templates/src/locales/pt-BR/components/assistant.json +119 -119
  333. package/templates/src/locales/pt-BR/components/media.json +29 -29
  334. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
  335. package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
  336. package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
  337. package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
  338. package/templates/src/locales/pt-BR/components/stats.json +8 -8
  339. package/templates/src/locales/pt-BR/components/team.json +14 -14
  340. package/templates/src/locales/pt-BR/errors.json +9 -9
  341. package/templates/src/locales/pt-BR/languageSelector.json +7 -7
  342. package/templates/src/locales/pt-BR/nav.json +6 -6
  343. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
  344. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
  345. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -10
  346. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
  347. package/templates/src/locales/pt-BR/pages/home.json +7 -7
  348. package/templates/src/locales/pt-BR/pages/login.json +15 -15
  349. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
  350. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
  351. package/templates/src/locales/pt-BR/pages/templates.json +317 -317
  352. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
  353. package/templates/src/locales/pt-BR/themeToggle.json +6 -6
  354. package/templates/src/pages/AssistantPage.tsx +470 -470
  355. package/templates/src/pages/HomePage.tsx +53 -53
  356. package/templates/src/shared/error-boundary.tsx +150 -150
  357. package/templates/src/shared/error-fallbacks.tsx +222 -222
  358. package/templates/src/styles/xertica/tokens.css +240 -240
  359. package/templates/vite.config.js +20 -20
  360. package/templates/vite.config.ts +55 -55
  361. package/dist/AssistantChart-BKVtGUKF.js +0 -3383
  362. package/dist/AssistantChart-CxGjH7Qk.js +0 -3477
  363. package/dist/AssistantChart-DIpshm3i.js +0 -4784
  364. package/dist/AssistantChart-D_PTeu8P.cjs +0 -3503
  365. package/dist/AssistantChart-WeycT5Pd.cjs +0 -3551
  366. package/dist/AssistantChart-zjsy2GaZ.cjs +0 -4810
  367. package/dist/AudioPlayer-B1lt5cPl.cjs +0 -989
  368. package/dist/AudioPlayer-BZ7bibzU.cjs +0 -982
  369. package/dist/AudioPlayer-BpRPS4-1.cjs +0 -1277
  370. package/dist/AudioPlayer-C12BjQBV.cjs +0 -997
  371. package/dist/AudioPlayer-CFeV8t-5.cjs +0 -936
  372. package/dist/AudioPlayer-Coly3q5R.js +0 -1278
  373. package/dist/AudioPlayer-CySJIyvL.js +0 -937
  374. package/dist/AudioPlayer-DMcG_c7L.js +0 -990
  375. package/dist/AudioPlayer-DcFKRJE_.js +0 -998
  376. package/dist/AudioPlayer-e8LfNoqO.js +0 -983
  377. package/dist/BrandColorsContext-565dDHd5.js +0 -660
  378. package/dist/BrandColorsContext-BcJbtkqn.cjs +0 -659
  379. package/dist/CodeBlock-BgfYL_rD.cjs +0 -2094
  380. package/dist/CodeBlock-BlcqlA9M.cjs +0 -2094
  381. package/dist/CodeBlock-Bnmeu5ez.cjs +0 -2094
  382. package/dist/CodeBlock-BtfPlbAI.js +0 -2078
  383. package/dist/CodeBlock-CIySIuYr.js +0 -2078
  384. package/dist/CodeBlock-CuPtUM-7.cjs +0 -2094
  385. package/dist/CodeBlock-D6ffWXgc.js +0 -2078
  386. package/dist/CodeBlock-D8dcwbit.cjs +0 -2094
  387. package/dist/CodeBlock-DMZrFnlw.cjs +0 -2094
  388. package/dist/CodeBlock-DlBehYN8.js +0 -2078
  389. package/dist/CodeBlock-DnYNI8rQ.js +0 -2078
  390. package/dist/CodeBlock-DvKWbSnE.cjs +0 -2094
  391. package/dist/CodeBlock-DwMCfkFY.js +0 -2078
  392. package/dist/CodeBlock-Dy6CNYyj.js +0 -2078
  393. package/dist/CodeBlock-U1pPOQI7.cjs +0 -2094
  394. package/dist/CodeBlock-f_GpNhEB.js +0 -2078
  395. package/dist/CodeBlock-oB6u8nI1.js +0 -2078
  396. package/dist/CodeBlock-tZC31B73.cjs +0 -2094
  397. package/dist/FeatureCard-CxC-7C-C.cjs +0 -300
  398. package/dist/FeatureCard-DbHWCb4E.js +0 -301
  399. package/dist/ImageWithFallback-CGtidP6B.cjs +0 -4542
  400. package/dist/ImageWithFallback-lsg3pdFg.js +0 -4508
  401. package/dist/LanguageSelector-B5YfbHra.js +0 -231
  402. package/dist/LanguageSelector-D6uacAIM.cjs +0 -230
  403. package/dist/LayoutContext-B45-e9DI.cjs +0 -93
  404. package/dist/LayoutContext-BAql6ZRY.js +0 -97
  405. package/dist/LayoutContext-Bav3UMEA.js +0 -94
  406. package/dist/LayoutContext-BvK-ggDa.cjs +0 -96
  407. package/dist/ThemeContext-BoH4NLfN.js +0 -734
  408. package/dist/ThemeContext-r69W20Xg.cjs +0 -733
  409. package/dist/VerifyEmailPage-COiyNl1y.js +0 -2825
  410. package/dist/VerifyEmailPage-CqKsR2v8.js +0 -2827
  411. package/dist/VerifyEmailPage-DjQKRlUS.cjs +0 -2824
  412. package/dist/VerifyEmailPage-s-1X3LDJ.cjs +0 -2826
  413. package/dist/XerticaOrbe-KL1RBHzw.cjs +0 -1354
  414. package/dist/XerticaOrbe-zwS1p2a8.js +0 -1355
  415. package/dist/XerticaProvider-6btlAlzc.js +0 -17
  416. package/dist/XerticaProvider-BNoNOxQ5.cjs +0 -16
  417. package/dist/XerticaProvider-BlY2limY.cjs +0 -38
  418. package/dist/XerticaProvider-DDuiIcKo.js +0 -39
  419. package/dist/XerticaProvider-cI9hSs27.cjs +0 -38
  420. package/dist/XerticaProvider-hSwhNQex.js +0 -39
  421. package/dist/alert-dialog-BOje--vD.js +0 -847
  422. package/dist/alert-dialog-BtEuQqrg.cjs +0 -870
  423. package/dist/breadcrumb-CqJ7bHY5.js +0 -161
  424. package/dist/breadcrumb-m9Hb2_XN.cjs +0 -177
  425. package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +0 -6
  426. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +0 -21
  427. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +0 -49
  428. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +0 -16
  429. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +0 -35
  430. package/dist/components/blocks/audio-player/index.d.ts +0 -1
  431. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +0 -26
  432. package/dist/components/blocks/document-editor/index.d.ts +0 -1
  433. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +0 -41
  434. package/dist/components/blocks/podcast-player/index.d.ts +0 -1
  435. package/dist/components/ui/chart/parts/chart-dashboard.d.ts +0 -113
  436. package/dist/components/ui/chart/parts/chart-metric.d.ts +0 -118
  437. package/dist/components/ui/chart/parts/chart-primitives.d.ts +0 -101
  438. package/dist/components/ui/chart/parts/chart-shared.d.ts +0 -20
  439. package/dist/components/ui/chart/parts/chart-utils.d.ts +0 -12
  440. package/dist/components/ui/chart/parts/index.d.ts +0 -5
  441. package/dist/dropdown-menu-BDB5CmQs.cjs +0 -247
  442. package/dist/dropdown-menu-DQidbKBD.js +0 -231
  443. package/dist/google-maps-loader-BFWp6VPd.js +0 -287
  444. package/dist/google-maps-loader-BKcdgFbu.cjs +0 -312
  445. package/dist/google-maps-loader-CumCNXeG.js +0 -312
  446. package/dist/google-maps-loader-eS3uQ5TA.cjs +0 -287
  447. package/dist/header-Cgy6vYPk.cjs +0 -731
  448. package/dist/header-DRlT4jgI.js +0 -715
  449. package/dist/header-Dux00SI4.cjs +0 -731
  450. package/dist/header-EkGKXPsD.js +0 -715
  451. package/dist/header-WfEywpyc.cjs +0 -731
  452. package/dist/header-tifNQn2U.js +0 -715
  453. package/dist/index-BhapVLVj.js +0 -8
  454. package/dist/index-D6fxYEY8.cjs +0 -7
  455. package/dist/index-DAIp0_HK.js +0 -8
  456. package/dist/index-DW5tYe26.js +0 -8
  457. package/dist/index-GA__GvnG.cjs +0 -7
  458. package/dist/input-2R4loU86.js +0 -127
  459. package/dist/input-DWANSKGb.cjs +0 -145
  460. package/dist/progress-DPtzoVV8.js +0 -175
  461. package/dist/progress-EeaoqqUs.cjs +0 -191
  462. package/dist/rich-text-editor-0mraWT5y.cjs +0 -2376
  463. package/dist/rich-text-editor-B-IkcPD0.js +0 -2874
  464. package/dist/rich-text-editor-B6jMRLzk.cjs +0 -1939
  465. package/dist/rich-text-editor-B8_oYcIR.js +0 -1730
  466. package/dist/rich-text-editor-B9UbSXNb.js +0 -1203
  467. package/dist/rich-text-editor-BYuRBNBU.js +0 -2373
  468. package/dist/rich-text-editor-Bb9pySTs.cjs +0 -2374
  469. package/dist/rich-text-editor-BcL6L3cm.cjs +0 -2374
  470. package/dist/rich-text-editor-BoVZYtTs.cjs +0 -2391
  471. package/dist/rich-text-editor-Bp3zQqMC.js +0 -2954
  472. package/dist/rich-text-editor-CMgSN_w2.js +0 -1189
  473. package/dist/rich-text-editor-CPV1lEPH.cjs +0 -1748
  474. package/dist/rich-text-editor-CeucBdIv.cjs +0 -2971
  475. package/dist/rich-text-editor-CoKqbCtu.cjs +0 -1799
  476. package/dist/rich-text-editor-Cw56T_mB.js +0 -2356
  477. package/dist/rich-text-editor-Cyt8qs2b.js +0 -1921
  478. package/dist/rich-text-editor-D6H84OcX.cjs +0 -1220
  479. package/dist/rich-text-editor-D76gD-QI.js +0 -2328
  480. package/dist/rich-text-editor-DKkokOnA.js +0 -1781
  481. package/dist/rich-text-editor-DNsdpN64.cjs +0 -2359
  482. package/dist/rich-text-editor-DfG8bCyY.js +0 -2358
  483. package/dist/rich-text-editor-Dxjw31Z4.js +0 -2341
  484. package/dist/rich-text-editor-DzP0Epmb.js +0 -2356
  485. package/dist/rich-text-editor-bRkNoeZY.cjs +0 -2891
  486. package/dist/rich-text-editor-lyYE2ZG5.cjs +0 -1207
  487. package/dist/rich-text-editor-skplNlBM.cjs +0 -2345
  488. package/dist/select-Bkbr0f-Z.cjs +0 -162
  489. package/dist/select-CvIVdX2n.js +0 -145
  490. package/dist/sidebar-CK_0ZQHj.cjs +0 -803
  491. package/dist/sidebar-CUuOvYhK.js +0 -787
  492. package/dist/sidebar-DQj1z3jG.cjs +0 -758
  493. package/dist/sidebar-Djn5syhi.cjs +0 -786
  494. package/dist/sidebar-LluMXfam.js +0 -759
  495. package/dist/sidebar-_rT7rBMk.js +0 -787
  496. package/dist/slider-Bc5Hd0y1.js +0 -56
  497. package/dist/slider-N7hFFj6X.cjs +0 -73
  498. package/dist/tooltip-Ded96neP.cjs +0 -137
  499. package/dist/tooltip-HDOoD2-0.js +0 -120
  500. package/dist/use-audio-player-B31J-aqh.cjs +0 -187
  501. package/dist/use-audio-player-BkmEmj8Q.js +0 -185
  502. package/dist/use-audio-player-CLFTWFW1.cjs +0 -184
  503. package/dist/use-audio-player-CLLn00I6.js +0 -188
  504. package/dist/use-file-upload-BcjEo2S5.js +0 -404
  505. package/dist/use-file-upload-CRJR68Tj.cjs +0 -403
  506. package/dist/use-mobile-B0hNy_Y6.cjs +0 -4303
  507. package/dist/use-mobile-BXuYROXM.js +0 -4202
  508. package/dist/use-mobile-Bbd51ASU.cjs +0 -4392
  509. package/dist/use-mobile-Bk6CX-TC.js +0 -4359
  510. package/dist/use-mobile-BvYdisLP.js +0 -4202
  511. package/dist/use-mobile-BzuxjzNX.cjs +0 -4392
  512. package/dist/use-mobile-CG2-SdXV.cjs +0 -4235
  513. package/dist/use-mobile-CKb5pqTs.js +0 -4269
  514. package/dist/use-mobile-CYuAuGDl.js +0 -4202
  515. package/dist/use-mobile-CaENcqm-.js +0 -4508
  516. package/dist/use-mobile-CbrYgJGJ.js +0 -4203
  517. package/dist/use-mobile-Cd4xPrKq.cjs +0 -46
  518. package/dist/use-mobile-DMOvImGQ.cjs +0 -4542
  519. package/dist/use-mobile-DRB3BQgD.cjs +0 -4235
  520. package/dist/use-mobile-DZvv7QMR.js +0 -4359
  521. package/dist/use-mobile-DdI_TXam.cjs +0 -4235
  522. package/dist/use-mobile-DlceKf8a.js +0 -4359
  523. package/dist/use-mobile-DsOnow1o.cjs +0 -4236
  524. package/dist/use-mobile-Kcj6jSnK.cjs +0 -4392
  525. package/dist/use-mobile-bnKcua_i.js +0 -4202
  526. package/dist/use-mobile-j4w2Jrf1.js +0 -30
  527. package/dist/use-mobile-ncXBeE2z.cjs +0 -4235
  528. package/dist/use-rich-text-editor-DjiddBGv.js +0 -282
  529. package/dist/use-rich-text-editor-lpeswbCs.cjs +0 -281
  530. package/dist/xertica-assistant-BdiZag0h.js +0 -2187
  531. package/dist/xertica-assistant-CrgTb6Hs.cjs +0 -2155
  532. package/dist/xertica-assistant-DCsnQyi5.js +0 -2156
  533. package/dist/xertica-assistant-DUBpmEgo.cjs +0 -2186
  534. package/dist/{rich-text-editor-DgF8s7xW.js → rich-text-editor-BmsjY03B.js} +26 -26
  535. package/dist/{rich-text-editor-mWoaSCE4.cjs → rich-text-editor-GS2kpTAK.cjs} +26 -26
@@ -1,616 +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
- | **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
- ```
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
+ ```