xertica-ui 2.5.1 → 2.5.2

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