xertica-ui 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/CHANGELOG.md +621 -564
  2. package/README.md +443 -417
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/cli.ts +1244 -1244
  6. package/bin/generate-tokens.ts +9 -9
  7. package/bin/language-config.ts +358 -358
  8. package/components/assistant/code-block/CodeBlock.tsx +268 -268
  9. package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
  10. package/components/assistant/modern-chat-input/ModernChatInput.tsx +564 -564
  11. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
  12. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -104
  13. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
  14. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -88
  15. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
  16. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -564
  17. package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
  18. package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
  19. package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
  20. package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -611
  21. package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
  22. package/components/blocks/card-patterns/ActivityCardSkeleton.tsx +56 -56
  23. package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +58 -58
  24. package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
  25. package/components/blocks/card-patterns/NotificationCardSkeleton.tsx +81 -81
  26. package/components/blocks/card-patterns/ProfileCard.tsx +112 -112
  27. package/components/blocks/card-patterns/ProfileCardSkeleton.tsx +69 -69
  28. package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
  29. package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +67 -67
  30. package/components/blocks/card-patterns/QuickActionCardSkeleton.tsx +44 -44
  31. package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
  32. package/components/blocks/card-patterns/index.ts +29 -29
  33. package/components/brand/language-selector/LanguageSelector.tsx +102 -102
  34. package/components/brand/language-selector/language-selector.stories.tsx +111 -111
  35. package/components/brand/language-selector/language-selector.test.tsx +101 -101
  36. package/components/brand/theme-toggle/ThemeToggle.tsx +74 -74
  37. package/components/brand/xertica-provider/XerticaProvider.tsx +112 -109
  38. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  39. package/components/index.ts +86 -86
  40. package/components/layout/sidebar/sidebar.mdx +1 -1
  41. package/components/layout/sidebar/sidebar.stories.tsx +201 -0
  42. package/components/layout/sidebar/sidebar.tsx +1164 -1079
  43. package/components/media/FloatingMediaWrapper.tsx +371 -371
  44. package/components/media/audio-player/AudioPlayer.tsx +768 -768
  45. package/components/media/video-player/VideoPlayer.tsx +310 -310
  46. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +188 -188
  47. package/components/pages/home-content/HomeContent.tsx +120 -120
  48. package/components/pages/home-content/home-content.mdx +62 -62
  49. package/components/pages/home-page/HomePage.tsx +78 -78
  50. package/components/pages/home-page/home-page.mdx +53 -53
  51. package/components/pages/login-page/LoginPage.tsx +218 -218
  52. package/components/pages/reset-password-page/ResetPasswordPage.tsx +243 -243
  53. package/components/pages/template-content/TemplateContent.tsx +1354 -1354
  54. package/components/pages/template-content/template-content.mdx +61 -61
  55. package/components/pages/template-page/TemplatePage.stories.tsx +8 -15
  56. package/components/pages/template-page/template-page.mdx +53 -53
  57. package/components/pages/verify-email-page/VerifyEmailPage.tsx +206 -206
  58. package/components/shared/error-boundary.stories.tsx +114 -114
  59. package/components/shared/error-boundary.tsx +150 -150
  60. package/components/shared/error-fallbacks.tsx +222 -222
  61. package/components/ui/accordion/accordion.mdx +8 -8
  62. package/components/ui/alert/alert.mdx +8 -8
  63. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  64. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  65. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  66. package/components/ui/avatar/avatar.mdx +8 -8
  67. package/components/ui/badge/badge.mdx +8 -8
  68. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  69. package/components/ui/button/button.mdx +8 -8
  70. package/components/ui/calendar/calendar.mdx +8 -8
  71. package/components/ui/card/card.mdx +8 -8
  72. package/components/ui/carousel/carousel.mdx +8 -8
  73. package/components/ui/chart/chart.mdx +8 -8
  74. package/components/ui/chart/chart.test.tsx +1 -1
  75. package/components/ui/chart/chart.tsx +13 -6
  76. package/components/ui/checkbox/checkbox.mdx +8 -8
  77. package/components/ui/collapsible/collapsible.mdx +8 -8
  78. package/components/ui/command/command.mdx +8 -8
  79. package/components/ui/context-menu/context-menu.mdx +8 -8
  80. package/components/ui/dialog/dialog.mdx +8 -8
  81. package/components/ui/drawer/drawer.mdx +8 -8
  82. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  83. package/components/ui/empty/empty.mdx +8 -8
  84. package/components/ui/file-upload/file-upload.mdx +8 -8
  85. package/components/ui/hover-card/hover-card.mdx +8 -8
  86. package/components/ui/input/input.mdx +8 -8
  87. package/components/ui/input-otp/input-otp.mdx +8 -8
  88. package/components/ui/label/label.mdx +8 -8
  89. package/components/ui/map/map.mdx +8 -8
  90. package/components/ui/menubar/menubar.mdx +8 -8
  91. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  92. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  93. package/components/ui/pagination/pagination.mdx +8 -8
  94. package/components/ui/popover/popover.mdx +8 -8
  95. package/components/ui/progress/progress.mdx +8 -8
  96. package/components/ui/radio-group/radio-group.mdx +8 -8
  97. package/components/ui/rating/rating.mdx +8 -8
  98. package/components/ui/resizable/resizable.mdx +8 -8
  99. package/components/ui/route-map/route-map.mdx +8 -8
  100. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  101. package/components/ui/search/search.mdx +8 -8
  102. package/components/ui/select/select.mdx +8 -8
  103. package/components/ui/separator/separator.mdx +8 -8
  104. package/components/ui/sheet/sheet.mdx +8 -8
  105. package/components/ui/simple-map/simple-map.mdx +8 -8
  106. package/components/ui/skeleton/skeleton.mdx +8 -8
  107. package/components/ui/slider/slider.mdx +8 -8
  108. package/components/ui/sonner/sonner.mdx +8 -8
  109. package/components/ui/stats-card/index.ts +2 -2
  110. package/components/ui/stats-card/stats-card-skeleton.tsx +60 -60
  111. package/components/ui/stats-card/stats-card.mdx +8 -8
  112. package/components/ui/stats-card/stats-card.stories.tsx +117 -99
  113. package/components/ui/stats-card/stats-card.tsx +18 -2
  114. package/components/ui/stepper/stepper.mdx +8 -8
  115. package/components/ui/switch/switch.mdx +8 -8
  116. package/components/ui/table/table.mdx +8 -8
  117. package/components/ui/tabs/tabs.mdx +8 -8
  118. package/components/ui/textarea/textarea.mdx +8 -8
  119. package/components/ui/timeline/timeline.mdx +8 -8
  120. package/components/ui/toggle/toggle.mdx +8 -8
  121. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  122. package/components/ui/tooltip/tooltip.mdx +8 -8
  123. package/components/ui/tree-view/tree-view.mdx +8 -8
  124. package/components.json +153 -533
  125. package/contexts/AuthContext.tsx +121 -121
  126. package/contexts/BrandColorsContext.tsx +39 -8
  127. package/contexts/LanguageContext.test.tsx +121 -121
  128. package/contexts/LanguageContext.tsx +250 -250
  129. package/contexts/theme-data.ts +51 -0
  130. package/dist/AssistantChart-BKVtGUKF.js +3383 -0
  131. package/dist/AssistantChart-BZTPJ5dP.cjs +3551 -0
  132. package/dist/{AssistantChart-BAx9VQvb.cjs → AssistantChart-Bdd44uBn.cjs} +388 -127
  133. package/dist/{AssistantChart-CVko2A1W.js → AssistantChart-CFhDdGyU.js} +391 -130
  134. package/dist/{AssistantChart-CVzmmhx4.js → AssistantChart-C_hwFRRr.js} +4 -4
  135. package/dist/{AssistantChart-BAudAfne.cjs → AssistantChart-CldVCVDe.cjs} +5 -5
  136. package/dist/{AssistantChart-BP8upjMk.js → AssistantChart-Cu3m7RBo.js} +5 -5
  137. package/dist/AssistantChart-CxGjH7Qk.js +3477 -0
  138. package/dist/AssistantChart-DIpshm3i.js +4784 -0
  139. package/dist/AssistantChart-DMJJ_Amf.js +3383 -0
  140. package/dist/AssistantChart-D_PTeu8P.cjs +3503 -0
  141. package/dist/{AssistantChart-9w31gdAb.cjs → AssistantChart-DoZCyS5r.cjs} +4 -4
  142. package/dist/AssistantChart-WeycT5Pd.cjs +3551 -0
  143. package/dist/AssistantChart-zjsy2GaZ.cjs +4810 -0
  144. package/dist/AudioPlayer-B1lt5cPl.cjs +989 -0
  145. package/dist/AudioPlayer-BZ7bibzU.cjs +982 -0
  146. package/dist/AudioPlayer-BpRPS4-1.cjs +1277 -0
  147. package/dist/AudioPlayer-C12BjQBV.cjs +997 -0
  148. package/dist/{AudioPlayer-1ypwE2Wh.cjs → AudioPlayer-CFeV8t-5.cjs} +1 -1
  149. package/dist/{AudioPlayer-DuKXrCfy.js → AudioPlayer-CGRUtUdN.js} +1 -1
  150. package/dist/AudioPlayer-Coly3q5R.js +1278 -0
  151. package/dist/AudioPlayer-CySJIyvL.js +937 -0
  152. package/dist/AudioPlayer-DMcG_c7L.js +990 -0
  153. package/dist/AudioPlayer-DcFKRJE_.js +998 -0
  154. package/dist/AudioPlayer-IAU5q5T1.cjs +936 -0
  155. package/dist/AudioPlayer-e8LfNoqO.js +983 -0
  156. package/dist/BrandColorsContext-565dDHd5.js +660 -0
  157. package/dist/BrandColorsContext-BMRJ04Wf.js +718 -0
  158. package/dist/BrandColorsContext-BcJbtkqn.cjs +659 -0
  159. package/dist/BrandColorsContext-BwY-b6M4.cjs +725 -0
  160. package/dist/{xertica-assistant-Qp3ydksa.cjs → CodeBlock-7TTgmdGG.cjs} +263 -51
  161. package/dist/{xertica-assistant-gnCJdcZY.js → CodeBlock-BeSt1h5P.js} +219 -7
  162. package/dist/CodeBlock-BgfYL_rD.cjs +2094 -0
  163. package/dist/CodeBlock-BlcqlA9M.cjs +2094 -0
  164. package/dist/CodeBlock-Bnmeu5ez.cjs +2094 -0
  165. package/dist/CodeBlock-BtfPlbAI.js +2078 -0
  166. package/dist/CodeBlock-CIySIuYr.js +2078 -0
  167. package/dist/CodeBlock-CuPtUM-7.cjs +2094 -0
  168. package/dist/CodeBlock-D6ffWXgc.js +2078 -0
  169. package/dist/CodeBlock-D8dcwbit.cjs +2094 -0
  170. package/dist/CodeBlock-DMZrFnlw.cjs +2094 -0
  171. package/dist/CodeBlock-DlBehYN8.js +2078 -0
  172. package/dist/CodeBlock-DnYNI8rQ.js +2078 -0
  173. package/dist/CodeBlock-DvKWbSnE.cjs +2094 -0
  174. package/dist/CodeBlock-DwMCfkFY.js +2078 -0
  175. package/dist/CodeBlock-Dy6CNYyj.js +2078 -0
  176. package/dist/CodeBlock-U1pPOQI7.cjs +2094 -0
  177. package/dist/CodeBlock-f_GpNhEB.js +2078 -0
  178. package/dist/CodeBlock-oB6u8nI1.js +2078 -0
  179. package/dist/CodeBlock-tZC31B73.cjs +2094 -0
  180. package/dist/FeatureCard-CxC-7C-C.cjs +300 -0
  181. package/dist/FeatureCard-DbHWCb4E.js +301 -0
  182. package/dist/ImageWithFallback-CGtidP6B.cjs +4542 -0
  183. package/dist/ImageWithFallback-lsg3pdFg.js +4508 -0
  184. package/dist/{LanguageContext-DvUt5jBg.cjs → LanguageContext-B_KFTCzT.cjs} +2 -2
  185. package/dist/{LanguageContext-BwhwC3G2.js → LanguageContext-CS14yCpi.js} +2 -2
  186. package/dist/{XerticaXLogo-DHz5SugF.js → LanguageSelector-B5YfbHra.js} +115 -136
  187. package/dist/{XerticaXLogo-DTee_y8X.cjs → LanguageSelector-D6uacAIM.cjs} +115 -136
  188. package/dist/LayoutContext-B45-e9DI.cjs +93 -0
  189. package/dist/LayoutContext-BAql6ZRY.js +97 -0
  190. package/dist/LayoutContext-Bav3UMEA.js +94 -0
  191. package/dist/LayoutContext-BvK-ggDa.cjs +96 -0
  192. package/dist/{ThemeContext-Bo-W2WZH.js → ThemeContext-BWq9ACPo.js} +8 -13
  193. package/dist/{ThemeContext-ept8jhXI.js → ThemeContext-BXjrgUjW.js} +261 -200
  194. package/dist/{ThemeContext-BblcjQup.cjs → ThemeContext-Bmod0Cg2.cjs} +8 -13
  195. package/dist/ThemeContext-BoH4NLfN.js +734 -0
  196. package/dist/{ThemeContext-BbBNoFTG.js → ThemeContext-C2EwAPDt.js} +2 -2
  197. package/dist/{ThemeContext-U4dEYc6C.cjs → ThemeContext-CGk3KK0k.cjs} +1 -8
  198. package/dist/{ThemeContext-D3LzacmG.js → ThemeContext-CQSo4Iwc.js} +1 -8
  199. package/dist/{ThemeContext-CP3a0jxy.cjs → ThemeContext-j5aGtPky.cjs} +262 -193
  200. package/dist/ThemeContext-r69W20Xg.cjs +733 -0
  201. package/dist/{ThemeContext-Cmr8Ex8H.cjs → ThemeContext-vTjumZeM.cjs} +2 -2
  202. package/dist/{VerifyEmailPage-BRSP-Pwt.cjs → VerifyEmailPage--1Vurewl.cjs} +3 -3
  203. package/dist/{VerifyEmailPage-CbgjOF0v.js → VerifyEmailPage-1WwWczAn.js} +12 -22
  204. package/dist/{VerifyEmailPage-DF2ilhum.cjs → VerifyEmailPage-B4peJjAT.cjs} +356 -334
  205. package/dist/{VerifyEmailPage-CR7kb5df.cjs → VerifyEmailPage-BComraR7.cjs} +12 -22
  206. package/dist/{VerifyEmailPage-u_Dn7t1U.cjs → VerifyEmailPage-Bp1XXl3H.cjs} +4 -4
  207. package/dist/{VerifyEmailPage-CkBYfsNy.cjs → VerifyEmailPage-By3Jf__L.cjs} +4 -4
  208. package/dist/{VerifyEmailPage-Bv8Ah_TK.cjs → VerifyEmailPage-ByerOcm4.cjs} +20 -23
  209. package/dist/{VerifyEmailPage-BE-L9mB7.js → VerifyEmailPage-C0c2e5n0.js} +7 -7
  210. package/dist/{VerifyEmailPage-EhudUdqF.js → VerifyEmailPage-C5TNQTBa.js} +355 -343
  211. package/dist/{VerifyEmailPage-Dt7zgA4w.cjs → VerifyEmailPage-CFLMls1p.cjs} +4 -4
  212. package/dist/{VerifyEmailPage-Bvfv8HVQ.js → VerifyEmailPage-CGIwmWrm.js} +461 -379
  213. package/dist/{VerifyEmailPage-Cyl55sJb.js → VerifyEmailPage-CJLz3jrn.js} +20 -23
  214. package/dist/VerifyEmailPage-COiyNl1y.js +2825 -0
  215. package/dist/{VerifyEmailPage-DMBh4NM9.cjs → VerifyEmailPage-CYXtbKi3.cjs} +1 -1
  216. package/dist/{VerifyEmailPage-DTtFfC-J.js → VerifyEmailPage-CgMxRb4z.js} +3 -3
  217. package/dist/VerifyEmailPage-CpqqpLpo.cjs +3305 -0
  218. package/dist/VerifyEmailPage-CqKsR2v8.js +2827 -0
  219. package/dist/{VerifyEmailPage-Bae2cBXT.cjs → VerifyEmailPage-Cwi3kbol.cjs} +7 -7
  220. package/dist/{VerifyEmailPage-X14vhdyl.js → VerifyEmailPage-DGhuIqkb.js} +4 -4
  221. package/dist/{VerifyEmailPage-BIBOKV7Z.js → VerifyEmailPage-DSBMRHtl.js} +36 -41
  222. package/dist/{VerifyEmailPage-D-FRj5TU.cjs → VerifyEmailPage-De6bQjrz.cjs} +36 -41
  223. package/dist/{VerifyEmailPage-BJjAMUTW.js → VerifyEmailPage-DgIid028.js} +4 -4
  224. package/dist/VerifyEmailPage-DjQKRlUS.cjs +2824 -0
  225. package/dist/{VerifyEmailPage-CdYPSJoO.js → VerifyEmailPage-DvMLZgFt.js} +1 -1
  226. package/dist/{VerifyEmailPage-C_ihbcth.js → VerifyEmailPage-MTD7AG1Z.js} +4 -4
  227. package/dist/VerifyEmailPage-s-1X3LDJ.cjs +2826 -0
  228. package/dist/XerticaOrbe-KL1RBHzw.cjs +1354 -0
  229. package/dist/XerticaOrbe-zwS1p2a8.js +1355 -0
  230. package/dist/XerticaProvider-6btlAlzc.js +17 -0
  231. package/dist/{XerticaProvider-siSt9uG2.js → XerticaProvider-B7EVH-NF.js} +2 -2
  232. package/dist/{XerticaProvider-AbWlr7Af.cjs → XerticaProvider-BIrqfZ-i.cjs} +11 -8
  233. package/dist/XerticaProvider-BNoNOxQ5.cjs +16 -0
  234. package/dist/XerticaProvider-BlY2limY.cjs +38 -0
  235. package/dist/{XerticaProvider-CWgby5mY.js → XerticaProvider-C1DKnvLh.js} +4 -4
  236. package/dist/{XerticaProvider-AChwphCO.cjs → XerticaProvider-CBGc4EMA.cjs} +4 -4
  237. package/dist/{XerticaProvider-BITjgC5p.js → XerticaProvider-CEoWMTxu.js} +2 -2
  238. package/dist/XerticaProvider-CeS5G_n5.cjs +45 -0
  239. package/dist/{XerticaProvider-By8q3Roe.cjs → XerticaProvider-CllrbMEJ.cjs} +2 -2
  240. package/dist/{XerticaProvider-B8CaV7xu.cjs → XerticaProvider-D-yNhF94.cjs} +1 -1
  241. package/dist/XerticaProvider-DDuiIcKo.js +39 -0
  242. package/dist/{XerticaProvider-DQtvJU7m.js → XerticaProvider-DYq4JWtg.js} +1 -1
  243. package/dist/{XerticaProvider-CWs6EwNa.js → XerticaProvider-Dt5HEzbQ.js} +10 -10
  244. package/dist/{XerticaProvider-CW9hpCdF.cjs → XerticaProvider-ET0ihewn.cjs} +2 -2
  245. package/dist/XerticaProvider-cI9hSs27.cjs +38 -0
  246. package/dist/XerticaProvider-hSwhNQex.js +39 -0
  247. package/dist/XerticaProvider-ra2NciRq.js +43 -0
  248. package/dist/{XerticaXLogo-ChryA6xj.js → XerticaXLogo-B7xQ5dhi.js} +1 -1
  249. package/dist/{XerticaXLogo-CziKMQil.cjs → XerticaXLogo-CQUUjXoH.cjs} +8 -8
  250. package/dist/{XerticaXLogo-DfUvz-lD.js → XerticaXLogo-Cmsp-Eey.js} +9 -9
  251. package/dist/{XerticaXLogo-CFuIlYFH.js → XerticaXLogo-DZbo4vOE.js} +12 -12
  252. package/dist/{XerticaXLogo-8TTzBjHw.cjs → XerticaXLogo-Zw2B276b.cjs} +1 -1
  253. package/dist/{XerticaXLogo-kslQ8Tk_.cjs → XerticaXLogo-bvZSgwGF.cjs} +13 -7
  254. package/dist/alert-dialog-BOje--vD.js +847 -0
  255. package/dist/alert-dialog-BtEuQqrg.cjs +870 -0
  256. package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-DSKByiKZ.cjs} +3 -3
  257. package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-s-vmNkJ_.js} +3 -3
  258. package/dist/assistant.cjs.js +1 -1
  259. package/dist/assistant.es.js +1 -1
  260. package/dist/brand.cjs.js +1 -1
  261. package/dist/brand.es.js +1 -1
  262. package/dist/breadcrumb-CqJ7bHY5.js +161 -0
  263. package/dist/breadcrumb-m9Hb2_XN.cjs +177 -0
  264. package/dist/cli.js +45 -9
  265. package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +6 -0
  266. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +21 -0
  267. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +49 -0
  268. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +16 -0
  269. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +35 -0
  270. package/dist/components/blocks/audio-player/index.d.ts +1 -0
  271. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +26 -0
  272. package/dist/components/blocks/document-editor/index.d.ts +1 -0
  273. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +41 -0
  274. package/dist/components/blocks/podcast-player/index.d.ts +1 -0
  275. package/dist/components/brand/xertica-provider/XerticaProvider.d.ts +3 -1
  276. package/dist/components/ui/chart/chart.d.ts +12 -3
  277. package/dist/components/ui/chart/parts/chart-dashboard.d.ts +113 -0
  278. package/dist/components/ui/chart/parts/chart-metric.d.ts +118 -0
  279. package/dist/components/ui/chart/parts/chart-primitives.d.ts +101 -0
  280. package/dist/components/ui/chart/parts/chart-shared.d.ts +20 -0
  281. package/dist/components/ui/chart/parts/chart-utils.d.ts +12 -0
  282. package/dist/components/ui/chart/parts/index.d.ts +5 -0
  283. package/dist/components/ui/stats-card/stats-card.d.ts +10 -0
  284. package/dist/contexts/theme-data.d.ts +4 -0
  285. package/dist/dropdown-menu-BDB5CmQs.cjs +247 -0
  286. package/dist/dropdown-menu-DQidbKBD.js +231 -0
  287. package/dist/google-maps-loader-BFWp6VPd.js +287 -0
  288. package/dist/google-maps-loader-BKcdgFbu.cjs +312 -0
  289. package/dist/{google-maps-loader-t2IlYBzw.js → google-maps-loader-CTYySAun.js} +4 -0
  290. package/dist/google-maps-loader-CumCNXeG.js +312 -0
  291. package/dist/{google-maps-loader-BqsYL48U.cjs → google-maps-loader-Y-QkD-Li.cjs} +5 -0
  292. package/dist/google-maps-loader-eS3uQ5TA.cjs +287 -0
  293. package/dist/header-Cgy6vYPk.cjs +731 -0
  294. package/dist/header-DRlT4jgI.js +715 -0
  295. package/dist/header-Dux00SI4.cjs +731 -0
  296. package/dist/header-EkGKXPsD.js +715 -0
  297. package/dist/header-WfEywpyc.cjs +731 -0
  298. package/dist/header-tifNQn2U.js +715 -0
  299. package/dist/hooks.cjs.js +1 -1
  300. package/dist/hooks.es.js +1 -1
  301. package/dist/index-BhapVLVj.js +8 -0
  302. package/dist/{index-D3RLKRAs.cjs → index-COtD8bRW.cjs} +1 -1
  303. package/dist/index-D6fxYEY8.cjs +7 -0
  304. package/dist/index-DAIp0_HK.js +8 -0
  305. package/dist/index-DW5tYe26.js +8 -0
  306. package/dist/index-GA__GvnG.cjs +7 -0
  307. package/dist/index.cjs.js +6 -6
  308. package/dist/index.es.js +6 -6
  309. package/dist/index.umd.js +1043 -470
  310. package/dist/input-2R4loU86.js +127 -0
  311. package/dist/input-DWANSKGb.cjs +145 -0
  312. package/dist/layout.cjs.js +1 -1
  313. package/dist/layout.es.js +1 -1
  314. package/dist/pages.cjs.js +1 -1
  315. package/dist/pages.es.js +1 -1
  316. package/dist/progress-DPtzoVV8.js +175 -0
  317. package/dist/progress-EeaoqqUs.cjs +191 -0
  318. package/dist/rich-text-editor-0mraWT5y.cjs +2376 -0
  319. package/dist/rich-text-editor-B-IkcPD0.js +2874 -0
  320. package/dist/rich-text-editor-B2CKz7nx.cjs +2903 -0
  321. package/dist/rich-text-editor-B6jMRLzk.cjs +1939 -0
  322. package/dist/rich-text-editor-B8_oYcIR.js +1730 -0
  323. package/dist/rich-text-editor-B9UbSXNb.js +1203 -0
  324. package/dist/rich-text-editor-BYuRBNBU.js +2373 -0
  325. package/dist/rich-text-editor-Bb9pySTs.cjs +2374 -0
  326. package/dist/rich-text-editor-BcL6L3cm.cjs +2374 -0
  327. package/dist/rich-text-editor-BoVZYtTs.cjs +2391 -0
  328. package/dist/rich-text-editor-Bp3zQqMC.js +2954 -0
  329. package/dist/rich-text-editor-CMgSN_w2.js +1189 -0
  330. package/dist/rich-text-editor-CPV1lEPH.cjs +1748 -0
  331. package/dist/rich-text-editor-CeucBdIv.cjs +2971 -0
  332. package/dist/rich-text-editor-CoKqbCtu.cjs +1799 -0
  333. package/dist/rich-text-editor-Cw56T_mB.js +2356 -0
  334. package/dist/rich-text-editor-Cyt8qs2b.js +1921 -0
  335. package/dist/rich-text-editor-D6H84OcX.cjs +1220 -0
  336. package/dist/rich-text-editor-D76gD-QI.js +2328 -0
  337. package/dist/rich-text-editor-DKkokOnA.js +1781 -0
  338. package/dist/rich-text-editor-DNsdpN64.cjs +2359 -0
  339. package/dist/rich-text-editor-DfG8bCyY.js +2358 -0
  340. package/dist/rich-text-editor-DloeW0wc.js +2832 -0
  341. package/dist/rich-text-editor-Dxjw31Z4.js +2341 -0
  342. package/dist/rich-text-editor-DzP0Epmb.js +2356 -0
  343. package/dist/rich-text-editor-bRkNoeZY.cjs +2891 -0
  344. package/dist/rich-text-editor-lyYE2ZG5.cjs +1207 -0
  345. package/dist/rich-text-editor-skplNlBM.cjs +2345 -0
  346. package/dist/select-Bkbr0f-Z.cjs +162 -0
  347. package/dist/select-CvIVdX2n.js +145 -0
  348. package/dist/{sidebar-CplprZpM.js → sidebar-0ocFLSks.js} +127 -50
  349. package/dist/{sidebar-CA6_ek3f.js → sidebar-B6SlKZYN.js} +40 -49
  350. package/dist/{sidebar-CmvwjnVb.js → sidebar-BViy8Eeu.js} +17 -9
  351. package/dist/{sidebar-Dz7bd3zP.js → sidebar-BbVIQvlP.js} +1 -1
  352. package/dist/{sidebar-CVUGHOS_.cjs → sidebar-BxGXsDAd.cjs} +16 -8
  353. package/dist/sidebar-CK_0ZQHj.cjs +803 -0
  354. package/dist/sidebar-CUuOvYhK.js +787 -0
  355. package/dist/{sidebar-B3EYhli0.cjs → sidebar-CeTMuzOx.cjs} +128 -47
  356. package/dist/{sidebar-KIS0C2JH.js → sidebar-CrQDDdcz.js} +24 -33
  357. package/dist/{sidebar-zowjejT2.cjs → sidebar-DAaY8bRU.cjs} +24 -33
  358. package/dist/{sidebar-B9NR0lCe.cjs → sidebar-DQj1z3jG.cjs} +227 -269
  359. package/dist/sidebar-Djn5syhi.cjs +786 -0
  360. package/dist/sidebar-LluMXfam.js +759 -0
  361. package/dist/sidebar-_rT7rBMk.js +787 -0
  362. package/dist/{sidebar-BvF5I2Ue.cjs → sidebar-nzPoVHBQ.cjs} +41 -46
  363. package/dist/{sidebar-C5B_LHek.cjs → sidebar-q7P2Godd.cjs} +1 -1
  364. package/dist/slider-Bc5Hd0y1.js +56 -0
  365. package/dist/slider-N7hFFj6X.cjs +73 -0
  366. package/dist/tooltip-Ded96neP.cjs +137 -0
  367. package/dist/tooltip-HDOoD2-0.js +120 -0
  368. package/dist/ui.cjs.js +2 -2
  369. package/dist/ui.es.js +2 -2
  370. package/dist/use-audio-player-B31J-aqh.cjs +187 -0
  371. package/dist/use-audio-player-BkmEmj8Q.js +185 -0
  372. package/dist/use-audio-player-CLFTWFW1.cjs +184 -0
  373. package/dist/use-audio-player-CLLn00I6.js +188 -0
  374. package/dist/{use-audio-player-Dn1NR9xN.cjs → use-audio-player-NKsWyjWu.cjs} +7 -3
  375. package/dist/{use-audio-player-Bkh23vQ3.js → use-audio-player-nv8ZSGa1.js} +7 -3
  376. package/dist/use-file-upload-BcjEo2S5.js +404 -0
  377. package/dist/use-file-upload-CRJR68Tj.cjs +403 -0
  378. package/dist/use-mobile-B0hNy_Y6.cjs +4303 -0
  379. package/dist/use-mobile-BXuYROXM.js +4202 -0
  380. package/dist/use-mobile-Bbd51ASU.cjs +4392 -0
  381. package/dist/use-mobile-Bk6CX-TC.js +4359 -0
  382. package/dist/use-mobile-BvYdisLP.js +4202 -0
  383. package/dist/use-mobile-BzuxjzNX.cjs +4392 -0
  384. package/dist/use-mobile-CG2-SdXV.cjs +4235 -0
  385. package/dist/use-mobile-CKb5pqTs.js +4269 -0
  386. package/dist/use-mobile-CYuAuGDl.js +4202 -0
  387. package/dist/use-mobile-CaENcqm-.js +4508 -0
  388. package/dist/use-mobile-CbrYgJGJ.js +4203 -0
  389. package/dist/use-mobile-Cd4xPrKq.cjs +46 -0
  390. package/dist/use-mobile-DMOvImGQ.cjs +4542 -0
  391. package/dist/use-mobile-DRB3BQgD.cjs +4235 -0
  392. package/dist/use-mobile-DZvv7QMR.js +4359 -0
  393. package/dist/use-mobile-DdI_TXam.cjs +4235 -0
  394. package/dist/use-mobile-DlceKf8a.js +4359 -0
  395. package/dist/use-mobile-DsOnow1o.cjs +4236 -0
  396. package/dist/use-mobile-Kcj6jSnK.cjs +4392 -0
  397. package/dist/use-mobile-bnKcua_i.js +4202 -0
  398. package/dist/use-mobile-j4w2Jrf1.js +30 -0
  399. package/dist/use-mobile-ncXBeE2z.cjs +4235 -0
  400. package/dist/use-rich-text-editor-DjiddBGv.js +282 -0
  401. package/dist/use-rich-text-editor-lpeswbCs.cjs +281 -0
  402. package/dist/xertica-assistant-BdiZag0h.js +2187 -0
  403. package/dist/xertica-assistant-CrgTb6Hs.cjs +2155 -0
  404. package/dist/xertica-assistant-CyikE3N_.js +2173 -0
  405. package/dist/xertica-assistant-DCsnQyi5.js +2156 -0
  406. package/dist/xertica-assistant-DUBpmEgo.cjs +2186 -0
  407. package/dist/xertica-assistant-QFUnv5I2.cjs +2180 -0
  408. package/dist/{xertica-assistant-Bj3vBCq_.cjs → xertica-assistant-V_IdW4WF.cjs} +27 -9
  409. package/dist/{xertica-assistant-BMqdyRVi.js → xertica-assistant-ciJaWqm1.js} +28 -10
  410. package/dist/{xertica-assistant-B1IaHXnB.cjs → xertica-assistant-dyP7KHM5.cjs} +533 -392
  411. package/dist/{xertica-assistant-DPsESB6t.js → xertica-assistant-yX1CFBBo.js} +535 -394
  412. package/dist/xertica-ui.css +2 -2
  413. package/docs/architecture-improvements.md +456 -456
  414. package/docs/architecture.md +312 -312
  415. package/docs/components/assistant.md +428 -428
  416. package/docs/components/branding.md +252 -252
  417. package/docs/components/card-patterns.md +447 -447
  418. package/docs/components/error-boundary.md +201 -201
  419. package/docs/components/hooks.md +432 -432
  420. package/docs/components/language-selector.md +176 -176
  421. package/docs/components/pages.md +323 -323
  422. package/docs/components/sidebar.md +19 -2
  423. package/docs/components/stats-card.md +20 -2
  424. package/docs/doc-audit.md +244 -244
  425. package/docs/getting-started.md +616 -616
  426. package/docs/guidelines.md +330 -330
  427. package/docs/i18n.md +480 -480
  428. package/docs/installation.md +268 -268
  429. package/docs/llms.md +295 -295
  430. package/docs/state-management.md +289 -289
  431. package/guidelines/Guidelines.md +409 -409
  432. package/llms-compact.txt +30 -1
  433. package/llms-full.txt +11553 -7133
  434. package/llms.txt +1 -1
  435. package/package.json +219 -219
  436. package/styles/xertica/base.css +90 -90
  437. package/styles/xertica/tokens.css +9 -9
  438. package/templates/.prettierignore +4 -4
  439. package/templates/.prettierrc +10 -10
  440. package/templates/CLAUDE.md +180 -180
  441. package/templates/guidelines/Guidelines.md +865 -577
  442. package/templates/package.json +69 -69
  443. package/templates/src/app/App.tsx +46 -46
  444. package/templates/src/app/components/AuthGuard.tsx +131 -131
  445. package/templates/src/features/assistant/data/mock.ts +75 -75
  446. package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
  447. package/templates/src/features/assistant/index.ts +5 -5
  448. package/templates/src/features/auth/ui/AuthPageShell.tsx +32 -32
  449. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  450. package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
  451. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -183
  452. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
  453. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -80
  454. package/templates/src/features/home/data/mock.ts +41 -41
  455. package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
  456. package/templates/src/features/home/index.ts +11 -11
  457. package/templates/src/features/home/ui/HomeContent.tsx +117 -117
  458. package/templates/src/features/template/ui/CrudTemplate.tsx +112 -112
  459. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
  460. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  461. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
  462. package/templates/src/features/template/ui/TemplateContent.tsx +1322 -1322
  463. package/templates/src/i18n.ts +124 -124
  464. package/templates/src/locales/en/common.json +21 -21
  465. package/templates/src/locales/en/components/activityCard.json +10 -10
  466. package/templates/src/locales/en/components/assistant.json +119 -119
  467. package/templates/src/locales/en/components/media.json +29 -29
  468. package/templates/src/locales/en/components/notificationCard.json +5 -5
  469. package/templates/src/locales/en/components/profileCard.json +8 -8
  470. package/templates/src/locales/en/components/projectCard.json +10 -10
  471. package/templates/src/locales/en/components/sidebar.json +14 -14
  472. package/templates/src/locales/en/components/stats.json +8 -8
  473. package/templates/src/locales/en/components/team.json +14 -14
  474. package/templates/src/locales/en/errors.json +9 -9
  475. package/templates/src/locales/en/languageSelector.json +7 -7
  476. package/templates/src/locales/en/nav.json +6 -6
  477. package/templates/src/locales/en/pages/crudTemplate.json +25 -25
  478. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
  479. package/templates/src/locales/en/pages/forgotPassword.json +10 -10
  480. package/templates/src/locales/en/pages/formTemplate.json +16 -16
  481. package/templates/src/locales/en/pages/home.json +7 -7
  482. package/templates/src/locales/en/pages/login.json +15 -15
  483. package/templates/src/locales/en/pages/loginTemplate.json +9 -9
  484. package/templates/src/locales/en/pages/resetPassword.json +18 -18
  485. package/templates/src/locales/en/pages/templates.json +317 -317
  486. package/templates/src/locales/en/pages/verifyEmail.json +12 -12
  487. package/templates/src/locales/en/themeToggle.json +6 -6
  488. package/templates/src/locales/es/common.json +21 -21
  489. package/templates/src/locales/es/components/activityCard.json +10 -10
  490. package/templates/src/locales/es/components/assistant.json +119 -119
  491. package/templates/src/locales/es/components/media.json +29 -29
  492. package/templates/src/locales/es/components/notificationCard.json +5 -5
  493. package/templates/src/locales/es/components/profileCard.json +8 -8
  494. package/templates/src/locales/es/components/projectCard.json +10 -10
  495. package/templates/src/locales/es/components/sidebar.json +14 -14
  496. package/templates/src/locales/es/components/stats.json +8 -8
  497. package/templates/src/locales/es/components/team.json +14 -14
  498. package/templates/src/locales/es/errors.json +9 -9
  499. package/templates/src/locales/es/languageSelector.json +7 -7
  500. package/templates/src/locales/es/nav.json +6 -6
  501. package/templates/src/locales/es/pages/crudTemplate.json +25 -25
  502. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
  503. package/templates/src/locales/es/pages/forgotPassword.json +10 -10
  504. package/templates/src/locales/es/pages/formTemplate.json +16 -16
  505. package/templates/src/locales/es/pages/home.json +7 -7
  506. package/templates/src/locales/es/pages/login.json +15 -15
  507. package/templates/src/locales/es/pages/loginTemplate.json +9 -9
  508. package/templates/src/locales/es/pages/resetPassword.json +18 -18
  509. package/templates/src/locales/es/pages/templates.json +317 -317
  510. package/templates/src/locales/es/pages/verifyEmail.json +12 -12
  511. package/templates/src/locales/es/themeToggle.json +6 -6
  512. package/templates/src/locales/pt-BR/common.json +21 -21
  513. package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
  514. package/templates/src/locales/pt-BR/components/assistant.json +119 -119
  515. package/templates/src/locales/pt-BR/components/media.json +29 -29
  516. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
  517. package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
  518. package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
  519. package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
  520. package/templates/src/locales/pt-BR/components/stats.json +8 -8
  521. package/templates/src/locales/pt-BR/components/team.json +14 -14
  522. package/templates/src/locales/pt-BR/errors.json +9 -9
  523. package/templates/src/locales/pt-BR/languageSelector.json +7 -7
  524. package/templates/src/locales/pt-BR/nav.json +6 -6
  525. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
  526. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
  527. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -10
  528. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
  529. package/templates/src/locales/pt-BR/pages/home.json +7 -7
  530. package/templates/src/locales/pt-BR/pages/login.json +15 -15
  531. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
  532. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
  533. package/templates/src/locales/pt-BR/pages/templates.json +317 -317
  534. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
  535. package/templates/src/locales/pt-BR/themeToggle.json +6 -6
  536. package/templates/src/pages/AssistantPage.tsx +470 -470
  537. package/templates/src/pages/HomePage.tsx +53 -53
  538. package/templates/src/shared/error-boundary.tsx +150 -150
  539. package/templates/src/shared/error-fallbacks.tsx +222 -222
  540. package/templates/src/styles/xertica/tokens.css +9 -9
  541. package/templates/vite.config.js +20 -20
  542. package/templates/vite.config.ts +55 -55
  543. package/dist/ThemeContext-CpqYShLq.cjs +0 -324
  544. package/dist/ThemeContext-Du2nE1PL.js +0 -325
  545. package/dist/ThemeContext-GeEBTJ3q.cjs +0 -1621
  546. package/dist/ThemeContext-JyLK9B1o.js +0 -1622
  547. package/dist/VerifyEmailPage-BiRm7Nh4.cjs +0 -3213
  548. package/dist/VerifyEmailPage-hdB8JQGv.cjs +0 -3213
  549. package/dist/VerifyEmailPage-vYHbYK3q.js +0 -3214
  550. package/dist/XerticaProvider-CUYJZc32.js +0 -49
  551. package/dist/XerticaProvider-CjQAQPcn.cjs +0 -48
  552. package/dist/XerticaProvider-D5lLumH-.js +0 -49
  553. package/dist/XerticaProvider-qQUDop71.cjs +0 -48
  554. package/dist/XerticaXLogo-BWaag64t.js +0 -252
  555. package/dist/XerticaXLogo-CU-U-GP4.cjs +0 -251
  556. package/dist/index-CkTUgOwX.js +0 -8
  557. package/dist/sidebar-OTO_up7Z.js +0 -801
  558. package/dist/{rich-text-editor-BmsjY03B.js → rich-text-editor-DgF8s7xW.js} +26 -26
  559. package/dist/{rich-text-editor-GS2kpTAK.cjs → rich-text-editor-mWoaSCE4.cjs} +26 -26
