xertica-ui 2.1.2 → 2.1.3

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 (402) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +1 -1
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/cli.ts +1 -1
  6. package/bin/generate-tokens.ts +13 -7
  7. package/components/assistant/index.ts +6 -6
  8. package/components/assistant/xertica-assistant/index.ts +2 -0
  9. package/components/assistant/xertica-assistant/use-assistant.ts +564 -0
  10. package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +200 -0
  11. package/components/assistant/xertica-assistant/xertica-assistant.tsx +183 -474
  12. package/components/blocks/card-patterns/ActivityCard.tsx +72 -72
  13. package/components/blocks/card-patterns/FeatureCard.tsx +100 -100
  14. package/components/blocks/card-patterns/NotificationCard.tsx +127 -127
  15. package/components/blocks/card-patterns/ProfileCard.tsx +84 -84
  16. package/components/blocks/card-patterns/ProjectCard.tsx +89 -89
  17. package/components/blocks/card-patterns/QuickActionCard.tsx +62 -62
  18. package/components/blocks/card-patterns/card-patterns.stories.tsx +445 -445
  19. package/components/blocks/card-patterns/index.ts +17 -17
  20. package/components/blocks/index.ts +1 -1
  21. package/components/brand/index.ts +6 -6
  22. package/components/brand/xertica-provider/XerticaProvider.tsx +48 -48
  23. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  24. package/components/brand/xertica-provider/xertica-provider.test.tsx +52 -52
  25. package/components/examples/MapExamples.tsx +282 -282
  26. package/components/examples/SimpleFilterableMap.tsx +191 -191
  27. package/components/examples/index.ts +51 -51
  28. package/components/figma/ImageWithFallback.tsx +27 -27
  29. package/components/hooks/index.ts +7 -7
  30. package/components/index.ts +5 -5
  31. package/components/layout/header/header.test.tsx +8 -8
  32. package/components/layout/header/header.tsx +4 -4
  33. package/components/layout/index.ts +2 -2
  34. package/components/layout/sidebar/index.ts +2 -0
  35. package/components/layout/sidebar/sidebar.mdx +1 -1
  36. package/components/layout/sidebar/sidebar.stories.tsx +160 -8
  37. package/components/layout/sidebar/sidebar.test.tsx +11 -11
  38. package/components/layout/sidebar/sidebar.tsx +610 -471
  39. package/components/layout/sidebar/use-sidebar.ts +113 -0
  40. package/components/media/FloatingMediaWrapper.tsx +11 -11
  41. package/components/media/audio-player/AudioPlayer.tsx +22 -22
  42. package/components/media/index.ts +3 -3
  43. package/components/pages/home-content/HomeContent.tsx +7 -7
  44. package/components/pages/home-content/home-content.mdx +62 -62
  45. package/components/pages/home-page/HomePage.stories.tsx +39 -39
  46. package/components/pages/home-page/HomePage.tsx +1 -1
  47. package/components/pages/home-page/home-page.mdx +53 -53
  48. package/components/pages/index.ts +8 -8
  49. package/components/pages/template-content/TemplateContent.tsx +5 -5
  50. package/components/pages/template-content/template-content.mdx +61 -61
  51. package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
  52. package/components/pages/template-page/TemplatePage.tsx +5 -5
  53. package/components/pages/template-page/template-page.mdx +53 -53
  54. package/components/public-api-smoke.test.tsx +52 -52
  55. package/components/shared/assistant-utils.ts +43 -43
  56. package/components/shared/layout-constants.ts +1 -1
  57. package/components/ui/accordion/accordion.mdx +8 -8
  58. package/components/ui/accordion/accordion.stories.tsx +53 -53
  59. package/components/ui/alert/alert.mdx +8 -8
  60. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  61. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  62. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  63. package/components/ui/avatar/avatar.mdx +8 -8
  64. package/components/ui/badge/badge.mdx +8 -8
  65. package/components/ui/badge/badge.tsx +9 -9
  66. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  67. package/components/ui/button/button.mdx +8 -8
  68. package/components/ui/calendar/calendar.mdx +8 -8
  69. package/components/ui/calendar/calendar.tsx +258 -258
  70. package/components/ui/card/card.mdx +8 -8
  71. package/components/ui/card/card.stories.tsx +245 -245
  72. package/components/ui/carousel/carousel.mdx +8 -8
  73. package/components/ui/chart/chart.mdx +8 -8
  74. package/components/ui/chart/chart.stories.tsx +1303 -344
  75. package/components/ui/chart/chart.test.tsx +154 -154
  76. package/components/ui/chart/chart.tsx +2367 -1494
  77. package/components/ui/checkbox/checkbox.mdx +8 -8
  78. package/components/ui/checkbox/checkbox.stories.tsx +20 -20
  79. package/components/ui/collapsible/collapsible.mdx +8 -8
  80. package/components/ui/command/command.mdx +8 -8
  81. package/components/ui/context-menu/context-menu.mdx +8 -8
  82. package/components/ui/dialog/dialog.mdx +8 -8
  83. package/components/ui/drawer/drawer.mdx +8 -8
  84. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  85. package/components/ui/empty/empty.mdx +8 -8
  86. package/components/ui/file-upload/file-upload.mdx +8 -8
  87. package/components/ui/file-upload/file-upload.stories.tsx +100 -0
  88. package/components/ui/file-upload/file-upload.tsx +14 -74
  89. package/components/ui/file-upload/index.ts +1 -0
  90. package/components/ui/file-upload/use-file-upload.ts +181 -0
  91. package/components/ui/google-maps-loader/google-maps-loader.tsx +2 -2
  92. package/components/ui/hover-card/hover-card.mdx +8 -8
  93. package/components/ui/input/input.mdx +8 -8
  94. package/components/ui/input-otp/input-otp.mdx +8 -8
  95. package/components/ui/input-otp/input-otp.stories.tsx +6 -6
  96. package/components/ui/label/label.mdx +8 -8
  97. package/components/ui/map/map.mdx +8 -8
  98. package/components/ui/map/map.stories.tsx +51 -51
  99. package/components/ui/map/map.tsx +2 -2
  100. package/components/ui/menubar/menubar.mdx +8 -8
  101. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  102. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  103. package/components/ui/pagination/index.ts +2 -0
  104. package/components/ui/pagination/pagination.mdx +8 -8
  105. package/components/ui/pagination/pagination.stories.tsx +94 -0
  106. package/components/ui/pagination/use-pagination.ts +194 -0
  107. package/components/ui/popover/popover.mdx +8 -8
  108. package/components/ui/progress/progress.mdx +8 -8
  109. package/components/ui/progress/progress.tsx +68 -68
  110. package/components/ui/radio-group/radio-group.mdx +8 -8
  111. package/components/ui/rating/rating.mdx +8 -8
  112. package/components/ui/resizable/resizable.mdx +8 -8
  113. package/components/ui/rich-text-editor/index.ts +2 -0
  114. package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +129 -1
  115. package/components/ui/rich-text-editor/rich-text-editor.tsx +86 -305
  116. package/components/ui/rich-text-editor/use-rich-text-editor.ts +439 -0
  117. package/components/ui/route-map/route-map.mdx +8 -8
  118. package/components/ui/route-map/route-map.stories.tsx +54 -54
  119. package/components/ui/route-map/route-map.tsx +2 -2
  120. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  121. package/components/ui/search/search.mdx +8 -8
  122. package/components/ui/select/select.mdx +8 -8
  123. package/components/ui/select/select.stories.tsx +9 -9
  124. package/components/ui/separator/separator.mdx +8 -8
  125. package/components/ui/sheet/sheet.mdx +8 -8
  126. package/components/ui/sheet/sheet.stories.tsx +95 -95
  127. package/components/ui/simple-map/simple-map.mdx +8 -8
  128. package/components/ui/simple-map/simple-map.stories.tsx +48 -48
  129. package/components/ui/skeleton/skeleton.mdx +8 -8
  130. package/components/ui/slider/slider.mdx +8 -8
  131. package/components/ui/sonner/sonner.mdx +8 -8
  132. package/components/ui/stats-card/stats-card.mdx +8 -8
  133. package/components/ui/stepper/index.ts +3 -1
  134. package/components/ui/stepper/stepper.mdx +8 -8
  135. package/components/ui/stepper/stepper.stories.tsx +116 -0
  136. package/components/ui/stepper/stepper.tsx +4 -4
  137. package/components/ui/stepper/use-stepper.ts +137 -0
  138. package/components/ui/switch/switch.mdx +8 -8
  139. package/components/ui/switch/switch.stories.tsx +20 -20
  140. package/components/ui/table/table.mdx +8 -8
  141. package/components/ui/tabs/tabs.mdx +8 -8
  142. package/components/ui/tabs/tabs.stories.tsx +26 -26
  143. package/components/ui/textarea/textarea.mdx +8 -8
  144. package/components/ui/timeline/timeline.mdx +8 -8
  145. package/components/ui/toggle/toggle.mdx +8 -8
  146. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  147. package/components/ui/tooltip/tooltip.mdx +8 -8
  148. package/components/ui/tree-view/index.ts +4 -1
  149. package/components/ui/tree-view/tree-view.mdx +8 -8
  150. package/components/ui/tree-view/tree-view.stories.tsx +110 -4
  151. package/components/ui/tree-view/tree-view.tsx +17 -125
  152. package/components/ui/tree-view/use-tree-view.ts +229 -0
  153. package/components.json +1512 -1512
  154. package/contexts/ApiKeyContext.tsx +72 -72
  155. package/contexts/BrandColorsContext.tsx +26 -26
  156. package/contexts/LanguageContext.tsx +13 -13
  157. package/contexts/LayoutContext.test.tsx +11 -11
  158. package/contexts/LayoutContext.tsx +29 -29
  159. package/contexts/ThemeContext.tsx +26 -26
  160. package/contexts/theme-data.ts +4 -4
  161. package/dist/{AssistantChart-CVzmmhx4.js → AssistantChart-C_hwFRRr.js} +4 -4
  162. package/dist/{AssistantChart-BAx9VQvb.cjs → AssistantChart-CldVCVDe.cjs} +311 -94
  163. package/dist/{AssistantChart-CVko2A1W.js → AssistantChart-Cu3m7RBo.js} +314 -97
  164. package/dist/{AssistantChart-9w31gdAb.cjs → AssistantChart-DoZCyS5r.cjs} +4 -4
  165. package/dist/AudioPlayer-B1lt5cPl.cjs +989 -0
  166. package/dist/AudioPlayer-BZ7bibzU.cjs +982 -0
  167. package/dist/AudioPlayer-C12BjQBV.cjs +997 -0
  168. package/dist/AudioPlayer-DMcG_c7L.js +990 -0
  169. package/dist/AudioPlayer-DcFKRJE_.js +998 -0
  170. package/dist/AudioPlayer-e8LfNoqO.js +983 -0
  171. package/dist/{xertica-assistant-Qp3ydksa.cjs → CodeBlock-7TTgmdGG.cjs} +263 -51
  172. package/dist/{xertica-assistant-gnCJdcZY.js → CodeBlock-BeSt1h5P.js} +219 -7
  173. package/dist/CodeBlock-BgfYL_rD.cjs +2094 -0
  174. package/dist/CodeBlock-BlcqlA9M.cjs +2094 -0
  175. package/dist/CodeBlock-Bnmeu5ez.cjs +2094 -0
  176. package/dist/CodeBlock-BtfPlbAI.js +2078 -0
  177. package/dist/CodeBlock-CIySIuYr.js +2078 -0
  178. package/dist/CodeBlock-CuPtUM-7.cjs +2094 -0
  179. package/dist/CodeBlock-D6ffWXgc.js +2078 -0
  180. package/dist/CodeBlock-D8dcwbit.cjs +2094 -0
  181. package/dist/CodeBlock-DMZrFnlw.cjs +2094 -0
  182. package/dist/CodeBlock-DlBehYN8.js +2078 -0
  183. package/dist/CodeBlock-DnYNI8rQ.js +2078 -0
  184. package/dist/CodeBlock-DvKWbSnE.cjs +2094 -0
  185. package/dist/CodeBlock-DwMCfkFY.js +2078 -0
  186. package/dist/CodeBlock-Dy6CNYyj.js +2078 -0
  187. package/dist/CodeBlock-U1pPOQI7.cjs +2094 -0
  188. package/dist/CodeBlock-f_GpNhEB.js +2078 -0
  189. package/dist/CodeBlock-oB6u8nI1.js +2078 -0
  190. package/dist/CodeBlock-tZC31B73.cjs +2094 -0
  191. package/dist/ImageWithFallback-CGtidP6B.cjs +4542 -0
  192. package/dist/ImageWithFallback-lsg3pdFg.js +4508 -0
  193. package/dist/LanguageSelector-B5YfbHra.js +231 -0
  194. package/dist/LanguageSelector-D6uacAIM.cjs +230 -0
  195. package/dist/LayoutContext-BAql6ZRY.js +97 -0
  196. package/dist/LayoutContext-BvK-ggDa.cjs +96 -0
  197. package/dist/ThemeContext-BoH4NLfN.js +734 -0
  198. package/dist/{ThemeContext-BbBNoFTG.js → ThemeContext-C2EwAPDt.js} +2 -2
  199. package/dist/ThemeContext-r69W20Xg.cjs +733 -0
  200. package/dist/{ThemeContext-Cmr8Ex8H.cjs → ThemeContext-vTjumZeM.cjs} +2 -2
  201. package/dist/{VerifyEmailPage-BE-L9mB7.js → VerifyEmailPage-C0c2e5n0.js} +7 -7
  202. package/dist/{VerifyEmailPage-DMBh4NM9.cjs → VerifyEmailPage-CYXtbKi3.cjs} +1 -1
  203. package/dist/{VerifyEmailPage-CR7kb5df.cjs → VerifyEmailPage-Cwi3kbol.cjs} +7 -7
  204. package/dist/{VerifyEmailPage-CdYPSJoO.js → VerifyEmailPage-DvMLZgFt.js} +1 -1
  205. package/dist/XerticaOrbe-KL1RBHzw.cjs +1354 -0
  206. package/dist/XerticaOrbe-zwS1p2a8.js +1355 -0
  207. package/dist/XerticaProvider-6btlAlzc.js +17 -0
  208. package/dist/XerticaProvider-BNoNOxQ5.cjs +16 -0
  209. package/dist/XerticaProvider-BlY2limY.cjs +38 -0
  210. package/dist/{XerticaProvider-BITjgC5p.js → XerticaProvider-CEoWMTxu.js} +2 -2
  211. package/dist/{XerticaProvider-By8q3Roe.cjs → XerticaProvider-CllrbMEJ.cjs} +2 -2
  212. package/dist/XerticaProvider-DDuiIcKo.js +39 -0
  213. package/dist/XerticaProvider-cI9hSs27.cjs +38 -0
  214. package/dist/XerticaProvider-hSwhNQex.js +39 -0
  215. package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-DSKByiKZ.cjs} +3 -3
  216. package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-s-vmNkJ_.js} +3 -3
  217. package/dist/assistant.cjs.js +2 -1
  218. package/dist/assistant.es.js +3 -2
  219. package/dist/brand.cjs.js +1 -1
  220. package/dist/brand.es.js +1 -1
  221. package/dist/breadcrumb-CqJ7bHY5.js +161 -0
  222. package/dist/breadcrumb-m9Hb2_XN.cjs +177 -0
  223. package/dist/cli.js +14 -8
  224. package/dist/components/assistant/xertica-assistant/index.d.ts +2 -0
  225. package/dist/components/assistant/xertica-assistant/use-assistant.d.ts +126 -0
  226. package/dist/components/assistant/xertica-assistant/xertica-assistant.d.ts +7 -2
  227. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +35 -0
  228. package/dist/components/blocks/audio-player/index.d.ts +1 -0
  229. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +26 -0
  230. package/dist/components/blocks/document-editor/index.d.ts +1 -0
  231. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +41 -0
  232. package/dist/components/blocks/podcast-player/index.d.ts +1 -0
  233. package/dist/components/layout/sidebar/index.d.ts +2 -0
  234. package/dist/components/layout/sidebar/sidebar.d.ts +80 -0
  235. package/dist/components/layout/sidebar/use-sidebar.d.ts +22 -0
  236. package/dist/components/shared/layout-constants.d.ts +1 -1
  237. package/dist/components/ui/button/button.d.ts +1 -1
  238. package/dist/components/ui/chart/chart.d.ts +162 -5
  239. package/dist/components/ui/file-upload/file-upload.d.ts +2 -0
  240. package/dist/components/ui/file-upload/index.d.ts +1 -0
  241. package/dist/components/ui/file-upload/use-file-upload.d.ts +49 -0
  242. package/dist/components/ui/pagination/index.d.ts +2 -0
  243. package/dist/components/ui/pagination/use-pagination.d.ts +78 -0
  244. package/dist/components/ui/rich-text-editor/index.d.ts +2 -0
  245. package/dist/components/ui/rich-text-editor/use-rich-text-editor.d.ts +107 -0
  246. package/dist/components/ui/stepper/index.d.ts +3 -1
  247. package/dist/components/ui/stepper/stepper.d.ts +2 -2
  248. package/dist/components/ui/stepper/use-stepper.d.ts +60 -0
  249. package/dist/components/ui/tree-view/index.d.ts +4 -1
  250. package/dist/components/ui/tree-view/tree-view.d.ts +4 -6
  251. package/dist/components/ui/tree-view/use-tree-view.d.ts +60 -0
  252. package/dist/dropdown-menu-BDB5CmQs.cjs +247 -0
  253. package/dist/dropdown-menu-DQidbKBD.js +231 -0
  254. package/dist/google-maps-loader-BFWp6VPd.js +287 -0
  255. package/dist/{google-maps-loader-t2IlYBzw.js → google-maps-loader-CTYySAun.js} +4 -0
  256. package/dist/{google-maps-loader-BqsYL48U.cjs → google-maps-loader-Y-QkD-Li.cjs} +5 -0
  257. package/dist/google-maps-loader-eS3uQ5TA.cjs +287 -0
  258. package/dist/header-Cgy6vYPk.cjs +731 -0
  259. package/dist/header-DRlT4jgI.js +715 -0
  260. package/dist/header-Dux00SI4.cjs +731 -0
  261. package/dist/header-EkGKXPsD.js +715 -0
  262. package/dist/header-WfEywpyc.cjs +731 -0
  263. package/dist/header-tifNQn2U.js +715 -0
  264. package/dist/hooks.cjs.js +1 -1
  265. package/dist/hooks.es.js +1 -1
  266. package/dist/index-BhapVLVj.js +8 -0
  267. package/dist/{index-D3RLKRAs.cjs → index-COtD8bRW.cjs} +1 -1
  268. package/dist/index-D6fxYEY8.cjs +7 -0
  269. package/dist/index-DW5tYe26.js +8 -0
  270. package/dist/index.cjs.js +19 -8
  271. package/dist/index.es.js +39 -28
  272. package/dist/index.umd.js +1043 -470
  273. package/dist/input-2R4loU86.js +127 -0
  274. package/dist/input-DWANSKGb.cjs +145 -0
  275. package/dist/layout.cjs.js +89 -1
  276. package/dist/layout.es.js +90 -2
  277. package/dist/pages.cjs.js +1 -1
  278. package/dist/pages.es.js +1 -1
  279. package/dist/rich-text-editor-0mraWT5y.cjs +2376 -0
  280. package/dist/rich-text-editor-B6jMRLzk.cjs +1939 -0
  281. package/dist/rich-text-editor-B8_oYcIR.js +1730 -0
  282. package/dist/rich-text-editor-B9UbSXNb.js +1203 -0
  283. package/dist/rich-text-editor-BYuRBNBU.js +2373 -0
  284. package/dist/rich-text-editor-Bb9pySTs.cjs +2374 -0
  285. package/dist/rich-text-editor-BcL6L3cm.cjs +2374 -0
  286. package/dist/rich-text-editor-BoVZYtTs.cjs +2391 -0
  287. package/dist/rich-text-editor-CPV1lEPH.cjs +1748 -0
  288. package/dist/rich-text-editor-CoKqbCtu.cjs +1799 -0
  289. package/dist/rich-text-editor-Cw56T_mB.js +2356 -0
  290. package/dist/rich-text-editor-Cyt8qs2b.js +1921 -0
  291. package/dist/rich-text-editor-D6H84OcX.cjs +1220 -0
  292. package/dist/rich-text-editor-D76gD-QI.js +2328 -0
  293. package/dist/rich-text-editor-DKkokOnA.js +1781 -0
  294. package/dist/rich-text-editor-DNsdpN64.cjs +2359 -0
  295. package/dist/rich-text-editor-DfG8bCyY.js +2358 -0
  296. package/dist/rich-text-editor-DgF8s7xW.js +2949 -0
  297. package/dist/rich-text-editor-Dxjw31Z4.js +2341 -0
  298. package/dist/rich-text-editor-DzP0Epmb.js +2356 -0
  299. package/dist/rich-text-editor-mWoaSCE4.cjs +2966 -0
  300. package/dist/rich-text-editor-skplNlBM.cjs +2345 -0
  301. package/dist/select-Bkbr0f-Z.cjs +162 -0
  302. package/dist/select-CvIVdX2n.js +145 -0
  303. package/dist/sidebar-CK_0ZQHj.cjs +803 -0
  304. package/dist/sidebar-CUuOvYhK.js +787 -0
  305. package/dist/slider-Bc5Hd0y1.js +56 -0
  306. package/dist/slider-N7hFFj6X.cjs +73 -0
  307. package/dist/tooltip-Ded96neP.cjs +137 -0
  308. package/dist/tooltip-HDOoD2-0.js +120 -0
  309. package/dist/ui.cjs.js +14 -4
  310. package/dist/ui.es.js +26 -16
  311. package/dist/use-mobile-B0hNy_Y6.cjs +4303 -0
  312. package/dist/use-mobile-BXuYROXM.js +4202 -0
  313. package/dist/use-mobile-Bbd51ASU.cjs +4392 -0
  314. package/dist/use-mobile-Bk6CX-TC.js +4359 -0
  315. package/dist/use-mobile-BvYdisLP.js +4202 -0
  316. package/dist/use-mobile-BzuxjzNX.cjs +4392 -0
  317. package/dist/use-mobile-CG2-SdXV.cjs +4235 -0
  318. package/dist/use-mobile-CKb5pqTs.js +4269 -0
  319. package/dist/use-mobile-CYuAuGDl.js +4202 -0
  320. package/dist/use-mobile-CaENcqm-.js +4508 -0
  321. package/dist/use-mobile-CbrYgJGJ.js +4203 -0
  322. package/dist/use-mobile-DMOvImGQ.cjs +4542 -0
  323. package/dist/use-mobile-DRB3BQgD.cjs +4235 -0
  324. package/dist/use-mobile-DZvv7QMR.js +4359 -0
  325. package/dist/use-mobile-DdI_TXam.cjs +4235 -0
  326. package/dist/use-mobile-DlceKf8a.js +4359 -0
  327. package/dist/use-mobile-DsOnow1o.cjs +4236 -0
  328. package/dist/use-mobile-Kcj6jSnK.cjs +4392 -0
  329. package/dist/use-mobile-bnKcua_i.js +4202 -0
  330. package/dist/use-mobile-ncXBeE2z.cjs +4235 -0
  331. package/dist/{xertica-assistant-B1IaHXnB.cjs → xertica-assistant-dyP7KHM5.cjs} +533 -392
  332. package/dist/{xertica-assistant-DPsESB6t.js → xertica-assistant-yX1CFBBo.js} +535 -394
  333. package/dist/xertica-ui.css +2 -2
  334. package/docs/ai-usage.md +28 -10
  335. package/docs/architecture.md +76 -0
  336. package/docs/components/assistant.md +159 -0
  337. package/docs/components/calendar.md +154 -154
  338. package/docs/components/card-patterns.md +337 -337
  339. package/docs/components/card.md +235 -235
  340. package/docs/components/chart.md +354 -39
  341. package/docs/components/file-upload.md +119 -2
  342. package/docs/components/map.md +84 -84
  343. package/docs/components/pagination.md +187 -0
  344. package/docs/components/rich-text-editor.md +164 -0
  345. package/docs/components/sidebar.md +153 -4
  346. package/docs/components/stepper.md +157 -12
  347. package/docs/components/tree-view.md +164 -6
  348. package/docs/components/xertica-provider.md +24 -24
  349. package/docs/decision-tree.md +287 -287
  350. package/docs/getting-started.md +1 -1
  351. package/docs/guidelines.md +14 -8
  352. package/docs/layout.md +2 -2
  353. package/docs/llms.md +4 -4
  354. package/guidelines/Guidelines.md +252 -250
  355. package/hooks/useTheme.ts +3 -3
  356. package/imports/Podcast.tsx +388 -388
  357. package/imports/XerticaAi.tsx +45 -45
  358. package/imports/XerticaX.tsx +19 -19
  359. package/imports/svg-aueiaqngck.ts +11 -11
  360. package/imports/svg-v9krss1ozd.ts +16 -16
  361. package/imports/svg-vhrdofe3qe.ts +5 -5
  362. package/llms-compact.txt +327 -327
  363. package/llms.txt +160 -160
  364. package/package.json +203 -203
  365. package/styles/xertica/app-overrides/chat.css +61 -61
  366. package/styles/xertica/app-overrides/scrollbar.css +33 -33
  367. package/styles/xertica/integrations/google-maps.css +76 -76
  368. package/styles/xertica/integrations/sonner.css +73 -73
  369. package/styles/xertica/tokens.css +41 -12
  370. package/templates/CLAUDE.md +182 -172
  371. package/templates/guidelines/Guidelines.md +325 -313
  372. package/templates/package.json +3 -3
  373. package/templates/src/features/auth/index.ts +4 -4
  374. package/templates/src/features/auth/ui/AuthPageShell.tsx +34 -34
  375. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  376. package/templates/src/features/auth/ui/LoginContent.tsx +90 -90
  377. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +151 -151
  378. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +59 -59
  379. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +82 -82
  380. package/templates/src/features/home/index.ts +1 -1
  381. package/templates/src/features/home/ui/HomeContent.tsx +100 -100
  382. package/templates/src/features/template/index.ts +5 -5
  383. package/templates/src/features/template/ui/CrudTemplate.tsx +3 -3
  384. package/templates/src/features/template/ui/DashboardTemplate.tsx +3 -3
  385. package/templates/src/features/template/ui/FormTemplate.tsx +120 -120
  386. package/templates/src/features/template/ui/LoginTemplate.tsx +3 -3
  387. package/templates/src/pages/AssistantPage.tsx +328 -328
  388. package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
  389. package/templates/src/pages/HomePage.tsx +57 -57
  390. package/templates/src/pages/LoginPage.tsx +10 -10
  391. package/templates/src/pages/ResetPasswordPage.tsx +6 -6
  392. package/templates/src/pages/TemplatePage.tsx +30 -30
  393. package/templates/src/pages/VerifyEmailPage.tsx +6 -6
  394. package/templates/src/shared/config/navigation.ts +20 -20
  395. package/templates/src/shared/lib/auth.ts +20 -20
  396. package/templates/src/shared/types/auth.ts +3 -3
  397. package/templates/src/styles/xertica/tokens.css +39 -10
  398. package/templates/tsconfig.json +5 -5
  399. package/utils/gemini.ts +140 -140
  400. package/dist/VerifyEmailPage-Bae2cBXT.cjs +0 -2827
  401. package/dist/VerifyEmailPage-CbgjOF0v.js +0 -2828
  402. package/dist/index-CkTUgOwX.js +0 -8
