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
@@ -2,7 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
3
3
  import { GripVerticalIcon, ChevronDownIcon, MoreHorizontalIcon, ChevronRightIcon, ChevronLeftIcon, MinusIcon, ChevronLeft, ChevronRight, ChevronDown, XIcon, CheckIcon, CircleIcon, SearchIcon, TrendingUp, TrendingDown, Minus, ArrowRight, ArrowLeft, X, Check, Upload, AlertCircle, FileIcon, Star, Search as Search$1 } from "lucide-react";
4
4
  import * as React from "react";
5
- import React__default, { useRef, useEffect } from "react";
5
+ import React__default, { useState, useCallback, useMemo, useRef, useEffect } from "react";
6
6
  import { c as cn, b as buttonVariants, B as Button } from "./button-qkz7Icqf.js";
7
7
  import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
8
8
  import { cva } from "class-variance-authority";
@@ -11,7 +11,7 @@ import * as TogglePrimitive from "@radix-ui/react-toggle";
11
11
  import { OTPInput, OTPInputContext } from "input-otp";
12
12
  import { Slot } from "@radix-ui/react-slot";
13
13
  import { FormProvider, Controller, useFormContext, useFormState } from "react-hook-form";
14
- import { L as Label, M as Map$1 } from "./alert-dialog-iDe5VE5o.js";
14
+ import { L as Label, M as Map$1 } from "./alert-dialog-s-vmNkJ_.js";
15
15
  import { getDefaultClassNames, DayPicker } from "react-day-picker";
16
16
  import * as DialogPrimitive from "@radix-ui/react-dialog";
17
17
  import { Drawer as Drawer$1 } from "vaul";
@@ -19,12 +19,12 @@ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
19
19
  import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
20
20
  import * as MenubarPrimitive from "@radix-ui/react-menubar";
21
21
  import { Command as Command$1 } from "cmdk";
22
- import { k as Dialog, q as DialogHeader, t as DialogTitle, o as DialogDescription, n as DialogContent, c as ChartContainer, g as ChartTooltip, h as ChartTooltipContent } from "./rich-text-editor-BrdC5evx.js";
22
+ import { k as Dialog, q as DialogHeader, t as DialogTitle, o as DialogDescription, n as DialogContent, c as ChartContainer, g as ChartTooltip, h as ChartTooltipContent } from "./rich-text-editor-Bp3zQqMC.js";
23
23
  import { C as Card, b as CardContent } from "./card-fi8zAN-I.js";
24
24
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
25
25
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
26
26
  import useEmblaCarousel from "embla-carousel-react";
27
- import { u as useGoogleMapsLoader } from "./google-maps-loader-t2IlYBzw.js";
27
+ import { u as useGoogleMapsLoader } from "./google-maps-loader-CTYySAun.js";
28
28
  import { BarChart, CartesianGrid, XAxis, Bar } from "recharts";
