xertica-ui 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (708) hide show
  1. package/CHANGELOG.md +564 -525
  2. package/README.md +417 -382
  3. package/bin/cli.ts +1244 -748
  4. package/bin/generate-tokens.ts +262 -262
  5. package/bin/language-config.ts +5 -8
  6. package/components/assets/xertica-orbe-animation.ts +1162 -1162
  7. package/components/assistant/code-block/CodeBlock.tsx +268 -268
  8. package/components/assistant/code-block/code-block.stories.tsx +57 -57
  9. package/components/assistant/code-block/code-block.test.tsx +44 -44
  10. package/components/assistant/code-block/index.ts +1 -1
  11. package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
  12. package/components/assistant/formatted-document/formatted-document.stories.tsx +51 -51
  13. package/components/assistant/formatted-document/formatted-document.test.tsx +42 -42
  14. package/components/assistant/formatted-document/index.ts +1 -1
  15. package/components/assistant/index.ts +6 -6
  16. package/components/assistant/markdown-message/MarkdownMessage.tsx +152 -152
  17. package/components/assistant/markdown-message/index.ts +1 -1
  18. package/components/assistant/markdown-message/markdown-message.stories.tsx +50 -50
  19. package/components/assistant/markdown-message/markdown-message.test.tsx +33 -33
  20. package/components/assistant/modern-chat-input/ModernChatInput.tsx +17 -7
  21. package/components/assistant/modern-chat-input/index.ts +1 -1
  22. package/components/assistant/modern-chat-input/modern-chat-input.stories.tsx +131 -131
  23. package/components/assistant/modern-chat-input/modern-chat-input.test.tsx +79 -79
  24. package/components/assistant/xertica-assistant/index.ts +3 -3
  25. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
  26. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -106
  27. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
  28. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -78
  29. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
  30. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -560
  31. package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
  32. package/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.tsx +41 -41
  33. package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
  34. package/components/assistant/xertica-assistant/parts/index.ts +16 -16
  35. package/components/assistant/xertica-assistant/types.ts +134 -134
  36. package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
  37. package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +407 -407
  38. package/components/assistant/xertica-assistant/xertica-assistant.test.tsx +65 -65
  39. package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -613
  40. package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
  41. package/components/blocks/card-patterns/FeatureCard.tsx +109 -109
  42. package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +1 -6
  43. package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
  44. package/components/blocks/card-patterns/ProfileCard.tsx +112 -114
  45. package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
  46. package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +1 -6
  47. package/components/blocks/card-patterns/QuickActionCard.tsx +68 -68
  48. package/components/blocks/card-patterns/card-patterns.mdx +123 -123
  49. package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
  50. package/components/blocks/card-patterns/index.ts +29 -29
  51. package/components/blocks/index.ts +1 -1
  52. package/components/brand/branding/branding.stories.tsx +57 -57
  53. package/components/brand/index.ts +6 -6
  54. package/components/brand/language-selector/index.ts +1 -1
  55. package/components/brand/language-selector/language-selector.mdx +126 -126
  56. package/components/brand/language-selector/language-selector.stories.tsx +1 -4
  57. package/components/brand/theme-toggle/ThemeToggle.tsx +74 -70
  58. package/components/brand/theme-toggle/index.ts +1 -1
  59. package/components/brand/theme-toggle/theme-toggle.stories.tsx +34 -34
  60. package/components/brand/theme-toggle/theme-toggle.test.tsx +34 -34
  61. package/components/brand/xertica-logo/XerticaLogo.stories.tsx +82 -82
  62. package/components/brand/xertica-logo/XerticaLogo.tsx +104 -104
  63. package/components/brand/xertica-logo/index.ts +1 -1
  64. package/components/brand/xertica-logo/xertica-logo.test.tsx +26 -26
  65. package/components/brand/xertica-orbe/XerticaOrbe.tsx +1927 -1927
  66. package/components/brand/xertica-orbe/index.ts +1 -1
  67. package/components/brand/xertica-orbe/xertica-orbe.stories.tsx +40 -40
  68. package/components/brand/xertica-orbe/xertica-orbe.test.tsx +19 -19
  69. package/components/brand/xertica-provider/XerticaProvider.tsx +1 -4
  70. package/components/brand/xertica-provider/index.ts +1 -1
  71. package/components/brand/xertica-provider/xertica-provider.test.tsx +74 -74
  72. package/components/brand/xertica-xlogo/XerticaXLogo.stories.tsx +79 -79
  73. package/components/brand/xertica-xlogo/XerticaXLogo.tsx +65 -65
  74. package/components/brand/xertica-xlogo/index.ts +1 -1
  75. package/components/brand/xertica-xlogo/xertica-xlogo.test.tsx +16 -16
  76. package/components/examples/ApiKeyMapExample.tsx +71 -71
  77. package/components/examples/DrawingMapExample.tsx +565 -565
  78. package/components/examples/FilterableMapExample.tsx +393 -393
  79. package/components/examples/LocationPickerExample.tsx +348 -348
  80. package/components/examples/MapExamples.tsx +268 -268
  81. package/components/examples/MapGmpExample.tsx +169 -169
  82. package/components/examples/MapShowcase.tsx +471 -471
  83. package/components/examples/RouteMapExamples.tsx +329 -329
  84. package/components/examples/SidebarLogoExample.tsx +65 -65
  85. package/components/examples/SimpleFilterableMap.tsx +219 -219
  86. package/components/examples/index.ts +45 -45
  87. package/components/figma/ImageWithFallback.tsx +27 -27
  88. package/components/hooks/index.ts +13 -13
  89. package/components/hooks/use-layout-shortcuts.ts +43 -43
  90. package/components/index.ts +86 -90
  91. package/components/layout/header/header.stories.tsx +204 -204
  92. package/components/layout/header/header.test.tsx +75 -75
  93. package/components/layout/header/header.tsx +349 -349
  94. package/components/layout/header/index.ts +1 -1
  95. package/components/layout/index.ts +2 -2
  96. package/components/layout/sidebar/index.ts +3 -3
  97. package/components/layout/sidebar/sidebar.stories.tsx +586 -586
  98. package/components/layout/sidebar/sidebar.test.tsx +76 -76
  99. package/components/layout/sidebar/sidebar.tsx +1079 -1073
  100. package/components/layout/sidebar/use-sidebar.ts +104 -104
  101. package/components/media/FloatingMediaWrapper.tsx +371 -371
  102. package/components/media/audio-player/AudioPlayer.stories.tsx +124 -124
  103. package/components/media/audio-player/AudioPlayer.test.tsx +106 -106
  104. package/components/media/audio-player/AudioPlayer.tsx +767 -765
  105. package/components/media/audio-player/index.ts +1 -1
  106. package/components/media/audio-player/use-audio-player.ts +312 -312
  107. package/components/media/index.ts +3 -3
  108. package/components/media/video-player/VideoPlayer.stories.tsx +98 -98
  109. package/components/media/video-player/VideoPlayer.test.tsx +73 -73
  110. package/components/media/video-player/VideoPlayer.tsx +310 -310
  111. package/components/media/video-player/index.ts +1 -1
  112. package/components/pages/forgot-password-page/ForgotPasswordPage.stories.tsx +24 -24
  113. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +188 -188
  114. package/components/pages/forgot-password-page/forgot-password-page.test.tsx +45 -45
  115. package/components/pages/forgot-password-page/index.ts +1 -1
  116. package/components/pages/home-content/HomeContent.stories.tsx +43 -43
  117. package/components/pages/home-content/HomeContent.tsx +120 -120
  118. package/components/pages/home-content/index.ts +1 -1
  119. package/components/pages/home-page/HomePage.stories.tsx +39 -39
  120. package/components/pages/home-page/HomePage.tsx +78 -74
  121. package/components/pages/home-page/home-page.test.tsx +53 -53
  122. package/components/pages/home-page/index.ts +1 -1
  123. package/components/pages/index.ts +8 -8
  124. package/components/pages/login-page/LoginPage.stories.tsx +39 -39
  125. package/components/pages/login-page/LoginPage.tsx +218 -216
  126. package/components/pages/login-page/index.ts +1 -1
  127. package/components/pages/login-page/login-page.test.tsx +63 -63
  128. package/components/pages/reset-password-page/ResetPasswordPage.stories.tsx +24 -24
  129. package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -239
  130. package/components/pages/reset-password-page/index.ts +1 -1
  131. package/components/pages/template-content/TemplateContent.stories.tsx +43 -43
  132. package/components/pages/template-content/TemplateContent.tsx +1354 -1235
  133. package/components/pages/template-content/index.ts +1 -1
  134. package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
  135. package/components/pages/template-page/TemplatePage.tsx +62 -62
  136. package/components/pages/template-page/index.ts +1 -1
  137. package/components/pages/template-page/template-page.test.tsx +52 -52
  138. package/components/pages/verify-email-page/VerifyEmailPage.stories.tsx +41 -41
  139. package/components/pages/verify-email-page/VerifyEmailPage.tsx +206 -206
  140. package/components/pages/verify-email-page/index.ts +1 -1
  141. package/components/public-api-smoke.test.tsx +52 -52
  142. package/components/shared/CustomTooltipContent.tsx +48 -48
  143. package/components/shared/assistant-utils.test.ts +16 -16
  144. package/components/shared/assistant-utils.ts +225 -225
  145. package/components/shared/error-boundary.stories.tsx +114 -132
  146. package/components/shared/error-boundary.tsx +150 -154
  147. package/components/shared/error-fallbacks.tsx +222 -226
  148. package/components/shared/layout-constants.ts +8 -8
  149. package/components/shared/navigation.ts +35 -35
  150. package/components/shared/use-mobile.test.ts +16 -16
  151. package/components/shared/use-mobile.ts +36 -36
  152. package/components/shared/utils.test.ts +14 -14
  153. package/components/shared/utils.ts +6 -6
  154. package/components/ui/accordion/accordion.stories.tsx +105 -105
  155. package/components/ui/accordion/accordion.test.tsx +59 -59
  156. package/components/ui/accordion/accordion.tsx +77 -77
  157. package/components/ui/accordion/index.ts +1 -1
  158. package/components/ui/alert/alert.stories.tsx +86 -86
  159. package/components/ui/alert/alert.test.tsx +53 -53
  160. package/components/ui/alert/alert.tsx +93 -93
  161. package/components/ui/alert/index.ts +1 -1
  162. package/components/ui/alert-dialog/alert-dialog.stories.tsx +84 -84
  163. package/components/ui/alert-dialog/alert-dialog.test.tsx +70 -70
  164. package/components/ui/alert-dialog/alert-dialog.tsx +149 -149
  165. package/components/ui/alert-dialog/index.ts +1 -1
  166. package/components/ui/aspect-ratio/aspect-ratio.stories.tsx +46 -46
  167. package/components/ui/aspect-ratio/aspect-ratio.test.tsx +28 -28
  168. package/components/ui/aspect-ratio/aspect-ratio.tsx +20 -20
  169. package/components/ui/aspect-ratio/index.ts +1 -1
  170. package/components/ui/assistant-chart/AssistantChart.tsx +64 -64
  171. package/components/ui/assistant-chart/assistant-chart.stories.tsx +44 -44
  172. package/components/ui/assistant-chart/assistant-chart.test.tsx +46 -46
  173. package/components/ui/assistant-chart/index.ts +1 -1
  174. package/components/ui/avatar/avatar.stories.tsx +86 -86
  175. package/components/ui/avatar/avatar.test.tsx +55 -55
  176. package/components/ui/avatar/avatar.tsx +71 -71
  177. package/components/ui/avatar/index.ts +1 -1
  178. package/components/ui/badge/badge.stories.tsx +72 -72
  179. package/components/ui/badge/badge.test.tsx +40 -40
  180. package/components/ui/badge/badge.tsx +58 -58
  181. package/components/ui/badge/index.ts +1 -1
  182. package/components/ui/breadcrumb/breadcrumb.stories.tsx +123 -123
  183. package/components/ui/breadcrumb/breadcrumb.test.tsx +70 -70
  184. package/components/ui/breadcrumb/breadcrumb.tsx +114 -114
  185. package/components/ui/breadcrumb/index.ts +1 -1
  186. package/components/ui/button/button.stories.tsx +183 -183
  187. package/components/ui/button/button.test.tsx +64 -64
  188. package/components/ui/button/button.tsx +98 -98
  189. package/components/ui/button/index.ts +1 -1
  190. package/components/ui/calendar/calendar.stories.tsx +108 -108
  191. package/components/ui/calendar/calendar.test.tsx +53 -53
  192. package/components/ui/calendar/calendar.tsx +230 -230
  193. package/components/ui/calendar/index.ts +1 -1
  194. package/components/ui/card/card.stories.tsx +301 -301
  195. package/components/ui/card/card.test.tsx +55 -55
  196. package/components/ui/card/card.tsx +83 -83
  197. package/components/ui/card/index.ts +1 -1
  198. package/components/ui/carousel/carousel.stories.tsx +80 -80
  199. package/components/ui/carousel/carousel.test.tsx +75 -75
  200. package/components/ui/carousel/carousel.tsx +242 -242
  201. package/components/ui/carousel/index.ts +1 -1
  202. package/components/ui/chart/chart.stories.tsx +1328 -1328
  203. package/components/ui/chart/chart.test.tsx +178 -178
  204. package/components/ui/chart/chart.tsx +2232 -2232
  205. package/components/ui/chart/index.ts +1 -1
  206. package/components/ui/checkbox/checkbox.stories.tsx +109 -109
  207. package/components/ui/checkbox/checkbox.test.tsx +49 -49
  208. package/components/ui/checkbox/checkbox.tsx +68 -68
  209. package/components/ui/checkbox/index.ts +1 -1
  210. package/components/ui/collapsible/collapsible.stories.tsx +45 -45
  211. package/components/ui/collapsible/collapsible.test.tsx +51 -51
  212. package/components/ui/collapsible/collapsible.tsx +32 -32
  213. package/components/ui/collapsible/index.ts +1 -1
  214. package/components/ui/command/command.stories.tsx +134 -134
  215. package/components/ui/command/command.test.tsx +48 -48
  216. package/components/ui/command/command.tsx +163 -163
  217. package/components/ui/command/index.ts +1 -1
  218. package/components/ui/context-menu/context-menu.stories.tsx +76 -76
  219. package/components/ui/context-menu/context-menu.test.tsx +61 -61
  220. package/components/ui/context-menu/context-menu.tsx +236 -236
  221. package/components/ui/context-menu/index.ts +1 -1
  222. package/components/ui/dialog/dialog.stories.tsx +174 -174
  223. package/components/ui/dialog/dialog.test.tsx +78 -78
  224. package/components/ui/dialog/dialog.tsx +189 -189
  225. package/components/ui/dialog/index.ts +1 -1
  226. package/components/ui/drawer/drawer.stories.tsx +71 -71
  227. package/components/ui/drawer/drawer.test.tsx +67 -67
  228. package/components/ui/drawer/drawer.tsx +146 -146
  229. package/components/ui/drawer/index.ts +1 -1
  230. package/components/ui/dropdown-menu/dropdown-menu.stories.tsx +156 -156
  231. package/components/ui/dropdown-menu/dropdown-menu.test.tsx +62 -62
  232. package/components/ui/dropdown-menu/dropdown-menu.tsx +240 -240
  233. package/components/ui/dropdown-menu/index.ts +1 -1
  234. package/components/ui/empty/empty.stories.tsx +85 -85
  235. package/components/ui/empty/empty.test.tsx +31 -31
  236. package/components/ui/empty/empty.tsx +88 -88
  237. package/components/ui/empty/index.ts +1 -1
  238. package/components/ui/file-upload/file-upload.stories.tsx +144 -144
  239. package/components/ui/file-upload/file-upload.test.tsx +65 -65
  240. package/components/ui/file-upload/file-upload.tsx +142 -142
  241. package/components/ui/file-upload/index.ts +2 -2
  242. package/components/ui/file-upload/use-file-upload.ts +177 -177
  243. package/components/ui/form/form.stories.tsx +85 -85
  244. package/components/ui/form/form.test.tsx +75 -75
  245. package/components/ui/form/form.tsx +163 -163
  246. package/components/ui/form/index.ts +1 -1
  247. package/components/ui/google-maps-loader/google-maps-loader.test.tsx +35 -35
  248. package/components/ui/google-maps-loader/google-maps-loader.tsx +465 -465
  249. package/components/ui/google-maps-loader/index.ts +1 -1
  250. package/components/ui/hover-card/hover-card.stories.tsx +61 -61
  251. package/components/ui/hover-card/hover-card.test.tsx +48 -48
  252. package/components/ui/hover-card/hover-card.tsx +50 -50
  253. package/components/ui/hover-card/index.ts +1 -1
  254. package/components/ui/index.ts +400 -400
  255. package/components/ui/input/index.ts +1 -1
  256. package/components/ui/input/input.stories.tsx +153 -153
  257. package/components/ui/input/input.test.tsx +47 -47
  258. package/components/ui/input/input.tsx +57 -57
  259. package/components/ui/input-otp/index.ts +1 -1
  260. package/components/ui/input-otp/input-otp.stories.tsx +120 -120
  261. package/components/ui/input-otp/input-otp.test.tsx +74 -74
  262. package/components/ui/input-otp/input-otp.tsx +101 -101
  263. package/components/ui/label/index.ts +1 -1
  264. package/components/ui/label/label.stories.tsx +74 -74
  265. package/components/ui/label/label.test.tsx +45 -45
  266. package/components/ui/label/label.tsx +53 -53
  267. package/components/ui/map/index.ts +1 -1
  268. package/components/ui/map/map.stories.tsx +86 -86
  269. package/components/ui/map/map.test.tsx +82 -82
  270. package/components/ui/map/map.tsx +506 -506
  271. package/components/ui/map/mock.test.tsx +13 -13
  272. package/components/ui/map-config/index.ts +1 -1
  273. package/components/ui/map-config/map-config.ts +18 -18
  274. package/components/ui/map-layers/index.ts +1 -1
  275. package/components/ui/map-layers/map-layers.test.tsx +48 -48
  276. package/components/ui/map-layers/map-layers.tsx +126 -126
  277. package/components/ui/map.exports/index.ts +1 -1
  278. package/components/ui/map.exports/map.exports.ts +31 -31
  279. package/components/ui/menubar/index.ts +1 -1
  280. package/components/ui/menubar/menubar.stories.tsx +130 -130
  281. package/components/ui/menubar/menubar.test.tsx +53 -53
  282. package/components/ui/menubar/menubar.tsx +265 -265
  283. package/components/ui/navigation-menu/index.ts +1 -1
  284. package/components/ui/navigation-menu/navigation-menu.stories.tsx +126 -126
  285. package/components/ui/navigation-menu/navigation-menu.test.tsx +47 -47
  286. package/components/ui/navigation-menu/navigation-menu.tsx +165 -165
  287. package/components/ui/notification-badge/index.ts +1 -1
  288. package/components/ui/notification-badge/notification-badge.stories.tsx +66 -66
  289. package/components/ui/notification-badge/notification-badge.test.tsx +61 -61
  290. package/components/ui/notification-badge/notification-badge.tsx +91 -91
  291. package/components/ui/page-header/index.ts +1 -1
  292. package/components/ui/page-header/page-header.stories.tsx +69 -69
  293. package/components/ui/page-header/page-header.test.tsx +37 -37
  294. package/components/ui/page-header/page-header.tsx +124 -124
  295. package/components/ui/pagination/index.ts +3 -3
  296. package/components/ui/pagination/pagination.stories.tsx +210 -210
  297. package/components/ui/pagination/pagination.test.tsx +63 -63
  298. package/components/ui/pagination/pagination.tsx +140 -140
  299. package/components/ui/pagination/use-pagination.ts +173 -173
  300. package/components/ui/popover/index.ts +1 -1
  301. package/components/ui/popover/popover.stories.tsx +73 -73
  302. package/components/ui/popover/popover.test.tsx +48 -48
  303. package/components/ui/popover/popover.tsx +54 -54
  304. package/components/ui/progress/index.ts +1 -1
  305. package/components/ui/progress/progress.stories.tsx +55 -55
  306. package/components/ui/progress/progress.test.tsx +23 -23
  307. package/components/ui/progress/progress.tsx +68 -68
  308. package/components/ui/radio-group/index.ts +1 -1
  309. package/components/ui/radio-group/radio-group.stories.tsx +114 -114
  310. package/components/ui/radio-group/radio-group.test.tsx +78 -78
  311. package/components/ui/radio-group/radio-group.tsx +93 -93
  312. package/components/ui/rating/index.ts +1 -1
  313. package/components/ui/rating/rating.stories.tsx +50 -50
  314. package/components/ui/rating/rating.test.tsx +48 -48
  315. package/components/ui/rating/rating.tsx +145 -145
  316. package/components/ui/resizable/index.ts +1 -1
  317. package/components/ui/resizable/resizable.stories.tsx +88 -88
  318. package/components/ui/resizable/resizable.test.tsx +61 -61
  319. package/components/ui/resizable/resizable.tsx +452 -452
  320. package/components/ui/rich-text-editor/index.ts +7 -7
  321. package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +290 -290
  322. package/components/ui/rich-text-editor/rich-text-editor.test.tsx +86 -86
  323. package/components/ui/rich-text-editor/rich-text-editor.tsx +634 -634
  324. package/components/ui/rich-text-editor/use-rich-text-editor.ts +453 -453
  325. package/components/ui/route-map/index.ts +1 -1
  326. package/components/ui/route-map/route-map.stories.tsx +48 -48
  327. package/components/ui/route-map/route-map.test.tsx +108 -108
  328. package/components/ui/route-map/route-map.tsx +349 -349
  329. package/components/ui/scroll-area/index.ts +1 -1
  330. package/components/ui/scroll-area/scroll-area.stories.tsx +31 -31
  331. package/components/ui/scroll-area/scroll-area.test.tsx +27 -27
  332. package/components/ui/scroll-area/scroll-area.tsx +70 -70
  333. package/components/ui/search/index.ts +1 -1
  334. package/components/ui/search/search.stories.tsx +107 -107
  335. package/components/ui/search/search.test.tsx +67 -67
  336. package/components/ui/search/search.tsx +141 -141
  337. package/components/ui/select/index.ts +1 -1
  338. package/components/ui/select/select.stories.tsx +163 -163
  339. package/components/ui/select/select.test.tsx +99 -99
  340. package/components/ui/select/select.tsx +195 -195
  341. package/components/ui/separator/index.ts +1 -1
  342. package/components/ui/separator/separator.stories.tsx +55 -55
  343. package/components/ui/separator/separator.test.tsx +23 -23
  344. package/components/ui/separator/separator.tsx +39 -39
  345. package/components/ui/sheet/index.ts +1 -1
  346. package/components/ui/sheet/sheet.stories.tsx +93 -93
  347. package/components/ui/sheet/sheet.test.tsx +62 -62
  348. package/components/ui/sheet/sheet.tsx +149 -149
  349. package/components/ui/simple-map/index.ts +1 -1
  350. package/components/ui/simple-map/simple-map.stories.tsx +44 -44
  351. package/components/ui/simple-map/simple-map.test.tsx +36 -36
  352. package/components/ui/simple-map/simple-map.tsx +92 -92
  353. package/components/ui/skeleton/index.ts +1 -1
  354. package/components/ui/skeleton/skeleton.stories.tsx +36 -36
  355. package/components/ui/skeleton/skeleton.test.tsx +19 -19
  356. package/components/ui/skeleton/skeleton.tsx +25 -25
  357. package/components/ui/slider/index.ts +1 -1
  358. package/components/ui/slider/slider.stories.tsx +44 -44
  359. package/components/ui/slider/slider.test.tsx +25 -25
  360. package/components/ui/slider/slider.tsx +66 -66
  361. package/components/ui/sonner/index.ts +1 -1
  362. package/components/ui/sonner/sonner.stories.tsx +41 -41
  363. package/components/ui/sonner/sonner.test.tsx +24 -24
  364. package/components/ui/sonner/sonner.tsx +74 -74
  365. package/components/ui/stats-card/index.ts +2 -2
  366. package/components/ui/stats-card/stats-card-skeleton.tsx +1 -3
  367. package/components/ui/stats-card/stats-card.stories.tsx +99 -99
  368. package/components/ui/stats-card/stats-card.test.tsx +34 -34
  369. package/components/ui/stats-card/stats-card.tsx +93 -93
  370. package/components/ui/stepper/index.ts +3 -3
  371. package/components/ui/stepper/stepper.stories.tsx +171 -171
  372. package/components/ui/stepper/stepper.test.tsx +47 -47
  373. package/components/ui/stepper/stepper.tsx +190 -190
  374. package/components/ui/stepper/use-stepper.ts +139 -139
  375. package/components/ui/switch/index.ts +1 -1
  376. package/components/ui/switch/switch.stories.tsx +93 -93
  377. package/components/ui/switch/switch.test.tsx +44 -44
  378. package/components/ui/switch/switch.tsx +70 -70
  379. package/components/ui/table/index.ts +1 -1
  380. package/components/ui/table/table.stories.tsx +114 -114
  381. package/components/ui/table/table.test.tsx +43 -43
  382. package/components/ui/table/table.tsx +104 -104
  383. package/components/ui/tabs/index.ts +1 -1
  384. package/components/ui/tabs/tabs.stories.tsx +140 -140
  385. package/components/ui/tabs/tabs.test.tsx +50 -50
  386. package/components/ui/tabs/tabs.tsx +66 -66
  387. package/components/ui/textarea/index.ts +1 -1
  388. package/components/ui/textarea/textarea.stories.tsx +69 -69
  389. package/components/ui/textarea/textarea.test.tsx +41 -41
  390. package/components/ui/textarea/textarea.tsx +61 -61
  391. package/components/ui/timeline/index.ts +1 -1
  392. package/components/ui/timeline/timeline.stories.tsx +97 -97
  393. package/components/ui/timeline/timeline.test.tsx +53 -53
  394. package/components/ui/timeline/timeline.tsx +124 -124
  395. package/components/ui/toggle/index.ts +1 -1
  396. package/components/ui/toggle/toggle.stories.tsx +56 -56
  397. package/components/ui/toggle/toggle.test.tsx +32 -32
  398. package/components/ui/toggle/toggle.tsx +55 -55
  399. package/components/ui/toggle-group/index.ts +1 -1
  400. package/components/ui/toggle-group/toggle-group.stories.tsx +66 -66
  401. package/components/ui/toggle-group/toggle-group.test.tsx +47 -47
  402. package/components/ui/toggle-group/toggle-group.tsx +79 -79
  403. package/components/ui/tooltip/index.ts +1 -1
  404. package/components/ui/tooltip/tooltip.stories.tsx +83 -83
  405. package/components/ui/tooltip/tooltip.test.tsx +39 -39
  406. package/components/ui/tooltip/tooltip.tsx +69 -69
  407. package/components/ui/tree-view/index.ts +4 -4
  408. package/components/ui/tree-view/tree-view.stories.tsx +154 -154
  409. package/components/ui/tree-view/tree-view.test.tsx +58 -58
  410. package/components/ui/tree-view/tree-view.tsx +171 -171
  411. package/components/ui/tree-view/use-tree-view.ts +237 -237
  412. package/components.json +892 -892
  413. package/contexts/ApiKeyContext.test.tsx +26 -26
  414. package/contexts/ApiKeyContext.tsx +196 -196
  415. package/contexts/AssistenteContext.test.tsx +17 -17
  416. package/contexts/AssistenteContext.tsx +113 -113
  417. package/contexts/AuthContext.tsx +121 -118
  418. package/contexts/BrandColorsContext.test.tsx +21 -21
  419. package/contexts/BrandColorsContext.tsx +251 -251
  420. package/contexts/LanguageContext.tsx +1 -2
  421. package/contexts/LayoutContext.test.tsx +29 -29
  422. package/contexts/LayoutContext.tsx +140 -140
  423. package/contexts/ThemeContext.test.tsx +38 -38
  424. package/contexts/ThemeContext.tsx +111 -111
  425. package/contexts/index.ts +8 -8
  426. package/contexts/theme-data.ts +340 -340
  427. package/dist/AssistantChart-COGiOV-g.cjs +3541 -0
  428. package/dist/AssistantChart-CWX1OWNM.js +3373 -0
  429. package/dist/AudioPlayer-9psiEucT.cjs +1282 -0
  430. package/dist/AudioPlayer-Dp2bD1Gk.js +1278 -0
  431. package/dist/BrandColorsContext-DZT7JjeD.js +659 -0
  432. package/dist/BrandColorsContext-awnBCmC4.cjs +666 -0
  433. package/dist/CodeBlock-DYkTfR0f.js +221 -0
  434. package/dist/CodeBlock-EOvp9cVu.cjs +223 -0
  435. package/dist/CustomTooltipContent-BhdIeBEg.cjs +54 -0
  436. package/dist/CustomTooltipContent-CNbVB2NS.js +33 -0
  437. package/dist/FeatureCard-BZ4CYxFf.cjs +497 -0
  438. package/dist/FeatureCard-DNycVGwT.js +485 -0
  439. package/dist/FeatureCardSkeleton-DZqc96mt.js +27 -0
  440. package/dist/FeatureCardSkeleton-pTa0YNKP.cjs +29 -0
  441. package/dist/LayoutContext-BEq_-n98.cjs +96 -0
  442. package/dist/LayoutContext-DNl1xSoX.js +92 -0
  443. package/dist/ThemeContext-CMD3z2Dz.cjs +1930 -0
  444. package/dist/ThemeContext-x_F2zsnv.js +1923 -0
  445. package/dist/VerifyEmailPage-BJjAMUTW.js +3223 -0
  446. package/dist/VerifyEmailPage-Bv8Ah_TK.cjs +3235 -0
  447. package/dist/VerifyEmailPage-CkBYfsNy.cjs +3232 -0
  448. package/dist/VerifyEmailPage-Cyl55sJb.js +3226 -0
  449. package/dist/VerifyEmailPage-X14vhdyl.js +3296 -0
  450. package/dist/VerifyEmailPage-u_Dn7t1U.cjs +3305 -0
  451. package/dist/XerticaOrbe-Uk2JML1-.cjs +1927 -0
  452. package/dist/XerticaOrbe-jA5T2iOk.js +1925 -0
  453. package/dist/XerticaProvider-BErr83Bg.js +42 -0
  454. package/dist/XerticaProvider-CwOkHxiT.cjs +44 -0
  455. package/dist/XerticaProvider-DUOJg9iX.js +49 -0
  456. package/dist/XerticaProvider-Dl_b72_l.cjs +51 -0
  457. package/dist/XerticaXLogo-BX3ueACh.js +255 -0
  458. package/dist/XerticaXLogo-mqjoBiLI.js +252 -0
  459. package/dist/XerticaXLogo-qBPhwK3g.cjs +260 -0
  460. package/dist/XerticaXLogo-uQgwns_E.cjs +257 -0
  461. package/dist/alert-dialog-DhwPioBa.cjs +885 -0
  462. package/dist/alert-dialog-DqlRW_An.js +831 -0
  463. package/dist/assistant.cjs.js +8 -4
  464. package/dist/assistant.es.js +5 -11
  465. package/dist/avatar-3kO2Anrp.js +54 -0
  466. package/dist/avatar-BCM7YQRC.cjs +77 -0
  467. package/dist/blocks.cjs.js +9 -4
  468. package/dist/blocks.es.js +2 -16
  469. package/dist/brand.cjs.js +10 -5
  470. package/dist/brand.es.js +3 -11
  471. package/dist/breadcrumb-BKtHF4gk.cjs +98 -0
  472. package/dist/breadcrumb-ifNsA7Zl.js +90 -0
  473. package/dist/button-0BlA47It.cjs +85 -0
  474. package/dist/button-DZHzN1Gd.js +62 -0
  475. package/dist/cli.js +471 -93
  476. package/dist/components/brand/theme-toggle/ThemeToggle.d.ts +1 -1
  477. package/dist/components/index.d.ts +1 -1
  478. package/dist/dropdown-menu-BMcykFDf.cjs +225 -0
  479. package/dist/dropdown-menu-Dn_eV2Xb.js +190 -0
  480. package/dist/google-maps-loader-BCe58h9D.js +308 -0
  481. package/dist/google-maps-loader-casMyxlo.cjs +316 -0
  482. package/dist/hooks.cjs.js +12 -8
  483. package/dist/hooks.es.js +10 -27
  484. package/dist/index-9GWd0qxq.cjs +12 -0
  485. package/dist/index-BabBx2pa.js +6 -0
  486. package/dist/index.cjs.js +37 -32
  487. package/dist/index.es.js +30 -363
  488. package/dist/input-C_UiS2Py.cjs +152 -0
  489. package/dist/input-cc-PTD4R.js +123 -0
  490. package/dist/layout.cjs.js +10 -6
  491. package/dist/layout.es.js +7 -9
  492. package/dist/media.cjs.js +8 -3
  493. package/dist/media.es.js +1 -6
  494. package/dist/pages.cjs.js +8 -3
  495. package/dist/pages.es.js +1 -11
  496. package/dist/progress-C7Lti5wo.js +80 -0
  497. package/dist/progress-Cqwxbqs1.cjs +103 -0
  498. package/dist/rich-text-editor-DqLICivI.js +2832 -0
  499. package/dist/rich-text-editor-DxO1Hz3a.cjs +2903 -0
  500. package/dist/select-CH6v_KcQ.cjs +161 -0
  501. package/dist/select-D-xvCZK2.js +130 -0
  502. package/dist/sidebar-3XyzjVBw.js +792 -0
  503. package/dist/sidebar-B4ZWaMrE.js +792 -0
  504. package/dist/sidebar-BS1p2V7t.cjs +795 -0
  505. package/dist/sidebar-DyYvgyBj.cjs +795 -0
  506. package/dist/skeleton-DjiHerJn.cjs +87 -0
  507. package/dist/skeleton-DtR5tkYe.js +78 -0
  508. package/dist/slider-B00b9SVK.cjs +78 -0
  509. package/dist/slider-DQCNUUMj.js +56 -0
  510. package/dist/sonner-B-jWlik1.cjs +68 -0
  511. package/dist/sonner-C9tiqj4f.js +47 -0
  512. package/dist/tooltip-D8n9UYoU.cjs +72 -0
  513. package/dist/tooltip-RtbSmPYJ.js +48 -0
  514. package/dist/ui.cjs.js +23 -18
  515. package/dist/ui.es.js +16 -303
  516. package/dist/use-audio-player-B78fd2ct.js +188 -0
  517. package/dist/use-audio-player-DGvhPrgR.cjs +190 -0
  518. package/dist/use-mobile-BdXTRb0Z.cjs +51 -0
  519. package/dist/use-mobile-Ce2cBAQe.js +29 -0
  520. package/dist/xertica-assistant-B1NaSFFj.js +2173 -0
  521. package/dist/xertica-assistant-B687qEPU.js +2165 -0
  522. package/dist/xertica-assistant-CIaUlbIt.cjs +2180 -0
  523. package/dist/xertica-assistant-sOHwTgIP.cjs +2172 -0
  524. package/dist/xertica-ui.css +1 -1
  525. package/docs/ai-usage.md +195 -195
  526. package/docs/architecture-improvements.md +456 -456
  527. package/docs/architecture.md +312 -306
  528. package/docs/components/accordion.md +109 -109
  529. package/docs/components/alert-dialog.md +127 -127
  530. package/docs/components/alert.md +106 -106
  531. package/docs/components/aspect-ratio.md +58 -58
  532. package/docs/components/assistant-chart.md +47 -47
  533. package/docs/components/assistant.md +428 -426
  534. package/docs/components/audio-player.md +167 -167
  535. package/docs/components/avatar.md +101 -101
  536. package/docs/components/badge.md +84 -84
  537. package/docs/components/branding.md +252 -252
  538. package/docs/components/breadcrumb.md +104 -104
  539. package/docs/components/button.md +156 -156
  540. package/docs/components/calendar.md +141 -141
  541. package/docs/components/card-patterns.md +447 -445
  542. package/docs/components/card.md +245 -245
  543. package/docs/components/carousel.md +100 -100
  544. package/docs/components/chart.md +638 -638
  545. package/docs/components/checkbox.md +88 -88
  546. package/docs/components/code-block.md +105 -105
  547. package/docs/components/collapsible.md +86 -86
  548. package/docs/components/command.md +113 -113
  549. package/docs/components/context-menu.md +81 -81
  550. package/docs/components/dialog.md +198 -198
  551. package/docs/components/drawer.md +105 -105
  552. package/docs/components/dropdown-menu.md +127 -127
  553. package/docs/components/empty.md +127 -127
  554. package/docs/components/error-boundary.md +201 -191
  555. package/docs/components/file-upload.md +189 -189
  556. package/docs/components/floating-media-wrapper.md +63 -63
  557. package/docs/components/form.md +177 -177
  558. package/docs/components/formatted-document.md +105 -105
  559. package/docs/components/google-maps-loader.md +44 -44
  560. package/docs/components/header.md +177 -177
  561. package/docs/components/hooks.md +432 -430
  562. package/docs/components/hover-card.md +86 -86
  563. package/docs/components/image-with-fallback.md +107 -107
  564. package/docs/components/input-otp.md +95 -95
  565. package/docs/components/input.md +130 -130
  566. package/docs/components/label.md +69 -69
  567. package/docs/components/language-selector.md +20 -16
  568. package/docs/components/map-layers.md +138 -138
  569. package/docs/components/map.md +84 -84
  570. package/docs/components/markdown-message.md +47 -47
  571. package/docs/components/menubar.md +89 -89
  572. package/docs/components/modern-chat-input.md +164 -164
  573. package/docs/components/navigation-menu.md +83 -83
  574. package/docs/components/notification-badge.md +78 -78
  575. package/docs/components/page-header.md +93 -93
  576. package/docs/components/pages.md +323 -309
  577. package/docs/components/pagination.md +334 -334
  578. package/docs/components/popover.md +116 -116
  579. package/docs/components/progress.md +103 -103
  580. package/docs/components/radio-group.md +133 -133
  581. package/docs/components/rating.md +77 -77
  582. package/docs/components/resizable.md +84 -84
  583. package/docs/components/rich-text-editor.md +255 -255
  584. package/docs/components/route-map.md +124 -124
  585. package/docs/components/scroll-area.md +58 -58
  586. package/docs/components/search.md +87 -87
  587. package/docs/components/select.md +144 -144
  588. package/docs/components/separator.md +58 -58
  589. package/docs/components/sheet.md +122 -122
  590. package/docs/components/sidebar.md +314 -314
  591. package/docs/components/simple-map.md +51 -51
  592. package/docs/components/skeleton.md +99 -99
  593. package/docs/components/slider.md +84 -84
  594. package/docs/components/sonner.md +115 -115
  595. package/docs/components/stats-card.md +120 -120
  596. package/docs/components/stepper.md +268 -268
  597. package/docs/components/switch.md +106 -106
  598. package/docs/components/table.md +138 -138
  599. package/docs/components/tabs.md +117 -117
  600. package/docs/components/textarea.md +86 -86
  601. package/docs/components/theme-toggle.md +73 -73
  602. package/docs/components/timeline.md +121 -121
  603. package/docs/components/toggle-group.md +68 -68
  604. package/docs/components/toggle.md +62 -62
  605. package/docs/components/tooltip.md +116 -116
  606. package/docs/components/tree-view.md +238 -238
  607. package/docs/components/use-mobile.md +96 -96
  608. package/docs/components/video-player.md +68 -68
  609. package/docs/components/xertica-logo.md +36 -36
  610. package/docs/components/xertica-orbe.md +35 -35
  611. package/docs/components/xertica-provider.md +65 -65
  612. package/docs/components/xertica-xlogo.md +35 -35
  613. package/docs/decision-tree.md +293 -293
  614. package/docs/doc-audit.md +244 -243
  615. package/docs/form-sizing.md +162 -162
  616. package/docs/getting-started.md +616 -591
  617. package/docs/guidelines.md +330 -328
  618. package/docs/i18n.md +61 -57
  619. package/docs/installation.md +268 -267
  620. package/docs/layout.md +143 -143
  621. package/docs/llms.md +295 -295
  622. package/docs/patterns/analytics.md +194 -194
  623. package/docs/patterns/crud.md +149 -149
  624. package/docs/patterns/dashboard.md +138 -138
  625. package/docs/patterns/detail-page.md +296 -296
  626. package/docs/patterns/form.md +241 -241
  627. package/docs/patterns/login.md +156 -156
  628. package/docs/patterns/settings.md +368 -368
  629. package/docs/patterns/wizard.md +213 -213
  630. package/docs/state-management.md +289 -289
  631. package/guidelines/Guidelines.md +409 -406
  632. package/hooks/useTheme.test.tsx +16 -16
  633. package/hooks/useTheme.ts +4 -4
  634. package/imports/Podcast.tsx +540 -540
  635. package/imports/XerticaAi.tsx +46 -46
  636. package/imports/XerticaX.tsx +15 -15
  637. package/imports/svg-aueiaqngck.ts +20 -20
  638. package/imports/svg-v9krss1ozd.ts +23 -23
  639. package/imports/svg-vhrdofe3qe.ts +6 -6
  640. package/llms-compact.txt +2 -1
  641. package/llms.txt +2 -1
  642. package/mcp/resources.json +22 -22
  643. package/mcp/tools.json +35 -35
  644. package/package.json +219 -213
  645. package/scripts/ai-validator.ts +91 -91
  646. package/scripts/cleanup-case-dupes.ts +62 -62
  647. package/scripts/generate-ai-manifests.ts +107 -107
  648. package/styles/globals.css +13 -13
  649. package/styles/xertica/app-overrides/chat.css +61 -61
  650. package/styles/xertica/app-overrides/scrollbar.css +33 -33
  651. package/styles/xertica/base.css +90 -71
  652. package/styles/xertica/integrations/google-maps.css +76 -76
  653. package/styles/xertica/integrations/sonner.css +73 -73
  654. package/styles/xertica/theme-map.css +102 -99
  655. package/styles/xertica/tokens.css +240 -236
  656. package/templates/CLAUDE.md +16 -1
  657. package/templates/eslint.config.js +26 -26
  658. package/templates/guidelines/Guidelines.md +577 -553
  659. package/templates/package.json +69 -69
  660. package/templates/postcss.config.js +6 -6
  661. package/templates/src/app/App.tsx +46 -46
  662. package/templates/src/app/components/AppLayout.tsx +55 -55
  663. package/templates/src/app/components/AuthGuard.tsx +131 -82
  664. package/templates/src/app/context/AuthContext.tsx +108 -108
  665. package/templates/src/features/assistant/index.ts +5 -5
  666. package/templates/src/features/auth/index.ts +4 -4
  667. package/templates/src/features/auth/ui/AuthPageShell.tsx +32 -32
  668. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -72
  669. package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
  670. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +6 -2
  671. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
  672. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +2 -6
  673. package/templates/src/features/home/data/mock.ts +41 -35
  674. package/templates/src/features/home/index.ts +11 -11
  675. package/templates/src/features/home/store/dashboardStore.ts +25 -25
  676. package/templates/src/features/home/ui/HomeContent.tsx +117 -119
  677. package/templates/src/features/template/index.ts +5 -5
  678. package/templates/src/features/template/ui/CrudTemplate.tsx +1 -4
  679. package/templates/src/features/template/ui/LoginTemplate.tsx +1 -1
  680. package/templates/src/features/template/ui/TemplateContent.tsx +29 -21
  681. package/templates/src/locales/en/pages/templates.json +17 -17
  682. package/templates/src/locales/es/pages/templates.json +17 -17
  683. package/templates/src/locales/pt-BR/pages/templates.json +17 -17
  684. package/templates/src/main.tsx +11 -11
  685. package/templates/src/pages/AssistantPage.tsx +26 -20
  686. package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
  687. package/templates/src/pages/HomePage.tsx +53 -49
  688. package/templates/src/pages/LoginPage.tsx +10 -10
  689. package/templates/src/pages/ResetPasswordPage.tsx +6 -6
  690. package/templates/src/pages/TemplatePage.tsx +28 -28
  691. package/templates/src/pages/VerifyEmailPage.tsx +6 -6
  692. package/templates/src/shared/config/navigation.ts +19 -19
  693. package/templates/src/shared/error-boundary.tsx +150 -154
  694. package/templates/src/shared/error-fallbacks.tsx +222 -226
  695. package/templates/src/shared/lib/auth.ts +20 -20
  696. package/templates/src/shared/types/auth.ts +3 -3
  697. package/templates/src/styles/index.css +95 -95
  698. package/templates/src/styles/xertica/tokens.css +240 -236
  699. package/templates/tsconfig.json +25 -25
  700. package/templates/tsconfig.node.json +12 -12
  701. package/templates/vite-env.d.ts +1 -1
  702. package/templates/vite.config.js +20 -20
  703. package/templates/vite.config.ts +54 -51
  704. package/utils/color-utils.ts +72 -72
  705. package/utils/demo-responses.test.ts +10 -10
  706. package/utils/demo-responses.ts +151 -151
  707. package/utils/gemini.test.ts +25 -25
  708. package/utils/gemini.ts +155 -155