@@ -11,7 +11,7 @@ const TogglePrimitive = require("@radix-ui/react-toggle");
11
11
  const inputOtp = require("input-otp");
12
12
  const reactSlot = require("@radix-ui/react-slot");
13
13
  const reactHookForm = require("react-hook-form");
14
- const alertDialog = require("./alert-dialog-yckpaOpy.cjs");
14
+ const alertDialog = require("./alert-dialog-DSKByiKZ.cjs");
15
15
  const reactDayPicker = require("react-day-picker");
16
16
  const DialogPrimitive = require("@radix-ui/react-dialog");
17
17
  const vaul = require("vaul");
@@ -19,12 +19,12 @@ const HoverCardPrimitive = require("@radix-ui/react-hover-card");
19
19
  const ContextMenuPrimitive = require("@radix-ui/react-context-menu");
20
20
  const MenubarPrimitive = require("@radix-ui/react-menubar");
21
21
  const cmdk = require("cmdk");
22
- const richTextEditor = require("./rich-text-editor-DbV-S7Fi.cjs");
22
+ const richTextEditor = require("./rich-text-editor-CeucBdIv.cjs");
23
23
  const card = require("./card-DJTsYhLL.cjs");
24
24
  const CollapsiblePrimitive = require("@radix-ui/react-collapsible");