package/llms-compact.txt CHANGED
@@ -1,327 +1,327 @@
1
- # Xertica UI — Compact Reference
2
-
3
- > 97-component React design system. Tailwind CSS v4 + Radix UI + Lucide Icons.
4
- > Full docs: llms-full.txt | Component index: llms.txt | Decision guide: docs/decision-tree.md
5
-
6
- ---
7
-
8
- ## CRITICAL RULES
9
-
10
- ```
11
- NEVER raw <button>/<input>/<select> → use <Button>/<Input>/<Select>
12
- NEVER raw colors bg-blue-500 → use bg-primary, bg-muted, bg-destructive
13
- NEVER hardcoded radius rounded-lg → use rounded-[var(--radius)]
14
- NEVER <h1>/<h2> for page headers → use <PageHeader><PageHeaderHeading>
15
- NEVER manage sidebar state locally → use useLayout() from xertica-ui/hooks
16
- NEVER render <Toaster> manually → auto-injected by XerticaProvider
17
- NEVER icons from xertica-ui → use lucide-react exclusively
18
- ALWAYS wrap full apps in <XerticaProvider> → shared theme, toasts, tooltips, layout
19
- ALWAYS import style.css at root → import 'xertica-ui/style.css'
20
- ALWAYS confirm destructive actions → pair with <AlertDialog> before executing
21
- ```
22
-
23
- ---
24
-
25
- ## IMPORTS
26
-
27
- ```tsx
28
- import { Button, Card, Input, Badge, Table,
29
- Dialog, AlertDialog, Select, Checkbox,
30
- Tabs, Sheet, Popover, Tooltip, Toast,
31
- PageHeader, PageHeaderHeading,
32
- Progress, Skeleton, Empty, ScrollArea,
33
- Separator, Form, Label, Textarea } from 'xertica-ui/ui';
34
-
35
- import { Sidebar, Header } from 'xertica-ui/layout';
36
- import { XerticaProvider, XerticaLogo,
37
- ThemeToggle, LanguageSelector } from 'xertica-ui/brand';
38
- import { XerticaAssistant,
39
- generateDemoResponse } from 'xertica-ui/assistant';
40
- import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
41
- import { useLayout, useTheme } from 'xertica-ui/hooks';
42
- import 'xertica-ui/style.css'; // once, at root only
43
- ```
44
-
45
- ---
46
-
47
- ## DESIGN TOKENS (always use these, never raw colors)
48
-
49
- ```
50
- bg-background / text-foreground page bg + body text
51
- bg-card / text-card-foreground card surface
52
- bg-muted / text-muted-foreground subdued bg + secondary text
53
- bg-primary / text-primary-foreground brand primary
54
- bg-destructive danger/error
55
- bg-accent / text-accent-foreground hover states
56
- bg-success / bg-info / bg-warning semantic states
57
- border-border standard borders
58
- border-input form borders
59
- ```
60
-
61
- ---
62
-
63
- ## APP STRUCTURE
64
-
65
- ```tsx
66
- // main.tsx
67
- import { XerticaProvider } from 'xertica-ui/brand';
68
- import { BrowserRouter } from 'react-router-dom';
69
- import 'xertica-ui/style.css';
70
-
71
- ReactDOM.createRoot(document.getElementById('root')!).render(
72
- <XerticaProvider>
73
- <BrowserRouter><App /></BrowserRouter>
74
- </XerticaProvider>
75
- );
76
- ```
77
-
78
- ---
79
-
80
- ## PAGE STRUCTURE (every page must follow this)
81
-
82
- ```tsx
83
- import { PageHeader, PageHeaderHeading, Button } from 'xertica-ui/ui';
84
-
85
- export function MyPage() {
86
- return (
87
- <>
88
- <PageHeader>
89
- <PageHeaderHeading>Title</PageHeaderHeading>
90
- <Button>Primary Action</Button>
91
- </PageHeader>
92
- <div className="p-6 space-y-6">{/* content */}</div>
93
- </>
94
- );
95
- }
96
- ```
97
-
98
- ---
99
-
100
- ## LAYOUT SYSTEM
101
-
102
- ```tsx
103
- import { useLayout } from 'xertica-ui/hooks';
104
-
105
- const { sidebarExpanded, sidebarWidth, toggleSidebar,
106
- assistenteExpanded, toggleAssistente } = useLayout();
107
-
108
- // Content container must offset for sidebar:
109
- <div style={{ paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : '80px' }}>
110
- ```
111
-
112
- ---
113
-
114
- ## MOST-USED COMPONENTS
115
-
116
- ### Button — 9 variants
117
- ```tsx
118
- <Button variant="default">Save</Button>
119
- <Button variant="destructive">Delete</Button> // always pair with AlertDialog
120
- <Button variant="outline">Cancel</Button>
121
- <Button variant="ghost" size="icon" aria-label="Settings"><Settings /></Button>
122
- <Button asChild><Link to="/page">Go</Link></Button> // router navigation
123
- ```
124
-
125
- ### Card
126
- ```tsx
127
- <Card>
128
- <CardHeader><CardTitle>Title</CardTitle></CardHeader>
129
- <CardContent>Content</CardContent>
130
- <CardFooter><Button>Action</Button></CardFooter>
131
- </Card>
132
- ```
133
-
134
- ### Input + Label (form field)
135
- ```tsx
136
- <div className="space-y-2">
137
- <Label htmlFor="email">Email</Label>
138
- <Input id="email" type="email" placeholder="you@company.com" />
139
- </div>
140
- ```
141
-
142
- ### Dialog
143
- ```tsx
144
- <Dialog>
145
- <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
146
- <DialogContent>
147
- <DialogHeader><DialogTitle>Title</DialogTitle></DialogHeader>
148
- <DialogBody>Content</DialogBody> {/* scrollable */}
149
- <DialogFooter><Button type="submit">Save</Button></DialogFooter>
150
- </DialogContent>
151
- </Dialog>
152
- ```
153
-
154
- ### AlertDialog (destructive confirmation)
155
- ```tsx
156
- <AlertDialog>
157
- <AlertDialogTrigger asChild>
158
- <Button variant="destructive">Delete</Button>
159
- </AlertDialogTrigger>
160
- <AlertDialogContent>
161
- <AlertDialogHeader>
162
- <AlertDialogTitle>Are you sure?</AlertDialogTitle>
163
- <AlertDialogDescription>This action cannot be undone.</AlertDialogDescription>
164
- </AlertDialogHeader>
165
- <AlertDialogFooter>
166
- <AlertDialogCancel>Cancel</AlertDialogCancel>
167
- <AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>
168
- </AlertDialogFooter>
169
- </AlertDialogContent>
170
- </AlertDialog>
171
- ```
172
-
173
- ### Table (CRUD list)
174
- ```tsx
175
- <Table>
176
- <TableHeader>
177
- <TableRow><TableHead>Name</TableHead><TableHead>Status</TableHead></TableRow>
178
- </TableHeader>
179
- <TableBody>
180
- {items.map(item => (
181
- <TableRow key={item.id}>
182
- <TableCell>{item.name}</TableCell>
183
- <TableCell><Badge variant="success">{item.status}</Badge></TableCell>
184
- </TableRow>
185
- ))}
186
- </TableBody>
187
- </Table>
188
- ```
189
-
190
- ### Toast (via sonner)
191
- ```tsx
192
- import { toast } from 'sonner';
193
-
194
- toast.success('Saved!');
195
- toast.error('Failed to save');
196
- toast.info('Processing...');
197
- // Never render <Toaster> — auto-injected by XerticaProvider
198
- ```
199
-
200
- ### Select
201
- ```tsx
202
- <Select onValueChange={setValue}>
203
- <SelectTrigger><SelectValue placeholder="Choose..." /></SelectTrigger>
204
- <SelectContent>
205
- <SelectItem value="a">Option A</SelectItem>
206
- <SelectItem value="b">Option B</SelectItem>
207
- </SelectContent>
208
- </Select>
209
- ```
210
-
211
- ### Sidebar
212
- ```tsx
213
- import { Sidebar } from 'xertica-ui/layout';
214
- import { useLayout } from 'xertica-ui/hooks';
215
- import { useNavigate, useLocation } from 'react-router-dom';
216
-
217
- function AppSidebar({ user, onLogout }) {
218
- const { sidebarExpanded, sidebarWidth, toggleSidebar } = useLayout();
219
- return (
220
- <Sidebar
221
- expanded={sidebarExpanded}
222
- onToggle={toggleSidebar}
223
- width={sidebarWidth}
224
- navigate={useNavigate()}
225
- location={useLocation()}
226
- routes={[
227
- { path: '/home', label: 'Home', icon: Home },
228
- { path: '/settings', label: 'Settings', icon: Settings },
229
- ]}
230
- user={user}
231
- onLogout={onLogout}
232
- />
233
- );
234
- }
235
- ```
236
-
237
- ### Header
238
- ```tsx
239
- import { Header } from 'xertica-ui/layout';
240
-
241
- <Header
242
- breadcrumbs={[{ label: 'Home', href: '/home' }, { label: 'Settings' }]}
243
- user={user}
244
- onLogout={onLogout}
245
- />
246
- ```
247
-
248
- ### Empty state
249
- ```tsx
250
- <Empty>
251
- <EmptyIcon><FileX className="size-12 text-muted-foreground" /></EmptyIcon>
252
- <EmptyTitle>No results</EmptyTitle>
253
- <EmptyDescription>Try adjusting your filters.</EmptyDescription>
254
- <EmptyAction><Button>Clear filters</Button></EmptyAction>
255
- </Empty>
256
- ```
257
-
258
- ### StatsCard (dashboard KPI)
259
- ```tsx
260
- <StatsCard
261
- title="Total Users"
262
- value="12,430"
263
- trend={8.2}
264
- icon={<Users className="size-4" />}
265
- />
266
- ```
267
-
268
- ---
269
-
270
- ## QUICK COMPONENT SELECTION
271
-
272
- | Need | Use |
273
- |---|---|
274
- | User must confirm before proceeding | `AlertDialog` |
275
- | Form or detail view in overlay | `Dialog` |
276
- | Wide form from the side | `Sheet` |
277
- | Mobile overlay from bottom | `Drawer` |
278
- | Anchored interactive panel | `Popover` |
279
- | Short hover hint | `Tooltip` |
280
- | Rich hover preview | `HoverCard` |
281
- | Ephemeral message | `toast()` (sonner) |
282
- | Persistent inline message | `Alert` |
283
- | Loading state | `Skeleton` |
284
- | No data | `Empty` |
285
- | Multi-step flow | `Stepper` |
286
- | Tab switching | `Tabs` |
287
- | Collapsible FAQ/list | `Accordion` |
288
- | Single expandable | `Collapsible` |
289
- | Date input | `Calendar` + `Popover` |
290
- | Numeric range | `Slider` |
291
- | One of many options | `RadioGroup` or `Select` |
292
- | On/off setting | `Switch` |
293
- | Multi-select list | `Checkbox` group |
294
- | Search/filter | `Search` or `Command` |
295
- | Row actions | `DropdownMenu` |
296
- | Right-click actions | `ContextMenu` |
297
-
298
- ---
299
-
300
- ## FORM PATTERN (react-hook-form + zod)
301
-
302
- ```tsx
303
- import { useForm } from 'react-hook-form';
304
- import { zodResolver } from '@hookform/resolvers/zod';
305
- import { z } from 'zod';
306
- import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from 'xertica-ui/ui';
307
-
308
- const schema = z.object({ name: z.string().min(2) });
309
-
310
- function MyForm() {
311
- const form = useForm({ resolver: zodResolver(schema) });
312
- return (
313
- <Form {...form}>
314
- <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
315
- <FormField control={form.control} name="name" render={({ field }) => (
316
- <FormItem>
317
- <FormLabel>Name</FormLabel>
318
- <FormControl><Input {...field} /></FormControl>
319
- <FormMessage />
320
- </FormItem>
321
- )} />
322
- <Button type="submit">Submit</Button>
323
- </form>
324
- </Form>
325
- );
326
- }
327
- ```
1
+ # Xertica UI — Compact Reference
2
+
3
+ > 97-component React design system. Tailwind CSS v4 + Radix UI + Lucide Icons.
4
+ > Full docs: llms-full.txt | Component index: llms.txt | Decision guide: docs/decision-tree.md
5
+
6
+ ---
7
+
8
+ ## CRITICAL RULES
9
+
10
+ ```
11
+ NEVER raw <button>/<input>/<select> → use <Button>/<Input>/<Select>
12
+ NEVER raw colors bg-blue-500 → use bg-primary, bg-muted, bg-destructive
13
+ NEVER hardcoded radius rounded-lg → use rounded-[var(--radius)]
14
+ NEVER <h1>/<h2> for page headers → use <PageHeader><PageHeaderHeading>
15
+ NEVER manage sidebar state locally → use useLayout() from xertica-ui/hooks
16
+ NEVER render <Toaster> manually → auto-injected by XerticaProvider
17
+ NEVER icons from xertica-ui → use lucide-react exclusively
18
+ ALWAYS wrap full apps in <XerticaProvider> → shared theme, toasts, tooltips, layout
19
+ ALWAYS import style.css at root → import 'xertica-ui/style.css'
20
+ ALWAYS confirm destructive actions → pair with <AlertDialog> before executing
21
+ ```
22
+
23
+ ---
24
+
25
+ ## IMPORTS
26
+
27
+ ```tsx
28
+ import { Button, Card, Input, Badge, Table,
29
+ Dialog, AlertDialog, Select, Checkbox,
30
+ Tabs, Sheet, Popover, Tooltip, Toast,
31
+ PageHeader, PageHeaderHeading,
32
+ Progress, Skeleton, Empty, ScrollArea,
33
+ Separator, Form, Label, Textarea } from 'xertica-ui/ui';
34
+
35
+ import { Sidebar, Header } from 'xertica-ui/layout';
36
+ import { XerticaProvider, XerticaLogo,
37
+ ThemeToggle, LanguageSelector } from 'xertica-ui/brand';
38
+ import { XerticaAssistant,
39
+ generateDemoResponse } from 'xertica-ui/assistant';
40
+ import { VideoPlayer, AudioPlayer } from 'xertica-ui/media';
41
+ import { useLayout, useTheme } from 'xertica-ui/hooks';
42
+ import 'xertica-ui/style.css'; // once, at root only
43
+ ```
44
+
45
+ ---
46
+
47
+ ## DESIGN TOKENS (always use these, never raw colors)
48
+
49
+ ```
50
+ bg-background / text-foreground page bg + body text
51
+ bg-card / text-card-foreground card surface
52
+ bg-muted / text-muted-foreground subdued bg + secondary text
53
+ bg-primary / text-primary-foreground brand primary
54
+ bg-destructive danger/error
55
+ bg-accent / text-accent-foreground hover states
56
+ bg-success / bg-info / bg-warning semantic states
57
+ border-border standard borders
58
+ border-input form borders
59
+ ```
60
+
61
+ ---
62
+
63
+ ## APP STRUCTURE
64
+
65
+ ```tsx
66
+ // main.tsx
67
+ import { XerticaProvider } from 'xertica-ui/brand';
68
+ import { BrowserRouter } from 'react-router-dom';
69
+ import 'xertica-ui/style.css';
70
+
71
+ ReactDOM.createRoot(document.getElementById('root')!).render(
72
+ <XerticaProvider>
73
+ <BrowserRouter><App /></BrowserRouter>
74
+ </XerticaProvider>
75
+ );
76
+ ```
77
+
78
+ ---
79
+
80
+ ## PAGE STRUCTURE (every page must follow this)
81
+
82
+ ```tsx
83
+ import { PageHeader, PageHeaderHeading, Button } from 'xertica-ui/ui';
84
+
85
+ export function MyPage() {
86
+ return (
87
+ <>
88
+ <PageHeader>
89
+ <PageHeaderHeading>Title</PageHeaderHeading>
90
+ <Button>Primary Action</Button>
91
+ </PageHeader>
92
+ <div className="p-6 space-y-6">{/* content */}</div>
93
+ </>
94
+ );
95
+ }
96
+ ```
97
+
98
+ ---
99
+
100
+ ## LAYOUT SYSTEM
101
+
102
+ ```tsx
103
+ import { useLayout } from 'xertica-ui/hooks';
104
+
105
+ const { sidebarExpanded, sidebarWidth, toggleSidebar,
106
+ assistenteExpanded, toggleAssistente } = useLayout();
107
+
108
+ // Content container must offset for sidebar:
109
+ <div style={{ paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : '80px' }}>
110
+ ```
111
+
112
+ ---
113
+
114
+ ## MOST-USED COMPONENTS
115
+
116
+ ### Button — 9 variants
117
+ ```tsx
118
+ <Button variant="default">Save</Button>
119
+ <Button variant="destructive">Delete</Button> // always pair with AlertDialog
120
+ <Button variant="outline">Cancel</Button>
121
+ <Button variant="ghost" size="icon" aria-label="Settings"><Settings /></Button>
122
+ <Button asChild><Link to="/page">Go</Link></Button> // router navigation
123
+ ```
124
+
125
+ ### Card
126
+ ```tsx
127
+ <Card>
128
+ <CardHeader><CardTitle>Title</CardTitle></CardHeader>
129
+ <CardContent>Content</CardContent>
130
+ <CardFooter><Button>Action</Button></CardFooter>
131
+ </Card>
132
+ ```
133
+
134
+ ### Input + Label (form field)
135
+ ```tsx
136
+ <div className="space-y-2">
137
+ <Label htmlFor="email">Email</Label>
138
+ <Input id="email" type="email" placeholder="you@company.com" />
139
+ </div>
140
+ ```
141
+
142
+ ### Dialog
143
+ ```tsx
144
+ <Dialog>
145
+ <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
146
+ <DialogContent>
147
+ <DialogHeader><DialogTitle>Title</DialogTitle></DialogHeader>
148
+ <DialogBody>Content</DialogBody> {/* scrollable */}
149
+ <DialogFooter><Button type="submit">Save</Button></DialogFooter>
150
+ </DialogContent>
151
+ </Dialog>
152
+ ```
153
+
154
+ ### AlertDialog (destructive confirmation)
155
+ ```tsx
156
+ <AlertDialog>
157
+ <AlertDialogTrigger asChild>
158
+ <Button variant="destructive">Delete</Button>
159
+ </AlertDialogTrigger>
160
+ <AlertDialogContent>
161
+ <AlertDialogHeader>
162
+ <AlertDialogTitle>Are you sure?</AlertDialogTitle>
163
+ <AlertDialogDescription>This action cannot be undone.</AlertDialogDescription>
164
+ </AlertDialogHeader>
165
+ <AlertDialogFooter>
166
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
167
+ <AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>
168
+ </AlertDialogFooter>
169
+ </AlertDialogContent>
170
+ </AlertDialog>
171
+ ```
172
+
173
+ ### Table (CRUD list)
174
+ ```tsx
175
+ <Table>
176
+ <TableHeader>
177
+ <TableRow><TableHead>Name</TableHead><TableHead>Status</TableHead></TableRow>
178
+ </TableHeader>
179
+ <TableBody>
180
+ {items.map(item => (
181
+ <TableRow key={item.id}>
182
+ <TableCell>{item.name}</TableCell>
183
+ <TableCell><Badge variant="success">{item.status}</Badge></TableCell>
184
+ </TableRow>
185
+ ))}
186
+ </TableBody>
187
+ </Table>
188
+ ```
189
+
190
+ ### Toast (via sonner)
191
+ ```tsx
192
+ import { toast } from 'sonner';
193
+
194
+ toast.success('Saved!');
195
+ toast.error('Failed to save');
196
+ toast.info('Processing...');
197
+ // Never render <Toaster> — auto-injected by XerticaProvider
198
+ ```
199
+
200
+ ### Select
201
+ ```tsx
202
+ <Select onValueChange={setValue}>
203
+ <SelectTrigger><SelectValue placeholder="Choose..." /></SelectTrigger>
204
+ <SelectContent>
205
+ <SelectItem value="a">Option A</SelectItem>
206
+ <SelectItem value="b">Option B</SelectItem>
207
+ </SelectContent>
208
+ </Select>
209
+ ```
210
+
211
+ ### Sidebar
212
+ ```tsx
213
+ import { Sidebar } from 'xertica-ui/layout';
214
+ import { useLayout } from 'xertica-ui/hooks';
215
+ import { useNavigate, useLocation } from 'react-router-dom';
216
+
217
+ function AppSidebar({ user, onLogout }) {
218
+ const { sidebarExpanded, sidebarWidth, toggleSidebar } = useLayout();
219
+ return (
220
+ <Sidebar
221
+ expanded={sidebarExpanded}
222
+ onToggle={toggleSidebar}
223
+ width={sidebarWidth}
224
+ navigate={useNavigate()}
225
+ location={useLocation()}
226
+ routes={[
227
+ { path: '/home', label: 'Home', icon: Home },
228
+ { path: '/settings', label: 'Settings', icon: Settings },
229
+ ]}
230
+ user={user}
231
+ onLogout={onLogout}
232
+ />
233
+ );
234
+ }
235
+ ```
236
+
237
+ ### Header
238
+ ```tsx
239
+ import { Header } from 'xertica-ui/layout';
240
+
241
+ <Header
242
+ breadcrumbs={[{ label: 'Home', href: '/home' }, { label: 'Settings' }]}
243
+ user={user}
244
+ onLogout={onLogout}
245
+ />
246
+ ```
247
+
248
+ ### Empty state
249
+ ```tsx
250
+ <Empty>
251
+ <EmptyIcon><FileX className="size-12 text-muted-foreground" /></EmptyIcon>
252
+ <EmptyTitle>No results</EmptyTitle>
253
+ <EmptyDescription>Try adjusting your filters.</EmptyDescription>
254
+ <EmptyAction><Button>Clear filters</Button></EmptyAction>
255
+ </Empty>
256
+ ```
257
+
258
+ ### StatsCard (dashboard KPI)
259
+ ```tsx
260
+ <StatsCard
261
+ title="Total Users"
262
+ value="12,430"
263
+ trend={8.2}
264
+ icon={<Users className="size-4" />}
265
+ />
266
+ ```
267
+
268
+ ---
269
+
270
+ ## QUICK COMPONENT SELECTION
271
+
272
+ | Need | Use |
273
+ |---|---|
274
+ | User must confirm before proceeding | `AlertDialog` |
275
+ | Form or detail view in overlay | `Dialog` |
276
+ | Wide form from the side | `Sheet` |
277
+ | Mobile overlay from bottom | `Drawer` |
278
+ | Anchored interactive panel | `Popover` |
279
+ | Short hover hint | `Tooltip` |
280
+ | Rich hover preview | `HoverCard` |
281
+ | Ephemeral message | `toast()` (sonner) |
282
+ | Persistent inline message | `Alert` |
283
+ | Loading state | `Skeleton` |
284
+ | No data | `Empty` |
285
+ | Multi-step flow | `Stepper` |
286
+ | Tab switching | `Tabs` |
287
+ | Collapsible FAQ/list | `Accordion` |
288
+ | Single expandable | `Collapsible` |
289
+ | Date input | `Calendar` + `Popover` |
290
+ | Numeric range | `Slider` |
291
+ | One of many options | `RadioGroup` or `Select` |
292
+ | On/off setting | `Switch` |
293
+ | Multi-select list | `Checkbox` group |
294
+ | Search/filter | `Search` or `Command` |
295
+ | Row actions | `DropdownMenu` |
296
+ | Right-click actions | `ContextMenu` |
297
+
298
+ ---
299
+
300
+ ## FORM PATTERN (react-hook-form + zod)
301
+
302
+ ```tsx
303
+ import { useForm } from 'react-hook-form';
304
+ import { zodResolver } from '@hookform/resolvers/zod';
305
+ import { z } from 'zod';
306
+ import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from 'xertica-ui/ui';
307
+
308
+ const schema = z.object({ name: z.string().min(2) });
309
+
310
+ function MyForm() {
311
+ const form = useForm({ resolver: zodResolver(schema) });
312
+ return (
313
+ <Form {...form}>
314
+ <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
315
+ <FormField control={form.control} name="name" render={({ field }) => (
316
+ <FormItem>
317
+ <FormLabel>Name</FormLabel>
318
+ <FormControl><Input {...field} /></FormControl>
319
+ <FormMessage />
320
+ </FormItem>
321
+ )} />
322
+ <Button type="submit">Submit</Button>
323
+ </form>
324
+ </Form>
325
+ );
326
+ }
327
+ ```