29
29
  function AspectRatio({
30
30
  ...props
@@ -483,20 +483,26 @@ function PaginationItem({ ...props }) {
483
483
  function PaginationLink({
484
484
  className,
485
485
  isActive,
486
+ disabled,
486
487
  size = "icon",
488
+ href,
487
489
  ...props
488
490
  }) {
489
491
  return /* @__PURE__ */ jsx(
490
492
  "a",
491
493
  {
492
494
  "aria-current": isActive ? "page" : void 0,
495
+ "aria-disabled": disabled || void 0,
496
+ tabIndex: disabled ? -1 : void 0,
493
497
  "data-slot": "pagination-link",
494
498
  "data-active": isActive,
499
+ href: disabled ? void 0 : href ?? "#",
495
500
  className: cn(
496
501
  buttonVariants({
497
502
  variant: isActive ? "outline" : "ghost",
498
503
  size
499
504
  }),
505
+ disabled && "pointer-events-none opacity-50",
500
506
  className
501
507
  ),
502
508
  ...props
@@ -505,6 +511,7 @@ function PaginationLink({
505
511
  }
506
512
  function PaginationPrevious({
507
513
  className,
514
+ disabled,
508
515
  ...props
509
516
  }) {
510
517
  return /* @__PURE__ */ jsxs(
@@ -512,6 +519,7 @@ function PaginationPrevious({
512
519
  {
513
520
  "aria-label": "Go to previous page",
514
521
  size: "default",
522
+ disabled,
515
523
  className: cn("gap-1 px-2.5 sm:pl-2.5", className),
516
524
  ...props,
517
525
  children: [
@@ -523,6 +531,7 @@ function PaginationPrevious({
523
531
  }
524
532
  function PaginationNext({
525
533
  className,
534
+ disabled,
526
535
  ...props
527
536
  }) {
528
537
  return /* @__PURE__ */ jsxs(
@@ -530,6 +539,7 @@ function PaginationNext({
530
539
  {
531
540
  "aria-label": "Go to next page",
532
541
  size: "default",
542
+ disabled,
533
543
  className: cn("gap-1 px-2.5 sm:pr-2.5", className),
534
544
  ...props,
535
545
  children: [
@@ -557,6 +567,71 @@ function PaginationEllipsis({
557
567
  }
558
568
  );
559
569
  }
570
+ function usePagination({
571
+ totalItems,
572
+ pageSize = 10,
573
+ initialPage = 1,
574
+ page: controlledPage,
575
+ onPageChange,
576
+ siblingCount = 1
577
+ }) {
578
+ const [internalPage, setInternalPage] = useState(initialPage);
579
+ const isControlled = controlledPage !== void 0;
580
+ const currentPage = isControlled ? controlledPage : internalPage;
581
+ const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
582
+ const setPage = useCallback(
583
+ (p) => {
584
+ const clamped = Math.min(Math.max(1, p), totalPages);
585
+ if (!isControlled) setInternalPage(clamped);
586
+ onPageChange == null ? void 0 : onPageChange(clamped);
587
+ },
588
+ [isControlled, onPageChange, totalPages]
589
+ );
590
+ const startIndex = (currentPage - 1) * pageSize;
591
+ const endIndex = Math.min(startIndex + pageSize, totalItems);
592
+ const canGoPrev = currentPage > 1;
593
+ const canGoNext = currentPage < totalPages;
594
+ const isFirstPage = currentPage === 1;
595
+ const isLastPage = currentPage === totalPages;
596
+ const items = useMemo(() => {
597
+ const pageSet = /* @__PURE__ */ new Set();
598
+ pageSet.add(1);
599
+ if (totalPages > 1) pageSet.add(totalPages);
600
+ for (let p = Math.max(2, currentPage - siblingCount); p <= Math.min(totalPages - 1, currentPage + siblingCount); p++) {
601
+ pageSet.add(p);
602
+ }
603
+ const sorted = Array.from(pageSet).sort((a, b) => a - b);
604
+ const result = [];
605
+ for (let i = 0; i < sorted.length; i++) {
606
+ result.push({ type: "page", page: sorted[i] });
607
+ if (i < sorted.length - 1 && sorted[i + 1] - sorted[i] > 1) {
608
+ result.push({ type: "ellipsis", key: `ellipsis-${sorted[i]}` });
609
+ }
610
+ }
611
+ return result;
612
+ }, [currentPage, siblingCount, totalPages]);
613
+ const goTo = useCallback((p) => setPage(p), [setPage]);
614
+ const next = useCallback(() => setPage(currentPage + 1), [currentPage, setPage]);
615
+ const prev = useCallback(() => setPage(currentPage - 1), [currentPage, setPage]);
616
+ const first = useCallback(() => setPage(1), [setPage]);
617
+ const last = useCallback(() => setPage(totalPages), [setPage, totalPages]);
618
+ return {
619
+ currentPage,
620
+ totalPages,
621
+ startIndex,
622
+ endIndex,
623
+ canGoPrev,
624
+ canGoNext,
625
+ isFirstPage,
626
+ isLastPage,
627
+ items,
628
+ goTo,
629
+ next,
630
+ prev,
631
+ first,
632
+ last
633
+ };
634
+ }
560
635
  const toggleVariants = cva(
561
636
  "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",
562
637
  {
@@ -2055,33 +2130,39 @@ const TimelineDescription = React.forwardRef(({ className, ...props }, ref) => /
2055
2130
  }
2056
2131
  ));
2057
2132
  TimelineDescription.displayName = "TimelineDescription";
2058
- const TreeView = React.forwardRef(
2059
- ({ className, data, onNodeClick, onNodeSelect, defaultExpanded = [], selectedNodeId, ...props }, ref) => {
2060
- const [expanded, setExpanded] = React.useState(new Set(defaultExpanded));
2061
- const [internalSelectedId, setInternalSelectedId] = React.useState(void 0);
2062
- const nodeRefs = React.useRef(/* @__PURE__ */ new Map());
2063
- const isControlled = selectedNodeId !== void 0;
2064
- const effectiveSelectedId = isControlled ? selectedNodeId : internalSelectedId;
2065
- const toggleExpand = (nodeId) => {
2066
- setExpanded((prev) => {
2067
- const next = new Set(prev);
2068
- next.has(nodeId) ? next.delete(nodeId) : next.add(nodeId);
2069
- return next;
2070
- });
2133
+ function useTreeView({
2134
+ data,
2135
+ defaultExpanded = [],
2136
+ selectedNodeId,
2137
+ onNodeClick,
2138
+ onNodeSelect
2139
+ }) {
2140
+ const [expanded, setExpanded] = useState(new Set(defaultExpanded));
2141
+ const [internalSelectedId, setInternalSelectedId] = useState(void 0);
2142
+ const nodeRefs = useRef(/* @__PURE__ */ new Map());
2143
+ const isControlled = selectedNodeId !== void 0;
2144
+ const effectiveSelectedId = isControlled ? selectedNodeId : internalSelectedId;
2145
+ const getNodeRef = useCallback(
2146
+ (nodeId) => (el) => {
2147
+ if (el) nodeRefs.current.set(nodeId, el);
2148
+ else nodeRefs.current.delete(nodeId);
2149
+ },
2150
+ []
2151
+ );
2152
+ const getVisibleNodes = useCallback(() => {
2153
+ const result = [];
2154
+ const traverse = (nodes) => {
2155
+ var _a;
2156
+ for (const node of nodes) {
2157
+ result.push(node);
2158
+ if (((_a = node.children) == null ? void 0 : _a.length) && expanded.has(node.id)) traverse(node.children);
2159
+ }
2071
2160
  };
2072
- const getVisibleNodes = React.useCallback(() => {
2073
- const result = [];
2074
- const traverse = (nodes) => {
2075
- var _a;
2076
- for (const node of nodes) {
2077
- result.push(node);
2078
- if (((_a = node.children) == null ? void 0 : _a.length) && expanded.has(node.id)) traverse(node.children);
2079
- }
2080
- };
2081
- traverse(data);
2082
- return result;
2083
- }, [data, expanded]);
2084
- const findParent = (nodes, targetId) => {
2161
+ traverse(data);
2162
+ return result;
2163
+ }, [data, expanded]);
2164
+ const findParent = useCallback(
2165
+ (nodes, targetId) => {
2085
2166
  var _a;
2086
2167
  for (const n of nodes) {
2087
2168
  if ((_a = n.children) == null ? void 0 : _a.some((c) => c.id === targetId)) return n;
@@ -2091,13 +2172,28 @@ const TreeView = React.forwardRef(
2091
2172
  }
2092
2173
  }
2093
2174
  return null;
2094
- };
2095
- const handleSelect = (node) => {
2175
+ },
2176
+ // findParent is a pure recursive function over `data` — no reactive deps needed
2177
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2178
+ []
2179
+ );
2180
+ const toggleExpand = useCallback((nodeId) => {
2181
+ setExpanded((prev) => {
2182
+ const next = new Set(prev);
2183
+ next.has(nodeId) ? next.delete(nodeId) : next.add(nodeId);
2184
+ return next;
2185
+ });
2186
+ }, []);
2187
+ const handleSelect = useCallback(
2188
+ (node) => {
2096
2189
  if (!isControlled) setInternalSelectedId(node.id);
2097
2190
  onNodeSelect == null ? void 0 : onNodeSelect(node);
2098
2191
  onNodeClick == null ? void 0 : onNodeClick(node);
2099
- };
2100
- const handleKeyDown = (e, node) => {
2192
+ },
2193
+ [isControlled, onNodeClick, onNodeSelect]
2194
+ );
2195
+ const handleKeyDown = useCallback(
2196
+ (e, node) => {
2101
2197
  var _a, _b;
2102
2198
  const visibleNodes = getVisibleNodes();
2103
2199
  const idx = visibleNodes.findIndex((n) => n.id === node.id);
@@ -2150,26 +2246,60 @@ const TreeView = React.forwardRef(
2150
2246
  if (last) focusNode(last.id);
2151
2247
  break;
2152
2248
  }
2153
- case "Enter":
2154
2249
  case " ": {
2250
+ e.preventDefault();
2251
+ if (hasChildren) {
2252
+ toggleExpand(node.id);
2253
+ } else {
2254
+ handleSelect(node);
2255
+ }
2256
+ break;
2257
+ }
2258
+ case "Enter": {
2155
2259
  e.preventDefault();
2156
2260
  if (hasChildren) toggleExpand(node.id);
2157
2261
  handleSelect(node);
2158
2262
  break;
2159
2263
  }
2160
2264
  }
2161
- };
2162
- return /* @__PURE__ */ jsx("div", { ref, className: cn("w-full", className), role: "tree", ...props, children: data.map((node) => /* @__PURE__ */ jsx(
2265
+ },
2266
+ [data, expanded, findParent, getVisibleNodes, handleSelect, toggleExpand]
2267
+ );
2268
+ return {
2269
+ expanded,
2270
+ effectiveSelectedId,
2271
+ nodeRefs,
2272
+ getNodeRef,
2273
+ toggleExpand,
2274
+ handleSelect,
2275
+ handleKeyDown,
2276
+ getVisibleNodes
2277
+ };
2278
+ }
2279
+ const TreeView = React.forwardRef(
2280
+ ({ className, data, onNodeClick, onNodeSelect, defaultExpanded = [], selectedNodeId, ariaLabel, ...props }, ref) => {
2281
+ var _a;
2282
+ const {
2283
+ expanded,
2284
+ effectiveSelectedId,
2285
+ getNodeRef,
2286
+ toggleExpand,
2287
+ handleSelect,
2288
+ handleKeyDown
2289
+ } = useTreeView({ data, defaultExpanded, selectedNodeId, onNodeClick, onNodeSelect });
2290
+ const focusableId = effectiveSelectedId ?? ((_a = data[0]) == null ? void 0 : _a.id);
2291
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("w-full", className), role: "tree", "aria-label": ariaLabel ?? "Navegação em árvore", ...props, children: data.map((node) => /* @__PURE__ */ jsx(
2163
2292
  TreeNodeComponent,
2164
2293
  {
2165
2294
  node,
2166
2295
  level: 0,
2167
2296
  expanded,
2168
2297
  selectedId: effectiveSelectedId,
2298
+ focusableId,
2169
2299
  onToggle: toggleExpand,
2170
2300
  onSelect: handleSelect,
2171
2301
  onKeyDown: handleKeyDown,
2172
- nodeRefs
2302
+ getNodeRef
2173
2303
  },
2174
2304
  node.id
2175
2305
  )) });
@@ -2181,10 +2311,11 @@ const TreeNodeComponent = ({
2181
2311
  level,
2182
2312
  expanded,
2183
2313
  selectedId,
2314
+ focusableId,
2184
2315
  onToggle,
2185
2316
  onSelect,
2186
2317
  onKeyDown,
2187
- nodeRefs
2318
+ getNodeRef
2188
2319
  }) => {
2189
2320
  var _a;
2190
2321
  const hasChildren = !!((_a = node.children) == null ? void 0 : _a.length);
@@ -2194,19 +2325,15 @@ const TreeNodeComponent = ({
2194
2325
  if (hasChildren) onToggle(node.id);
2195
2326
  onSelect(node);
2196
2327
  };
2197
- const setRef = (el) => {
2198
- if (el) nodeRefs.current.set(node.id, el);
2199
- else nodeRefs.current.delete(node.id);
2200
- };
2201
2328
  return /* @__PURE__ */ jsxs("div", { role: "none", children: [
2202
2329
  /* @__PURE__ */ jsxs(
2203
2330
  "button",
2204
2331
  {
2205
- ref: setRef,
2332
+ ref: getNodeRef(node.id),
2206
2333
  role: "treeitem",
2207
2334
  "aria-expanded": hasChildren ? isExpanded : void 0,
2208
2335
  "aria-selected": isSelected,
2209
- tabIndex: isSelected ? 0 : -1,
2336
+ tabIndex: node.id === focusableId ? 0 : -1,
2210
2337
  onClick: handleClick,
2211
2338
  onKeyDown: (e) => onKeyDown(e, node),
2212
2339
  className: cn(
@@ -2229,10 +2356,11 @@ const TreeNodeComponent = ({
2229
2356
  level: level + 1,
2230
2357
  expanded,
2231
2358
  selectedId,
2359
+ focusableId,
2232
2360
  onToggle,
2233
2361
  onSelect,
2234
2362
  onKeyDown,
2235
- nodeRefs
2363
+ getNodeRef
2236
2364
  },
2237
2365
  child.id
2238
2366
  )) })
@@ -2505,9 +2633,9 @@ function CarouselNext({
2505
2633
  );
2506
2634
  }
2507
2635
  const StepperContext = React.createContext(void 0);
2508
- const useStepper = () => {
2636
+ const useStepperContext = () => {
2509
2637
  const context = React.useContext(StepperContext);
2510
- if (!context) throw new Error("useStepper must be used within a Stepper");
2638
+ if (!context) throw new Error("useStepperContext must be used within a Stepper");
2511
2639
  return context;
2512
2640
  };
2513
2641
  const Stepper = React.forwardRef(
@@ -2519,9 +2647,17 @@ const Stepper = React.forwardRef(
2519
2647
  ref,
2520
2648
  className: cn("w-full", className),
2521
2649
  ...props,
2522
- children: /* @__PURE__ */ jsx("div", { className: cn(
2523
- orientation === "horizontal" ? "flex items-start justify-between" : "flex flex-col gap-0"
2524
- ), children })
2650
+ children: /* @__PURE__ */ jsx(
2651
+ "div",
2652
+ {
2653
+ className: cn(
2654
+ orientation === "horizontal" ? "flex items-start justify-between" : "flex flex-col gap-0"
2655
+ ),
2656
+ role: "list",
2657
+ "aria-label": `Progresso: etapa ${currentStep} de ${totalSteps}`,
2658
+ children
2659
+ }
2660
+ )
2525
2661
  }
2526
2662
  ) });
2527
2663
  }
@@ -2529,7 +2665,7 @@ const Stepper = React.forwardRef(
2529
2665
  Stepper.displayName = "Stepper";
2530
2666
  const Step = React.forwardRef(
2531
2667
  ({ step, label, description, error = false, className, ...props }, ref) => {
2532
- const { currentStep, totalSteps, orientation } = useStepper();
2668
+ const { currentStep, totalSteps, orientation } = useStepperContext();
2533
2669
  const isActive = step === currentStep;
2534
2670
  const isCompleted = step < currentStep && !error;
2535
2671
  const isFirst = step === 1;
@@ -2543,54 +2679,120 @@ const Step = React.forwardRef(
2543
2679
  );
2544
2680
  const connectorClasses = (filled) => cn("transition-colors", filled ? "bg-primary" : "bg-muted");
2545
2681
  if (orientation === "vertical") {
2546
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex gap-4", className), ...props, children: [
2547
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
2548
- /* @__PURE__ */ jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsx(Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx("span", { children: step }) }),
2549
- !isLast && /* @__PURE__ */ jsx("div", { className: cn("w-0.5 flex-1 min-h-[2rem] mt-1", connectorClasses(step < currentStep)) })
2550
- ] }),
2551
- /* @__PURE__ */ jsxs("div", { className: cn("pb-6", isLast && "pb-0"), children: [
2552
- /* @__PURE__ */ jsx("div", { className: cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2553
- description && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2554
- ] })
2555
- ] });
2556
- }
2557
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-1 flex-col items-center", className), ...props, children: [
2558
- /* @__PURE__ */ jsxs("div", { className: "flex w-full items-start", children: [
2559
- step > 1 && /* @__PURE__ */ jsx("div", { className: cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step <= currentStep)) }),
2560
- /* @__PURE__ */ jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsx(Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx("span", { children: step }) }),
2561
- step < totalSteps && /* @__PURE__ */ jsx("div", { className: cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step < currentStep)) })
2562
- ] }),
2563
- /* @__PURE__ */ jsxs("div", { className: cn(
2564
- "mt-2 px-1",
2565
- isFirst && "text-left self-start",
2566
- isLast && "text-right self-end",
2567
- !isFirst && !isLast && "text-center w-full"
2568
- ), children: [
2569
- /* @__PURE__ */ jsx("div", { className: cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2570
- description && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2571
- ] })
2572
- ] });
2682
+ return /* @__PURE__ */ jsxs(
2683
+ "div",
2684
+ {
2685
+ ref,
2686
+ className: cn("flex gap-4", className),
2687
+ role: "listitem",
2688
+ "aria-current": isActive ? "step" : void 0,
2689
+ "aria-label": `Etapa ${step}: ${label}${isCompleted ? ", concluída" : isActive ? ", atual" : ""}`,
2690
+ ...props,
2691
+ children: [
2692
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
2693
+ /* @__PURE__ */ jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsx(Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx("span", { children: step }) }),
2694
+ !isLast && /* @__PURE__ */ jsx("div", { className: cn("w-0.5 flex-1 min-h-[2rem] mt-1", connectorClasses(step < currentStep)) })
2695
+ ] }),
2696
+ /* @__PURE__ */ jsxs("div", { className: cn("pb-6", isLast && "pb-0"), children: [
2697
+ /* @__PURE__ */ jsx("div", { className: cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2698
+ description && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2699
+ ] })
2700
+ ]
2701
+ }
2702
+ );
2703
+ }
2704
+ return /* @__PURE__ */ jsxs(
2705
+ "div",
2706
+ {
2707
+ ref,
2708
+ className: cn("flex flex-1 flex-col items-center", className),
2709
+ role: "listitem",
2710
+ "aria-current": isActive ? "step" : void 0,
2711
+ "aria-label": `Etapa ${step}: ${label}${isCompleted ? ", concluída" : isActive ? ", atual" : ""}`,
2712
+ ...props,
2713
+ children: [
2714
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full items-start", children: [
2715
+ step > 1 && /* @__PURE__ */ jsx("div", { className: cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step <= currentStep)) }),
2716
+ /* @__PURE__ */ jsx("div", { className: circleClasses, children: error ? /* @__PURE__ */ jsx(X, { className: "h-5 w-5" }) : isCompleted ? /* @__PURE__ */ jsx(Check, { className: "h-5 w-5" }) : /* @__PURE__ */ jsx("span", { children: step }) }),
2717
+ step < totalSteps && /* @__PURE__ */ jsx("div", { className: cn("h-0.5 flex-1 mt-[18px]", connectorClasses(step < currentStep)) })
2718
+ ] }),
2719
+ /* @__PURE__ */ jsxs("div", { className: cn(
2720
+ "mt-2 px-1",
2721
+ isFirst && "text-left self-start",
2722
+ isLast && "text-right self-end",
2723
+ !isFirst && !isLast && "text-center w-full"
2724
+ ), children: [
2725
+ /* @__PURE__ */ jsx("div", { className: cn("transition-colors", isActive || error ? "text-foreground" : "text-muted-foreground"), children: label }),
2726
+ description && /* @__PURE__ */ jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: description })
2727
+ ] })
2728
+ ]
2729
+ }
2730
+ );
2573
2731
  }
2574
2732
  );
2575
2733
  Step.displayName = "Step";
2576
- const FileUpload = React.forwardRef(
2577
- ({
2578
- className,
2579
- onFilesChange,
2580
- maxFiles = 1,
2581
- maxSize = 5 * 1024 * 1024,
2582
- // 5MB default
2583
- showPreview = true,
2584
- onError,
2585
- accept,
2586
- disabled,
2587
- ...props
2588
- }, ref) => {
2589
- const [files, setFiles] = React.useState([]);
2590
- const [dragActive, setDragActive] = React.useState(false);
2591
- const [errorMessage, setErrorMessage] = React.useState(null);
2592
- const inputRef = React.useRef(null);
2593
- const handleFiles = (newFiles) => {
2734
+ function useStepper({
2735
+ totalSteps,
2736
+ initialStep = 1,
2737
+ step: controlledStep,
2738
+ onStepChange,
2739
+ onBeforeNext
2740
+ }) {
2741
+ const [internalStep, setInternalStep] = useState(() => Math.min(Math.max(1, initialStep), totalSteps));
2742
+ const isControlled = controlledStep !== void 0;
2743
+ const currentStep = isControlled ? controlledStep : internalStep;
2744
+ const setStep = useCallback(
2745
+ (s) => {
2746
+ const clamped = Math.min(Math.max(1, s), totalSteps);
2747
+ if (!isControlled) setInternalStep(clamped);
2748
+ onStepChange == null ? void 0 : onStepChange(clamped);
2749
+ },
2750
+ [isControlled, onStepChange, totalSteps]
2751
+ );
2752
+ const isFirstStep = currentStep === 1;
2753
+ const isLastStep = currentStep === totalSteps;
2754
+ const canGoPrev = currentStep > 1;
2755
+ const canGoNext = currentStep < totalSteps;
2756
+ const next = useCallback(async () => {
2757
+ if (!canGoNext) return;
2758
+ if (onBeforeNext) {
2759
+ const allowed = await onBeforeNext(currentStep);
2760
+ if (!allowed) return;
2761
+ }
2762
+ setStep(currentStep + 1);
2763
+ }, [canGoNext, currentStep, onBeforeNext, setStep]);
2764
+ const prev = useCallback(() => {
2765
+ if (!canGoPrev) return;
2766
+ setStep(currentStep - 1);
2767
+ }, [canGoPrev, currentStep, setStep]);
2768
+ const goTo = useCallback((s) => setStep(s), [setStep]);
2769
+ const reset = useCallback(() => setStep(1), [setStep]);
2770
+ return {
2771
+ currentStep,
2772
+ totalSteps,
2773
+ isFirstStep,
2774
+ isLastStep,
2775
+ canGoPrev,
2776
+ canGoNext,
2777
+ next,
2778
+ prev,
2779
+ goTo,
2780
+ reset
2781
+ };
2782
+ }
2783
+ function useFileUpload({
2784
+ maxFiles = 1,
2785
+ maxSize = 5 * 1024 * 1024,
2786
+ onFilesChange,
2787
+ onError,
2788
+ disabled = false
2789
+ } = {}) {
2790
+ const [files, setFiles] = useState([]);
2791
+ const [dragActive, setDragActive] = useState(false);
2792
+ const [errorMessage, setErrorMessage] = useState(null);
2793
+ const inputRef = useRef(null);
2794
+ const handleFiles = useCallback(
2795
+ (newFiles) => {
2594
2796
  if (!newFiles) return;
2595
2797
  setErrorMessage(null);
2596
2798
  const filesArray = Array.from(newFiles);
@@ -2598,52 +2800,107 @@ const FileUpload = React.forwardRef(
2598
2800
  const validFiles = filesArray.filter((f) => f.size <= maxSize);
2599
2801
  if (oversized.length > 0) {
2600
2802
  const limitMB = (maxSize / 1024 / 1024).toFixed(0);
2601
- setErrorMessage(`${oversized.length} file(s) exceed the ${limitMB}MB limit and were not added.`);
2803
+ setErrorMessage(
2804
+ `${oversized.length} file(s) exceed the ${limitMB}MB limit and were not added.`
2805
+ );
2602
2806
  onError == null ? void 0 : onError(oversized, "size");
2603
2807
  }
2604
2808
  const merged = maxFiles === 1 ? validFiles.slice(0, 1) : [...files, ...validFiles].slice(0, maxFiles);
2605
2809
  const countRejected = maxFiles === 1 ? validFiles.slice(1) : [...files, ...validFiles].slice(maxFiles);
2606
2810
  if (countRejected.length > 0) {
2607
- setErrorMessage(`Only ${maxFiles} file(s) allowed. ${countRejected.length} file(s) were not added.`);
2811
+ setErrorMessage(
2812
+ `Only ${maxFiles} file(s) allowed. ${countRejected.length} file(s) were not added.`
2813
+ );
2608
2814
  onError == null ? void 0 : onError(countRejected, "count");
2609
2815
  }
2610
2816
  setFiles(merged);
2611
2817
  onFilesChange == null ? void 0 : onFilesChange(merged);
2612
- };
2613
- const handleDrag = (e) => {
2614
- e.preventDefault();
2615
- e.stopPropagation();
2616
- if (e.type === "dragenter" || e.type === "dragover") {
2617
- setDragActive(true);
2618
- } else if (e.type === "dragleave") {
2619
- setDragActive(false);
2620
- }
2621
- };
2622
- const handleDrop = (e) => {
2818
+ },
2819
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2820
+ [files, maxFiles, maxSize, onError, onFilesChange]
2821
+ );
2822
+ const handleDrag = useCallback((e) => {
2823
+ e.preventDefault();
2824
+ e.stopPropagation();
2825
+ if (e.type === "dragenter" || e.type === "dragover") {
2826
+ setDragActive(true);
2827
+ } else if (e.type === "dragleave") {
2828
+ setDragActive(false);
2829
+ }
2830
+ }, []);
2831
+ const handleDrop = useCallback(
2832
+ (e) => {
2623
2833
  e.preventDefault();
2624
2834
  e.stopPropagation();
2625
2835
  setDragActive(false);
2626
2836
  if (disabled) return;
2627
2837
  handleFiles(e.dataTransfer.files);
2628
- };
2629
- const handleChange = (e) => {
2838
+ },
2839
+ [disabled, handleFiles]
2840
+ );
2841
+ const handleChange = useCallback(
2842
+ (e) => {
2630
2843
  e.preventDefault();
2631
2844
  if (disabled) return;
2632
2845
  handleFiles(e.target.files);
2633
- };
2634
- const removeFile = (index) => {
2635
- const updatedFiles = files.filter((_, i) => i !== index);
2636
- setFiles(updatedFiles);
2637
- onFilesChange == null ? void 0 : onFilesChange(updatedFiles);
2638
- if (updatedFiles.length === 0) setErrorMessage(null);
2639
- };
2640
- const openFileDialog = () => {
2641
- var _a;
2642
- if (!disabled) {
2643
- setErrorMessage(null);
2644
- (_a = inputRef.current) == null ? void 0 : _a.click();
2645
- }
2646
- };
2846
+ },
2847
+ [disabled, handleFiles]
2848
+ );
2849
+ const removeFile = useCallback(
2850
+ (index) => {
2851
+ setFiles((prev) => {
2852
+ const updated = prev.filter((_, i) => i !== index);
2853
+ onFilesChange == null ? void 0 : onFilesChange(updated);
2854
+ if (updated.length === 0) setErrorMessage(null);
2855
+ return updated;
2856
+ });
2857
+ },
2858
+ [onFilesChange]
2859
+ );
2860
+ const openFileDialog = useCallback(() => {
2861
+ var _a;
2862
+ if (!disabled) {
2863
+ setErrorMessage(null);
2864
+ (_a = inputRef.current) == null ? void 0 : _a.click();
2865
+ }
2866
+ }, [disabled]);
2867
+ return {
2868
+ files,
2869
+ dragActive,
2870
+ errorMessage,
2871
+ inputRef,
2872
+ handleFiles,
2873
+ handleDrag,
2874
+ handleDrop,
2875
+ handleChange,
2876
+ removeFile,
2877
+ openFileDialog
2878
+ };
2879
+ }
2880
+ const FileUpload = React.forwardRef(
2881
+ ({
2882
+ className,
2883
+ onFilesChange,
2884
+ maxFiles = 1,
2885
+ maxSize = 5 * 1024 * 1024,
2886
+ // 5MB default
2887
+ showPreview = true,
2888
+ onError,
2889
+ accept,
2890
+ disabled,
2891
+ ...props
2892
+ }, ref) => {
2893
+ const {
2894
+ files,
2895
+ dragActive,
2896
+ errorMessage,
2897
+ inputRef,
2898
+ handleDrag,
2899
+ handleDrop,
2900
+ handleChange,
2901
+ removeFile,
2902
+ openFileDialog
2903
+ } = useFileUpload({ maxFiles, maxSize, onFilesChange, onError, disabled });
2647
2904
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), children: [
2648
2905
  /* @__PURE__ */ jsxs(
2649
2906
  "div",
@@ -2921,7 +3178,7 @@ const Search = React.forwardRef(
2921
3178
  }
2922
3179
  );
2923
3180
  Search.displayName = "Search";
2924
- const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false };
3181
+ 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" };
2925
3182
  const RouteMapContent = React__default.forwardRef(
2926
3183
  ({ apiKey, ...props }, ref) => {
2927
3184
  const { isLoaded, loadError, load } = useGoogleMapsLoader();
@@ -3098,7 +3355,7 @@ RouteMapContent.displayName = "RouteMapContent";
3098
3355
  const RouteMap = React__default.forwardRef(
3099
3356
  (props, ref) => {
3100
3357
  const { isLoaded, loadError } = useGoogleMapsLoader();
3101
- const effectiveApiKey = props.apiKey || typeof import.meta !== "undefined" && __vite_import_meta_env__ && void 0 || "";
3358
+ const effectiveApiKey = props.apiKey || typeof import.meta !== "undefined" && __vite_import_meta_env__ && "AIzaSyCj19NndSgZOb8057q24UbJtSsfVJiyVdo" || "";
3102
3359
  const isValidKey = effectiveApiKey && effectiveApiKey !== "YOUR_GOOGLE_MAPS_API_KEY_HERE" && effectiveApiKey.startsWith("AIza");
3103
3360
  if (isLoaded || isValidKey || loadError) {
3104
3361
  return /* @__PURE__ */ jsx(RouteMapContent, { ref, ...props, apiKey: effectiveApiKey });
@@ -3319,8 +3576,12 @@ export {
3319
3576
  TreeView as ba,
3320
3577
  navigationMenuTriggerStyle as bb,
3321
3578
  toggleVariants as bc,
3322
- useFormField as bd,
3323
- useStepper as be,
3579
+ useFileUpload as bd,
3580
+ useFormField as be,
3581
+ usePagination as bf,
3582
+ useStepper as bg,
3583
+ useStepperContext as bh,
3584
+ useTreeView as bi,
3324
3585
  AccordionTrigger as c,
3325
3586
  AspectRatio as d,
3326
3587
  AssistantChart as e,