25
25
  const AccordionPrimitive = require("@radix-ui/react-accordion");
26
26
  const useEmblaCarousel = require("embla-carousel-react");
27
- const googleMapsLoader = require("./google-maps-loader-BqsYL48U.cjs");
27
+ const googleMapsLoader = require("./google-maps-loader-Y-QkD-Li.cjs");
28
28
  const RechartsPrimitive = require("recharts");
29
29
  var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
30
30
  function _interopNamespaceDefault(e) {
@@ -511,20 +511,26 @@ function PaginationItem({ ...props }) {
511
511
  function PaginationLink({
512
512
  className,
513
513
  isActive,
514
+ disabled,
514
515
  size = "icon",
516
+ href,
515
517
  ...props
516
518
  }) {
517
519
  return /* @__PURE__ */ jsxRuntime.jsx(
518
520
  "a",
519
521
  {
520
522
  "aria-current": isActive ? "page" : void 0,
523
+ "aria-disabled": disabled || void 0,
524
+ tabIndex: disabled ? -1 : void 0,
521
525
  "data-slot": "pagination-link",
522
526
  "data-active": isActive,
527
+ href: disabled ? void 0 : href ?? "#",
523
528
  className: button.cn(
524
529
  button.buttonVariants({
525
530
  variant: isActive ? "outline" : "ghost",
526
531
  size
527
532
  }),
533
+ disabled && "pointer-events-none opacity-50",
528
534
  className
529
535
  ),
530
536
  ...props
@@ -533,6 +539,7 @@ function PaginationLink({
533
539
  }
534
540
  function PaginationPrevious({
535
541
  className,
542
+ disabled,
536
543
  ...props
537
544
  }) {
538
545
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -540,6 +547,7 @@ function PaginationPrevious({
540
547
  {
541
548
  "aria-label": "Go to previous page",
542
549
  size: "default",
550
+ disabled,
543
551
  className: button.cn("gap-1 px-2.5 sm:pl-2.5", className),
544
552
  ...props,
545
553
  children: [
@@ -551,6 +559,7 @@ function PaginationPrevious({
551
559
  }
552
560
  function PaginationNext({
553
561
  className,
562
+ disabled,
554
563
  ...props
555
564
  }) {
556
565
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -558,6 +567,7 @@ function PaginationNext({
558
567
  {
559
568
  "aria-label": "Go to next page",
560
569
  size: "default",
570
+ disabled,
561
571
  className: button.cn("gap-1 px-2.5 sm:pr-2.5", className),
562
572
  ...props,
563
573
  children: [
@@ -585,6 +595,71 @@ function PaginationEllipsis({
585
595
  }
586
596
  );
587
597
  }
598
+ function usePagination({
599
+ totalItems,
600
+ pageSize = 10,
601
+ initialPage = 1,
602
+ page: controlledPage,
603
+ onPageChange,
604
+ siblingCount = 1
605
+ }) {
606
+ const [internalPage, setInternalPage] = React.useState(initialPage);
607
+ const isControlled = controlledPage !== void 0;
608
+ const currentPage = isControlled ? controlledPage : internalPage;
609
+ const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
610
+ const setPage = React.useCallback(
611
+ (p) => {
612
+ const clamped = Math.min(Math.max(1, p), totalPages);
613
+ if (!isControlled) setInternalPage(clamped);
614
+ onPageChange == null ? void 0 : onPageChange(clamped);
615
+ },
616
+ [isControlled, onPageChange, totalPages]
617
+ );
618
+ const startIndex = (currentPage - 1) * pageSize;
619
+ const endIndex = Math.min(startIndex + pageSize, totalItems);
620
+ const canGoPrev = currentPage > 1;
621
+ const canGoNext = currentPage < totalPages;
622
+ const isFirstPage = currentPage === 1;
623
+ const isLastPage = currentPage === totalPages;
624
+ const items = React.useMemo(() => {
625
+ const pageSet = /* @__PURE__ */ new Set();
626
+ pageSet.add(1);
627
+ if (totalPages > 1) pageSet.add(totalPages);
628
+ for (let p = Math.max(2, currentPage - siblingCount); p <= Math.min(totalPages - 1, currentPage + siblingCount); p++) {
629
+ pageSet.add(p);
630
+ }
631
+ const sorted = Array.from(pageSet).sort((a, b) => a - b);
632
+ const result = [];
633
+ for (let i = 0; i < sorted.length; i++) {
634
+ result.push({ type: "page", page: sorted[i] });
635
+ if (i < sorted.length - 1 && sorted[i + 1] - sorted[i] > 1) {
636
+ result.push({ type: "ellipsis", key: `ellipsis-${sorted[i]}` });
637
+ }
638
+ }
639
+ return result;
640
+ }, [currentPage, siblingCount, totalPages]);
641
+ const goTo = React.useCallback((p) => setPage(p), [setPage]);
642
+ const next = React.useCallback(() => setPage(currentPage + 1), [currentPage, setPage]);
643
+ const prev = React.useCallback(() => setPage(currentPage - 1), [currentPage, setPage]);
644
+ const first = React.useCallback(() => setPage(1), [setPage]);
645
+ const last = React.useCallback(() => setPage(totalPages), [setPage, totalPages]);
646
+ return {
647
+ currentPage,
648
+ totalPages,
649
+ startIndex,
650
+ endIndex,
651
+ canGoPrev,
652
+ canGoNext,
653
+ isFirstPage,
654
+ isLastPage,
655
+ items,
656
+ goTo,
657
+ next,
658
+ prev,
659
+ first,
660
+ last
661
+ };
662
+ }
588
663
  const toggleVariants = classVarianceAuthority.cva(
589
664
  "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
590
665
  {
@@ -2083,33 +2158,39 @@ const TimelineDescription = React__namespace.forwardRef(({ className, ...props }
2083
2158
  }
2084
2159
  ));
2085
2160
  TimelineDescription.displayName = "TimelineDescription";
2086
- const TreeView = React__namespace.forwardRef(
2087
- ({ className, data, onNodeClick, onNodeSelect, defaultExpanded = [], selectedNodeId, ...props }, ref) => {
2088
- const [expanded, setExpanded] = React__namespace.useState(new Set(defaultExpanded));
2089
- const [internalSelectedId, setInternalSelectedId] = React__namespace.useState(void 0);
2090
- const nodeRefs = React__namespace.useRef(/* @__PURE__ */ new Map());
2091
- const isControlled = selectedNodeId !== void 0;
2092
- const effectiveSelectedId = isControlled ? selectedNodeId : internalSelectedId;
2093
- const toggleExpand = (nodeId) => {
2094
- setExpanded((prev) => {
2095
- const next = new Set(prev);
2096
- next.has(nodeId) ? next.delete(nodeId) : next.add(nodeId);
2097
- return next;
2098
- });
2161
+ function useTreeView({
2162
+ data,
2163
+ defaultExpanded = [],
2164
+ selectedNodeId,
2165
+ onNodeClick,
2166
+ onNodeSelect
2167
+ }) {
2168
+ const [expanded, setExpanded] = React.useState(new Set(defaultExpanded));
2169
+ const [internalSelectedId, setInternalSelectedId] = React.useState(void 0);
2170
+ const nodeRefs = React.useRef(/* @__PURE__ */ new Map());
2171
+ const isControlled = selectedNodeId !== void 0;
2172
+ const effectiveSelectedId = isControlled ? selectedNodeId : internalSelectedId;
2173
+ const getNodeRef = React.useCallback(
2174
+ (nodeId) => (el) => {
2175
+ if (el) nodeRefs.current.set(nodeId, el);
2176
+ else nodeRefs.current.delete(nodeId);
2177
+ },
2178
+ []
2179
+ );
2180
+ const getVisibleNodes = React.useCallback(() => {
2181
+ const result = [];
2182
+ const traverse = (nodes) => {
2183
+ var _a;
2184
+ for (const node of nodes) {
2185
+ result.push(node);
2186
+ if (((_a = node.children) == null ? void 0 : _a.length) && expanded.has(node.id)) traverse(node.children);
2187
+ }
2099
2188
  };
2100
- const getVisibleNodes = React__namespace.useCallback(() => {
2101
- const result = [];
2102
- const traverse = (nodes) => {
2103
- var _a;
2104
- for (const node of nodes) {
2105
- result.push(node);
2106
- if (((_a = node.children) == null ? void 0 : _a.length) && expanded.has(node.id)) traverse(node.children);
2107
- }
2108
- };
2109
- traverse(data);
2110
- return result;
2111
- }, [data, expanded]);
2112
- const findParent = (nodes, targetId) => {
2189
+ traverse(data);
2190
+ return result;
2191
+ }, [data, expanded]);
2192
+ const findParent = React.useCallback(
2193
+ (nodes, targetId) => {
2113
2194
  var _a;
2114
2195
  for (const n of nodes) {
2115
2196
  if ((_a = n.children) == null ? void 0 : _a.some((c) => c.id === targetId)) return n;
@@ -2119,13 +2200,28 @@ const TreeView = React__namespace.forwardRef(
2119
2200
  }
2120
2201
  }
2121
2202
  return null;
2122
- };
2123
- const handleSelect = (node) => {
2203
+ },
2204
+ // findParent is a pure recursive function over `data` — no reactive deps needed
2205
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2206
+ []
2207
+ );
2208
+ const toggleExpand = React.useCallback((nodeId) => {
2209
+ setExpanded((prev) => {
2210
+ const next = new Set(prev);
2211
+ next.has(nodeId) ? next.delete(nodeId) : next.add(nodeId);
2212
+ return next;
2213
+ });
2214
+ }, []);
2215
+ const handleSelect = React.useCallback(
2216
+ (node) => {
2124
2217
  if (!isControlled) setInternalSelectedId(node.id);
2125
2218
  onNodeSelect == null ? void 0 : onNodeSelect(node);
2126
2219
  onNodeClick == null ? void 0 : onNodeClick(node);
2127
- };
2128
- const handleKeyDown = (e, node) => {
2220
+ },
2221
+ [isControlled, onNodeClick, onNodeSelect]
2222
+ );
2223
+ const handleKeyDown = React.useCallback(
2224
+ (e, node) => {
2129
2225
  var _a, _b;
2130
2226
  const visibleNodes = getVisibleNodes();
2131
2227
  const idx = visibleNodes.findIndex((n) => n.id === node.id);
@@ -2178,26 +2274,60 @@ const TreeView = React__namespace.forwardRef(
2178
2274
  if (last) focusNode(last.id);
2179
2275
  break;
2180
2276
  }
2181
- case "Enter":
2182
2277
  case " ": {
2278
+ e.preventDefault();
2279
+ if (hasChildren) {
2280
+ toggleExpand(node.id);
2281
+ } else {
2282
+ handleSelect(node);
2283
+ }
2284
+ break;
2285
+ }
2286
+ case "Enter": {
2183
2287
  e.preventDefault();
2184
2288
  if (hasChildren) toggleExpand(node.id);
2185
2289
  handleSelect(node);
2186
2290
  break;
2187
2291
  }
2188
2292
  }
2189
- };
2190
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: button.cn("w-full", className), role: "tree", ...props, children: data.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
2293
+ },
2294
+ [data, expanded, findParent, getVisibleNodes, handleSelect, toggleExpand]
2295
+ );
2296
+ return {
2297
+ expanded,
2298
+ effectiveSelectedId,
2299
+ nodeRefs,
2300
+ getNodeRef,
2301
+ toggleExpand,
2302
+ handleSelect,
2303
+ handleKeyDown,
2304
+ getVisibleNodes
2305
+ };
2306
+ }
2307
+ const TreeView = React__namespace.forwardRef(
2308
+ ({ className, data, onNodeClick, onNodeSelect, defaultExpanded = [], selectedNodeId, ariaLabel, ...props }, ref) => {
2309
+ var _a;
2310
+ const {
2311
+ expanded,
2312
+ effectiveSelectedId,
2313
+ getNodeRef,
2314
+ toggleExpand,
2315
+ handleSelect,
2316
+ handleKeyDown
2317
+ } = useTreeView({ data, defaultExpanded, selectedNodeId, onNodeClick, onNodeSelect });
2318
+ const focusableId = effectiveSelectedId ?? ((_a = data[0]) == null ? void 0 : _a.id);
2319
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: button.cn("w-full", className), role: "tree", "aria-label": ariaLabel ?? "Navegação em árvore", ...props, children: data.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
2191
2320
  TreeNodeComponent,
2192
2321
  {
2193
2322
  node,
2194
2323
  level: 0,
2195
2324
  expanded,
2196
2325
  selectedId: effectiveSelectedId,
2326
+ focusableId,
2197
2327
  onToggle: toggleExpand,
2198
2328
  onSelect: handleSelect,
2199
2329
  onKeyDown: handleKeyDown,
2200
- nodeRefs
2330
+ getNodeRef
2201
2331
  },
2202
2332
  node.id
2203
2333
  )) });
@@ -2209,10 +2339,11 @@ const TreeNodeComponent = ({
2209
2339
  level,
2210
2340
  expanded,
2211
2341
  selectedId,
2342
+ focusableId,
2212
2343
  onToggle,
2213
2344
  onSelect,
2214
2345
  onKeyDown,
2215
- nodeRefs
2346
+ getNodeRef
2216
2347
  }) => {
2217
2348
  var _a;
2218
2349
  const hasChildren = !!((_a = node.children) == null ? void 0 : _a.length);
@@ -2222,19 +2353,15 @@ const TreeNodeComponent = ({
2222
2353
  if (hasChildren) onToggle(node.id);
2223
2354
  onSelect(node);
2224
2355
  };
2225
- const setRef = (el) => {
2226
- if (el) nodeRefs.current.set(node.id, el);
2227
- else nodeRefs.current.delete(node.id);
2228
- };
2229
2356
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "none", children: [
2230
2357
  /* @__PURE__ */ jsxRuntime.jsxs(
2231
2358
  "button",
2232
2359
  {
2233
- ref: setRef,
2360
+ ref: getNodeRef(node.id),
2234
2361
  role: "treeitem",
2235
2362
  "aria-expanded": hasChildren ? isExpanded : void 0,
2236
2363
  "aria-selected": isSelected,
2237
- tabIndex: isSelected ? 0 : -1,
2364
+ tabIndex: node.id === focusableId ? 0 : -1,
2238
2365
  onClick: handleClick,
2239
2366
  onKeyDown: (e) => onKeyDown(e, node),
2240
2367
  className: button.cn(
@@ -2257,10 +2384,11 @@ const TreeNodeComponent = ({
2257
2384
  level: level + 1,
2258
2385
  expanded,
2259
2386
  selectedId,
2387
+ focusableId,
2260
2388
  onToggle,
2261
2389
  onSelect,
2262
2390
  onKeyDown,
2263
- nodeRefs
2391
+ getNodeRef
2264
2392
  },
2265
2393
  child.id
2266
2394
  )) })
@@ -2533,9 +2661,9 @@ function CarouselNext({
2533
2661
  );
2534
2662
  }
2535
2663
  const StepperContext = React__namespace.createContext(void 0);
2536
- const useStepper = () => {
2664
+ const useStepperContext = () => {
2537
2665
  const context = React__namespace.useContext(StepperContext);
2538
- if (!context) throw new Error("useStepper must be used within a Stepper");
2666
+ if (!context) throw new Error("useStepperContext must be used within a Stepper");
2539
2667
  return context;
2540
2668
  };
2541
2669
  const Stepper = React__namespace.forwardRef(
@@ -2547,9 +2675,17 @@ const Stepper = React__namespace.forwardRef(
2547
2675
  ref,
2548
2676
  className: button.cn("w-full", className),
2549
2677
  ...props,
2550
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn(
2551
- orientation === "horizontal" ? "flex items-start justify-between" : "flex flex-col gap-0"
2552
- ), children })
2678
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2679
+ "div",
2680
+ {
2681
+ className: button.cn(
2682
+ orientation === "horizontal" ? "flex items-start justify-between" : "flex flex-col gap-0"
2683
+ ),
2684
+ role: "list",
2685
+ "aria-label": `Progresso: etapa ${currentStep} de ${totalSteps}`,
2686
+ children
2687
+ }
2688
+ )
2553
2689
  }
2554
2690
  ) });
2555
2691
  }
@@ -2557,7 +2693,7 @@ const Stepper = React__namespace.forwardRef(
2557
2693
  Stepper.displayName = "Stepper";
2558
2694
  const Step = React__namespace.forwardRef(
2559
2695
  ({ step, label, description, error = false, className, ...props }, ref) => {
2560
- const { currentStep, totalSteps, orientation } = useStepper();
2696
+ const { currentStep, totalSteps, orientation } = useStepperContext();
2561
2697
  const isActive = step === currentStep;
2562
2698
  const isCompleted = step < currentStep && !error;
2563
2699
  const isFirst = step === 1;
@@ -2571,54 +2707,120 @@ const Step = React__namespace.forwardRef(
2571
2707
  );
2572
2708
  const connectorClasses = (filled) => button.cn("transition-colors", filled ? "bg-primary" : "bg-muted");
2573
2709
  if (orientation === "vertical") {
2574
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: button.cn("flex gap-4", className), ...props, children: [
2575
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2576
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: step }) }),
2577
- !isLast && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("w-0.5 flex-1 min-h-[2rem] mt-1", connectorClasses(step < currentStep)) })
2578
- ] }),
2579
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: button.cn("pb-6", isLast && "pb-0"), children: [
2580
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2581
- description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2582
- ] })
2583
- ] });
2584
- }
2585
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: button.cn("flex flex-1 flex-col items-center", className), ...props, children: [
2586
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-start", children: [
2587
- step > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step <= currentStep)) }),
2588
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: step }) }),
2589
- step < totalSteps && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step < currentStep)) })
2590
- ] }),
2591
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: button.cn(
2592
- "mt-2 px-1",
2593
- isFirst && "text-left self-start",
2594
- isLast && "text-right self-end",
2595
- !isFirst && !isLast && "text-center w-full"
2596
- ), children: [
2597
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2598
- description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2599
- ] })
2600
- ] });
2710
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2711
+ "div",
2712
+ {
2713
+ ref,
2714
+ className: button.cn("flex gap-4", className),
2715
+ role: "listitem",
2716
+ "aria-current": isActive ? "step" : void 0,
2717
+ "aria-label": `Etapa ${step}: ${label}${isCompleted ? ", concluída" : isActive ? ", atual" : ""}`,
2718
+ ...props,
2719
+ children: [
2720
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2721
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: step }) }),
2722
+ !isLast && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("w-0.5 flex-1 min-h-[2rem] mt-1", connectorClasses(step < currentStep)) })
2723
+ ] }),
2724
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: button.cn("pb-6", isLast && "pb-0"), children: [
2725
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2726
+ description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2727
+ ] })
2728
+ ]
2729
+ }
2730
+ );
2731
+ }
2732
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2733
+ "div",
2734
+ {
2735
+ ref,
2736
+ className: button.cn("flex flex-1 flex-col items-center", className),
2737
+ role: "listitem",
2738
+ "aria-current": isActive ? "step" : void 0,
2739
+ "aria-label": `Etapa ${step}: ${label}${isCompleted ? ", concluída" : isActive ? ", atual" : ""}`,
2740
+ ...props,
2741
+ children: [
2742
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-start", children: [
2743
+ step > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step <= currentStep)) }),
2744
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: step }) }),
2745
+ step < totalSteps && /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step < currentStep)) })
2746
+ ] }),
2747
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: button.cn(
2748
+ "mt-2 px-1",
2749
+ isFirst && "text-left self-start",
2750
+ isLast && "text-right self-end",
2751
+ !isFirst && !isLast && "text-center w-full"
2752
+ ), children: [
2753
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2754
+ description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2755
+ ] })
2756
+ ]
2757
+ }
2758
+ );
2601
2759
  }
