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