@@ -1,406 +1,409 @@
1
- # Xertica UI — Library Guidelines
2
-
3
- > **Scope**: These guidelines apply to contributors developing the `xertica-ui` package itself (components, documentation, build system). For guidelines on projects that **consume** the package, see `templates/guidelines/Guidelines.md`.
4
-
5
- ---
6
-
7
- ## 1. What Xertica UI Is
8
-
9
- Xertica UI is an enterprise-grade React component library distributed as an npm package. It is designed to be consumed by both human developers and AI coding agents (LLMs, Cursor, Claude Code, Copilot). Every design decision — from the component API to the documentation format — must serve both audiences.
10
-
11
- **Stack:** React 18 · TypeScript 5 · Tailwind CSS v4 · Radix UI · Lucide React · Vite 6
12
-
13
- ---
14
-
15
- ## 2. AI-First Documentation
16
-
17
- Documentation is a first-class deliverable. Every component ships with:
18
-
19
- | File | Purpose | Location |
20
- | --------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
21
- | `llms.txt` | Index file following the llmstxt.org standard. Links to all docs. | `/llms.txt` |
22
- | `llms-compact.txt` | ~4K token quick reference. Critical rules, imports, 12 key components with examples. | `/llms-compact.txt` |
23
- | `llms-full.txt` | Complete documentation of all 97 components in one file for large-context LLMs. | `/llms-full.txt` |
24
- | `components.json` | Machine-readable registry: name, category, import path, keywords, related components. | `/components.json` |
25
- | `docs/decision-tree.md` | Decision trees: Dialog vs Sheet, Tooltip vs HoverCard, etc. | `/docs/decision-tree.md` |
26
- | `docs/components/[name].md` | Individual component reference with props, examples, and AI rules. | `/docs/components/` |
27
- | `docs/ai-usage.md` | Mandatory rules for AI agents operating on this library. | `/docs/ai-usage.md` |
28
- | `CLAUDE.md` | Auto-generated system prompt for consumer projects (injected by CLI). | `/templates/CLAUDE.md` |
29
-
30
- ### When to update documentation
31
-
32
- Every PR that changes a component **must** update:
33
-
34
- - `docs/components/[name].md` — if props, behavior, or examples changed
35
- - `llms-full.txt` — the relevant component section
36
- - `components.json` — if the component name, import path, or description changed
37
- - `CHANGELOG.md` — under the current unreleased version
38
-
39
- ---
40
-
41
- ## 3. Package Structure
42
-
43
- ```
44
- xertica-ui/
45
- ├── components/ # Source components (ships in package)
46
- │ ├── ui/ # Design system primitives
47
- │ ├── layout/ # Sidebar, Header
48
- │ ├── brand/ # XerticaProvider, logos, ThemeToggle, LanguageSelector
49
- │ ├── assistant/ # XerticaAssistant, ModernChatInput, MarkdownMessage, CodeBlock, FormattedDocument
50
- │ ├── blocks/ # Composed dashboard cards + matching *Skeleton variants
51
- │ ├── media/ # VideoPlayer, AudioPlayer, FloatingMediaWrapper
52
- │ ├── pages/ # Full-page template components
53
- │ └── shared/ # Internal utils (use-mobile, assistant-utils, error-boundary, error-fallbacks)
54
- ├── contexts/ # React contexts (LayoutContext, ThemeContext, LanguageContext, etc.)
55
- ├── features/ # Server-state hooks + mock data (home, assistant) — used by Storybook pages
56
- ├── hooks/ # Hook re-exports
57
- ├── lib/ # Shared singletons — currently query-client.ts
58
- ├── utils/ # Utility functions (demo-responses, gemini)
59
- ├── locales/ # i18n translation files — one folder per language
60
- │ ├── pt-BR/ # {common,nav,errors,languageSelector,themeToggle}.json
61
- │ │ ├── pages/ # home, templates, login, resetPassword, verifyEmail,
62
- │ │ │ # loginTemplate, formTemplate, dashboardTemplate, crudTemplate
63
- │ │ └── components/ # assistant, sidebar, media, projectCard, profileCard,
64
- │ │ # notificationCard, activityCard, stats, team
65
- │ ├── en/ # (same structure)
66
- │ └── es/ # (same structure)
67
- ├── i18n.ts # i18next setup (registerLanguageResource helper exported)
68
- ├── styles/ # Global CSS and token maps
69
- ├── templates/ # CLI scaffold template (FSD/FDA project)
70
- ├── bin/ # CLI source + helpers
71
- │ ├── cli.ts # commander entry point (init, update)
72
- │ ├── language-config.ts # language registry + code generators
73
- │ └── generate-tokens.ts # color theme generator
74
- ├── dist/ # Compiled library (ES + CJS + CSS + types)
75
- ├── docs/ # Markdown docs (ships in package for AI agents)
76
- ├── llms.txt # AI documentation index
77
- ├── llms-compact.txt # Compact AI reference
78
- ├── llms-full.txt # Full AI documentation
79
- └── components.json # Machine-readable component registry
80
- ```
81
-
82
- ### Why source ships with the package
83
-
84
- The `components/`, `contexts/`, `hooks/`, `lib/`, `i18n.ts`, and `locales/` directories are intentionally included in the npm package (via the `files` field in `package.json`). AI agents running in consumer projects can inspect source, stories, and documentation directly from `node_modules/xertica-ui/`. This is the primary AI-first design decision.
85
-
86
- ---
87
-
88
- ## 4. Subpath Exports
89
-
90
- The package exposes 7 entry points. Always use the most specific subpath:
91
-
92
- ```tsx
93
- import { Button, Card, Input } from 'xertica-ui/ui';
94
- import { QuickActionCard, ActivityCardSkeleton } from 'xertica-ui/blocks';
95
- import { Sidebar, Header } from 'xertica-ui/layout';
96
- import { XerticaProvider, XerticaLogo, LanguageSelector } from 'xertica-ui/brand';
97
- import { XerticaAssistant } from 'xertica-ui/assistant';
98
- import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
99
- import { useLayout, useTheme, useLanguage } from 'xertica-ui/hooks';
100
- import 'xertica-ui/style.css'; // once, at root
101
- ```
102
-
103
- The root `from 'xertica-ui'` exports everything (including i18n surface: `DEFAULT_LANGUAGES`, `LanguageDefinition`, `registerLanguageResource`, and `i18n` instance) and remains supported for backward compatibility.
104
-
105
- > **Note**: `useLanguage` is exported from `xertica-ui/hooks` and `xertica-ui` (root) — but **not** from `xertica-ui/brand`. The brand subpath exports only the `LanguageSelector` component and the `Language` type.
106
-
107
- ### Adding a new export to a subpath
108
-
109
- 1. Add the export to the relevant barrel (`components/[category]/index.ts`)
110
- 2. Verify it appears in the compiled `dist/[category].es.js` after `npm run build`
111
- 3. If adding a new top-level category, also update `vite.config.ts` (`lib.entry`) and `package.json` (`exports`)
112
-
113
- ---
114
-
115
- ## 5. Design Tokens — Rules for Component Authors
116
-
117
- All **library components** (`components/ui/`, `components/layout/`, etc.) must use semantic CSS tokens exclusively. Never hardcode colors, radii, or shadows in library source:
118
-
119
- ```tsx
120
- // ✅ Correct — library component
121
- className="bg-primary text-primary-foreground rounded-[var(--radius)]"
122
-
123
- // ❌ Wrong — library component
124
- className="bg-blue-600 text-white rounded-lg"
125
- style={{ backgroundColor: '#3b82f6' }}
126
- ```
127
-
128
- > **Note for Storybook stories and consumer applications:** The strict "semantic tokens only" rule applies to **library component internals** and to **semantic/status contexts** (error states, warning banners, success indicators, status badges) in all code. For layout, spacing, and general non-semantic UI in stories or consumer apps, standard Tailwind color utilities (`bg-blue-500`, `text-gray-700`) are acceptable when no semantic token maps to the intent. Raw hex values and `rgb()`/`hsl()` literals are **never** acceptable in any context.
129
-
130
- ### Token reference
131
-
132
- ```
133
- bg-background / text-foreground Page background and body text
134
- bg-card / text-card-foreground Card surfaces
135
- bg-muted / text-muted-foreground Subdued backgrounds and secondary text
136
- bg-primary / text-primary-foreground Primary actions and active states
137
- bg-secondary / text-secondary-fg Secondary actions
138
- bg-destructive Danger / error states
139
- bg-accent / text-accent-foreground Hover states
140
- bg-success / bg-info / bg-warning Semantic state colors
141
- border-border Standard borders
142
- border-input Form field borders
143
- ring-ring Focus rings
144
- ```
145
-
146
- ### Border radius
147
-
148
- Always use `rounded-[var(--radius)]` — never `rounded-sm`, `rounded-lg`, or any fixed radius class. The radius is a brand token that must be overridable by consumers.
149
-
150
- ---
151
-
152
- ## 6. Component Authoring Rules
153
-
154
- ### Non-negotiable
155
-
156
- - **Never use native HTML interactive elements** where a library component exists. `<Button>` wraps `<button>`, `<Input>` wraps `<input>`. New components must follow the same pattern.
157
- - **All interactive components must be keyboard navigable** and follow ARIA patterns. Build on Radix UI primitives.
158
- - **Icons come from `lucide-react` only.** No custom SVGs, no other icon libraries.
159
- - **No raw inline styles** (except for dynamic values like `sidebarWidth` that genuinely require them).
160
- - **No hardcoded user-facing strings.** Every label, aria-label, placeholder, tooltip, toast, and error message goes through `useTranslation()` and a key under `locales/*.json`. See section 7 below.
161
- - **Pair every data-bearing block with a matching `*Skeleton`.** See section 8 below.
162
-
163
- ### Component file structure
164
-
165
- ```
166
- components/ui/my-component/
167
- index.ts ← public re-exports only
168
- my-component.tsx ← implementation
169
- my-component.stories.tsx
170
- my-component.mdx
171
- my-component.test.tsx
172
- ```
173
-
174
- ### Stories requirements
175
-
176
- Every component must have:
177
-
178
- - A `Default` story showing the most common usage
179
- - Stories for all major prop variants
180
- - An MDX page with: overview, when to use / not to use, props table, examples, AI Rules
181
-
182
- ### AI Rules section (mandatory in every component doc)
183
-
184
- The `## AI Rules` section at the bottom of every `docs/components/[name].md` must contain:
185
-
186
- - What the agent must NEVER do with this component
187
- - What the agent must ALWAYS do
188
- - Common mistakes the AI makes and their correct form
189
-
190
- ---
191
-
192
- ## 7. Internationalization (i18n) Rules
193
-
194
- Every library component is fully translated via **`i18next`** + **`react-i18next`**. Follow these rules when authoring components:
195
-
196
- ### Component code
197
-
198
- - **Use `useTranslation()` inside components and custom hooks.** Never hardcode user-facing strings in JSX.
199
- - **Use `i18n.t()` (the imported instance) inside non-component code** (mock fetch functions, utility modules). `useTranslation` is a hook and cannot be called outside React contexts.
200
- - **Add new keys to all three locales** — place the key in the relevant split file (e.g., `locales/pt-BR/components/assistant.json` for a new assistant string, `locales/pt-BR/pages/home.json` for a home-page string) and mirror the same change in `templates/src/locales/<lang>/`. Because `i18n.ts` uses `import.meta.glob`, no import changes are needed.
201
-
202
- ### Factory functions, not frozen constants
203
-
204
- ```ts
205
- // ❌ Wrong — i18n.t() evaluated at module load, frozen in initial language
206
- export const MOCK_FEEDBACK_OPTIONS = [
207
- i18n.t('assistant.feedback.notWhatIWanted'),
208
- ];
209
-
210
- // ✅ Correct — re-evaluated at call time, always returns current language
211
- export function getMockFeedbackOptions() {
212
- return [i18n.t('assistant.feedback.notWhatIWanted')];
213
- }
214
- ```
215
-
216
- The same rule applies inside components when building label maps for enums: wrap them in `useMemo` so `t()` re-runs after a language change.
217
-
218
- ### Language-aware React Query keys
219
-
220
- Every server-state hook whose response contains translated strings **must** include the active language in its `queryKey`:
221
-
222
- ```ts
223
- import { useLanguage } from 'xertica-ui/hooks';
224
-
225
- export function useFeatureCards() {
226
- const { language } = useLanguage();
227
- return useQuery({
228
- queryKey: ['home', 'feature-cards', language], // ← language as third element
229
- queryFn: fetchFeatureCards,
230
- });
231
- }
232
- ```
233
-
234
- Switching language creates a new cache key → cache miss → automatic refetch in the new locale. No page reload. Switching back hits the cache (instant). See `docs/state-management.md` and `docs/i18n.md`.
235
-
236
- ### Runtime-configurable language set
237
-
238
- The set of available languages is **not** a strict union — it is a runtime list passed via `availableLanguages` on `<XerticaProvider>` / `<LanguageProvider>`. The `Language` type is `string`, not `'pt-BR' | 'en' | 'es'`.
239
-
240
- - **Never modify** `DEFAULT_LANGUAGES` directly to add a new locale for one project.
241
- - **To add a locale to the library itself**: create a folder at `locales/<code>/` mirroring an existing language (all subdirectory files: `common.json`, `nav.json`, `errors.json`, `languageSelector.json`, `themeToggle.json`, `pages/*.json`, `components/*.json`). Mirror the same folder under `templates/src/locales/<code>/`. No changes to `i18n.ts` are needed — `import.meta.glob` auto-discovers the new folder. Then add the descriptor to `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx` and add the language to `SUPPORTED_LANGUAGES` in `bin/language-config.ts`.
242
-
243
- ### LanguageSelector auto-hides
244
-
245
- `<LanguageSelector>` renders `null` when `useLanguage().isMonolingual === true`. Never conditionally render the selector yourself — just include it. Pass `showWhenMonolingual` only when you explicitly need it visible.
246
-
247
- ---
248
-
249
- ## 8. Loading-State Skeletons
250
-
251
- Every data-bearing block component **must** ship with a matching `*Skeleton` companion that mirrors the layout with pulsing placeholders.
252
-
253
- ### Where to place them
254
-
255
- ```
256
- components/blocks/card-patterns/
257
- ProjectCard.tsx
258
- ProjectCardSkeleton.tsx ← matching skeleton
259
- ProjectCard.stories.tsx ← include stories for both
260
- ```
261
-
262
- ### Naming + API conventions
263
-
264
- - Name: `<ComponentName>Skeleton`
265
- - Built from `<Skeleton>` (in `xertica-ui/ui`) + the same `Card`/`CardHeader`/`CardContent` primitives the real component uses — so the placeholder occupies the same vertical footprint
266
- - Expose toggle props for layout regions that can be hidden in the real component (`showStats`, `showActions`, `showViewAll`, etc.)
267
- - Expose `rows` (or `memberCount`) for list/grid sections so callers can match the loaded state's row count
268
-
269
- ### Export contract
270
-
271
- - Re-export from the block's `index.ts` alongside the data component
272
- - Re-export the props type with the matching name (`<ComponentName>SkeletonProps`)
273
- - Document them in the same `docs/components/[name].md` "Loading States" section
274
- - Include them in `card-patterns.stories.tsx` (and any aggregate MDX) so they appear in Storybook Docs
275
-
276
- ### Usage pattern
277
-
278
- ```tsx
279
- {isLoading
280
- ? <ActivityCardSkeleton rows={5} />
281
- : <ActivityCard items={items} />}
282
- ```
283
-
284
- ---
285
-
286
- ## 9. Shared Singletons (`lib/`)
287
-
288
- The `lib/` directory holds singletons that bridge React-component code and non-component modules.
289
-
290
- - **`lib/query-client.ts`** the shared `QueryClient` instance. `App.tsx` passes it to `<QueryClientProvider>`. Library code that needs to read the same instance uses `useQueryClient()` (NOT the singleton directly) so consumer-supplied clients also work. The singleton exists so that `App.tsx` can wire `<QueryClientProvider client={queryClient}>` while keeping the rest of the library agnostic.
291
-
292
- Do not add new singletons here without a strong cross-cutting reason. Prefer React context.
293
-
294
- ---
295
-
296
- ## 10. Adding a New Component
297
-
298
- 1. Create `components/ui/[name]/` with the 4 required files (source, stories, mdx, test)
299
- 2. Export from `components/ui/index.ts`
300
- 3. If the component renders data (cards, lists, tables, KPIs), **also create a `[name]Skeleton.tsx`** in the same directory and export it from the same index (see section 8)
301
- 4. **Add all user-facing strings to the appropriate split locale file** for all three languages (e.g., `locales/pt-BR/components/<name>.json` for a new UI component, or `locales/pt-BR/pages/<name>.json` for a page template). Mirror under `templates/src/locales/<lang>/`. Use `useTranslation()` in the component. (See section 7.)
302
- 5. Create `docs/components/[name].md` following the existing format
303
- 6. Add an entry to `components.json` with all fields: `name`, `docPath`, `sourcePath`, `description`, `category`, `import`, `keywords`, `relatedComponents`
304
- 7. Add the component to the relevant section of `llms-full.txt`
305
- 8. Add a one-line entry to `llms.txt` under the correct category
306
- 9. Update `llms-compact.txt` if the component is commonly used
307
- 10. Update `docs/decision-tree.md` if it overlaps with existing components
308
- 11. Update the component count in `README.md`, `llms.txt`, `llms-full.txt`, and `docs/llms.md`
309
- 12. Add a `CHANGELOG.md` entry
310
-
311
- ---
312
-
313
- ## 11. Build System
314
-
315
- ```bash
316
- npm run build # Vite multi-entry build (ES + CJS, 7 entry points)
317
- npm run build:types # tsc declarations dist/components/**/*.d.ts
318
- npm run build:cli # tsup CLI build → dist/cli.js
319
- npm run build:production # alias for npm run build
320
- ```
321
-
322
- **prepublishOnly** runs all three in sequence automatically on `npm publish`.
323
-
324
- ### Multi-entry build
325
-
326
- `vite.config.ts` uses `lib.entry` as an object with 7 keys. Output files follow `[entryName].[format].js`. UMD is NOT used (Vite does not support multi-entry + UMD). Format is `["es", "cjs"]`.
327
-
328
- ### TypeScript declarations
329
-
330
- `tsconfig.build.json` compiles declarations. It includes `components/**/*`, `contexts/**/*`, `hooks/**/*`. The `dist/components/` structure mirrors the source and is referenced by the `types` fields in `package.json` exports.
331
-
332
- ---
333
-
334
- ## 12. CLI
335
-
336
- The CLI (`bin/cli.ts`) scaffolds new projects via `npx xertica-ui@latest init` and updates existing ones via `npx xertica-ui update`. Helpers live in `bin/language-config.ts` (language registry, code generators, persistence) and `bin/generate-tokens.ts` (color theme generator).
337
-
338
- ### `init` flow
339
-
340
- 1. Prompts the user for:
341
- - Pages to include (Login, Home, Template — multi-select)
342
- - **Languages to support** (`pt-BR`, `en`, `es` — multi-select, minimum 1)
343
- - Default color theme
344
- - Install dependencies automatically
345
- 2. Copies root config files, `CLAUDE.md`, `src/app/components/AppLayout.tsx`, and `src/shared/`
346
- 3. **Generates** `src/app/App.tsx` using `generateAppTsx(selectedLanguages)` — injects the `availableLanguages` prop on `<XerticaProvider>` (omitted when all 3 defaults are selected)
347
- 4. **Generates** `src/i18n.ts` using `generateI18nFile(selectedLanguages)` — imports and `resources` for exactly the selected languages
348
- 5. Copies the locale **folders** for the selected languages via `syncLocaleFiles(..., { pruneOthers: true })` — each language is a directory tree (`<lang>/{common.json,nav.json,...,pages/,components/}`). Legacy flat `<lang>.json` files (pre-2.2.0) are automatically removed during sync.
349
- 6. Persists the selection in `src/locales/.languages.json` (schema `{ version: 1, codes: string[] }`)
350
- 7. Copies selected `src/features/` (auth, home, template); `assistant/` is always copied (AppLayout depends on it)
351
- 8. Copies selected `src/pages/` thin wrappers; `AssistantPage.tsx` is always copied
352
- 9. Generates a tailored `AuthGuard.tsx` based on selected pages
353
- 10. Generates `src/styles/xertica/tokens.css` for the chosen color theme
354
-
355
- ### `update` flow
356
-
357
- The `update` command offers three options:
358
-
359
- | Option | Behavior |
360
- |---|---|
361
- | **Theme only** | Regenerates `src/styles/xertica/tokens.css` from a new theme |
362
- | **Languages** | Reads `src/locales/.languages.json`, shows current selection, prompts for the new set, computes diff (`+`/`-`), and regenerates `App.tsx` + `i18n.ts`, copies/prunes locale **folders** (migrates legacy flat `.json` files if found) |
363
- | **Project files** | Re-installs a specific version of `xertica-ui` and copies selected parts (app, shared, features, pages, root config) — for the `app` branch, the user's language selection is **preserved** by reading `.languages.json` (or inferring from `locales/` for legacy projects) and regenerating `App.tsx` + `i18n.ts` accordingly |
364
-
365
- ### Authoring CLI code
366
-
367
- - Generators (`generateAppTsx`, `generateI18nFile`) live in `bin/language-config.ts`. Always update both when changing the App.tsx structure or i18n.ts setup in `templates/src/`.
368
- - Static files in `templates/src/app/App.tsx` and `templates/src/i18n.ts` exist for reference/Storybook but are **not** copied during `init` — they are reconstructed by the generators. Keep them in sync with the generators so contributors reading them see the canonical shape.
369
- - `SUPPORTED_LANGUAGES` in `bin/language-config.ts` is the single source of truth for CLI-exposed locales. Adding a language requires a **folder** at `templates/src/locales/<code>/` (mirroring the existing folder structure), an entry in `SUPPORTED_LANGUAGES`, and a corresponding entry in `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx`.
370
-
371
- ---
372
-
373
- ## 13. Versioning
374
-
375
- This project follows [Semantic Versioning](https://semver.org/):
376
-
377
- - **Patch** (2.0.x): Bug fixes, doc updates, export additions that don't break anything
378
- - **Minor** (2.x.0): New components, new subpath exports, new CLI features
379
- - **Major** (x.0.0): Breaking changes to component APIs, token renames, export removals
380
-
381
- Every version bump must:
382
-
383
- 1. Update `version` in `package.json`
384
- 2. Update the version badge in `README.md`
385
- 3. Add a `CHANGELOG.md` entry with Added / Changed / Fixed sections
386
- 4. Update `templates/package.json` `xertica-ui` dependency to `^[new-version]`
387
-
388
- > The CLI version is read from `package.json` at runtime (`bin/cli.ts` calls `JSON.parse(readFileSync('package.json'))`). No manual `.version()` update needed.
389
-
390
- ---
391
-
392
- ## 14. Pre-Release Checklist
393
-
394
- Before running `npm publish`:
395
-
396
- - [ ] `npm run build:production` passes without errors
397
- - [ ] `npm run build:types` passes without errors
398
- - [ ] `npm run build:cli` passes without errors
399
- - [ ] `npm test` passes (unit + Storybook chromium)
400
- - [ ] All new components have docs in `docs/components/`, entry in `components.json`, and section in `llms-full.txt`
401
- - [ ] All new user-facing strings are in the appropriate split file under `locales/pt-BR/`, `locales/en/`, `locales/es/` AND mirrored in `templates/src/locales/<lang>/`
402
- - [ ] Data-bearing block components have a matching `*Skeleton` export and documentation
403
- - [ ] `llms.txt` is up to date (component count, new entries)
404
- - [ ] `CHANGELOG.md` has an entry for this version
405
- - [ ] `README.md` version badge is updated
406
- - [ ] `templates/package.json` references the new version
1
+ # Xertica UI — Library Guidelines
2
+
3
+ > **Scope**: These guidelines apply to contributors developing the `xertica-ui` package itself (components, documentation, build system). For guidelines on projects that **consume** the package, see `templates/guidelines/Guidelines.md`.
4
+
5
+ ---
6
+
7
+ ## 1. What Xertica UI Is
8
+
9
+ Xertica UI is an enterprise-grade React component library distributed as an npm package. It is designed to be consumed by both human developers and AI coding agents (LLMs, Cursor, Claude Code, Copilot). Every design decision — from the component API to the documentation format — must serve both audiences.
10
+
11
+ **Stack:** React 18 · TypeScript 5 · Tailwind CSS v4 · Radix UI · Lucide React · Vite 6
12
+
13
+ ---
14
+
15
+ ## 2. AI-First Documentation
16
+
17
+ Documentation is a first-class deliverable. Every component ships with:
18
+
19
+ | File | Purpose | Location |
20
+ | --------------------------- | ------------------------------------------------------------------------------------- | ------------------------ |
21
+ | `llms.txt` | Index file following the llmstxt.org standard. Links to all docs. | `/llms.txt` |
22
+ | `llms-compact.txt` | ~4K token quick reference. Critical rules, imports, 12 key components with examples. | `/llms-compact.txt` |
23
+ | `llms-full.txt` | Complete documentation of all 97 components in one file for large-context LLMs. | `/llms-full.txt` |
24
+ | `components.json` | Machine-readable registry: name, category, import path, keywords, related components. | `/components.json` |
25
+ | `docs/decision-tree.md` | Decision trees: Dialog vs Sheet, Tooltip vs HoverCard, etc. | `/docs/decision-tree.md` |
26
+ | `docs/components/[name].md` | Individual component reference with props, examples, and AI rules. | `/docs/components/` |
27
+ | `docs/ai-usage.md` | Mandatory rules for AI agents operating on this library. | `/docs/ai-usage.md` |
28
+ | `CLAUDE.md` | Auto-generated system prompt for consumer projects (injected by CLI). | `/templates/CLAUDE.md` |
29
+
30
+ ### When to update documentation
31
+
32
+ Every PR that changes a component **must** update:
33
+
34
+ - `docs/components/[name].md` — if props, behavior, or examples changed
35
+ - `llms-full.txt` — the relevant component section
36
+ - `components.json` — if the component name, import path, or description changed
37
+ - `CHANGELOG.md` — under the current unreleased version
38
+
39
+ ---
40
+
41
+ ## 3. Package Structure
42
+
43
+ ```
44
+ xertica-ui/
45
+ ├── components/ # Source components (ships in package)
46
+ │ ├── ui/ # Design system primitives
47
+ │ ├── layout/ # Sidebar, Header
48
+ │ ├── brand/ # XerticaProvider, logos, ThemeToggle, LanguageSelector
49
+ │ ├── assistant/ # XerticaAssistant, ModernChatInput, MarkdownMessage, CodeBlock, FormattedDocument
50
+ │ ├── blocks/ # Composed dashboard cards + matching *Skeleton variants
51
+ │ ├── media/ # VideoPlayer, AudioPlayer, FloatingMediaWrapper
52
+ │ ├── pages/ # Full-page template components
53
+ │ └── shared/ # Internal utils (use-mobile, assistant-utils, error-boundary, error-fallbacks)
54
+ ├── contexts/ # React contexts (LayoutContext, ThemeContext, LanguageContext, etc.)
55
+ ├── features/ # Server-state hooks + mock data (home, assistant) — used by Storybook pages
56
+ ├── hooks/ # Hook re-exports
57
+ ├── lib/ # Shared singletons — currently query-client.ts
58
+ ├── utils/ # Utility functions (demo-responses, gemini)
59
+ ├── locales/ # i18n translation files — one folder per language
60
+ │ ├── pt-BR/ # {common,nav,errors,languageSelector,themeToggle}.json
61
+ │ │ ├── pages/ # home, templates, login, resetPassword, verifyEmail,
62
+ │ │ │ # loginTemplate, formTemplate, dashboardTemplate, crudTemplate
63
+ │ │ └── components/ # assistant, sidebar, media, projectCard, profileCard,
64
+ │ │ # notificationCard, activityCard, stats, team
65
+ │ ├── en/ # (same structure)
66
+ │ └── es/ # (same structure)
67
+ ├── i18n.ts # i18next setup (registerLanguageResource helper exported)
68
+ ├── styles/ # Global CSS and token maps
69
+ ├── templates/ # CLI scaffold template (FSD/FDA project)
70
+ ├── bin/ # CLI source + helpers
71
+ │ ├── cli.ts # commander entry point (init, update)
72
+ │ ├── language-config.ts # language registry + code generators
73
+ │ └── generate-tokens.ts # color theme generator
74
+ ├── dist/ # Compiled library (ES + CJS + CSS + types)
75
+ ├── docs/ # Markdown docs (ships in package for AI agents)
76
+ ├── llms.txt # AI documentation index
77
+ ├── llms-compact.txt # Compact AI reference
78
+ ├── llms-full.txt # Full AI documentation
79
+ └── components.json # Machine-readable component registry
80
+ ```
81
+
82
+ ### Why source ships with the package
83
+
84
+ The `components/`, `contexts/`, `hooks/`, `lib/`, `i18n.ts`, and `locales/` directories are intentionally included in the npm package (via the `files` field in `package.json`). AI agents running in consumer projects can inspect source, stories, and documentation directly from `node_modules/xertica-ui/`. This is the primary AI-first design decision.
85
+
86
+ ---
87
+
88
+ ## 4. Subpath Exports
89
+
90
+ The package exposes 7 entry points. Always use the most specific subpath:
91
+
92
+ ```tsx
93
+ import { Button, Card, Input } from 'xertica-ui/ui';
94
+ import { QuickActionCard, ActivityCardSkeleton } from 'xertica-ui/blocks';
95
+ import { Sidebar, Header } from 'xertica-ui/layout';
96
+ import { XerticaProvider, XerticaLogo, LanguageSelector } from 'xertica-ui/brand';
97
+ import { XerticaAssistant } from 'xertica-ui/assistant';
98
+ import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
99
+ import { useLayout, useTheme, useLanguage } from 'xertica-ui/hooks';
100
+ import 'xertica-ui/style.css'; // once, at root
101
+ ```
102
+
103
+ The root `from 'xertica-ui'` exports everything (including i18n surface: `DEFAULT_LANGUAGES`, `LanguageDefinition`, `registerLanguageResource`, and `i18n` instance) and remains supported for backward compatibility.
104
+
105
+ > **Note**: `useLanguage` is exported from `xertica-ui/hooks` and `xertica-ui` (root) — but **not** from `xertica-ui/brand`. The brand subpath exports only the `LanguageSelector` component and the `Language` type.
106
+
107
+ ### Adding a new export to a subpath
108
+
109
+ 1. Add the export to the relevant barrel (`components/[category]/index.ts`)
110
+ 2. Verify it appears in the compiled `dist/[category].es.js` after `npm run build`
111
+ 3. If adding a new top-level category, also update `vite.config.ts` (`lib.entry`) and `package.json` (`exports`)
112
+
113
+ ---
114
+
115
+ ## 5. Design Tokens — Rules for Component Authors
116
+
117
+ All **library components** (`components/ui/`, `components/layout/`, etc.) must use semantic CSS tokens exclusively. Never hardcode colors, radii, or shadows in library source:
118
+
119
+ ```tsx
120
+ // ✅ Correct — library component
121
+ className="bg-primary text-primary-foreground rounded-[var(--radius)]"
122
+
123
+ // ❌ Wrong — library component
124
+ className="bg-blue-600 text-white rounded-lg"
125
+ style={{ backgroundColor: '#3b82f6' }}
126
+ ```
127
+
128
+ > **Note for Storybook stories and consumer applications:** The strict "semantic tokens only" rule applies to **library component internals** and to **semantic/status contexts** (error states, warning banners, success indicators, status badges) in all code. For layout, spacing, and general non-semantic UI in stories or consumer apps, standard Tailwind color utilities (`bg-blue-500`, `text-gray-700`) are acceptable when no semantic token maps to the intent. Raw hex values and `rgb()`/`hsl()` literals are **never** acceptable in any context.
129
+
130
+ ### Token reference
131
+
132
+ ```
133
+ bg-background / text-foreground Page background and body text
134
+ bg-card / text-card-foreground Card surfaces
135
+ bg-muted / text-muted-foreground Subdued backgrounds and secondary text
136
+ bg-primary / text-primary-foreground Primary actions and active states
137
+ bg-secondary / text-secondary-fg Secondary actions
138
+ bg-destructive Danger / error states
139
+ bg-accent / text-accent-foreground Hover states
140
+ bg-success / bg-info / bg-warning Semantic state colors
141
+ border-border Standard borders
142
+ border-input Form field borders
143
+ ring-ring Focus rings
144
+ ```
145
+
146
+ ### Border radius
147
+
148
+ Always use `rounded-[var(--radius)]` — never `rounded-sm`, `rounded-lg`, or any fixed radius class. The radius is a brand token that must be overridable by consumers.
149
+
150
+ ---
151
+
152
+ ## 6. Component Authoring Rules
153
+
154
+ ### Non-negotiable
155
+
156
+ - **Never use native HTML interactive elements** where a library component exists. `<Button>` wraps `<button>`, `<Input>` wraps `<input>`. New components must follow the same pattern.
157
+ - **All interactive components must be keyboard navigable** and follow ARIA patterns. Build on Radix UI primitives.
158
+ - **Icons come from `lucide-react` only.** No custom SVGs, no other icon libraries.
159
+ - **No raw inline styles** (except for dynamic values like `sidebarWidth` that genuinely require them).
160
+ - **No hardcoded user-facing strings.** Every label, aria-label, placeholder, tooltip, toast, and error message goes through `useTranslation()` and a key under `locales/*.json`. See section 7 below.
161
+ - **Pair every data-bearing block with a matching `*Skeleton`.** See section 8 below.
162
+
163
+ ### Component file structure
164
+
165
+ ```
166
+ components/ui/my-component/
167
+ index.ts ← public re-exports only
168
+ my-component.tsx ← implementation
169
+ my-component.stories.tsx
170
+ my-component.mdx
171
+ my-component.test.tsx
172
+ ```
173
+
174
+ ### Stories requirements
175
+
176
+ Every component must have:
177
+
178
+ - A `Default` story showing the most common usage
179
+ - Stories for all major prop variants
180
+ - An MDX page with: overview, when to use / not to use, props table, examples, AI Rules
181
+
182
+ ### AI Rules section (mandatory in every component doc)
183
+
184
+ The `## AI Rules` section at the bottom of every `docs/components/[name].md` must contain:
185
+
186
+ - What the agent must NEVER do with this component
187
+ - What the agent must ALWAYS do
188
+ - Common mistakes the AI makes and their correct form
189
+
190
+ ---
191
+
192
+ ## 7. Internationalization (i18n) Rules
193
+
194
+ Every library component is fully translated via **`i18next`** + **`react-i18next`**. Follow these rules when authoring components:
195
+
196
+ ### Component code
197
+
198
+ - **Use `useTranslation()` inside components and custom hooks.** Never hardcode user-facing strings in JSX.
199
+ - **Use `i18n.t()` (the imported instance) inside non-component code** (mock fetch functions, utility modules). `useTranslation` is a hook and cannot be called outside React contexts.
200
+ - **Add new keys to all three locales** — place the key in the relevant split file (e.g., `locales/pt-BR/components/assistant.json` for a new assistant string, `locales/pt-BR/pages/home.json` for a home-page string) and mirror the same change in `templates/src/locales/<lang>/`. Because `i18n.ts` uses `import.meta.glob`, no import changes are needed.
201
+
202
+ ### Factory functions, not frozen constants
203
+
204
+ ```ts
205
+ // ❌ Wrong — i18n.t() evaluated at module load, frozen in initial language
206
+ export const MOCK_FEEDBACK_OPTIONS = [i18n.t('assistant.feedback.notWhatIWanted')];
207
+
208
+ // ✅ Correct — re-evaluated at call time, always returns current language
209
+ export function getMockFeedbackOptions() {
210
+ return [i18n.t('assistant.feedback.notWhatIWanted')];
211
+ }
212
+ ```
213
+
214
+ The same rule applies inside components when building label maps for enums: wrap them in `useMemo` so `t()` re-runs after a language change.
215
+
216
+ ### Language-aware React Query keys
217
+
218
+ Every server-state hook whose response contains translated strings **must** include the active language in its `queryKey`:
219
+
220
+ ```ts
221
+ import { useLanguage } from 'xertica-ui/hooks';
222
+
223
+ export function useFeatureCards() {
224
+ const { language } = useLanguage();
225
+ return useQuery({
226
+ queryKey: ['home', 'feature-cards', language], // language as third element
227
+ queryFn: fetchFeatureCards,
228
+ });
229
+ }
230
+ ```
231
+
232
+ Switching language creates a new cache key → cache miss → automatic refetch in the new locale. No page reload. Switching back hits the cache (instant). See `docs/state-management.md` and `docs/i18n.md`.
233
+
234
+ ### Runtime-configurable language set
235
+
236
+ The set of available languages is **not** a strict union — it is a runtime list passed via `availableLanguages` on `<XerticaProvider>` / `<LanguageProvider>`. The `Language` type is `string`, not `'pt-BR' | 'en' | 'es'`.
237
+
238
+ - **Never modify** `DEFAULT_LANGUAGES` directly to add a new locale for one project.
239
+ - **To add a locale to the library itself**: create a folder at `locales/<code>/` mirroring an existing language (all subdirectory files: `common.json`, `nav.json`, `errors.json`, `languageSelector.json`, `themeToggle.json`, `pages/*.json`, `components/*.json`). Mirror the same folder under `templates/src/locales/<code>/`. No changes to `i18n.ts` are needed — `import.meta.glob` auto-discovers the new folder. Then add the descriptor to `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx` and add the language to `SUPPORTED_LANGUAGES` in `bin/language-config.ts`.
240
+
241
+ ### LanguageSelector auto-hides
242
+
243
+ `<LanguageSelector>` renders `null` when `useLanguage().isMonolingual === true`. Never conditionally render the selector yourself — just include it. Pass `showWhenMonolingual` only when you explicitly need it visible.
244
+
245
+ ---
246
+
247
+ ## 8. Loading-State Skeletons
248
+
249
+ Every data-bearing block component **must** ship with a matching `*Skeleton` companion that mirrors the layout with pulsing placeholders.
250
+
251
+ ### Where to place them
252
+
253
+ ```
254
+ components/blocks/card-patterns/
255
+ ProjectCard.tsx
256
+ ProjectCardSkeleton.tsx ← matching skeleton
257
+ ProjectCard.stories.tsx ← include stories for both
258
+ ```
259
+
260
+ ### Naming + API conventions
261
+
262
+ - Name: `<ComponentName>Skeleton`
263
+ - Built from `<Skeleton>` (in `xertica-ui/ui`) + the same `Card`/`CardHeader`/`CardContent` primitives the real component uses — so the placeholder occupies the same vertical footprint
264
+ - Expose toggle props for layout regions that can be hidden in the real component (`showStats`, `showActions`, `showViewAll`, etc.)
265
+ - Expose `rows` (or `memberCount`) for list/grid sections so callers can match the loaded state's row count
266
+
267
+ ### Export contract
268
+
269
+ - Re-export from the block's `index.ts` alongside the data component
270
+ - Re-export the props type with the matching name (`<ComponentName>SkeletonProps`)
271
+ - Document them in the same `docs/components/[name].md` "Loading States" section
272
+ - Include them in `card-patterns.stories.tsx` (and any aggregate MDX) so they appear in Storybook Docs
273
+
274
+ ### Usage pattern
275
+
276
+ ```tsx
277
+ {
278
+ isLoading ? <ActivityCardSkeleton rows={5} /> : <ActivityCard items={items} />;
279
+ }
280
+ ```
281
+
282
+ ---
283
+
284
+ ## 9. Shared Singletons (`lib/`)
285
+
286
+ The `lib/` directory holds singletons that bridge React-component code and non-component modules.
287
+
288
+ - **`lib/query-client.ts`** the shared `QueryClient` instance. `App.tsx` passes it to `<QueryClientProvider>`. Library code that needs to read the same instance uses `useQueryClient()` (NOT the singleton directly) so consumer-supplied clients also work. The singleton exists so that `App.tsx` can wire `<QueryClientProvider client={queryClient}>` while keeping the rest of the library agnostic.
289
+
290
+ Do not add new singletons here without a strong cross-cutting reason. Prefer React context.
291
+
292
+ ---
293
+
294
+ ## 10. Adding a New Component
295
+
296
+ 1. Create `components/ui/[name]/` with the 4 required files (source, stories, mdx, test)
297
+ 2. Export from `components/ui/index.ts`
298
+ 3. If the component renders data (cards, lists, tables, KPIs), **also create a `[name]Skeleton.tsx`** in the same directory and export it from the same index (see section 8)
299
+ 4. **Add all user-facing strings to the appropriate split locale file** for all three languages (e.g., `locales/pt-BR/components/<name>.json` for a new UI component, or `locales/pt-BR/pages/<name>.json` for a page template). Mirror under `templates/src/locales/<lang>/`. Use `useTranslation()` in the component. (See section 7.)
300
+ 5. Create `docs/components/[name].md` following the existing format
301
+ 6. Add an entry to `components.json` with all fields: `name`, `docPath`, `sourcePath`, `description`, `category`, `import`, `keywords`, `relatedComponents`
302
+ 7. Add the component to the relevant section of `llms-full.txt`
303
+ 8. Add a one-line entry to `llms.txt` under the correct category
304
+ 9. Update `llms-compact.txt` if the component is commonly used
305
+ 10. Update `docs/decision-tree.md` if it overlaps with existing components
306
+ 11. Update the component count in `README.md`, `llms.txt`, `llms-full.txt`, and `docs/llms.md`
307
+ 12. Add a `CHANGELOG.md` entry
308
+
309
+ ---
310
+
311
+ ## 11. Build System
312
+
313
+ ```bash
314
+ npm run build # Vite multi-entry build (ES + CJS, 7 entry points)
315
+ npm run build:types # tsc declarations → dist/components/**/*.d.ts
316
+ npm run build:cli # tsup CLI build dist/cli.js
317
+ npm run build:production # alias for npm run build
318
+ ```
319
+
320
+ **prepublishOnly** runs all three in sequence automatically on `npm publish`.
321
+
322
+ ### Multi-entry build
323
+
324
+ `vite.config.ts` uses `lib.entry` as an object with 7 keys. Output files follow `[entryName].[format].js`. UMD is NOT used (Vite does not support multi-entry + UMD). Format is `["es", "cjs"]`.
325
+
326
+ ### TypeScript declarations
327
+
328
+ `tsconfig.build.json` compiles declarations. It includes `components/**/*`, `contexts/**/*`, `hooks/**/*`. The `dist/components/` structure mirrors the source and is referenced by the `types` fields in `package.json` exports.
329
+
330
+ ---
331
+
332
+ ## 12. CLI
333
+
334
+ The CLI (`bin/cli.ts`) scaffolds new projects via `npx xertica-ui@latest init` and updates existing ones via `npx xertica-ui update`. Helpers live in `bin/language-config.ts` (language registry, code generators, persistence) and `bin/generate-tokens.ts` (color theme generator).
335
+
336
+ ### `init` flow
337
+
338
+ 1. Prompts the user for:
339
+ - Pages to include (Login, Home, Template — multi-select)
340
+ - **Languages to support** (`pt-BR`, `en`, `es` — multi-select, minimum 1)
341
+ - Default color theme
342
+ - **Enable dark mode support?** (confirm, default: true)
343
+ - **Include AI Assistant?** (confirm, default: true)
344
+ - Install dependencies automatically
345
+ 2. Copies root config files, `CLAUDE.md`, `src/app/components/AppLayout.tsx`, and `src/shared/`
346
+ 3. **Generates** `src/app/App.tsx` using `generateAppTsx(selectedLanguages, disableDarkMode)` — injects the `availableLanguages` prop on `<XerticaProvider>` (omitted when all 3 defaults are selected) and `disableDarkMode={true}` if disabled.
347
+ 4. **Generates** `src/i18n.ts` using `generateI18nFile(selectedLanguages)` — imports and `resources` for exactly the selected languages
348
+ 5. Copies the locale **folders** for the selected languages via `syncLocaleFiles(..., { pruneOthers: true })` — each language is a directory tree (`<lang>/{common.json,nav.json,...,pages/,components/}`). Legacy flat `<lang>.json` files (pre-2.2.0) are automatically removed during sync.
349
+ 6. Persists the selection in `src/locales/.languages.json` (schema `{ version: 1, codes: string[] }`)
350
+ 7. Copies selected `src/features/` (auth, home, template); `assistant/` is copied conditionally based on selection (AppLayout depends on it, but features are loaded dynamically)
351
+ 8. Copies selected `src/pages/` thin wrappers; `AssistantPage.tsx` is copied conditionally based on selection
352
+ 9. Generates a tailored `AuthGuard.tsx` based on selected pages
353
+ 10. Generates `src/styles/xertica/tokens.css` for the chosen color theme
354
+ 11. Persists configuration choices in `.xertica.json` (schema `{ version: 1, hasAssistant: boolean, disableDarkMode: boolean }`)
355
+
356
+ ### `update` flow
357
+
358
+ The `update` command offers five options:
359
+
360
+ | Option | Behavior |
361
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
362
+ | **Theme only** | Regenerates `src/styles/xertica/tokens.css` from a new theme |
363
+ | **Languages** | Reads `src/locales/.languages.json`, shows current selection, prompts for the new set, computes diff (`+`/`-`), and regenerates `App.tsx` + `i18n.ts`, copies/prunes locale **folders** (migrates legacy flat `.json` files if found) |
364
+ | **Dark Mode** | Toggles dark mode support: enables it or disables it (updates `.xertica.json` and regenerates `App.tsx` to set `disableDarkMode` flag) |
365
+ | **Assistant** | Adds or removes the AI Assistant (copies/deletes files, regenerates `AuthGuard.tsx`, `HomePage.tsx`, `TemplatePage.tsx`) |
366
+ | **Project files** | Re-installs a specific version of `xertica-ui` and copies selected parts (app, shared, features, pages, root config) — for the `app` branch, the user's language selection is **preserved** by reading `.languages.json` (or inferring from `locales/` for legacy projects) and regenerating `App.tsx` + `i18n.ts` accordingly |
367
+
368
+ ### Authoring CLI code
369
+
370
+ - Generators (`generateAppTsx`, `generateI18nFile`) live in `bin/language-config.ts`. Always update both when changing the App.tsx structure or i18n.ts setup in `templates/src/`.
371
+ - Static files in `templates/src/app/App.tsx` and `templates/src/i18n.ts` exist for reference/Storybook but are **not** copied during `init` — they are reconstructed by the generators. Keep them in sync with the generators so contributors reading them see the canonical shape.
372
+ - `SUPPORTED_LANGUAGES` in `bin/language-config.ts` is the single source of truth for CLI-exposed locales. Adding a language requires a **folder** at `templates/src/locales/<code>/` (mirroring the existing folder structure), an entry in `SUPPORTED_LANGUAGES`, and a corresponding entry in `DEFAULT_LANGUAGES` in `contexts/LanguageContext.tsx`.
373
+
374
+ ---
375
+
376
+ ## 13. Versioning
377
+
378
+ This project follows [Semantic Versioning](https://semver.org/):
379
+
380
+ - **Patch** (2.0.x): Bug fixes, doc updates, export additions that don't break anything
381
+ - **Minor** (2.x.0): New components, new subpath exports, new CLI features
382
+ - **Major** (x.0.0): Breaking changes to component APIs, token renames, export removals
383
+
384
+ Every version bump must:
385
+
386
+ 1. Update `version` in `package.json`
387
+ 2. Update the version badge in `README.md`
388
+ 3. Add a `CHANGELOG.md` entry with Added / Changed / Fixed sections
389
+ 4. Update `templates/package.json` `xertica-ui` dependency to `^[new-version]`
390
+
391
+ > The CLI version is read from `package.json` at runtime (`bin/cli.ts` calls `JSON.parse(readFileSync('package.json'))`). No manual `.version()` update needed.
392
+
393
+ ---
394
+
395
+ ## 14. Pre-Release Checklist
396
+
397
+ Before running `npm publish`:
398
+
399
+ - [ ] `npm run build:production` passes without errors
400
+ - [ ] `npm run build:types` passes without errors
401
+ - [ ] `npm run build:cli` passes without errors
402
+ - [ ] `npm test` passes (unit + Storybook chromium)
403
+ - [ ] All new components have docs in `docs/components/`, entry in `components.json`, and section in `llms-full.txt`
404
+ - [ ] All new user-facing strings are in the appropriate split file under `locales/pt-BR/`, `locales/en/`, `locales/es/` AND mirrored in `templates/src/locales/<lang>/`
405
+ - [ ] Data-bearing block components have a matching `*Skeleton` export and documentation
406
+ - [ ] `llms.txt` is up to date (component count, new entries)
407
+ - [ ] `CHANGELOG.md` has an entry for this version
408
+ - [ ] `README.md` version badge is updated
409
+ - [ ] `templates/package.json` references the new version