2602
2760
  );
2603
2761
  Step.displayName = "Step";
2604
- const FileUpload = React__namespace.forwardRef(
2605
- ({
2606
- className,
2607
- onFilesChange,
2608
- maxFiles = 1,
2609
- maxSize = 5 * 1024 * 1024,
2610
- // 5MB default
2611
- showPreview = true,
2612
- onError,
2613
- accept,
2614
- disabled,
2615
- ...props
2616
- }, ref) => {
2617
- const [files, setFiles] = React__namespace.useState([]);
2618
- const [dragActive, setDragActive] = React__namespace.useState(false);
2619
- const [errorMessage, setErrorMessage] = React__namespace.useState(null);
2620
- const inputRef = React__namespace.useRef(null);
2621
- const handleFiles = (newFiles) => {
2762
+ function useStepper({
2763
+ totalSteps,
2764
+ initialStep = 1,
2765
+ step: controlledStep,
2766
+ onStepChange,
2767
+ onBeforeNext
2768
+ }) {
2769
+ const [internalStep, setInternalStep] = React.useState(() => Math.min(Math.max(1, initialStep), totalSteps));
2770
+ const isControlled = controlledStep !== void 0;
2771
+ const currentStep = isControlled ? controlledStep : internalStep;
2772
+ const setStep = React.useCallback(
2773
+ (s) => {
2774
+ const clamped = Math.min(Math.max(1, s), totalSteps);
2775
+ if (!isControlled) setInternalStep(clamped);
2776
+ onStepChange == null ? void 0 : onStepChange(clamped);
2777
+ },
2778
+ [isControlled, onStepChange, totalSteps]
2779
+ );
2780
+ const isFirstStep = currentStep === 1;
2781
+ const isLastStep = currentStep === totalSteps;
2782
+ const canGoPrev = currentStep > 1;
2783
+ const canGoNext = currentStep < totalSteps;
2784
+ const next = React.useCallback(async () => {
2785
+ if (!canGoNext) return;
2786
+ if (onBeforeNext) {
2787
+ const allowed = await onBeforeNext(currentStep);
2788
+ if (!allowed) return;
2789
+ }
2790
+ setStep(currentStep + 1);
2791
+ }, [canGoNext, currentStep, onBeforeNext, setStep]);
2792
+ const prev = React.useCallback(() => {
2793
+ if (!canGoPrev) return;
2794
+ setStep(currentStep - 1);
2795
+ }, [canGoPrev, currentStep, setStep]);
2796
+ const goTo = React.useCallback((s) => setStep(s), [setStep]);
2797
+ const reset = React.useCallback(() => setStep(1), [setStep]);
2798
+ return {
2799
+ currentStep,
2800
+ totalSteps,
2801
+ isFirstStep,
2802
+ isLastStep,
2803
+ canGoPrev,
2804
+ canGoNext,
2805
+ next,
2806
+ prev,
2807
+ goTo,
2808
+ reset
2809
+ };
2810
+ }
2811
+ function useFileUpload({
2812
+ maxFiles = 1,
2813
+ maxSize = 5 * 1024 * 1024,
2814
+ onFilesChange,
2815
+ onError,
2816
+ disabled = false
2817
+ } = {}) {
2818
+ const [files, setFiles] = React.useState([]);
2819
+ const [dragActive, setDragActive] = React.useState(false);
2820
+ const [errorMessage, setErrorMessage] = React.useState(null);
2821
+ const inputRef = React.useRef(null);
2822
+ const handleFiles = React.useCallback(
2823
+ (newFiles) => {
2622
2824
  if (!newFiles) return;
2623
2825
  setErrorMessage(null);
2624
2826
  const filesArray = Array.from(newFiles);
@@ -2626,52 +2828,107 @@ const FileUpload = React__namespace.forwardRef(
2626
2828
  const validFiles = filesArray.filter((f) => f.size <= maxSize);
2627
2829
  if (oversized.length > 0) {
2628
2830
  const limitMB = (maxSize / 1024 / 1024).toFixed(0);
2629
- setErrorMessage(`${oversized.length} file(s) exceed the ${limitMB}MB limit and were not added.`);
2831
+ setErrorMessage(
2832
+ `${oversized.length} file(s) exceed the ${limitMB}MB limit and were not added.`
2833
+ );
2630
2834
  onError == null ? void 0 : onError(oversized, "size");
2631
2835
  }
2632
2836
  const merged = maxFiles === 1 ? validFiles.slice(0, 1) : [...files, ...validFiles].slice(0, maxFiles);
2633
2837
  const countRejected = maxFiles === 1 ? validFiles.slice(1) : [...files, ...validFiles].slice(maxFiles);
2634
2838
  if (countRejected.length > 0) {
2635
- setErrorMessage(`Only ${maxFiles} file(s) allowed. ${countRejected.length} file(s) were not added.`);
2839
+ setErrorMessage(
2840
+ `Only ${maxFiles} file(s) allowed. ${countRejected.length} file(s) were not added.`
2841
+ );
2636
2842
  onError == null ? void 0 : onError(countRejected, "count");
2637
2843
  }
2638
2844
  setFiles(merged);
2639
2845
  onFilesChange == null ? void 0 : onFilesChange(merged);
2640
- };
2641
- const handleDrag = (e) => {
2642
- e.preventDefault();
2643
- e.stopPropagation();
2644
- if (e.type === "dragenter" || e.type === "dragover") {
2645
- setDragActive(true);
2646
- } else if (e.type === "dragleave") {
2647
- setDragActive(false);
2648
- }
2649
- };
2650
- const handleDrop = (e) => {
2846
+ },
2847
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2848
+ [files, maxFiles, maxSize, onError, onFilesChange]
2849
+ );
2850
+ const handleDrag = React.useCallback((e) => {
2851
+ e.preventDefault();
2852
+ e.stopPropagation();
2853
+ if (e.type === "dragenter" || e.type === "dragover") {
2854
+ setDragActive(true);
2855
+ } else if (e.type === "dragleave") {
2856
+ setDragActive(false);
2857
+ }
2858
+ }, []);
2859
+ const handleDrop = React.useCallback(
2860
+ (e) => {
2651
2861
  e.preventDefault();
2652
2862
  e.stopPropagation();
2653
2863
  setDragActive(false);
2654
2864
  if (disabled) return;
2655
2865
  handleFiles(e.dataTransfer.files);
2656
- };
2657
- const handleChange = (e) => {
2866
+ },
2867
+ [disabled, handleFiles]
2868
+ );
2869
+ const handleChange = React.useCallback(
2870
+ (e) => {
2658
2871
  e.preventDefault();
2659
2872
  if (disabled) return;
2660
2873
  handleFiles(e.target.files);
2661
- };
2662
- const removeFile = (index) => {
2663
- const updatedFiles = files.filter((_, i) => i !== index);
2664
- setFiles(updatedFiles);
2665
- onFilesChange == null ? void 0 : onFilesChange(updatedFiles);
2666
- if (updatedFiles.length === 0) setErrorMessage(null);
2667
- };
2668
- const openFileDialog = () => {
2669
- var _a;
2670
- if (!disabled) {
2671
- setErrorMessage(null);
2672
- (_a = inputRef.current) == null ? void 0 : _a.click();
2673
- }
2674
- };
2874
+ },
2875
+ [disabled, handleFiles]
2876
+ );
2877
+ const removeFile = React.useCallback(
2878
+ (index) => {
2879
+ setFiles((prev) => {
2880
+ const updated = prev.filter((_, i) => i !== index);
2881
+ onFilesChange == null ? void 0 : onFilesChange(updated);
2882
+ if (updated.length === 0) setErrorMessage(null);
2883
+ return updated;
2884
+ });
2885
+ },
2886
+ [onFilesChange]
2887
+ );
2888
+ const openFileDialog = React.useCallback(() => {
2889
+ var _a;
2890
+ if (!disabled) {
2891
+ setErrorMessage(null);
2892
+ (_a = inputRef.current) == null ? void 0 : _a.click();
2893
+ }
2894
+ }, [disabled]);
2895
+ return {
2896
+ files,
2897
+ dragActive,
2898
+ errorMessage,
2899
+ inputRef,
2900
+ handleFiles,
2901
+ handleDrag,
2902
+ handleDrop,
2903
+ handleChange,
2904
+ removeFile,
2905
+ openFileDialog
2906
+ };
2907
+ }
2908
+ const FileUpload = React__namespace.forwardRef(
2909
+ ({
2910
+ className,
2911
+ onFilesChange,
2912
+ maxFiles = 1,
2913
+ maxSize = 5 * 1024 * 1024,
2914
+ // 5MB default
2915
+ showPreview = true,
2916
+ onError,
2917
+ accept,
2918
+ disabled,
2919
+ ...props
2920
+ }, ref) => {
2921
+ const {
2922
+ files,
2923
+ dragActive,
2924
+ errorMessage,
2925
+ inputRef,
2926
+ handleDrag,
2927
+ handleDrop,
2928
+ handleChange,
2929
+ removeFile,
2930
+ openFileDialog
2931
+ } = useFileUpload({ maxFiles, maxSize, onFilesChange, onError, disabled });
2675
2932
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: button.cn("w-full", className), children: [
2676
2933
  /* @__PURE__ */ jsxRuntime.jsxs(
2677
2934
  "div",
@@ -2949,7 +3206,7 @@ const Search = React__namespace.forwardRef(
2949
3206
  }
2950
3207
  );
2951
3208
  Search.displayName = "Search";
2952
- const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false };
3209
+ const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_GEMINI_API_KEY": "AIzaSyBnoWKe4LjQzlIklON_dVXMXNUl2gvfH6U", "VITE_GOOGLE_MAPS_API_KEY": "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" };
2953
3210
  const RouteMapContent = React.forwardRef(
2954
3211
  ({ apiKey, ...props }, ref) => {
2955
3212
  const { isLoaded, loadError, load } = googleMapsLoader.useGoogleMapsLoader();
@@ -3126,7 +3383,7 @@ RouteMapContent.displayName = "RouteMapContent";
3126
3383
  const RouteMap = React.forwardRef(
3127
3384
  (props, ref) => {
3128
3385
  const { isLoaded, loadError } = googleMapsLoader.useGoogleMapsLoader();
3129
- const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-BAx9VQvb.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && void 0 || "";
3386
+ const effectiveApiKey = props.apiKey || typeof { url: typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("AssistantChart-Bdd44uBn.cjs", document.baseURI).href } !== "undefined" && __vite_import_meta_env__ && "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" || "";
3130
3387
  const isValidKey = effectiveApiKey && effectiveApiKey !== "YOUR_GOOGLE_MAPS_API_KEY_HERE" && effectiveApiKey.startsWith("AIza");
3131
3388
  if (isLoaded || isValidKey || loadError) {
3132
3389
  return /* @__PURE__ */ jsxRuntime.jsx(RouteMapContent, { ref, ...props, apiKey: effectiveApiKey });
@@ -3370,5 +3627,9 @@ exports.ToggleGroupItem = ToggleGroupItem;
3370
3627
  exports.TreeView = TreeView;
3371
3628
  exports.navigationMenuTriggerStyle = navigationMenuTriggerStyle;
3372
3629
  exports.toggleVariants = toggleVariants;
3630
+ exports.useFileUpload = useFileUpload;
3373
3631
  exports.useFormField = useFormField;
3632
+ exports.usePagination = usePagination;
3374
3633
  exports.useStepper = useStepper;
3634
+ exports.useStepperContext = useStepperContext;
3635
+ exports.useTreeView = useTreeView;