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
@@ -34,6 +34,8 @@ export type ChartPeriod = {
34
34
  label: string;
35
35
  };
36
36
  export type ChartBarSize = "sm" | "md" | "lg" | "xl" | number;
37
+ /** Curve interpolation type for line and area charts */
38
+ export type ChartCurveType = "monotone" | "linear" | "step" | "stepBefore" | "stepAfter" | "natural" | "basis";
37
39
  type ChartValueFormatter = (value: number | string) => string;
38
40
  export type ChartErrorState = boolean | string | Error | React.ReactNode;
39
41
  export type ChartStateProps = {
@@ -113,9 +115,11 @@ export interface DashboardLineChartProps extends Omit<React.ComponentProps<typeo
113
115
  showDots?: boolean;
114
116
  showGrid?: boolean;
115
117
  showLegend?: boolean;
118
+ curveType?: ChartCurveType;
119
+ strokeWidth?: number;
116
120
  valueFormatter?: ChartValueFormatter;
117
121
  }
118
- declare function DashboardLineChart({ data, config, indexKey, series, colors, showDots, showGrid, showLegend, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: DashboardLineChartProps): import("react/jsx-runtime").JSX.Element;
122
+ declare function DashboardLineChart({ data, config, indexKey, series, colors, showDots, showGrid, showLegend, curveType, strokeWidth, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: DashboardLineChartProps): import("react/jsx-runtime").JSX.Element;
119
123
  export interface HorizontalBarChartProps extends Omit<React.ComponentProps<typeof ChartContainer>, "children">, ChartStateProps {
120
124
  data: DashboardChartDatum[];
121
125
  indexKey?: string;
@@ -140,9 +144,13 @@ export interface InteractiveTimeSeriesChartProps extends Omit<React.ComponentPro
140
144
  filterData?: (data: DashboardChartDatum[], period: string) => DashboardChartDatum[];
141
145
  showGrid?: boolean;
142
146
  showLegend?: boolean;
147
+ showDots?: boolean;
148
+ gradientFill?: boolean;
149
+ curveType?: ChartCurveType;
150
+ strokeWidth?: number;
143
151
  valueFormatter?: ChartValueFormatter;
144
152
  }
145
- declare function InteractiveTimeSeriesChart({ data, config, indexKey, series, colors, periods, defaultPeriod, defaultSeries, filterData, showGrid, showLegend, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: InteractiveTimeSeriesChartProps): import("react/jsx-runtime").JSX.Element;
153
+ declare function InteractiveTimeSeriesChart({ data, config, indexKey, series, colors, periods, defaultPeriod, defaultSeries, filterData, showGrid, showLegend, showDots, gradientFill, curveType, strokeWidth, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: InteractiveTimeSeriesChartProps): import("react/jsx-runtime").JSX.Element;
146
154
  export interface ComboMetricChartProps extends Omit<React.ComponentProps<typeof ChartContainer>, "children">, ChartStateProps {
147
155
  data: DashboardChartDatum[];
148
156
  indexKey?: string;
@@ -151,9 +159,11 @@ export interface ComboMetricChartProps extends Omit<React.ComponentProps<typeof
151
159
  barSize?: ChartBarSize;
152
160
  showGrid?: boolean;
153
161
  showLegend?: boolean;
162
+ gradientFill?: boolean;
163
+ curveType?: ChartCurveType;
154
164
  valueFormatter?: ChartValueFormatter;
155
165
  }
156
- declare function ComboMetricChart({ data, config, indexKey, series, colors, barSize, showGrid, showLegend, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: ComboMetricChartProps): import("react/jsx-runtime").JSX.Element;
166
+ declare function ComboMetricChart({ data, config, indexKey, series, colors, barSize, showGrid, showLegend, gradientFill, curveType, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: ComboMetricChartProps): import("react/jsx-runtime").JSX.Element;
157
167
  export interface DonutBreakdownChartProps extends Omit<React.ComponentProps<typeof ChartContainer>, "children">, ChartStateProps {
158
168
  data: DashboardChartDatum[];
159
169
  nameKey?: string;
@@ -162,6 +172,153 @@ export interface DonutBreakdownChartProps extends Omit<React.ComponentProps<type
162
172
  centerLabel?: React.ReactNode;
163
173
  centerValue?: React.ReactNode;
164
174
  showLegend?: boolean;
175
+ /** Inner radius as percentage string (e.g. "58%") or number */
176
+ innerRadius?: string | number;
177
+ /** Outer radius as percentage string (e.g. "82%") or number */
178
+ outerRadius?: string | number;
179
+ }
180
+ declare function DonutBreakdownChart({ data, config, nameKey, valueKey, colors, centerLabel, centerValue, showLegend, innerRadius, outerRadius, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: DonutBreakdownChartProps): import("react/jsx-runtime").JSX.Element;
181
+ export interface SparklineChartProps {
182
+ /** Data array — each item must have the `dataKey` field */
183
+ data: DashboardChartDatum[];
184
+ /** Key to plot on the Y axis */
185
+ dataKey: string;
186
+ /** Color for the line/area — defaults to `var(--chart-1)` */
187
+ color?: string;
188
+ /** Show filled area under the line */
189
+ filled?: boolean;
190
+ /** Show the last data point as a dot */
191
+ showEndDot?: boolean;
192
+ /** Curve interpolation type */
193
+ curveType?: ChartCurveType;
194
+ /** Stroke width */
195
+ strokeWidth?: number;
196
+ className?: string;
197
+ }
198
+ /**
199
+ * Minimal inline sparkline chart — no axes, no grid, no tooltip.
200
+ * Ideal for embedding inside stat cards or table cells.
201
+ *
202
+ * @ai-rules
203
+ * - Use `filled` for area-style sparklines.
204
+ * - Keep `className` height small (e.g. `h-12` or `h-16`).
205
+ * - Do NOT wrap in `ChartCard` — it is designed to be inline.
206
+ */
207
+ declare function SparklineChart({ data, dataKey, color, filled, showEndDot, curveType, strokeWidth, className, }: SparklineChartProps): import("react/jsx-runtime").JSX.Element;
208
+ export interface RadarMetricChartProps extends ChartStateProps {
209
+ /** Data array — each item is one axis point on the radar */
210
+ data: DashboardChartDatum[];
211
+ /** Key in each datum used as the axis label */
212
+ labelKey: string;
213
+ /**
214
+ * Series to render. Each entry maps to one `<Radar>` element.
215
+ * Use a single entry for a simple radar, multiple for comparison.
216
+ */
217
+ series: DashboardChartSeries[];
218
+ /** Override colors per series key or as an ordered array */
219
+ colors?: DashboardChartColors;
220
+ /** Fill the radar polygon (default: true) */
221
+ filled?: boolean;
222
+ /** Fill opacity when `filled` is true (default: 0.25) */
223
+ fillOpacity?: number;
224
+ /** Show dots on each axis point (default: false) */
225
+ showDots?: boolean;
226
+ /** Show the polar grid lines (default: true) */
227
+ showGrid?: boolean;
228
+ /** Show the legend (default: true when multiple series) */
229
+ showLegend?: boolean;
230
+ /** Format axis tick values */
231
+ valueFormatter?: ChartValueFormatter;
232
+ className?: string;
233
+ }
234
+ declare function RadarMetricChart({ data, labelKey, series, colors, filled, fillOpacity, showDots, showGrid, showLegend, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, }: RadarMetricChartProps): import("react/jsx-runtime").JSX.Element;
235
+ export interface PieMetricChartProps extends ChartStateProps {
236
+ /** Data array — each item is one slice */
237
+ data: DashboardChartDatum[];
238
+ /** Key in each datum used as the slice name/label */
239
+ nameKey: string;
240
+ /** Key in each datum used as the slice value */
241
+ valueKey: string;
242
+ /** Override colors as an ordered array or per-name map */
243
+ colors?: DashboardChartColors;
244
+ /** Outer radius of the pie (default: "80%") */
245
+ outerRadius?: number | string;
246
+ /** Inner radius — set > 0 to make a donut (default: 0) */
247
+ innerRadius?: number | string;
248
+ /** Show percentage labels inside/outside each slice (default: false) */
249
+ showLabels?: boolean;
250
+ /** Show the legend (default: true) */
251
+ showLegend?: boolean;
252
+ /**
253
+ * Index of the slice to "explode" (offset outward).
254
+ * Pass -1 or undefined to disable.
255
+ */
256
+ explodeIndex?: number;
257
+ /** Offset distance for the exploded slice in px (default: 12) */
258
+ explodeOffset?: number;
259
+ /** Format tooltip values */
260
+ valueFormatter?: ChartValueFormatter;
261
+ className?: string;
262
+ }
263
+ declare function PieMetricChart({ data, nameKey, valueKey, colors, outerRadius, innerRadius, showLabels, showLegend, explodeIndex, explodeOffset, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, }: PieMetricChartProps): import("react/jsx-runtime").JSX.Element;
264
+ export interface RadialBarMetricChartProps extends ChartStateProps {
265
+ /**
266
+ * Data array. Each item should have a `name` field (for labels) and
267
+ * the `dataKey` field (for values, 0–100 for percentage-based display).
268
+ */
269
+ data: DashboardChartDatum[];
270
+ /** Key in each datum used as the bar value (default: "value") */
271
+ dataKey?: string;
272
+ /** Key in each datum used as the bar label (default: "name") */
273
+ nameKey?: string;
274
+ /** Override colors as an ordered array or per-name map */
275
+ colors?: DashboardChartColors;
276
+ /** Inner radius of the radial bar (default: "30%") */
277
+ innerRadius?: number | string;
278
+ /** Outer radius of the radial bar (default: "100%") */
279
+ outerRadius?: number | string;
280
+ /** Start angle in degrees (default: 90 — top) */
281
+ startAngle?: number;
282
+ /** End angle in degrees (default: -270 — full circle) */
283
+ endAngle?: number;
284
+ /** Show background track behind each bar (default: true) */
285
+ showBackground?: boolean;
286
+ /** Show the legend (default: true) */
287
+ showLegend?: boolean;
288
+ /** Format tooltip values */
289
+ valueFormatter?: ChartValueFormatter;
290
+ className?: string;
291
+ }
292
+ declare function RadialBarMetricChart({ data, dataKey, nameKey, colors, innerRadius, outerRadius, startAngle, endAngle, showBackground, showLegend, valueFormatter, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, }: RadialBarMetricChartProps): import("react/jsx-runtime").JSX.Element;
293
+ export interface GaugeChartThreshold {
294
+ /** Upper bound of this zone (0–100) */
295
+ value: number;
296
+ /** Color for this zone */
297
+ color: string;
298
+ /** Optional label for this zone */
299
+ label?: string;
300
+ }
301
+ export interface GaugeChartProps {
302
+ /** Current value (must be within [min, max]) */
303
+ value: number;
304
+ /** Minimum value (default: 0) */
305
+ min?: number;
306
+ /** Maximum value (default: 100) */
307
+ max?: number;
308
+ /**
309
+ * Color zones. Each threshold defines the upper bound of a zone.
310
+ * Zones are evaluated in order; the first zone whose `value >= current %`
311
+ * determines the active color.
312
+ * If omitted, uses `--chart-1`.
313
+ */
314
+ thresholds?: GaugeChartThreshold[];
315
+ /** Label shown below the value (e.g. "CPU Usage") */
316
+ label?: React.ReactNode;
317
+ /** Format the center value text (default: shows percentage) */
318
+ valueFormatter?: (value: number, percent: number) => string;
319
+ /** Show the needle indicator (default: true) */
320
+ showNeedle?: boolean;
321
+ className?: string;
165
322
  }
166
- declare function DonutBreakdownChart({ data, config, nameKey, valueKey, colors, centerLabel, centerValue, showLegend, isLoading, error, onRetry, retryLabel, emptyTitle, emptyDescription, errorTitle, errorDescription, loadingLabel, stateClassName, className, ...props }: DonutBreakdownChartProps): import("react/jsx-runtime").JSX.Element;
167
- export { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle, ChartCard, DashboardBarChart, DashboardLineChart, HorizontalBarChart, InteractiveTimeSeriesChart, ComboMetricChart, DonutBreakdownChart, };
323
+ declare function GaugeChart({ value, min, max, thresholds, label, valueFormatter, showNeedle, className, }: GaugeChartProps): import("react/jsx-runtime").JSX.Element;
324
+ export { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle, ChartCard, DashboardBarChart, DashboardLineChart, HorizontalBarChart, InteractiveTimeSeriesChart, ComboMetricChart, DonutBreakdownChart, SparklineChart, RadarMetricChart, PieMetricChart, RadialBarMetricChart, GaugeChart, };
@@ -15,6 +15,8 @@ interface FileUploadProps extends Omit<React.InputHTMLAttributes<HTMLInputElemen
15
15
  * for file uploads. Supports click-to-browse and drag-and-drop. Shows a preview
16
16
  * list of selected files with per-file remove buttons.
17
17
  *
18
+ * Headless logic is available via `useFileUpload` for custom drop-zone UIs.
19
+ *
18
20
  * @ai-rules
19
21
  * 1. Use `onFilesChange` to capture the selected files array in your form state.
20
22
  * 2. `maxFiles` defaults to 1 (single file). Set to a higher number for multi-upload.
@@ -1 +1,2 @@
1
1
  export * from './file-upload';
2
+ export * from './use-file-upload';
@@ -0,0 +1,49 @@
1
+ export interface UseFileUploadProps {
2
+ /** Maximum number of files allowed. @default 1 */
3
+ maxFiles?: number;
4
+ /** Maximum file size in bytes. @default 5MB */
5
+ maxSize?: number;
6
+ /** Called with the current accepted file list whenever it changes. */
7
+ onFilesChange?: (files: File[]) => void;
8
+ /** Called when files are rejected due to size or count limits. */
9
+ onError?: (rejectedFiles: File[], reason: 'size' | 'count') => void;
10
+ /** Whether the upload area is disabled. */
11
+ disabled?: boolean;
12
+ }
13
+ export interface UseFileUploadReturn {
14
+ /** Currently accepted files. */
15
+ files: File[];
16
+ /** Whether a drag operation is currently active over the drop zone. */
17
+ dragActive: boolean;
18
+ /** Inline error message, or `null` when there is no error. */
19
+ errorMessage: string | null;
20
+ /** Attach to the hidden `<input type="file">` element. */
21
+ inputRef: React.RefObject<HTMLInputElement>;
22
+ /** Process a `FileList` from any source (input change, drop, paste, etc.). */
23
+ handleFiles: (newFiles: FileList | null) => void;
24
+ /** Drag enter / over / leave handler — attach to all three events. */
25
+ handleDrag: (e: React.DragEvent) => void;
26
+ /** Drop handler — attach to the drop zone element. */
27
+ handleDrop: (e: React.DragEvent) => void;
28
+ /** Input `onChange` handler — attach to the hidden `<input>`. */
29
+ handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
30
+ /** Remove a file by its index in the `files` array. */
31
+ removeFile: (index: number) => void;
32
+ /** Programmatically open the native file picker dialog. */
33
+ openFileDialog: () => void;
34
+ }
35
+ /**
36
+ * Headless hook for drag-and-drop file upload logic.
37
+ *
38
+ * @description
39
+ * Encapsulates all stateful behaviour for a file upload area: file validation
40
+ * (size and count limits), drag-active tracking, error messaging, and the
41
+ * hidden-input ref. Pair with any custom drop-zone UI.
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * const { files, dragActive, errorMessage, inputRef, handleDrag, handleDrop, handleChange, removeFile, openFileDialog } =
46
+ * useFileUpload({ maxFiles: 3, maxSize: 10 * 1024 * 1024 });
47
+ * ```
48
+ */
49
+ export declare function useFileUpload({ maxFiles, maxSize, onFilesChange, onError, disabled, }?: UseFileUploadProps): UseFileUploadReturn;
@@ -1 +1,3 @@
1
1
  export * from './pagination';
2
+ export { usePagination } from './use-pagination';
3
+ export type { PaginationPageItem, UsePaginationProps, UsePaginationReturn } from './use-pagination';
@@ -0,0 +1,78 @@
1
+ /** A page item rendered in the pagination bar. */
2
+ export type PaginationPageItem = {
3
+ type: 'page';
4
+ page: number;
5
+ } | {
6
+ type: 'ellipsis';
7
+ key: string;
8
+ };
9
+ export interface UsePaginationProps {
10
+ /** Total number of items in the data set. */
11
+ totalItems: number;
12
+ /** Number of items per page. @default 10 */
13
+ pageSize?: number;
14
+ /** Initial page (1-indexed). @default 1 */
15
+ initialPage?: number;
16
+ /**
17
+ * Controlled current page (1-indexed).
18
+ * When provided, page state is managed externally via `onPageChange`.
19
+ */
20
+ page?: number;
21
+ /** Called whenever the page changes. */
22
+ onPageChange?: (page: number) => void;
23
+ /**
24
+ * Number of page buttons to show on each side of the current page.
25
+ * @default 1
26
+ */
27
+ siblingCount?: number;
28
+ }
29
+ export interface UsePaginationReturn {
30
+ /** The currently active page (1-indexed). */
31
+ currentPage: number;
32
+ /** Total number of pages. */
33
+ totalPages: number;
34
+ /** Index of the first item on the current page (0-indexed, useful for slicing). */
35
+ startIndex: number;
36
+ /** Index of the last item on the current page (exclusive, useful for slicing). */
37
+ endIndex: number;
38
+ /** Whether there is a previous page available. */
39
+ canGoPrev: boolean;
40
+ /** Whether there is a next page available. */
41
+ canGoNext: boolean;
42
+ /** Whether the current page is the first page. */
43
+ isFirstPage: boolean;
44
+ /** Whether the current page is the last page. */
45
+ isLastPage: boolean;
46
+ /**
47
+ * Ordered list of items to render in the pagination bar.
48
+ * Each item is either a `{ type: 'page', page: number }` or
49
+ * `{ type: 'ellipsis', key: string }`.
50
+ */
51
+ items: PaginationPageItem[];
52
+ /** Navigate to a specific page (1-indexed, clamped to valid range). */
53
+ goTo: (page: number) => void;
54
+ /** Navigate to the next page (no-op if already on the last page). */
55
+ next: () => void;
56
+ /** Navigate to the previous page (no-op if already on the first page). */
57
+ prev: () => void;
58
+ /** Navigate to the first page. */
59
+ first: () => void;
60
+ /** Navigate to the last page. */
61
+ last: () => void;
62
+ }
63
+ /**
64
+ * Headless hook for pagination logic.
65
+ *
66
+ * @description
67
+ * Computes the current page, total pages, slice indices, and the ordered list
68
+ * of page items (numbers + ellipses) to render. Supports both controlled and
69
+ * uncontrolled modes. Pair with any custom pagination UI or with the
70
+ * `<Pagination>` visual components.
71
+ *
72
+ * @example
73
+ * ```tsx
74
+ * const { currentPage, totalPages, items, next, prev, goTo, canGoPrev, canGoNext } =
75
+ * usePagination({ totalItems: 200, pageSize: 20 });
76
+ * ```
77
+ */
78
+ export declare function usePagination({ totalItems, pageSize, initialPage, page: controlledPage, onPageChange, siblingCount, }: UsePaginationProps): UsePaginationReturn;
@@ -1 +1,3 @@
1
1
  export * from './rich-text-editor';
2
+ export { useRichTextEditor } from './use-rich-text-editor';
3
+ export type { UseRichTextEditorProps, UseRichTextEditorReturn, ActiveFormats } from './use-rich-text-editor';
@@ -0,0 +1,107 @@
1
+ export interface ActiveFormats {
2
+ bold: boolean;
3
+ italic: boolean;
4
+ underline: boolean;
5
+ justifyLeft: boolean;
6
+ justifyCenter: boolean;
7
+ justifyRight: boolean;
8
+ insertUnorderedList: boolean;
9
+ insertOrderedList: boolean;
10
+ link: boolean;
11
+ h1: boolean;
12
+ h2: boolean;
13
+ h3: boolean;
14
+ p: boolean;
15
+ }
16
+ export interface UseRichTextEditorProps {
17
+ /** Current HTML value of the editor */
18
+ value: string;
19
+ /** Called whenever the editor content changes */
20
+ onChange?: (value: string) => void;
21
+ }
22
+ export interface UseRichTextEditorReturn {
23
+ /** Attach to the `contenteditable` div */
24
+ editorRef: React.RefObject<HTMLDivElement>;
25
+ /** Attach to the search `<input>` */
26
+ searchInputRef: React.RefObject<HTMLInputElement>;
27
+ /** Attach to the link URL `<input>` */
28
+ linkInputRef: React.RefObject<HTMLInputElement>;
29
+ /** Map of currently active formatting commands */
30
+ activeFormats: ActiveFormats;
31
+ /** Whether the inline search bar is open */
32
+ isSearchOpen: boolean;
33
+ setIsSearchOpen: (open: boolean) => void;
34
+ /** Current search query string */
35
+ searchQuery: string;
36
+ setSearchQuery: (query: string) => void;
37
+ /** Current link URL being edited */
38
+ linkUrl: string;
39
+ setLinkUrl: (url: string) => void;
40
+ /** Whether the link popover is open */
41
+ isLinkOpen: boolean;
42
+ /**
43
+ * True when the popover was opened with a non-collapsed text selection
44
+ * (or with the cursor inside an existing link). Use this to decide whether
45
+ * to show the link-insert form vs. the "select text first" hint.
46
+ */
47
+ hasSavedSelection: boolean;
48
+ /** Word count of the editor content */
49
+ wordCount: number;
50
+ /** Character count of the editor content */
51
+ characterCount: number;
52
+ /** Re-read the current selection and update `activeFormats` */
53
+ updateActiveFormats: () => void;
54
+ /** Execute a `document.execCommand` and sync state */
55
+ execCommand: (command: string, value?: string) => void;
56
+ /** Called on every `input` event of the editor */
57
+ handleInput: () => void;
58
+ /** Search forward or backward for `searchQuery` */
59
+ performSearch: (text: string, backward?: boolean) => void;
60
+ /** Create or update a hyperlink at the current selection */
61
+ handleCreateLink: () => void;
62
+ /** Remove the hyperlink at the current cursor position */
63
+ handleUnlink: () => void;
64
+ /** Handle link popover open/close (saves selection, pre-fills URL) */
65
+ onLinkPopoverOpenChange: (open: boolean) => void;
66
+ }
67
+ /**
68
+ * `useRichTextEditor` — Headless hook for the RichTextEditor component.
69
+ *
70
+ * Encapsulates all state, refs, and DOM-manipulation logic for a
71
+ * `contenteditable`-based rich text editor. Use this hook when you need to
72
+ * build a fully custom editor UI while reusing the same formatting logic as
73
+ * the default `RichTextEditor` component.
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * import { useRichTextEditor } from 'xertica-ui/ui';
78
+ *
79
+ * function MyEditor({ value, onChange }) {
80
+ * const {
81
+ * editorRef,
82
+ * activeFormats,
83
+ * execCommand,
84
+ * handleInput,
85
+ * wordCount,
86
+ * } = useRichTextEditor({ value, onChange });
87
+ *
88
+ * return (
89
+ * <div>
90
+ * <button
91
+ * onClick={() => execCommand('bold')}
92
+ * style={{ fontWeight: activeFormats.bold ? 'bold' : 'normal' }}
93
+ * >
94
+ * B
95
+ * </button>
96
+ * <div
97
+ * ref={editorRef}
98
+ * contentEditable
99
+ * onInput={handleInput}
100
+ * />
101
+ * <span>{wordCount} words</span>
102
+ * </div>
103
+ * );
104
+ * }
105
+ * ```
106
+ */
107
+ export declare function useRichTextEditor({ value, onChange, }: UseRichTextEditorProps): UseRichTextEditorReturn;
@@ -1 +1,3 @@
1
- export * from './stepper';
1
+ export { Stepper, Step, useStepperContext } from './stepper';
2
+ export { useStepper } from './use-stepper';
3
+ export type { UseStepperProps, UseStepperReturn } from './use-stepper';
@@ -4,7 +4,7 @@ interface StepperContextValue {
4
4
  totalSteps: number;
5
5
  orientation: 'horizontal' | 'vertical';
6
6
  }
7
- declare const useStepper: () => StepperContextValue;
7
+ declare const useStepperContext: () => StepperContextValue;
8
8
  interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {
9
9
  currentStep: number;
10
10
  /** Layout direction. @default "horizontal" */
@@ -33,4 +33,4 @@ interface StepProps extends React.HTMLAttributes<HTMLDivElement> {
33
33
  error?: boolean;
34
34
  }
35
35
  declare const Step: React.ForwardRefExoticComponent<StepProps & React.RefAttributes<HTMLDivElement>>;
36
- export { Stepper, Step, useStepper };
36
+ export { Stepper, Step, useStepperContext };
@@ -0,0 +1,60 @@
1
+ export interface UseStepperProps {
2
+ /** Total number of steps. */
3
+ totalSteps: number;
4
+ /** Initial active step (1-indexed). @default 1 */
5
+ initialStep?: number;
6
+ /**
7
+ * Controlled current step (1-indexed).
8
+ * When provided, step state is managed externally via `onStepChange`.
9
+ */
10
+ step?: number;
11
+ /** Called whenever the active step changes. */
12
+ onStepChange?: (step: number) => void;
13
+ /**
14
+ * Optional async guard called before advancing to the next step.
15
+ * Return `true` to allow the transition, `false` to block it.
16
+ * Useful for running form validation before moving forward.
17
+ */
18
+ onBeforeNext?: (currentStep: number) => boolean | Promise<boolean>;
19
+ }
20
+ export interface UseStepperReturn {
21
+ /** The currently active step (1-indexed). */
22
+ currentStep: number;
23
+ /** Total number of steps. */
24
+ totalSteps: number;
25
+ /** Whether the current step is the first step. */
26
+ isFirstStep: boolean;
27
+ /** Whether the current step is the last step. */
28
+ isLastStep: boolean;
29
+ /** Whether navigation to the previous step is possible. */
30
+ canGoPrev: boolean;
31
+ /** Whether navigation to the next step is possible. */
32
+ canGoNext: boolean;
33
+ /**
34
+ * Advance to the next step.
35
+ * If `onBeforeNext` is provided, it is awaited first; the step only
36
+ * advances when the guard returns `true`.
37
+ */
38
+ next: () => Promise<void>;
39
+ /** Go back to the previous step (no-op if already on step 1). */
40
+ prev: () => void;
41
+ /** Jump directly to a specific step (1-indexed, clamped to valid range). */
42
+ goTo: (step: number) => void;
43
+ /** Jump to the first step. */
44
+ reset: () => void;
45
+ }
46
+ /**
47
+ * Headless hook for multi-step wizard / stepper logic.
48
+ *
49
+ * @description
50
+ * Manages the active step state, navigation guards, and derived flags for
51
+ * multi-step flows. Supports both controlled and uncontrolled modes.
52
+ * Pair with the `<Stepper>` / `<Step>` visual components or any custom UI.
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * const { currentStep, totalSteps, next, prev, isFirstStep, isLastStep } =
57
+ * useStepper({ totalSteps: 3, onBeforeNext: () => form.trigger() });
58
+ * ```
59
+ */
60
+ export declare function useStepper({ totalSteps, initialStep, step: controlledStep, onStepChange, onBeforeNext, }: UseStepperProps): UseStepperReturn;
@@ -1 +1,4 @@
1
- export * from './tree-view';
1
+ export { TreeView } from './tree-view';
2
+ export type { TreeViewProps } from './tree-view';
3
+ export { useTreeView } from './use-tree-view';
4
+ export type { TreeNode, UseTreeViewProps, UseTreeViewReturn } from './use-tree-view';
@@ -1,10 +1,5 @@
1
1
  import * as React from "react";
2
- export interface TreeNode {
3
- id: string;
4
- label: string;
5
- icon?: React.ReactNode;
6
- children?: TreeNode[];
7
- }
2
+ import { type TreeNode } from "./use-tree-view";
8
3
  interface TreeViewProps extends React.HTMLAttributes<HTMLDivElement> {
9
4
  data: TreeNode[];
10
5
  /** Called when a node is clicked or activated via keyboard. */
@@ -24,6 +19,8 @@ interface TreeViewProps extends React.HTMLAttributes<HTMLDivElement> {
24
19
  * and collapsed independently. Supports custom icons per node, controlled
25
20
  * selection, and full WAI-ARIA keyboard navigation.
26
21
  *
22
+ * Headless logic is available via `useTreeView` for custom tree UIs.
23
+ *
27
24
  * @ai-rules
28
25
  * 1. Each `TreeNode` must have a unique `id`.
29
26
  * 2. Leaf nodes (no `children`) do not render expand arrows.
@@ -34,3 +31,4 @@ interface TreeViewProps extends React.HTMLAttributes<HTMLDivElement> {
34
31
  declare const TreeView: React.ForwardRefExoticComponent<TreeViewProps & React.RefAttributes<HTMLDivElement>>;
35
32
  export { TreeView };
36
33
  export type { TreeViewProps };
34
+ export type { TreeNode } from './use-tree-view';
@@ -0,0 +1,60 @@
1
+ export interface TreeNode {
2
+ id: string;
3
+ label: string;
4
+ icon?: React.ReactNode;
5
+ children?: TreeNode[];
6
+ }
7
+ export interface UseTreeViewProps {
8
+ /** The tree data to manage. */
9
+ data: TreeNode[];
10
+ /** Node IDs that are expanded by default (uncontrolled). */
11
+ defaultExpanded?: string[];
12
+ /**
13
+ * Controlled selected node ID.
14
+ * When provided, selection state is managed externally.
15
+ */
16
+ selectedNodeId?: string;
17
+ /** Called when a node is clicked or activated via keyboard. */
18
+ onNodeClick?: (node: TreeNode) => void;
19
+ /** Called when a node becomes the selected item. */
20
+ onNodeSelect?: (node: TreeNode) => void;
21
+ }
22
+ export interface UseTreeViewReturn {
23
+ /** Set of currently expanded node IDs. */
24
+ expanded: Set<string>;
25
+ /** The currently selected node ID (controlled or internal). */
26
+ effectiveSelectedId: string | undefined;
27
+ /**
28
+ * Map of node ID → button element.
29
+ * Attach via the `setRef` helper returned by `getNodeRef`.
30
+ */
31
+ nodeRefs: React.MutableRefObject<Map<string, HTMLButtonElement>>;
32
+ /** Returns a ref-setter callback for a given node ID. */
33
+ getNodeRef: (nodeId: string) => (el: HTMLButtonElement | null) => void;
34
+ /** Toggle the expanded state of a node. */
35
+ toggleExpand: (nodeId: string) => void;
36
+ /** Select a node (updates internal state if uncontrolled, fires callbacks). */
37
+ handleSelect: (node: TreeNode) => void;
38
+ /**
39
+ * Full WAI-ARIA keyboard handler.
40
+ * Attach to `onKeyDown` of each tree-item button.
41
+ */
42
+ handleKeyDown: (e: React.KeyboardEvent, node: TreeNode) => void;
43
+ /** Returns the ordered list of all currently visible nodes (respects expand state). */
44
+ getVisibleNodes: () => TreeNode[];
45
+ }
46
+ /**
47
+ * Headless hook for hierarchical tree-view logic.
48
+ *
49
+ * @description
50
+ * Manages expand/collapse state, selection (controlled or uncontrolled),
51
+ * WAI-ARIA keyboard navigation (Arrow keys, Home, End, Enter/Space),
52
+ * and focus management via node refs. Pair with any custom tree UI.
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * const { expanded, effectiveSelectedId, toggleExpand, handleSelect, handleKeyDown, getNodeRef } =
57
+ * useTreeView({ data, onNodeSelect });
58
+ * ```
59
+ */
60
+ export declare function useTreeView({ data, defaultExpanded, selectedNodeId, onNodeClick, onNodeSelect, }: UseTreeViewProps): UseTreeViewReturn;