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,406 +1,409 @@
1
- # Xertica UI — Library Guidelines
2
-
3
- > **Scope**: These guidelines apply to contributors developing the `xertica-ui` package itself (components, documentation, build system). For guidelines on projects that **consume** the package, see `templates/guidelines/Guidelines.md`.
4
-
5
- ---
6
-
7
- ## 1. What Xertica UI Is
8
-
9
- Xertica UI is an enterprise-grade React component library distributed as an npm package. It is designed to be consumed by both human developers and AI coding agents (LLMs, Cursor, Claude Code, Copilot). Every design decision — from the component API to the documentation format — must serve both audiences.
10
-
11
- **Stack:** React 18 · TypeScript 5 · Tailwind CSS v4 · Radix UI · Lucide React · Vite 6
12
-
13
- ---
14
-
15
- ## 2. AI-First Documentation
16
-
17
- Documentation is a first-class deliverable. Every component ships with:
18
-
19
- | File | Purpose | Location |
20
- | --------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
21
- | `llms.txt` | Index file following the llmstxt.org standard. Links to all docs. | `/llms.txt` |
22
- | `llms-compact.txt` | ~4K token quick reference. Critical rules, imports, 12 key components with examples. | `/llms-compact.txt` |
23
- | `llms-full.txt` | Complete documentation of all 97 components in one file for large-context LLMs. | `/llms-full.txt` |
24
- | `components.json` | Machine-readable registry: name, category, import path, keywords, related components. | `/components.json` |
25
- | `docs/decision-tree.md` | Decision trees: Dialog vs Sheet, Tooltip vs HoverCard, etc. | `/docs/decision-tree.md` |
26
- | `docs/components/[name].md` | Individual component reference with props, examples, and AI rules. | `/docs/components/` |
27
- | `docs/ai-usage.md` | Mandatory rules for AI agents operating on this library. | `/docs/ai-usage.md` |
28
- | `CLAUDE.md` | Auto-generated system prompt for consumer projects (injected by CLI). | `/templates/CLAUDE.md` |
29
-
30
- ### When to update documentation
31
-
32
- Every PR that changes a component **must** update:
33
-
34
- - `docs/components/[name].md` — if props, behavior, or examples changed
35
- - `llms-full.txt` — the relevant component section
36
- - `components.json` — if the component name, import path, or description changed
37
- - `CHANGELOG.md` — under the current unreleased version
38
-
39
- ---
40
-
41
- ## 3. Package Structure
42
-
43
- ```
44
- xertica-ui/
45
- ├── components/ # Source components (ships in package)
46
- │ ├── ui/ # Design system primitives
47
- │ ├── layout/ # Sidebar, Header
48
- │ ├── brand/ # XerticaProvider, logos, ThemeToggle, LanguageSelector
49
- │ ├── assistant/ # XerticaAssistant, ModernChatInput, MarkdownMessage, CodeBlock, FormattedDocument
50
- │ ├── blocks/ # Composed dashboard cards + matching *Skeleton variants
51
- │ ├── media/ # VideoPlayer, AudioPlayer, FloatingMediaWrapper
52
- │ ├── pages/ # Full-page template components
53
- │ └── shared/ # Internal utils (use-mobile, assistant-utils, error-boundary, error-fallbacks)
54
- ├── contexts/ # React contexts (LayoutContext, ThemeContext, LanguageContext, etc.)
55
- ├── features/ # Server-state hooks + mock data (home, assistant) — used by Storybook pages
56
- ├── hooks/ # Hook re-exports
57
- ├── lib/ # Shared singletons — currently query-client.ts
58
- ├── utils/ # Utility functions (demo-responses, gemini)
59
- ├── locales/ # i18n translation files — one folder per language
60
- │ ├── pt-BR/ # {common,nav,errors,languageSelector,themeToggle}.json
61
- │ │ ├── pages/ # home, templates, login, resetPassword, verifyEmail,
62
- │ │ │ # loginTemplate, formTemplate, dashboardTemplate, crudTemplate
63
- │ │ └── components/ # assistant, sidebar, media, projectCard, profileCard,
64
- │ │ # notificationCard, activityCard, stats, team
65
- │ ├── en/ # (same structure)
66
- │ └── es/ # (same structure)
67
- ├── i18n.ts # i18next setup (registerLanguageResource helper exported)
68
- ├── styles/ # Global CSS and token maps
69
- ├── templates/ # CLI scaffold template (FSD/FDA project)
70
- ├── bin/ # CLI source + helpers
71
- │ ├── cli.ts # commander entry point (init, update)
72
- │ ├── language-config.ts # language registry + code generators
73
- │ └── generate-tokens.ts # color theme generator
74
- ├── dist/ # Compiled library (ES + CJS + CSS + types)
75
- ├── docs/ # Markdown docs (ships in package for AI agents)
76
- ├── llms.txt # AI documentation index
77
- ├── llms-compact.txt # Compact AI reference
78
- ├── llms-full.txt # Full AI documentation
79
- └── components.json # Machine-readable component registry
80
- ```
81
-
82
- ### Why source ships with the package
83
-
84
- The `components/`, `contexts/`, `hooks/`, `lib/`, `i18n.ts`, and `locales/` directories are intentionally included in the npm package (via the `files` field in `package.json`). AI agents running in consumer projects can inspect source, stories, and documentation directly from `node_modules/xertica-ui/`. This is the primary AI-first design decision.
85
-
86
- ---
87
-
88
- ## 4. Subpath Exports
89
-
90
- The package exposes 7 entry points. Always use the most specific subpath:
91
-
92
- ```tsx
93
- import { Button, Card, Input } from 'xertica-ui/ui';
94
- import { QuickActionCard, ActivityCardSkeleton } from 'xertica-ui/blocks';
95
- import { Sidebar, Header } from 'xertica-ui/layout';
96
- import { XerticaProvider, XerticaLogo, LanguageSelector } from 'xertica-ui/brand';
97
- import { XerticaAssistant } from 'xertica-ui/assistant';
98
- import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
99
- import { useLayout, useTheme, useLanguage } from 'xertica-ui/hooks';
100
- import 'xertica-ui/style.css'; // once, at root
101
- ```
102
-
103
- The root `from 'xertica-ui'` exports everything (including i18n surface: `DEFAULT_LANGUAGES`, `LanguageDefinition`, `registerLanguageResource`, and `i18n` instance) and remains supported for backward compatibility.
104
-
105
- > **Note**: `useLanguage` is exported from `xertica-ui/hooks` and `xertica-ui` (root) — but **not** from `xertica-ui/brand`. The brand subpath exports only the `LanguageSelector` component and the `Language` type.
106
-
107
- ### Adding a new export to a subpath
108
-
109
- 1. Add the export to the relevant barrel (`components/[category]/index.ts`)
110
- 2. Verify it appears in the compiled `dist/[category].es.js` after `npm run build`
111
- 3. If adding a new top-level category, also update `vite.config.ts` (`lib.entry`) and `package.json` (`exports`)
112
-
113
- ---
114
-
115
- ## 5. Design Tokens — Rules for Component Authors
116
-
117
- All **library components** (`components/ui/`, `components/layout/`, etc.) must use semantic CSS tokens exclusively. Never hardcode colors, radii, or shadows in library source:
118
-
119
- ```tsx
120
- // ✅ Correct — library component
121
- className="bg-primary text-primary-foreground rounded-[var(--radius)]"
122
-
123
- // ❌ Wrong — library component
124
- className="bg-blue-600 text-white rounded-lg"
125
- style={{ backgroundColor: '#3b82f6' }}
126
- ```
127
-
128
- > **Note for Storybook stories and consumer applications:** The strict "semantic tokens only" rule applies to **library component internals** and to **semantic/status contexts** (error states, warning banners, success indicators, status badges) in all code. For layout, spacing, and general non-semantic UI in stories or consumer apps, standard Tailwind color utilities (`bg-blue-500`, `text-gray-700`) are acceptable when no semantic token maps to the intent. Raw hex values and `rgb()`/`hsl()` literals are **never** acceptable in any context.
129
-
130
- ### Token reference
131
-
132
- ```
133
- bg-background / text-foreground Page background and body text
134
- bg-card / text-card-foreground Card surfaces
135
- bg-muted / text-muted-foreground Subdued backgrounds and secondary text
136
- bg-primary / text-primary-foreground Primary actions and active states
137
- bg-secondary / text-secondary-fg Secondary actions
138
- bg-destructive Danger / error states
139
- bg-accent / text-accent-foreground Hover states
140
- bg-success / bg-info / bg-warning Semantic state colors
141
- border-border Standard borders
142
- border-input Form field borders
143
- ring-ring Focus rings
144
- ```
145
-
146
- ### Border radius
147
-
148
- Always use `rounded-[var(--radius)]` — never `rounded-sm`, `rounded-lg`, or any fixed radius class. The radius is a brand token that must be overridable by consumers.
149
-
150
- ---
151
-
152
- ## 6. Component Authoring Rules
153
-
154
- ### Non-negotiable
155
-
156
- - **Never use native HTML interactive elements** where a library component exists. `<Button>` wraps `<button>`, `<Input>` wraps `<input>`. New components must follow the same pattern.
157
- - **All interactive components must be keyboard navigable** and follow ARIA patterns. Build on Radix UI primitives.
158
- - **Icons come from `lucide-react` only.** No custom SVGs, no other icon libraries.
159
- - **No raw inline styles** (except for dynamic values like `sidebarWidth` that genuinely require them).
160
- - **No hardcoded user-facing strings.** Every label, aria-label, placeholder, tooltip, toast, and error message goes through `useTranslation()` and a key under `locales/*.json`. See section 7 below.
161
- - **Pair every data-bearing block with a matching `*Skeleton`.** See section 8 below.
162
-
163
- ### Component file structure
164
-
165
- ```
166
- components/ui/my-component/
167
- index.ts ← public re-exports only
168
- my-component.tsx ← implementation
169
- my-component.stories.tsx
170
- my-component.mdx
171
- my-component.test.tsx
172
- ```
173
-
174
- ### Stories requirements
175
-
176
- Every component must have:
177
-
178
- - A `Default` story showing the most common usage
179
- - Stories for all major prop variants
180
- - An MDX page with: overview, when to use / not to use, props table, examples, AI Rules
181
-
182
- ### AI Rules section (mandatory in every component doc)
183
-
184
- The `## AI Rules` section at the bottom of every `docs/components/[name].md` must contain:
185
-
186
- - What the agent must NEVER do with this component
187
- - What the agent must ALWAYS do
188
- - Common mistakes the AI makes and their correct form
189
-
190
- ---
191
-
192
- ## 7. Internationalization (i18n) Rules
193
-
194
- Every library component is fully translated via **`i18next`** + **`react-i18next`**. Follow these rules when authoring components:
195
-
196
- ### Component code
197
-
198
- - **Use `useTranslation()` inside components and custom hooks.** Never hardcode user-facing strings in JSX.
199
- - **Use `i18n.t()` (the imported instance) inside non-component code** (mock fetch functions, utility modules). `useTranslation` is a hook and cannot be called outside React contexts.
200
- - **Add new keys to all three locales** — place the key in the relevant split file (e.g., `locales/pt-BR/components/assistant.json` for a new assistant string, `locales/pt-BR/pages/home.json` for a home-page string) and mirror the same change in `templates/src/locales/<lang>/`. Because `i18n.ts` uses `import.meta.glob`, no import changes are needed.
201
-
202
- ### Factory functions, not frozen constants
203
-
204
- ```ts
205
- // ❌ Wrong — i18n.t() evaluated at module load, frozen in initial language
206
- export const MOCK_FEEDBACK_OPTIONS = [
207
- i18n.t('assistant.feedback.notWhatIWanted'),
208
- ];
209
-
210
- // ✅ Correct — re-evaluated at call time, always returns current language
211
- export function getMockFeedbackOptions() {
212
- return [i18n.t('assistant.feedback.notWhatIWanted')];
213
- }
214
- ```
215
-
216
- The same rule applies inside components when building label maps for enums: wrap them in `useMemo` so `t()` re-runs after a language change.
217
-
218
- ### Language-aware React Query keys
219
-
220
- Every server-state hook whose response contains translated strings **must** include the active language in its `queryKey`:
221
-
222
- ```ts
223
- import { useLanguage } from 'xertica-ui/hooks';
224
-
225
- export function useFeatureCards() {
226
- const { language } = useLanguage();
227
- return useQuery({
228
- queryKey: ['home', 'feature-cards', language], // ← language as third element
229
- queryFn: fetchFeatureCards,
230
- });
231
- }
232
- ```
233
-
234
- Switching language creates a new cache key → cache miss → automatic refetch in the new locale. No page reload. Switching back hits the cache (instant). See `docs/state-management.md` and `docs/i18n.md`.
235
-
236
- ### Runtime-configurable language set
237
-
238
- The set of available languages is **not** a strict union — it is a runtime list passed via `availableLanguages` on `<XerticaProvider>` / `<LanguageProvider>`. The `Language` type is `string`, not `'pt-BR' | 'en' | 'es'`.
239
-
240
- - **Never modify** `DEFAULT_LANGUAGES` directly to add a new locale for one project.
241
- - **To add a locale to the library itself**: create a folder at `locales/<code>/` mirroring an existing language (all subdirectory files: `common.json`, `nav.json`, `errors.json`, `languageSelector.json`, `themeToggle.json`, `pages/*.json`, `components/*.json`). Mirror the same folder under `templates/src/locales/<code>/`. No changes to `i18n.ts` are needed — `import.meta.glob` auto-discovers the new folder. Then add the descriptor to `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx` and add the language to `SUPPORTED_LANGUAGES` in `bin/language-config.ts`.
242
-
243
- ### LanguageSelector auto-hides
244
-
245
- `<LanguageSelector>` renders `null` when `useLanguage().isMonolingual === true`. Never conditionally render the selector yourself — just include it. Pass `showWhenMonolingual` only when you explicitly need it visible.
246
-
247
- ---
248
-
249
- ## 8. Loading-State Skeletons
250
-
251
- Every data-bearing block component **must** ship with a matching `*Skeleton` companion that mirrors the layout with pulsing placeholders.
252
-
253
- ### Where to place them
254
-
255
- ```
256
- components/blocks/card-patterns/
257
- ProjectCard.tsx
258
- ProjectCardSkeleton.tsx ← matching skeleton
259
- ProjectCard.stories.tsx ← include stories for both
260
- ```
261
-
262
- ### Naming + API conventions
263
-
264
- - Name: `<ComponentName>Skeleton`
265
- - Built from `<Skeleton>` (in `xertica-ui/ui`) + the same `Card`/`CardHeader`/`CardContent` primitives the real component uses — so the placeholder occupies the same vertical footprint
266
- - Expose toggle props for layout regions that can be hidden in the real component (`showStats`, `showActions`, `showViewAll`, etc.)
267
- - Expose `rows` (or `memberCount`) for list/grid sections so callers can match the loaded state's row count
268
-
269
- ### Export contract
270
-
271
- - Re-export from the block's `index.ts` alongside the data component
272
- - Re-export the props type with the matching name (`<ComponentName>SkeletonProps`)
273
- - Document them in the same `docs/components/[name].md` "Loading States" section
274
- - Include them in `card-patterns.stories.tsx` (and any aggregate MDX) so they appear in Storybook Docs
275
-
276
- ### Usage pattern
277
-
278
- ```tsx
279
- {isLoading
280
- ? <ActivityCardSkeleton rows={5} />
281
- : <ActivityCard items={items} />}
282
- ```
283
-
284
- ---
285
-
286
- ## 9. Shared Singletons (`lib/`)
287
-
288
- The `lib/` directory holds singletons that bridge React-component code and non-component modules.
289
-
290
- - **`lib/query-client.ts`** the shared `QueryClient` instance. `App.tsx` passes it to `<QueryClientProvider>`. Library code that needs to read the same instance uses `useQueryClient()` (NOT the singleton directly) so consumer-supplied clients also work. The singleton exists so that `App.tsx` can wire `<QueryClientProvider client={queryClient}>` while keeping the rest of the library agnostic.
291
-
292
- Do not add new singletons here without a strong cross-cutting reason. Prefer React context.
293
-
294
- ---
295
-
296
- ## 10. Adding a New Component
297
-
298
- 1. Create `components/ui/[name]/` with the 4 required files (source, stories, mdx, test)
299
- 2. Export from `components/ui/index.ts`
300
- 3. If the component renders data (cards, lists, tables, KPIs), **also create a `[name]Skeleton.tsx`** in the same directory and export it from the same index (see section 8)
301
- 4. **Add all user-facing strings to the appropriate split locale file** for all three languages (e.g., `locales/pt-BR/components/<name>.json` for a new UI component, or `locales/pt-BR/pages/<name>.json` for a page template). Mirror under `templates/src/locales/<lang>/`. Use `useTranslation()` in the component. (See section 7.)
302
- 5. Create `docs/components/[name].md` following the existing format
303
- 6. Add an entry to `components.json` with all fields: `name`, `docPath`, `sourcePath`, `description`, `category`, `import`, `keywords`, `relatedComponents`
304
- 7. Add the component to the relevant section of `llms-full.txt`
305
- 8. Add a one-line entry to `llms.txt` under the correct category
306
- 9. Update `llms-compact.txt` if the component is commonly used
307
- 10. Update `docs/decision-tree.md` if it overlaps with existing components
308
- 11. Update the component count in `README.md`, `llms.txt`, `llms-full.txt`, and `docs/llms.md`
309
- 12. Add a `CHANGELOG.md` entry
310
-
311
- ---
312
-
313
- ## 11. Build System
314
-
315
- ```bash
316
- npm run build # Vite multi-entry build (ES + CJS, 7 entry points)
317
- npm run build:types # tsc declarations dist/components/**/*.d.ts
318
- npm run build:cli # tsup CLI build → dist/cli.js
319
- npm run build:production # alias for npm run build
320
- ```
321
-
322
- **prepublishOnly** runs all three in sequence automatically on `npm publish`.
323
-
324
- ### Multi-entry build
325
-
326
- `vite.config.ts` uses `lib.entry` as an object with 7 keys. Output files follow `[entryName].[format].js`. UMD is NOT used (Vite does not support multi-entry + UMD). Format is `["es", "cjs"]`.
327
-
328
- ### TypeScript declarations
329
-
330
- `tsconfig.build.json` compiles declarations. It includes `components/**/*`, `contexts/**/*`, `hooks/**/*`. The `dist/components/` structure mirrors the source and is referenced by the `types` fields in `package.json` exports.
331
-
332
- ---
333
-
334
- ## 12. CLI
335
-
336
- The CLI (`bin/cli.ts`) scaffolds new projects via `npx xertica-ui@latest init` and updates existing ones via `npx xertica-ui update`. Helpers live in `bin/language-config.ts` (language registry, code generators, persistence) and `bin/generate-tokens.ts` (color theme generator).
337
-
338
- ### `init` flow
339
-
340
- 1. Prompts the user for:
341
- - Pages to include (Login, Home, Template — multi-select)
342
- - **Languages to support** (`pt-BR`, `en`, `es` — multi-select, minimum 1)
343
- - Default color theme
344
- - Install dependencies automatically
345
- 2. Copies root config files, `CLAUDE.md`, `src/app/components/AppLayout.tsx`, and `src/shared/`
346
- 3. **Generates** `src/app/App.tsx` using `generateAppTsx(selectedLanguages)` — injects the `availableLanguages` prop on `<XerticaProvider>` (omitted when all 3 defaults are selected)
347
- 4. **Generates** `src/i18n.ts` using `generateI18nFile(selectedLanguages)` — imports and `resources` for exactly the selected languages
348
- 5. Copies the locale **folders** for the selected languages via `syncLocaleFiles(..., { pruneOthers: true })` — each language is a directory tree (`<lang>/{common.json,nav.json,...,pages/,components/}`). Legacy flat `<lang>.json` files (pre-2.2.0) are automatically removed during sync.
349
- 6. Persists the selection in `src/locales/.languages.json` (schema `{ version: 1, codes: string[] }`)
350
- 7. Copies selected `src/features/` (auth, home, template); `assistant/` is always copied (AppLayout depends on it)
351
- 8. Copies selected `src/pages/` thin wrappers; `AssistantPage.tsx` is always copied
352
- 9. Generates a tailored `AuthGuard.tsx` based on selected pages
353
- 10. Generates `src/styles/xertica/tokens.css` for the chosen color theme
354
-
355
- ### `update` flow
356
-
357
- The `update` command offers three options:
358
-
359
- | Option | Behavior |
360
- |---|---|
361
- | **Theme only** | Regenerates `src/styles/xertica/tokens.css` from a new theme |
362
- | **Languages** | Reads `src/locales/.languages.json`, shows current selection, prompts for the new set, computes diff (`+`/`-`), and regenerates `App.tsx` + `i18n.ts`, copies/prunes locale **folders** (migrates legacy flat `.json` files if found) |
363
- | **Project files** | Re-installs a specific version of `xertica-ui` and copies selected parts (app, shared, features, pages, root config) — for the `app` branch, the user's language selection is **preserved** by reading `.languages.json` (or inferring from `locales/` for legacy projects) and regenerating `App.tsx` + `i18n.ts` accordingly |
364
-
365
- ### Authoring CLI code
366
-
367
- - Generators (`generateAppTsx`, `generateI18nFile`) live in `bin/language-config.ts`. Always update both when changing the App.tsx structure or i18n.ts setup in `templates/src/`.
368
- - Static files in `templates/src/app/App.tsx` and `templates/src/i18n.ts` exist for reference/Storybook but are **not** copied during `init` — they are reconstructed by the generators. Keep them in sync with the generators so contributors reading them see the canonical shape.
369
- - `SUPPORTED_LANGUAGES` in `bin/language-config.ts` is the single source of truth for CLI-exposed locales. Adding a language requires a **folder** at `templates/src/locales/<code>/` (mirroring the existing folder structure), an entry in `SUPPORTED_LANGUAGES`, and a corresponding entry in `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx`.
370
-
371
- ---
372
-
373
- ## 13. Versioning
374
-
375
- This project follows [Semantic Versioning](https://semver.org/):
376
-
377
- - **Patch** (2.0.x): Bug fixes, doc updates, export additions that don't break anything
378
- - **Minor** (2.x.0): New components, new subpath exports, new CLI features
379
- - **Major** (x.0.0): Breaking changes to component APIs, token renames, export removals
380
-
381
- Every version bump must:
382
-
383
- 1. Update `version` in `package.json`
384
- 2. Update the version badge in `README.md`
385
- 3. Add a `CHANGELOG.md` entry with Added / Changed / Fixed sections
386
- 4. Update `templates/package.json` `xertica-ui` dependency to `^[new-version]`
387
-
388
- > The CLI version is read from `package.json` at runtime (`bin/cli.ts` calls `JSON.parse(readFileSync('package.json'))`). No manual `.version()` update needed.
389
-
390
- ---
391
-
392
- ## 14. Pre-Release Checklist
393
-
394
- Before running `npm publish`:
395
-
396
- - [ ] `npm run build:production` passes without errors
397
- - [ ] `npm run build:types` passes without errors
398
- - [ ] `npm run build:cli` passes without errors
399
- - [ ] `npm test` passes (unit + Storybook chromium)
400
- - [ ] All new components have docs in `docs/components/`, entry in `components.json`, and section in `llms-full.txt`
401
- - [ ] All new user-facing strings are in the appropriate split file under `locales/pt-BR/`, `locales/en/`, `locales/es/` AND mirrored in `templates/src/locales/<lang>/`
402
- - [ ] Data-bearing block components have a matching `*Skeleton` export and documentation
403
- - [ ] `llms.txt` is up to date (component count, new entries)
404
- - [ ] `CHANGELOG.md` has an entry for this version
405
- - [ ] `README.md` version badge is updated
406
- - [ ] `templates/package.json` references the new version
1
+ # Xertica UI — Library Guidelines
2
+
3
+ > **Scope**: These guidelines apply to contributors developing the `xertica-ui` package itself (components, documentation, build system). For guidelines on projects that **consume** the package, see `templates/guidelines/Guidelines.md`.
4
+
5
+ ---
6
+
7
+ ## 1. What Xertica UI Is
8
+
9
+ Xertica UI is an enterprise-grade React component library distributed as an npm package. It is designed to be consumed by both human developers and AI coding agents (LLMs, Cursor, Claude Code, Copilot). Every design decision — from the component API to the documentation format — must serve both audiences.
10
+
11
+ **Stack:** React 18 · TypeScript 5 · Tailwind CSS v4 · Radix UI · Lucide React · Vite 6
12
+
13
+ ---
14
+
15
+ ## 2. AI-First Documentation
16
+
17
+ Documentation is a first-class deliverable. Every component ships with:
18
+
19
+ | File | Purpose | Location |
20
+ | --------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
21
+ | `llms.txt` | Index file following the llmstxt.org standard. Links to all docs. | `/llms.txt` |
22
+ | `llms-compact.txt` | ~4K token quick reference. Critical rules, imports, 12 key components with examples. | `/llms-compact.txt` |
23
+ | `llms-full.txt` | Complete documentation of all 97 components in one file for large-context LLMs. | `/llms-full.txt` |
24
+ | `components.json` | Machine-readable registry: name, category, import path, keywords, related components. | `/components.json` |
25
+ | `docs/decision-tree.md` | Decision trees: Dialog vs Sheet, Tooltip vs HoverCard, etc. | `/docs/decision-tree.md` |
26
+ | `docs/components/[name].md` | Individual component reference with props, examples, and AI rules. | `/docs/components/` |
27
+ | `docs/ai-usage.md` | Mandatory rules for AI agents operating on this library. | `/docs/ai-usage.md` |
28
+ | `CLAUDE.md` | Auto-generated system prompt for consumer projects (injected by CLI). | `/templates/CLAUDE.md` |
29
+
30
+ ### When to update documentation
31
+
32
+ Every PR that changes a component **must** update:
33
+
34
+ - `docs/components/[name].md` — if props, behavior, or examples changed
35
+ - `llms-full.txt` — the relevant component section
36
+ - `components.json` — if the component name, import path, or description changed
37
+ - `CHANGELOG.md` — under the current unreleased version
38
+
39
+ ---
40
+
41
+ ## 3. Package Structure
42
+
43
+ ```
44
+ xertica-ui/
45
+ ├── components/ # Source components (ships in package)
46
+ │ ├── ui/ # Design system primitives
47
+ │ ├── layout/ # Sidebar, Header
48
+ │ ├── brand/ # XerticaProvider, logos, ThemeToggle, LanguageSelector
49
+ │ ├── assistant/ # XerticaAssistant, ModernChatInput, MarkdownMessage, CodeBlock, FormattedDocument
50
+ │ ├── blocks/ # Composed dashboard cards + matching *Skeleton variants
51
+ │ ├── media/ # VideoPlayer, AudioPlayer, FloatingMediaWrapper
52
+ │ ├── pages/ # Full-page template components
53
+ │ └── shared/ # Internal utils (use-mobile, assistant-utils, error-boundary, error-fallbacks)
54
+ ├── contexts/ # React contexts (LayoutContext, ThemeContext, LanguageContext, etc.)
55
+ ├── features/ # Server-state hooks + mock data (home, assistant) — used by Storybook pages
56
+ ├── hooks/ # Hook re-exports
57
+ ├── lib/ # Shared singletons — currently query-client.ts
58
+ ├── utils/ # Utility functions (demo-responses, gemini)
59
+ ├── locales/ # i18n translation files — one folder per language
60
+ │ ├── pt-BR/ # {common,nav,errors,languageSelector,themeToggle}.json
61
+ │ │ ├── pages/ # home, templates, login, resetPassword, verifyEmail,
62
+ │ │ │ # loginTemplate, formTemplate, dashboardTemplate, crudTemplate
63
+ │ │ └── components/ # assistant, sidebar, media, projectCard, profileCard,
64
+ │ │ # notificationCard, activityCard, stats, team
65
+ │ ├── en/ # (same structure)
66
+ │ └── es/ # (same structure)
67
+ ├── i18n.ts # i18next setup (registerLanguageResource helper exported)
68
+ ├── styles/ # Global CSS and token maps
69
+ ├── templates/ # CLI scaffold template (FSD/FDA project)
70
+ ├── bin/ # CLI source + helpers
71
+ │ ├── cli.ts # commander entry point (init, update)
72
+ │ ├── language-config.ts # language registry + code generators
73
+ │ └── generate-tokens.ts # color theme generator
74
+ ├── dist/ # Compiled library (ES + CJS + CSS + types)
75
+ ├── docs/ # Markdown docs (ships in package for AI agents)
76
+ ├── llms.txt # AI documentation index
77
+ ├── llms-compact.txt # Compact AI reference
78
+ ├── llms-full.txt # Full AI documentation
79
+ └── components.json # Machine-readable component registry
80
+ ```
81
+
82
+ ### Why source ships with the package
83
+
84
+ The `components/`, `contexts/`, `hooks/`, `lib/`, `i18n.ts`, and `locales/` directories are intentionally included in the npm package (via the `files` field in `package.json`). AI agents running in consumer projects can inspect source, stories, and documentation directly from `node_modules/xertica-ui/`. This is the primary AI-first design decision.
85
+
86
+ ---
87
+
88
+ ## 4. Subpath Exports
89
+
90
+ The package exposes 7 entry points. Always use the most specific subpath:
91
+
92
+ ```tsx
93
+ import { Button, Card, Input } from 'xertica-ui/ui';
94
+ import { QuickActionCard, ActivityCardSkeleton } from 'xertica-ui/blocks';
95
+ import { Sidebar, Header } from 'xertica-ui/layout';
96
+ import { XerticaProvider, XerticaLogo, LanguageSelector } from 'xertica-ui/brand';
97
+ import { XerticaAssistant } from 'xertica-ui/assistant';
98
+ import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
99
+ import { useLayout, useTheme, useLanguage } from 'xertica-ui/hooks';
100
+ import 'xertica-ui/style.css'; // once, at root
101
+ ```
102
+
103
+ The root `from 'xertica-ui'` exports everything (including i18n surface: `DEFAULT_LANGUAGES`, `LanguageDefinition`, `registerLanguageResource`, and `i18n` instance) and remains supported for backward compatibility.
104
+
105
+ > **Note**: `useLanguage` is exported from `xertica-ui/hooks` and `xertica-ui` (root) — but **not** from `xertica-ui/brand`. The brand subpath exports only the `LanguageSelector` component and the `Language` type.
106
+
107
+ ### Adding a new export to a subpath
108
+
109
+ 1. Add the export to the relevant barrel (`components/[category]/index.ts`)
110
+ 2. Verify it appears in the compiled `dist/[category].es.js` after `npm run build`
111
+ 3. If adding a new top-level category, also update `vite.config.ts` (`lib.entry`) and `package.json` (`exports`)
112
+
113
+ ---
114
+
115
+ ## 5. Design Tokens — Rules for Component Authors
116
+
117
+ All **library components** (`components/ui/`, `components/layout/`, etc.) must use semantic CSS tokens exclusively. Never hardcode colors, radii, or shadows in library source:
118
+
119
+ ```tsx
120
+ // ✅ Correct — library component
121
+ className="bg-primary text-primary-foreground rounded-[var(--radius)]"
122
+
123
+ // ❌ Wrong — library component
124
+ className="bg-blue-600 text-white rounded-lg"
125
+ style={{ backgroundColor: '#3b82f6' }}
126
+ ```
127
+
128
+ > **Note for Storybook stories and consumer applications:** The strict "semantic tokens only" rule applies to **library component internals** and to **semantic/status contexts** (error states, warning banners, success indicators, status badges) in all code. For layout, spacing, and general non-semantic UI in stories or consumer apps, standard Tailwind color utilities (`bg-blue-500`, `text-gray-700`) are acceptable when no semantic token maps to the intent. Raw hex values and `rgb()`/`hsl()` literals are **never** acceptable in any context.
129
+
130
+ ### Token reference
131
+
132
+ ```
133
+ bg-background / text-foreground Page background and body text
134
+ bg-card / text-card-foreground Card surfaces
135
+ bg-muted / text-muted-foreground Subdued backgrounds and secondary text
136
+ bg-primary / text-primary-foreground Primary actions and active states
137
+ bg-secondary / text-secondary-fg Secondary actions
138
+ bg-destructive Danger / error states
139
+ bg-accent / text-accent-foreground Hover states
140
+ bg-success / bg-info / bg-warning Semantic state colors
141
+ border-border Standard borders
142
+ border-input Form field borders
143
+ ring-ring Focus rings
144
+ ```
145
+
146
+ ### Border radius
147
+
148
+ Always use `rounded-[var(--radius)]` — never `rounded-sm`, `rounded-lg`, or any fixed radius class. The radius is a brand token that must be overridable by consumers.
149
+
150
+ ---
151
+
152
+ ## 6. Component Authoring Rules
153
+
154
+ ### Non-negotiable
155
+
156
+ - **Never use native HTML interactive elements** where a library component exists. `<Button>` wraps `<button>`, `<Input>` wraps `<input>`. New components must follow the same pattern.
157
+ - **All interactive components must be keyboard navigable** and follow ARIA patterns. Build on Radix UI primitives.
158
+ - **Icons come from `lucide-react` only.** No custom SVGs, no other icon libraries.
159
+ - **No raw inline styles** (except for dynamic values like `sidebarWidth` that genuinely require them).
160
+ - **No hardcoded user-facing strings.** Every label, aria-label, placeholder, tooltip, toast, and error message goes through `useTranslation()` and a key under `locales/*.json`. See section 7 below.
161
+ - **Pair every data-bearing block with a matching `*Skeleton`.** See section 8 below.
162
+
163
+ ### Component file structure
164
+
165
+ ```
166
+ components/ui/my-component/
167
+ index.ts ← public re-exports only
168
+ my-component.tsx ← implementation
169
+ my-component.stories.tsx
170
+ my-component.mdx
171
+ my-component.test.tsx
172
+ ```
173
+
174
+ ### Stories requirements
175
+
176
+ Every component must have:
177
+
178
+ - A `Default` story showing the most common usage
179
+ - Stories for all major prop variants
180
+ - An MDX page with: overview, when to use / not to use, props table, examples, AI Rules
181
+
182
+ ### AI Rules section (mandatory in every component doc)
183
+
184
+ The `## AI Rules` section at the bottom of every `docs/components/[name].md` must contain:
185
+
186
+ - What the agent must NEVER do with this component
187
+ - What the agent must ALWAYS do
188
+ - Common mistakes the AI makes and their correct form
189
+
190
+ ---
191
+
192
+ ## 7. Internationalization (i18n) Rules
193
+
194
+ Every library component is fully translated via **`i18next`** + **`react-i18next`**. Follow these rules when authoring components:
195
+
196
+ ### Component code
197
+
198
+ - **Use `useTranslation()` inside components and custom hooks.** Never hardcode user-facing strings in JSX.
199
+ - **Use `i18n.t()` (the imported instance) inside non-component code** (mock fetch functions, utility modules). `useTranslation` is a hook and cannot be called outside React contexts.
200
+ - **Add new keys to all three locales** — place the key in the relevant split file (e.g., `locales/pt-BR/components/assistant.json` for a new assistant string, `locales/pt-BR/pages/home.json` for a home-page string) and mirror the same change in `templates/src/locales/<lang>/`. Because `i18n.ts` uses `import.meta.glob`, no import changes are needed.
201
+
202
+ ### Factory functions, not frozen constants
203
+
204
+ ```ts
205
+ // ❌ Wrong — i18n.t() evaluated at module load, frozen in initial language
206
+ export const MOCK_FEEDBACK_OPTIONS = [i18n.t('assistant.feedback.notWhatIWanted')];
207
+
208
+ // ✅ Correct — re-evaluated at call time, always returns current language
209
+ export function getMockFeedbackOptions() {
210
+ return [i18n.t('assistant.feedback.notWhatIWanted')];
211
+ }
212
+ ```
213
+
214
+ The same rule applies inside components when building label maps for enums: wrap them in `useMemo` so `t()` re-runs after a language change.
215
+
216
+ ### Language-aware React Query keys
217
+
218
+ Every server-state hook whose response contains translated strings **must** include the active language in its `queryKey`:
219
+
220
+ ```ts
221
+ import { useLanguage } from 'xertica-ui/hooks';
222
+
223
+ export function useFeatureCards() {
224
+ const { language } = useLanguage();
225
+ return useQuery({
226
+ queryKey: ['home', 'feature-cards', language], // language as third element
227
+ queryFn: fetchFeatureCards,
228
+ });
229
+ }
230
+ ```
231
+
232
+ Switching language creates a new cache key → cache miss → automatic refetch in the new locale. No page reload. Switching back hits the cache (instant). See `docs/state-management.md` and `docs/i18n.md`.
233
+
234
+ ### Runtime-configurable language set
235
+
236
+ The set of available languages is **not** a strict union — it is a runtime list passed via `availableLanguages` on `<XerticaProvider>` / `<LanguageProvider>`. The `Language` type is `string`, not `'pt-BR' | 'en' | 'es'`.
237
+
238
+ - **Never modify** `DEFAULT_LANGUAGES` directly to add a new locale for one project.
239
+ - **To add a locale to the library itself**: create a folder at `locales/<code>/` mirroring an existing language (all subdirectory files: `common.json`, `nav.json`, `errors.json`, `languageSelector.json`, `themeToggle.json`, `pages/*.json`, `components/*.json`). Mirror the same folder under `templates/src/locales/<code>/`. No changes to `i18n.ts` are needed — `import.meta.glob` auto-discovers the new folder. Then add the descriptor to `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx` and add the language to `SUPPORTED_LANGUAGES` in `bin/language-config.ts`.
240
+
241
+ ### LanguageSelector auto-hides
242
+
243
+ `<LanguageSelector>` renders `null` when `useLanguage().isMonolingual === true`. Never conditionally render the selector yourself — just include it. Pass `showWhenMonolingual` only when you explicitly need it visible.
244
+
245
+ ---
246
+
247
+ ## 8. Loading-State Skeletons
248
+
249
+ Every data-bearing block component **must** ship with a matching `*Skeleton` companion that mirrors the layout with pulsing placeholders.
250
+
251
+ ### Where to place them
252
+
253
+ ```
254
+ components/blocks/card-patterns/
255
+ ProjectCard.tsx
256
+ ProjectCardSkeleton.tsx ← matching skeleton
257
+ ProjectCard.stories.tsx ← include stories for both
258
+ ```
259
+
260
+ ### Naming + API conventions
261
+
262
+ - Name: `<ComponentName>Skeleton`
263
+ - Built from `<Skeleton>` (in `xertica-ui/ui`) + the same `Card`/`CardHeader`/`CardContent` primitives the real component uses — so the placeholder occupies the same vertical footprint
264
+ - Expose toggle props for layout regions that can be hidden in the real component (`showStats`, `showActions`, `showViewAll`, etc.)
265
+ - Expose `rows` (or `memberCount`) for list/grid sections so callers can match the loaded state's row count
266
+
267
+ ### Export contract
268
+
269
+ - Re-export from the block's `index.ts` alongside the data component
270
+ - Re-export the props type with the matching name (`<ComponentName>SkeletonProps`)
271
+ - Document them in the same `docs/components/[name].md` "Loading States" section
272
+ - Include them in `card-patterns.stories.tsx` (and any aggregate MDX) so they appear in Storybook Docs
273
+
274
+ ### Usage pattern
275
+
276
+ ```tsx
277
+ {
278
+ isLoading ? <ActivityCardSkeleton rows={5} /> : <ActivityCard items={items} />;
279
+ }
280
+ ```
281
+
282
+ ---
283
+
284
+ ## 9. Shared Singletons (`lib/`)
285
+
286
+ The `lib/` directory holds singletons that bridge React-component code and non-component modules.
287
+
288
+ - **`lib/query-client.ts`** the shared `QueryClient` instance. `App.tsx` passes it to `<QueryClientProvider>`. Library code that needs to read the same instance uses `useQueryClient()` (NOT the singleton directly) so consumer-supplied clients also work. The singleton exists so that `App.tsx` can wire `<QueryClientProvider client={queryClient}>` while keeping the rest of the library agnostic.
289
+
290
+ Do not add new singletons here without a strong cross-cutting reason. Prefer React context.
291
+
292
+ ---
293
+
294
+ ## 10. Adding a New Component
295
+
296
+ 1. Create `components/ui/[name]/` with the 4 required files (source, stories, mdx, test)
297
+ 2. Export from `components/ui/index.ts`
298
+ 3. If the component renders data (cards, lists, tables, KPIs), **also create a `[name]Skeleton.tsx`** in the same directory and export it from the same index (see section 8)
299
+ 4. **Add all user-facing strings to the appropriate split locale file** for all three languages (e.g., `locales/pt-BR/components/<name>.json` for a new UI component, or `locales/pt-BR/pages/<name>.json` for a page template). Mirror under `templates/src/locales/<lang>/`. Use `useTranslation()` in the component. (See section 7.)
300
+ 5. Create `docs/components/[name].md` following the existing format
301
+ 6. Add an entry to `components.json` with all fields: `name`, `docPath`, `sourcePath`, `description`, `category`, `import`, `keywords`, `relatedComponents`
302
+ 7. Add the component to the relevant section of `llms-full.txt`
303
+ 8. Add a one-line entry to `llms.txt` under the correct category
304
+ 9. Update `llms-compact.txt` if the component is commonly used
305
+ 10. Update `docs/decision-tree.md` if it overlaps with existing components
306
+ 11. Update the component count in `README.md`, `llms.txt`, `llms-full.txt`, and `docs/llms.md`
307
+ 12. Add a `CHANGELOG.md` entry
308
+
309
+ ---
310
+
311
+ ## 11. Build System
312
+
313
+ ```bash
314
+ npm run build # Vite multi-entry build (ES + CJS, 7 entry points)
315
+ npm run build:types # tsc declarations → dist/components/**/*.d.ts
316
+ npm run build:cli # tsup CLI build dist/cli.js
317
+ npm run build:production # alias for npm run build
318
+ ```
319
+
320
+ **prepublishOnly** runs all three in sequence automatically on `npm publish`.
321
+
322
+ ### Multi-entry build
323
+
324
+ `vite.config.ts` uses `lib.entry` as an object with 7 keys. Output files follow `[entryName].[format].js`. UMD is NOT used (Vite does not support multi-entry + UMD). Format is `["es", "cjs"]`.
325
+
326
+ ### TypeScript declarations
327
+
328
+ `tsconfig.build.json` compiles declarations. It includes `components/**/*`, `contexts/**/*`, `hooks/**/*`. The `dist/components/` structure mirrors the source and is referenced by the `types` fields in `package.json` exports.
329
+
330
+ ---
331
+
332
+ ## 12. CLI
333
+
334
+ The CLI (`bin/cli.ts`) scaffolds new projects via `npx xertica-ui@latest init` and updates existing ones via `npx xertica-ui update`. Helpers live in `bin/language-config.ts` (language registry, code generators, persistence) and `bin/generate-tokens.ts` (color theme generator).
335
+
336
+ ### `init` flow
337
+
338
+ 1. Prompts the user for:
339
+ - Pages to include (Login, Home, Template — multi-select)
340
+ - **Languages to support** (`pt-BR`, `en`, `es` — multi-select, minimum 1)
341
+ - Default color theme
342
+ - **Enable dark mode support?** (confirm, default: true)
343
+ - **Include AI Assistant?** (confirm, default: true)
344
+ - Install dependencies automatically
345
+ 2. Copies root config files, `CLAUDE.md`, `src/app/components/AppLayout.tsx`, and `src/shared/`
346
+ 3. **Generates** `src/app/App.tsx` using `generateAppTsx(selectedLanguages, disableDarkMode)` — injects the `availableLanguages` prop on `<XerticaProvider>` (omitted when all 3 defaults are selected) and `disableDarkMode={true}` if disabled.
347
+ 4. **Generates** `src/i18n.ts` using `generateI18nFile(selectedLanguages)` — imports and `resources` for exactly the selected languages
348
+ 5. Copies the locale **folders** for the selected languages via `syncLocaleFiles(..., { pruneOthers: true })` — each language is a directory tree (`<lang>/{common.json,nav.json,...,pages/,components/}`). Legacy flat `<lang>.json` files (pre-2.2.0) are automatically removed during sync.
349
+ 6. Persists the selection in `src/locales/.languages.json` (schema `{ version: 1, codes: string[] }`)
350
+ 7. Copies selected `src/features/` (auth, home, template); `assistant/` is copied conditionally based on selection (AppLayout depends on it, but features are loaded dynamically)
351
+ 8. Copies selected `src/pages/` thin wrappers; `AssistantPage.tsx` is copied conditionally based on selection
352
+ 9. Generates a tailored `AuthGuard.tsx` based on selected pages
353
+ 10. Generates `src/styles/xertica/tokens.css` for the chosen color theme
354
+ 11. Persists configuration choices in `.xertica.json` (schema `{ version: 1, hasAssistant: boolean, disableDarkMode: boolean }`)
355
+
356
+ ### `update` flow
357
+
358
+ The `update` command offers five options:
359
+
360
+ | Option | Behavior |
361
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
362
+ | **Theme only** | Regenerates `src/styles/xertica/tokens.css` from a new theme |
363
+ | **Languages** | Reads `src/locales/.languages.json`, shows current selection, prompts for the new set, computes diff (`+`/`-`), and regenerates `App.tsx` + `i18n.ts`, copies/prunes locale **folders** (migrates legacy flat `.json` files if found) |
364
+ | **Dark Mode** | Toggles dark mode support: enables it or disables it (updates `.xertica.json` and regenerates `App.tsx` to set `disableDarkMode` flag) |
365
+ | **Assistant** | Adds or removes the AI Assistant (copies/deletes files, regenerates `AuthGuard.tsx`, `HomePage.tsx`, `TemplatePage.tsx`) |
366
+ | **Project files** | Re-installs a specific version of `xertica-ui` and copies selected parts (app, shared, features, pages, root config) — for the `app` branch, the user's language selection is **preserved** by reading `.languages.json` (or inferring from `locales/` for legacy projects) and regenerating `App.tsx` + `i18n.ts` accordingly |
367
+
368
+ ### Authoring CLI code
369
+
370
+ - Generators (`generateAppTsx`, `generateI18nFile`) live in `bin/language-config.ts`. Always update both when changing the App.tsx structure or i18n.ts setup in `templates/src/`.
371
+ - Static files in `templates/src/app/App.tsx` and `templates/src/i18n.ts` exist for reference/Storybook but are **not** copied during `init` — they are reconstructed by the generators. Keep them in sync with the generators so contributors reading them see the canonical shape.
372
+ - `SUPPORTED_LANGUAGES` in `bin/language-config.ts` is the single source of truth for CLI-exposed locales. Adding a language requires a **folder** at `templates/src/locales/<code>/` (mirroring the existing folder structure), an entry in `SUPPORTED_LANGUAGES`, and a corresponding entry in `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx`.
373
+
374
+ ---
375
+
376
+ ## 13. Versioning
377
+
378
+ This project follows [Semantic Versioning](https://semver.org/):
379
+
380
+ - **Patch** (2.0.x): Bug fixes, doc updates, export additions that don't break anything
381
+ - **Minor** (2.x.0): New components, new subpath exports, new CLI features
382
+ - **Major** (x.0.0): Breaking changes to component APIs, token renames, export removals
383
+
384
+ Every version bump must:
385
+
386
+ 1. Update `version` in `package.json`
387
+ 2. Update the version badge in `README.md`
388
+ 3. Add a `CHANGELOG.md` entry with Added / Changed / Fixed sections
389
+ 4. Update `templates/package.json` `xertica-ui` dependency to `^[new-version]`
390
+
391
+ > The CLI version is read from `package.json` at runtime (`bin/cli.ts` calls `JSON.parse(readFileSync('package.json'))`). No manual `.version()` update needed.
392
+
393
+ ---
394
+
395
+ ## 14. Pre-Release Checklist
396
+
397
+ Before running `npm publish`:
398
+
399
+ - [ ] `npm run build:production` passes without errors
400
+ - [ ] `npm run build:types` passes without errors
401
+ - [ ] `npm run build:cli` passes without errors
402
+ - [ ] `npm test` passes (unit + Storybook chromium)
403
+ - [ ] All new components have docs in `docs/components/`, entry in `components.json`, and section in `llms-full.txt`
404
+ - [ ] All new user-facing strings are in the appropriate split file under `locales/pt-BR/`, `locales/en/`, `locales/es/` AND mirrored in `templates/src/locales/<lang>/`
405
+ - [ ] Data-bearing block components have a matching `*Skeleton` export and documentation
406
+ - [ ] `llms.txt` is up to date (component count, new entries)
407
+ - [ ] `CHANGELOG.md` has an entry for this version
408
+ - [ ] `README.md` version badge is updated
409
+ - [ ] `templates/package.json` references the new version